Beremiz.py
changeset 118 185d0d371ea4
parent 117 32099ee16154
child 119 f3819d2e8eff
equal deleted inserted replaced
117:32099ee16154 118:185d0d371ea4
    66 from plugger import PluginsRoot
    66 from plugger import PluginsRoot
    67 
    67 
    68 SCROLLBAR_UNIT = 10
    68 SCROLLBAR_UNIT = 10
    69 WINDOW_COLOUR = wx.Colour(240,240,240)
    69 WINDOW_COLOUR = wx.Colour(240,240,240)
    70 TITLE_COLOUR = wx.Colour(200,200,220)
    70 TITLE_COLOUR = wx.Colour(200,200,220)
       
    71 CHANGED_TITLE_COLOUR = wx.Colour(220,200,220)
       
    72 CHANGED_WINDOW_COLOUR = wx.Colour(255,240,240)
    71 
    73 
    72 if wx.Platform == '__WXMSW__':
    74 if wx.Platform == '__WXMSW__':
    73     faces = { 'times': 'Times New Roman',
    75     faces = { 'times': 'Times New Roman',
    74               'mono' : 'Courier New',
    76               'mono' : 'Courier New',
    75               'helv' : 'Arial',
    77               'helv' : 'Arial',
   320               style=wx.DEFAULT_FRAME_STYLE|wx.CLIP_CHILDREN, title=u'Beremiz')
   322               style=wx.DEFAULT_FRAME_STYLE|wx.CLIP_CHILDREN, title=u'Beremiz')
   321         self._init_utils()
   323         self._init_utils()
   322         self.SetClientSize(wx.Size(1000, 600))
   324         self.SetClientSize(wx.Size(1000, 600))
   323         self.SetMenuBar(self.menuBar1)
   325         self.SetMenuBar(self.menuBar1)
   324         self.Bind(wx.EVT_ACTIVATE, self.OnFrameActivated)
   326         self.Bind(wx.EVT_ACTIVATE, self.OnFrameActivated)
       
   327         self.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
   325         
   328         
   326         if wx.VERSION < (2, 8, 0):
   329         if wx.VERSION < (2, 8, 0):
   327             self.MainSplitter = wx.SplitterWindow(id=ID_BEREMIZMAINSPLITTER,
   330             self.MainSplitter = wx.SplitterWindow(id=ID_BEREMIZMAINSPLITTER,
   328                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   331                   name='MainSplitter', parent=self, point=wx.Point(0, 0),
   329                   size=wx.Size(0, 0), style=wx.SP_3D)
   332                   size=wx.Size(0, 0), style=wx.SP_3D)
   382             self.PluginRoot.LoadProject(projectOpen, self.Log)
   385             self.PluginRoot.LoadProject(projectOpen, self.Log)
   383             self.RefreshPLCParams()
   386             self.RefreshPLCParams()
   384             self.RefreshPluginTree()
   387             self.RefreshPluginTree()
   385         
   388         
   386         self.RefreshMainMenu()
   389         self.RefreshMainMenu()
       
   390 
       
   391     def OnCloseFrame(self, event):
       
   392         if self.PluginRoot.HasProjectOpened():
       
   393             if self.PluginRoot.runningPLC is not None:
       
   394                 wx.MessageBox("Please stop any running PLC before closing")
       
   395                 event.Veto()
       
   396                 return
       
   397             if self.PluginRoot.ProjectTestModified():
       
   398                 self.PluginRoot.SaveProject()
       
   399                 wx.MessageBox("Project saved")
       
   400         event.Skip()
   387     
   401     
   388     def OnMoveWindow(self, event):
   402     def OnMoveWindow(self, event):
   389         self.GetBestSize()
   403         self.GetBestSize()
   390         self.RefreshScrollBars()
   404         self.RefreshScrollBars()
   391         event.Skip()
   405         event.Skip()
   420 
   434 
   421     def RefreshPLCParams(self):
   435     def RefreshPLCParams(self):
   422         self.Freeze()
   436         self.Freeze()
   423         self.ClearSizer(self.PLCParamsSizer)
   437         self.ClearSizer(self.PLCParamsSizer)
   424         
   438         
   425         if self.PluginRoot.HasProjectOpened():
   439         if self.PluginRoot.HasProjectOpened():    
   426             plcwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
   440             plcwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
       
   441             if self.PluginRoot.PlugTestModified():
       
   442                 bkgdclr = CHANGED_TITLE_COLOUR
       
   443             else:
       
   444                 bkgdclr = TITLE_COLOUR
   427             plcwindow.SetBackgroundColour(TITLE_COLOUR)
   445             plcwindow.SetBackgroundColour(TITLE_COLOUR)
   428             self.PLCParamsSizer.AddWindow(plcwindow, 0, border=0, flag=wx.GROW)
   446             self.PLCParamsSizer.AddWindow(plcwindow, 0, border=0, flag=wx.GROW)
   429             
   447             
   430             plcwindowsizer = wx.BoxSizer(wx.HORIZONTAL)
   448             plcwindowsizer = wx.BoxSizer(wx.HORIZONTAL)
   431             plcwindow.SetSizer(plcwindowsizer)
   449             plcwindow.SetSizer(plcwindowsizer)
   492                 self.PLCConfigMainSizer.Layout()
   510                 self.PLCConfigMainSizer.Layout()
   493                 self.RefreshScrollBars()
   511                 self.RefreshScrollBars()
   494                 event.Skip()
   512                 event.Skip()
   495             minimizebutton.Bind(wx.EVT_BUTTON, togglewindow, id=minimizebutton_id)
   513             minimizebutton.Bind(wx.EVT_BUTTON, togglewindow, id=minimizebutton_id)
   496         
   514         
       
   515             self.PluginInfos[self.PluginRoot] = {"main" : plcwindow, "params" : paramswindow}
       
   516             
   497         self.PLCConfigMainSizer.Layout()
   517         self.PLCConfigMainSizer.Layout()
   498         self.RefreshScrollBars()
   518         self.RefreshScrollBars()
   499         self.Thaw()
   519         self.Thaw()
   500 
   520 
   501 #    def GenerateAddButtonSizer(self, plugin, parent, horizontal = True):
   521 #    def GenerateAddButtonSizer(self, plugin, parent, horizontal = True):
   539 
   559 
   540     def RefreshPluginTree(self):
   560     def RefreshPluginTree(self):
   541         self.Freeze()
   561         self.Freeze()
   542         self.ClearSizer(self.PluginTreeSizer)
   562         self.ClearSizer(self.PluginTreeSizer)
   543         if self.PluginRoot.HasProjectOpened():
   563         if self.PluginRoot.HasProjectOpened():
   544             index = [0]
       
   545             for child in self.PluginRoot.IECSortedChilds():
   564             for child in self.PluginRoot.IECSortedChilds():
   546                 self.GenerateTreeBranch(child, index)
   565                 self.GenerateTreeBranch(child)
   547                 if not self.PluginInfos[child]["expanded"]:
   566                 if not self.PluginInfos[child]["expanded"]:
   548                     self.CollapsePlugin(child)
   567                     self.CollapsePlugin(child)
   549         self.PLCConfigMainSizer.Layout()
   568         self.PLCConfigMainSizer.Layout()
   550         self.RefreshScrollBars()
   569         self.RefreshScrollBars()
   551         self.Thaw()
   570         self.Thaw()
   552 
   571 
       
   572     def SetPluginParamsAttribute(self, plugin, *args, **kwargs):
       
   573         res, StructChanged = plugin.SetParamsAttribute(*args, **kwargs)
       
   574         if StructChanged:
       
   575             wx.CallAfter(self.RefreshPluginTree)
       
   576         else:
       
   577             if plugin == self.PluginRoot:
       
   578                 bkgdclr = CHANGED_TITLE_COLOUR
       
   579                 items = ["main", "params"]
       
   580             else:
       
   581                 bkgdclr = CHANGED_WINDOW_COLOUR
       
   582                 items = ["left", "middle", "params"]
       
   583             for i in items:
       
   584                 self.PluginInfos[plugin][i].SetBackgroundColour(bkgdclr)
       
   585                 self.PluginInfos[plugin][i].Refresh()
       
   586         return res
       
   587 
   553     def ExpandPlugin(self, plugin, force = False):
   588     def ExpandPlugin(self, plugin, force = False):
   554         for child in self.PluginInfos[plugin]["children"]:
   589         for child in self.PluginInfos[plugin]["children"]:
   555             self.PluginTreeSizer.Show(self.PluginInfos[child]["left"])
   590             self.PluginInfos[child]["left"].Show()
   556             self.PluginTreeSizer.Show(self.PluginInfos[child]["middle"])
   591             self.PluginInfos[child]["middle"].Show()
   557 #            self.PluginTreeSizer.Show(self.PluginInfos[child]["right"])
   592 #            self.PluginTreeSizer.Show(self.PluginInfos[child]["right"])
   558             if force or not self.PluginInfos[child]["expanded"]:
   593             if force or not self.PluginInfos[child]["expanded"]:
   559                 self.ExpandPlugin(child, force)
   594                 self.ExpandPlugin(child, force)
   560                 if force:
   595                 if force:
   561                     self.PluginInfos[child]["expanded"] = True
   596                     self.PluginInfos[child]["expanded"] = True
   562     
   597     
   563     def CollapsePlugin(self, plugin, force = False):
   598     def CollapsePlugin(self, plugin, force = False):
   564         for child in self.PluginInfos[plugin]["children"]:
   599         for child in self.PluginInfos[plugin]["children"]:
   565             self.PluginTreeSizer.Hide(self.PluginInfos[child]["left"])
   600             self.PluginInfos[child]["left"].Hide()
   566             self.PluginTreeSizer.Hide(self.PluginInfos[child]["middle"])
   601             self.PluginInfos[child]["middle"].Hide()
   567 #            self.PluginTreeSizer.Hide(self.PluginInfos[child]["right"])
   602 #            self.PluginTreeSizer.Hide(self.PluginInfos[child]["right"])
   568             if force or self.PluginInfos[child]["expanded"]:
   603             if force or self.PluginInfos[child]["expanded"]:
   569                 self.CollapsePlugin(child, force)
   604                 self.CollapsePlugin(child, force)
   570                 if force:
   605                 if force:
   571                     self.PluginInfos[child]["expanded"] = False
   606                     self.PluginInfos[child]["expanded"] = False
   572 
   607 
   573     def GenerateTreeBranch(self, plugin, index):
   608     def GenerateTreeBranch(self, plugin):
   574         leftwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
   609         leftwindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
   575         leftwindow.SetBackgroundColour(WINDOW_COLOUR)
   610         if plugin.PlugTestModified():
       
   611             bkgdclr=CHANGED_WINDOW_COLOUR
       
   612         else:
       
   613             bkgdclr=WINDOW_COLOUR
       
   614 
       
   615         leftwindow.SetBackgroundColour(bkgdclr)
   576         
   616         
   577         if plugin not in self.PluginInfos:
   617         if plugin not in self.PluginInfos:
   578             self.PluginInfos[plugin] = {"expanded" : False, "left_visible" : False, "middle_visible" : False}
   618             self.PluginInfos[plugin] = {"expanded" : False, "left_visible" : False, "middle_visible" : False}
   579             
   619             
   580         self.PluginInfos[plugin]["children"] = plugin.IECSortedChilds()
   620         self.PluginInfos[plugin]["children"] = plugin.IECSortedChilds()
   605         enablebutton.SetToolTipString("Enable/Disable this plugin")
   645         enablebutton.SetToolTipString("Enable/Disable this plugin")
   606         make_genbitmaptogglebutton_flat(enablebutton)
   646         make_genbitmaptogglebutton_flat(enablebutton)
   607         enablebutton.SetBitmapSelected(wx.Bitmap(os.path.join(CWD, 'images', 'Enabled.png')))
   647         enablebutton.SetBitmapSelected(wx.Bitmap(os.path.join(CWD, 'images', 'Enabled.png')))
   608         enablebutton.SetToggle(plugin.MandatoryParams[1].getEnabled())
   648         enablebutton.SetToggle(plugin.MandatoryParams[1].getEnabled())
   609         def toggleenablebutton(event):
   649         def toggleenablebutton(event):
   610             res, StructChanged = plugin.SetParamsAttribute("BaseParams.Enabled", enablebutton.GetToggle(), self.Log)
   650             res = self.SetPluginParamsAttribute(plugin, "BaseParams.Enabled", enablebutton.GetToggle(), self.Log)
   611             if StructChanged: wx.CallAfter(self.RefreshPluginTree)
       
   612             enablebutton.SetToggle(res)
   651             enablebutton.SetToggle(res)
   613             event.Skip()
   652             event.Skip()
   614         enablebutton.Bind(wx.EVT_BUTTON, toggleenablebutton, id=enablebutton_id)
   653         enablebutton.Bind(wx.EVT_BUTTON, toggleenablebutton, id=enablebutton_id)
   615         rolesizer.AddWindow(enablebutton, 0, border=0, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
   654         rolesizer.AddWindow(enablebutton, 0, border=0, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
   616 
   655 
   688                 event.Skip()
   727                 event.Skip()
   689             expandbutton.Bind(wx.EVT_BUTTON, togglebutton, id=expandbutton_id)
   728             expandbutton.Bind(wx.EVT_BUTTON, togglebutton, id=expandbutton_id)
   690             leftbuttonsizer.AddWindow(expandbutton, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
   729             leftbuttonsizer.AddWindow(expandbutton, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
   691         
   730         
   692         tc_id = wx.NewId()
   731         tc_id = wx.NewId()
   693         tc = wx.TextCtrl(leftwindow, tc_id, size=wx.Size(150, 35), style=wx.TE_PROCESS_ENTER|wx.NO_BORDER)
   732         tc = wx.TextCtrl(leftwindow, tc_id, size=wx.Size(150, 35), style=wx.NO_BORDER)
   694         tc.SetFont(wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"]))
   733         tc.SetFont(wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, wx.BOLD, faceName = faces["helv"]))
   695         tc.SetValue(plugin.MandatoryParams[1].getName())
   734         tc.SetValue(plugin.MandatoryParams[1].getName())
   696         tc.Bind(wx.EVT_TEXT_ENTER, self.GetTextCtrlCallBackFunction(tc, plugin, "BaseParams.Name"), id=tc_id)
   735         tc.Bind(wx.EVT_KILL_FOCUS, self.GetTextCtrlCallBackFunction(tc, plugin, "BaseParams.Name"), id=tc_id)
   697         leftbuttonsizer.AddWindow(tc, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
   736         leftbuttonsizer.AddWindow(tc, 0, border=5, flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
   698        
   737        
   699 
   738 
   700         leftminimizebutton_id = wx.NewId()
   739         leftminimizebutton_id = wx.NewId()
   701         leftminimizebutton = wx.lib.buttons.GenBitmapToggleButton(id=leftminimizebutton_id, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'ShowVars.png')),
   740         leftminimizebutton = wx.lib.buttons.GenBitmapToggleButton(id=leftminimizebutton_id, bitmap=wx.Bitmap(os.path.join(CWD, 'images', 'ShowVars.png')),
   724             lb.Hide()
   763             lb.Hide()
   725         self.PluginInfos[plugin]["variable_list"] = lb
   764         self.PluginInfos[plugin]["variable_list"] = lb
   726         leftwindowsizer.AddWindow(lb, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   765         leftwindowsizer.AddWindow(lb, 0, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
   727 
   766 
   728         middlewindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
   767         middlewindow = wx.Panel(self.PLCConfig, -1, size=wx.Size(-1, -1))
   729         middlewindow.SetBackgroundColour(wx.Colour(240,240,240))
   768         middlewindow.SetBackgroundColour(bkgdclr)
   730         
   769         
   731         self.PluginTreeSizer.AddWindow(middlewindow, 0, border=0, flag=wx.GROW)
   770         self.PluginTreeSizer.AddWindow(middlewindow, 0, border=0, flag=wx.GROW)
   732         
   771         
   733         middlewindowmainsizer = wx.BoxSizer(wx.VERTICAL)
   772         middlewindowmainsizer = wx.BoxSizer(wx.VERTICAL)
   734         middlewindow.SetSizer(middlewindowmainsizer)
   773         middlewindow.SetSizer(middlewindowmainsizer)
   743         
   782         
   744         middleparamssizer = wx.BoxSizer(wx.HORIZONTAL)
   783         middleparamssizer = wx.BoxSizer(wx.HORIZONTAL)
   745         middlewindowsizer.AddSizer(middleparamssizer, 0, border=0, flag=wx.ALIGN_RIGHT)
   784         middlewindowsizer.AddSizer(middleparamssizer, 0, border=0, flag=wx.ALIGN_RIGHT)
   746         
   785         
   747         paramswindow = wx.Panel(middlewindow, -1, size=wx.Size(-1, -1))
   786         paramswindow = wx.Panel(middlewindow, -1, size=wx.Size(-1, -1))
   748         paramswindow.SetBackgroundColour(WINDOW_COLOUR)
   787         paramswindow.SetBackgroundColour(bkgdclr)
   749         
   788         
   750         psizer = wx.BoxSizer(wx.HORIZONTAL)
   789         psizer = wx.BoxSizer(wx.HORIZONTAL)
   751         paramswindow.SetSizer(psizer)
   790         paramswindow.SetSizer(psizer)
       
   791         self.PluginInfos[plugin]["params"] = paramswindow
   752         
   792         
   753         middleparamssizer.AddWindow(paramswindow, 0, border=5, flag=wx.ALL)
   793         middleparamssizer.AddWindow(paramswindow, 0, border=5, flag=wx.ALL)
   754         
   794         
   755         plugin_infos = plugin.GetParamsAttributes()
   795         plugin_infos = plugin.GetParamsAttributes()
   756         self.RefreshSizerElement(paramswindow, psizer, plugin, plugin_infos, None, False)
   796         self.RefreshSizerElement(paramswindow, psizer, plugin, plugin_infos, None, False)
   799             self.PLCConfigMainSizer.Layout()
   839             self.PLCConfigMainSizer.Layout()
   800             self.RefreshScrollBars()
   840             self.RefreshScrollBars()
   801             event.Skip()
   841             event.Skip()
   802         middleminimizebutton.Bind(wx.EVT_BUTTON, togglemiddlerightwindow, id=middleminimizebutton_id)
   842         middleminimizebutton.Bind(wx.EVT_BUTTON, togglemiddlerightwindow, id=middleminimizebutton_id)
   803         
   843         
   804         self.PluginInfos[plugin]["left"] = index[0]
   844         self.PluginInfos[plugin]["left"] = leftwindow
   805         self.PluginInfos[plugin]["middle"] = index[0] + 1
   845         self.PluginInfos[plugin]["middle"] = middlewindow
   806 #        self.PluginInfos[plugin]["right"] = index[0] + 2
   846 #        self.PluginInfos[plugin]["right"] = rightwindow
   807 #        index[0] += 3
       
   808         index[0] += 2
       
   809         for child in self.PluginInfos[plugin]["children"]:
   847         for child in self.PluginInfos[plugin]["children"]:
   810             self.GenerateTreeBranch(child, index)
   848             self.GenerateTreeBranch(child)
   811             if not self.PluginInfos[child]["expanded"]:
   849             if not self.PluginInfos[child]["expanded"]:
   812                 self.CollapsePlugin(child)
   850                 self.CollapsePlugin(child)
   813 
   851 
   814     def RefreshVariableLists(self):
   852     def RefreshVariableLists(self):
   815         for plugin, infos in self.PluginInfos.items():
   853         for plugin, infos in self.PluginInfos.items():
   825         self.RefreshPLCParams()
   863         self.RefreshPLCParams()
   826         self.RefreshPluginTree()
   864         self.RefreshPluginTree()
   827         
   865         
   828     def GetItemChannelChangedFunction(self, plugin, value):
   866     def GetItemChannelChangedFunction(self, plugin, value):
   829         def OnPluginTreeItemChannelChanged(event):
   867         def OnPluginTreeItemChannelChanged(event):
   830             res, StructChanged = plugin.SetParamsAttribute("BaseParams.IEC_Channel", value, self.Log)
   868             res = self.SetPluginParamsAttribute(plugin, "BaseParams.IEC_Channel", value, self.Log)
   831             wx.CallAfter(self.RefreshPluginTree)
       
   832             event.Skip()
   869             event.Skip()
   833         return OnPluginTreeItemChannelChanged
   870         return OnPluginTreeItemChannelChanged
   834     
   871     
   835     def _GetAddPluginFunction(self, name, plugin):
   872     def _GetAddPluginFunction(self, name, plugin):
   836         def OnPluginMenu(event):
   873         def OnPluginMenu(event):
   864             event.Skip()
   901             event.Skip()
   865         return OnButtonClick
   902         return OnButtonClick
   866     
   903     
   867     def GetChoiceCallBackFunction(self, choicectrl, plugin, path):
   904     def GetChoiceCallBackFunction(self, choicectrl, plugin, path):
   868         def OnChoiceChanged(event):
   905         def OnChoiceChanged(event):
   869             res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log)
   906             res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection(), self.Log)
   870             if StructChanged: wx.CallAfter(self.RefreshPluginTree)
       
   871             choicectrl.SetStringSelection(res)
   907             choicectrl.SetStringSelection(res)
   872             event.Skip()
   908             event.Skip()
   873         return OnChoiceChanged
   909         return OnChoiceChanged
   874     
   910     
   875     def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, plugin, path):
   911     def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, plugin, path):
   876         def OnChoiceContentChanged(event):
   912         def OnChoiceContentChanged(event):
   877             res, StructChanged = plugin.SetParamsAttribute(path, choicectrl.GetStringSelection(), self.Log)
   913             res = self.SetPluginParamsAttribute(plugin, path, choicectrl.GetStringSelection(), self.Log)
   878             if StructChanged: wx.CallAfter(self.RefreshPluginTree)
       
   879             choicectrl.SetStringSelection(res)
   914             choicectrl.SetStringSelection(res)
   880             infos = self.PluginRoot.GetParamsAttributes(path)
   915             infos = self.PluginRoot.GetParamsAttributes(path)
   881             staticbox = staticboxsizer.GetStaticBox()
   916             staticbox = staticboxsizer.GetStaticBox()
   882             staticbox.SetLabel("%(name)s - %(value)s"%infos)
   917             staticbox.SetLabel("%(name)s - %(value)s"%infos)
   883             if wx.VERSION < (2, 8, 0):
   918             if wx.VERSION < (2, 8, 0):
   891             event.Skip()
   926             event.Skip()
   892         return OnChoiceContentChanged
   927         return OnChoiceContentChanged
   893     
   928     
   894     def GetTextCtrlCallBackFunction(self, textctrl, plugin, path):
   929     def GetTextCtrlCallBackFunction(self, textctrl, plugin, path):
   895         def OnTextCtrlChanged(event):
   930         def OnTextCtrlChanged(event):
   896             res, StructChanged = plugin.SetParamsAttribute(path, textctrl.GetValue(), self.Log)
   931             res = self.SetPluginParamsAttribute(plugin, path, textctrl.GetValue(), self.Log)
   897             if StructChanged: wx.CallAfter(self.RefreshPluginTree)
       
   898             textctrl.SetValue(res)
   932             textctrl.SetValue(res)
   899             event.Skip()
   933             event.Skip()
   900         return OnTextCtrlChanged
   934         return OnTextCtrlChanged
   901     
   935     
   902     def GetCheckBoxCallBackFunction(self, chkbx, plugin, path):
   936     def GetCheckBoxCallBackFunction(self, chkbx, plugin, path):
   903         def OnCheckBoxChanged(event):
   937         def OnCheckBoxChanged(event):
   904             res, StructChanged = plugin.SetParamsAttribute(path, chkbx.IsChecked(), self.Log)
   938             res = self.SetPluginParamsAttribute(plugin, path, chkbx.IsChecked(), self.Log)
   905             if StructChanged: wx.CallAfter(self.RefreshPluginTree)
       
   906             chkbx.SetValue(res)
   939             chkbx.SetValue(res)
   907             event.Skip()
   940             event.Skip()
   908         return OnCheckBoxChanged
   941         return OnCheckBoxChanged
   909     
   942     
   910     def ClearSizer(self, sizer):
   943     def ClearSizer(self, sizer):
  1038                     boxsizer.AddWindow(spinctrl, 0, border=0, flag=0)
  1071                     boxsizer.AddWindow(spinctrl, 0, border=0, flag=0)
  1039                     spinctrl.SetValue(element_infos["value"])
  1072                     spinctrl.SetValue(element_infos["value"])
  1040                     spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, plugin, element_path), id=id)
  1073                     spinctrl.Bind(wx.EVT_SPINCTRL, self.GetTextCtrlCallBackFunction(spinctrl, plugin, element_path), id=id)
  1041                 else:
  1074                 else:
  1042                     textctrl = wx.TextCtrl(id=id, name=element_infos["name"], parent=parent, 
  1075                     textctrl = wx.TextCtrl(id=id, name=element_infos["name"], parent=parent, 
  1043                         pos=wx.Point(0, 0), size=wx.Size(150, 25), style=wx.TE_PROCESS_ENTER)
  1076                         pos=wx.Point(0, 0), size=wx.Size(150, 25), style=0)#wx.TE_PROCESS_ENTER)
  1044                     boxsizer.AddWindow(textctrl, 0, border=0, flag=0)
  1077                     boxsizer.AddWindow(textctrl, 0, border=0, flag=0)
  1045                     textctrl.SetValue(str(element_infos["value"]))
  1078                     textctrl.SetValue(str(element_infos["value"]))
  1046                     textctrl.Bind(wx.EVT_TEXT_ENTER, self.GetTextCtrlCallBackFunction(textctrl, plugin, element_path), id=id)
       
  1047                     textctrl.Bind(wx.EVT_KILL_FOCUS, self.GetTextCtrlCallBackFunction(textctrl, plugin, element_path))
  1079                     textctrl.Bind(wx.EVT_KILL_FOCUS, self.GetTextCtrlCallBackFunction(textctrl, plugin, element_path))
  1048             first = False
  1080             first = False
  1049     
  1081     
  1050     def OnNewProjectMenu(self, event):
  1082     def OnNewProjectMenu(self, event):
  1051         defaultpath = self.PluginRoot.GetProjectPath()
  1083         defaultpath = self.PluginRoot.GetProjectPath()
  1098         event.Skip()
  1130         event.Skip()
  1099     
  1131     
  1100     def OnSaveProjectMenu(self, event):
  1132     def OnSaveProjectMenu(self, event):
  1101         if self.PluginRoot.HasProjectOpened():
  1133         if self.PluginRoot.HasProjectOpened():
  1102             self.PluginRoot.SaveProject()
  1134             self.PluginRoot.SaveProject()
       
  1135             self.RefreshAll()
  1103         event.Skip()
  1136         event.Skip()
  1104     
  1137     
  1105     def OnPropertiesMenu(self, event):
  1138     def OnPropertiesMenu(self, event):
  1106         event.Skip()
  1139         event.Skip()
  1107     
  1140