/home/epimerde/documents/tc11/CanFestival-3/objdictgen/objdictedit.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # -*- coding: utf-8 -*-
00003 
00004 #This file is part of CanFestival, a library implementing CanOpen Stack. 
00005 #
00006 #Copyright (C): Edouard TISSERANT, Francis DUPIN and Laurent BESSARD
00007 #
00008 #See COPYING file for copyrights details.
00009 #
00010 #This library is free software; you can redistribute it and/or
00011 #modify it under the terms of the GNU Lesser General Public
00012 #License as published by the Free Software Foundation; either
00013 #version 2.1 of the License, or (at your option) any later version.
00014 #
00015 #This library is distributed in the hope that it will be useful,
00016 #but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 #Lesser General Public License for more details.
00019 #
00020 #You should have received a copy of the GNU Lesser General Public
00021 #License along with this library; if not, write to the Free Software
00022 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00023 
00024 from wxPython.wx import *
00025 from wxPython.grid import *
00026 import wx
00027 import wx.grid
00028 
00029 from types import *
00030 import os, re, platform, sys, time, traceback, getopt
00031 
00032 __version__ = "$Revision$"
00033 
00034 from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes
00035 
00036 from nodemanager import *
00037 from subindextable import *
00038 from commondialogs import *
00039 from doc_index.DS301_index import *
00040 
00041 try:
00042     from wxPython.html import *
00043 
00044     wxEVT_HTML_URL_CLICK = wxNewId()
00045 
00046     def EVT_HTML_URL_CLICK(win, func):
00047         win.Connect(-1, -1, wxEVT_HTML_URL_CLICK, func)
00048 
00049     class wxHtmlWindowUrlClick(wxPyEvent):
00050         def __init__(self, linkinfo):
00051             wxPyEvent.__init__(self)
00052             self.SetEventType(wxEVT_HTML_URL_CLICK)
00053             self.linkinfolinkinfo = (linkinfo.GetHref(), linkinfo.GetTarget())
00054 
00055     class wxUrlClickHtmlWindow(wxHtmlWindow):
00056         """ HTML window that generates and OnLinkClicked event.
00057 
00058         Use this to avoid having to override HTMLWindow
00059         """
00060         def OnLinkClicked(self, linkinfo):
00061             wxPostEvent(self, wxHtmlWindowUrlClick(linkinfo))
00062     
00063 #-------------------------------------------------------------------------------
00064 #                                Html Frame
00065 #-------------------------------------------------------------------------------
00066 
00067     [wxID_HTMLFRAME, wxID_HTMLFRAMEHTMLCONTENT] = [wx.NewId() for _init_ctrls in range(2)]
00068 
00069     class HtmlFrame(wx.Frame):
00070         def _init_ctrls(self, prnt):
00071             # generated method, don't edit
00072             wx.Frame.__init__(self, id=wxID_HTMLFRAME, name='HtmlFrame',
00073                   parent=prnt, pos=wx.Point(320, 231), size=wx.Size(853, 616),
00074                   style=wx.DEFAULT_FRAME_STYLE, title='')
00075             self.Bind(wx.EVT_CLOSE, self.OnCloseFrameOnCloseFrame, id=wxID_HTMLFRAME)
00076             
00077             self.HtmlContent = wxUrlClickHtmlWindow(id=wxID_HTMLFRAMEHTMLCONTENT,
00078                   name='HtmlContent', parent=self, pos=wx.Point(0, 0),
00079                   size=wx.Size(-1, -1), style=wxHW_SCROLLBAR_AUTO|wxHW_NO_SELECTION)
00080             EVT_HTML_URL_CLICK(self.HtmlContent, self.OnLinkClickOnLinkClick)
00081 
00082         def __init__(self, parent, opened):
00083             self._init_ctrls_init_ctrls(parent)
00084             self.HtmlFrameOpenedHtmlFrameOpened = opened
00085         
00086         def SetHtmlCode(self, htmlcode):
00087             self.HtmlContent.SetPage(htmlcode)
00088             
00089         def SetHtmlPage(self, htmlpage):
00090             self.HtmlContent.LoadPage(htmlpage)
00091             
00092         def OnCloseFrame(self, event):
00093             self.HtmlFrameOpenedHtmlFrameOpened.remove(self.GetTitle())
00094             event.Skip()
00095         
00096         def OnLinkClick(self, event):
00097             url = event.linkinfo[0]
00098             try:
00099                 import webbrowser
00100             except ImportError:
00101                 wxMessageBox('Please point your browser at: %s' % url)
00102             else:
00103                 webbrowser.open(url)
00104     
00105     Html_Window = True
00106 except:
00107     Html_Window = False
00108 
00109 def create(parent):
00110     return objdictedit(parent)
00111 
00112 def usage():
00113     print "\nUsage of objdictedit.py :"
00114     print "\n   %s [Filepath, ...]\n"%sys.argv[0]
00115 
00116 try:
00117     opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
00118 except getopt.GetoptError:
00119     # print help information and exit:
00120     usage()
00121     sys.exit(2)
00122 
00123 for o, a in opts:
00124     if o in ("-h", "--help"):
00125         usage()
00126         sys.exit()
00127 
00128 filesOpen = args
00129 ScriptDirectory = sys.path[0]
00130 
00131 
00132 [wxID_OBJDICTEDIT, wxID_OBJDICTEDITFILEOPENED, 
00133  wxID_OBJDICTEDITHELPBAR,
00134 ] = [wx.NewId() for _init_ctrls in range(3)]
00135 
00136 [wxID_OBJDICTEDITADDMENUITEMS0, wxID_OBJDICTEDITADDMENUITEMS1, 
00137  wxID_OBJDICTEDITADDMENUITEMS2, wxID_OBJDICTEDITADDMENUITEMS3, 
00138  wxID_OBJDICTEDITADDMENUITEMS4, wxID_OBJDICTEDITADDMENUITEMS5, 
00139 ] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)]
00140 
00141 [wxID_OBJDICTEDITFILEMENUITEMS0, wxID_OBJDICTEDITFILEMENUITEMS1, 
00142  wxID_OBJDICTEDITFILEMENUITEMS2, wxID_OBJDICTEDITFILEMENUITEMS4, 
00143  wxID_OBJDICTEDITFILEMENUITEMS5, wxID_OBJDICTEDITFILEMENUITEMS6, 
00144  wxID_OBJDICTEDITFILEMENUITEMS7, wxID_OBJDICTEDITFILEMENUITEMS8,
00145  wxID_OBJDICTEDITFILEMENUITEMS9,
00146 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(9)]
00147 
00148 [wxID_OBJDICTEDITEDITMENUITEMS0, wxID_OBJDICTEDITEDITMENUITEMS1, 
00149  wxID_OBJDICTEDITEDITMENUITEMS2, wxID_OBJDICTEDITEDITMENUITEMS4, 
00150  wxID_OBJDICTEDITEDITMENUITEMS6, wxID_OBJDICTEDITEDITMENUITEMS7, 
00151  wxID_OBJDICTEDITEDITMENUITEMS8, 
00152 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)]
00153 
00154 [wxID_OBJDICTEDITHELPMENUITEMS0, wxID_OBJDICTEDITHELPMENUITEMS1,
00155  wxID_OBJDICTEDITHELPMENUITEMS2,
00156 ] = [wx.NewId() for _init_coll_HelpMenu_Items in range(3)]
00157 
00158 class objdictedit(wx.Frame):
00159     def _init_coll_menuBar1_Menus(self, parent):
00160         # generated method, don't edit
00161 
00162         parent.Append(menu=self.FileMenu, title='File')
00163         parent.Append(menu=self.EditMenu, title='Edit')
00164         parent.Append(menu=self.AddMenu, title='Add')
00165         parent.Append(menu=self.HelpMenu, title='Help')
00166 
00167     def _init_coll_EditMenu_Items(self, parent):
00168         # generated method, don't edit
00169 
00170         parent.Append(help='', id=wxID_OBJDICTEDITEDITMENUITEMS4,
00171               kind=wx.ITEM_NORMAL, text='Refresh\tCTRL+R')
00172         parent.AppendSeparator()
00173         parent.Append(help='', id=wxID_OBJDICTEDITEDITMENUITEMS1,
00174               kind=wx.ITEM_NORMAL, text='Undo\tCTRL+Z')
00175         parent.Append(help='', id=wxID_OBJDICTEDITEDITMENUITEMS0,
00176               kind=wx.ITEM_NORMAL, text='Redo\tCTRL+Y')
00177         parent.AppendSeparator()
00178         parent.Append(help='', id=wxID_OBJDICTEDITEDITMENUITEMS6,
00179               kind=wx.ITEM_NORMAL, text='Node infos')
00180         parent.Append(help='', id=wxID_OBJDICTEDITEDITMENUITEMS2,
00181               kind=wx.ITEM_NORMAL, text='DS-301 Profile')
00182         parent.Append(help='', id=wxID_OBJDICTEDITEDITMENUITEMS8,
00183               kind=wx.ITEM_NORMAL, text='DS-302 Profile')
00184         parent.Append(help='', id=wxID_OBJDICTEDITEDITMENUITEMS7,
00185               kind=wx.ITEM_NORMAL, text='Other Profile')
00186         self.Bind(wx.EVT_MENU, self.OnUndoMenuOnUndoMenu,
00187               id=wxID_OBJDICTEDITEDITMENUITEMS1)
00188         self.Bind(wx.EVT_MENU, self.OnRedoMenuOnRedoMenu,
00189               id=wxID_OBJDICTEDITEDITMENUITEMS0)
00190         self.Bind(wx.EVT_MENU, self.OnCommunicationMenuOnCommunicationMenu,
00191               id=wxID_OBJDICTEDITEDITMENUITEMS2)
00192         self.Bind(wx.EVT_MENU, self.OnRefreshMenuOnRefreshMenu,
00193               id=wxID_OBJDICTEDITEDITMENUITEMS4)
00194         self.Bind(wx.EVT_MENU, self.OnNodeInfosMenuOnNodeInfosMenu,
00195               id=wxID_OBJDICTEDITEDITMENUITEMS6)
00196         self.Bind(wx.EVT_MENU, self.OnEditProfileMenuOnEditProfileMenu,
00197               id=wxID_OBJDICTEDITEDITMENUITEMS7)
00198         self.Bind(wx.EVT_MENU, self.OnOtherCommunicationMenuOnOtherCommunicationMenu,
00199               id=wxID_OBJDICTEDITEDITMENUITEMS8)
00200 
00201     def _init_coll_HelpMenu_Items(self, parent):
00202         # generated method, don't edit
00203 
00204         parent.Append(help='', id=wxID_OBJDICTEDITHELPMENUITEMS0,
00205               kind=wx.ITEM_NORMAL, text='DS-301 Standard\tF1')
00206         self.Bind(wx.EVT_MENU, self.OnHelpDS301MenuOnHelpDS301Menu,
00207               id=wxID_OBJDICTEDITHELPMENUITEMS0)
00208         parent.Append(help='', id=wxID_OBJDICTEDITHELPMENUITEMS1,
00209               kind=wx.ITEM_NORMAL, text='CAN Festival Docs\tF2')
00210         self.Bind(wx.EVT_MENU, self.OnHelpCANFestivalMenuOnHelpCANFestivalMenu,
00211               id=wxID_OBJDICTEDITHELPMENUITEMS1)
00212         if Html_Window:
00213             parent.Append(help='', id=wxID_OBJDICTEDITHELPMENUITEMS2,
00214                   kind=wx.ITEM_NORMAL, text='About')
00215             self.Bind(wx.EVT_MENU, self.OnAboutMenuOnAboutMenu,
00216                   id=wxID_OBJDICTEDITHELPMENUITEMS2)
00217 
00218     def _init_coll_FileMenu_Items(self, parent):
00219         # generated method, don't edit
00220 
00221         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS5,
00222               kind=wx.ITEM_NORMAL, text='New\tCTRL+N')
00223         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS0,
00224               kind=wx.ITEM_NORMAL, text='Open\tCTRL+O')
00225         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS1,
00226               kind=wx.ITEM_NORMAL, text='Save\tCTRL+S')
00227         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS6,
00228               kind=wx.ITEM_NORMAL, text='Save As...\tALT+S')
00229         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS2,
00230               kind=wx.ITEM_NORMAL, text='Close\tCTRL+W')
00231         parent.AppendSeparator()
00232         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS7,
00233               kind=wx.ITEM_NORMAL, text='Import EDS file')
00234         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS9,
00235               kind=wx.ITEM_NORMAL, text='Export to EDS file')
00236         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS8,
00237               kind=wx.ITEM_NORMAL, text='Build Dictionary\tCTRL+B')
00238         parent.AppendSeparator()
00239         parent.Append(help='', id=wxID_OBJDICTEDITFILEMENUITEMS4,
00240               kind=wx.ITEM_NORMAL, text='Exit')
00241         self.Bind(wx.EVT_MENU, self.OnOpenMenuOnOpenMenu,
00242               id=wxID_OBJDICTEDITFILEMENUITEMS0)
00243         self.Bind(wx.EVT_MENU, self.OnSaveMenuOnSaveMenu,
00244               id=wxID_OBJDICTEDITFILEMENUITEMS1)
00245         self.Bind(wx.EVT_MENU, self.OnCloseMenuOnCloseMenu,
00246               id=wxID_OBJDICTEDITFILEMENUITEMS2)
00247         self.Bind(wx.EVT_MENU, self.OnQuitMenuOnQuitMenu,
00248               id=wxID_OBJDICTEDITFILEMENUITEMS4)
00249         self.Bind(wx.EVT_MENU, self.OnNewMenuOnNewMenu,
00250               id=wxID_OBJDICTEDITFILEMENUITEMS5)
00251         self.Bind(wx.EVT_MENU, self.OnSaveAsMenuOnSaveAsMenu,
00252               id=wxID_OBJDICTEDITFILEMENUITEMS6)
00253         self.Bind(wx.EVT_MENU, self.OnImportEDSMenuOnImportEDSMenu,
00254               id=wxID_OBJDICTEDITFILEMENUITEMS7)
00255         self.Bind(wx.EVT_MENU, self.OnExportCMenuOnExportCMenu,
00256               id=wxID_OBJDICTEDITFILEMENUITEMS8)
00257         self.Bind(wx.EVT_MENU, self.OnExportEDSMenuOnExportEDSMenu,
00258               id=wxID_OBJDICTEDITFILEMENUITEMS9)
00259 
00260     def _init_coll_AddMenu_Items(self, parent):
00261         # generated method, don't edit
00262 
00263         parent.Append(help='', id=wxID_OBJDICTEDITADDMENUITEMS0,
00264               kind=wx.ITEM_NORMAL, text='SDO Server')
00265         parent.Append(help='', id=wxID_OBJDICTEDITADDMENUITEMS1,
00266               kind=wx.ITEM_NORMAL, text='SDO Client')
00267         parent.Append(help='', id=wxID_OBJDICTEDITADDMENUITEMS2,
00268               kind=wx.ITEM_NORMAL, text='PDO Transmit')
00269         parent.Append(help='', id=wxID_OBJDICTEDITADDMENUITEMS3,
00270               kind=wx.ITEM_NORMAL, text='PDO Receive')
00271         parent.Append(help='', id=wxID_OBJDICTEDITADDMENUITEMS4,
00272               kind=wx.ITEM_NORMAL, text='Map Variable')
00273         parent.Append(help='', id=wxID_OBJDICTEDITADDMENUITEMS5,
00274               kind=wx.ITEM_NORMAL, text='User Type')
00275         self.Bind(wx.EVT_MENU, self.OnAddSDOServerMenuOnAddSDOServerMenu,
00276               id=wxID_OBJDICTEDITADDMENUITEMS0)
00277         self.Bind(wx.EVT_MENU, self.OnAddSDOClientMenuOnAddSDOClientMenu,
00278               id=wxID_OBJDICTEDITADDMENUITEMS1)
00279         self.Bind(wx.EVT_MENU, self.OnAddPDOTransmitMenuOnAddPDOTransmitMenu,
00280               id=wxID_OBJDICTEDITADDMENUITEMS2)
00281         self.Bind(wx.EVT_MENU, self.OnAddPDOReceiveMenuOnAddPDOReceiveMenu,
00282               id=wxID_OBJDICTEDITADDMENUITEMS3)
00283         self.Bind(wx.EVT_MENU, self.OnAddMapVariableMenuOnAddMapVariableMenu,
00284               id=wxID_OBJDICTEDITADDMENUITEMS4)
00285         self.Bind(wx.EVT_MENU, self.OnAddUserTypeMenuOnAddUserTypeMenu,
00286               id=wxID_OBJDICTEDITADDMENUITEMS5)
00287 
00288     def _init_coll_HelpBar_Fields(self, parent):
00289         # generated method, don't edit
00290         parent.SetFieldsCount(3)
00291 
00292         parent.SetStatusText(number=0, text='')
00293         parent.SetStatusText(number=1, text='')
00294         parent.SetStatusText(number=2, text='')
00295 
00296         parent.SetStatusWidths([100, 110, -1])
00297 
00298     def _init_utils(self):
00299         # generated method, don't edit
00300         self.menuBar1 = wx.MenuBar()
00301         self.menuBar1.SetEvtHandlerEnabled(True)
00302 
00303         self.FileMenu = wx.Menu(title='')
00304 
00305         self.EditMenu = wx.Menu(title='')
00306 
00307         self.AddMenu = wx.Menu(title='')
00308 
00309         self.HelpMenu = wx.Menu(title='')
00310 
00311         self._init_coll_menuBar1_Menus_init_coll_menuBar1_Menus(self.menuBar1)
00312         self._init_coll_FileMenu_Items_init_coll_FileMenu_Items(self.FileMenu)
00313         self._init_coll_EditMenu_Items_init_coll_EditMenu_Items(self.EditMenu)
00314         self._init_coll_AddMenu_Items_init_coll_AddMenu_Items(self.AddMenu)
00315         self._init_coll_HelpMenu_Items_init_coll_HelpMenu_Items(self.HelpMenu)
00316 
00317     def _init_ctrls(self, prnt):
00318         # generated method, don't edit
00319         wx.Frame.__init__(self, id=wxID_OBJDICTEDIT, name='objdictedit',
00320               parent=prnt, pos=wx.Point(149, 178), size=wx.Size(1000, 700),
00321               style=wx.DEFAULT_FRAME_STYLE, title='Objdictedit')
00322         self._init_utils_init_utils()
00323         self.SetClientSize(wx.Size(1000, 700))
00324         self.SetMenuBar(self.menuBar1)
00325         self.Bind(wx.EVT_CLOSE, self.OnCloseFrameOnCloseFrame, id=wxID_OBJDICTEDIT)
00326 
00327         self.FileOpened = wx.Notebook(id=wxID_OBJDICTEDITFILEOPENED,
00328               name='FileOpened', parent=self, pos=wx.Point(0, 0),
00329               size=wx.Size(0, 0), style=0)
00330         self.FileOpened.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED,
00331               self.OnFileSelectedChangedOnFileSelectedChanged, id=wxID_OBJDICTEDITFILEOPENED)
00332 
00333         self.HelpBar = wx.StatusBar(id=wxID_OBJDICTEDITHELPBAR, name='HelpBar',
00334               parent=self, style=wxST_SIZEGRIP)
00335         self._init_coll_HelpBar_Fields_init_coll_HelpBar_Fields(self.HelpBar)
00336         self.SetStatusBar(self.HelpBar)
00337 
00338     def __init__(self, parent):
00339         self._init_ctrls_init_ctrls(parent)
00340         self.HtmlFrameOpenedHtmlFrameOpened = []
00341         
00342         self.ManagerManager = NodeManager(ScriptDirectory)
00343         for filepath in filesOpen:
00344             self.ManagerManager.OpenFileInCurrent(filepath)
00345             new_editingpanel = EditingPanel(self, self.ManagerManager)
00346             self.FileOpened.AddPage(new_editingpanel, "")
00347             self.FileOpened.SetSelection(self.ManagerManager.GetCurrentNodeIndex())
00348         if self.ManagerManager.CurrentDS302Defined(): 
00349             self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS8, True)
00350         else:
00351             self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS8, False)
00352         self.RefreshEditMenuRefreshEditMenu()
00353         self.RefreshBufferStateRefreshBufferState()
00354         self.RefreshProfileMenuRefreshProfileMenu()
00355         self.RefreshTitleRefreshTitle()
00356         self.RefreshMainMenuRefreshMainMenu()
00357 
00358     def GetNoteBook(self):
00359         return self.FileOpened
00360 
00361     def OnAddSDOServerMenu(self, event):
00362         self.ManagerManager.AddSDOServerToCurrent()
00363         self.RefreshBufferStateRefreshBufferState()
00364         self.RefreshCurrentIndexListRefreshCurrentIndexList()
00365         event.Skip()
00366     
00367     def OnAddSDOClientMenu(self, event):
00368         self.ManagerManager.AddSDOClientToCurrent()
00369         self.RefreshBufferStateRefreshBufferState()
00370         self.RefreshCurrentIndexListRefreshCurrentIndexList()
00371         event.Skip()
00372 
00373     def OnAddPDOTransmitMenu(self, event):
00374         self.ManagerManager.AddPDOTransmitToCurrent()
00375         self.RefreshBufferStateRefreshBufferState()
00376         self.RefreshCurrentIndexListRefreshCurrentIndexList()
00377         event.Skip()
00378 
00379     def OnAddPDOReceiveMenu(self, event):
00380         self.ManagerManager.AddPDOReceiveToCurrent()
00381         self.RefreshBufferStateRefreshBufferState()
00382         self.RefreshCurrentIndexListRefreshCurrentIndexList()
00383         event.Skip()
00384 
00385     def OnAddMapVariableMenu(self, event):
00386         self.AddMapVariableAddMapVariable()
00387         event.Skip()
00388 
00389     def OnAddUserTypeMenu(self, event):
00390         self.AddUserTypeAddUserType()
00391         event.Skip()
00392 
00393     def OnFileSelectedChanged(self, event):
00394         selected = event.GetSelection()
00395         # At init selected = -1
00396         if selected >= 0:
00397             window = self.FileOpened.GetPage(selected)
00398             self.ManagerManager.ChangeCurrentNode(window.GetIndex())
00399             self.RefreshBufferStateRefreshBufferState()
00400             self.RefreshStatusBarRefreshStatusBar()
00401             self.RefreshProfileMenuRefreshProfileMenu()
00402         event.Skip()
00403 
00404     def OnHelpDS301Menu(self, event):
00405         find_index = False
00406         selected = self.FileOpened.GetSelection()
00407         if selected >= 0:
00408             window = self.FileOpened.GetPage(selected)
00409             result = window.GetSelection()
00410             if result:
00411                 find_index = True
00412                 index, subIndex = result
00413                 result = OpenPDFDocIndex(index, ScriptDirectory)
00414                 if type(result) == StringType:
00415                     message = wxMessageDialog(self, result, "ERROR", wxOK|wxICON_ERROR)
00416                     message.ShowModal()
00417                     message.Destroy()
00418         if not find_index:
00419             result = OpenPDFDocIndex(None, ScriptDirectory)
00420             if type(result) == StringType:
00421                 message = wxMessageDialog(self, result, "ERROR", wxOK|wxICON_ERROR)
00422                 message.ShowModal()
00423                 message.Destroy()
00424         event.Skip()
00425         
00426     def OnHelpCANFestivalMenu(self, event):
00427         #self.OpenHtmlFrame("CAN Festival Reference", os.path.join(ScriptDirectory, "doc/canfestival.html"), wx.Size(1000, 600))
00428         os.system("xpdf -remote CANFESTIVAL %s %d &"%(os.path.join(ScriptDirectory, "doc/manual_en.pdf"),16))
00429         event.Skip()
00430 
00431     def OnAboutMenu(self, event):
00432         self.OpenHtmlFrameOpenHtmlFrame("About CAN Festival", os.path.join(ScriptDirectory, "doc/about.html"), wx.Size(500, 450))
00433         event.Skip()
00434 
00435     def OpenHtmlFrame(self, title, file, size):
00436         if title not in self.HtmlFrameOpenedHtmlFrameOpened:
00437             self.HtmlFrameOpenedHtmlFrameOpened.append(title)
00438             window = HtmlFrame(self, self.HtmlFrameOpenedHtmlFrameOpened)
00439             window.SetTitle(title)
00440             window.SetHtmlPage(file)
00441             window.SetClientSize(size)
00442             window.Show()
00443 
00444     def OnQuitMenu(self, event):
00445         self.Close()
00446         event.Skip()
00447     
00448     def OnCloseFrame(self, event):
00449         if self.ManagerManager.OneFileHasChanged():
00450             dialog = wxMessageDialog(self, "There are changes, do you want to save?",  "Close Application", wxYES_NO|wxCANCEL|wxICON_QUESTION)
00451             answer = dialog.ShowModal()
00452             dialog.Destroy()
00453             if answer == wxID_YES:
00454                 self.ManagerManager.ChangeCurrentNode(0)
00455                 for i in xrange(self.FileOpened.GetPageCount()):
00456                     if self.ManagerManager.CurrentIsSaved():
00457                         self.ManagerManager.CloseCurrent()
00458                     else:
00459                         self.SaveSave()
00460                         self.ManagerManager.CloseCurrent(True)
00461                 event.Skip()
00462             elif answer == wxID_NO:
00463                 for i in xrange(self.FileOpened.GetPageCount()):
00464                     self.ManagerManager.CloseCurrent(True)
00465                 wxCallAfter(self.Close)
00466                 event.Skip()
00467         else:
00468             event.Skip()
00469 
00470 #-------------------------------------------------------------------------------
00471 #                             Refresh Functions
00472 #-------------------------------------------------------------------------------
00473 
00474     def RefreshTitle(self):
00475         if self.FileOpened.GetPageCount() > 0:
00476             self.SetTitle("Objdictedit - %s"%self.ManagerManager.GetCurrentFilename())
00477         else:
00478             self.SetTitle("Objdictedit")
00479 
00480     def OnRefreshMenu(self, event):
00481         self.RefreshCurrentIndexListRefreshCurrentIndexList()
00482         event.Skip()
00483 
00484     def RefreshCurrentIndexList(self):
00485         selected = self.FileOpened.GetSelection()
00486         window = self.FileOpened.GetPage(selected)
00487         window.RefreshIndexList()
00488 
00489     def RefreshStatusBar(self):
00490         if self.HelpBar:
00491             window = self.FileOpened.GetPage(self.FileOpened.GetSelection())
00492             selection = window.GetSelection()
00493             if selection:
00494                 index, subIndex = selection
00495                 if self.ManagerManager.IsCurrentEntry(index):
00496                     self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0)
00497                     self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1)
00498                     entryinfos = self.ManagerManager.GetEntryInfos(index)
00499                     name = entryinfos["name"]
00500                     category = "Optional"
00501                     if entryinfos["need"]:
00502                         category = "Mandatory"
00503                     struct = "VAR"
00504                     number = ""
00505                     if entryinfos["struct"] & OD_IdenticalIndexes:
00506                         number = " possibly defined %d times"%entryinfos["nbmax"]
00507                     if entryinfos["struct"] & OD_IdenticalSubindexes:
00508                         struct = "REC"
00509                     elif entryinfos["struct"] & OD_MultipleSubindexes:
00510                         struct = "ARRAY"
00511                     text = "%s: %s entry of struct %s%s."%(name,category,struct,number)
00512                     self.HelpBar.SetStatusText(text, 2)
00513                 else:
00514                     for i in xrange(3):
00515                         self.HelpBar.SetStatusText("", i)
00516             else:
00517                 for i in xrange(3):
00518                     self.HelpBar.SetStatusText("", i)
00519 
00520     def RefreshMainMenu(self):
00521         if self.FileMenu:
00522             if self.FileOpened.GetPageCount() > 0:
00523                 self.menuBar1.EnableTop(1, True)
00524                 self.menuBar1.EnableTop(2, True)
00525                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS1, True)
00526                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS2, True)
00527                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS6, True)
00528                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS8, True)
00529                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS9, True)
00530             else:
00531                 self.menuBar1.EnableTop(1, False)      
00532                 self.menuBar1.EnableTop(2, False)
00533                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS1, False)
00534                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS2, False)
00535                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS6, False)
00536                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS8, False)
00537                 self.FileMenu.Enable(wxID_OBJDICTEDITFILEMENUITEMS9, False)
00538 
00539     def RefreshEditMenu(self):
00540         if self.FileMenu:
00541             if self.FileOpened.GetPageCount() > 0:
00542                 undo, redo = self.ManagerManager.GetCurrentBufferState()
00543                 self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS1, undo)
00544                 self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS0, redo)
00545             else:
00546                 self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS1, False)
00547                 self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS0, False)
00548 
00549     def RefreshProfileMenu(self):
00550         if self.EditMenu:
00551             profile = self.ManagerManager.GetCurrentProfileName()
00552             edititem = self.EditMenu.FindItemById(wxID_OBJDICTEDITEDITMENUITEMS7)
00553             if edititem:
00554                 length = self.AddMenu.GetMenuItemCount()
00555                 for i in xrange(length-6):
00556                     additem = self.AddMenu.FindItemByPosition(6)
00557                     self.AddMenu.Delete(additem.GetId())
00558                 if profile not in ("None", "DS-301"):
00559                     edititem.SetText("%s Profile"%profile)
00560                     edititem.Enable(True)
00561                     self.AddMenu.AppendSeparator()
00562                     for text, indexes in self.ManagerManager.GetCurrentSpecificMenu():
00563                         new_id = wx.NewId()
00564                         self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text)
00565                         self.Bind(wx.EVT_MENU, self.GetProfileCallBackGetProfileCallBack(text), id=new_id)
00566                 else:
00567                     edititem.SetText("Other Profile")
00568                     edititem.Enable(False)
00569         
00570 
00571 #-------------------------------------------------------------------------------
00572 #                            Buffer Functions
00573 #-------------------------------------------------------------------------------
00574 
00575     def RefreshBufferState(self):
00576         fileopened = self.ManagerManager.GetAllFilenames()
00577         for idx, filename in enumerate(fileopened):
00578             self.FileOpened.SetPageText(idx, filename)
00579         self.RefreshEditMenuRefreshEditMenu()
00580         self.RefreshTitleRefreshTitle()
00581 
00582     def OnUndoMenu(self, event):
00583         self.ManagerManager.LoadCurrentPrevious()
00584         self.RefreshCurrentIndexListRefreshCurrentIndexList()
00585         self.RefreshBufferStateRefreshBufferState()
00586         event.Skip()
00587 
00588     def OnRedoMenu(self, event):
00589         self.ManagerManager.LoadCurrentNext()
00590         self.RefreshCurrentIndexListRefreshCurrentIndexList()
00591         self.RefreshBufferStateRefreshBufferState()
00592         event.Skip()
00593 
00594 
00595 #-------------------------------------------------------------------------------
00596 #                         Load and Save Funtions
00597 #-------------------------------------------------------------------------------
00598 
00599     def OnNewMenu(self, event):
00600         self.FilePathFilePath = ""
00601         dialog = CreateNodeDialog(self, ScriptDirectory)
00602         if dialog.ShowModal() == wxID_OK:
00603             name, id, nodetype, description = dialog.GetValues()
00604             profile, filepath = dialog.GetProfile()
00605             NMT = dialog.GetNMTManagement()
00606             options = dialog.GetOptions()
00607             result = self.ManagerManager.CreateNewNode(name, id, nodetype, description, profile, filepath, NMT, options)
00608             if type(result) == IntType:
00609                 new_editingpanel = EditingPanel(self, self.ManagerManager)
00610                 new_editingpanel.SetIndex(result)
00611                 self.FileOpened.AddPage(new_editingpanel, "")
00612                 self.FileOpened.SetSelection(self.FileOpened.GetPageCount() - 1)
00613                 self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS8, False)
00614                 if "DS302" in options:
00615                     self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS8, True)
00616                 self.RefreshBufferStateRefreshBufferState()
00617                 self.RefreshProfileMenuRefreshProfileMenu()
00618                 self.RefreshMainMenuRefreshMainMenu()
00619             else:
00620                 message = wxMessageDialog(self, result, "ERROR", wxOK|wxICON_ERROR)
00621                 message.ShowModal()
00622                 message.Destroy()
00623         event.Skip()
00624 
00625     def OnOpenMenu(self, event):
00626         filepath = self.ManagerManager.GetCurrentFilePath()
00627         if filepath != "":
00628             directory = os.path.dirname(filepath)
00629         else:
00630             directory = os.getcwd()
00631         dialog = wxFileDialog(self, "Choose a file", directory, "",  "OD files (*.od)|*.od|All files|*.*", wxOPEN|wxCHANGE_DIR)
00632         if dialog.ShowModal() == wxID_OK:
00633             filepath = dialog.GetPath()
00634             if os.path.isfile(filepath):
00635                 result = self.ManagerManager.OpenFileInCurrent(filepath)
00636                 if type(result) == IntType:
00637                     new_editingpanel = EditingPanel(self, self.ManagerManager)
00638                     new_editingpanel.SetIndex(result)
00639                     self.FileOpened.AddPage(new_editingpanel, "")
00640                     self.FileOpened.SetSelection(self.FileOpened.GetPageCount() - 1)
00641                     if self.ManagerManager.CurrentDS302Defined(): 
00642                         self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS8, True)
00643                     else:
00644                         self.EditMenu.Enable(wxID_OBJDICTEDITEDITMENUITEMS8, False)
00645                     self.RefreshEditMenuRefreshEditMenu()
00646                     self.RefreshBufferStateRefreshBufferState()
00647                     self.RefreshProfileMenuRefreshProfileMenu()
00648                     self.RefreshMainMenuRefreshMainMenu()
00649                 else:
00650                     message = wxMessageDialog(self, e.args[0], "Error", wxOK|wxICON_ERROR)
00651                     message.ShowModal()
00652                     message.Destroy()
00653         dialog.Destroy()
00654         event.Skip()
00655 
00656     def OnSaveMenu(self, event):
00657         self.SaveSave()
00658         event.Skip()
00659     
00660     def OnSaveAsMenu(self, event):
00661         self.SaveAsSaveAs()
00662         event.Skip()
00663         
00664     def Save(self):
00665         result = self.ManagerManager.SaveCurrentInFile()
00666         if not result:
00667             self.SaveAsSaveAs()
00668         elif type(result) != StringType:
00669             self.RefreshBufferStateRefreshBufferState()
00670         else:
00671             message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
00672             message.ShowModal()
00673             message.Destroy()
00674 
00675     def SaveAs(self):
00676         filepath = self.ManagerManager.GetCurrentFilePath()
00677         if filepath != "":
00678             directory, filename = os.path.split(filepath)
00679         else:
00680             directory, filename = os.getcwd(), "%s.od"%self.ManagerManager.GetCurrentNodeInfos()[0]
00681         dialog = wxFileDialog(self, "Choose a file", directory, filename,  "OD files (*.od)|*.od|All files|*.*", wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR)
00682         if dialog.ShowModal() == wxID_OK:
00683             filepath = dialog.GetPath()
00684             if os.path.isdir(os.path.dirname(filepath)):
00685                 result = self.ManagerManager.SaveCurrentInFile(filepath)
00686                 if type(result) != StringType:
00687                     self.RefreshBufferStateRefreshBufferState()
00688                 else:
00689                     message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
00690                     message.ShowModal()
00691                     message.Destroy()
00692             else:
00693                 message = wxMessageDialog(self, "%s is not a valid folder!"%os.path.dirname(filepath), "Error", wxOK|wxICON_ERROR)
00694                 message.ShowModal()
00695                 message.Destroy()
00696         dialog.Destroy()
00697 
00698     def OnCloseMenu(self, event):
00699         answer = wxID_YES
00700         result = self.ManagerManager.CloseCurrent()
00701         if not result:
00702             dialog = wxMessageDialog(self, "There are changes, do you want to save?",  "Close File", wxYES_NO|wxCANCEL|wxICON_QUESTION)
00703             answer = dialog.ShowModal()
00704             dialog.Destroy()
00705             if answer == wxID_YES:
00706                 self.OnSaveMenuOnSaveMenu(event)
00707                 if self.ManagerManager.CurrentIsSaved():
00708                     self.ManagerManager.CloseCurrent()
00709             elif answer == wxID_NO:
00710                 self.ManagerManager.CloseCurrent(True)
00711         if self.FileOpened.GetPageCount() > self.ManagerManager.GetBufferNumber():
00712             current = self.FileOpened.GetSelection()
00713             self.FileOpened.DeletePage(current)
00714             if self.FileOpened.GetPageCount() > 0:
00715                 self.FileOpened.SetSelection(min(current, self.FileOpened.GetPageCount() - 1))
00716             self.RefreshBufferStateRefreshBufferState()
00717             self.RefreshMainMenuRefreshMainMenu()
00718         event.Skip()
00719         
00720 
00721 #-------------------------------------------------------------------------------
00722 #                         Import and Export Functions
00723 #-------------------------------------------------------------------------------
00724 
00725     def OnImportEDSMenu(self, event):
00726         dialog = wxFileDialog(self, "Choose a file", os.getcwd(), "",  "EDS files (*.eds)|*.eds|All files|*.*", wxOPEN|wxCHANGE_DIR)
00727         if dialog.ShowModal() == wxID_OK:
00728             filepath = dialog.GetPath()
00729             if os.path.isfile(filepath):
00730                 result = self.ManagerManager.ImportCurrentFromEDSFile(filepath)
00731                 if type(result) == IntType:
00732                     new_editingpanel = EditingPanel(self, self.ManagerManager)
00733                     new_editingpanel.SetIndex(result)
00734                     self.FileOpened.AddPage(new_editingpanel, "")
00735                     self.FileOpened.SetSelection(self.FileOpened.GetPageCount() - 1)
00736                     self.RefreshBufferStateRefreshBufferState()
00737                     self.RefreshCurrentIndexListRefreshCurrentIndexList()
00738                     self.RefreshProfileMenuRefreshProfileMenu()
00739                     self.RefreshMainMenuRefreshMainMenu()
00740                     message = wxMessageDialog(self, "Import successful", "Information", wxOK|wxICON_INFORMATION)
00741                     message.ShowModal()
00742                     message.Destroy()
00743                 else:
00744                     message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
00745                     message.ShowModal()
00746                     message.Destroy()
00747             else:
00748                 message = wxMessageDialog(self, "\"%s\" is not a valid file!"%filepath, "Error", wxOK|wxICON_ERROR)
00749                 message.ShowModal()
00750                 message.Destroy()
00751         dialog.Destroy()
00752         event.Skip()
00753 
00754 
00755     def OnExportEDSMenu(self, event):
00756         dialog = wxFileDialog(self, "Choose a file", os.getcwd(), self.ManagerManager.GetCurrentNodeInfos()[0], "EDS files (*.eds)|*.eds|All files|*.*", wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR)
00757         if dialog.ShowModal() == wxID_OK:
00758             filepath = dialog.GetPath()
00759             if os.path.isdir(os.path.dirname(filepath)):
00760                 path, extend = os.path.splitext(filepath)
00761                 if extend in ("", "."):
00762                     filepath = path + ".eds"
00763                 result = self.ManagerManager.ExportCurrentToEDSFile(filepath)
00764                 if not result:
00765                     message = wxMessageDialog(self, "Export successful", "Information", wxOK|wxICON_INFORMATION)
00766                     message.ShowModal()
00767                     message.Destroy()
00768                 else:
00769                     message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
00770                     message.ShowModal()
00771                     message.Destroy()
00772             else:
00773                 message = wxMessageDialog(self, "\"%s\" is not a valid folder!"%os.path.dirname(filepath), "Error", wxOK|wxICON_ERROR)
00774                 message.ShowModal()
00775                 message.Destroy()
00776         dialog.Destroy()
00777         event.Skip()
00778 
00779     def OnExportCMenu(self, event):
00780         dialog = wxFileDialog(self, "Choose a file", os.getcwd(), self.ManagerManager.GetCurrentNodeInfos()[0],  "CANFestival OD files (*.c)|*.c|All files|*.*", wxSAVE|wxOVERWRITE_PROMPT|wxCHANGE_DIR)
00781         if dialog.ShowModal() == wxID_OK:
00782             filepath = dialog.GetPath()
00783             if os.path.isdir(os.path.dirname(filepath)):
00784                 path, extend = os.path.splitext(filepath)
00785                 if extend in ("", "."):
00786                     filepath = path + ".c"
00787                 result = self.ManagerManager.ExportCurrentToCFile(filepath)
00788                 if not result:
00789                     message = wxMessageDialog(self, "Export successful", "Information", wxOK|wxICON_INFORMATION)
00790                     message.ShowModal()
00791                     message.Destroy()
00792                 else:
00793                     message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
00794                     message.ShowModal()
00795                     message.Destroy()
00796             else:
00797                 message = wxMessageDialog(self, "\"%s\" is not a valid folder!"%os.path.dirname(filepath), "Error", wxOK|wxICON_ERROR)
00798                 message.ShowModal()
00799                 message.Destroy()
00800         dialog.Destroy()
00801         event.Skip()
00802 
00803 #-------------------------------------------------------------------------------
00804 #                          Editing Profiles functions
00805 #-------------------------------------------------------------------------------
00806 
00807     def OnCommunicationMenu(self, event):
00808         dictionary,current = self.ManagerManager.GetCurrentCommunicationLists()
00809         self.EditProfileEditProfile("Edit DS-301 Profile", dictionary, current)
00810         event.Skip()
00811     
00812     def OnOtherCommunicationMenu(self, event):
00813         dictionary,current = self.ManagerManager.GetCurrentDS302Lists()
00814         self.EditProfileEditProfile("Edit DS-301 Profile", dictionary, current)
00815         event.Skip()
00816     
00817     def OnEditProfileMenu(self, event):
00818         title = "Edit %s Profile"%self.ManagerManager.GetCurrentProfileName()
00819         dictionary,current = self.ManagerManager.GetCurrentProfileLists()
00820         self.EditProfileEditProfile(title, dictionary, current)
00821         event.Skip()
00822     
00823     def EditProfile(self, title, dictionary, current):
00824         dialog = CommunicationDialog(self)
00825         dialog.SetTitle(title)
00826         dialog.SetIndexDictionary(dictionary)
00827         dialog.SetCurrentList(current)
00828         dialog.RefreshLists()
00829         if dialog.ShowModal() == wxID_OK:
00830             new_profile = dialog.GetCurrentList()
00831             addinglist = []
00832             removinglist = []
00833             for index in new_profile:
00834                 if index not in current:
00835                     addinglist.append(index)
00836             for index in current:
00837                 if index not in new_profile:
00838                     removinglist.append(index)
00839             self.ManagerManager.ManageEntriesOfCurrent(addinglist, removinglist)
00840             self.ManagerManager.GenerateMapList()
00841             self.ManagerManager.BufferCurrentNode()
00842             self.RefreshBufferStateRefreshBufferState()
00843             self.RefreshCurrentIndexListRefreshCurrentIndexList()
00844         dialog.Destroy()
00845 
00846     def GetProfileCallBack(self, text):
00847         def ProfileCallBack(event):
00848             self.ManagerManager.AddSpecificEntryToCurrent(text)
00849             self.RefreshBufferStateRefreshBufferState()
00850             self.RefreshCurrentIndexListRefreshCurrentIndexList()
00851             event.Skip()
00852         return ProfileCallBack
00853 
00854 #-------------------------------------------------------------------------------
00855 #                         Edit Node informations function
00856 #-------------------------------------------------------------------------------
00857 
00858     def OnNodeInfosMenu(self, event):
00859         dialog = NodeInfosDialog(self)
00860         name, id, type, description = self.ManagerManager.GetCurrentNodeInfos()
00861         dialog.SetValues(name, id, type, description)
00862         if dialog.ShowModal() == wxID_OK:
00863             name, id, type, description = dialog.GetValues()
00864             self.ManagerManager.SetCurrentNodeInfos(name, id, type, description)
00865             self.RefreshBufferStateRefreshBufferState()
00866             self.RefreshProfileMenuRefreshProfileMenu()
00867             selected = self.FileOpened.GetSelection()
00868             if selected >= 0:
00869                 window = self.FileOpened.GetPage(selected)
00870                 window.RefreshTable()
00871         event.Skip()
00872 
00873 
00874 #-------------------------------------------------------------------------------
00875 #                           Add User Types and Variables
00876 #-------------------------------------------------------------------------------
00877         
00878     def AddMapVariable(self):
00879         index = self.ManagerManager.GetCurrentNextMapIndex()
00880         if index:
00881             dialog = MapVariableDialog(self)
00882             dialog.SetIndex(index)
00883             if dialog.ShowModal() == wxID_OK:
00884                 index, name, struct, number = dialog.GetValues()
00885                 result = self.ManagerManager.AddMapVariableToCurrent(index, name, struct, number)
00886                 if type(result) != StringType:
00887                     self.RefreshBufferStateRefreshBufferState()
00888                     self.RefreshCurrentIndexListRefreshCurrentIndexList()
00889                 else:
00890                     message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
00891                     message.ShowModal()
00892                     message.Destroy()
00893             dialog.Destroy()
00894         else:
00895             message = wxMessageDialog(self, result, "No map variable index left!", wxOK|wxICON_ERROR)
00896             message.ShowModal()
00897             message.Destroy()
00898         
00899     def AddUserType(self):
00900         dialog = UserTypeDialog(self)
00901         dialog.SetTypeList(self.ManagerManager.GetCustomisableTypes())
00902         if dialog.ShowModal() == wxID_OK:
00903             type, min, max, length = dialog.GetValues()
00904             result = self.ManagerManager.AddUserTypeToCurrent(type, min, max, length)
00905             if not result:
00906                 self.RefreshBufferStateRefreshBufferState()
00907                 self.RefreshCurrentIndexListRefreshCurrentIndexList()
00908             else:
00909                 message = wxMessageDialog(self, result, "Error", wxOK|wxICON_ERROR)
00910                 message.ShowModal()
00911                 message.Destroy()
00912         dialog.Destroy()
00913     
00914 
00915 #-------------------------------------------------------------------------------
00916 #                               Exception Handler
00917 #-------------------------------------------------------------------------------
00918 
00919 Max_Traceback_List_Size = 20
00920 
00921 def Display_Exception_Dialog(e_type,e_value,e_tb):
00922     trcbck_lst = []
00923     for i,line in enumerate(traceback.extract_tb(e_tb)):
00924         trcbck = " " + str(i+1) + ". "
00925         if line[0].find(os.getcwd()) == -1:
00926             trcbck += "file : " + str(line[0]) + ",   "
00927         else:
00928             trcbck += "file : " + str(line[0][len(os.getcwd()):]) + ",   "
00929         trcbck += "line : " + str(line[1]) + ",   " + "function : " + str(line[2])
00930         trcbck_lst.append(trcbck)
00931         
00932     # Allow clicking....
00933     cap = wx.Window_GetCapture()
00934     if cap:
00935         cap.ReleaseMouse()
00936 
00937     dlg = wx.SingleChoiceDialog(None, 
00938         """
00939 An error happens.
00940 
00941 Click on OK for saving an error report.
00942 
00943 Please contact LOLITech at:
00944 +33 (0)3 29 52 95 67
00945 bugs_objdictedit@lolitech.fr
00946 
00947 
00948 Error:
00949 """ +
00950         str(e_type) + " : " + str(e_value), 
00951         "Error",
00952         trcbck_lst)
00953     try:
00954         res = (dlg.ShowModal() == wx.ID_OK)
00955     finally:
00956         dlg.Destroy()
00957 
00958     return res
00959 
00960 def Display_Error_Dialog(e_value):
00961     message = wxMessageDialog(None, str(e_value), "Error", wxOK|wxICON_ERROR)
00962     message.ShowModal()
00963     message.Destroy()
00964 
00965 def get_last_traceback(tb):
00966     while tb.tb_next:
00967         tb = tb.tb_next
00968     return tb
00969 
00970 
00971 def format_namespace(d, indent='    '):
00972     return '\n'.join(['%s%s: %s' % (indent, k, repr(v)[:10000]) for k, v in d.iteritems()])
00973 
00974 
00975 ignored_exceptions = [] # a problem with a line in a module is only reported once per session
00976 
00977 def wxAddExceptHook(path, app_version='[No version]'):#, ignored_exceptions=[]):
00978     
00979     def handle_exception(e_type, e_value, e_traceback):
00980         traceback.print_exception(e_type, e_value, e_traceback) # this is very helpful when there's an exception in the rest of this func
00981         last_tb = get_last_traceback(e_traceback)
00982         ex = (last_tb.tb_frame.f_code.co_filename, last_tb.tb_frame.f_lineno)
00983         if str(e_value).startswith("!!!"):
00984             Display_Error_Dialog(e_value)
00985         elif ex not in ignored_exceptions:
00986             ignored_exceptions.append(ex)
00987             result = Display_Exception_Dialog(e_type,e_value,e_traceback)
00988             if result:
00989                 info = {
00990                     'app-title' : wx.GetApp().GetAppName(), # app_title
00991                     'app-version' : app_version,
00992                     'wx-version' : wx.VERSION_STRING,
00993                     'wx-platform' : wx.Platform,
00994                     'python-version' : platform.python_version(), #sys.version.split()[0],
00995                     'platform' : platform.platform(),
00996                     'e-type' : e_type,
00997                     'e-value' : e_value,
00998                     'date' : time.ctime(),
00999                     'cwd' : os.getcwd(),
01000                     }
01001                 if e_traceback:
01002                     info['traceback'] = ''.join(traceback.format_tb(e_traceback)) + '%s: %s' % (e_type, e_value)
01003                     last_tb = get_last_traceback(e_traceback)
01004                     exception_locals = last_tb.tb_frame.f_locals # the locals at the level of the stack trace where the exception actually occurred
01005                     info['locals'] = format_namespace(exception_locals)
01006                     if 'self' in exception_locals:
01007                         info['self'] = format_namespace(exception_locals['self'].__dict__)
01008                 
01009                 output = open(path+os.sep+"bug_report_"+info['date'].replace(':','-').replace(' ','_')+".txt",'w')
01010                 lst = info.keys()
01011                 lst.sort()
01012                 for a in lst:
01013                     output.write(a+":\n"+str(info[a])+"\n\n")
01014 
01015     #sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args)
01016     sys.excepthook = handle_exception
01017 
01018 if __name__ == '__main__':
01019     app = wxPySimpleApp()
01020     wxInitAllImageHandlers()
01021     
01022     # Install a exception handle for bug reports
01023     wxAddExceptHook(os.getcwd(),__version__)
01024     
01025     frame = objdictedit(None)
01026 
01027     frame.Show()
01028     app.MainLoop()

Generated on Mon Jun 4 16:29:06 2007 for CanFestival by  doxygen 1.5.1