00001 import wx
00002 import wx.lib.scrolledpanel as scrolled
00003 import io
00004 import webbrowser
00005 import time
00006
00007 from types import *
00008 from gui_complex import *
00009 from gui_modules import *
00010 from gui_servers import *
00011
00012
00013
00014 class MainWindow(wx.Frame):
00015 def __init__(self, parent, title):
00016 wx.Frame.__init__(self, parent, -1, title)
00017
00018
00019 self.connconn = io.BiosphereConnector()
00020 self.defsdefs = None
00021
00022 self.pmpm = PrefManager()
00023
00024
00025 notebook = wx.Notebook(self, -1, style=wx.BK_TOP)
00026 self.simple_request_panelsimple_request_panel = SimpleRequestPanel(notebook, self.connconn)
00027 notebook.AddPage(self.simple_request_panelsimple_request_panel, 'Atomic Request')
00028 self.complex_request_panelcomplex_request_panel = ComplexRequestPanel(notebook, self.connconn)
00029 notebook.AddPage(self.complex_request_panelcomplex_request_panel, 'Complex Request')
00030 self.module_panelmodule_panel = ModulePanel(notebook, self.connconn)
00031 notebook.AddPage(self.module_panelmodule_panel, 'Modules')
00032 self.server_panelserver_panel = ServerPanel(notebook)
00033 notebook.AddPage(self.server_panelserver_panel, 'Servers')
00034
00035
00036 self.MakeMenuMakeMenu()
00037
00038
00039 self.CreateStatusBar()
00040 self.SetStandardStatusTextSetStandardStatusText()
00041 self.CenterOnScreen()
00042 self.SetMinSize((640,480))
00043 self.Maximize()
00044 self.Show()
00045
00046 def SetStandardStatusText(self):
00047 s = 'Not connected'
00048 if 'last-opened' in self.pmpm.prefs:
00049 s = s + ', last opened: %s' % self.pmpm.prefs['last-opened']
00050 self.SetStatusText(s)
00051
00052 def MakeMenu(self):
00053 menubar = wx.MenuBar()
00054
00055
00056 fmenu = wx.Menu()
00057 self.connectmenuconnectmenu = fmenu.Append(-1, 'Connect\tCtrl+K', 'Connect to a Bio-SPHERE daemon.')
00058 self.Bind(wx.EVT_MENU, self.OnConnectOnConnect, self.connectmenuconnectmenu)
00059
00060 self.disconnectmenudisconnectmenu = fmenu.Append(-1, 'Disconnect\tCtrl+Shift+K', 'Disconnect from the Bio-SPHERE daemon')
00061 self.Bind(wx.EVT_MENU, self.OnDisconnectOnDisconnect, self.disconnectmenudisconnectmenu)
00062 self.disconnectmenudisconnectmenu.Enable(False)
00063
00064 self.refreshmenurefreshmenu = fmenu.Append(-1, 'Refresh\tF5')
00065 self.Bind(wx.EVT_MENU, self.OnRefreshOnRefresh, self.refreshmenurefreshmenu)
00066 self.refreshmenurefreshmenu.Enable(False)
00067
00068 fmenu.AppendSeparator()
00069 m = fmenu.Append(-1, 'Open\tCtrl+O')
00070 m = fmenu.Append(-1, 'Save\tCtrl+S')
00071 m.Enable(False)
00072 self.Bind(wx.EVT_MENU, self.OnSaveOnSave, m)
00073 fmenu.AppendSeparator()
00074 m = fmenu.Append(-1, 'Quit\tCtrl+Q')
00075 self.Bind(wx.EVT_MENU, self.OnExitOnExit, m)
00076 if "__WXMAC__" in wx.PlatformInfo:
00077 wx.App.SetMacExitMenuItemId(m.GetId())
00078 menubar.Append(fmenu, '&File')
00079
00080
00081 emenu = wx.Menu()
00082 m = emenu.Append(-1, 'Cut\tCtrl+X')
00083 m.Enable(False)
00084 m = emenu.Append(-1, 'Copy\tCtrl+C')
00085 m.Enable(False)
00086 m = emenu.Append(-1, 'Paste\tCtrl+V')
00087 m.Enable(False)
00088 emenu.AppendSeparator()
00089 m = emenu.Append(-1, 'Preferences\tCtrl+,')
00090 self.Bind(wx.EVT_MENU, self.OnPreferencesOnPreferences, m)
00091 if "__WXMAC__" in wx.PlatformInfo:
00092 wx.App.SetMacPreferencesMenuItemId(m.GetId())
00093 menubar.Append(emenu, '&Edit')
00094
00095
00096 hmenu = wx.Menu()
00097 m = hmenu.Append(-1, '&About Bio-SPHERE','Information about Bio-SPHERE')
00098 self.Bind(wx.EVT_MENU, self.OnAboutOnAbout, m)
00099 if "__WXMAC__" in wx.PlatformInfo:
00100 wx.App.SetMacAboutMenuItemId(m.GetId())
00101 m = hmenu.Append(-1, 'Help', 'Help about this program')
00102 m = hmenu.Append(-1, 'Website', 'Go to the website of Bio-SPHERE')
00103 self.Bind(wx.EVT_MENU, self.OnWebsiteOnWebsite, m)
00104 menubar.Append(hmenu,'&Help')
00105
00106 self.SetMenuBar(menubar)
00107
00108 def OnExit(self, event):
00109 self.pmpm.prefs['last-opened'] = time.strftime('%a, %d %b %Y %H:%M:%S')
00110 self.pmpm.save()
00111 self.Close()
00112
00113 def OnRefresh(self, event):
00114 self.defsdefs = self.connconn.GetServices()
00115 self.simple_request_panelsimple_request_panel.SetDefs(self.defsdefs)
00116 self.complex_request_panelcomplex_request_panel.SetDefs(self.defsdefs)
00117 if not self.defsdefs:
00118 self.SetStatusText('Could not retrieve service definitions')
00119 self.defsdefs = None
00120 self.DisableDisconnectMenuDisableDisconnectMenu()
00121
00122 def OnAbout(self, event):
00123 pass
00124
00125 def OnSave(self, event):
00126 pass
00127
00128 def OnConnect(self, event):
00129 dlg = ConnectDialog(self, self.pm)
00130 v = dlg.ShowModal()
00131 if v == wx.ID_OK:
00132 host = dlg.host.GetValue()
00133 port = dlg.port.GetValue()
00134 if host and port:
00135 self.conn.SetAddress('%s:%s' % (host, port))
00136 self.defs = self.conn.GetServices()
00137 self.SetStatusText('Connected to: %s:%s' % (host, port))
00138 self.DisableConnectMenu()
00139 self.simple_request_panel.SetDefs(self.defs)
00140 self.complex_request_panel.SetDefs(self.defs)
00141
00142 dlg.Destroy()
00143
00144 def DisableConnectMenu(self):
00145 self.disconnectmenudisconnectmenu.Enable(True)
00146 self.refreshmenurefreshmenu.Enable(True)
00147 self.connectmenuconnectmenu.Enable(False)
00148
00149 def DisableDisconnectMenu(self):
00150 self.disconnectmenudisconnectmenu.Enable(False)
00151 self.refreshmenurefreshmenu.Enable(False)
00152 self.connectmenuconnectmenu.Enable(True)
00153
00154 def OnDisconnect(self, event):
00155 self.SetStandardStatusTextSetStandardStatusText()
00156 self.defsdefs = None
00157 self.simple_request_panelsimple_request_panel.SetDefs(None)
00158 self.complex_request_panelcomplex_request_panel.SetDefs(None)
00159 self.DisableDisconnectMenuDisableDisconnectMenu()
00160
00161 def OnPreferences(self, event):
00162 dlg = PreferencesDialog(self, self.pmpm)
00163 v = dlg.ShowModal()
00164 dlg.Destroy()
00165
00166 def OnWebsite(self, event):
00167 webbrowser.open('http://biosphere.sf.net')
00168
00169
00170
00171 class SimpleRequestPanel(scrolled.ScrolledPanel):
00172 """The main window that has different tabs for the different
00173 subtasks.
00174 """
00175
00176 def __init__(self, parent, connector):
00177 scrolled.ScrolledPanel.__init__(self, parent)
00178
00179 self.connectorconnector = connector
00180 self.InitLayoutInitLayout()
00181 self.ClearDefinitionsClearDefinitions()
00182
00183 self.Bind(wx.EVT_SIZE, self.OnResizeOnResize, self)
00184
00185 def OnResize(self, event):
00186 self.mainboxmainbox.Layout()
00187 self.Refresh()
00188
00189 def InitLayout(self):
00190 self.mainboxmainbox = wx.BoxSizer(wx.VERTICAL)
00191
00192 firstrow = wx.BoxSizer(wx.HORIZONTAL)
00193 firstrow.Add(self.InitServicesPartInitServicesPart(), 0,
00194 wx.EXPAND|wx.ALIGN_TOP|wx.ALL, 5)
00195 firstrow.Add(self.InitRequestsPartInitRequestsPart(), 1,
00196 wx.EXPAND|wx.ALIGN_TOP|wx.ALL, 5)
00197
00198 secondrow = wx.BoxSizer(wx.HORIZONTAL)
00199 secondrow.Add(self.InitResponsePartInitResponsePart(), 1,
00200 wx.EXPAND|wx.ALL, 5)
00201
00202 self.mainboxmainbox.Add(firstrow, 0,
00203 wx.EXPAND|wx.ALIGN_TOP)
00204 self.mainboxmainbox.Add(secondrow, 1,
00205 wx.EXPAND|wx.ALIGN_BOTTOM)
00206 self.SetSizer(self.mainboxmainbox)
00207 self.SetAutoLayout(1)
00208 self.SetupScrolling()
00209
00210 def InitServicesPart(self):
00211 """Initialize the static box with the service selector
00212 inside."""
00213 box = wx.StaticBox(self, -1, 'Service Selector')
00214 boxsizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
00215
00216 sizer = wx.BoxSizer(wx.VERTICAL)
00217 sizer.Add(wx.StaticText(self, -1, "Services:"), 0, wx.ALL, 5)
00218 self.servicesservices = wx.ListBox(self, -1, (-1, -1), (180, 350),
00219 [], wx.LB_SINGLE)
00220 sizer.Add(self.servicesservices, 0, wx.EXPAND|wx.ALL, 5)
00221 boxsizer.Add(sizer, 0, wx.EXPAND)
00222 self.Bind(wx.EVT_LISTBOX, self.OnServiceSelectedOnServiceSelected, self.servicesservices)
00223
00224 sizer = wx.BoxSizer(wx.VERTICAL)
00225 sizer.Add(wx.StaticText(self, -1, "Ports:"), 0, wx.ALL, 5)
00226 self.portsports = wx.ListBox(self, -1, (-1, -1), (180, 350),
00227 [], wx.LB_SINGLE)
00228 sizer.Add(self.portsports, 0, wx.EXPAND|wx.ALL, 5)
00229 boxsizer.Add(sizer, 0, wx.EXPAND)
00230 self.Bind(wx.EVT_LISTBOX, self.OnPortSelectedOnPortSelected, self.portsports)
00231
00232 sizer = wx.BoxSizer(wx.VERTICAL)
00233 sizer.Add(wx.StaticText(self, -1, "Operations:"), 0, wx.ALL, 5)
00234 self.operationsoperations = wx.ListBox(self, -1, (-1, -1), (180, 350),
00235 [], wx.LB_SINGLE)
00236 sizer.Add(self.operationsoperations, 0, wx.EXPAND|wx.ALL, 5)
00237 boxsizer.Add(sizer, 0, wx.EXPAND)
00238 self.Bind(wx.EVT_LISTBOX, self.OnOperationSelectedOnOperationSelected, self.operationsoperations)
00239
00240 return boxsizer
00241
00242 def InitRequestsPart(self):
00243 box = wx.StaticBox(self, -1, 'Request Maker')
00244 boxsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
00245
00246 self.requestpanelrequestpanel = RequestPanel(self, self.connectorconnector)
00247 self.requestpanelrequestpanel.SetMinSize((200, 100))
00248 boxsizer.Add(self.requestpanelrequestpanel, 1, wx.ALIGN_LEFT|wx.EXPAND)
00249
00250 return boxsizer
00251
00252 def InitResponsePart(self):
00253 box = wx.StaticBox(self, -1, 'Response Viewer')
00254 boxsizer = wx.StaticBoxSizer(box, wx.VERTICAL)
00255
00256 self.responsepanelresponsepanel = ResponsePanel(self)
00257 self.SetMinSize((200, 100))
00258 boxsizer.Add(self.responsepanelresponsepanel, 1, wx.ALIGN_LEFT|wx.EXPAND)
00259
00260 panel = scrolled
00261
00262 return boxsizer
00263
00264 def SetDefs(self, defs):
00265 self.ClearDefinitionsClearDefinitions()
00266 self.ClearServiceListsClearServiceLists()
00267 self.requestpanelrequestpanel.MakeEmpty()
00268 self.responsepanelresponsepanel.MakeEmpty()
00269 self.defsdefs = defs
00270
00271 if self.defsdefs:
00272 svclist = []
00273 for svc in self.defsdefs.services:
00274 svclist.append(svc.name)
00275 self.servicesservices.Set(svclist)
00276 self.Refresh()
00277
00278 def OnServiceSelected(self, event):
00279 self.portsports.Clear()
00280 self.operationsoperations.Clear()
00281 self.requestpanelrequestpanel.MakeEmpty()
00282 self.responsepanelresponsepanel.MakeEmpty()
00283 if self.defsdefs and event.IsSelection():
00284 sel = event.GetString()
00285 for s in self.defsdefs.services:
00286 if s.name == sel:
00287 self.selected_serviceselected_service = s
00288 self.portsports.Set([pt.name for pt in s.ports])
00289 break
00290
00291 def OnPortSelected(self, event):
00292 self.operationsoperations.Clear()
00293 self.requestpanelrequestpanel.MakeEmpty()
00294 self.responsepanelresponsepanel.MakeEmpty()
00295 if self.selected_serviceselected_service and event.IsSelection():
00296 sel = event.GetString()
00297 for p in self.selected_serviceselected_service.ports:
00298 if p.name == sel:
00299 self.selected_portselected_port = p
00300 self.operationsoperations.Set([op.name for op in p.type.operations])
00301 break
00302
00303
00304 def OnOperationSelected(self, event):
00305 self.requestpanelrequestpanel.MakeEmpty()
00306 self.responsepanelresponsepanel.MakeEmpty()
00307 if self.selected_portselected_port and event.IsSelection():
00308 sel = event.GetString()
00309 for op in self.selected_portselected_port.type.operations:
00310 if op.name == sel:
00311 self.selected_operationselected_operation = op
00312 self.requestpanelrequestpanel.MakeRequest(self.selected_serviceselected_service,
00313 self.selected_portselected_port,
00314 self.selected_operationselected_operation)
00315
00316 def ClearDefinitions(self):
00317 self.defsdefs = None
00318 self.selected_serviceselected_service = None
00319 self.selected_portselected_port = None
00320 self.selected_operationselected_operation = None
00321 self.ClearServiceListsClearServiceLists()
00322
00323 def ClearServiceLists(self):
00324 self.servicesservices.Clear()
00325 self.operationsoperations.Clear()
00326 self.portsports.Clear()
00327
00328
00329 class RequestPanel(scrolled.ScrolledPanel):
00330 """This panel enables the user to make request to the biosphere
00331 daemon
00332 """
00333
00334 def __init__(self, parent, connector):
00335 scrolled.ScrolledPanel.__init__(self, parent, -1)
00336 self.connectorconnector = connector
00337 self.serviceservice = None
00338 self.portport = None
00339 self.operationoperation = None
00340
00341 self.sizersizer = wx.BoxSizer(wx.VERTICAL)
00342 self.MakeEmptyMakeEmpty()
00343 self.SetSizer(self.sizersizer)
00344 self.SetAutoLayout(1)
00345 self.SetupScrolling(scroll_x=False)
00346
00347 def MakeEmpty(self):
00348 """Empty all the fields managed by the sizer and set
00349 a static text.
00350 """
00351
00352 self.fieldsfields = None
00353 self.fielddatafielddata = None
00354 self.serviceservice = None
00355 self.portport = None
00356 self.operationoperation = None
00357
00358 self.sizersizer.Clear(True)
00359 self.sizersizer.Add(wx.StaticText(self, -1, "Select service, port and operation first"),
00360 0, wx.ALIGN_CENTER|wx.ALIGN_TOP|wx.ALL, 5)
00361 self.sizersizer.Layout()
00362 self.Refresh()
00363
00364 def MakeRequest(self, service, port, operation):
00365 """Create the fields for the request."""
00366
00367 self.serviceservice = service
00368 self.portport = port
00369 self.operationoperation = operation
00370
00371 self.sizersizer.Clear(True)
00372 if len(operation.input.parts) > 0:
00373 self.sizersizer.Add(wx.StaticText(self, -1, "Please input message parts:"),
00374 0, wx.ALIGN_CENTER|wx.ALIGN_TOP|wx.ALL, 5)
00375 else:
00376 self.sizersizer.Add(wx.StaticText(self, -1, "Press submit to make the request:"),
00377 0, wx.ALIGN_CENTER|wx.ALIGN_TOP|wx.ALL, 5)
00378
00379
00380 self.fieldsfields = []
00381 self.fielddatafielddata = []
00382 for part in operation.input.parts:
00383 f = self.MakeInputFieldMakeInputField(part.name, part.type.name)
00384 self.sizersizer.Add(f[0], 0, wx.GROW|wx.ALIGN_LEFT|wx.ALL, 5)
00385 self.fieldsfields.append(f[1])
00386 self.fielddatafielddata.append((part.name, part.type.name))
00387
00388 btn = wx.Button(self, 2001, 'Submit Request')
00389 btn.SetDefault()
00390 self.Bind(wx.EVT_BUTTON, self.OnRequestSubmitOnRequestSubmit, id=2001)
00391 self.sizersizer.Add(btn, 0, wx.ALIGN_BOTTOM|wx.ALIGN_RIGHT, 5)
00392
00393 self.sizersizer.Layout()
00394
00395 def MakeInputField(self, fieldname, fieldtypename):
00396 box = wx.BoxSizer(wx.HORIZONTAL)
00397 label = wx.StaticText(self, -1, '%s (%s)' % (fieldname, fieldtypename))
00398 box.Add(label, 0, wx.ALIGN_TOP|wx.ALL, 5)
00399
00400 if fieldtypename == 'bs_string':
00401 text = wx.TextCtrl(self, -1, '', size=(100,50),
00402 style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER)
00403 else:
00404 text = wx.TextCtrl(self, -1, '', size=(100,-1))
00405
00406 box.Add(text, 1, wx.ALIGN_CENTRE|wx.ALL, 5)
00407 return (box, text)
00408
00409 def GatherFields(self):
00410 """Make a list of all the inputted info."""
00411 result = []
00412 for i in range(0, len(self.fielddatafielddata)):
00413 result.append((self.fielddatafielddata[i][0],
00414 self.fielddatafielddata[i][1],
00415 self.fieldsfields[i].GetValue()))
00416 return result
00417
00418 def OnRequestSubmit(self, event):
00419 """Create the request and send it to the daemon."""
00420
00421 self.GetParent().responsepanel.MakeEmpty()
00422
00423 input = bs_message_instance(self.operationoperation.input.name)
00424 for f in self.GatherFieldsGatherFields():
00425 type = bs_data_type(f[1])
00426 part = bs_part_instance(f[0], type, f[2])
00427 input.parts.append(part)
00428 request = bs_service_request(self.serviceservice.name,
00429 self.portport.name,
00430 self.operationoperation.name,
00431 input)
00432 response = self.connectorconnector.RequestService(request)
00433 if response == None:
00434 if self.connectorconnector.error != None:
00435 print "%d %s" % self.connectorconnector.error
00436 else:
00437 print 'there was no error reported by the connector.'
00438 else:
00439 self.GetParent().responsepanel.DisplayResponse(response)
00440
00441
00442 class ResponsePanel(scrolled.ScrolledPanel):
00443 def __init__(self, parent):
00444 scrolled.ScrolledPanel.__init__(self, parent, -1)
00445
00446 self.responseresponse = None
00447
00448 self.sizersizer = wx.BoxSizer(wx.VERTICAL)
00449 self.MakeEmptyMakeEmpty()
00450 self.SetSizer(self.sizersizer)
00451 self.SetAutoLayout(1)
00452 self.SetupScrolling(scroll_x=False)
00453
00454 self.Bind(wx.EVT_SIZE, self.OnResizeOnResize, self)
00455
00456 def OnResize(self, event):
00457 self.DisplayResponseDisplayResponse()
00458
00459 def MakeEmpty(self):
00460 self.sizersizer.Clear(True)
00461 self.sizersizer.Add(wx.StaticText(self, -1, 'Service response will displayed here.'),
00462 0, wx.ALIGN_LEFT|wx.ALIGN_TOP|wx.ALL, 5)
00463 self.sizersizer.Layout()
00464
00465 def DisplayResponse(self, response=None):
00466 self.sizersizer.Clear(True)
00467
00468 if self.responseresponse:
00469 response = self.responseresponse
00470 elif response:
00471 self.responseresponse = response
00472 else:
00473 text = wx.StaticText(self, -1, 'Service response will displayed here.')
00474 text.SetForegroundColour('Black')
00475 self.sizersizer.Add(text, 0, wx.ALL, 5)
00476 self.sizersizer.Layout()
00477 return
00478
00479 header = 'Response of %s:%s:%s service request:' % (response.service, response.port, response.operation)
00480 txt = wx.StaticText(self, -1, header)
00481 self.sizersizer.Add(txt, 0, wx.ALL, 5)
00482
00483 if response.output != None:
00484 for part in response.output.parts:
00485 self.PrintPartPrintPart(part)
00486 elif response.fault != None:
00487 for part in response.fault.parts:
00488 self.PrintPartPrintPart(part, 'Red')
00489 else:
00490 text = wx.StaticText(self, -1, 'Service response is empty')
00491 text.SetForegroundColour('Red')
00492 self.sizersizer.Add(text, 1, wx.ALL, 5)
00493
00494 self.sizersizer.Layout()
00495
00496 def PrintPart(self, part, color='Black'):
00497 text = '%s (%s): %s' % (part.name, part.type.name, part.data)
00498 lbl = wx.StaticText(self, -1, text)
00499 lbl.SetForegroundColour(color)
00500 lbl.Wrap(self.GetSizeTuple()[0] - 20)
00501 self.sizersizer.Add(lbl, 0, wx.EXPAND|wx.ALL, 5)
00502
00503
00504 class PrefManager:
00505 def __init__(self):
00506 self.prefsprefs = {}
00507
00508 try:
00509 file = open('prefs')
00510 except IOError:
00511 self.set_defaultset_default()
00512 self.savesave()
00513 return
00514
00515 for line in file:
00516 l = line.split()
00517 if len(l) > 1:
00518 self.prefsprefs[l[0]] = ' '.join(l[1:])
00519 file.close()
00520
00521 def set_default(self):
00522 self.prefsprefs = {'default-host': 'localhost',
00523 'default-port': '2915'}
00524
00525 def save(self):
00526 file = open('prefs', 'w')
00527 for key in self.prefsprefs.keys():
00528 file.write('%s %s\n' % (key, self.prefsprefs[key]))
00529 file.close()
00530
00531
00532 class PreferencesDialog(wx.Dialog):
00533 def __init__(self, parent, pm):
00534 wx.Dialog.__init__(self, parent, -1, 'Preferences')
00535
00536 self.pmpm = pm
00537 sizer = wx.GridSizer(4, 2)
00538
00539 sizer.Add(wx.StaticText(self, -1, 'Default host:'), 0, wx.EXPAND|wx.ALL, 5)
00540 self.hosthost = wx.TextCtrl(self, -1, self.get_valget_val('default-host'), size=(150, -1))
00541 sizer.Add(self.hosthost, 1, wx.ALL, 5)
00542
00543 sizer.Add(wx.StaticText(self, -1, 'Default port:'), 0, wx.EXPAND|wx.ALL, 5)
00544 self.portport = wx.TextCtrl(self, -1, self.get_valget_val('default-port'), size=(150, -1))
00545 sizer.Add(self.portport, 1, wx.ALL, 5)
00546
00547 sizer.Add((20, -1), 1)
00548 button = wx.Button(self, -1, 'Save')
00549 button.SetDefault()
00550 sizer.Add(button, 0, wx.ALIGN_LEFT|wx.ALL, 5)
00551 self.Bind(wx.EVT_BUTTON, self.OnSaveOnSave, button)
00552
00553 self.SetSizer(sizer)
00554 sizer.Fit(self)
00555 self.CenterOnScreen()
00556
00557 def OnSave(self, event):
00558 self.pmpm.prefs['default-host'] = self.hosthost.GetValue()
00559 self.pmpm.prefs['default-port'] = self.portport.GetValue()
00560 self.pmpm.save()
00561 self.Close()
00562
00563 def get_val(self, str):
00564 if str in self.pmpm.prefs:
00565 return self.pmpm.prefs[str]
00566 else:
00567 return ''
00568
00569
00570 class ConnectDialog(wx.Dialog):
00571 def __init__(self, parent, pm):
00572 wx.Dialog.__init__(self, parent, -1, 'Connect to Server')
00573
00574 self.pmpm = pm
00575 sizer = wx.GridSizer(4, 2)
00576
00577 sizer.Add(wx.StaticText(self, -1, 'Host:'), 0, wx.EXPAND|wx.ALL, 5)
00578 self.hosthost = wx.TextCtrl(self, -1, self.get_valget_val('default-host'), size=(150, -1))
00579 sizer.Add(self.hosthost, 1, wx.ALL, 5)
00580
00581 sizer.Add(wx.StaticText(self, -1, 'Port:'), 0, wx.EXPAND|wx.ALL, 5)
00582 self.portport = wx.TextCtrl(self, -1, self.get_valget_val('default-port'), size=(150, -1))
00583 sizer.Add(self.portport, 1, wx.ALL, 5)
00584
00585 button = wx.Button(self, wx.ID_CANCEL, 'Cancel')
00586 sizer.Add(button, 0, wx.ALIGN_RIGHT|wx.ALL, 5)
00587 button = wx.Button(self, wx.ID_OK, 'Connect')
00588 button.SetDefault()
00589 sizer.Add(button, 0, wx.ALIGN_LEFT|wx.ALL, 5)
00590
00591 self.SetSizer(sizer)
00592 sizer.Fit(self)
00593 self.CenterOnScreen()
00594
00595 def get_val(self, str):
00596
00597 if str in self.pmpm.prefs:
00598 return self.pmpm.prefs[str]
00599 else:
00600 return ''
00601