]> rtime.felk.cvut.cz Git - CanFestival-3.git/blobdiff - objdictgen/objdictedit.py
Some instance type test improved
[CanFestival-3.git] / objdictgen / objdictedit.py
index f9e44b3db51afe601ffb819ee0ba649510a9b7e5..60cded33710b3c86a859507d26ca479fe732df8a 100755 (executable)
@@ -26,7 +26,7 @@ import wx
 from types import *
 import os, re, platform, sys, time, traceback, getopt
 
-__version__ = "$Revision: 1.28 $"
+__version__ = "$Revision: 1.45 $"
 
 from node import OD_Subindex, OD_MultipleSubindexes, OD_IdenticalSubindexes, OD_IdenticalIndexes
 
@@ -105,174 +105,134 @@ try:
 except:
     Html_Window = False
 
-def create(parent):
-    return objdictedit(parent)
-
-def usage():
-    print "\nUsage of objdictedit.py :"
-    print "\n   %s [Filepath, ...]\n"%sys.argv[0]
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
-except getopt.GetoptError:
-    # print help information and exit:
-    usage()
-    sys.exit(2)
-
-for o, a in opts:
-    if o in ("-h", "--help"):
-        usage()
-        sys.exit()
-
-filesOpen = args
-ScriptDirectory = os.path.split(__file__)[0]
-
+ScriptDirectory = os.path.split(os.path.realpath(__file__))[0]
 
 [ID_OBJDICTEDIT, ID_OBJDICTEDITFILEOPENED, 
  ID_OBJDICTEDITHELPBAR,
 ] = [wx.NewId() for _init_ctrls in range(3)]
 
-[ID_OBJDICTEDITADDMENUITEMS0, ID_OBJDICTEDITADDMENUITEMS1, 
- ID_OBJDICTEDITADDMENUITEMS2, ID_OBJDICTEDITADDMENUITEMS3, 
- ID_OBJDICTEDITADDMENUITEMS4, ID_OBJDICTEDITADDMENUITEMS5, 
-] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)]
-
-[ID_OBJDICTEDITFILEMENUITEMS0, ID_OBJDICTEDITFILEMENUITEMS1, 
- ID_OBJDICTEDITFILEMENUITEMS2, ID_OBJDICTEDITFILEMENUITEMS4, 
- ID_OBJDICTEDITFILEMENUITEMS5, ID_OBJDICTEDITFILEMENUITEMS6, 
- ID_OBJDICTEDITFILEMENUITEMS7, ID_OBJDICTEDITFILEMENUITEMS8,
- ID_OBJDICTEDITFILEMENUITEMS9,
-] = [wx.NewId() for _init_coll_FileMenu_Items in range(9)]
+[ID_OBJDICTEDITFILEMENUIMPORTEDS, ID_OBJDICTEDITFILEMENUEXPORTEDS, 
+ ID_OBJDICTEDITFILEMENUEXPORTC,
+] = [wx.NewId() for _init_coll_FileMenu_Items in range(3)]
 
-[ID_OBJDICTEDITEDITMENUITEMS0, ID_OBJDICTEDITEDITMENUITEMS1, 
- ID_OBJDICTEDITEDITMENUITEMS2, ID_OBJDICTEDITEDITMENUITEMS4, 
- ID_OBJDICTEDITEDITMENUITEMS6, ID_OBJDICTEDITEDITMENUITEMS7, 
- ID_OBJDICTEDITEDITMENUITEMS8, 
-] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)]
+[ID_OBJDICTEDITEDITMENUNODEINFOS, ID_OBJDICTEDITEDITMENUDS301PROFILE, 
+ ID_OBJDICTEDITEDITMENUDS302PROFILE, ID_OBJDICTEDITEDITMENUOTHERPROFILE, 
+] = [wx.NewId() for _init_coll_EditMenu_Items in range(4)]
 
-[ID_OBJDICTEDITHELPMENUITEMS0, ID_OBJDICTEDITHELPMENUITEMS1,
- ID_OBJDICTEDITHELPMENUITEMS2,
-] = [wx.NewId() for _init_coll_HelpMenu_Items in range(3)]
+[ID_OBJDICTEDITADDMENUSDOSERVER, ID_OBJDICTEDITADDMENUSDOCLIENT, 
+ ID_OBJDICTEDITADDMENUPDOTRANSMIT, ID_OBJDICTEDITADDMENUPDORECEIVE, 
+ ID_OBJDICTEDITADDMENUMAPVARIABLE, ID_OBJDICTEDITADDMENUUSERTYPE, 
+] = [wx.NewId() for _init_coll_AddMenu_Items in range(6)]
 
 class objdictedit(wx.Frame):
-    def _init_coll_menuBar1_Menus(self, parent):
-        parent.Append(menu=self.FileMenu, title='File')
+    def _init_coll_MenuBar_Menus(self, parent):
+        if self.ModeSolo:
+            parent.Append(menu=self.FileMenu, title='File')
         parent.Append(menu=self.EditMenu, title='Edit')
         parent.Append(menu=self.AddMenu, title='Add')
         parent.Append(menu=self.HelpMenu, title='Help')
 
