dialogs/SFCStepDialog.py
changeset 714 131ea7f237b9
parent 577 9dbb79722fbc
child 718 0183a66eddf9
equal deleted inserted replaced
713:95a0a427f3ef 714:131ea7f237b9
    27 
    27 
    28 #-------------------------------------------------------------------------------
    28 #-------------------------------------------------------------------------------
    29 #                          Edit Step Content Dialog
    29 #                          Edit Step Content Dialog
    30 #-------------------------------------------------------------------------------
    30 #-------------------------------------------------------------------------------
    31 
    31 
    32 [ID_SFCSTEPDIALOG, ID_SFCSTEPDIALOGSPACER, 
       
    33  ID_SFCSTEPDIALOGNAME, ID_SFCSTEPDIALOGPREVIEW, 
       
    34  ID_SFCSTEPDIALOGCHECKBOX1, ID_SFCSTEPDIALOGCHECKBOX2,
       
    35  ID_SFCSTEPDIALOGCHECKBOX3, ID_SFCSTEPDIALOGSTATICTEXT1, 
       
    36  ID_SFCSTEPDIALOGSTATICTEXT2, ID_SFCSTEPDIALOGSTATICTEXT3, 
       
    37 ] = [wx.NewId() for _init_ctrls in range(10)]
       
    38 
       
    39 class SFCStepDialog(wx.Dialog):
    32 class SFCStepDialog(wx.Dialog):
    40     
    33     
    41     if wx.VERSION < (2, 6, 0):
    34     def __init__(self, parent, controller, initial = False):
    42         def Bind(self, event, function, id = None):
    35         wx.Dialog.__init__(self, parent, title=_('Edit Step'), 
    43             if id is not None:
    36               size=wx.Size(400, 250), style=wx.DEFAULT_DIALOG_STYLE)
    44                 event(self, id, function)
    37         
    45             else:
    38         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
    46                 event(self, function)
    39         main_sizer.AddGrowableCol(0)
    47     
    40         main_sizer.AddGrowableRow(0)
    48     def _init_coll_flexGridSizer1_Items(self, parent):
    41         
    49         parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    42         column_sizer = wx.BoxSizer(wx.HORIZONTAL)
    50         parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
    43         main_sizer.AddSizer(column_sizer, border=20, 
    51         
    44               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    52     def _init_coll_flexGridSizer1_Growables(self, parent):
    45         
    53         parent.AddGrowableCol(0)
    46         left_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=6, vgap=5)
    54         parent.AddGrowableRow(0)
    47         left_gridsizer.AddGrowableCol(0)
    55     
    48         column_sizer.AddSizer(left_gridsizer, 1, border=5, 
    56     def _init_coll_MainSizer_Items(self, parent):
    49                               flag=wx.GROW|wx.RIGHT)
    57         parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
    50         
    58         parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
    51         name_label = wx.StaticText(self, label=_('Name:'))
    59     
    52         left_gridsizer.AddWindow(name_label, flag=wx.GROW)
    60     def _init_coll_LeftGridSizer_Items(self, parent):
    53         
    61         parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
    54         self.StepName = wx.TextCtrl(self)
    62         parent.AddWindow(self.StepName, 0, border=0, flag=wx.GROW)
    55         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.StepName)
    63         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
    56         left_gridsizer.AddWindow(self.StepName, flag=wx.GROW)
    64         parent.AddWindow(self.checkBox1, 0, border=0, flag=wx.GROW)
    57         
    65         parent.AddWindow(self.checkBox2, 0, border=0, flag=wx.GROW)
    58         connectors_label = wx.StaticText(self, label=_('Connectors:'))
    66         parent.AddWindow(self.checkBox3, 0, border=0, flag=wx.GROW)
    59         left_gridsizer.AddWindow(connectors_label, flag=wx.GROW)
    67         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
    60         
    68         
    61         self.Input = wx.CheckBox(self, label=_("Input"))
    69     def _init_coll_LeftGridSizer_Growables(self, parent):
    62         self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, self.Input)
    70         parent.AddGrowableCol(0)
    63         left_gridsizer.AddWindow(self.Input, flag=wx.GROW)
    71         parent.AddGrowableRow(6)
    64         
    72             
    65         self.Output = wx.CheckBox(self, label=_("Output"))
    73     def _init_coll_RightGridSizer_Items(self, parent):
    66         self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, self.Output)
    74         parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
    67         left_gridsizer.AddWindow(self.Output, flag=wx.GROW)
    75         parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
    68         
    76         
    69         self.Action = wx.CheckBox(self, label=_("Action"))
    77     def _init_coll_RightGridSizer_Growables(self, parent):
    70         self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, self.Action)
    78         parent.AddGrowableCol(0)
    71         left_gridsizer.AddWindow(self.Action, flag=wx.GROW)
    79         parent.AddGrowableRow(1)
    72         
    80 
    73         right_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
    81     def _init_sizers(self):
    74         right_gridsizer.AddGrowableCol(0)
    82         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
    75         right_gridsizer.AddGrowableRow(1)
    83         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
    76         column_sizer.AddSizer(right_gridsizer, 1, border=5, 
    84         self.LeftGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=7, vgap=5)
    77               flag=wx.GROW|wx.LEFT)
    85         self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5)
    78         
    86 
    79         preview_label = wx.StaticText(self, label=_('Preview:'))
    87         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
    80         right_gridsizer.AddWindow(preview_label, flag=wx.GROW)
    88         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
    81         
    89         self._init_coll_MainSizer_Items(self.MainSizer)
    82         self.Preview = wx.Panel(self,
    90         self._init_coll_LeftGridSizer_Items(self.LeftGridSizer)
    83               style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
    91         self._init_coll_LeftGridSizer_Growables(self.LeftGridSizer)
       
    92         self._init_coll_RightGridSizer_Items(self.RightGridSizer)
       
    93         self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
       
    94 
       
    95         self.SetSizer(self.flexGridSizer1)
       
    96 
       
    97     def _init_ctrls(self, prnt, ctrler):
       
    98         wx.Dialog.__init__(self, id=ID_SFCSTEPDIALOG,
       
    99               name='SFCStepDialog', parent=prnt,
       
   100               size=wx.Size(400, 250), style=wx.DEFAULT_DIALOG_STYLE,
       
   101               title=_('Edit Step'))
       
   102         self.SetClientSize(wx.Size(400, 250))
       
   103 
       
   104         self.staticText1 = wx.StaticText(id=ID_SFCSTEPDIALOGSTATICTEXT1,
       
   105               label=_('Name:'), name='staticText1', parent=self,
       
   106               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   107 
       
   108         self.staticText2 = wx.StaticText(id=ID_SFCSTEPDIALOGSTATICTEXT2,
       
   109               label=_('Connectors:'), name='staticText2', parent=self,
       
   110               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   111 
       
   112         self.staticText3 = wx.StaticText(id=ID_SFCSTEPDIALOGSTATICTEXT3,
       
   113               label=_('Preview:'), name='staticText4', parent=self,
       
   114               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
       
   115 
       
   116         self.StepName = wx.TextCtrl(id=ID_SFCSTEPDIALOGNAME,
       
   117               name='Name', parent=self, pos=wx.Point(0, 0),
       
   118               size=wx.Size(0, 24), style=0)
       
   119         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_SFCSTEPDIALOGNAME)
       
   120 
       
   121         self.checkBox1 = wx.CheckBox(id=ID_SFCSTEPDIALOGCHECKBOX1,
       
   122               label=_("Input"), name='checkBox1', parent=self,
       
   123               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
       
   124         self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_SFCSTEPDIALOGCHECKBOX1)
       
   125         
       
   126         self.checkBox2 = wx.CheckBox(id=ID_SFCSTEPDIALOGCHECKBOX2,
       
   127               label=_("Output"), name='checkBox2', parent=self,
       
   128               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
       
   129         self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_SFCSTEPDIALOGCHECKBOX2)
       
   130         
       
   131         self.checkBox3 = wx.CheckBox(id=ID_SFCSTEPDIALOGCHECKBOX3,
       
   132               label=_("Action"), name='checkBox3', parent=self,
       
   133               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
       
   134         self.Bind(wx.EVT_CHECKBOX, self.OnConnectorsChanged, id=ID_SFCSTEPDIALOGCHECKBOX3)
       
   135         
       
   136         self.Spacer = wx.Panel(id=ID_SFCSTEPDIALOGSPACER,
       
   137               name='Spacer', parent=self, pos=wx.Point(0, 0),
       
   138               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
       
   139 
       
   140         self.Preview = wx.Panel(id=ID_SFCSTEPDIALOGPREVIEW,
       
   141               name='Preview', parent=self, pos=wx.Point(0, 0),
       
   142               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
       
   143         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
    84         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
   144         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
    85         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
   145         setattr(self.Preview, "RefreshStepModel", lambda x:None)
    86         setattr(self.Preview, "RefreshStepModel", lambda x:None)
   146         setattr(self.Preview, "GetScaling", lambda:None)
    87         setattr(self.Preview, "GetScaling", lambda:None)
   147         setattr(self.Preview, "IsOfType", ctrler.IsOfType)
    88         setattr(self.Preview, "IsOfType", controller.IsOfType)
   148 
    89         self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
   149         self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
    90         right_gridsizer.AddWindow(self.Preview, flag=wx.GROW)
   150         if wx.VERSION >= (2, 5, 0):
    91         
   151             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
    92         button_sizer = self.CreateButtonSizer(
   152             self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
    93                   wx.OK|wx.CANCEL|wx.CENTRE)
   153         else:
    94         self.Bind(wx.EVT_BUTTON, self.OnOK, 
   154             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
    95                   button_sizer.GetAffirmativeButton())
   155             wx.EVT_PAINT(self.Preview, self.OnPaint)
    96         main_sizer.AddSizer(button_sizer, border=20, 
   156         
    97               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   157         self._init_sizers()
    98         
   158 
    99         self.SetSizer(main_sizer)
   159     def __init__(self, parent, controler, initial = False):
   100         
   160         self._init_ctrls(parent, controler)
       
   161         self.Step = None
   101         self.Step = None
   162         self.Initial = initial
   102         self.Initial = initial
   163         self.MinStepSize = None
   103         self.MinStepSize = None
   164     
   104     
   165         self.PouNames = []
   105         self.PouNames = []
   170     
   110     
   171     def SetPreviewFont(self, font):
   111     def SetPreviewFont(self, font):
   172         self.Preview.SetFont(font)
   112         self.Preview.SetFont(font)
   173     
   113     
   174     def OnOK(self, event):
   114     def OnOK(self, event):
       
   115         message = None
   175         step_name = self.StepName.GetValue()
   116         step_name = self.StepName.GetValue()
   176         if step_name == "":
   117         if step_name == "":
   177             message = wx.MessageDialog(self, _("You must type a name!"), _("Error"), wx.OK|wx.ICON_ERROR)
   118             message = _("You must type a name!")
   178             message.ShowModal()
       
   179             message.Destroy()
       
   180         elif not TestIdentifier(step_name):
   119         elif not TestIdentifier(step_name):
   181             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
   120             message = _("\"%s\" is not a valid identifier!") % step_name
   182             message.ShowModal()
       
   183             message.Destroy()
       
   184         elif step_name.upper() in IEC_KEYWORDS:
   121         elif step_name.upper() in IEC_KEYWORDS:
   185             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
   122             message = _("\"%s\" is a keyword. It can't be used!") % step_name
   186             message.ShowModal()
       
   187             message.Destroy()
       
   188         elif step_name.upper() in self.PouNames:
   123         elif step_name.upper() in self.PouNames:
   189             message = wx.MessageDialog(self, _("A POU named \"%s\" already exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
   124             message = _("A POU named \"%s\" already exists!") % step_name
   190             message.ShowModal()
       
   191             message.Destroy()
       
   192         elif step_name.upper() in self.Variables:
   125         elif step_name.upper() in self.Variables:
   193             message = wx.MessageDialog(self, _("A variable with \"%s\" as name already exists in this pou!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
   126             message = _("A variable with \"%s\" as name already exists in this pou!") % step_name
   194             message.ShowModal()
       
   195             message.Destroy()
       
   196         elif step_name.upper() in self.StepNames:
   127         elif step_name.upper() in self.StepNames:
   197             message = wx.MessageDialog(self, _("\"%s\" step already exists!")%step_name, _("Error"), wx.OK|wx.ICON_ERROR)
   128             message = _("\"%s\" step already exists!") % step_name
   198             message.ShowModal()
   129         if message is not None:
   199             message.Destroy()
   130             dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
       
   131             dialog.ShowModal()
       
   132             dialog.Destroy()    
   200         else:
   133         else:
   201             self.EndModal(wx.ID_OK)
   134             self.EndModal(wx.ID_OK)
   202     
   135     
   203     def SetMinStepSize(self, size):
   136     def SetMinStepSize(self, size):
   204         self.MinStepSize = size
   137         self.MinStepSize = size
   216         value_name = values.get("name", None)
   149         value_name = values.get("name", None)
   217         if value_name:
   150         if value_name:
   218             self.StepName.SetValue(value_name)
   151             self.StepName.SetValue(value_name)
   219         else:
   152         else:
   220             self.StepName.SetValue("")
   153             self.StepName.SetValue("")
   221         self.checkBox1.SetValue(values.get("input", False))
   154         self.Input.SetValue(values.get("input", False))
   222         self.checkBox2.SetValue(values.get("output", False))
   155         self.Output.SetValue(values.get("output", False))
   223         self.checkBox3.SetValue(values.get("action", False))
   156         self.Action.SetValue(values.get("action", False))
   224         self.RefreshPreview()
   157         self.RefreshPreview()
   225         
   158         
   226     def GetValues(self):
   159     def GetValues(self):
   227         values = {}
   160         values = {}
   228         values["name"] = self.StepName.GetValue()
   161         values["name"] = self.StepName.GetValue()
   229         values["input"] = self.checkBox1.IsChecked()
   162         values["input"] = self.Input.IsChecked()
   230         values["output"] = self.checkBox2.IsChecked()
   163         values["output"] = self.Output.IsChecked()
   231         values["action"] = self.checkBox3.IsChecked()
   164         values["action"] = self.Action.IsChecked()
   232         values["width"], values["height"] = self.Step.GetSize()
   165         values["width"], values["height"] = self.Step.GetSize()
   233         return values
   166         return values
   234     
   167     
   235     def OnConnectorsChanged(self, event):
   168     def OnConnectorsChanged(self, event):
   236         self.RefreshPreview()
   169         self.RefreshPreview()
   243     def RefreshPreview(self):
   176     def RefreshPreview(self):
   244         dc = wx.ClientDC(self.Preview)
   177         dc = wx.ClientDC(self.Preview)
   245         dc.SetFont(self.Preview.GetFont())
   178         dc.SetFont(self.Preview.GetFont())
   246         dc.Clear()
   179         dc.Clear()
   247         self.Step = SFC_Step(self.Preview, self.StepName.GetValue(), self.Initial)
   180         self.Step = SFC_Step(self.Preview, self.StepName.GetValue(), self.Initial)
   248         if self.checkBox1.IsChecked():
   181         if self.Input.IsChecked():
   249             self.Step.AddInput()
   182             self.Step.AddInput()
   250         else:
   183         else:
   251             self.Step.RemoveInput()
   184             self.Step.RemoveInput()
   252         if self.checkBox2.IsChecked():
   185         if self.Output.IsChecked():
   253             self.Step.AddOutput()
   186             self.Step.AddOutput()
   254         else:
   187         else:
   255             self.Step.RemoveOutput()
   188             self.Step.RemoveOutput()
   256         if self.checkBox3.IsChecked():
   189         if self.Action.IsChecked():
   257             self.Step.AddAction()    
   190             self.Step.AddAction()    
   258         else:
   191         else:
   259             self.Step.RemoveAction()
   192             self.Step.RemoveAction()
   260         width, height = self.MinStepSize
   193         width, height = self.MinStepSize
   261         min_width, min_height = self.Step.GetMinSize()
   194         min_width, min_height = self.Step.GetMinSize()