dialogs/FBDBlockDialog.py
changeset 714 131ea7f237b9
parent 676 0f10f5091245
child 725 7c44fc339889
equal deleted inserted replaced
713:95a0a427f3ef 714:131ea7f237b9
    29 
    29 
    30 #-------------------------------------------------------------------------------
    30 #-------------------------------------------------------------------------------
    31 #                          Create New Block Dialog
    31 #                          Create New Block Dialog
    32 #-------------------------------------------------------------------------------
    32 #-------------------------------------------------------------------------------
    33 
    33 
    34 [ID_FBDBLOCKDIALOG, ID_FBDBLOCKDIALOGNAME, 
       
    35  ID_FBDBLOCKDIALOGTYPETREE, ID_FBDBLOCKDIALOGTYPEDESC, 
       
    36  ID_FBDBLOCKDIALOGINPUTS, ID_FBDBLOCKDIALOGPREVIEW, 
       
    37  ID_FBDBLOCKDIALOGEXECUTIONORDER, ID_FBDBLOCKDIALOGEXECUTIONCONTROL, 
       
    38  ID_FBDBLOCKDIALOGSTATICTEXT1, ID_FBDBLOCKDIALOGSTATICTEXT2, 
       
    39  ID_FBDBLOCKDIALOGSTATICTEXT3, ID_FBDBLOCKDIALOGSTATICTEXT4, 
       
    40  ID_FBDBLOCKDIALOGSTATICTEXT5, ID_FBDBLOCKDIALOGSTATICTEXT6, 
       
    41 ] = [wx.NewId() for _init_ctrls in range(14)]
       
    42 
       
    43 [CATEGORY, BLOCK] = range(2)
       
    44 
       
    45 class FBDBlockDialog(wx.Dialog):
    34 class FBDBlockDialog(wx.Dialog):
    46     
    35     
    47     if wx.VERSION < (2, 6, 0):
    36     def __init__(self, parent, controller):
    48         def Bind(self, event, function, id = None):
    37         wx.Dialog.__init__(self, parent,
    49             if id is not None:
    38               size=wx.Size(600, 400), title=_('Block Properties'))
    50                 event(self, id, function)
    39         
    51             else:
    40         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10)
    52                 event(self, function)
    41         main_sizer.AddGrowableCol(0)
    53     
    42         main_sizer.AddGrowableRow(0)
    54     def _init_coll_flexGridSizer1_Items(self, parent):
    43         
    55         parent.AddSizer(self.MainSizer, 0, border=20, flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    44         column_sizer = wx.BoxSizer(wx.HORIZONTAL)
    56         parent.AddSizer(self.ButtonSizer, 0, border=20, flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
    45         main_sizer.AddSizer(column_sizer, border=20, 
    57 
    46               flag=wx.GROW|wx.TOP|wx.LEFT|wx.RIGHT)
    58     def _init_coll_flexGridSizer1_Growables(self, parent):
    47         
    59         parent.AddGrowableCol(0)
    48         type_staticbox = wx.StaticBox(self, label=_('Type:'))
    60         parent.AddGrowableRow(0)
    49         left_staticboxsizer = wx.StaticBoxSizer(type_staticbox, wx.VERTICAL)
    61 
    50         column_sizer.AddSizer(left_staticboxsizer, 1, border=5, 
    62     def _init_coll_MainSizer_Items(self, parent):
    51               flag=wx.GROW|wx.RIGHT)
    63         parent.AddSizer(self.LeftBoxSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
    52         
    64         parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
       
    65 
       
    66     def _init_coll_LeftBoxSizer_Items(self, parent):
       
    67         parent.AddWindow(self.LibraryPanel, 1, border=5, flag=wx.GROW|wx.TOP)
       
    68     
       
    69     def _init_coll_RightGridSizer_Items(self, parent):
       
    70         parent.AddSizer(self.RightUpGridSizer, 0, border=0, flag=wx.GROW)
       
    71         parent.AddWindow(self.staticText6, 0, border=0, flag=wx.GROW)
       
    72         parent.AddWindow(self.Preview, 0, border=0, flag=wx.GROW)
       
    73 
       
    74     def _init_coll_RightGridSizer_Growables(self, parent):
       
    75         parent.AddGrowableCol(0)
       
    76         parent.AddGrowableRow(2)
       
    77 
       
    78     def _init_coll_RightUpGridSizer_Items(self, parent):
       
    79         parent.AddWindow(self.staticText2, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
       
    80         parent.AddWindow(self.BlockName, 0, border=0, flag=wx.GROW)
       
    81         parent.AddWindow(self.staticText3, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
       
    82         parent.AddWindow(self.Inputs, 0, border=0, flag=wx.GROW)
       
    83         parent.AddWindow(self.staticText4, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
       
    84         parent.AddWindow(self.ExecutionOrder, 0, border=0, flag=wx.GROW)
       
    85         parent.AddWindow(self.staticText5, 0, border=4, flag=wx.ALIGN_CENTER_VERTICAL|wx.TOP)
       
    86         parent.AddWindow(self.ExecutionControl, 0, border=0, flag=wx.GROW)
       
    87     
       
    88     def _init_coll_RightUpGridSizer_Growables(self, parent):
       
    89         parent.AddGrowableCol(1)
       
    90     
       
    91     def _init_sizers(self):
       
    92         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
       
    93         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
       
    94         self.LeftBoxSizer = wx.StaticBoxSizer(self.staticbox1, wx.VERTICAL)
       
    95         self.RightGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
       
    96         self.RightUpGridSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=4, vgap=5)
       
    97         
       
    98         self._init_coll_flexGridSizer1_Items(self.flexGridSizer1)
       
    99         self._init_coll_flexGridSizer1_Growables(self.flexGridSizer1)
       
   100         self._init_coll_MainSizer_Items(self.MainSizer)
       
   101         self._init_coll_LeftBoxSizer_Items(self.LeftBoxSizer)
       
   102         self._init_coll_RightGridSizer_Items(self.RightGridSizer)
       
   103         self._init_coll_RightGridSizer_Growables(self.RightGridSizer)
       
   104         self._init_coll_RightUpGridSizer_Items(self.RightUpGridSizer)
       
   105         self._init_coll_RightUpGridSizer_Growables(self.RightUpGridSizer)
       
   106         
       
   107         self.SetSizer(self.flexGridSizer1)
       
   108 
       
   109     def _init_ctrls(self, prnt):
       
   110         wx.Dialog.__init__(self, id=ID_FBDBLOCKDIALOG,
       
   111               name='FBDBlockDialog', parent=prnt,
       
   112               size=wx.Size(600, 400), style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER,
       
   113               title=_('Block Properties'))
       
   114         self.SetClientSize(wx.Size(600, 400))
       
   115 
       
   116         self.staticbox1 = wx.StaticBox(id=ID_FBDBLOCKDIALOGSTATICTEXT1,
       
   117               label=_('Type:'), name='staticBox1', parent=self,
       
   118               pos=wx.Point(0, 0), size=wx.Size(0, 0), style=0)
       
   119 
       
   120         self.staticText2 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT2,
       
   121               label=_('Name:'), name='staticText2', parent=self,
       
   122               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
       
   123 
       
   124         self.staticText3 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT2,
       
   125               label=_('Inputs:'), name='staticText4', parent=self,
       
   126               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
       
   127 
       
   128         self.staticText4 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT4,
       
   129               label=_('Execution Order:'), name='staticText4', parent=self,
       
   130               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
       
   131 
       
   132         self.staticText5 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT5,
       
   133               label=_('Execution Control:'), name='staticText5', parent=self,
       
   134               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
       
   135 
       
   136         self.staticText6 = wx.StaticText(id=ID_FBDBLOCKDIALOGSTATICTEXT6,
       
   137               label=_('Preview:'), name='staticText6', parent=self,
       
   138               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
       
   139 
       
   140         self.LibraryPanel = LibraryPanel(self)
    53         self.LibraryPanel = LibraryPanel(self)
   141 
    54         self.LibraryPanel.SetController(controller)
   142         self.BlockName = wx.TextCtrl(id=ID_FBDBLOCKDIALOGNAME, value='',
    55         setattr(self.LibraryPanel, "_OnTreeItemSelected", 
   143               name='BlockName', parent=self, pos=wx.Point(0, 0),
    56               self.OnLibraryTreeItemSelected)
   144               size=wx.Size(0, 24), style=0)
    57         left_staticboxsizer.AddWindow(self.LibraryPanel, 1, border=5, 
   145         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_FBDBLOCKDIALOGNAME)
    58               flag=wx.GROW|wx.TOP)
   146 
    59         
   147         self.Inputs = wx.SpinCtrl(id=ID_FBDBLOCKDIALOGINPUTS,
    60         right_gridsizer = wx.FlexGridSizer(cols=1, hgap=0, rows=3, vgap=5)
   148               name='Inputs', parent=self, pos=wx.Point(0, 0),
    61         right_gridsizer.AddGrowableCol(0)
   149               size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=2, max=20)
    62         right_gridsizer.AddGrowableRow(2)
   150         self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, id=ID_FBDBLOCKDIALOGINPUTS)
    63         column_sizer.AddSizer(right_gridsizer, 1, border=5, 
   151 
    64               flag=wx.GROW|wx.LEFT)
   152         self.ExecutionOrder = wx.SpinCtrl(id=ID_FBDBLOCKDIALOGEXECUTIONORDER,
    65         
   153               name='ExecutionOrder', parent=self, pos=wx.Point(0, 0),
    66         top_right_gridsizer = wx.FlexGridSizer(cols=2, hgap=0, rows=4, vgap=5)
   154               size=wx.Size(0, 24), style=wx.SP_ARROW_KEYS, min=0)
    67         top_right_gridsizer.AddGrowableCol(1)
   155         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, id=ID_FBDBLOCKDIALOGEXECUTIONORDER)
    68         right_gridsizer.AddSizer(top_right_gridsizer, flag=wx.GROW)
   156 
    69         
   157         self.ExecutionControl = wx.CheckBox(id=ID_FBDBLOCKDIALOGEXECUTIONCONTROL,
    70         name_label = wx.StaticText(self, label=_('Name:'))
   158               name='ExecutionControl', parent=self, pos=wx.Point(0, 0),
    71         top_right_gridsizer.AddWindow(name_label, 
   159               size=wx.Size(0, 24), style=0)
    72               flag=wx.ALIGN_CENTER_VERTICAL)
   160         self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, id=ID_FBDBLOCKDIALOGEXECUTIONCONTROL)
    73         
   161 
    74         self.BlockName = wx.TextCtrl(self)
   162         self.Preview = wx.Panel(id=ID_FBDBLOCKDIALOGPREVIEW,
    75         self.Bind(wx.EVT_TEXT, self.OnNameChanged, self.BlockName)
   163               name='Preview', parent=self, pos=wx.Point(0, 0),
    76         top_right_gridsizer.AddWindow(self.BlockName, flag=wx.GROW)
   164               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
    77         
       
    78         inputs_label = wx.StaticText(self, label=_('Inputs:'))
       
    79         top_right_gridsizer.AddWindow(inputs_label, 
       
    80               flag=wx.ALIGN_CENTER_VERTICAL)
       
    81         
       
    82         self.Inputs = wx.SpinCtrl(self, min=2, max=20,
       
    83               style=wx.SP_ARROW_KEYS)
       
    84         self.Bind(wx.EVT_SPINCTRL, self.OnInputsChanged, self.Inputs)
       
    85         top_right_gridsizer.AddWindow(self.Inputs, flag=wx.GROW)
       
    86         
       
    87         execution_order_label = wx.StaticText(self, label=_('Execution Order:'))
       
    88         top_right_gridsizer.AddWindow(execution_order_label, 
       
    89               flag=wx.ALIGN_CENTER_VERTICAL)
       
    90         
       
    91         self.ExecutionOrder = wx.SpinCtrl(self, min=0, style=wx.SP_ARROW_KEYS)
       
    92         self.Bind(wx.EVT_SPINCTRL, self.OnExecutionOrderChanged, self.ExecutionOrder)
       
    93         top_right_gridsizer.AddWindow(self.ExecutionOrder, flag=wx.GROW)
       
    94                 
       
    95         execution_control_label = wx.StaticText(self, label=_('Execution Control:'))
       
    96         top_right_gridsizer.AddWindow(execution_control_label, 
       
    97               flag=wx.ALIGN_CENTER_VERTICAL)
       
    98         
       
    99         self.ExecutionControl = wx.CheckBox(self)
       
   100         self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, self.ExecutionControl)
       
   101         top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW)
       
   102         
       
   103         preview_label = wx.StaticText(self, label=_('Preview:'))
       
   104         right_gridsizer.AddWindow(preview_label, flag=wx.GROW)
       
   105 
       
   106         self.Preview = wx.Panel(self,
       
   107               style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
   165         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
   108         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
   166         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
   109         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
   167         setattr(self.Preview, "GetScaling", lambda:None)
   110         setattr(self.Preview, "GetScaling", lambda:None)
   168         setattr(self.Preview, "GetBlockType", self.Controler.GetBlockType)
   111         setattr(self.Preview, "GetBlockType", controller.GetBlockType)
   169         setattr(self.Preview, "IsOfType", self.Controler.IsOfType)
   112         setattr(self.Preview, "IsOfType", controller.IsOfType)
   170 
   113         self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
   171         self.ButtonSizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
   114         right_gridsizer.AddWindow(self.Preview, flag=wx.GROW)
   172         if wx.VERSION >= (2, 5, 0):
   115         
   173             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetAffirmativeButton().GetId())
   116         button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
   174             self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
   117         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
   175         else:
   118         main_sizer.AddSizer(button_sizer, border=20, 
   176             self.Bind(wx.EVT_BUTTON, self.OnOK, id=self.ButtonSizer.GetChildren()[0].GetSizer().GetChildren()[0].GetWindow().GetId())
   119               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   177             wx.EVT_PAINT(self.Preview, self.OnPaint)
   120         
   178         
   121         self.SetSizer(main_sizer)
   179         self._init_sizers()
   122         
   180 
   123         self.Controller = controller
   181     def __init__(self, parent, controler):
   124         
   182         self.Controler = controler
       
   183         self._init_ctrls(parent)
       
   184         self.BlockName.SetValue("")
   125         self.BlockName.SetValue("")
   185         self.BlockName.Enable(False)
   126         self.BlockName.Enable(False)
   186         self.Inputs.Enable(False)
   127         self.Inputs.Enable(False)
   187         self.Block = None
   128         self.Block = None
   188         self.MinBlockSize = None
   129         self.MinBlockSize = None
   189         self.First = True
   130         self.First = True
   190         
   131         
   191         self.PouNames = []
   132         self.PouNames = []
   192         self.PouElementNames = []
   133         self.PouElementNames = []
   193         
   134         
   194         self.LibraryPanel.SetControler(controler)
       
   195         setattr(self.LibraryPanel, "_OnTreeItemSelected", self.OnLibraryTreeItemSelected)
       
   196         self.LibraryPanel.SetFocus()
   135         self.LibraryPanel.SetFocus()
   197     
   136     
   198     def SetBlockList(self, blocklist):
   137     def SetBlockList(self, blocklist):
   199         self.LibraryPanel.SetBlockList(blocklist)
   138         self.LibraryPanel.SetBlockList(blocklist)
   200     
   139     
   201     def SetPreviewFont(self, font):
   140     def SetPreviewFont(self, font):
   202         self.Preview.SetFont(font)
   141         self.Preview.SetFont(font)
   203     
   142     
   204     def OnOK(self, event):
   143     def OnOK(self, event):
       
   144         message = None
   205         selected = self.LibraryPanel.GetSelectedBlock()
   145         selected = self.LibraryPanel.GetSelectedBlock()
   206         block_name = self.BlockName.GetValue()
   146         block_name = self.BlockName.GetValue()
   207         name_enabled = self.BlockName.IsEnabled()
   147         name_enabled = self.BlockName.IsEnabled()
   208         if selected is None:
   148         if selected is None:
   209             message = wx.MessageDialog(self, _("Form isn't complete. Valid block type must be selected!"), _("Error"), wx.OK|wx.ICON_ERROR)
   149             message = _("Form isn't complete. Valid block type must be selected!")
   210             message.ShowModal()
       
   211             message.Destroy()
       
   212         elif name_enabled and block_name == "":
   150         elif name_enabled and block_name == "":
   213             message = wx.MessageDialog(self, _("Form isn't complete. Name must be filled!"), _("Error"), wx.OK|wx.ICON_ERROR)
   151             message = _("Form isn't complete. Name must be filled!")
   214             message.ShowModal()
       
   215             message.Destroy()
       
   216         elif name_enabled and not TestIdentifier(block_name):
   152         elif name_enabled and not TestIdentifier(block_name):
   217             message = wx.MessageDialog(self, _("\"%s\" is not a valid identifier!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
   153             message = _("\"%s\" is not a valid identifier!") % block_name
   218             message.ShowModal()
       
   219             message.Destroy()
       
   220         elif name_enabled and block_name.upper() in IEC_KEYWORDS:
   154         elif name_enabled and block_name.upper() in IEC_KEYWORDS:
   221             message = wx.MessageDialog(self, _("\"%s\" is a keyword. It can't be used!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
   155             message = _("\"%s\" is a keyword. It can't be used!") % block_name
   222             message.ShowModal()
       
   223             message.Destroy()
       
   224         elif name_enabled and block_name.upper() in self.PouNames:
   156         elif name_enabled and block_name.upper() in self.PouNames:
   225             message = wx.MessageDialog(self, _("\"%s\" pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
   157             message = _("\"%s\" pou already exists!") % block_name
   226             message.ShowModal()
       
   227             message.Destroy()
       
   228         elif name_enabled and block_name.upper() in self.PouElementNames:
   158         elif name_enabled and block_name.upper() in self.PouElementNames:
   229             message = wx.MessageDialog(self, _("\"%s\" element for this pou already exists!")%block_name, _("Error"), wx.OK|wx.ICON_ERROR)
   159             message = _("\"%s\" element for this pou already exists!") % block_name
   230             message.ShowModal()
   160         if message is not None:
   231             message.Destroy()
   161             dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
       
   162             dialog.ShowModal()
       
   163             dialog.Destroy()
   232         else:
   164         else:
   233             self.EndModal(wx.ID_OK)
   165             self.EndModal(wx.ID_OK)
   234 
   166 
   235     def SetMinBlockSize(self, size):
   167     def SetMinBlockSize(self, size):
   236         self.MinBlockSize = size
   168         self.MinBlockSize = size
   267         return values
   199         return values
   268 
   200 
   269     def OnLibraryTreeItemSelected(self, event):
   201     def OnLibraryTreeItemSelected(self, event):
   270         values = self.LibraryPanel.GetSelectedBlock()
   202         values = self.LibraryPanel.GetSelectedBlock()
   271         if values is not None:
   203         if values is not None:
   272             blocktype = self.Controler.GetBlockType(values["type"], values["inputs"])
   204             blocktype = self.Controller.GetBlockType(values["type"], values["inputs"])
   273         else:
   205         else:
   274             blocktype = None
   206             blocktype = None
   275         if blocktype is not None:
   207         if blocktype is not None:
   276             self.Inputs.SetValue(len(blocktype["inputs"]))
   208             self.Inputs.SetValue(len(blocktype["inputs"]))
   277             self.Inputs.Enable(blocktype["extensible"])
   209             self.Inputs.Enable(blocktype["extensible"])