-    def _init_coll_EditMenu_Items(self, parent):
-        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUITEMS4,
-              kind=wx.ITEM_NORMAL, text='Refresh\tCTRL+R')
-        parent.AppendSeparator()
-        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUITEMS1,
-              kind=wx.ITEM_NORMAL, text='Undo\tCTRL+Z')
-        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUITEMS0,
-              kind=wx.ITEM_NORMAL, text='Redo\tCTRL+Y')
-        parent.AppendSeparator()
-        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUITEMS6,
-              kind=wx.ITEM_NORMAL, text='Node infos')
-        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUITEMS2,
-              kind=wx.ITEM_NORMAL, text='DS-301 Profile')
-        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUITEMS8,
-              kind=wx.ITEM_NORMAL, text='DS-302 Profile')
-        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUITEMS7,
-              kind=wx.ITEM_NORMAL, text='Other Profile')
-        self.Bind(wx.EVT_MENU, self.OnUndoMenu,
-              id=ID_OBJDICTEDITEDITMENUITEMS1)
-        self.Bind(wx.EVT_MENU, self.OnRedoMenu,
-              id=ID_OBJDICTEDITEDITMENUITEMS0)
-        self.Bind(wx.EVT_MENU, self.OnCommunicationMenu,
-              id=ID_OBJDICTEDITEDITMENUITEMS2)
-        self.Bind(wx.EVT_MENU, self.OnRefreshMenu,
-              id=ID_OBJDICTEDITEDITMENUITEMS4)
-        self.Bind(wx.EVT_MENU, self.OnNodeInfosMenu,
-              id=ID_OBJDICTEDITEDITMENUITEMS6)
-        self.Bind(wx.EVT_MENU, self.OnEditProfileMenu,
-              id=ID_OBJDICTEDITEDITMENUITEMS7)
-        self.Bind(wx.EVT_MENU, self.OnOtherCommunicationMenu,
-              id=ID_OBJDICTEDITEDITMENUITEMS8)
-
-    def _init_coll_HelpMenu_Items(self, parent):
-        parent.Append(help='', id=ID_OBJDICTEDITHELPMENUITEMS0,
-              kind=wx.ITEM_NORMAL, text='DS-301 Standard\tF1')
-        self.Bind(wx.EVT_MENU, self.OnHelpDS301Menu,
-              id=ID_OBJDICTEDITHELPMENUITEMS0)
-        parent.Append(help='', id=ID_OBJDICTEDITHELPMENUITEMS1,
-              kind=wx.ITEM_NORMAL, text='CAN Festival Docs\tF2')
-        self.Bind(wx.EVT_MENU, self.OnHelpCANFestivalMenu,
-              id=ID_OBJDICTEDITHELPMENUITEMS1)
-        if Html_Window:
-            parent.Append(help='', id=ID_OBJDICTEDITHELPMENUITEMS2,
-                  kind=wx.ITEM_NORMAL, text='About')
-            self.Bind(wx.EVT_MENU, self.OnAboutMenu,
-                  id=ID_OBJDICTEDITHELPMENUITEMS2)
-
     def _init_coll_FileMenu_Items(self, parent):
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS5,
+        parent.Append(help='', id=wx.ID_NEW,
               kind=wx.ITEM_NORMAL, text='New\tCTRL+N')
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS0,
+        parent.Append(help='', id=wx.ID_OPEN,
               kind=wx.ITEM_NORMAL, text='Open\tCTRL+O')
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS1,
+        parent.Append(help='', id=wx.ID_CLOSE,
+              kind=wx.ITEM_NORMAL, text='Close\tCTRL+W')
+        parent.AppendSeparator()
+        parent.Append(help='', id=wx.ID_SAVE,
               kind=wx.ITEM_NORMAL, text='Save\tCTRL+S')
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS6,
+        parent.Append(help='', id=wx.ID_SAVEAS,
               kind=wx.ITEM_NORMAL, text='Save As...\tALT+S')
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS2,
-              kind=wx.ITEM_NORMAL, text='Close\tCTRL+W')
         parent.AppendSeparator()
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS7,
+        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUIMPORTEDS,
               kind=wx.ITEM_NORMAL, text='Import EDS file')
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS9,
+        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUEXPORTEDS,
               kind=wx.ITEM_NORMAL, text='Export to EDS file')
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS8,
+        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUEXPORTC,
               kind=wx.ITEM_NORMAL, text='Build Dictionary\tCTRL+B')
         parent.AppendSeparator()
