--- a/VariablePanel.py Wed Oct 12 23:47:48 2011 +0200
+++ b/VariablePanel.py Fri Oct 14 19:26:29 2011 +0200
@@ -31,6 +31,7 @@
from PLCControler import LOCATION_PLUGIN, LOCATION_MODULE, LOCATION_GROUP, LOCATION_VAR_INPUT, LOCATION_VAR_OUTPUT, LOCATION_VAR_MEMORY
from graphics.GraphicCommons import REFRESH_HIGHLIGHT_PERIOD
from dialogs import ArrayTypeDialog
+from controls import CustomGrid
CWD = os.path.split(os.path.realpath(__file__))[0]
@@ -461,7 +462,7 @@
name='VariableEditorPanel', parent=prnt, pos=wx.Point(0, 0),
size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
- self.VariablesGrid = wx.grid.Grid(id=ID_VARIABLEEDITORPANELVARIABLESGRID,
+ 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.SetFont(wx.Font(12, 77, wx.NORMAL, wx.NORMAL, False,
@@ -472,17 +473,12 @@
self.VariablesGrid.SetSelectionForeground(wx.BLACK)
if wx.VERSION >= (2, 6, 0):
self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.OnVariablesGridCellChange)
- self.VariablesGrid.Bind(wx.grid.EVT_GRID_SELECT_CELL, self.OnVariablesGridSelectCell)
self.VariablesGrid.Bind(wx.grid.EVT_GRID_CELL_LEFT_CLICK, self.OnVariablesGridCellLeftClick)
self.VariablesGrid.Bind(wx.grid.EVT_GRID_EDITOR_SHOWN, self.OnVariablesGridEditorShown)
- #self.VariablesGrid.Bind(wx.EVT_KEY_DOWN, self.OnChar)
else:
wx.grid.EVT_GRID_CELL_CHANGE(self.VariablesGrid, self.OnVariablesGridCellChange)
- wx.grid.EVT_GRID_SELECT_CELL(self.VariablesGrid, self.OnVariablesGridSelectCell)
wx.grid.EVT_GRID_CELL_LEFT_CLICK(self.VariablesGrid, self.OnVariablesGridCellLeftClick)
wx.grid.EVT_GRID_EDITOR_SHOWN(self.VariablesGrid, self.OnVariablesGridEditorShown)
- #wx.EVT_KEY_DOWN(self.VariablesGrid, self.OnChar)
- self.VariablesGrid.SetDropTarget(VariableDropTarget(self))
self.ControlPanel = wx.ScrolledWindow(id=ID_VARIABLEEDITORCONTROLPANEL,
name='ControlPanel', parent=self, pos=wx.Point(0, 0),
@@ -510,23 +506,19 @@
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.Bind(wx.EVT_BUTTON, self.OnAddButton, id=ID_VARIABLEEDITORPANELADDBUTTON)
-
+
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.Bind(wx.EVT_BUTTON, self.OnDeleteButton, id=ID_VARIABLEEDITORPANELDELETEBUTTON)
-
+
self.UpButton = wx.Button(id=ID_VARIABLEEDITORPANELUPBUTTON, label='^',
name='UpButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
size=wx.Size(32, 32), style=0)
- self.Bind(wx.EVT_BUTTON, self.OnUpButton, id=ID_VARIABLEEDITORPANELUPBUTTON)
-
+
self.DownButton = wx.Button(id=ID_VARIABLEEDITORPANELDOWNBUTTON, label='v',
name='DownButton', parent=self.ControlPanel, pos=wx.Point(0, 0),
size=wx.Size(32, 32), style=0)
- self.Bind(wx.EVT_BUTTON, self.OnDownButton, id=ID_VARIABLEEDITORPANELDOWNBUTTON)
-
+
self._init_sizers()
def __init__(self, parent, window, controler, element_type):
@@ -603,91 +595,50 @@
self.RefreshTypeList()
self.VariablesGrid.SetTable(self.Table)
- self.VariablesGrid.SetRowLabelSize(0)
- for col in range(self.Table.GetNumberCols()):
- attr = wx.grid.GridCellAttr()
- attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
- self.VariablesGrid.SetColAttr(col, attr)
- self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
- self.VariablesGrid.AutoSizeColumn(col, False)
-
- def __del__(self):
- self.RefreshHighlightsTimer.Stop()
-
- def SetTagName(self, tagname):
- self.TagName = tagname
-
- def IsFunctionBlockType(self, name):
- bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
- pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
- if poutype != "function" and bodytype in ["ST", "IL"]:
- return False
- else:
- return name in self.Controler.GetFunctionBlockTypes(self.TagName)
-
- def RefreshView(self):
- self.PouNames = self.Controler.GetProjectPouNames()
-
- words = self.TagName.split("::")
- if self.ElementType == "config":
- self.PouIsUsed = False
- returnType = None
- self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
- elif self.ElementType == "resource":
- self.PouIsUsed = False
- returnType = None
- self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
- else:
- if self.ElementType == "function":
- self.ReturnType.Clear()
- for base_type in self.Controler.GetDataTypes(self.TagName, True):
- self.ReturnType.Append(base_type)
- returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
- else:
- returnType = None
- self.PouIsUsed = self.Controler.PouIsUsed(words[1])
- self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
-
- if returnType is not None:
- self.ReturnType.SetStringSelection(returnType)
- self.ReturnType.Enable(True)
- self.staticText1.Show()
- self.ReturnType.Show()
- else:
- self.ReturnType.Enable(False)
- self.staticText1.Hide()
- self.ReturnType.Hide()
-
- self.RefreshValues()
- self.RefreshButtons()
-
- def OnReturnTypeChanged(self, event):
- words = self.TagName.split("::")
- self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
- self.Controler.BufferProject()
- self.ParentWindow.RefreshEditor(variablepanel = False)
- self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
- event.Skip()
-
- def OnClassFilter(self, event):
- self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
- self.RefreshTypeList()
- self.RefreshValues()
- self.RefreshButtons()
- event.Skip()
-
- def RefreshTypeList(self):
- if self.Filter == "All":
- self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
- elif self.Filter == "Interface":
- self.ClassList = ["Input","Output","InOut","External"]
- elif self.Filter == "Variables":
- self.ClassList = ["Local","Temp"]
- else:
- self.ClassList = [self.Filter]
-
- def RefreshButtons(self):
- if getattr(self, "Table", None):
+ self.VariablesGrid.SetButtons({"Add": self.AddButton,
+ "Delete": self.DeleteButton,
+ "Up": self.UpButton,
+ "Down": self.DownButton})
+
+ def _AddVariable(new_row):
+ if not self.PouIsUsed or self.Filter not in ["Interface", "Input", "Output", "InOut"]:
+ row_content = self.DefaultValue.copy()
+ if self.Filter in self.DefaultTypes:
+ row_content["Class"] = self.DefaultTypes[self.Filter]
+ else:
+ row_content["Class"] = self.Filter
+ if self.Filter == "All" and len(self.Values) > 0:
+ self.Values.insert(new_row, row_content)
+ else:
+ self.Values.append(row_content)
+ new_row = self.Table.GetNumberRows()
+ self.SaveValues()
+ self.RefreshValues()
+ return new_row
+ return self.VariablesGrid.GetGridCursorRow()
+ setattr(self.VariablesGrid, "_AddRow", _AddVariable)
+
+ def _DeleteVariable(row):
+ if (self.Table.GetValueByName(row, "Edit") and
+ (not self.PouIsUsed or self.Table.GetValueByName(row, "Class") not in ["Input", "Output", "InOut"])):
+ self.Values.remove(self.Table.GetRow(row))
+ self.SaveValues()
+ self.RefreshValues()
+ setattr(self.VariablesGrid, "_DeleteRow", _DeleteVariable)
+
+ def _MoveVariable(row, move):
+ if (self.Filter == "All" and
+ (not self.PouIsUsed or self.Table.GetValueByName(row, "Class") not in ["Input", "Output", "InOut"])):
+ new_row = max(0, min(row + move, len(self.Values) - 1))
+ if new_row != row:
+ self.Values.insert(new_row, self.Values.pop(row))
+ self.SaveValues()
+ self.RefreshValues()
+ return new_row
+ return row
+ setattr(self.VariablesGrid, "_MoveRow", _MoveVariable)
+
+ def _RefreshButtons():
table_length = len(self.Table.data)
row_class = None
row_edit = True
@@ -701,50 +652,90 @@
self.DeleteButton.Enable(table_length > 0 and row_edit and row_class not in ["Input", "Output", "InOut"])
self.UpButton.Enable(table_length > 0 and row > 0 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
self.DownButton.Enable(table_length > 0 and row < table_length - 1 and self.Filter == "All" and row_class not in ["Input", "Output", "InOut"])
-
- def CloseVariablesGridEditControl(self):
- row = self.VariablesGrid.GetGridCursorRow()
- col = self.VariablesGrid.GetGridCursorCol()
- self.VariablesGrid.SetGridCursor(row, col)
-
- def OnAddButton(self, event):
- self.CloseVariablesGridEditControl()
- new_row = self.DefaultValue.copy()
- if self.Filter in self.DefaultTypes:
- new_row["Class"] = self.DefaultTypes[self.Filter]
- else:
- new_row["Class"] = self.Filter
- if self.Filter == "All" and len(self.Values) > 0:
- row_index = self.VariablesGrid.GetGridCursorRow() + 1
- self.Values.insert(row_index, new_row)
- else:
- row_index = -1
- self.Values.append(new_row)
- self.SaveValues()
- self.RefreshValues(row_index)
- self.RefreshButtons()
+ setattr(self.VariablesGrid, "RefreshButtons", _RefreshButtons)
+
+ self.VariablesGrid.SetRowLabelSize(0)
+ for col in range(self.Table.GetNumberCols()):
+ attr = wx.grid.GridCellAttr()
+ attr.SetAlignment(self.ColAlignements[col], wx.ALIGN_CENTRE)
+ self.VariablesGrid.SetColAttr(col, attr)
+ self.VariablesGrid.SetColMinimalWidth(col, self.ColSizes[col])
+ self.VariablesGrid.AutoSizeColumn(col, False)
+
+ def __del__(self):
+ self.RefreshHighlightsTimer.Stop()
+
+ def SetTagName(self, tagname):
+ self.TagName = tagname
+
+ def IsFunctionBlockType(self, name):
+ bodytype = self.Controler.GetEditedElementBodyType(self.TagName)
+ pouname, poutype = self.Controler.GetEditedElementType(self.TagName)
+ if poutype != "function" and bodytype in ["ST", "IL"]:
+ return False
+ else:
+ return name in self.Controler.GetFunctionBlockTypes(self.TagName)
+
+ def RefreshView(self):
+ self.PouNames = self.Controler.GetProjectPouNames()
+
+ words = self.TagName.split("::")
+ if self.ElementType == "config":
+ self.PouIsUsed = False
+ returnType = None
+ self.Values = self.Controler.GetConfigurationGlobalVars(words[1])
+ elif self.ElementType == "resource":
+ self.PouIsUsed = False
+ returnType = None
+ self.Values = self.Controler.GetConfigurationResourceGlobalVars(words[1], words[2])
+ else:
+ if self.ElementType == "function":
+ self.ReturnType.Clear()
+ for base_type in self.Controler.GetDataTypes(self.TagName, True):
+ self.ReturnType.Append(base_type)
+ returnType = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
+ else:
+ returnType = None
+ self.PouIsUsed = self.Controler.PouIsUsed(words[1])
+ self.Values = self.Controler.GetEditedElementInterfaceVars(self.TagName)
+
+ if returnType is not None:
+ self.ReturnType.SetStringSelection(returnType)
+ self.ReturnType.Enable(True)
+ self.staticText1.Show()
+ self.ReturnType.Show()
+ else:
+ self.ReturnType.Enable(False)
+ self.staticText1.Hide()
+ self.ReturnType.Hide()
+
+ self.RefreshValues()
+ self.VariablesGrid.RefreshButtons()
+
+ def OnReturnTypeChanged(self, event):
+ words = self.TagName.split("::")
+ self.Controler.SetPouInterfaceReturnType(words[1], self.ReturnType.GetStringSelection())
+ self.Controler.BufferProject()
+ self.ParentWindow.RefreshEditor(variablepanel = False)
+ self.ParentWindow._Refresh(TITLE, FILEMENU, EDITMENU, INSTANCESTREE, LIBRARYTREE)
event.Skip()
-
- def OnDeleteButton(self, event):
- self.CloseVariablesGridEditControl()
- row_index = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
- self.Values.remove(row_index)
- self.SaveValues()
- self.RefreshValues(row_index)
- self.RefreshButtons()
+
+ def OnClassFilter(self, event):
+ self.Filter = self.FilterChoiceTransfer[VARIABLE_CHOICES_DICT[self.ClassFilter.GetStringSelection()]]
+ self.RefreshTypeList()
+ self.RefreshValues()
+ self.VariablesGrid.RefreshButtons()
event.Skip()
- def OnUpButton(self, event):
- self.CloseVariablesGridEditControl()
- self.MoveValue(self.VariablesGrid.GetGridCursorRow(), -1)
- self.RefreshButtons()
- event.Skip()
-
- def OnDownButton(self, event):
- self.CloseVariablesGridEditControl()
- self.MoveValue(self.VariablesGrid.GetGridCursorRow(), 1)
- self.RefreshButtons()
- event.Skip()
+ def RefreshTypeList(self):
+ if self.Filter == "All":
+ self.ClassList = [self.FilterChoiceTransfer[choice] for choice in self.FilterChoices if self.FilterChoiceTransfer[choice] not in ["All","Interface","Variables"]]
+ elif self.Filter == "Interface":
+ self.ClassList = ["Input","Output","InOut","External"]
+ elif self.Filter == "Variables":
+ self.ClassList = ["Local","Temp"]
+ else:
+ self.ClassList = [self.Filter]
def OnVariablesGridCellChange(self, event):
row, col = event.GetRow(), event.GetCol()
@@ -883,29 +874,7 @@
dragSource.DoDragDrop()
event.Skip()
- def OnVariablesGridSelectCell(self, event):
- wx.CallAfter(self.RefreshButtons)
- event.Skip()
-
- def OnChar(self, event):
- keycode = event.GetKeyCode()
- if keycode == wx.WXK_DELETE:
- row = self.Table.GetRow(self.VariablesGrid.GetGridCursorRow())
- self.Values.remove(row)
- self.SaveValues()
- self.RefreshValues()
- self.RefreshButtons()
- event.Skip()
-
- def MoveValue(self, value_index, move):
- new_index = max(0, min(value_index + move, len(self.Values) - 1))
- if new_index != value_index:
- self.Values.insert(new_index, self.Values.pop(value_index))
- self.SaveValues()
- self.RefreshValues()
- self.VariablesGrid.SetGridCursor(new_index, self.VariablesGrid.GetGridCursorCol())
-
- def RefreshValues(self, select=0):
+ def RefreshValues(self):
data = []
for num, variable in enumerate(self.Values):
if variable["Class"] in self.ClassList:
@@ -913,16 +882,7 @@
data.append(variable)
self.Table.SetData(data)
self.Table.ResetView(self.VariablesGrid)
- if len(self.Table.data) > 0:
- if select == -1:
- select = len(self.Table.data) - 1
- else:
- select = min(select, len(self.Table.data) - 1)
- col = max(1, self.VariablesGrid.GetGridCursorCol())
- self.VariablesGrid.SetGridCursor(select, col)
- self.VariablesGrid.MakeCellVisible(select, col)
- self.VariablesGrid.SetFocus()
-
+
def SaveValues(self, buffer = True):
words = self.TagName.split("::")
if self.ElementType == "config":