controls/VariablePanel.py
changeset 714 131ea7f237b9
parent 684 f10449b18dbe
child 716 2681a6da58d6
--- a/controls/VariablePanel.py	Fri Jun 15 18:03:25 2012 +0200
+++ b/controls/VariablePanel.py	Mon Jun 25 20:03:53 2012 +0200
@@ -23,32 +23,34 @@
 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 import os
-import wx, wx.grid
 import re
-
 from types import TupleType, StringType, UnicodeType
 
+import wx
+import wx.grid
+import wx.lib.buttons
+
 from plcopen.structures import LOCATIONDATATYPES, TestIdentifier, IEC_KEYWORDS
 from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD, ERROR_HIGHLIGHT
 from dialogs.ArrayTypeDialog import ArrayTypeDialog
 from CustomGrid import CustomGrid
 from CustomTable import CustomTable
 from LocationCellEditor import LocationCellEditor
-
-# Compatibility function for wx versions < 2.6
+from utils.BitmapLibrary import GetBitmap
+
+#-------------------------------------------------------------------------------
+#                                 Helpers
+#-------------------------------------------------------------------------------
+
 def AppendMenu(parent, help, id, kind, text):
     if wx.VERSION >= (2, 6, 0):
         parent.Append(help=help, id=id, kind=kind, text=text)
     else:
         parent.Append(helpString=help, id=id, kind=kind, item=text)
 
-[TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, TYPESTREE, 
- POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING
-] = range(9)
-
-#-------------------------------------------------------------------------------
-#                            Variables Editor Panel
-#-------------------------------------------------------------------------------
+[TITLE, EDITORTOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, PROJECTTREE, 
+ POUINSTANCEVARIABLESPANEL, LIBRARYTREE, SCALING, PAGETITLES
+] = range(10)
 
 def GetVariableTableColnames(location):
     _ = lambda x : x
@@ -88,6 +90,10 @@
 
 LOCATION_MODEL = re.compile("((?:%[IQM](?:\*|(?:[XBWLD]?[0-9]+(?:\.[0-9]+)*)))?)$")
 
