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
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