-        parent.Append(help='', id=ID_OBJDICTEDITFILEMENUITEMS4,
+        parent.Append(help='', id=wx.ID_EXIT,
               kind=wx.ITEM_NORMAL, text='Exit')
-        self.Bind(wx.EVT_MENU, self.OnOpenMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS0)
-        self.Bind(wx.EVT_MENU, self.OnSaveMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS1)
-        self.Bind(wx.EVT_MENU, self.OnCloseMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS2)
-        self.Bind(wx.EVT_MENU, self.OnQuitMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS4)
-        self.Bind(wx.EVT_MENU, self.OnNewMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS5)
-        self.Bind(wx.EVT_MENU, self.OnSaveAsMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS6)
+        self.Bind(wx.EVT_MENU, self.OnNewMenu, id=wx.ID_NEW)
+        self.Bind(wx.EVT_MENU, self.OnOpenMenu, id=wx.ID_OPEN)
+        self.Bind(wx.EVT_MENU, self.OnCloseMenu, id=wx.ID_CLOSE)
+        self.Bind(wx.EVT_MENU, self.OnSaveMenu, id=wx.ID_SAVE)
+        self.Bind(wx.EVT_MENU, self.OnSaveAsMenu, id=wx.ID_SAVEAS)
         self.Bind(wx.EVT_MENU, self.OnImportEDSMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS7)
-        self.Bind(wx.EVT_MENU, self.OnExportCMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS8)
+              id=ID_OBJDICTEDITFILEMENUIMPORTEDS)
         self.Bind(wx.EVT_MENU, self.OnExportEDSMenu,
-              id=ID_OBJDICTEDITFILEMENUITEMS9)
+              id=ID_OBJDICTEDITFILEMENUEXPORTEDS)
+        self.Bind(wx.EVT_MENU, self.OnExportCMenu,
+              id=ID_OBJDICTEDITFILEMENUEXPORTC)
+        self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_EXIT)
+
+    def _init_coll_EditMenu_Items(self, parent):
+        parent.Append(help='', id=wx.ID_REFRESH,
+              kind=wx.ITEM_NORMAL, text='Refresh\tCTRL+R')
+        parent.AppendSeparator()
+        parent.Append(help='', id=wx.ID_UNDO,
+              kind=wx.ITEM_NORMAL, text='Undo\tCTRL+Z')
+        parent.Append(help='', id=wx.ID_REDO,
+              kind=wx.ITEM_NORMAL, text='Redo\tCTRL+Y')
+        parent.AppendSeparator()
+        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUNODEINFOS,
+              kind=wx.ITEM_NORMAL, text='Node infos')
+        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUDS301PROFILE,
+              kind=wx.ITEM_NORMAL, text='DS-301 Profile')
+        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUDS302PROFILE,
+              kind=wx.ITEM_NORMAL, text='DS-302 Profile')
+        parent.Append(help='', id=ID_OBJDICTEDITEDITMENUOTHERPROFILE,
+              kind=wx.ITEM_NORMAL, text='Other Profile')
+        self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
+        self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
+        self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
+        self.Bind(wx.EVT_MENU, self.OnNodeInfosMenu,
+              id=ID_OBJDICTEDITEDITMENUNODEINFOS)
+        self.Bind(wx.EVT_MENU, self.OnCommunicationMenu,
+              id=ID_OBJDICTEDITEDITMENUDS301PROFILE)
+        self.Bind(wx.EVT_MENU, self.OnOtherCommunicationMenu,
+              id=ID_OBJDICTEDITEDITMENUDS302PROFILE)
+        self.Bind(wx.EVT_MENU, self.OnEditProfileMenu,
+              id=ID_OBJDICTEDITEDITMENUOTHERPROFILE)
 
     def _init_coll_AddMenu_Items(self, parent):