+#-------------------------------------------------------------------------------
+#                            Variables Panel Table
+#-------------------------------------------------------------------------------
+
 class VariableTable(CustomTable):
     
     """
@@ -205,7 +211,10 @@
                 grid.SetCellBackgroundColour(row, col, highlight_colours[0])
                 grid.SetCellTextColour(row, col, highlight_colours[1])
             self.ResizeRow(grid, row)
-                    
+
+#-------------------------------------------------------------------------------
+#                         Variable Panel Drop Target
+#-------------------------------------------------------------------------------   
 
 class VariableDropTarget(wx.TextDropTarget):
     '''
@@ -301,154 +310,101 @@
         
         if message is not None:
             wx.CallAfter(self.ShowMessage, message)
-            
-                
+    
     def ShowMessage(self, message):
         message = wx.MessageDialog(self.ParentWindow, message, _("Error"), wx.OK|wx.ICON_ERROR)
         message.ShowModal()
         message.Destroy()
 
-[ID_VARIABLEEDITORPANEL, ID_VARIABLEEDITORPANELVARIABLESGRID, 
- ID_VARIABLEEDITORCONTROLPANEL, ID_VARIABLEEDITORPANELRETURNTYPELABEL, 
- ID_VARIABLEEDITORPANELRETURNTYPE, ID_VARIABLEEDITORPANELDESCRIPTIONLABEL, 
- ID_VARIABLEEDITORPANELDESCRIPTION, ID_VARIABLEEDITORPANELCLASSFILTERLABEL, 
- ID_VARIABLEEDITORPANELCLASSFILTER, ID_VARIABLEEDITORPANELADDBUTTON, 
- ID_VARIABLEEDITORPANELDELETEBUTTON, ID_VARIABLEEDITORPANELUPBUTTON, 
- ID_VARIABLEEDITORPANELDOWNBUTTON, 
-] = [wx.NewId() for _init_ctrls in range(13)]
+#-------------------------------------------------------------------------------
+#                               Variable Panel
+#-------------------------------------------------------------------------------   
 
 class VariablePanel(wx.Panel):
     
-    if wx.VERSION < (2, 6, 0):
-        def Bind(self, event, function, id = None):
-            if id is not None:
-                event(self, id, function)
-            else:
-                event(self, function)
-    
-    def _init_coll_MainSizer_Items(self, parent):
-        parent.AddWindow(self.ControlPanel, 0, border=5, flag=wx.GROW|wx.ALL)
-        parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW)
-        
-    def _init_coll_MainSizer_Growables(self, parent):
-        parent.AddGrowableCol(0)
-        parent.AddGrowableRow(1)
-    
-    def _init_coll_ControlPanelSizer_Items(self, parent):
-        parent.AddWindow(self.ReturnTypeLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
-        parent.AddWindow(self.ReturnType, 0, border=0, flag=0)
-        parent.AddWindow(self.DescriptionLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
-        parent.AddWindow(self.Description, 0, border=0, flag=0)
-        parent.AddWindow(self.ClassFilterLabel, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
-        parent.AddWindow(self.ClassFilter, 0, border=0, flag=0)
-        parent.AddWindow(self.AddButton, 0, border=0, flag=0)
-        parent.AddWindow(self.DeleteButton, 0, border=0, flag=0)
-        parent.AddWindow(self.UpButton, 0, border=0, flag=0)
-        parent.AddWindow(self.DownButton, 0, border=0, flag=0)
-        
-    def _init_coll_ControlPanelSizer_Growables(self, parent):
-        parent.AddGrowableCol(5)
-        parent.AddGrowableRow(0)
-
-    def _init_sizers(self):
+    def __init__(self, parent, window, controler, element_type, debug=False):
+        wx.Panel.__init__(self, parent, style=wx.TAB_TRAVERSAL)
+        
         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=10, rows=2, vgap=0)
-        self.ControlPanelSizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5)
-        
-        self._init_coll_MainSizer_Items(self.MainSizer)
-        self._init_coll_MainSizer_Growables(self.MainSizer)
-        self._init_coll_ControlPanelSizer_Items(self.ControlPanelSizer)
-        self._init_coll_ControlPanelSizer_Growables(self.ControlPanelSizer)
-        
-        self.ControlPanel.SetSizer(self.ControlPanelSizer)
+        self.MainSizer.AddGrowableCol(0)
+        self.MainSizer.AddGrowableRow(1)
+        
+        controls_sizer = wx.FlexGridSizer(cols=10, hgap=5, rows=1, vgap=5)
+        controls_sizer.AddGrowableCol(5)
+        controls_sizer.AddGrowableRow(0)
+        self.MainSizer.AddSizer(controls_sizer, border=5, flag=wx.GROW|wx.ALL)
+        
+        self.ReturnTypeLabel = wx.StaticText(self, label=_('Return Type:'))
+        controls_sizer.AddWindow(self.ReturnTypeLabel, flag=wx.ALIGN_CENTER_VERTICAL)
+        
+        self.ReturnType = wx.ComboBox(self,
+              size=wx.Size(145, -1), style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, self.ReturnType)
+        controls_sizer.AddWindow(self.ReturnType)
+        
+        self.DescriptionLabel = wx.StaticText(self, label=_('Description:'))
+        controls_sizer.AddWindow(self.DescriptionLabel, flag=wx.ALIGN_CENTER_VERTICAL)
+        
+        self.Description = wx.TextCtrl(self,
+              size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER)
+        self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, self.Description)
+        self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged)
+        controls_sizer.AddWindow(self.Description) 
+        
+        class_filter_label = wx.StaticText(self, label=_('Class Filter:'))
+        controls_sizer.AddWindow(class_filter_label, flag=wx.ALIGN_CENTER_VERTICAL)
+        
+        self.ClassFilter = wx.ComboBox(self, 
+              size=wx.Size(145, -1), style=wx.CB_READONLY)
+        self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, self.ClassFilter)
+        controls_sizer.AddWindow(self.ClassFilter)
+        
+        for name, bitmap, help in [
+                ("AddButton", "add_element", _("Add variable")),
+                ("DeleteButton", "remove_element", _("Remove variable")),
+                ("UpButton", "up", _("Move variable up")),
+                ("DownButton", "down", _("Move variable down"))]:
+            button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), 
+                  size=wx.Size(28, 28), style=wx.NO_BORDER)
+            button.SetToolTipString(help)
+            setattr(self, name, button)
+            controls_sizer.AddWindow(button)
+        
+        self.VariablesGrid = CustomGrid(self, style=wx.VSCROLL)
+        self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, 
+              self.OnVariablesGridCellChange)
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, 
+              self.OnVariablesGridCellLeftClick)
+        self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, 
+              self.OnVariablesGridEditorShown)
+        self.MainSizer.AddWindow(self.VariablesGrid, flag=wx.GROW)
+        
         self.SetSizer(self.MainSizer)
-    
-    def _init_ctrls(self, prnt):
-        wx.Panel.__init__(self, id=ID_VARIABLEEDITORPANEL,
-              name='VariableEditorPanel', parent=prnt, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-
-        self.VariablesGrid = CustomGrid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
-              name='VariablesGrid', parent=self, pos=wx.Point(0, 0), 
-              size=wx.Size(0, 0), style=wx.VSCROLL)
-        self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
-        if wx.VERSION >= (2, 6, 0):
-            self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
-            self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
-            self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown)
-        else:
-            wx.grid.EVT_GRID_CELL_CHANGE(self.VariablesGrid, self.OnVariablesGridCellChange)
-            wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
-            wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
-        
-        self.ControlPanel = wx.ScrolledWindow(id=ID_VARIABLEEDITORCONTROLPANEL,
-              name='ControlPanel', parent=self, pos=wx.Point(0, 0),
-              size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
-        self.ControlPanel.SetScrollRate(10, 0)
-        
-        self.ReturnTypeLabel = wx.StaticText(id=ID_VARIABLEEDITORPANELRETURNTYPELABEL,
-              label=_('Return Type:'), name='ReturnTypeLabel', parent=self.ControlPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.ReturnType = wx.ComboBox(id=ID_VARIABLEEDITORPANELRETURNTYPE,
-              name='ReturnType', parent=self.ControlPanel, pos=wx.Point(0, 0),
-              size=wx.Size(145, -1), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnReturnTypeChanged, id=ID_VARIABLEEDITORPANELRETURNTYPE)
-
-        self.DescriptionLabel = wx.StaticText(id=ID_VARIABLEEDITORPANELDESCRIPTIONLABEL,
-              label=_('Description:'), name='DescriptionLabel', parent=self.ControlPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.Description = wx.TextCtrl(id=ID_VARIABLEEDITORPANELDESCRIPTION,
-              name='Description', parent=self.ControlPanel, pos=wx.Point(0, 0),
-              size=wx.Size(250, -1), style=wx.TE_PROCESS_ENTER)
-        self.Bind(wx.EVT_TEXT_ENTER, self.OnDescriptionChanged, id=ID_VARIABLEEDITORPANELDESCRIPTION)
-        self.Description.Bind(wx.EVT_KILL_FOCUS, self.OnDescriptionChanged)
-        
-        self.ClassFilterLabel = wx.StaticText(id=ID_VARIABLEEDITORPANELCLASSFILTERLABEL,
-              label=_('Class Filter:'), name='ClassFilterLabel', parent=self.ControlPanel,
-              pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
-
-        self.ClassFilter = wx.ComboBox(id=ID_VARIABLEEDITORPANELCLASSFILTER,
-              name='ClassFilter', parent=self.ControlPanel, pos=wx.Point(0, 0),
-              size=wx.Size(145, -1), style=wx.CB_READONLY)
-        self.Bind(wx.EVT_COMBOBOX, self.OnClassFilter, id=ID_VARIABLEEDITORPANELCLASSFILTER)
-
-        self.AddButton = wx.Button(id=ID_VARIABLEEDITORPANELADDBUTTON, label=_('Add'),
-              name='AddButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
-              size=wx.DefaultSize, style=0)
-        
-        self.DeleteButton = wx.Button(id=ID_VARIABLEEDITORPANELDELETEBUTTON, label=_('Delete'),
-              name='DeleteButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
-              size=wx.DefaultSize, style=0)
-        
-        self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
-              name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
-              size=wx.Size(28, -1), style=0)
-        
-        self.DownButton = wx.Button(id=ID_VARIABLEEDITORPANELDOWNBUTTON, label='v',
-              name='DownButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
-              size=wx.Size(28, -1), style=0)
-        
-        self._init_sizers()
-
-    def __init__(self, parent, window, controler, element_type, debug=False):
-        self._init_ctrls(parent)
+        
         self.ParentWindow = window
         self.Controler = controler
         self.ElementType = element_type
         self.Debug = debug
         
         self.RefreshHighlightsTimer = wx.Timer(self, -1)
-        self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
+        self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, 
+              self.RefreshHighlightsTimer)
         
         self.Filter = "All"
         self.FilterChoices = []
         self.FilterChoiceTransfer = GetFilterChoiceTransfer()
         
-        self.DefaultValue = {   "Name" : "", "Class" : "", "Type" : "INT", "Location" : "",
-                                "Initial Value" : "", "Option" : "",
-                                "Documentation" : "", "Edit" : True
-                            }
+        self.DefaultValue = {
+             "Name" : "", 
+             "Class" : "", 
+             "Type" : "INT", 
+             "Location" : "",
+              "Initial Value" : "", 
+              "Option" : "",
+              "Documentation" : "", 
+              "Edit" : True
+        }
 
         if element_type in ["config", "resource"]:
             self.DefaultTypes = {"All" : "Global"}
@@ -636,7 +592,6 @@
         
         self.RefreshValues()
         self.VariablesGrid.RefreshButtons()
-        self.ControlPanelSizer.Layout()
         self.MainSizer.Layout()
     
     def OnReturnTypeChanged(self, event):