Mailing list archives: January 2003

Site index · List index
Message listThread · Author · Date
<n...@paragon.no> el's - class name to parcelClass. For example: - - parcelClass = 'CalendarFile.CalendarClass' - - CalendarFile is the python file (without the .py extension) that - contains the class CalendarClass contained in the file which is - the parcel class. - - For examples, look in the parcel directory. - - The method now takes two directory arguments, baseDir and relDir. - baseDir should be a directory containing parcel subdirectories, - while relDir is only used when recursing through directories below - baseDir. - """ - path = os.path.join(baseDir, relDir) - assert (os.path.exists (path) and os.path.isdir(path)) - - if (relDir and \ - (os.path.exists(os.path.join (path, "__init__.py")) or \ - os.path.exists(os.path.join (path, "__init__.pyc")) or \ - os.path.exists(os.path.join (path, "__init__.pyo"))) \ - ): - importArgument = relDir.replace (os.sep, '.') - """ - Import the parcel, which should define parcelClass. - - If you get an error like: Import can't find module, - or can't find name in module: No module named XYZ.XYZ - on the following statement, you probablyf startTLS(self, ctx): + assert not self.TLS + self.stopReading() + self.stopWriting() +- self._startTLS() +- self.socket = SSL.Connection(ctx.getContext(), self.soc-25foundation.org> Sat, 31 Mar, 03:27
Sherwood ): - """ - Many wxPython objects, for example wxApplication have corresponding - persistent model counterparts. The persistent object stores data that - needs to be saved across successive application executions. The - non-persistent object, usually a wxPython object can't be easily be saved - because they contain data that doesn't persist well (e.g. C pointers). - We'll use the convention of naming the wxPython view object with a "wx" - prefix using the same name its persistent model counterpart. - Here's a description of the data available that the wxApplication makes - available for the rest of the program: - - self.applicationResources the main application-wide XRC resources - self.association a dictionary mapping persistent object ids - to non-persistent wxPython counterparts - self.chandlerDirectory directory containing chandler executable - self.parcels global dictionary of parcel classes - self.model the persistent counterpart - self.wxMainFrame active wxChandlerWindow - self.locale locale used for internationalization - self.jabberClient state of jabber client including presence dictionary - self.repository the repository instance - self.argv the command line arguments of the process - self.log the logger for the application - """ - - def __init__(self, argv=[]): - """ - Overriding the __init__() method for wxApp so that we can - apply our own stdout/stderr handler, and tell wxPython not - to perform its standard redirection. We have a customized - handler for that. - """ - - self.argv = argv - self.log = logging.getLogger("application") - - # Install a custom displayhook to keep Python from setting the global - # _ (underscore) to the value of the last evaluated expression. If - # we don't do this, our mapping of _ to gettext can get overwritten. - def _displayHook(obj): - sys.stdout.write(str(obj)) - sys.displayhook = _displayHook - - # Tell wxApp not to do redirection - wxApp.__init__(self, False) - def OnInit(self): """ - Main application initialization. + Main application initialization. """ - self.applicationResources=None - self.association={} - self.chandlerDirectory=None - self.parcels={} - self.storage=None - self.model=None - - self.jabberClient = None - self.presenceWindow = None - - self.chandlerDirectory = os.path.dirname (os.path.abspath (sys.argv[0])) + if __debug__: + """ + Install a custom displayhook to keep Python from setting the global + _ (underscore) to the value of the last evaluated expression. If + we don't do this, our mapping of _ to gettext can get overwritten. + This is useful in interactive debugging with PyCrust. + """ + def _displayHook(obj): + sys.stdout.write(str(obj)) + + sys.displayhook = _displayHook - global app - assert app == None #More than one app object doesn't make sense - app = self + Globals.chandlerDirectory = os.path.dirname (os.path.abspath (sys.argv[0])) + assert (Globals.wxApplication == None) #We can have only one application + Globals.wxApplication = self - # set the new global app + assert not Globals.application #More than one application object doesn't make sense Globals.application = self wxInitAllImageHandlers() @@ -195,38 +90,30 @@ """ os.environ['LANGUAGE'] = 'en' self.locale = wxLocale(wxLANGUAGE_ENGLISH) - - # @@@ Sets the python locale, used by wxCalendarCtrl and mxDateTime - # for month and weekday names. When running on Linux, 'en' is not - # understood as a locale, nor is 'fr'. On Windows, you can try 'fr'. - # locale.setlocale(locale.LC_ALL, 'en') - + + """ + @@@ Sets the python locale, used by wxCalendarCtrl and mxDateTime + for month and weekday names. When running on Linux, 'en' is not + understood as a locale, nor is 'fr'. On Windows, you can try 'fr'. + locale.setlocale(locale.LC_ALL, 'en') + """ wxLocale_AddCatalogLookupPathPrefix('locale') self.locale.AddCatalog('Chandler.mo') - gettext.install('Chandler', os.path.join (self.chandlerDirectory, 'locale')) + gettext.install('Chandler', os.path.join (Globals.chandlerDirectory, 'locale')) - resourceFile = os.path.join ("application", "application.xrc") - """ - Check for the file's existence in debugging code - """ - assert stat.S_ISREG(os.stat(resourceFile)[stat.ST_MODE]) - self.applicationResources = wxXmlResource(resourceFile) - """ Load the parcels which are contained in the PARCEL_IMPORT directory. - It's necessary to add the "parcels" directory to sys.path in order - to import parcels. + It's necessary to add the "parcels" directory to sys.path in order + to import parcels. """ - parcelDir = os.path.join(self.chandlerDirectory, - Application.PARCEL_IMPORT.replace ('.', os.sep)) + parcelDir = os.path.join(Globals.chandlerDirectory, + self.PARCEL_IMPORT.replace ('.', os.sep)) sys.path.insert (1, parcelDir) if __debug__: """ In the debugging version, if PARCELDIR env var is set, put that - directory into sys.path because zodb might be loading objects - based on modules in that directory. This must be done prior to - loading the system parcels + directory into sys.path before any modules are imported. """ debugParcelDir = None if os.environ.has_key('PARCELDIR'): @@ -237,123 +124,155 @@ """ Open the repository. - -create argument forces a new repository. - -recover argument runs recovery when opening after a crash. - Load the Repository after the path has been altered, but before - the parcels are loaded. - """ - repositoryPath = os.path.join(self.chandlerDirectory, "__repository__") - self.repository = XMLRepository(repositoryPath) + -create argument forces a new repository. + -recover argument runs recovery when opening after a crash. + Load the Repository after the path has been altered, but before + the parcels are loaded. + """ + repositoryPath = os.path.join(Globals.chandlerDirectory, + "__repository__") + Globals.repository = XMLRepository(repositoryPath) - if '-create' in self.argv: - self.repository.create() + if '-create' in sys.argv: + Globals.repository.create() else: - self.repository.open(create=True, recover='-recover' in self.argv) + Globals.repository.open(create=True, recover='-recover' in sys.argv) - # Load the repository foundations - # @@@ This repository loading code should not be embedded in the - # application. - if not self.repository.find('//Schema'): + if not Globals.repository.find('//Schema'): """ Bootstrap an empty repository by loading only the stuff that - can't be loaded in a data parcel. + can't be loaded in a data parcel. """ - self.repository.loadPack(os.path.join(self.chandlerDirectory, - "repository", - "packs", - "schema.pack")) + Globals.repository.loadPack(os.path.join(Globals.chandlerDirectory, + "repository", + "packs", + "schema.pack")) - # set the new global repository - Globals.repository = self.repository - - AutoItem.SetRepository (app.repository) #AutoItem needs to know the repository - self.model = self.repository.find('//Application') - if not self.model: - self.model = Application(name='Application', parent=self.repository) - - """ - The model persists, so it can't store a reference to self, which - is a wxApp object. We use the association to keep track of the - wxPython object associated with each persistent object. - """ - self.association={id(self.model) : self} - - # Load individual data parcels - # @@@ This should not be hardcoded, but part of a larger - # parcel loading framework. - from repository.schema.DomainSchemaLoader import DomainSchemaLoader - loader = DomainSchemaLoader(self.repository) - - # Load the document parcel - if not self.repository.find('//Document'): - documentPath = os.path.join(self.chandlerDirectory, 'parcels', - 'OSAF', 'document', 'model', - 'document.xml') - loader.load(documentPath) + # AutoItem needs to know the repository + AutoItem.AutoItem.SetRepository (Globals.repository) - # New parcel loading -- not tested on all platforms + # Load Parcels + parcelSearchPath = parcelDir if __debug__ and debugParcelDir: - parcelSearchPath = "%s%s%s" % (parcelDir, - os.pathsep, - debugParcelDir) - else: - parcelSearchPath = parcelDir - - LoadParcels.LoadParcels(parcelSearchPath, self.repository) - self.repository.commit() + parcelSearchPath = os.path.join(parcelSearchPath, debugParcelDir) - # Create the notification manager - from OSAF.framework.notifications.NotificationManager import NotificationManager + LoadParcels.LoadParcels(parcelSearchPath, Globals.repository) + EVT_MAIN_THREAD_CALLBACK(self, self.OnMainThreadCallbackEvent) + + # Create and start the notification manager. + from OSAF.framework.notifications.NotificationManager import NotificationManager Globals.notificationManager = NotificationManager() Globals.notificationManager.PrepareSubscribers() + # Create and start the agent manager. + from OSAF.framework.agents.AgentManager import AgentManager + Globals.agentManager = AgentManager() + """ + Temporarily disable agents to avoid repository bug that prevents + objects from changing in other threads. This allows me to continue + working -- DJA + """ + #Globals.agentManager.Startup() + EVT_MENU(self, -1, self.OnCommand) + EVT_UPDATE_UI(self, -1, self.OnCommand) + self.focus = None + EVT_IDLE(self, self.OnIdle) - #""" Load the old parcels, will go away """ - self.LoadParcelsV2InDirectory(parcelDir) + #allocate the Jabber client, logging in if possible + #import ChandlerJabber + # Globals.jabberClient = ChandlerJabber.JabberClient(self) + + # Globals.jabberClient.Login() + + from OSAF.framework.blocks.Views import View + + mainView = Globals.repository.find('//parcels/OSAF/views/main/MainView') + + if mainView: + assert isinstance (mainView, View) + self.mainFrame = MainFrame(None, + -1, + "Chandler", + size=(mainView.size.width, mainView.size.height), + style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) + Globals.mainView = mainView + self.menuParent = None + self.mainFrame.counterpartUUID = mainView.getUUID() + EVT_SIZE(self.mainFrame, self.mainFrame.OnSize) + + GlobalEvents = Globals.repository.find('//parcels/OSAF/framework/blocks/Events/GlobalEvents') + + events = [] + for event in GlobalEvents.blockEvents: + events.append (event) + for event in mainView.blockEvents: + events.append (event) + + Globals.notificationManager.Subscribe (events, + Globals.mainView.getUUID(), + Globals.mainView.dispatchEvent) - self.model.SynchronizeView() - EVT_MENU(self, XRCID ("Quit"), self.OnQuit) - EVT_MENU(self, XRCID ("About"), self.OnAbout) - EVT_MENU(self, XRCID ("Preferences"), self.OnPreferences) - EVT_MENU(self, XRCID("TogglePresenceWindow"), self.TogglePresenceWindow) - - if __debug__: - """ - In the debugging version we have a debug menu with a couple - commands that are useful for testing code. Currently they call - OnTest1 and OnTest2. To see how all this works check out - ChandlerWindow.py. - """ - EVT_MENU(self, XRCID("ShowDebuggerWindow"), self.ShowDebuggerWindow) - EVT_MENU(self, XRCID("DebugRoutine"), self.DebugRoutine) - EVT_MENU(self, XRCID("ImportItems"), self.OnImportItems) - EVT_MENU(self, XRCID("ExportItems"), self.OnExportItems) + mainView.render (self.mainFrame, self.mainFrame) - EVT_MENU(self, -1, self.OnCommand) - EVT_UPDATE_UI(self, -1, self.OnCommand) - EVT_MAIN_THREAD_CALLBACK(self, self.OnMainThreadCallbackEvent) - + self.mainFrame.Show() + return true #indicates we succeeded with initialization + + + def OnCommand(self, event): """ - allocate the Jabber client, logging in if possible + Catch commands and pass them along to the blocks. + Our events have ids between MINIMUM_WX_ID and MAXIMUM_WX_ID """ - import ChandlerJabber - self.jabberClient = ChandlerJabber.JabberClient(self) - - self.InCommand = false #used by OnCommand - self.jabberClient.Login() + from OSAF.framework.blocks.Block import Block, BlockEvent + from OSAF.framework.notifications.Notification import Notification - # start the agent manager - from OSAF.framework.agents.AgentManager import AgentManager - Globals.agentManager = AgentManager() - Globals.agentManager.Startup() + wxID = event.GetId() + if wxID &gt;= Block.MINIMUM_WX_ID and wxID &lt;= Block.MAXIMUM_WX_ID: + blockEvent = Block.wxIDToObject (wxID) + + if isinstance (blockEvent, BlockEvent): + assert isinstance (blockEvent, BlockEvent) + if event.GetEventType() == wxEVT_UPDATE_UI: + data = {'type':'UpdateUI'} + else: + data = {'type':'Normal'} - #self.OpenStartingURL() + notification = Notification(blockEvent, None, None) + notification.SetData(data) + Globals.notificationManager.PostNotification (notification) + if event.GetEventType() == wxEVT_UPDATE_UI: + try: + event.Check (data ['Check']) + except KeyError: + pass + try: + event.Enable (data ['Enable']) + except KeyError: + pass + try: + text = data ['Text'] + eventObject = event.GetEventObject() + event.SetText (data ['Text']) + except KeyError: + pass + return + event.Skip() - return true #indicates we succeeded with initialization + def OnIdle(self, event): + """ + Adding a handler for catching a set focus event doesn't catch + every change to the focus. It's difficult to preprocess every event + so we check for focus changes in OnIdle + """ + focus = wxWindow_FindFocus() + if self.focus != focus: + self.focus = focus + Globals.mainView.onSetFocus() + event.Skip() - def OnTerminate(self): + def OnExit(self): """ Main application termination. """ @@ -364,36 +283,8 @@ need to add a final commit when the application quits to save data the state of the user's world, e.g. window location and size. """ - self.repository.commit(purge=True) - self.repository.close() - del self.applicationResources - - def OpenStartingURL(self): - """ - Opens the proper url when the application first starts. If - this is the first time running, then we just take the first item - in the URLTree. If we have persisted, then we use the last - remembered url. - """ - if not hasattr(self, 'wxMainFrame'): - self.wxMainFrame = app.association[id(self.model.mainFrame)] - url = self.wxMainFrame.navigationBar.model.GetCurrentURL() - if url != None: - url = app.jabberClient.StripRemoteIfNecessary(url) - self.wxMainFrame.GoToURL(url, false) - else: - children = self.model.URLTree.GetURLChildren('') - if len(children) &gt; 0: - self.wxMainFrame.GoToURL(children[0], true) - - def OnQuit(self, event): - """ - Exit the application - """ - # FIXME: This will not fully quit the app if a stdout window has been - # opened by a print statement. We should also close that stdout window. - self.wxMainFrame.Close() - Globals.agentManager.Shutdown() + Globals.repository.commit(purge=True) + Globals.repository.close() def OnMainThreadCallbackEvent(self, event): """ @@ -403,291 +294,6 @@ event.lock.release() event.Skip() - def OnAbout(self, event): - """ - Show the splash screen in response to the about command - """ - - pageLocation = os.path.join ('application', 'welcome.html') - splash = SplashScreen(app.wxMainFrame, _("About Chandler"), - pageLocation, True, False) - splash.ShowModal() - splash.Destroy() - - def OnPreferences(self, event): - """ - Show the preferences dialog - """ - title = _("Chandler Preferences") - dialog = PreferencesDialog.PreferencesDialog(app.wxMainFrame, title, self.model.preferences) - - result = dialog.ShowModal() - if result == wxID_OK: - dialog.SavePreferences() - self.HandleSystemPreferences() - dialog.Destroy() - - def LoadParcelsV2InDirectory (self, baseDir, relDir=""): - """ - Load the parcels and call the class method to install them. Parcels - are Python Packages and are defined by directories that contain - __init__.py (or __init__.pyc). __init__.py must assign the parcel's - class name to parcelClass. For example: - - parcelClass = 'CalendarFile.CalendarClass' - - CalendarFile is the python file (without the .py extension) that - contains the class CalendarClass contained in the file which is - the parcel class. - - For examples, look in the parcel directory. - - The method now takes two directory arguments, baseDir and relDir. - baseDir should be a directory containing parcel subdirectories, - while relDir is only used when recursing through directories below - baseDir. - """ - path = os.path.join(baseDir, relDir) - assert (os.path.exists (path) and os.path.isdir(path)) - - if (relDir and \ - (os.path.exists(os.path.join (path, "__init__.py")) or \ - os.path.exists(os.path.join (path, "__init__.pyc")) or \ - os.path.exists(os.path.join (path, "__init__.pyo"))) \ - ): - importArgument = relDir.replace (os.sep, '.') - """ - Import the parcel, which should define parcelClass. - - If you get an error like: Import can't find module, - or can't find name in module: No module named XYZ.XYZ - on the following statement, you probablyf startTLS(self, ctx): + assert not self.TLS + self.stopReading() + self.stopWriting() +- self._startTLS() +- self.socket = SSL.Connection(ctx.getContext(), self.soc classes=classes_to_include, &lt;/span&gt;&lt;span class Mon, 06 Apr, 22:26
mi...@osafoundation.org - parcels = self.model.URLTree.GetParcelList() - accessibleViews = [] - - for parcel in parcels: - parcelViews = parcel.GetAccessibleViews(jabberID) - for view in parcelViews: - accessibleViews.append(view) - - return accessibleViews - - def HasPermission(self, jabberID, url): - """ - Determine if the passed-in jabberID has permission to access the passed-in URL - implement by asking the relevant parcel. - """ - parcel = self.GetParcelFromURL(url) - if parcel != None: - return parcel.HasPermission(jabberID, url) - return false - - def GetParcelFromURL(self, url): - """ - Utility to return the parcel associated with a URL, - or None if it doesn't exist. - """ - urlPieces = url.split('/') - return application.Application.app.model.URLTree.URLExists(urlPieces[0]) - - def GetViewObjects(self, url, jabberID): - """ - Request a list of objects from the view specified by a URL. - Figure out the appropriate parcel, and let it do the work. - """ - parcel = self.GetParcelFromURL(url) - if parcel != None: - return parcel.GetViewObjects(url, jabberID) - - # FIXME: should return an error here - return [] - - def AddObjectsToView(self, url, objectList, lastFlag): - """ - Add the passed in objects to the view specified by the URL. - Figure out the appropriate parcel, and let it do the work - It must be the active parcel, or don't deliver the objects. - """ - parcel = self.GetParcelFromURL(url) - if self.wxMainFrame.activeParcel.model != parcel: - # FIXME: we should at least log the error here - return - - if parcel != None: - parcel.AddObjectsToView(url, objectList, lastFlag) - else: - # FIXME: should return an error here - pass - - def HandleErrorResponse(self, jabberID, url, errorMessage): - """ - Handle error responses by passing them to the parcel. - """ - parcel = self.GetParcelFromURL(url) - if parcel != None: - parcel.HandleErrorResponse(jabberID, url, errorMessage) - else: - wxMessageBox(errorMessage) - - def TogglePresenceWindow(self, event): - """ - Handler for the Show/Hide Presence Window command. - """ - if self.presenceWindow == None: - title = _("Presence Panel") - import PresencePanel - self.presenceWindow = PresencePanel.PresenceWindow(title, self.jabberClient) - self.presenceWindow.CentreOnScreen() - self.presenceWindow.Show() - EVT_CLOSE(self.presenceWindow, self.PresenceWindowClosed) - else: - self.presenceWindow.Close() - self.presenceWindow = None - - def LookupInRepository(self, jabberID): - """ - Lookup the name of a contact associated with the passed-in - jabberID. - FIXME: this routine is temporary scaffolding - we'll use the - real database stuff with indexing when it's developed. - """ - for item in self.repository.find("//Contacts"): - if item.__class__.__name__ == 'ContactEntity': - if item.HasContactMethod('jabberID', jabberID): - return item.GetFullName() - - return None - - def PresenceWindowClosed(self, event): - """ - Handle the presence window closing by clearing the reference. - """ - self.presenceWindow.Destroy() - self.presenceWindow = None - - def HandleSystemPreferences(self): - """ - HandleSystemPreferences is called after the preferences - changed to handle changing the state for varous system preferences. - """ - self.LoginIfNecessary() - if __debug__: - self.SetupDebugMenu() - - def LoginIfNecessary(self): - """ - LoginIfNecessary logs in to the jabber server if necessary. - """ - if self.jabberClient.IsConnected() and self.jabberClient.HasLoginInfo(): - self.jabberClient.Logout() - - if not self.jabberClient.IsConnected(): - self.jabberClient.ReadAccountFromPreferences() - self.jabberClient.Login() - - def SetupDebugMenu(self): - """ - Make the visibility of the debug menu correspond to the - preference. - """ - debugFlag = self.model.preferences.GetPreferenceValue('chandler/debugging/debugmenu') - self.wxMainFrame.ShowOrHideDebugMenu(debugFlag) - def PostAsyncEvent(self, callback, *args): """ @@ -697,6 +303,7 @@ evt.lock.acquire() wxPostEvent(self, evt) return evt.lock + if __debug__: def DebugRoutine(self, event): Index: osaf/chandler/Chandler/Chandler.py diff -u osaf/chandler/Chandler/Chandler.py:1.32 osaf/chandler/Chandler/Chandler.py:1.33 --- osaf/chandler/Chandler/Chandler.py:1.32 Mon Dec 1 13:11:05 2003 +++ osaf/chandler/Chandler/Chandler.py Fri Jan 23 16:59:24 2004 @@ -1,30 +1,27 @@ -__version__ = "$Revision: 1.32 $" -__date__ = "$Date: 2003/12/01 21:11:05 $" +__version__ = "$Revision: 1.33 $" +__date__ = "$Date: 2004/01/24 00:59:24 $" __copyright__ = "Copyright (c) 2003 Open Source Applications Foundation" __license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm" import sys - -# Check for -wing command line argument; if specified, try to connect to -# an already-running WingIDE instance. See: -# http://wiki.osafoundation.org/bin/view/Main/DebuggingChandler#wingIDE -# for details. -if '-wing' in sys.argv: +if __debug__ and '-wing' in sys.argv: + """ + Check for -wing command line argument; if specified, try to connect to + an already-running WingIDE instance. See: + http://wiki.osafoundation.org/bin/view/Main/DebuggingChandler#wingIDE + for details. + """ import wingdbstub - import logging -from application.Application import wxApplication +from wxPython.wx import * +from application.ApplicationNew import wxApplicationNew def main(): """ - The details of unhandled exceptions are now handled by the logger, + The details of unhandled exceptions are now handled by the logger, and logged to a file: chandler.log - - We are currently reraising the exception, so that wing can notice - in the default exception handler. """ - handler = logging.FileHandler('chandler.log') formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') handler.setFormatter(formatter) @@ -32,38 +29,26 @@ root.addHandler(handler) try: - application = wxApplication(sys.argv) - except Exception, e: - logging.exception("Unhandled exception during initialization") - ShowExceptionDialog("Chandler", "Chandler encountered an unexpected problem while trying to start.") - raise + """ + Don't redirect stdio to a file. useBestVisual, uses best screen + resolutions on some old computers. See wxApp.SetUseBestVisual + """ + exceptionMessage = "while trying to start." + application = wxApplicationNew(redirect=False, useBestVisual=True) - try: + exceptionMessage = "and had to shut down." application.MainLoop() - except: - logging.exception("Unhandled exception during main loop") - ShowExceptionDialog("Chandler", "Chandler encountered an unexpected problem and had to shut down.") - raise - - try: - application.OnTerminate() - except: - logging.exception("Unhandled exception on termination") - ShowExceptionDialog("Chandler", "Chandler encountered an unexpected problem while trying to shut down.") - raise - - logging.shutdown() + except Exception, e: + message = "Chandler encountered an unexpected problem %s" % exceptionMessage + logging.exception(message) + dialog = wxMessageDialog(None, message, "Chandler", wxOK | wxICON_INFORMATION) + dialog.ShowModal() + dialog.Destroy() -def ShowExceptionDialog(title, message): - """ - A note to the user that Chandler has crashed. - """ - from wxPython.wx import wxMessageDialog, wxOK, wxICON_INFORMATION - dlg = wxMessageDialog(None, message, title, - wxOK | wxICON_INFORMATION) - dlg.ShowModal() - dlg.Destroy() + # ReraisiEI71vV000395@tutu.osafoundation.org>/ Mon, 27 Oct, 05:30
Message listThread · Author · Date
Box list
Jul 20081
Mar 20081
Jan 20085
Dec 200715
Nov 20078
Oct 200749
Sep 200725
Aug 2007137
Jul 2007246
Jun 200761
May 200710
Apr 200744
Mar 200716
Feb 20076
Jan 200721
Dec 20065
Nov 200613
Oct 200613
Sep 200623
Aug 200643
Jul 200621
Jun 200652
May 200652
Apr 200629
Mar 200639
Feb 200677
Jan 200620
Dec 200510
Sep 20058
Jun 20052
Apr 20051
Mar 20052
Feb 20054
Dec 20045
Nov 20042
Sep 20041
Aug 20045
Jun 20047
Apr 20041
Feb 20042
Jan 20042
Dec 20031
Nov 20039
Aug 20036
Jun 20033
Mar 20031
Feb 20031
Jan 20033
Dec 20021
Nov 20022
Oct 20024