-        parent.Append(help='', id=ID_OBJDICTEDITADDMENUITEMS0,
+        parent.Append(help='', id=ID_OBJDICTEDITADDMENUSDOSERVER,
               kind=wx.ITEM_NORMAL, text='SDO Server')
-        parent.Append(help='', id=ID_OBJDICTEDITADDMENUITEMS1,
+        parent.Append(help='', id=ID_OBJDICTEDITADDMENUSDOCLIENT,
               kind=wx.ITEM_NORMAL, text='SDO Client')
-        parent.Append(help='', id=ID_OBJDICTEDITADDMENUITEMS2,
+        parent.Append(help='', id=ID_OBJDICTEDITADDMENUPDOTRANSMIT,
               kind=wx.ITEM_NORMAL, text='PDO Transmit')
-        parent.Append(help='', id=ID_OBJDICTEDITADDMENUITEMS3,
+        parent.Append(help='', id=ID_OBJDICTEDITADDMENUPDORECEIVE,
               kind=wx.ITEM_NORMAL, text='PDO Receive')
-        parent.Append(help='', id=ID_OBJDICTEDITADDMENUITEMS4,
+        parent.Append(help='', id=ID_OBJDICTEDITADDMENUMAPVARIABLE,
               kind=wx.ITEM_NORMAL, text='Map Variable')
-        parent.Append(help='', id=ID_OBJDICTEDITADDMENUITEMS5,
+        parent.Append(help='', id=ID_OBJDICTEDITADDMENUUSERTYPE,
               kind=wx.ITEM_NORMAL, text='User Type')
         self.Bind(wx.EVT_MENU, self.OnAddSDOServerMenu,
-              id=ID_OBJDICTEDITADDMENUITEMS0)
+              id=ID_OBJDICTEDITADDMENUSDOSERVER)
         self.Bind(wx.EVT_MENU, self.OnAddSDOClientMenu,
-              id=ID_OBJDICTEDITADDMENUITEMS1)
+              id=ID_OBJDICTEDITADDMENUSDOCLIENT)
         self.Bind(wx.EVT_MENU, self.OnAddPDOTransmitMenu,
-              id=ID_OBJDICTEDITADDMENUITEMS2)
+              id=ID_OBJDICTEDITADDMENUPDOTRANSMIT)
         self.Bind(wx.EVT_MENU, self.OnAddPDOReceiveMenu,
-              id=ID_OBJDICTEDITADDMENUITEMS3)
+              id=ID_OBJDICTEDITADDMENUPDORECEIVE)
         self.Bind(wx.EVT_MENU, self.OnAddMapVariableMenu,
-              id=ID_OBJDICTEDITADDMENUITEMS4)
+              id=ID_OBJDICTEDITADDMENUMAPVARIABLE)
         self.Bind(wx.EVT_MENU, self.OnAddUserTypeMenu,
-              id=ID_OBJDICTEDITADDMENUITEMS5)
+              id=ID_OBJDICTEDITADDMENUUSERTYPE)
+
+    def _init_coll_HelpMenu_Items(self, parent):
+        parent.Append(help='', id=wx.ID_HELP,
+              kind=wx.ITEM_NORMAL, text='DS-301 Standard\tF1')
+        self.Bind(wx.EVT_MENU, self.OnHelpDS301Menu, id=wx.ID_HELP)
+        parent.Append(help='', id=wx.ID_HELP_CONTEXT,
+              kind=wx.ITEM_NORMAL, text='CAN Festival Docs\tF2')
+        self.Bind(wx.EVT_MENU, self.OnHelpCANFestivalMenu, id=wx.ID_HELP_CONTEXT)
+        if Html_Window and self.ModeSolo:
+            parent.Append(help='', id=wx.ID_ABOUT,
+                  kind=wx.ITEM_NORMAL, text='About')
+            self.Bind(wx.EVT_MENU, self.OnAboutMenu, id=wx.ID_ABOUT)
 
     def _init_coll_HelpBar_Fields(self, parent):
         parent.SetFieldsCount(3)
@@ -284,16 +244,18 @@ class objdictedit(wx.Frame):
         parent.SetStatusWidths([100, 110, -1])
 
     def _init_utils(self):
-        self.menuBar1 = wx.MenuBar()
-        self.menuBar1.SetEvtHandlerEnabled(True)
+        self.MenuBar = wx.MenuBar()
+        self.MenuBar.SetEvtHandlerEnabled(True)
 
-        self.FileMenu = wx.Menu(title='')
+        if self.ModeSolo:
+            self.FileMenu = wx.Menu(title='')
         self.EditMenu = wx.Menu(title='')
         self.AddMenu = wx.Menu(title='')
         self.HelpMenu = wx.Menu(title='')
 
-        self._init_coll_menuBar1_Menus(self.menuBar1)
-        self._init_coll_FileMenu_Items(self.FileMenu)
+        self._init_coll_MenuBar_Menus(self.MenuBar)
+        if self.ModeSolo:
+            self._init_coll_FileMenu_Items(self.FileMenu)
         self._init_coll_EditMenu_Items(self.EditMenu)
         self._init_coll_AddMenu_Items(self.AddMenu)
         self._init_coll_HelpMenu_Items(self.HelpMenu)
@@ -304,8 +266,12 @@ class objdictedit(wx.Frame):
               style=wx.DEFAULT_FRAME_STYLE, title='Objdictedit')
         self._init_utils()
         self.SetClientSize(wx.Size(1000, 700))
-        self.SetMenuBar(self.menuBar1)
+        self.SetMenuBar(self.MenuBar)
         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
+        if not self.ModeSolo:
+            self.Bind(wx.EVT_MENU, self.OnSaveMenu, id=wx.ID_SAVE)
+            accel = wx.AcceleratorTable([wx.AcceleratorEntry(wx.ACCEL_CTRL, 83, wx.ID_SAVE)])
+            self.SetAcceleratorTable(accel)
 
         self.FileOpened = wx.Notebook(id=ID_OBJDICTEDITFILEOPENED,
               name='FileOpened', parent=self, pos=wx.Point(0, 0),
@@ -318,34 +284,55 @@ class objdictedit(wx.Frame):
         self._init_coll_HelpBar_Fields(self.HelpBar)
         self.SetStatusBar(self.HelpBar)
 
-    def __init__(self, parent):
+    def __init__(self, parent, manager = None, filesOpen = []):
+        self.ModeSolo = manager == None
         self._init_ctrls(parent)
         self.HtmlFrameOpened = []
-        self.ModeSolo = True
+        self.BusId = None
+        self.Closing = False
         
-        self.Manager = NodeManager()
-        for filepath in filesOpen:
-            result = self.Manager.OpenFileInCurrent(filepath)
-            if type(result) == IntType:
-                new_editingpanel = EditingPanel(self, self.Manager)
-                new_editingpanel.SetIndex(result)
+        icon = wx.Icon(os.path.join(ScriptDirectory,"networkedit.ico"),wx.BITMAP_TYPE_ICO)
+        self.SetIcon(icon)
+        
+        if self.ModeSolo:
+            self.Manager = NodeManager()
+            for filepath in filesOpen:
+                result = self.Manager.OpenFileInCurrent(filepath)
+                if isinstance(result, (IntType, LongType)):
+                    new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
+                    new_editingpanel.SetIndex(result)
+                    self.FileOpened.AddPage(new_editingpanel, "")
+        else:
+            self.Manager = manager
+            for index in self.Manager.GetBufferIndexes():
+                new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
+                new_editingpanel.SetIndex(index)
                 self.FileOpened.AddPage(new_editingpanel, "")
+        
+        if self.Manager.GetBufferNumber() > 0:
             window = self.FileOpened.GetPage(0)
             if window:
                 self.Manager.ChangeCurrentNode(window.GetIndex())
                 self.FileOpened.SetSelection(0)
+        
         if self.Manager.CurrentDS302Defined():
-            self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS8, True)
+            self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUDS302PROFILE, True)
         else:
-            self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS8, False)
+            self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUDS302PROFILE, False)
         self.RefreshEditMenu()
         self.RefreshBufferState()
         self.RefreshProfileMenu()
         self.RefreshTitle()
         self.RefreshMainMenu()
 
-    def GetNoteBook(self):
-        return self.FileOpened
+    def SetBusId(self, bus_id):
+        self.BusId = bus_id
+
+    def GetBusId(self):
+        return self.BusId
+
+    def IsClosing(self):
+        return self.Closing
 
     def OnAddSDOServerMenu(self, event):
         self.Manager.AddSDOServerToCurrent()
@@ -380,15 +367,16 @@ class objdictedit(wx.Frame):
         event.Skip()
 
     def OnFileSelectedChanged(self, event):
-        selected = event.GetSelection()
-        # At init selected = -1
-        if selected >= 0:
-            window = self.FileOpened.GetPage(selected)
-            if window:
-                self.Manager.ChangeCurrentNode(window.GetIndex())
-                self.RefreshBufferState()
-                self.RefreshStatusBar()
-                self.RefreshProfileMenu()
+        if not self.Closing:
+            selected = event.GetSelection()
+            # At init selected = -1
+            if selected >= 0:
+                window = self.FileOpened.GetPage(selected)
+                if window:
+                    self.Manager.ChangeCurrentNode(window.GetIndex())
+                    wx.CallAfter(self.RefreshBufferState)
+                    self.RefreshStatusBar()
+                    self.RefreshProfileMenu()
         event.Skip()
 
     def OnHelpDS301Menu(self, event):
@@ -401,13 +389,13 @@ class objdictedit(wx.Frame):
                 find_index = True
                 index, subIndex = result
                 result = OpenPDFDocIndex(index, ScriptDirectory)
-                if type(result) == StringType:
+                if isinstance(result, (StringType, UnicodeType)):
                     message = wx.MessageDialog(self, result, "ERROR", wx.OK|wx.ICON_ERROR)
                     message.ShowModal()
                     message.Destroy()
         if not find_index:
             result = OpenPDFDocIndex(None, ScriptDirectory)
