4 import wx.grid |
4 import wx.grid |
5 import wx.stc as stc |
5 import wx.stc as stc |
6 import wx.lib.buttons |
6 import wx.lib.buttons |
7 |
7 |
8 from plcopen.plcopen import TestTextElement |
8 from plcopen.plcopen import TestTextElement |
|
9 from plcopen.structures import TestIdentifier, IEC_KEYWORDS |
9 from controls import CustomGrid, CustomTable |
10 from controls import CustomGrid, CustomTable |
10 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor |
11 from editors.ConfTreeNodeEditor import ConfTreeNodeEditor |
11 from util.BitmapLibrary import GetBitmap |
12 from util.BitmapLibrary import GetBitmap |
12 from controls.CustomStyledTextCtrl import CustomStyledTextCtrl, faces, GetCursorPos, NAVIGATION_KEYS |
13 from controls.CustomStyledTextCtrl import CustomStyledTextCtrl, faces, GetCursorPos, NAVIGATION_KEYS |
|
14 from controls.VariablePanel import VARIABLE_NAME_SUFFIX_MODEL |
13 from graphics.GraphicCommons import ERROR_HIGHLIGHT, SEARCH_RESULT_HIGHLIGHT, REFRESH_HIGHLIGHT_PERIOD |
15 from graphics.GraphicCommons import ERROR_HIGHLIGHT, SEARCH_RESULT_HIGHLIGHT, REFRESH_HIGHLIGHT_PERIOD |
14 |
16 |
15 [STC_CODE_ERROR, STC_CODE_SEARCH_RESULT, |
17 [STC_CODE_ERROR, STC_CODE_SEARCH_RESULT, |
16 STC_CODE_SECTION] = range(15, 18) |
18 STC_CODE_SECTION] = range(15, 18) |
17 |
19 |
363 |
365 |
364 if braceAtCaret != -1 and braceOpposite == -1: |
366 if braceAtCaret != -1 and braceOpposite == -1: |
365 self.BraceBadLight(braceAtCaret) |
367 self.BraceBadLight(braceAtCaret) |
366 else: |
368 else: |
367 self.BraceHighlight(braceAtCaret, braceOpposite) |
369 self.BraceHighlight(braceAtCaret, braceOpposite) |
368 |
370 |
369 self.ParentWindow.SetCopyBuffer(self.GetSelectedText(), True) |
371 selected_text = self.GetSelectedText() |
|
372 if selected_text: |
|
373 self.ParentWindow.SetCopyBuffer(selected_text, True) |
370 event.Skip() |
374 event.Skip() |
371 |
375 |
372 def OnMarginClick(self, event): |
376 def OnMarginClick(self, event): |
373 # fold and unfold as needed |
377 # fold and unfold as needed |
374 if evt.GetMargin() == 2: |
378 if evt.GetMargin() == 2: |
646 self.SetSizer(main_sizer) |
650 self.SetSizer(main_sizer) |
647 |
651 |
648 self.ParentWindow = window |
652 self.ParentWindow = window |
649 self.Controler = controler |
653 self.Controler = controler |
650 |
654 |
651 self.VariablesDefaultValue = {"Name" : "", "Type" : "", "Initial": ""} |
655 self.VariablesDefaultValue = {"Name" : "", "Type" : "INT", "Initial": ""} |
652 self.Table = VariablesTable(self, [], ["#", "Name", "Type", "Initial"]) |
656 self.Table = VariablesTable(self, [], ["#", "Name", "Type", "Initial"]) |
653 self.ColAlignements = [wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT] |
657 self.ColAlignements = [wx.ALIGN_RIGHT, wx.ALIGN_LEFT, wx.ALIGN_LEFT, wx.ALIGN_LEFT] |
654 self.ColSizes = [40, 200, 150, 150] |
658 self.ColSizes = [40, 200, 150, 150] |
655 self.VariablesGrid.SetTable(self.Table) |
659 self.VariablesGrid.SetTable(self.Table) |
656 self.VariablesGrid.SetButtons({"Add": self.AddVariableButton, |
660 self.VariablesGrid.SetButtons({"Add": self.AddVariableButton, |
657 "Delete": self.DeleteVariableButton, |
661 "Delete": self.DeleteVariableButton, |
658 "Up": self.UpVariableButton, |
662 "Up": self.UpVariableButton, |
659 "Down": self.DownVariableButton}) |
663 "Down": self.DownVariableButton}) |
660 |
664 |
661 def _AddVariable(new_row): |
665 def _AddVariable(new_row): |
662 self.Table.InsertRow(new_row, self.VariablesDefaultValue.copy()) |
666 if new_row > 0: |
|
667 row_content = self.Table.data[new_row - 1].copy() |
|
668 result = VARIABLE_NAME_SUFFIX_MODEL.search(row_content["Name"]) |
|
669 if result is not None: |
|
670 name = row_content["Name"][:result.start(1)] |
|
671 suffix = result.group(1) |
|
672 if suffix != "": |
|
673 start_idx = int(suffix) |
|
674 else: |
|
675 start_idx = 0 |
|
676 else: |
|
677 name = row_content["Name"] |
|
678 start_idx = 0 |
|
679 row_content["Name"] = self.Controler.GenerateNewName( |
|
680 name + "%d", start_idx) |
|
681 else: |
|
682 row_content = self.VariablesDefaultValue.copy() |
|
683 self.Table.InsertRow(new_row, row_content) |
663 self.RefreshModel() |
684 self.RefreshModel() |
664 self.RefreshView() |
685 self.RefreshView() |
665 return new_row |
686 return new_row |
666 setattr(self.VariablesGrid, "_AddRow", _AddVariable) |
687 setattr(self.VariablesGrid, "_AddRow", _AddVariable) |
667 |
688 |
706 |
727 |
707 def DoGetBestSize(self): |
728 def DoGetBestSize(self): |
708 return self.ParentWindow.GetPanelBestSize() |
729 return self.ParentWindow.GetPanelBestSize() |
709 |
730 |
710 def OnVariablesGridCellChange(self, event): |
731 def OnVariablesGridCellChange(self, event): |
711 self.RefreshModel() |
732 row, col = event.GetRow(), event.GetCol() |
712 wx.CallAfter(self.RefreshView) |
733 colname = self.Table.GetColLabelValue(col, False) |
713 event.Skip() |
734 value = self.Table.GetValue(row, col) |
|
735 message = None |
|
736 |
|
737 if colname == "Name" and value != "": |
|
738 if not TestIdentifier(value): |
|
739 message = _("\"%s\" is not a valid identifier!") % value |
|
740 elif value.upper() in IEC_KEYWORDS: |
|
741 message = _("\"%s\" is a keyword. It can't be used!") % value |
|
742 elif value.upper() in [var["Name"].upper() |
|
743 for var_row, var in enumerate(self.Table.data) |
|
744 if var_row != row]: |
|
745 message = _("A variable with \"%s\" as name already exists!") % value |
|
746 else: |
|
747 self.RefreshModel() |
|
748 wx.CallAfter(self.RefreshView) |
|
749 else: |
|
750 self.RefreshModel() |
|
751 wx.CallAfter(self.RefreshView) |
|
752 |
|
753 if message is not None: |
|
754 dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR) |
|
755 dialog.ShowModal() |
|
756 dialog.Destroy() |
|
757 event.Veto() |
|
758 else: |
|
759 event.Skip() |
714 |
760 |
715 def OnVariablesGridEditorShown(self, event): |
761 def OnVariablesGridEditorShown(self, event): |
716 row, col = event.GetRow(), event.GetCol() |
762 row, col = event.GetRow(), event.GetCol() |
717 if self.Table.GetColLabelValue(col, False) == "Type": |
763 if self.Table.GetColLabelValue(col, False) == "Type": |
718 type_menu = wx.Menu(title='') |
764 type_menu = wx.Menu(title='') |