# HG changeset patch # User laurent # Date 1318456068 -7200 # Node ID 3f2024f305538b880f976fec717a07530f47dd2b # Parent a7c706b9492e0f3f70890bea7e5fb625cd058852 Adding support for searching pattern in datatype elements diff -r a7c706b9492e -r 3f2024f30553 DataTypeEditor.py --- a/DataTypeEditor.py Wed Oct 12 15:08:47 2011 +0200 +++ b/DataTypeEditor.py Wed Oct 12 23:47:48 2011 +0200 @@ -57,7 +57,7 @@ self.data = data self.old_value = None self.colnames = colnames - self.Errors = {} + self.Highlights = {} self.Parent = parent # XXX # we need to store the row length and collength to @@ -148,6 +148,7 @@ """ for row in range(self.GetNumberRows()): + row_highlights = self.Highlights.get(row, {}) for col in range(self.GetNumberCols()): editor = None renderer = None @@ -168,13 +169,14 @@ grid.SetCellEditor(row, col, editor) grid.SetCellRenderer(row, col, renderer) - if self.Errors.has_key(row) and self.Errors[row][0] == colname.lower(): - grid.SetCellBackgroundColour(row, col, wx.Colour(255, 255, 0)) - grid.SetCellTextColour(row, col, wx.RED) - grid.MakeCellVisible(row, col) - else: - grid.SetCellTextColour(row, col, wx.BLACK) - grid.SetCellBackgroundColour(row, col, wx.WHITE) + highlight_colours = row_highlights.get(colname.lower(), [(wx.WHITE, wx.BLACK)])[-1] + grid.SetCellBackgroundColour(row, col, highlight_colours[0]) + grid.SetCellTextColour(row, col, highlight_colours[1]) + if wx.Platform == '__WXMSW__': + grid.SetRowMinimalHeight(row, 20) + else: + grid.SetRowMinimalHeight(row, 28) + grid.AutoSizeRow(row, False) def SetData(self, data): self.data = data @@ -202,11 +204,25 @@ self.data = [] self.editors = [] - def AddError(self, infos): - self.Errors[infos[0]] = infos[1:] - - def ClearErrors(self): - self.Errors = {} + def AddHighlight(self, infos, highlight_type): + row_highlights = self.Highlights.setdefault(infos[0], {}) + if infos[1] == "initial": + col_highlights = row_highlights.setdefault("initial value", []) + else: + col_highlights = row_highlights.setdefault(infos[1], []) + col_highlights.append(highlight_type) + + def ClearHighlights(self, highlight_type=None): + if highlight_type is None: + self.Highlights = {} + else: + for row, row_highlights in self.Highlights.iteritems(): + row_items = row_highlights.items() + for col, col_highlights in row_items: + if highlight_type in col_highlights: + col_highlights.remove(highlight_type) + if len(col_highlights) == 0: + row_highlights.pop(col) #------------------------------------------------------------------------------- # Datatype Editor class @@ -383,6 +399,7 @@ self.DirectlyBaseType = wx.ComboBox(id=ID_DATATYPEEDITORDIRECTLYBASETYPE, name='DirectlyBaseType', parent=self.DirectlyPanel, pos=wx.Point(0, 0), size=wx.Size(0, 28), style=wx.CB_READONLY) + self.DirectlyBaseType.SetBackgroundColour(wx.BLUE) self.Bind(wx.EVT_COMBOBOX, self.OnInfosChanged, id=ID_DATATYPEEDITORDIRECTLYBASETYPE) self.staticText3 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT3, @@ -407,6 +424,7 @@ self.SubrangeBaseType = wx.ComboBox(id=ID_DATATYPEEDITORSUBRANGEBASETYPE, name='SubrangeBaseType', parent=self.SubrangePanel, pos=wx.Point(0, 0), size=wx.Size(0, 28), style=wx.CB_READONLY) + self.SubrangeBaseType.SetBackgroundColour(wx.BLUE) self.Bind(wx.EVT_COMBOBOX, self.OnSubrangeBaseTypeChanged, id=ID_DATATYPEEDITORSUBRANGEBASETYPE) self.staticText5 = wx.StaticText(id=ID_DATATYPEEDITORSTATICTEXT5, @@ -590,6 +608,20 @@ self.Controler = controler self.TagName = tagname + self.HighlightControls = { + ("Directly", "base"): self.DirectlyBaseType, + ("Directly", "initial"): self.DirectlyInitialValue, + ("Subrange", "base"): self.SubrangeBaseType, + ("Subrange", "lower"): self.SubrangeMinimum, + ("Subrange", "upper"): self.SubrangeMaximum, + ("Subrange", "initial"): self.SubrangeInitialValue, + ("Enumerated", "value"): self.EnumeratedValues, + ("Enumerated", "initial"): self.EnumeratedInitialValue, + ("Array", "initial"): self.ArrayInitialValue, + ("Array", "base"): self.ArrayBaseType, + ("Array", "range"): self.ArrayDimensions, + } + self.RefreshHighlightsTimer = wx.Timer(self, -1) self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer) @@ -655,9 +687,9 @@ self.ArrayInitialValue.SetValue(type_infos["initial"]) elif type_infos["type"] == "Structure": self.StructureElementsTable.SetData(type_infos["elements"]) - self.StructureElementsTable.ResetView(self.StructureElementsGrid) self.RefreshDisplayedInfos() - self.ShowErrors() + self.ShowHighlights() + self.StructureElementsTable.ResetView(self.StructureElementsGrid) self.Initializing = False def RefreshScaling(self, refresh=True): @@ -940,50 +972,41 @@ self.Highlights = [] else: self.Highlights = [(infos, start, end, highlight) for (infos, start, end, highlight) in self.Highlights if highlight != highlight_type] + for control in self.HighlightControls.itervalues(): + if isinstance(control, (wx.ComboBox, wx.SpinCtrl)): + control.SetBackgroundColour(wx.NullColour) + control.SetForegroundColour(wx.NullColour) + elif isinstance(control, wx.TextCtrl): + value = control.GetValue() + control.SetStyle(0, len(value), wx.TextAttr(wx.NullColour)) + elif isinstance(control, wx.gizmos.EditableListBox): + listctrl = control.GetListCtrl() + for i in xrange(listctrl.GetItemCount()): + listctrl.SetItemBackgroundColour(i, wx.NullColour) + listctrl.SetItemTextColour(i, wx.NullColour) + self.StructureElementsTable.ClearHighlights(highlight_type) self.RefreshView() def AddHighlight(self, infos, start, end ,highlight_type): self.Highlights.append((infos, start, end, highlight_type)) self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True) - def ShowErrors(self): + def ShowHighlights(self): type_infos = self.Controler.GetDataTypeInfos(self.TagName) for infos, start, end, highlight_type in self.Highlights: - if infos[0] == "base": - if type_infos["type"] == "Directly": - self.DirectlyBaseType.SetBackgroundColour(highlight_type[0]) - self.DirectlyBaseType.SetForegroundColour(highlight_type[1]) - elif type_infos["type"] == "Subrange": - self.SubrangeBaseType.SetBackgroundColour(highlight_type[0]) - self.SubrangeBaseType.SetForegroundColour(highlight_type[1]) - elif type_infos["type"] == "Array": - self.ArrayBaseType.SetBackgroundColour(highlight_type[0]) - self.ArrayBaseType.SetForegroundColour(highlight_type[1]) - elif infos[0] == "lower": - self.SubrangeMinimum.SetBackgroundColour(highlight_type[0]) - self.SubrangeMaximum.SetForegroundColour(highlight_type[1]) - elif infos[0] == "upper": - self.SubrangeMinimum.SetBackgroundColour(highlight_type[0]) - self.SubrangeMaximum.SetForegroundColour(highlight_type[1]) - elif infos[0] == "value": - listctrl = self.EnumeratedValues.GetListCtrl() - listctrl.SetItemBackgroundColour(infos[1], highlight_type[0]) - listctrl.SetItemTextColour(infos[1], highlight_type[1]) - listctrl.Select(listctrl.FocusedItem, False) - elif infos[0] == "range": - listctrl = self.EnumeratedValues.GetListCtrl() - listctrl.SetItemBackgroundColour(infos[1], highlight_type[0]) - listctrl.SetItemTextColour(infos[1], highlight_type[1]) - listctrl.SetStringSelection("") - elif infos[0] == "initial": - if type_infos["type"] == "Directly": - self.DirectlyInitialValue.SetStyle(start[1], end[1] + 1, wx.TextAttr(highlight_type[1], highlight_type[0])) - elif type_infos["type"] == "Subrange": - self.SubrangeInitialValue.SetBackgroundColour(highlight_type[0]) - self.SubrangeInitialValue.SetForegroundColour(highlight_type[1]) - elif type_infos["type"] == "Enumerated": - self.EnumeratedInitialValue.SetBackgroundColour(highlight_type[0]) - self.EnumeratedInitialValue.SetForegroundColour(highlight_type[1]) - elif type_infos["type"] == "Array": - self.ArrayInitialValue.SetStyle(start[1], end[1] + 1, wx.TextAttr(highlight_type[1], highlight_type[0])) - + if infos[0] == "struct": + self.StructureElementsTable.AddHighlight(infos[1:], highlight_type) + else: + control = self.HighlightControls.get((type_infos["type"], infos[0]), None) + if control is not None: + if isinstance(control, (wx.ComboBox, wx.SpinCtrl)): + control.SetBackgroundColour(highlight_type[0]) + control.SetForegroundColour(highlight_type[1]) + elif isinstance(control, wx.TextCtrl): + control.SetStyle(start[1], end[1] + 1, wx.TextAttr(highlight_type[1], highlight_type[0])) + elif isinstance(control, wx.gizmos.EditableListBox): + listctrl = control.GetListCtrl() + listctrl.SetItemBackgroundColour(infos[1], highlight_type[0]) + listctrl.SetItemTextColour(infos[1], highlight_type[1]) + listctrl.Select(listctrl.FocusedItem, False) + diff -r a7c706b9492e -r 3f2024f30553 SearchResultPanel.py --- a/SearchResultPanel.py Wed Oct 12 15:08:47 2011 +0200 +++ b/SearchResultPanel.py Wed Oct 12 23:47:48 2011 +0200 @@ -32,8 +32,12 @@ CWD = os.path.split(os.path.realpath(__file__))[0] def GenerateName(infos): - if infos[0] in ["input", "output"]: + if infos[0] in ["input", "output", "value"]: return "%s %d:" % (infos[0], infos[1]) + elif infos[0] == "range": + return "%s %d %s" % (infos[0], infos[1], infos[2]) + elif infos[0] == "struct": + return "element %d %s" % (infos[1], infos[2]) return "%s:" % infos[0] #------------------------------------------------------------------------------- @@ -191,17 +195,21 @@ children = element_infos.setdefault("children", []) for infos, start, end, text in results: - child_type = infos[1] - if child_type == "body": - child_name = "body" - if element_type == ITEM_TRANSITION: - child_type = self.ParentWindow.Controler.GetTransitionBodyType(words[1], words[2]) - elif element_type == ITEM_ACTION: - child_type = self.ParentWindow.Controler.GetActionBodyType(words[1], words[2]) + if element_type == ITEM_DATATYPE: + child_name = GenerateName(infos[1:]) + child_type = element_type + else: + child_type = infos[1] + if child_type == "body": + child_name = "body" + if element_type == ITEM_TRANSITION: + child_type = self.ParentWindow.Controler.GetTransitionBodyType(words[1], words[2]) + elif element_type == ITEM_ACTION: + child_type = self.ParentWindow.Controler.GetActionBodyType(words[1], words[2]) + else: + child_type = self.ParentWindow.Controler.GetPouBodyType(words[1]) else: - child_type = self.ParentWindow.Controler.GetPouBodyType(words[1]) - else: - child_name = GenerateName(infos[3:]) + child_name = GenerateName(infos[3:]) child_infos = {"name": child_name, "type": child_type, "data": (infos, start, end ,None), diff -r a7c706b9492e -r 3f2024f30553 plcopen/plcopen.py --- a/plcopen/plcopen.py Wed Oct 12 15:08:47 2011 +0200 +++ b/plcopen/plcopen.py Wed Oct 12 23:47:48 2011 +0200 @@ -353,18 +353,7 @@ def updateElementName(self, old_name, new_name): for datatype in self.types.getdataTypeElements(): - datatype_content = datatype.baseType.getcontent() - if datatype_content["name"] == "derived" and datatype_content["value"].getname() == old_name: - datatype_content["value"].setname(new_name) - elif datatype_content["name"] in ["array", "subrangeSigned", "subrangeUnsigned"]: - basetype_content = datatype_content["value"].baseType.getcontent() - if basetype_content["name"] == "derived" and basetype_content["value"].getname() == old_name: - basetype_content["value"].setname(new_name) - elif datatype_content["name"] == "struct": - for element in datatype_content["value"].getvariable(): - element_type = element.type.getcontent() - if element_type["name"] == "derived" and element_type["value"].getname() == old_name: - element_type["value"].setname(new_name) + datatype.updateElementName(old_name, new_name) for pou in self.types.getpouElements(): pou.updateElementName(old_name, new_name) for configuration in self.instances.configurations.getconfiguration(): @@ -823,9 +812,7 @@ variables.pop(i) def _SearchInConfigurationResource(self, criteria, parent_infos=[]): - search_result = [] - for result in TestTextElement(self.getname(), criteria): - search_result.append((tuple(parent_infos + ["name"]),) + result) + search_result = _Search([("name", self.getname())], criteria, parent_infos) var_number = 0 for varlist in self.getglobalVars(): variable_type = searchResultVarTypes.get("globalVars", "var_local") @@ -1097,14 +1084,103 @@ def Search(self, criteria, parent_infos=[]): search_result = [] filter = criteria["filter"] - #if filter == "all" or "datatype" in filter: - # for datatype in self.dataTypes.getdataType(): - # search_result.extend(datatype.Search(criteria, parent_infos)) + for datatype in self.dataTypes.getdataType(): + search_result.extend(datatype.Search(criteria, parent_infos)) for pou in self.pous.getpou(): search_result.extend(pou.Search(criteria, parent_infos)) return search_result setattr(cls, "Search", Search) +def _updateBaseTypeElementName(self, old_name, new_name): + self.baseType.updateElementName(old_name, new_name) + +cls = PLCOpenClasses.get("dataTypes_dataType", None) +if cls: + setattr(cls, "updateElementName", _updateBaseTypeElementName) + + def Search(self, criteria, parent_infos=[]): + search_result = [] + filter = criteria["filter"] + if filter == "all" or "datatype" in filter: + parent_infos = parent_infos + ["D::%s" % self.getname()] + search_result.extend(_Search([("name", self.getname())], criteria, parent_infos)) + search_result.extend(self.baseType.Search(criteria, parent_infos)) + if self.initialValue is not None: + search_result.extend(_Search([("initial", self.initialValue.getvalue())], criteria, parent_infos)) + return search_result + setattr(cls, "Search", Search) + +cls = PLCOpenClasses.get("dataType", None) +if cls: + + def updateElementName(self, old_name, new_name): + if self.content["name"] in ["derived", "array", "subrangeSigned", "subrangeUnsigned"]: + self.content["value"].updateElementName(old_name, new_name) + elif self.content["name"] == "struct": + for element in datatype_content["value"].getvariable(): + element_type = element.type.updateElementName(old_name, new_name) + setattr(cls, "updateElementName", updateElementName) + + def Search(self, criteria, parent_infos=[]): + search_result = [] + if self.content["name"] in ["derived", "array", "enum", "subrangeSigned", "subrangeUnsigned"]: + search_result.extend(self.content["value"].Search(criteria, parent_infos)) + elif self.content["name"] == "struct": + for i, element in enumerate(self.content["value"].getvariable()): + search_result.extend(element.Search(criteria, parent_infos + ["struct", i])) + else: + basetype = self.content["name"] + if basetype in ["string", "wstring"]: + basetype = basetype.upper() + search_result.extend(_Search([("base", basetype)], criteria, parent_infos)) + return search_result + setattr(cls, "Search", Search) + +cls = PLCOpenClasses.get("derivedTypes_array", None) +if cls: + setattr(cls, "updateElementName", _updateBaseTypeElementName) + + def Search(self, criteria, parent_infos=[]): + search_result = self.baseType.Search(criteria, parent_infos) + for i, dimension in enumerate(self.getdimension()): + search_result.extend(_Search([("lower", dimension.getlower()), + ("upper", dimension.getupper())], + criteria, parent_infos + ["range", i])) + return search_result + setattr(cls, "Search", Search) + +def _SearchInSubrange(self, criteria, parent_infos=[]): + search_result = self.baseType.Search(criteria, parent_infos) + search_result.extend(_Search([("lower", self.range.getlower()), + ("upper", self.range.getupper())], + criteria, parent_infos)) + return search_result + +cls = PLCOpenClasses.get("derivedTypes_subrangeSigned", None) +if cls: + setattr(cls, "updateElementName", _updateBaseTypeElementName) + setattr(cls, "Search", _SearchInSubrange) + +cls = PLCOpenClasses.get("derivedTypes_subrangeUnsigned", None) +if cls: + setattr(cls, "updateElementName", _updateBaseTypeElementName) + setattr(cls, "Search", _SearchInSubrange) + +cls = PLCOpenClasses.get("derivedTypes_enum", None) +if cls: + + def updateElementName(self, old_name, new_name): + pass + setattr(cls, "updateElementName", updateElementName) + + def Search(self, criteria, parent_infos=[]): + search_result = [] + for i, value in enumerate(self.values.getvalue()): + for result in TestTextElement(value.getname(), criteria): + search_result.append((tuple(parent_infos + ["value", i]),) + result) + return search_result + setattr(cls, "Search", Search) + cls = PLCOpenClasses.get("pous_pou", None) if cls: @@ -1433,8 +1509,7 @@ filter = criteria["filter"] if filter == "all" or self.getpouType() in filter: parent_infos = parent_infos + ["P::%s" % self.getname()] - for result in TestTextElement(self.getname(), criteria): - search_result.append((tuple(parent_infos + ["name"]),) + result) + search_result.extend(_Search([("name", self.getname())], criteria, parent_infos)) if self.interface is not None: var_number = 0 for content in self.interface.getcontent():