-            if type(result) == StringType:
+            if isinstance(result, (StringType, UnicodeType)):
                 message = wx.MessageDialog(self, result, "ERROR", wx.OK|wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
@@ -415,7 +403,13 @@ class objdictedit(wx.Frame):
         
     def OnHelpCANFestivalMenu(self, event):
         #self.OpenHtmlFrame("CAN Festival Reference", os.path.join(ScriptDirectory, "doc/canfestival.html"), wx.Size(1000, 600))
-        os.system("xpdf -remote CANFESTIVAL %s %d &"%(os.path.join(ScriptDirectory, "doc/manual_en.pdf"),16))
+        if wx.Platform == '__WXMSW__':
+            readerpath = get_acroversion()
+            readerexepath = os.path.join(readerpath,"AcroRd32.exe")
+            if(os.path.isfile(readerexepath)):
+                os.spawnl(os.P_DETACH, readerexepath, "AcroRd32.exe", '"%s"'%os.path.join(ScriptDirectory, "doc","manual_en.pdf"))
+        else:
+            os.system("xpdf -remote CANFESTIVAL %s %d &"%(os.path.join(ScriptDirectory, "doc/manual_en.pdf"),16))
         event.Skip()
 
     def OnAboutMenu(self, event):
@@ -436,15 +430,17 @@ class objdictedit(wx.Frame):
         event.Skip()
     
     def OnCloseFrame(self, event):
-        if self.Manager.OneFileHasChanged():
+        self.Closing = True
+        if not self.ModeSolo:
+            if getattr(self, "_onclose", None) != None:
+                self._onclose()
+            event.Skip()
+        elif self.Manager.OneFileHasChanged():
             dialog = wx.MessageDialog(self, "There are changes, do you want to save?",  "Close Application", wx.YES_NO|wx.CANCEL|wx.ICON_QUESTION)
             answer = dialog.ShowModal()
             dialog.Destroy()
             if answer == wx.ID_YES:
-                self.Manager.ChangeCurrentNode(0)
-                for i in xrange(self.FileOpened.GetPageCount()):
-                    window = self.FileOpened.GetPage(i)
-                    self.Manager.ChangeCurrentNode(window.GetIndex())
+                for i in xrange(self.Manager.GetBufferNumber()):
                     if self.Manager.CurrentIsSaved():
                         self.Manager.CloseCurrent()
                     else:
@@ -452,10 +448,9 @@ class objdictedit(wx.Frame):
                         self.Manager.CloseCurrent(True)
                 event.Skip()
             elif answer == wx.ID_NO:
-                for i in xrange(self.FileOpened.GetPageCount()):
-                    self.Manager.CloseCurrent(True)
-                wx.CallAfter(self.Close)
                 event.Skip()
+            else:
+                event.Veto()
         else:
             event.Skip()
 
@@ -479,87 +474,91 @@ class objdictedit(wx.Frame):
         window.RefreshIndexList()
 
     def RefreshStatusBar(self):
-        if self.HelpBar:
-            selected = self.FileOpened.GetSelection()
-            if selected >= 0:
-                window = self.FileOpened.GetPage(selected)
-                selection = window.GetSelection()
-                if selection:
-                    index, subIndex = selection
-                    if self.Manager.IsCurrentEntry(index):
-                        self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0)
-                        self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1)
-                        entryinfos = self.Manager.GetEntryInfos(index)
-                        name = entryinfos["name"]
-                        category = "Optional"
-                        if entryinfos["need"]:
-                            category = "Mandatory"
-                        struct = "VAR"
-                        number = ""
-                        if entryinfos["struct"] & OD_IdenticalIndexes:
-                            number = " possibly defined %d times"%entryinfos["nbmax"]
-                        if entryinfos["struct"] & OD_IdenticalSubindexes:
-                            struct = "REC"
-                        elif entryinfos["struct"] & OD_MultipleSubindexes:
-                            struct = "ARRAY"
-                        text = "%s: %s entry of struct %s%s."%(name,category,struct,number)
-                        self.HelpBar.SetStatusText(text, 2)
-                    else:
-                        for i in xrange(3):
-                            self.HelpBar.SetStatusText("", i)
+        selected = self.FileOpened.GetSelection()
+        if selected >= 0:
+            window = self.FileOpened.GetPage(selected)
+            selection = window.GetSelection()
+            if selection:
+                index, subIndex = selection
+                if self.Manager.IsCurrentEntry(index):
+                    self.HelpBar.SetStatusText("Index: 0x%04X"%index, 0)
+                    self.HelpBar.SetStatusText("Subindex: 0x%02X"%subIndex, 1)
+                    entryinfos = self.Manager.GetEntryInfos(index)
+                    name = entryinfos["name"]
+                    category = "Optional"
+                    if entryinfos["need"]:
+                        category = "Mandatory"
+                    struct = "VAR"
+                    number = ""
+                    if entryinfos["struct"] & OD_IdenticalIndexes:
+                        number = " possibly defined %d times"%entryinfos["nbmax"]
+                    if entryinfos["struct"] & OD_IdenticalSubindexes:
+                        struct = "REC"
+                    elif entryinfos["struct"] & OD_MultipleSubindexes:
+                        struct = "ARRAY"
+                    text = "%s: %s entry of struct %s%s."%(name,category,struct,number)
+                    self.HelpBar.SetStatusText(text, 2)
                 else:
                     for i in xrange(3):
                         self.HelpBar.SetStatusText("", i)
+            else:
+                for i in xrange(3):
+                    self.HelpBar.SetStatusText("", i)
 
     def RefreshMainMenu(self):
-        if self.FileMenu:
-            if self.FileOpened.GetPageCount() > 0:
-                self.menuBar1.EnableTop(1, True)
-                self.menuBar1.EnableTop(2, True)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS1, True)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS2, True)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS6, True)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS8, True)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS9, True)
+        if self.FileOpened.GetPageCount() > 0:
+            if self.ModeSolo:
+                self.MenuBar.EnableTop(1, True)
+                self.MenuBar.EnableTop(2, True)
+                self.FileMenu.Enable(wx.ID_CLOSE, True)
+                self.FileMenu.Enable(wx.ID_SAVE, True)
+                self.FileMenu.Enable(wx.ID_SAVEAS, True)
+                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTEDS, True)
+                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTC, True)
+            else:
+                self.MenuBar.EnableTop(0, True)
+                self.MenuBar.EnableTop(1, True)
+        else:
+            if self.ModeSolo:
+                self.MenuBar.EnableTop(1, False)
+                self.MenuBar.EnableTop(2, False)
+                self.FileMenu.Enable(wx.ID_CLOSE, False)
+                self.FileMenu.Enable(wx.ID_SAVE, False)
+                self.FileMenu.Enable(wx.ID_SAVEAS, False)
+                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTEDS, False)
+                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUEXPORTC, False)
             else:
