editors/ConfTreeNodeEditor.py
changeset 1451 94e620cbd9de
parent 1315 ff14a66bbd12
child 1511 91538d0c242c
--- a/editors/ConfTreeNodeEditor.py	Tue Feb 24 11:50:54 2015 +0100
+++ b/editors/ConfTreeNodeEditor.py	Wed Feb 25 13:59:01 2015 +0100
@@ -29,11 +29,6 @@
 
 SCROLLBAR_UNIT = 10
 
-CWD = os.path.split(os.path.realpath(__file__))[0]
-
-def Bpath(*args):
-    return os.path.join(CWD,*args)
-
 class GenBitmapTextButton(wx.lib.buttons.GenBitmapTextButton):
     def _GetLabelSize(self):
         """ used internally """
@@ -88,82 +83,82 @@
 
 
 class GenStaticBitmap(wx.StaticBitmap):
-    """ Customized GenStaticBitmap, fix transparency redraw bug on wx2.8/win32, 
+    """ Customized GenStaticBitmap, fix transparency redraw bug on wx2.8/win32,
     and accept image name as __init__ parameter, fail silently if file do not exist"""
     def __init__(self, parent, ID, bitmapname,
                  pos = wx.DefaultPosition, size = wx.DefaultSize,
                  style = 0,
                  name = "genstatbmp"):
-        
+
         bitmap = GetBitmap(bitmapname)
         if bitmap is None:
             bitmap = wx.EmptyBitmap(0, 0)
-        
-        wx.StaticBitmap.__init__(self, parent, ID, 
+
+        wx.StaticBitmap.__init__(self, parent, ID,
                  bitmap,
                  pos, size,
                  style,
                  name)
 
 class ConfTreeNodeEditor(EditorPanel):
-    
+
     SHOW_BASE_PARAMS = True
     SHOW_PARAMS = True
     CONFNODEEDITOR_TABS = []
-    
+
     def _init_Editor(self, parent):
         tabs_num = len(self.CONFNODEEDITOR_TABS)
         if self.SHOW_PARAMS and len(self.Controler.GetParamsAttributes()) > 0:
             tabs_num += 1
-            
+
         if tabs_num > 1 or self.SHOW_BASE_PARAMS:
-            self.Editor = wx.Panel(parent, 
+            self.Editor = wx.Panel(parent,
                 style=wx.SUNKEN_BORDER|wx.SP_3D)
-            
+
             self.MainSizer = wx.BoxSizer(wx.VERTICAL)
-            
+
             if self.SHOW_BASE_PARAMS:
                 baseparamseditor_sizer = wx.BoxSizer(wx.HORIZONTAL)
-                self.MainSizer.AddSizer(baseparamseditor_sizer, border=5, 
+                self.MainSizer.AddSizer(baseparamseditor_sizer, border=5,
                       flag=wx.GROW|wx.ALL)
-                
+
                 self.FullIECChannel = wx.StaticText(self.Editor, -1)
                 self.FullIECChannel.SetFont(
-                    wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL, 
+                    wx.Font(faces["size"], wx.DEFAULT, wx.NORMAL,
                             wx.BOLD, faceName = faces["helv"]))
-                baseparamseditor_sizer.AddWindow(self.FullIECChannel, 
+                baseparamseditor_sizer.AddWindow(self.FullIECChannel,
                       flag=wx.ALIGN_CENTER_VERTICAL)
-                
+
                 updownsizer = wx.BoxSizer(wx.VERTICAL)
-                baseparamseditor_sizer.AddSizer(updownsizer, border=5, 
+                baseparamseditor_sizer.AddSizer(updownsizer, border=5,
                       flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL)
-                
-                self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(self.Editor, 
+
+                self.IECCUpButton = wx.lib.buttons.GenBitmapTextButton(self.Editor,
                       bitmap=GetBitmap('IECCDown'), size=wx.Size(16, 16), style=wx.NO_BORDER)
-                self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1), 
+                self.IECCUpButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(1),
                       self.IECCUpButton)
                 updownsizer.AddWindow(self.IECCUpButton, flag=wx.ALIGN_LEFT)
-                
-                self.IECCDownButton = wx.lib.buttons.GenBitmapButton(self.Editor, 
+
+                self.IECCDownButton = wx.lib.buttons.GenBitmapButton(self.Editor,
                       bitmap=GetBitmap('IECCUp'), size=wx.Size(16, 16), style=wx.NO_BORDER)
-                self.IECCDownButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1), 
+                self.IECCDownButton.Bind(wx.EVT_BUTTON, self.GetItemChannelChangedFunction(-1),
                       self.IECCDownButton)
                 updownsizer.AddWindow(self.IECCDownButton, flag=wx.ALIGN_LEFT)
-                
-                self.ConfNodeName = wx.TextCtrl(self.Editor, 
+
+                self.ConfNodeName = wx.TextCtrl(self.Editor,
                       size=wx.Size(150, 25))
                 self.ConfNodeName.SetFont(
-                    wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL, 
+                    wx.Font(faces["size"] * 0.75, wx.DEFAULT, wx.NORMAL,
                             wx.BOLD, faceName = faces["helv"]))
-                self.ConfNodeName.Bind(wx.EVT_TEXT, 
-                      self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True), 
+                self.ConfNodeName.Bind(wx.EVT_TEXT,
+                      self.GetTextCtrlCallBackFunction(self.ConfNodeName, "BaseParams.Name", True),
                       self.ConfNodeName)
-                baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5, 
+                baseparamseditor_sizer.AddWindow(self.ConfNodeName, border=5,
                       flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
-                
+
                 buttons_sizer = self.GenerateMethodButtonSizer()
                 baseparamseditor_sizer.AddSizer(buttons_sizer, flag=wx.ALIGN_CENTER)
-            
+
             if tabs_num > 1:
                 self.ConfNodeNoteBook = wx.Notebook(self.Editor)
                 parent = self.ConfNodeNoteBook
@@ -171,12 +166,12 @@
             else:
                 parent = self.Editor
                 self.ConfNodeNoteBook = None
-            
+
             self.Editor.SetSizer(self.MainSizer)
         else:
             self.ConfNodeNoteBook = None
             self.Editor = None
-        
+
         for title, create_func_name in self.CONFNODEEDITOR_TABS:
             editor = getattr(self, create_func_name)(parent)
             if self.ConfNodeNoteBook is not None:
@@ -185,28 +180,28 @@
                 self.MainSizer.AddWindow(editor, 1, flag=wx.GROW)
             else:
                 self.Editor = editor
-        
+
         if self.SHOW_PARAMS and len(self.Controler.GetParamsAttributes()) > 0:
-            
+
             panel_style = wx.TAB_TRAVERSAL|wx.HSCROLL|wx.VSCROLL
             if self.ConfNodeNoteBook is None and parent != self.Editor:
                 panel_style |= wx.SUNKEN_BORDER
-            self.ParamsEditor = wx.ScrolledWindow(parent, 
+            self.ParamsEditor = wx.ScrolledWindow(parent,
                   style=panel_style)
             self.ParamsEditor.Bind(wx.EVT_SIZE, self.OnParamsEditorResize)
             self.ParamsEditor.Bind(wx.EVT_SCROLLWIN, self.OnParamsEditorScroll)
-            
+
             self.ParamsEditorSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=1, vgap=5)
             self.ParamsEditorSizer.AddGrowableCol(0)
             self.ParamsEditorSizer.AddGrowableRow(0)
             self.ParamsEditor.SetSizer(self.ParamsEditorSizer)
-            
+
             self.ConfNodeParamsSizer = wx.BoxSizer(wx.VERTICAL)
-            self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5, 
+            self.ParamsEditorSizer.AddSizer(self.ConfNodeParamsSizer, border=5,
                   flag=wx.LEFT|wx.RIGHT|wx.BOTTOM)
-            
+
             self.RefreshConfNodeParamsSizer()
-        
+
             if self.ConfNodeNoteBook is not None:
                 self.ConfNodeNoteBook.AddPage(self.ParamsEditor, _("Config"))
             elif self.SHOW_BASE_PARAMS:
@@ -215,40 +210,40 @@
                 self.Editor = self.ParamsEditor
         else:
             self.ParamsEditor = None
-    
+
     def __init__(self, parent, controler, window, tagname=""):
         EditorPanel.__init__(self, parent, tagname, window, controler)
-        
+
         icon_name = self.Controler.GetIconName()
         if icon_name is not None:
             self.SetIcon(GetBitmap(icon_name))
         else:
             self.SetIcon(GetBitmap("Extension"))
-        
+
     def __del__(self):
         self.Controler.OnCloseEditor(self)
-    
+
     def GetTagName(self):
         return self.Controler.CTNFullName()
-    
+
     def GetTitle(self):
         fullname = self.Controler.CTNFullName()
         if self.Controler.CTNTestModified():
             return "~%s~" % fullname
         return fullname
-    
+
     def HasNoModel(self):
         return False
-    
+
     def GetBufferState(self):
         return False, False
-    
+
     def Undo(self):
         pass
-    
+
     def Redo(self):
         pass
-    
+
     def RefreshView(self):
         EditorPanel.RefreshView(self)
         if self.SHOW_BASE_PARAMS:
@@ -257,33 +252,33 @@
         if self.ParamsEditor is not None:
             self.RefreshConfNodeParamsSizer()
             self.RefreshScrollbars()
-    
+
     def RefreshIECChannelControlsState(self):
         self.FullIECChannel.SetLabel(self.Controler.GetFullIEC_Channel())
         self.IECCDownButton.Enable(self.Controler.BaseParams.getIEC_Channel() > 0)
         self.MainSizer.Layout()
-    
+
     def RefreshConfNodeParamsSizer(self):
         self.Freeze()
         self.ConfNodeParamsSizer.Clear(True)
-        
+
         confnode_infos = self.Controler.GetParamsAttributes()
         if len(confnode_infos) > 0:
             self.GenerateSizerElements(self.ConfNodeParamsSizer, confnode_infos, None, False)
-        
+
         self.ParamsEditorSizer.Layout()
         self.Thaw()
-    
+
     def GenerateMethodButtonSizer(self):
         normal_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, faceName = faces["helv"])
         mouseover_bt_font=wx.Font(faces["size"] / 3, wx.DEFAULT, wx.NORMAL, wx.NORMAL, underline=True, faceName = faces["helv"])
-        
+
         msizer = wx.BoxSizer(wx.HORIZONTAL)
-        
+
         for confnode_method in self.Controler.ConfNodeMethods:
             if "method" in confnode_method and confnode_method.get("shown",True):
                 button = GenBitmapTextButton(self.Editor,
-                    bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")), 
+                    bitmap=GetBitmap(confnode_method.get("bitmap", "Unknown")),
                     label=confnode_method["name"], style=wx.NO_BORDER)
                 button.SetFont(normal_bt_font)
                 button.SetToolTipString(confnode_method["tooltip"])
@@ -305,7 +300,7 @@
                     button.Disable()
                 msizer.AddWindow(button, flag=wx.ALIGN_CENTER)
         return msizer
-    
+
     def GenerateSizerElements(self, sizer, elements, path, clean = True):
         if clean:
             sizer.Clear(True)
@@ -321,44 +316,44 @@
                 label = _(name)
                 if value is not None:
                     label += " - %s" % _(value)
-                staticbox = wx.StaticBox(self.ParamsEditor, 
+                staticbox = wx.StaticBox(self.ParamsEditor,
                       label=_(label), size=wx.Size(10, 0))
                 staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
                 if first:
-                    sizer.AddSizer(staticboxsizer, border=5, 
+                    sizer.AddSizer(staticboxsizer, border=5,
                           flag=wx.GROW|wx.TOP|wx.BOTTOM)
                 else:
-                    sizer.AddSizer(staticboxsizer, border=5, 
+                    sizer.AddSizer(staticboxsizer, border=5,
                           flag=wx.GROW|wx.BOTTOM)
-                self.GenerateSizerElements(staticboxsizer, 
-                                           element_infos["children"], 
+                self.GenerateSizerElements(staticboxsizer,
+                                           element_infos["children"],
                                            element_path)
             else:
                 boxsizer = wx.FlexGridSizer(cols=3, rows=1)
                 boxsizer.AddGrowableCol(1)
                 if first:
-                    sizer.AddSizer(boxsizer, border=5, 
+                    sizer.AddSizer(boxsizer, border=5,
                           flag=wx.GROW|wx.ALL)
                 else:
-                    sizer.AddSizer(boxsizer, border=5, 
+                    sizer.AddSizer(boxsizer, border=5,
                           flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
-                
+
                 staticbitmap = GenStaticBitmap(ID=-1, bitmapname=element_infos["name"],
                     name="%s_bitmap"%element_infos["name"], parent=self.ParamsEditor,
                     pos=wx.Point(0, 0), size=wx.Size(24, 24), style=0)
                 boxsizer.AddWindow(staticbitmap, border=5, flag=wx.RIGHT)
-                
-                statictext = wx.StaticText(self.ParamsEditor, 
+
+                statictext = wx.StaticText(self.ParamsEditor,
                       label="%s:"%_(element_infos["name"]))
-                boxsizer.AddWindow(statictext, border=5, 
+                boxsizer.AddWindow(statictext, border=5,
                       flag=wx.ALIGN_CENTER_VERTICAL|wx.RIGHT)
-                
+
                 if isinstance(element_infos["type"], types.ListType):
                     if isinstance(element_infos["value"], types.TupleType):
                         browse_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
                         boxsizer.AddSizer(browse_boxsizer)
-                        
-                        textctrl = wx.TextCtrl(self.ParamsEditor, 
+
+                        textctrl = wx.TextCtrl(self.ParamsEditor,
                               size=wx.Size(275, -1), style=wx.TE_READONLY)
                         if element_infos["value"] is not None:
                             textctrl.SetValue(element_infos["value"][0])
@@ -366,19 +361,19 @@
                         else:
                             value_infos = None
                         browse_boxsizer.AddWindow(textctrl)
-                        
-                        button = wx.Button(self.ParamsEditor, 
+
+                        button = wx.Button(self.ParamsEditor,
                               label="...", size=wx.Size(25, 25))
                         browse_boxsizer.AddWindow(button)
-                        button.Bind(wx.EVT_BUTTON, 
-                                    self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"], 
-                                                                   value_infos, element_path), 
+                        button.Bind(wx.EVT_BUTTON,
+                                    self.GetBrowseCallBackFunction(element_infos["name"], textctrl, element_infos["type"],
+                                                                   value_infos, element_path),
                                     button)
                     else:
-                        combobox = wx.ComboBox(self.ParamsEditor, 
+                        combobox = wx.ComboBox(self.ParamsEditor,
                               size=wx.Size(300, -1), style=wx.CB_READONLY)
                         boxsizer.AddWindow(combobox)
-                        
+
                         if element_infos["use"] == "optional":
                             combobox.Append("")
                         if len(element_infos["type"]) > 0 and isinstance(element_infos["type"][0], types.TupleType):
@@ -386,8 +381,8 @@
                                 combobox.Append(choice)
                             name = element_infos["name"]
                             value = element_infos["value"]
-                        
-                            staticbox = wx.StaticBox(self.ParamsEditor, 
+
+                            staticbox = wx.StaticBox(self.ParamsEditor,
                                   label="%s - %s"%(_(name), _(value)), size=wx.Size(10, 0))
                             staticboxsizer = wx.StaticBoxSizer(staticbox, wx.VERTICAL)
                             sizer.AddSizer(staticboxsizer, border=5, flag=wx.GROW|wx.BOTTOM)
@@ -402,7 +397,7 @@
                         else:
                             combobox.SetStringSelection(element_infos["value"])
                         combobox.Bind(wx.EVT_COMBOBOX, callback, combobox)
-                
+
                 elif isinstance(element_infos["type"], types.DictType):
                     scmin = -(2**31)
                     scmax = 2**31-1
@@ -410,50 +405,50 @@
                         scmin = element_infos["type"]["min"]
                     if "max" in element_infos["type"]:
                         scmax = element_infos["type"]["max"]
-                    spinctrl = wx.SpinCtrl(self.ParamsEditor, 
+                    spinctrl = wx.SpinCtrl(self.ParamsEditor,
                           size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
                     spinctrl.SetRange(scmin, scmax)
                     boxsizer.AddWindow(spinctrl)
                     if element_infos["value"] is not None:
                         spinctrl.SetValue(element_infos["value"])
-                    spinctrl.Bind(wx.EVT_SPINCTRL, 
+                    spinctrl.Bind(wx.EVT_SPINCTRL,
                                   self.GetTextCtrlCallBackFunction(spinctrl, element_path),
                                   spinctrl)
-                
+
                 else:
                     if element_infos["type"] == "boolean":
                         checkbox = wx.CheckBox(self.ParamsEditor, size=wx.Size(17, 25))
                         boxsizer.AddWindow(checkbox)
                         if element_infos["value"] is not None:
                             checkbox.SetValue(element_infos["value"])
-                        checkbox.Bind(wx.EVT_CHECKBOX, 
-                                      self.GetCheckBoxCallBackFunction(checkbox, element_path), 
+                        checkbox.Bind(wx.EVT_CHECKBOX,
+                                      self.GetCheckBoxCallBackFunction(checkbox, element_path),
                                       checkbox)
-                    
+
                     elif element_infos["type"] in ["unsignedLong", "long","integer"]:
                         if element_infos["type"].startswith("unsigned"):
                             scmin = 0
                         else:
                             scmin = -(2**31)
                         scmax = 2**31-1
-                        spinctrl = wx.SpinCtrl(self.ParamsEditor, 
+                        spinctrl = wx.SpinCtrl(self.ParamsEditor,
                               size=wx.Size(300, -1), style=wx.SP_ARROW_KEYS|wx.ALIGN_RIGHT)
                         spinctrl.SetRange(scmin, scmax)
                         boxsizer.AddWindow(spinctrl)
                         if element_infos["value"] is not None:
                             spinctrl.SetValue(element_infos["value"])
-                        spinctrl.Bind(wx.EVT_SPINCTRL, 
-                                      self.GetTextCtrlCallBackFunction(spinctrl, element_path), 
+                        spinctrl.Bind(wx.EVT_SPINCTRL,
+                                      self.GetTextCtrlCallBackFunction(spinctrl, element_path),
                                       spinctrl)
-                    
+
                     else:
                         choices = self.ParentWindow.GetConfigEntry(element_path, [""])
-                        textctrl = TextCtrlAutoComplete(name=element_infos["name"], 
-                                                        parent=self.ParamsEditor, 
-                                                        choices=choices, 
+                        textctrl = TextCtrlAutoComplete(name=element_infos["name"],
+                                                        parent=self.ParamsEditor,
+                                                        choices=choices,
                                                         element_path=element_path,
                                                         size=wx.Size(300, -1))
-                        
+
                         boxsizer.AddWindow(textctrl)
                         if element_infos["value"] is not None:
                             textctrl.ChangeValue(str(element_infos["value"]))
@@ -461,8 +456,8 @@
                         textctrl.Bind(wx.EVT_TEXT_ENTER, callback)
                         textctrl.Bind(wx.EVT_KILL_FOCUS, callback)
             first = False
-    
-    
+
+
     def GetItemChannelChangedFunction(self, dir):
         def OnConfNodeTreeItemChannelChanged(event):
             confnode_IECChannel = self.Controler.BaseParams.getIEC_Channel()
@@ -471,28 +466,28 @@
             wx.CallAfter(self.ParentWindow._Refresh, TITLE, FILEMENU, PROJECTTREE)
             event.Skip()
         return OnConfNodeTreeItemChannelChanged
-    
+
     def SetConfNodeParamsAttribute(self, *args, **kwargs):
         res, StructChanged = self.Controler.SetParamsAttribute(*args, **kwargs)
         if StructChanged and self.ParamsEditor is not None:
             wx.CallAfter(self.RefreshConfNodeParamsSizer)
         wx.CallAfter(self.ParentWindow._Refresh, TITLE, FILEMENU)
         return res
-    
+
     def GetButtonCallBackFunction(self, method, push=False):
         """ Generate the callbackfunc for a given confnode method"""
         def OnButtonClick(event):
-            # Disable button to prevent re-entrant call 
+            # Disable button to prevent re-entrant call
             event.GetEventObject().Disable()
             # Call
             getattr(self.Controler,method)()
-            # Re-enable button 
+            # Re-enable button
             event.GetEventObject().Enable()
-            
+
             if not push:
                 event.Skip()
         return OnButtonClick
-    
+
     def GetChoiceCallBackFunction(self, choicectrl, path):
         def OnChoiceChanged(event):
             res = self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection())
@@ -501,14 +496,14 @@
             choicectrl.SetStringSelection(res)
             event.Skip()
         return OnChoiceChanged
-    
+
     def GetChoiceContentCallBackFunction(self, choicectrl, staticboxsizer, path):
         def OnChoiceContentChanged(event):
             res = self.SetConfNodeParamsAttribute(path, choicectrl.GetStringSelection())
             wx.CallAfter(self.RefreshConfNodeParamsSizer)
             event.Skip()
         return OnChoiceContentChanged
-    
+
     def GetTextCtrlCallBackFunction(self, textctrl, path, refresh=False):
         def OnTextCtrlChanged(event):
             res = self.SetConfNodeParamsAttribute(path, textctrl.GetValue())
@@ -522,14 +517,14 @@
                 wx.CallAfter(self.ParentWindow.SelectProjectTreeItem, self.GetTagName())
             event.Skip()
         return OnTextCtrlChanged
-    
+
     def GetCheckBoxCallBackFunction(self, chkbx, path):
         def OnCheckBoxChanged(event):
             res = self.SetConfNodeParamsAttribute(path, chkbx.IsChecked())
             chkbx.SetValue(res)
             event.Skip()
         return OnCheckBoxChanged
-    
+
     def GetBrowseCallBackFunction(self, name, textctrl, library, value_infos, path):
         infos = [value_infos]
         def OnBrowseButton(event):
@@ -541,7 +536,7 @@
             dialog.Destroy()
             event.Skip()
         return OnBrowseButton
-    
+
     def RefreshScrollbars(self):
         self.ParamsEditor.GetBestSize()
         xstart, ystart = self.ParamsEditor.GetViewStart()
@@ -550,17 +545,17 @@
         posx = max(0, min(xstart, (maxx - window_size[0]) / SCROLLBAR_UNIT))
         posy = max(0, min(ystart, (maxy - window_size[1]) / SCROLLBAR_UNIT))
         self.ParamsEditor.Scroll(posx, posy)
-        self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
+        self.ParamsEditor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
                 maxx / SCROLLBAR_UNIT, maxy / SCROLLBAR_UNIT, posx, posy)
-    
+
     def OnParamsEditorResize(self, event):
         self.RefreshScrollbars()
         event.Skip()
-    
+
     def OnParamsEditorScroll(self, event):
         control = self.ParamsEditor.FindFocus()
         if isinstance(control, TextCtrlAutoComplete):
             control.DismissListBox()
             self.Refresh()
         event.Skip()
-    
+