editors/CodeFileEditor.py
changeset 1146 510d1ea1f6c1
parent 1139 f9cf74053b7d
child 1150 b1c84771e1cf
equal deleted inserted replaced
1144:21475ee0e688 1146:510d1ea1f6c1
     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='')