-                self.menuBar1.EnableTop(1, False)
-                self.menuBar1.EnableTop(2, False)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS1, False)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS2, False)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS6, False)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS8, False)
-                self.FileMenu.Enable(ID_OBJDICTEDITFILEMENUITEMS9, False)
+                self.MenuBar.EnableTop(0, False)
+                self.MenuBar.EnableTop(1, False)
 
     def RefreshEditMenu(self):
-        if self.FileMenu:
-            if self.FileOpened.GetPageCount() > 0:
-                undo, redo = self.Manager.GetCurrentBufferState()
-                self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS1, undo)
-                self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS0, redo)
-            else:
-                self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS1, False)
-                self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS0, False)
+        if self.FileOpened.GetPageCount() > 0:
+            undo, redo = self.Manager.GetCurrentBufferState()
+            self.EditMenu.Enable(wx.ID_UNDO, undo)
+            self.EditMenu.Enable(wx.ID_REDO, redo)
+        else:
+            self.EditMenu.Enable(wx.ID_UNDO, False)
+            self.EditMenu.Enable(wx.ID_REDO, False)
 
     def RefreshProfileMenu(self):
-        if self.EditMenu:
-            profile = self.Manager.GetCurrentProfileName()
-            edititem = self.EditMenu.FindItemById(ID_OBJDICTEDITEDITMENUITEMS7)
-            if edititem:
-                length = self.AddMenu.GetMenuItemCount()
-                for i in xrange(length-6):
-                    additem = self.AddMenu.FindItemByPosition(6)
-                    self.AddMenu.Delete(additem.GetId())
-                if profile not in ("None", "DS-301"):
-                    edititem.SetText("%s Profile"%profile)
-                    edititem.Enable(True)
-                    self.AddMenu.AppendSeparator()
-                    for text, indexes in self.Manager.GetCurrentSpecificMenu():
-                        new_id = wx.NewId()
-                        self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text)
-                        self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id)
-                else:
-                    edititem.SetText("Other Profile")
-                    edititem.Enable(False)
+        profile = self.Manager.GetCurrentProfileName()
+        edititem = self.EditMenu.FindItemById(ID_OBJDICTEDITEDITMENUOTHERPROFILE)
+        if edititem:
+            length = self.AddMenu.GetMenuItemCount()
+            for i in xrange(length-6):
+                additem = self.AddMenu.FindItemByPosition(6)
+                self.AddMenu.Delete(additem.GetId())
+            if profile not in ("None", "DS-301"):
+                edititem.SetText("%s Profile"%profile)
+                edititem.Enable(True)
+                self.AddMenu.AppendSeparator()
+                for text, indexes in self.Manager.GetCurrentSpecificMenu():
+                    new_id = wx.NewId()
+                    self.AddMenu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=text)
+                    self.Bind(wx.EVT_MENU, self.GetProfileCallBack(text), id=new_id)
+            else:
+                edititem.SetText("Other Profile")
+                edititem.Enable(False)
         
 
 #-------------------------------------------------------------------------------
@@ -599,14 +598,14 @@ class objdictedit(wx.Frame):
             NMT = dialog.GetNMTManagement()
             options = dialog.GetOptions()
             result = self.Manager.CreateNewNode(name, id, nodetype, description, profile, filepath, NMT, options)
-            if type(result) == IntType:
-                new_editingpanel = EditingPanel(self, self.Manager)
+            if isinstance(result, (IntType, LongType)):
+                new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
                 new_editingpanel.SetIndex(result)
                 self.FileOpened.AddPage(new_editingpanel, "")
                 self.FileOpened.SetSelection(self.FileOpened.GetPageCount() - 1)
-                self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS8, False)
+                self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUDS302PROFILE, False)
                 if "DS302" in options:
-                    self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS8, True)
+                    self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUDS302PROFILE, True)
                 self.RefreshBufferState()
                 self.RefreshProfileMenu()
                 self.RefreshMainMenu()
@@ -614,6 +613,7 @@ class objdictedit(wx.Frame):
                 message = wx.MessageDialog(self, result, "ERROR", wx.OK|wx.ICON_ERROR)
                 message.ShowModal()
                 message.Destroy()
+        dialog.Destroy()
         event.Skip()
 
     def OnOpenMenu(self, event):
@@ -627,28 +627,32 @@ class objdictedit(wx.Frame):
             filepath = dialog.GetPath()
             if os.path.isfile(filepath):
                 result = self.Manager.OpenFileInCurrent(filepath)
-                if type(result) == IntType:
-                    new_editingpanel = EditingPanel(self, self.Manager)
+                if isinstance(result, (IntType, LongType)):
+                    new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
                     new_editingpanel.SetIndex(result)
                     self.FileOpened.AddPage(new_editingpanel, "")
                     self.FileOpened.SetSelection(self.FileOpened.GetPageCount() - 1)
                     if self.Manager.CurrentDS302Defined(): 
-                        self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS8, True)
+                        self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUDS302PROFILE, True)
                     else:
