--- VenueClientController.py.orig 2005-03-21 17:59:42.000000000 +1000 +++ VenueClientController.py 2005-08-01 08:34:03.000000000 +1000 @@ -16,6 +16,8 @@ import re import threading import time +import glob +import string # Access Grid imports from AccessGrid.Toolkit import Application @@ -1210,6 +1212,9 @@ def GetMyVenues(self): return self.__venueClientApp.GetMyVenues() + def GetKnownServers(self): + return self.__venueClientApp.GetKnownServers() + # end General Implementation # @@ -1230,6 +1235,18 @@ self.myVenuesFile = os.path.join(self.userConf.GetConfigDir(), "myVenues.txt" ) self.__LoadMyVenues() + + # MyServers + self.myServerList = [] + self.__LoadMyServers() + # For each server in self.myServerList, we should have a + # - dictionary mapping URI:RoomName at server[0] + # - list of connections URI,URI ar server[1] + # - dictionary of server metadata + # so - + #for server in self.myServerList: + # for conn in server[1]: + # print "%s -> %s" % (server[0][conn[0]], server[0][conn[1]]) # Venue History self.history = [] @@ -1241,6 +1258,68 @@ self.mimeConfig = Config.MimeConfig.instance() # + # MyServers Methods + # + def __ParseServerFile(self, file): + """ + From the input file, generate a dictionary mapping URI's to room names + and a list of room connection pairs rooms (as URI's). + Its a bit clunky because the file format was originally + designed for something else (.dot files for vizgraph tools). + Maybe we should generate more appropriate data files in the first place! + """ + rooms = {} + connections = [] + metadata = {} + serverlabel= 'Unnamed Server' + searchtime= 'Unknown earchtime' + if not os.path.exists(file): + return (None, None) + serverFile = open(file, 'r') + + for line in serverFile: + if line.startswith("serverlabel="): + serverlabel = line[13:-2] + metadata['serverlabel'] = serverlabel + continue + if line.startswith("searchtime="): + searchtime = line[12:-2] + metadata['searchtime'] = searchtime + continue + l = string.split(line) + if len(l) < 2: + continue + if l[1] == '--': + # Need to strip quotes, also semicolon at end + connections.append([string.strip(l[0],"\""), + string.strip(string.strip(l[2],";"),"\"")]) + else: + # This line contains URI and room name (perhaps with spaces) + roomname = string.join(l[1:])[8:-3] + rooms[string.strip(l[0], "\"")] = roomname + + serverFile.close() + + return (rooms, connections, metadata) + + + def __LoadMyServers(self): + serverFiles = glob.glob( + os.path.join(self.userConf.GetConfigDir(), 'agsvr', '*.agsvr')) + for file in serverFiles: + rooms, connections, metadata = self.__ParseServerFile(file) + if rooms != None and connections != None: + self.myServerList.append({'rooms':rooms, 'connections':connections, 'metadata':metadata}) + #for conn in connections: + # print "%s -> %s" % (rooms[conn[0]], rooms[conn[1]]) + + def GetKnownServers(self): + """ + This method returns the user's known server list + """ + return self.myServerList + + # # MyVenues Methods # --- VenueClientUI.py.orig 2005-03-21 17:59:58.000000000 +1000 +++ VenueClientUI.py 2005-04-20 17:11:36.000000000 +1000 @@ -155,6 +155,8 @@ ID_ME_PROFILE = wxNewId() ID_ME_DATA = wxNewId() + ID_VENUE_NAVIGATION = wxNewId() + def __init__(self, venueClient, controller, app): sys.stdout = sys.__stdout__ sys.stderr = sys.__stderr__ @@ -172,6 +174,7 @@ self.myVenuesDict = {} self.myVenuesMenuIds = {} self.onExitCalled = false + self.serverList = [] # State kept so UI can add venue administration options. wxFrame.__init__(self, NULL, -1, "") @@ -292,6 +295,12 @@ self.venue.Append(self.ID_VENUE_CLOSE,"&Exit", "Exit venue") self.menubar.Append(self.venue, "&Venue") + + #CKW + self.extra = wxMenu() + self.navigationMenu = self.BuildNavigationMenu("") + self.menubar.Append(self.extra, "&Extra") + self.preferences = wxMenu() self.preferences.Append(self.ID_PROFILE,"&Edit Profile...", @@ -1105,6 +1114,13 @@ editMyVenuesDialog.Destroy() + def GoToServerAddressCB(self, event): + name = self.menubar.GetLabel(event.GetId()) + #venueUrl = self.myVenuesDict[name] + venueUrl = self.myServerMenuIds[event.GetId()] + self.SetVenueUrl(venueUrl) + self.EnterVenueCB(venueUrl) + def GoToMenuAddressCB(self, event): name = self.menubar.GetLabel(event.GetId()) venueUrl = self.myVenuesDict[name] @@ -1631,6 +1647,63 @@ # Add url to address history self.venueAddressBar.AddChoice(fixedUrl) + def BuildNavigationMenu(self, prefix): + """ + Build the menu of navigatable venue servers + """ + print "Building navigation menu..." + menu = wxMenu() + + self.myServerMenuIds = {} + self.serverMenu = {} + self.serverNames = {} + self.serverList = self.controller.GetKnownServers() + # serverList is a list of "serverInfo" + # Each serverInfo item is a dictionary comprised of + # 1. a dictionary of room names referenced by uri's + # 2. a list of connection pairs + # 3. a dictionary of server metadata (currently serverlabel & searchtime) + #{{'uri':name}, [[uri,uri], [uri,uri], [uri,uri], ... ]], {'serverlabel':serverlabel, 'searchtime':searchtime}} + + # Show the connections, using the dict to display the room names + #for server in self.serverList: + # for conn in server[1]: + # print "%s -> %s" % (server[0][conn[0]], server[0][conn[1]]) + + # Just the uri:name dictionary + #for server in self.serverList: + # for uri, name in server[0].iteritems(): + # print uri, name + + sortedServers = self.serverList + sortedServers.sort(lambda x, y: cmp(x['metadata']['serverlabel'], + y['metadata']['serverlabel'])) + + #for server in self.serverList: + for server in sortedServers: + metadata = server['metadata'] + serverlabel = metadata['serverlabel'] + searchtime = metadata['searchtime'] + #log.info("searchtime for %s: %s" % (serverlabel, searchtime)) + SERVER_ID = wxNewId() + self.serverNames[SERVER_ID] = serverlabel + self.serverMenu[SERVER_ID] = wxMenu() + text = "Rooms at: " + serverlabel + + # We'd like the rooms sorted by name, but they're in a dictionary + # so create a list of (name,uri) pairs which we can sort by name + sortedRooms = [(name,uri) for (uri,name) in server['rooms'].items()] + sortedRooms.sort() + for room in sortedRooms: + ID = wxNewId() + self.myServerMenuIds[ID] = room[1] + text = "Go to: " + room[1] + self.serverMenu[SERVER_ID].Append(ID, room[0], text) + EVT_MENU(self, ID, self.GoToServerAddressCB) + self.extra.AppendMenu(ID, serverlabel, self.serverMenu[SERVER_ID]) + + return menu + def BuildAppMenu(self, prefix): """