Пример #1
0
class FileBrowser(LinearLayout):

    __interfaces__ = [AdapterView.OnItemClickListener]
    __fields__ = {"handler": FileOpenInterface}

    def __init__(self, context):

        LinearLayout.__init__(self, context)

        self.handler = None

        envDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS)
        self.fileAdapter = SpriteFileListAdapter(envDir,
                                                 [".spr", ",ff9", ".ff9"])

        self.fileView = ListView(context)
        self.fileView.setOnItemClickListener(self)
        self.fileView.setAdapter(self.fileAdapter)

        self.addView(
            self.fileView,
            ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                   ViewGroup.LayoutParams.WRAP_CONTENT))

    """We provide a method that the activity can use to request a new list of
    file names, only refreshing the view if the list has changed."""

    def rescan(self):

        if self.fileAdapter.update():
            self.fileView.setAdapter(self.fileAdapter)

    """This method is called when the user clicks a file name in the
    `ListView`, responding by calling the appropriate method of the registered
    handler object."""

    @args(void, [AdapterView, View, int, long])
    def onItemClick(self, parent, view, position, id):

        file = self.fileAdapter.items[position]

        if self.handler != None:
            self.handler.handleFileOpen(file)

    """The following method handles registration of an object that implements
    the `FileOpenInterface` interface."""

    @args(void, [FileOpenInterface])
    def setHandler(self, handler):

        self.handler = handler
Пример #2
0
class LocationWidget(RelativeLayout):

    __interfaces__ = [
        AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener,
        AddLocationListener, RemoveLocationListener
    ]

    @args(void, [Context, LocationListener])
    def __init__(self, context, locationHandler):

        RelativeLayout.__init__(self, context)

        self.currentItem = -1
        self.mode = "normal"

        self.locationHandler = locationHandler
        self.adapter = self.getAdapter()

        self.listView = ListView(context)
        self.listView.setAdapter(self.adapter)
        self.listView.setOnItemClickListener(self)
        self.listView.setOnItemLongClickListener(self)

        self.addWidget = AddWidget(context, self)
        self.addWidget.setId(1)
        self.removeWidget = RemoveWidget(context, self)

        listParams = RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT)
        listParams.addRule(RelativeLayout.ALIGN_PARENT_TOP)
        listParams.addRule(RelativeLayout.ABOVE, 1)

        self.addView(self.listView, listParams)
        self.addView(self.addWidget, self.getAddParams())

    def readLocations(self):

        self.locations = {}
        self.order = []

        if Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED:
            return

        storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOWNLOADS)

        subdir = File(storageDir, "WeatherForecast")
        if subdir.exists():

            f = File(subdir, "locations.txt")

            try:
                stream = BufferedReader(FileReader(f))
                while True:

                    line = stream.readLine()
                    if line == None:
                        break

                    spec = line.trim()
                    pieces = spec.split("/")

                    if len(pieces) < 3:
                        continue

                    place = pieces[len(pieces) - 1]
                    self.locations[place] = spec
                    self.order.add(place)

                stream.close()

            except FileNotFoundException:
                pass

    def writeLocations(self):

        f = Files.createExternalFile(Environment.DIRECTORY_DOWNLOADS,
                                     "WeatherForecast", "locations.txt", None,
                                     None)

        try:
            stream = FileWriter(f)

            for key in self.order:
                stream.write(self.locations[key] + "\n")

            stream.flush()
            stream.close()

        except FileNotFoundException:
            pass

    @args(LocationAdapter, [])
    def getAdapter(self):

        self.readLocations()

        keys = []
        for location in self.order:
            keys.add(location)

        return LocationAdapter(keys)

    def onItemClick(self, parent, view, position, id):

        try:
            location = self.adapter.items[int(id)]
            self.locationHandler.locationEntered(self.locations[location])
        except IndexError:
            pass

        if self.currentItem != -1:
            self.leaveRemoveMode()

    def addLocation(self, name, spec):

        if self.locations.containsKey(name):
            return

        self.locations[name] = spec
        self.order.add(name)

        self.adapter.items.add(name)
        self.listView.setAdapter(self.adapter)

    def onItemLongClick(self, parent, view, position, id):

        if self.mode == "normal":
            self.currentItem = position
            self.enterRemoveMode()

        return True

    def enterRemoveMode(self):

        self.removeView(self.addWidget)
        self.addWidget.setId(2)

        removeParams = RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT)
        removeParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
        removeParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
        removeParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)

        self.addView(self.removeWidget, removeParams)
        self.removeWidget.setId(1)
        self.mode = "remove"

    def leaveRemoveMode(self):

        self.removeView(self.removeWidget)
        self.removeWidget.setId(2)
        self.addView(self.addWidget, self.getAddParams())
        self.addWidget.setId(1)
        self.mode = "normal"

    def removeLocation(self):

        place = self.order.remove(self.currentItem)
        self.locations.remove(place)

        self.adapter.items.remove(place)
        self.listView.setAdapter(self.adapter)

        self.currentItem = -1
        self.leaveRemoveMode()

    def cancelRemove(self):

        self.currentItem = -1
        self.leaveRemoveMode()

    @args(RelativeLayout.LayoutParams, [])
    def getAddParams(self):

        addParams = RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT)
        addParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
        addParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
        addParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
        return addParams