-                        self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUITEMS8, False)
+                        self.EditMenu.Enable(ID_OBJDICTEDITEDITMENUDS302PROFILE, False)
                     self.RefreshEditMenu()
                     self.RefreshBufferState()
                     self.RefreshProfileMenu()
                     self.RefreshMainMenu()
                 else:
-                    message = wx.MessageDialog(self, e.args[0], "Error", wx.OK|wx.ICON_ERROR)
+                    message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
                     message.ShowModal()
                     message.Destroy()
         dialog.Destroy()
         event.Skip()
 
     def OnSaveMenu(self, event):
-        self.Save()
+        if not self.ModeSolo and getattr(self, "_onsave", None) != None:
+            self._onsave()
+            self.RefreshBufferState()
+        else:
+            self.Save()
         event.Skip()
     
     def OnSaveAsMenu(self, event):
@@ -659,7 +663,7 @@ class objdictedit(wx.Frame):
         result = self.Manager.SaveCurrentInFile()
         if not result:
             self.SaveAs()
-        elif type(result) != StringType:
+        elif not isinstance(result, (StringType, UnicodeType)):
             self.RefreshBufferState()
         else:
             message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
@@ -677,7 +681,7 @@ class objdictedit(wx.Frame):
             filepath = dialog.GetPath()
             if os.path.isdir(os.path.dirname(filepath)):
                 result = self.Manager.SaveCurrentInFile(filepath)
-                if type(result) != StringType:
+                if not isinstance(result, (StringType, UnicodeType)):
                     self.RefreshBufferState()
                 else:
                     message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
@@ -722,8 +726,8 @@ class objdictedit(wx.Frame):
             filepath = dialog.GetPath()
             if os.path.isfile(filepath):
                 result = self.Manager.ImportCurrentFromEDSFile(filepath)
-                if type(result) == IntType:
-                    new_editingpanel = EditingPanel(self, self.Manager)
+                if isinstance(result, (IntType, LongType)):
+                    new_editingpanel = EditingPanel(self.FileOpened, self, self.Manager)
                     new_editingpanel.SetIndex(result)
                     self.FileOpened.AddPage(new_editingpanel, "")
                     self.FileOpened.SetSelection(self.FileOpened.GetPageCount() - 1)
@@ -745,7 +749,6 @@ class objdictedit(wx.Frame):
         dialog.Destroy()
         event.Skip()
 
-
     def OnExportEDSMenu(self, event):
         dialog = wx.FileDialog(self, "Choose a file", os.getcwd(), self.Manager.GetCurrentNodeInfos()[0], "EDS files (*.eds)|*.eds|All files|*.*", wx.SAVE|wx.OVERWRITE_PROMPT|wx.CHANGE_DIR)
         if dialog.ShowModal() == wx.ID_OK:
@@ -851,10 +854,12 @@ class objdictedit(wx.Frame):
     def OnNodeInfosMenu(self, event):
         dialog = NodeInfosDialog(self)
         name, id, type, description = self.Manager.GetCurrentNodeInfos()
-        dialog.SetValues(name, id, type, description)
+        defaultstringsize = self.Manager.GetCurrentNodeDefaultStringSize()
+        dialog.SetValues(name, id, type, description, defaultstringsize)
         if dialog.ShowModal() == wx.ID_OK:
-            name, id, type, description = dialog.GetValues()
+            name, id, type, description, defaultstringsize = dialog.GetValues()
             self.Manager.SetCurrentNodeInfos(name, id, type, description)
+            self.Manager.SetCurrentNodeDefaultStringSize(defaultstringsize)
             self.RefreshBufferState()
             self.RefreshProfileMenu()
             selected = self.FileOpened.GetSelection()
@@ -876,7 +881,7 @@ class objdictedit(wx.Frame):
             if dialog.ShowModal() == wx.ID_OK:
                 index, name, struct, number = dialog.GetValues()
                 result = self.Manager.AddMapVariableToCurrent(index, name, struct, number)
-                if type(result) != StringType:
+                if not isinstance(result, (StringType, UnicodeType)):
                     self.RefreshBufferState()
                     self.RefreshCurrentIndexList()
                 else:
@@ -1009,13 +1014,29 @@ def AddExceptHook(path, app_version='[No version]'):#, ignored_exceptions=[]):
     sys.excepthook = handle_exception
 
 if __name__ == '__main__':
+    def usage():
+        print "\nUsage of objdictedit.py :"
+        print "\n   %s [Filepath, ...]\n"%sys.argv[0]
+
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "h", ["help"])
+    except getopt.GetoptError:
+        # print help information and exit:
+        usage()
+        sys.exit(2)
+
+    for o, a in opts:
+        if o in ("-h", "--help"):
+            usage()
+            sys.exit()
+    
     app = wx.PySimpleApp()
     wx.InitAllImageHandlers()
     
     # Install a exception handle for bug reports
     AddExceptHook(os.getcwd(),__version__)
     
-    frame = objdictedit(None)
+    frame = objdictedit(None, filesOpen = args)
 
     frame.Show()
     app.MainLoop()