Beremiz.py
changeset 82 d7b4dd1f543f
parent 76 2ee45a612c6f
child 83 ad4dafe7bfee
equal deleted inserted replaced
81:3a34b580f141 82:d7b4dd1f543f
    24 
    24 
    25 __version__ = "$Revision$"
    25 __version__ = "$Revision$"
    26 
    26 
    27 import wx
    27 import wx
    28 import wx.lib.buttons
    28 import wx.lib.buttons
       
    29 if wx.VERSION >= (2, 8, 0):
       
    30     import wx.lib.customtreectrl as CT
    29 
    31 
    30 import types
    32 import types
    31 
    33 
    32 import time
    34 import time
    33 
    35 
   245         parent.AddGrowableCol(0)
   247         parent.AddGrowableCol(0)
   246         parent.AddGrowableRow(1)
   248         parent.AddGrowableRow(1)
   247     
   249     
   248     def _init_coll_ButtonGridSizer_Items(self, parent):
   250     def _init_coll_ButtonGridSizer_Items(self, parent):
   249         parent.AddWindow(self.PluginChilds, 0, border=0, flag=wx.GROW)
   251         parent.AddWindow(self.PluginChilds, 0, border=0, flag=wx.GROW)
   250         parent.AddWindow(self.AddButton, 0, border=0, flag=0)
   252         parent.AddWindow(self.AddButton, 0, border=0, flag=0) 
   251         parent.AddWindow(self.DeleteButton, 0, border=0, flag=0)
   253         parent.AddWindow(self.DeleteButton, 0, border=0, flag=0)
   252         
   254         
   253     def _init_coll_ButtonGridSizer_Growables(self, parent):
   255     def _init_coll_ButtonGridSizer_Growables(self, parent):
   254         parent.AddGrowableCol(0)
   256         parent.AddGrowableCol(0)
   255         parent.AddGrowableRow(0)
   257         parent.AddGrowableRow(0)
   256         
   258         
   257     def _init_sizers(self):
   259     def _init_sizers(self):
   258         self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=2, rows=2, vgap=2)
   260         self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=2, rows=1, vgap=2)
       
   261         self.ButtonGridSizer = wx.FlexGridSizer(cols=3, hgap=2, rows=1, vgap=2)
   259         self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=2, rows=2, vgap=2)
   262         self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=2, rows=2, vgap=2)
   260         self.ButtonGridSizer = wx.FlexGridSizer(cols=3, hgap=2, rows=1, vgap=2)
       
   261         self.MenuSizer = wx.BoxSizer(wx.VERTICAL)
   263         self.MenuSizer = wx.BoxSizer(wx.VERTICAL)
   262         self.ParamsPanelMainSizer = wx.BoxSizer(wx.VERTICAL)
   264         self.ParamsPanelMainSizer = wx.BoxSizer(wx.VERTICAL)
   263         
   265         
   264         self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
   266         self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
   265         self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
   267         self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
       
   268         self._init_coll_ButtonGridSizer_Growables(self.ButtonGridSizer)
       
   269         self._init_coll_ButtonGridSizer_Items(self.ButtonGridSizer)
   266         self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
   270         self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
   267         self._init_coll_RightGridSizer_Items(self.RightGridSizer)
   271         self._init_coll_RightGridSizer_Items(self.RightGridSizer)
   268         self._init_coll_ButtonGridSizer_Growables(self.ButtonGridSizer)
       
   269         self._init_coll_ButtonGridSizer_Items(self.ButtonGridSizer)
       
   270         
   272         
   271         self.LeftPanel.SetSizer(self.LeftGridSizer)
   273         self.LeftPanel.SetSizer(self.LeftGridSizer)
   272         self.RightPanel.SetSizer(self.RightGridSizer)
   274         self.RightPanel.SetSizer(self.RightGridSizer)
   273         self.ParamsPanel.SetSizer(self.ParamsPanelMainSizer)
   275         self.ParamsPanel.SetSizer(self.ParamsPanelMainSizer)
   274     
   276     
   279         self._init_utils()
   281         self._init_utils()
   280         self.SetClientSize(wx.Size(1000, 600))
   282         self.SetClientSize(wx.Size(1000, 600))
   281         self.SetMenuBar(self.menuBar1)
   283         self.SetMenuBar(self.menuBar1)
   282         self.Bind(wx.EVT_ACTIVATE, self.OnFrameActivated)
   284         self.Bind(wx.EVT_ACTIVATE, self.OnFrameActivated)
   283         
   285         
   284         if wx.VERSION >= (2, 8, 0):
       
   285             self.AUIManager = wx.aui.AuiManager(self)
       
   286             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
       
   287         
       
   288         if wx.VERSION < (2, 8, 0):
   286         if wx.VERSION < (2, 8, 0):
   289             self.MainSplitter = wx.SplitterWindow(id=ID_BEREMIZMAINSPLITTER,
   287             self.MainSplitter = wx.SplitterWindow(id=ID_BEREMIZMAINSPLITTER,
   290                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   288                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   291                   size=wx.Size(0, 0), style=wx.SP_3D)
   289                   size=wx.Size(0, 0), style=wx.SP_3D)
   292             self.MainSplitter.SetNeedUpdating(True)
   290             self.MainSplitter.SetNeedUpdating(True)
   293             self.MainSplitter.SetMinimumPaneSize(1)
   291             self.MainSplitter.SetMinimumPaneSize(1)
   294         
   292         
   295             self.LeftPanel = wx.Panel(id=ID_BEREMIZLEFTPANEL, 
   293             self.LeftPanel = wx.Panel(id=ID_BEREMIZLEFTPANEL, 
   296                   name='LeftPanel', parent=self.MainSplitter, pos=wx.Point(0, 0),
   294                   name='LeftPanel', parent=self.MainSplitter, pos=wx.Point(0, 0),
   297                   size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   295                   size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   298         else:
   296         
   299             self.LeftPanel = wx.Panel(id=ID_BEREMIZLEFTPANEL, 
   297             self.PluginTree = wx.TreeCtrl(id=ID_BEREMIZPLUGINTREE,
   300                   name='LeftPanel', parent=self, pos=wx.Point(0, 0),
   298                   name='PluginTree', parent=self.LeftPanel, pos=wx.Point(0, 0),
   301                   size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   299                   size=wx.Size(-1, -1), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   302             self.AUIManager.AddPane(self.LeftPanel, wx.aui.AuiPaneInfo().Caption("Plugin Tree").Left().Layer(1).BestSize(wx.Size(300, 500)).CloseButton(False))
   300             self.PluginTree.Bind(wx.EVT_RIGHT_UP, self.OnPluginTreeRightUp)
   303         
   301             self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnPluginTreeItemSelected,
   304         self.PluginTree = wx.TreeCtrl(id=ID_BEREMIZPLUGINTREE,
   302                   id=ID_BEREMIZPLUGINTREE)
   305               name='PluginTree', parent=self.LeftPanel, pos=wx.Point(0, 0),
   303         
   306               size=wx.Size(-1, -1), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   304             self.PluginChilds = wx.Choice(id=ID_BEREMIZPLUGINCHILDS,
   307         self.PluginTree.Bind(wx.EVT_RIGHT_UP, self.OnPluginTreeRightUp)
   305                   name='PluginChilds', parent=self.LeftPanel, pos=wx.Point(0, 0),
   308         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnPluginTreeItemSelected,
   306                   size=wx.Size(-1, -1), style=0)
   309               id=ID_BEREMIZPLUGINTREE)
   307 
   310         
   308             self.AddButton = wx.lib.buttons.GenBitmapButton(ID=ID_BEREMIZADDBUTTON, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Add32x32.png')),
   311         self.PluginChilds = wx.Choice(id=ID_BEREMIZPLUGINCHILDS,
       
   312               name='PluginChilds', parent=self.LeftPanel, pos=wx.Point(0, 0),
       
   313               size=wx.Size(-1, -1), style=0)
       
   314         
       
   315         if wx.VERSION < (2, 8, 0):
       
   316             self.AddButton = wx.lib.buttons.GenBitmapButton(ID=ID_BEREMIZADDBUTTON, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Add.png')),
       
   317                   name='AddBusButton', parent=self.LeftPanel, pos=wx.Point(0, 0),
   309                   name='AddBusButton', parent=self.LeftPanel, pos=wx.Point(0, 0),
   318                   size=wx.Size(32, 32), style=wx.NO_BORDER)
   310                   size=wx.Size(32, 32), style=wx.NO_BORDER)
   319         else:
   311             self.AddButton.SetToolTipString("Add a plugin of the type selected")
   320             self.AddButton = wx.lib.buttons.GenBitmapButton(id=ID_BEREMIZADDBUTTON, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Add.png')),
   312             self.AddButton.Bind(wx.EVT_BUTTON, self.OnAddButton,
   321                   name='AddBusButton', parent=self.LeftPanel, pos=wx.Point(0, 0),
   313                   id=ID_BEREMIZADDBUTTON)
   322                   size=wx.Size(32, 32), style=wx.NO_BORDER)
   314             self.DeleteButton = wx.lib.buttons.GenBitmapButton(ID=ID_BEREMIZDELETEBUTTON, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Delete32x32.png')),
   323 
       
   324         self.AddButton.SetToolTipString("Add a plugin of the type selected")
       
   325         self.AddButton.Bind(wx.EVT_BUTTON, self.OnAddButton,
       
   326               id=ID_BEREMIZADDBUTTON)
       
   327         
       
   328         if wx.VERSION < (2, 8, 0):
       
   329             self.DeleteButton = wx.lib.buttons.GenBitmapButton(ID=ID_BEREMIZDELETEBUTTON, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Delete.png')),
       
   330                   name='DeleteBusButton', parent=self.LeftPanel, pos=wx.Point(0, 0),
   315                   name='DeleteBusButton', parent=self.LeftPanel, pos=wx.Point(0, 0),
   331                   size=wx.Size(32, 32), style=wx.NO_BORDER)
   316                   size=wx.Size(32, 32), style=wx.NO_BORDER)
   332         else:
   317             self.DeleteButton.SetToolTipString("Delete the current selected plugin")
   333             self.DeleteButton = wx.lib.buttons.GenBitmapButton(id=ID_BEREMIZDELETEBUTTON, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Delete.png')),
   318             self.DeleteButton.Bind(wx.EVT_BUTTON, self.OnDeleteButton,
   334                   name='DeleteBusButton', parent=self.LeftPanel, pos=wx.Point(0, 0),
   319                   id=ID_BEREMIZDELETEBUTTON)
   335                   size=wx.Size(32, 32), style=wx.NO_BORDER)
   320             
   336         self.DeleteButton.SetToolTipString("Delete the current selected plugin")
       
   337         self.DeleteButton.Bind(wx.EVT_BUTTON, self.OnDeleteButton,
       
   338               id=ID_BEREMIZDELETEBUTTON)
       
   339         
       
   340         if wx.VERSION < (2, 8, 0):
       
   341             self.RightPanel = wx.Panel(id=ID_BEREMIZLEFTPANEL, 
   321             self.RightPanel = wx.Panel(id=ID_BEREMIZLEFTPANEL, 
   342                   name='RightPanel', parent=self.MainSplitter, pos=wx.Point(0, 0),
   322                   name='RightPanel', parent=self.MainSplitter, pos=wx.Point(0, 0),
   343                   size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   323                   size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   344         
   324         
   345             self.SecondSplitter = wx.SplitterWindow(id=ID_BEREMIZSECONDSPLITTER,
   325             self.SecondSplitter = wx.SplitterWindow(id=ID_BEREMIZSECONDSPLITTER,
   360                   name='LogConsole', parent=self.SecondSplitter, pos=wx.Point(0, 0),
   340                   name='LogConsole', parent=self.SecondSplitter, pos=wx.Point(0, 0),
   361                   size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2)
   341                   size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2)
   362             
   342             
   363             self.SecondSplitter.SplitHorizontally(self.ParamsPanel, self.LogConsole,
   343             self.SecondSplitter.SplitHorizontally(self.ParamsPanel, self.LogConsole,
   364                   -250)
   344                   -250)
       
   345             
       
   346             self._init_sizers()
   365         else:
   347         else:
   366             self.RightPanel = wx.Panel(id=ID_BEREMIZLEFTPANEL, 
   348             self.AUIManager = wx.aui.AuiManager(self)
   367                   name='RightPanel', parent=self, pos=wx.Point(0, 0),
   349             self.AUIManager.SetDockSizeConstraint(0.5, 0.5)
   368                   size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   350             
   369             self.AUIManager.AddPane(self.RightPanel, wx.aui.AuiPaneInfo().CenterPane())
   351             self.PluginTree = CT.CustomTreeCtrl(id=ID_BEREMIZPLUGINTREE,
   370         
   352               name='PluginTree', parent=self, pos=wx.Point(0, 0),
   371             self.ParamsPanel = wx.ScrolledWindow(id=ID_BEREMIZPARAMSPANEL, 
   353               size=wx.Size(-1, -1), style=CT.TR_HAS_BUTTONS|CT.TR_EDIT_LABELS|CT.TR_HAS_VARIABLE_ROW_HEIGHT|CT.TR_NO_LINES|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   372                   name='ParamsPanel', parent=self.RightPanel, pos=wx.Point(0, 0),
   354             self.PluginTree.Bind(wx.EVT_RIGHT_UP, self.OnPluginTreeRightUp)
   373                   size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
   355             self.Bind(CT.EVT_TREE_SEL_CHANGED, self.OnPluginTreeItemSelected,
   374             self.ParamsPanel.SetScrollbars(10, 10, 0, 0, 0, 0)
   356                   id=ID_BEREMIZPLUGINTREE)
       
   357             self.Bind(CT.EVT_TREE_ITEM_CHECKED, self.OnPluginTreeItemChecked,
       
   358                   id=ID_BEREMIZPLUGINTREE)
       
   359             self.Bind(CT.EVT_TREE_END_LABEL_EDIT, self.OnPluginTreeItemEndEdit,
       
   360                   id=ID_BEREMIZPLUGINTREE)
       
   361             self.Bind(CT.EVT_TREE_ITEM_EXPANDED, self.OnPluginTreeItemExpanded,
       
   362                   id=ID_BEREMIZPLUGINTREE)
       
   363             self.Bind(CT.EVT_TREE_ITEM_COLLAPSED, self.OnPluginTreeItemCollapsed,
       
   364                   id=ID_BEREMIZPLUGINTREE)
       
   365             
       
   366             self.AUIManager.AddPane(self.PluginTree, wx.aui.AuiPaneInfo().CenterPane())
   375             
   367             
   376             self.LogConsole = wx.TextCtrl(id=ID_BEREMIZLOGCONSOLE, value='',
   368             self.LogConsole = wx.TextCtrl(id=ID_BEREMIZLOGCONSOLE, value='',
   377                   name='LogConsole', parent=self, pos=wx.Point(0, 0),
   369                   name='LogConsole', parent=self, pos=wx.Point(0, 0),
   378                   size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2)
   370                   size=wx.Size(0, 0), style=wx.TE_MULTILINE|wx.TE_RICH2)
   379             self.AUIManager.AddPane(self.LogConsole, wx.aui.AuiPaneInfo().Caption("Log Console").Bottom().Layer(0).BestSize(wx.Size(800, 200)).CloseButton(False))
   371             self.AUIManager.AddPane(self.LogConsole, wx.aui.AuiPaneInfo().Caption("Log Console").Bottom().Layer(1).BestSize(wx.Size(800, 200)).CloseButton(False))
   380         
   372         
   381         self._init_sizers()
       
   382         
       
   383         if wx.VERSION >= (2, 8, 0):
       
   384             self.AUIManager.Update()
   373             self.AUIManager.Update()
       
   374 
       
   375     def ShowChildrenWindows(self, root, show = True):
       
   376         item, root_cookie = self.PluginTree.GetFirstChild(root)
       
   377         while item is not None and item.IsOk():
       
   378             window = self.PluginTree.GetItemWindow(item)
       
   379             if show:
       
   380                 window.Show()
       
   381             else:
       
   382                 window.Hide()
       
   383             if self.PluginTree.IsExpanded(item):
       
   384                 self.ShowChildrenWindows(item, show)
       
   385             item, root_cookie = self.PluginTree.GetNextChild(root, root_cookie)
       
   386 
       
   387     def OnPluginTreeItemExpanded(self, event):
       
   388         self.ShowChildrenWindows(event.GetItem(), True)
       
   389         event.Skip()
       
   390 
       
   391     def OnPluginTreeItemCollapsed(self, event):
       
   392         self.ShowChildrenWindows(event.GetItem(), False)
       
   393         event.Skip()
   385 
   394 
   386     def __init__(self, parent, projectOpen):
   395     def __init__(self, parent, projectOpen):
   387         self._init_ctrls(parent)
   396         self._init_ctrls(parent)
   388         
   397         
   389         self.Log = LogPseudoFile(self.LogConsole)
   398         self.Log = LogPseudoFile(self.LogConsole)
   390         
   399         
   391         self.PluginRoot = PluginsRoot(self)
   400         self.PluginRoot = PluginsRoot(self)
       
   401         self.DisableEvents = False
   392         
   402         
   393         if projectOpen:
   403         if projectOpen:
   394             self.PluginRoot.LoadProject(projectOpen, self.Log)
   404             self.PluginRoot.LoadProject(projectOpen, self.Log)
   395             self.RefreshPluginTree()
   405             self.RefreshPluginTree()
   396             self.PluginTree.SelectItem(self.PluginTree.GetRootItem())
   406             self.PluginTree.SelectItem(self.PluginTree.GetRootItem())
   397         
   407         
   398         self.RefreshPluginParams()
   408         if wx.VERSION < (2, 8, 0):
   399         self.RefreshButtons()
   409             self.RefreshPluginParams()
       
   410             self.RefreshButtons()
       
   411         
   400         self.RefreshMainMenu()
   412         self.RefreshMainMenu()
   401     
   413     
   402     def OnFrameActivated(self, event):
   414     def OnFrameActivated(self, event):
   403         if not event.GetActive():
   415         if not event.GetActive():
   404             self.PluginRoot.RefreshPluginsBlockLists()
   416             self.PluginRoot.RefreshPluginsBlockLists()
   405     
   417     
   406     def RefreshButtons(self):
   418     def RefreshButtons(self):
   407         if self.PluginRoot.HasProjectOpened():
   419         if wx.VERSION < (2, 8, 0):
   408             self.PluginChilds.Enable(True)
   420             if self.PluginRoot.HasProjectOpened():
   409             self.AddButton.Enable(True)
   421                 self.PluginChilds.Enable(True)
   410             self.DeleteButton.Enable(True)
   422                 self.AddButton.Enable(True)
   411         else:
   423                 self.DeleteButton.Enable(True)
   412             self.PluginChilds.Enable(False)
   424             else:
   413             self.AddButton.Enable(False)
   425                 self.PluginChilds.Enable(False)
   414             self.DeleteButton.Enable(False)
   426                 self.AddButton.Enable(False)
       
   427                 self.DeleteButton.Enable(False)
   415         
   428         
   416     def RefreshMainMenu(self):
   429     def RefreshMainMenu(self):
   417         if self.menuBar1:
   430         if self.menuBar1:
   418             if self.PluginRoot.HasProjectOpened():
   431             if self.PluginRoot.HasProjectOpened():
   419 ##                self.menuBar1.EnableTop(1, True)
   432 ##                self.menuBar1.EnableTop(1, True)
   427                 self.FileMenu.Enable(ID_BEREMIZFILEMENUITEMS2, False)
   440                 self.FileMenu.Enable(ID_BEREMIZFILEMENUITEMS2, False)
   428                 self.FileMenu.Enable(ID_BEREMIZFILEMENUITEMS3, False)
   441                 self.FileMenu.Enable(ID_BEREMIZFILEMENUITEMS3, False)
   429                 self.FileMenu.Enable(ID_BEREMIZFILEMENUITEMS5, False)
   442                 self.FileMenu.Enable(ID_BEREMIZFILEMENUITEMS5, False)
   430 
   443 
   431     def RefreshPluginTree(self):
   444     def RefreshPluginTree(self):
       
   445         self.DisableEvents = True
   432         infos = self.PluginRoot.GetPlugInfos()
   446         infos = self.PluginRoot.GetPlugInfos()
   433         root = self.PluginTree.GetRootItem()
   447         root = self.PluginTree.GetRootItem()
   434         if not root.IsOk():
   448         if root is None or not root.IsOk():
   435             root = self.PluginTree.AddRoot(infos["name"])
   449             root = self.PluginTree.AddRoot(infos["name"])
   436         last_selected = self.GetSelectedPluginName()
   450         last_selected = self.GetSelectedPluginName()
   437         self.GenerateTreeBranch(root, infos, True)
   451         self.GenerateTreeBranch(root, infos, True)
   438         self.PluginTree.Expand(self.PluginTree.GetRootItem())
   452         self.PluginTree.Expand(self.PluginTree.GetRootItem())
   439         self.SelectedPluginByName(root, last_selected)
   453         self.SelectedPluginByName(root, last_selected)
   440         self.RefreshPluginParams()
   454         
       
   455         if wx.VERSION < (2, 8, 0):
       
   456             self.RefreshPluginParams()
       
   457         
       
   458         self.DisableEvents = False
   441 
   459 
   442     def SelectedPluginByName(self, root, name):
   460     def SelectedPluginByName(self, root, name):
   443         if name:
   461         if name:
   444             toks = name.split('.',1)
   462             toks = name.split('.', 1)
   445             item, root_cookie = self.PluginTree.GetFirstChild(root)
   463             item, root_cookie = self.PluginTree.GetFirstChild(root)
   446             while item.IsOk():
   464             while item is not None and item.IsOk():
   447                 if self.PluginTree.GetPyData(item) == toks[0]:
   465                 if self.PluginTree.GetPyData(item) == toks[0]:
   448                     if len(toks)>1:
   466                     if len(toks)>1:
   449                         return self.SelectedPluginByName(item, toks[1])
   467                         return self.SelectedPluginByName(item, toks[1])
   450                     else:
   468                     else:
   451                         self.PluginTree.SelectItem(item, True)
   469                         self.PluginTree.SelectItem(item, True)
   455 
   473 
   456     def GenerateTreeBranch(self, root, infos, first = False):
   474     def GenerateTreeBranch(self, root, infos, first = False):
   457         to_delete = []
   475         to_delete = []
   458         self.PluginTree.SetItemText(root, infos["name"])
   476         self.PluginTree.SetItemText(root, infos["name"])
   459         self.PluginTree.SetPyData(root, infos["type"])
   477         self.PluginTree.SetPyData(root, infos["type"])
       
   478         
       
   479         if wx.VERSION >= (2, 8, 0):
       
   480             plugin = self.GetSelectedPlugin(root)
       
   481             if plugin is not None:
       
   482                 old_window = self.PluginTree.GetItemWindow(root)
       
   483                 if old_window is not None:
       
   484                     old_window.GetSizer().Clear(True)
       
   485                     old_window.Destroy()
       
   486 
       
   487                 window = wx.Panel(self.PluginTree, -1, size=wx.Size(-1, -1))
       
   488                 window.SetBackgroundColour(wx.WHITE)
       
   489                 tcsizer = wx.BoxSizer(wx.HORIZONTAL)
       
   490                 
       
   491                 if "channel" in infos:
       
   492                     sc = wx.SpinCtrl(window, -1, size=wx.Size(50, 25))
       
   493                     sc.SetValue(infos["channel"])
       
   494                     sc.Bind(wx.EVT_SPINCTRL, self.GetItemChannelChangedFunction(root))
       
   495                     tcsizer.AddWindow(sc, 0, border=5, flag=wx.LEFT|wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER)
       
   496                 
       
   497                 if "parent" in infos or plugin == self.PluginRoot:
       
   498                     addbutton_id = wx.NewId()
       
   499                     addbutton = wx.lib.buttons.GenBitmapButton(id=addbutton_id, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Add24x24.png')),
       
   500                           name='AddBusButton', parent=window, pos=wx.Point(0, 0),
       
   501                           size=wx.Size(24, 24), style=wx.NO_BORDER)
       
   502                     addbutton.SetToolTipString("Add a plugin to this one")
       
   503                     addbutton.Bind(wx.EVT_BUTTON, self.GetAddButtonFunction(root), id=addbutton_id)
       
   504                     tcsizer.AddWindow(addbutton, 0, border=5, flag=wx.LEFT|wx.RIGHT|wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER)
       
   505                 
       
   506                 if plugin != self.PluginRoot:
       
   507                     deletebutton_id = wx.NewId()
       
   508                     deletebutton = wx.lib.buttons.GenBitmapButton(id=deletebutton_id, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'Delete24x24.png')),
       
   509                           name='DeleteBusButton', parent=window, pos=wx.Point(0, 0),
       
   510                           size=wx.Size(24, 24), style=wx.NO_BORDER)
       
   511                     deletebutton.SetToolTipString("Delete this plugin")
       
   512                     deletebutton.Bind(wx.EVT_BUTTON, self.GetDeleteButtonFunction(root), id=deletebutton_id)
       
   513                     tcsizer.AddWindow(deletebutton, 0, border=5, flag=wx.RIGHT|wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER)
       
   514                 
       
   515                 psizer = wx.BoxSizer(wx.HORIZONTAL)
       
   516                 plugin_infos = plugin.GetParamsAttributes()
       
   517 
       
   518                 sizer = wx.BoxSizer(wx.HORIZONTAL)
       
   519                 self.RefreshSizerElement(window, sizer, plugin_infos, None, True, root)
       
   520                 if plugin != self.PluginRoot and len(plugin.PluginMethods) > 0:
       
   521                     for plugin_method in plugin.PluginMethods:
       
   522                         if "method" in plugin_method:
       
   523                             id = wx.NewId()
       
   524                             if "bitmap" in plugin_method:
       
   525                                 button = wx.lib.buttons.GenBitmapTextButton(id=id, parent=window, 
       
   526                                     bitmap=wx.Bitmap(os.path.join(CWD, "%s24x24.png"%plugin_method["bitmap"])), label=plugin_method["name"], 
       
   527                                     name=plugin_method["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
       
   528                             else:
       
   529                                 button = wx.Button(id=id, label=plugin_method["name"], 
       
   530                                     name=plugin_method["name"], parent=window, 
       
   531                                     pos=wx.Point(0, 0), style=wx.BU_EXACTFIT)
       
   532                             button.SetToolTipString(plugin_method["tooltip"])
       
   533                             button.Bind(wx.EVT_BUTTON, self.GetButtonCallBackFunction(plugin, plugin_method["method"]), id=id)
       
   534                             sizer.AddWindow(button, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER)
       
   535                 tcsizer.AddSizer(sizer, 0, border=0, flag=wx.GROW)
       
   536             window.SetSizer(tcsizer)
       
   537             tcsizer.Fit(window)
       
   538             self.PluginTree.SetItemWindow(root, window)
       
   539             if "enabled" in infos:
       
   540                 self.PluginTree.CheckItem(root, infos["enabled"])
       
   541                 self.PluginTree.SetItemWindowEnabled(root, infos["enabled"])
       
   542 
   460         item, root_cookie = self.PluginTree.GetFirstChild(root)
   543         item, root_cookie = self.PluginTree.GetFirstChild(root)
   461         for values in infos["values"]:
   544         for values in infos["values"]:
   462             if not item.IsOk():
   545             if item is None or not item.IsOk():
   463                 item = self.PluginTree.AppendItem(root, "")
   546                 if wx.VERSION >= (2, 8, 0):
       
   547                     item = self.PluginTree.AppendItem(root, "", ct_type=1)
       
   548                 else:
       
   549                     item = self.PluginTree.AppendItem(root, "")
       
   550                 
   464                 if wx.Platform != '__WXMSW__':
   551                 if wx.Platform != '__WXMSW__':
   465                     item, root_cookie = self.PluginTree.GetNextChild(root, root_cookie)
   552                     item, root_cookie = self.PluginTree.GetNextChild(root, root_cookie)
   466             self.GenerateTreeBranch(item, values)
   553             self.GenerateTreeBranch(item, values)
   467             item, root_cookie = self.PluginTree.GetNextChild(root, root_cookie)
   554             item, root_cookie = self.PluginTree.GetNextChild(root, root_cookie)
   468         while item.IsOk():
   555         while item is not None and item.IsOk():
   469             to_delete.append(item)
   556             to_delete.append(item)
   470             item, root_cookie = self.PluginTree.GetNextChild(root, root_cookie)
   557             item, root_cookie = self.PluginTree.GetNextChild(root, root_cookie)
   471         for item in to_delete:
   558         for item in to_delete:
   472             self.PluginTree.Delete(item)
   559             self.PluginTree.Delete(item)
   473 
   560 
   474     def GetSelectedPluginName(self):
   561     def GetSelectedPluginName(self, selected = None):
   475         selected = self.PluginTree.GetSelection()
   562         if selected is None:
   476         if not selected.IsOk():
   563             selected = self.PluginTree.GetSelection()
       
   564         if selected is None or not selected.IsOk():
   477             return None
   565             return None
   478         if selected == self.PluginTree.GetRootItem():
   566         if selected == self.PluginTree.GetRootItem():
   479             return ""
   567             return ""
   480         else:
   568         else:
   481             name = self.PluginTree.GetPyData(selected)
   569             name = self.PluginTree.GetPyData(selected)
   483             while item.IsOk() and item != self.PluginTree.GetRootItem():
   571             while item.IsOk() and item != self.PluginTree.GetRootItem():
   484                 name = "%s.%s"%(self.PluginTree.GetPyData(item), name)
   572                 name = "%s.%s"%(self.PluginTree.GetPyData(item), name)
   485                 item = self.PluginTree.GetItemParent(item)
   573                 item = self.PluginTree.GetItemParent(item)
   486             return name
   574             return name
   487 
   575 
   488     def GetSelectedPlugin(self):
   576     def GetSelectedPlugin(self, selected = None):
   489         name = self.GetSelectedPluginName()
   577         name = self.GetSelectedPluginName(selected)
   490         if name is None:
   578         if name is None:
   491             return None
   579             return None
   492         elif name == "":
   580         elif name == "":
   493             return self.PluginRoot
   581             return self.PluginRoot
   494         else:
   582         else:
   495             return self.PluginRoot.GetChildByName(name)
   583             return self.PluginRoot.GetChildByName(name)
   496 
   584 
   497     def OnPluginTreeItemSelected(self, event):
   585     def OnPluginTreeItemSelected(self, event):
   498         wx.CallAfter(self.RefreshPluginParams)
   586         if wx.VERSION < (2, 8, 0):
   499         event.Skip()
   587             wx.CallAfter(self.RefreshPluginParams)
   500     
   588         event.Skip()
   501     def _GetAddPluginFunction(self, name):
   589     
       
   590     def OnPluginTreeItemChecked(self, event):
       
   591         if not self.DisableEvents:
       
   592             item = event.GetItem()
       
   593             plugin = self.GetSelectedPlugin(item)
       
   594             if plugin:
       
   595                 res, StructChanged = plugin.SetParamsAttribute("BaseParams.Enabled", self.PluginTree.IsItemChecked(item), self.Log)
       
   596                 wx.CallAfter(self.RefreshPluginTree)
       
   597         event.Skip()
       
   598     
       
   599     def OnPluginTreeItemEndEdit(self, event):
       
   600         if event.GetLabel() == "":
       
   601             event.Veto()
       
   602         elif not self.DisableEvents:
       
   603             plugin = self.GetSelectedPlugin()
       
   604             if plugin:
       
   605                 res, StructChanged = plugin.SetParamsAttribute("BaseParams.Name", event.GetLabel(), self.Log)
       
   606                 wx.CallAfter(self.RefreshPluginTree)
       
   607             event.Skip()
       
   608     
       
   609     def GetItemChannelChangedFunction(self, item):
       
   610         def OnPluginTreeItemChannelChanged(event):
       
   611             if not self.DisableEvents:
       
   612                 plugin = self.GetSelectedPlugin(item)
       
   613                 if plugin:
       
   614                     res, StructChanged = plugin.SetParamsAttribute("BaseParams.IEC_Channel", event.GetInt(), self.Log)
       
   615                     wx.CallAfter(self.RefreshPluginTree)
       
   616             event.Skip()
       
   617         return OnPluginTreeItemChannelChanged
       
   618     
       
   619     def _GetAddPluginFunction(self, name, selected = None):
   502         def OnPluginMenu(event):
   620         def OnPluginMenu(event):
   503             self.AddPlugin(name)
   621             self.AddPlugin(name, selected)
   504             event.Skip()
   622             event.Skip()
   505         return OnPluginMenu
   623         return OnPluginMenu
   506     
   624     
   507     def OnPluginTreeRightUp(self, event):
   625     def OnPluginTreeRightUp(self, event):
   508         plugin = self.GetSelectedPlugin()
   626         plugin = self.GetSelectedPlugin()
   509         if plugin:
   627         if plugin:
   510             main_menu = wx.Menu(title='')
   628             main_menu = wx.Menu(title='')
   511             if len(plugin.PlugChildsTypes) > 0:
   629             if len(plugin.PlugChildsTypes) > 0:
   512                 plugin_menu = wx.Menu(title='')
   630                 plugin_menu = wx.Menu(title='')
   513                 for name, XSDClass in self.GetSelectedPlugin().PlugChildsTypes:
   631                 for name, XSDClass in plugin.PlugChildsTypes:
   514                     new_id = wx.NewId()
   632                     new_id = wx.NewId()
   515                     plugin_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=name)
   633                     plugin_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=name)
   516                     self.Bind(wx.EVT_MENU, self._GetAddPluginFunction(name), id=new_id)
   634                     self.Bind(wx.EVT_MENU, self._GetAddPluginFunction(name), id=new_id)
   517                 main_menu.AppendMenu(-1, "Add", plugin_menu, '')
   635                 main_menu.AppendMenu(-1, "Add", plugin_menu, '')
   518             new_id = wx.NewId()
   636             new_id = wx.NewId()
   519             main_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete")
   637             main_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text="Delete")
   520             self.Bind(wx.EVT_MENU, self.OnDeleteButton, id=new_id)
   638             self.Bind(wx.EVT_MENU, self.OnDeleteButton, id=new_id)
   521             rect = self.PluginTree.GetBoundingRect(self.PluginTree.GetSelection())
   639             pos_x, pos_y = event.GetPosition()
   522             self.PluginTree.PopupMenuXY(main_menu, rect.x + rect.width, rect.y)
   640             self.PluginTree.PopupMenuXY(main_menu, pos_x, pos_y)
   523         event.Skip()
   641         event.Skip()
       
   642     
       
   643     def RefreshPluginToolBar(self):
       
   644         if wx.VERSION < (2, 8, 0):
       
   645             self.ClearSizer(self.MenuSizer)
       
   646         if self.PluginRoot.HasOpenedProject() and len(self.PluginRoot.PluginMethods) > 0:
       
   647             if wx.VERSION > (2, 8, 0):
       
   648                 toolbar = wx.ToolBar(self, -1, wx.DefaultPosition, wx.DefaultSize,
       
   649                     wx.TB_FLAT | wx.TB_NODIVIDER | wx.NO_BORDER | wx.TB_TEXT)
       
   650             else:
       
   651                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
       
   652             for plugin_infos in self.PluginRoot.PluginMethods:
       
   653                 if "method" in plugin_infos:
       
   654                     id = wx.NewId()
       
   655                     if "bitmap" in plugin_infos:
       
   656                         if wx.VERSION < (2, 8, 0):
       
   657                             button = wx.lib.buttons.GenBitmapTextButton(ID=id, parent=self.RightPanel,
       
   658                                 bitmap=wx.Bitmap(os.path.join(CWD, "%s32x32.png"%plugin_infos["bitmap"])), label=plugin_infos["name"],
       
   659                                 name=plugin_infos["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
       
   660                         else:
       
   661                             button = wx.lib.buttons.GenBitmapTextButton(id=id, parent=toolbar,
       
   662                                 bitmap=wx.Bitmap(os.path.join(CWD, "%s32x32.png"%plugin_infos["bitmap"])), label=plugin_infos["name"],
       
   663                                 name=plugin_infos["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
       
   664                             button.SetSize(button.GetBestSize())
       
   665                     else:
       
   666                         if wx.VERSION < (2, 8, 0):
       
   667                             button = wx.Button(id=id, label=plugin_infos["name"], 
       
   668                                 name=plugin_infos["name"], parent=self.RightPanel, 
       
   669                                 pos=wx.Point(0, 0), style=wx.BU_EXACTFIT)
       
   670                         else:
       
   671                             button = wx.Button(id=id, label=plugin_infos["name"], 
       
   672                                 name=plugin_infos["name"], parent=toolbar, 
       
   673                                 pos=wx.Point(0, 0), size=(-1, 48), style=wx.BU_EXACTFIT)
       
   674                     button.SetToolTipString(plugin_infos["tooltip"])
       
   675                     button.Bind(wx.EVT_BUTTON, self.GetButtonCallBackFunction(self.PluginRoot, plugin_infos["method"]), id=id)
       
   676                     if wx.VERSION < (2, 8, 0):
       
   677                         boxsizer.AddWindow(button, 0, border=5, flag=wx.GROW|wx.RIGHT)
       
   678                     else:
       
   679                         toolbar.AddControl(button)
       
   680             if wx.VERSION < (2, 8, 0):
       
   681                 self.MenuSizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.ALL)
       
   682                 self.RightGridSizer.Layout()
       
   683             else:
       
   684                 toolbar.Realize()
       
   685                 self.AUIManager.AddPane(toolbar, wx.aui.AuiPaneInfo().
       
   686                       Name("ToolBar").Caption("Toolbar").
       
   687                       ToolbarPane().Top().
       
   688                       LeftDockable(False).RightDockable(False))
       
   689                 self.AUIManager.Update()
   524     
   690     
   525     def RefreshPluginParams(self):
   691     def RefreshPluginParams(self):
   526         plugin = self.GetSelectedPlugin()
   692         plugin = self.GetSelectedPlugin()
   527         if not plugin:
   693         if not plugin:
   528             # Refresh ParamsPanel
   694             # Refresh ParamsPanel
   535             self.DeleteButton.Enable(False)
   701             self.DeleteButton.Enable(False)
   536         else:
   702         else:
   537             # Refresh ParamsPanel
   703             # Refresh ParamsPanel
   538             self.ParamsPanel.Show()
   704             self.ParamsPanel.Show()
   539             infos = plugin.GetParamsAttributes()
   705             infos = plugin.GetParamsAttributes()
   540             if wx.VERSION >= (2, 7, 0):
   706             if len(self.MenuSizer.GetChildren()) > 1:
   541                 self.MenuSizer.Clear(True)
   707                 self.ClearSizer(self.MenuSizer.GetChildren()[1].GetSizer())
   542                 self.ParamsPanelMainSizer.Clear(True)
   708                 self.MenuSizer.Remove(1)
   543             else:
   709             self.ClearSizer(self.ParamsPanelMainSizer)
   544                 self.ClearSizer(self.MenuSizer)
   710             self.RefreshSizerElement(self.ParamsPanel, self.ParamsPanelMainSizer, infos, None, False)
   545                 self.ClearSizer(self.ParamsPanelMainSizer)
       
   546             if len(self.PluginRoot.PluginMethods) > 0:
       
   547                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
       
   548                 self.MenuSizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.ALL)
       
   549                 for plugin_infos in self.PluginRoot.PluginMethods:
       
   550                     if "method" in plugin_infos:
       
   551                         id = wx.NewId()
       
   552                         if "bitmap" in plugin_infos:
       
   553                             if wx.VERSION < (2, 8, 0):
       
   554                                 button = wx.lib.buttons.GenBitmapTextButton(ID=id, parent=self.RightPanel,
       
   555                                     bitmap=wx.Bitmap(os.path.join(CWD, plugin_infos["bitmap"])), label=plugin_infos["name"],
       
   556                                     name=plugin_infos["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
       
   557                             else:
       
   558                                 button = wx.lib.buttons.GenBitmapTextButton(id=id, parent=self.RightPanel,
       
   559                                     bitmap=wx.Bitmap(os.path.join(CWD, plugin_infos["bitmap"])), label=plugin_infos["name"],
       
   560                                     name=plugin_infos["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
       
   561                             
       
   562                         else:
       
   563                             button = wx.Button(id=id, label=plugin_infos["name"], 
       
   564                                 name=plugin_infos["name"], parent=self.RightPanel, 
       
   565                                 pos=wx.Point(0, 0), style=wx.BU_EXACTFIT)
       
   566                         button.SetToolTipString(plugin_infos["tooltip"])
       
   567                         button.Bind(wx.EVT_BUTTON, self.GetButtonCallBackFunction(self.PluginRoot, plugin_infos["method"]), id=id)
       
   568                         boxsizer.AddWindow(button, 0, border=5, flag=wx.GROW|wx.RIGHT)
       
   569                 self.RightGridSizer.Layout()
       
   570             self.RefreshSizerElement(self.ParamsPanelMainSizer, infos, None, False)
       
   571             if plugin != self.PluginRoot and len(plugin.PluginMethods) > 0:
   711             if plugin != self.PluginRoot and len(plugin.PluginMethods) > 0:
   572                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
   712                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
   573                 self.MenuSizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.ALL)
   713                 self.MenuSizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.ALL)
   574                 for plugin_infos in plugin.PluginMethods:
   714                 for plugin_infos in plugin.PluginMethods:
   575                     if "method" in plugin_infos:
   715                     if "method" in plugin_infos:
   576                         id = wx.NewId()
   716                         id = wx.NewId()
   577                         if "bitmap" in plugin_infos:
   717                         if "bitmap" in plugin_infos:
   578                             if wx.VERSION < (2, 8, 0):
   718                             button = wx.lib.buttons.GenBitmapTextButton(ID=id, parent=self.RightPanel, 
   579                                 button = wx.lib.buttons.GenBitmapTextButton(ID=id, parent=self.RightPanel, 
   719                                   bitmap=wx.Bitmap(os.path.join(CWD, "%s32x32.png"%plugin_infos["bitmap"])), label=plugin_infos["name"], 
   580                                     bitmap=wx.Bitmap(os.path.join(CWD, plugin_infos["bitmap"])), label=plugin_infos["name"], 
   720                                   name=plugin_infos["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
   581                                     name=plugin_infos["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
       
   582                             else:
       
   583                                 button = wx.lib.buttons.GenBitmapTextButton(id=id, parent=self.RightPanel, 
       
   584                                     bitmap=wx.Bitmap(os.path.join(CWD, plugin_infos["bitmap"])), label=plugin_infos["name"], 
       
   585                                     name=plugin_infos["name"], pos=wx.Point(0, 0), style=wx.BU_EXACTFIT|wx.NO_BORDER)
       
   586                         else:
   721                         else:
   587                             button = wx.Button(id=id, label=plugin_infos["name"], 
   722                             button = wx.Button(id=id, label=plugin_infos["name"], 
   588                                 name=plugin_infos["name"], parent=self.RightPanel, 
   723                                 name=plugin_infos["name"], parent=self.RightPanel, 
   589                                 pos=wx.Point(0, 0), style=wx.BU_EXACTFIT)
   724                                 pos=wx.Point(0, 0), style=wx.BU_EXACTFIT)
   590                         button.SetToolTipString(plugin_infos["tooltip"])
   725                         button.SetToolTipString(plugin_infos["tooltip"])
   591                         button.Bind(wx.EVT_BUTTON, self.GetButtonCallBackFunction(plugin, plugin_infos["method"]), id=id)
   726                         button.Bind(wx.EVT_BUTTON, self.GetButtonCallBackFunction(plugin, plugin_infos["method"]), id=id)
   592                         boxsizer.AddWindow(button, 0, border=5, flag=wx.GROW|wx.RIGHT)
   727                         boxsizer.AddWindow(button, 0, border=5, flag=wx.GROW|wx.RIGHT)
   593                 self.RightGridSizer.Layout()
   728             self.RightGridSizer.Layout()
   594             self.ParamsPanelMainSizer.Layout()
   729             self.ParamsPanelMainSizer.Layout()
   595             self.ParamsPanel.SetClientSize(self.ParamsPanel.GetClientSize())
   730             self.ParamsPanel.SetClientSize(self.ParamsPanel.GetClientSize())
   596             
   731             
   597             # Refresh PluginChilds
   732             # Refresh PluginChilds
   598             self.PluginChilds.Clear()
   733             self.PluginChilds.Clear()
   611         def OnButtonClick(event):
   746         def OnButtonClick(event):
   612             method(plugin, self.Log)
   747             method(plugin, self.Log)
   613             event.Skip()
   748             event.Skip()
   614         return OnButtonClick
   749         return OnButtonClick
   615     
   750     
   616     def GetChoiceCallBackFunction(self, choicectrl, path):
   751     def GetChoiceCallBackFunction(self, choicectrl, path, selected=None):
   617         def OnChoiceChanged(event):
   752         def OnChoiceChanged(event):
   618             plugin = self.GetSelectedPlugin()
   753             plugin = self.GetSelectedPlugin(selected)
   619             if plugin:
   754             if plugin:
   620                 res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log)
   755                 res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log)
   621                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   756                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   622                 choicectrl.SetStringSelection(res)
   757                 choicectrl.SetStringSelection(res)
   623             event.Skip()
   758             event.Skip()
   624         return OnChoiceChanged
   759         return OnChoiceChanged
   625     
   760     
   626     def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, path):
   761     def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, path, selected=None):
   627         def OnChoiceContentChanged(event):
   762         def OnChoiceContentChanged(event):
   628             plugin = self.GetSelectedPlugin()
   763             plugin = self.GetSelectedPlugin(selected)
   629             if plugin:
   764             if plugin:
   630                 res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log)
   765                 res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log)
   631                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   766                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   632                 choicectrl.SetStringSelection(res)
   767                 choicectrl.SetStringSelection(res)
   633                 infos = self.PluginRoot.GetParamsAttributes(path)
   768                 infos = self.PluginRoot.GetParamsAttributes(path)
   634                 staticbox = staticboxsizer.GetStaticBox()
   769                 staticbox = staticboxsizer.GetStaticBox()
   635                 staticbox.SetLabel("%(name)s - %(value)s"%infos)
   770                 staticbox.SetLabel("%(name)s - %(value)s"%infos)
   636                 self.ParamsPanel.Freeze()
   771                 if wx.VERSION < (2, 8, 0):
   637                 self.RefreshSizerElement(staticboxsizer, infos["children"], "%s.%s"%(path, infos["name"]))
   772                     self.ParamsPanel.Freeze()
   638                 self.ParamsPanelMainSizer.Layout()
   773                     self.RefreshSizerElement(self.ParamsPanel, staticboxsizer, infos["children"], "%s.%s"%(path, infos["name"]), selected=selected)
   639                 self.ParamsPanel.Thaw()
   774                     self.ParamsPanelMainSizer.Layout()
   640                 self.ParamsPanel.Refresh()
   775                     self.ParamsPanel.Thaw()
       
   776                     self.ParamsPanel.Refresh()
       
   777                 else:
       
   778                     wx.CallAfter(self.RefreshPluginTree)
   641             event.Skip()
   779             event.Skip()
   642         return OnChoiceContentChanged
   780         return OnChoiceContentChanged
   643     
   781     
   644     def GetTextCtrlCallBackFunction(self, textctrl, path):
   782     def GetTextCtrlCallBackFunction(self, textctrl, path, selected=None):
   645         def OnTextCtrlChanged(event):
   783         def OnTextCtrlChanged(event):
   646             plugin = self.GetSelectedPlugin()
   784             plugin = self.GetSelectedPlugin(selected)
   647             if plugin:
   785             if plugin:
   648                 res, StructChanged = plugin.SetParamsAttribute(path, textctrl.GetValue(), self.Log)
   786                 res, StructChanged = plugin.SetParamsAttribute(path, textctrl.GetValue(), self.Log)
   649                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   787                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   650                 textctrl.SetValue(res)
   788                 textctrl.SetValue(res)
   651             event.Skip()
   789             event.Skip()
   652         return OnTextCtrlChanged
   790         return OnTextCtrlChanged
   653     
   791     
   654     def GetCheckBoxCallBackFunction(self, chkbx, path):
   792     def GetCheckBoxCallBackFunction(self, chkbx, path, selected=None):
   655         def OnCheckBoxChanged(event):
   793         def OnCheckBoxChanged(event):
   656             plugin = self.GetSelectedPlugin()
   794             plugin = self.GetSelectedPlugin(selected)
   657             if plugin:
   795             if plugin:
   658                 res, StructChanged = plugin.SetParamsAttribute(path, chkbx.IsChecked(), self.Log)
   796                 res, StructChanged = plugin.SetParamsAttribute(path, chkbx.IsChecked(), self.Log)
   659                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   797                 if StructChanged: wx.CallAfter(self.RefreshPluginTree)
   660                 chkbx.SetValue(res)
   798                 chkbx.SetValue(res)
   661             event.Skip()
   799             event.Skip()
   671                     staticboxes.append(item_sizer.GetStaticBox())
   809                     staticboxes.append(item_sizer.GetStaticBox())
   672         sizer.Clear(True)
   810         sizer.Clear(True)
   673         for staticbox in staticboxes:
   811         for staticbox in staticboxes:
   674             staticbox.Destroy()
   812             staticbox.Destroy()
   675                 
   813                 
   676     def RefreshSizerElement(self, sizer, elements, path, clean = True):
   814     def RefreshSizerElement(self, parent, sizer, elements, path, clean = True, selected = None):
   677         if clean:
   815         if clean:
   678             sizer.Clear(True)
   816             sizer.Clear(True)
   679         first = True
   817         first = True
   680         for element_infos in elements:
   818         for element_infos in elements:
   681             if path:
   819             if path:
   689                 else:
   827                 else:
   690                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   828                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   691                 bitmappath = os.path.join("images", "%s.png"%element_infos["name"])
   829                 bitmappath = os.path.join("images", "%s.png"%element_infos["name"])
   692                 if os.path.isfile(bitmappath):
   830                 if os.path.isfile(bitmappath):
   693                     staticbitmap = wx.StaticBitmap(id=-1, bitmap=wx.Bitmap(bitmappath),
   831                     staticbitmap = wx.StaticBitmap(id=-1, bitmap=wx.Bitmap(bitmappath),
   694                         name="%s_bitmap"%element_infos["name"], parent=self.ParamsPanel,
   832                         name="%s_bitmap"%element_infos["name"], parent=parent,
   695                         pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
   833                         pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
   696                     boxsizer.AddWindow(staticbitmap, 0, border=5, flag=wx.RIGHT)
   834                     boxsizer.AddWindow(staticbitmap, 0, border=5, flag=wx.RIGHT)
   697                 statictext = wx.StaticText(id=-1, label="%s:"%element_infos["name"], 
   835                 statictext = wx.StaticText(id=-1, label="%s:"%element_infos["name"], 
   698                     name="%s_label"%element_infos["name"], parent=self.ParamsPanel, 
   836                     name="%s_label"%element_infos["name"], parent=parent, 
   699                     pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
   837                     pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
   700                 boxsizer.AddWindow(statictext, 0, border=4, flag=wx.TOP)
   838                 boxsizer.AddWindow(statictext, 0, border=4, flag=wx.TOP)
   701                 id = wx.NewId()
   839                 id = wx.NewId()
   702                 choicectrl = wx.Choice(id=id, name=element_infos["name"], parent=self.ParamsPanel, 
   840                 choicectrl = wx.Choice(id=id, name=element_infos["name"], parent=parent, 
   703                     pos=wx.Point(0, 0), size=wx.Size(150, 25), style=0)
   841                     pos=wx.Point(0, 0), size=wx.Size(150, 25), style=0)
   704                 boxsizer.AddWindow(choicectrl, 0, border=0, flag=0)
   842                 boxsizer.AddWindow(choicectrl, 0, border=0, flag=0)
   705                 choicectrl.Append("")
   843                 choicectrl.Append("")
   706                 if len(element_infos["type"]) > 0 and isinstance(element_infos["type"][0], types.TupleType):
   844                 if len(element_infos["type"]) > 0 and isinstance(element_infos["type"][0], types.TupleType):
   707                     for choice, xsdclass in element_infos["type"]:
   845                     for choice, xsdclass in element_infos["type"]:
   708                         choicectrl.Append(choice)
   846                         choicectrl.Append(choice)
   709                     staticbox = wx.StaticBox(id=-1, label="%(name)s - %(value)s"%element_infos, 
   847                     staticbox = wx.StaticBox(id=-1, label="%(name)s - %(value)s"%element_infos, 
   710                         name='%s_staticbox'%element_infos["name"], parent=self.ParamsPanel,
   848                         name='%s_staticbox'%element_infos["name"], parent=parent,
   711                         pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
   849                         pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
   712                     staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
   850                     staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
   713                     sizer.AddSizer(staticboxsizer, 0, border=0, flag=wx.GROW)
   851                     sizer.AddSizer(staticboxsizer, 0, border=5, flag=wx.GROW|wx.BOTTOM)
   714                     self.RefreshSizerElement(staticboxsizer, element_infos["children"], element_path)
   852                     self.RefreshSizerElement(parent, staticboxsizer, element_infos["children"], element_path, selected)
   715                     callback = self.GetChoiceContentCallBackFunction(choicectrl, staticboxsizer, element_path)
   853                     callback = self.GetChoiceContentCallBackFunction(choicectrl, staticboxsizer, element_path, selected)
   716                 else:
   854                 else:
   717                     for choice in element_infos["type"]:
   855                     for choice in element_infos["type"]:
   718                         choicectrl.Append(choice)
   856                         choicectrl.Append(choice)
   719                     callback = self.GetChoiceCallBackFunction(choicectrl, element_path)
   857                     callback = self.GetChoiceCallBackFunction(choicectrl, element_path, selected)
   720                 if element_infos["value"]:
   858                 if element_infos["value"]:
   721                     choicectrl.SetStringSelection(element_infos["value"])
   859                     choicectrl.SetStringSelection(element_infos["value"])
   722                 choicectrl.Bind(wx.EVT_CHOICE, callback, id=id)
   860                 choicectrl.Bind(wx.EVT_CHOICE, callback, id=id)
   723             elif isinstance(element_infos["type"], types.DictType):
   861             elif isinstance(element_infos["type"], types.DictType):
   724                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
   862                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
   727                 else:
   865                 else:
   728                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   866                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   729                 bitmappath = os.path.join("images", "%s.png"%element_infos["name"])
   867                 bitmappath = os.path.join("images", "%s.png"%element_infos["name"])
   730                 if os.path.isfile(bitmappath):
   868                 if os.path.isfile(bitmappath):
   731                     staticbitmap = wx.StaticBitmap(id=-1, bitmap=wx.Bitmap(bitmappath),
   869                     staticbitmap = wx.StaticBitmap(id=-1, bitmap=wx.Bitmap(bitmappath),
   732                         name="%s_bitmap"%element_infos["name"], parent=self.ParamsPanel,
   870                         name="%s_bitmap"%element_infos["name"], parent=parent,
   733                         pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
   871                         pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
   734                     boxsizer.AddWindow(staticbitmap, 0, border=5, flag=wx.RIGHT)
   872                     boxsizer.AddWindow(staticbitmap, 0, border=5, flag=wx.RIGHT)
   735                 statictext = wx.StaticText(id=-1, label="%s:"%element_infos["name"], 
   873                 statictext = wx.StaticText(id=-1, label="%s:"%element_infos["name"], 
   736                     name="%s_label"%element_infos["name"], parent=self.ParamsPanel, 
   874                     name="%s_label"%element_infos["name"], parent=parent, 
   737                     pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
   875                     pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
   738                 boxsizer.AddWindow(statictext, 0, border=4, flag=wx.TOP)
   876                 boxsizer.AddWindow(statictext, 0, border=4, flag=wx.TOP)
   739                 id = wx.NewId()
   877                 id = wx.NewId()
   740                 scmin = -(2**31)
   878                 scmin = -(2**31)
   741                 scmax = 2**31-1
   879                 scmax = 2**31-1
   742                 if "min" in element_infos["type"]:
   880                 if "min" in element_infos["type"]:
   743                     scmin = element_infos["type"]["min"]
   881                     scmin = element_infos["type"]["min"]
   744                 if "max" in element_infos["type"]:
   882                 if "max" in element_infos["type"]:
   745                     scmax = element_infos["type"]["max"]
   883                     scmax = element_infos["type"]["max"]
   746                 spinctrl = wx.SpinCtrl(id=id, name=element_infos["name"], parent=self.ParamsPanel, 
   884                 spinctrl = wx.SpinCtrl(id=id, name=element_infos["name"], parent=parent, 
   747                     pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
   885                     pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
   748                 spinctrl.SetRange(scmin,scmax)
   886                 spinctrl.SetRange(scmin,scmax)
   749                 boxsizer.AddWindow(spinctrl, 0, border=0, flag=0)
   887                 boxsizer.AddWindow(spinctrl, 0, border=0, flag=0)
   750                 spinctrl.SetValue(element_infos["value"])
   888                 spinctrl.SetValue(element_infos["value"])
   751                 spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, element_path), id=id)
   889                 spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, element_path, selected), id=id)
   752             elif element_infos["type"] == "element":
   890             elif element_infos["type"] == "element":
   753                 staticbox = wx.StaticBox(id=-1, label=element_infos["name"], 
   891                 staticbox = wx.StaticBox(id=-1, label=element_infos["name"], 
   754                     name='%s_staticbox'%element_infos["name"], parent=self.ParamsPanel,
   892                     name='%s_staticbox'%element_infos["name"], parent=parent,
   755                     pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
   893                     pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
   756                 staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
   894                 staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
   757                 if first:
   895                 if first:
   758                     sizer.AddSizer(staticboxsizer, 0, border=0, flag=wx.GROW|wx.TOP)
   896                     sizer.AddSizer(staticboxsizer, 0, border=0, flag=wx.GROW|wx.TOP)
   759                 else:
   897                 else:
   760                     sizer.AddSizer(staticboxsizer, 0, border=0, flag=wx.GROW)
   898                     sizer.AddSizer(staticboxsizer, 0, border=0, flag=wx.GROW)
   761                 self.RefreshSizerElement(staticboxsizer, element_infos["children"], element_path)
   899                 self.RefreshSizerElement(parent, staticboxsizer, element_infos["children"], element_path, selected)
   762             else:
   900             else:
   763                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
   901                 boxsizer = wx.BoxSizer(wx.HORIZONTAL)
   764                 if first:
   902                 if first:
   765                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.ALL)
   903                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.ALL)
   766                 else:
   904                 else:
   767                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   905                     sizer.AddSizer(boxsizer, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   768                 bitmappath = os.path.join("images", "%s.png"%element_infos["name"])
   906                 bitmappath = os.path.join("images", "%s.png"%element_infos["name"])
   769                 if os.path.isfile(bitmappath):
   907                 if os.path.isfile(bitmappath):
   770                     staticbitmap = wx.StaticBitmap(id=-1, bitmap=wx.Bitmap(bitmappath),
   908                     staticbitmap = wx.StaticBitmap(id=-1, bitmap=wx.Bitmap(bitmappath),
   771                         name="%s_bitmap"%element_infos["name"], parent=self.ParamsPanel,
   909                         name="%s_bitmap"%element_infos["name"], parent=parent,
   772                         pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
   910                         pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
   773                     boxsizer.AddWindow(staticbitmap, 0, border=5, flag=wx.RIGHT)
   911                     boxsizer.AddWindow(staticbitmap, 0, border=5, flag=wx.RIGHT)
   774                 statictext = wx.StaticText(id=-1, label="%s:"%element_infos["name"], 
   912                 statictext = wx.StaticText(id=-1, label="%s:"%element_infos["name"], 
   775                     name="%s_label"%element_infos["name"], parent=self.ParamsPanel, 
   913                     name="%s_label"%element_infos["name"], parent=parent, 
   776                     pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
   914                     pos=wx.Point(0, 0), size=wx.Size(100, 17), style=0)
   777                 boxsizer.AddWindow(statictext, 0, border=4, flag=wx.TOP)
   915                 boxsizer.AddWindow(statictext, 0, border=4, flag=wx.TOP)
   778                 id = wx.NewId()
   916                 id = wx.NewId()
   779                 if element_infos["type"] == "boolean":
   917                 if element_infos["type"] == "boolean":
   780                     checkbox = wx.CheckBox(id=id, name=element_infos["name"], parent=self.ParamsPanel, 
   918                     checkbox = wx.CheckBox(id=id, name=element_infos["name"], parent=parent, 
   781                         pos=wx.Point(0, 0), size=wx.Size(17, 25), style=0)
   919                         pos=wx.Point(0, 0), size=wx.Size(17, 25), style=0)
   782                     boxsizer.AddWindow(checkbox, 0, border=0, flag=0)
   920                     boxsizer.AddWindow(checkbox, 0, border=0, flag=0)
   783                     checkbox.SetValue(element_infos["value"])
   921                     checkbox.SetValue(element_infos["value"])
   784                     checkbox.Bind(wx.EVT_CHECKBOX, self.GetCheckBoxCallBackFunction(checkbox, element_path), id=id)
   922                     checkbox.Bind(wx.EVT_CHECKBOX, self.GetCheckBoxCallBackFunction(checkbox, element_path, selected), id=id)
   785                 elif element_infos["type"] in ["unsignedLong", "long","integer"]:
   923                 elif element_infos["type"] in ["unsignedLong", "long","integer"]:
   786                     if element_infos["type"].startswith("unsigned"):
   924                     if element_infos["type"].startswith("unsigned"):
   787                         scmin = 0
   925                         scmin = 0
   788                     else:
   926                     else:
   789                         scmin = -(2**31)
   927                         scmin = -(2**31)
   790                     scmax = 2**31-1
   928                     scmax = 2**31-1
   791                     spinctrl = wx.SpinCtrl(id=id, name=element_infos["name"], parent=self.ParamsPanel, 
   929                     spinctrl = wx.SpinCtrl(id=id, name=element_infos["name"], parent=parent, 
   792                         pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
   930                         pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
   793                     spinctrl.SetRange(scmin, scmax)
   931                     spinctrl.SetRange(scmin, scmax)
   794                     boxsizer.AddWindow(spinctrl, 0, border=0, flag=0)
   932                     boxsizer.AddWindow(spinctrl, 0, border=0, flag=0)
   795                     spinctrl.SetValue(element_infos["value"])
   933                     spinctrl.SetValue(element_infos["value"])
   796                     spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, element_path), id=id)
   934                     spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, element_path, selected), id=id)
   797                 else:
   935                 else:
   798                     textctrl = wx.TextCtrl(id=id, name=element_infos["name"], parent=self.ParamsPanel, 
   936                     textctrl = wx.TextCtrl(id=id, name=element_infos["name"], parent=parent, 
   799                         pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.TE_PROCESS_ENTER)
   937                         pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.TE_PROCESS_ENTER)
   800                     boxsizer.AddWindow(textctrl, 0, border=0, flag=0)
   938                     boxsizer.AddWindow(textctrl, 0, border=0, flag=0)
   801                     textctrl.SetValue(str(element_infos["value"]))
   939                     textctrl.SetValue(str(element_infos["value"]))
   802                     textctrl.Bind(wx.EVT_TEXT_ENTER, self.GetTextCtrlCallBackFunction(textctrl, element_path), id=id)
   940                     textctrl.Bind(wx.EVT_TEXT_ENTER, self.GetTextCtrlCallBackFunction(textctrl, element_path, selected), id=id)
   803                     textctrl.Bind(wx.EVT_KILL_FOCUS, self.GetTextCtrlCallBackFunction(textctrl, element_path))
   941                     textctrl.Bind(wx.EVT_KILL_FOCUS, self.GetTextCtrlCallBackFunction(textctrl, element_path, selected))
   804             first = False
   942             first = False
   805     
   943     
   806     def OnNewProjectMenu(self, event):
   944     def OnNewProjectMenu(self, event):
   807         defaultpath = self.PluginRoot.GetProjectPath()
   945         defaultpath = self.PluginRoot.GetProjectPath()
   808         if not defaultpath:
   946         if not defaultpath:
   812             projectpath = dialog.GetPath()
   950             projectpath = dialog.GetPath()
   813             dialog.Destroy()
   951             dialog.Destroy()
   814             res = self.PluginRoot.NewProject(projectpath)
   952             res = self.PluginRoot.NewProject(projectpath)
   815             if not res :
   953             if not res :
   816                 self.RefreshPluginTree()
   954                 self.RefreshPluginTree()
       
   955                 self.RefreshPluginToolBar()
   817                 self.RefreshButtons()
   956                 self.RefreshButtons()
   818                 self.RefreshMainMenu()
   957                 self.RefreshMainMenu()
   819             else:
   958             else:
   820                 message = wx.MessageDialog(self, res, "ERROR", wx.OK|wx.ICON_ERROR)
   959                 message = wx.MessageDialog(self, res, "ERROR", wx.OK|wx.ICON_ERROR)
   821                 message.ShowModal()
   960                 message.ShowModal()
   831             projectpath = dialog.GetPath()
   970             projectpath = dialog.GetPath()
   832             if os.path.isdir(projectpath):
   971             if os.path.isdir(projectpath):
   833                 result = self.PluginRoot.LoadProject(projectpath, self.Log)
   972                 result = self.PluginRoot.LoadProject(projectpath, self.Log)
   834                 if not result:
   973                 if not result:
   835                     self.RefreshPluginTree()
   974                     self.RefreshPluginTree()
       
   975                     self.RefreshPluginToolBar()
   836                     self.PluginTree.SelectItem(self.PluginTree.GetRootItem())
   976                     self.PluginTree.SelectItem(self.PluginTree.GetRootItem())
   837                     self.RefreshButtons()
   977                     self.RefreshButtons()
   838                     self.RefreshMainMenu()
   978                     self.RefreshMainMenu()
   839                 else:
   979                 else:
   840                     message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
   980                     message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
   846                 message.Destroy()
   986                 message.Destroy()
   847             dialog.Destroy()
   987             dialog.Destroy()
   848         event.Skip()
   988         event.Skip()
   849     
   989     
   850     def OnCloseProjectMenu(self, event):
   990     def OnCloseProjectMenu(self, event):
   851         self.PLCManager = None
   991         self.RefreshPluginTree()
       
   992         self.RefreshPluginToolBar()
   852         self.RefreshButtons()
   993         self.RefreshButtons()
   853         self.RefreshMainMenu()
   994         self.RefreshMainMenu()
   854         event.Skip()
   995         event.Skip()
   855     
   996     
   856     def OnSaveProjectMenu(self, event):
   997     def OnSaveProjectMenu(self, event):
   908     
  1049     
   909     def CloseEditor(self, bus_id):
  1050     def CloseEditor(self, bus_id):
   910         if self.BusManagers.get(bus_id, None) != None:
  1051         if self.BusManagers.get(bus_id, None) != None:
   911             self.BusManagers[bus_id]["Editor"] = None
  1052             self.BusManagers[bus_id]["Editor"] = None
   912     
  1053     
   913     def AddPlugin(self, PluginType):
  1054     def GetAddButtonFunction(self, item):
       
  1055         def AddButtonFunction(event):
       
  1056             plugin = self.GetSelectedPlugin(item)
       
  1057             if plugin and len(plugin.PlugChildsTypes) > 0:
       
  1058                 plugin_menu = wx.Menu(title='')
       
  1059                 for name, XSDClass in plugin.PlugChildsTypes:
       
  1060                     new_id = wx.NewId()
       
  1061                     plugin_menu.Append(help='', id=new_id, kind=wx.ITEM_NORMAL, text=name)
       
  1062                     self.Bind(wx.EVT_MENU, self._GetAddPluginFunction(name, item), id=new_id)
       
  1063                 rect = self.PluginTree.GetBoundingRect(item, True)
       
  1064                 wx.CallAfter(self.PluginTree.PopupMenuXY, plugin_menu, rect.x + rect.width, rect.y)
       
  1065             event.Skip()
       
  1066         return AddButtonFunction
       
  1067     
       
  1068     def GetDeleteButtonFunction(self, item):
       
  1069         def DeleteButtonFunction(event):
       
  1070             wx.CallAfter(self.DeletePlugin, item)
       
  1071             event.Skip()
       
  1072         return DeleteButtonFunction
       
  1073     
       
  1074     def AddPlugin(self, PluginType, selected = None):
   914         dialog = wx.TextEntryDialog(self, "Please enter a name for plugin:", "Add Plugin", "", wx.OK|wx.CANCEL)
  1075         dialog = wx.TextEntryDialog(self, "Please enter a name for plugin:", "Add Plugin", "", wx.OK|wx.CANCEL)
   915         if dialog.ShowModal() == wx.ID_OK:
  1076         if dialog.ShowModal() == wx.ID_OK:
   916             PluginName = dialog.GetValue()
  1077             PluginName = dialog.GetValue()
   917             plugin = self.GetSelectedPlugin()
  1078             plugin = self.GetSelectedPlugin(selected)
   918             plugin.PlugAddChild(PluginName, PluginType, self.Log)
  1079             plugin.PlugAddChild(PluginName, PluginType, self.Log)
   919             self.RefreshPluginTree()
  1080             self.RefreshPluginTree()
   920         dialog.Destroy()
  1081         dialog.Destroy()
   921     
  1082     
   922     def DeletePlugin(self):
  1083     def DeletePlugin(self, selected = None):
   923         dialog = wx.MessageDialog(self, "Really delete plugin ?", "Remove plugin", wx.YES_NO|wx.NO_DEFAULT)
  1084         dialog = wx.MessageDialog(self, "Really delete plugin ?", "Remove plugin", wx.YES_NO|wx.NO_DEFAULT)
   924         if dialog.ShowModal() == wx.ID_YES:
  1085         if dialog.ShowModal() == wx.ID_YES:
   925             plugin = self.GetSelectedPlugin()
  1086             plugin = self.GetSelectedPlugin(selected)
   926             plugin.PlugRemove()
  1087             plugin.PlugRemove()
   927             del plugin
  1088             del plugin
   928             self.RefreshPluginTree()
  1089             self.RefreshPluginTree()
   929         dialog.Destroy()
  1090         dialog.Destroy()
   930 
  1091