dialogs/FBDBlockDialog.py
changeset 1236 a5d1d2a2f366
parent 1230 5a4c5724788e
child 1237 0c8b8ef9559b
equal deleted inserted replaced
1235:1a30c70fa025 1236:a5d1d2a2f366
    20 #
    20 #
    21 #You should have received a copy of the GNU General Public
    21 #You should have received a copy of the GNU General Public
    22 #License along with this library; if not, write to the Free Software
    22 #License along with this library; if not, write to the Free Software
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
       
    25 import re
       
    26 
    25 import wx
    27 import wx
    26 
    28 
    27 from graphics import *
    29 from graphics.FBD_Objects import FBD_Block
    28 from controls.LibraryPanel import LibraryPanel
    30 from controls.LibraryPanel import LibraryPanel
       
    31 from BlockPreviewDialog import BlockPreviewDialog
    29 
    32 
    30 #-------------------------------------------------------------------------------
    33 #-------------------------------------------------------------------------------
    31 #                          Create New Block Dialog
    34 #                          Create New Block Dialog
    32 #-------------------------------------------------------------------------------
    35 #-------------------------------------------------------------------------------
    33 
    36 
    34 class FBDBlockDialog(wx.Dialog):
    37 class FBDBlockDialog(BlockPreviewDialog):
    35     
    38     
    36     def __init__(self, parent, controller):
    39     def __init__(self, parent, controller, tagname):
    37         wx.Dialog.__init__(self, parent,
    40         BlockPreviewDialog.__init__(self, parent, controller, tagname,
    38               size=wx.Size(600, 450), title=_('Block Properties'))
    41               size=wx.Size(600, 450), title=_('Block Properties'))
    39         
    42         
    40         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10)
    43         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=4, vgap=10)
    41         main_sizer.AddGrowableCol(0)
    44         main_sizer.AddGrowableCol(0)
    42         main_sizer.AddGrowableRow(0)
    45         main_sizer.AddGrowableRow(0)
    97         
   100         
    98         self.ExecutionControl = wx.CheckBox(self)
   101         self.ExecutionControl = wx.CheckBox(self)
    99         self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, self.ExecutionControl)
   102         self.Bind(wx.EVT_CHECKBOX, self.OnExecutionOrderChanged, self.ExecutionControl)
   100         top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW)
   103         top_right_gridsizer.AddWindow(self.ExecutionControl, flag=wx.GROW)
   101         
   104         
   102         preview_label = wx.StaticText(self, label=_('Preview:'))
   105         right_gridsizer.AddWindow(self.PreviewLabel, flag=wx.GROW)
   103         right_gridsizer.AddWindow(preview_label, flag=wx.GROW)
       
   104 
       
   105         self.Preview = wx.Panel(self,
       
   106               style=wx.TAB_TRAVERSAL|wx.SIMPLE_BORDER)
       
   107         self.Preview.SetBackgroundColour(wx.Colour(255,255,255))
       
   108         setattr(self.Preview, "GetDrawingMode", lambda:FREEDRAWING_MODE)
       
   109         setattr(self.Preview, "GetScaling", lambda:None)
       
   110         setattr(self.Preview, "GetBlockType", controller.GetBlockType)
       
   111         setattr(self.Preview, "IsOfType", controller.IsOfType)
       
   112         self.Preview.Bind(wx.EVT_PAINT, self.OnPaint)
       
   113         right_gridsizer.AddWindow(self.Preview, flag=wx.GROW)
   106         right_gridsizer.AddWindow(self.Preview, flag=wx.GROW)
   114         
   107         
   115         button_sizer = self.CreateButtonSizer(wx.OK|wx.CANCEL|wx.CENTRE)
   108         main_sizer.AddSizer(self.ButtonSizer, border=20, 
   116         self.Bind(wx.EVT_BUTTON, self.OnOK, button_sizer.GetAffirmativeButton())
       
   117         main_sizer.AddSizer(button_sizer, border=20, 
       
   118               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   109               flag=wx.ALIGN_RIGHT|wx.BOTTOM|wx.LEFT|wx.RIGHT)
   119         
   110         
   120         self.SetSizer(main_sizer)
   111         self.SetSizer(main_sizer)
   121         
       
   122         self.Controller = controller
       
   123         
   112         
   124         self.BlockName.SetValue("")
   113         self.BlockName.SetValue("")
   125         self.BlockName.Enable(False)
   114         self.BlockName.Enable(False)
   126         self.Inputs.Enable(False)
   115         self.Inputs.Enable(False)
   127         self.Block = None
   116         self.CurrentBlockName = None
   128         self.MinBlockSize = None
   117         
   129         self.First = True
   118         self.LibraryPanel.SetBlockList(controller.GetBlockTypes(tagname))
   130         
       
   131         self.PouNames = []
       
   132         self.PouElementNames = []
       
   133         
       
   134         self.LibraryPanel.SetFocus()
   119         self.LibraryPanel.SetFocus()
   135     
       
   136     def __del__(self):
       
   137         self.Controller = None
       
   138     
       
   139     def SetBlockList(self, blocklist):
       
   140         self.LibraryPanel.SetBlockList(blocklist)
       
   141     
       
   142     def SetPreviewFont(self, font):
       
   143         self.Preview.SetFont(font)
       
   144     
   120     
   145     def OnOK(self, event):
   121     def OnOK(self, event):
   146         message = None
   122         message = None
   147         selected = self.LibraryPanel.GetSelectedBlock()
   123         selected = self.LibraryPanel.GetSelectedBlock()
   148         block_name = self.BlockName.GetValue()
   124         block_name = self.BlockName.GetValue()
   149         name_enabled = self.BlockName.IsEnabled()
   125         name_enabled = self.BlockName.IsEnabled()
   150         if selected is None:
   126         if selected is None:
   151             message = _("Form isn't complete. Valid block type must be selected!")
   127             message = _("Form isn't complete. Valid block type must be selected!")
   152         elif name_enabled and block_name == "":
   128         elif name_enabled and block_name == "":
   153             message = _("Form isn't complete. Name must be filled!")
   129             message = _("Form isn't complete. Name must be filled!")
   154         elif name_enabled and not TestIdentifier(block_name):
       
   155             message = _("\"%s\" is not a valid identifier!") % block_name
       
   156         elif name_enabled and block_name.upper() in IEC_KEYWORDS:
       
   157             message = _("\"%s\" is a keyword. It can't be used!") % block_name
       
   158         elif name_enabled and block_name.upper() in self.PouNames:
       
   159             message = _("\"%s\" pou already exists!") % block_name
       
   160         elif name_enabled and block_name.upper() in self.PouElementNames:
       
   161             message = _("\"%s\" element for this pou already exists!") % block_name
       
   162         if message is not None:
   130         if message is not None:
   163             dialog = wx.MessageDialog(self, message, _("Error"), wx.OK|wx.ICON_ERROR)
   131             self.ShowMessage(message)
   164             dialog.ShowModal()
   132         elif name_enabled and self.TestBlockName(block_name):
   165             dialog.Destroy()
   133             BlockPreviewDialog.OnOK(self, event)
   166         else:
   134 
   167             self.EndModal(wx.ID_OK)
       
   168 
       
   169     def SetMinBlockSize(self, size):
       
   170         self.MinBlockSize = size
       
   171 
       
   172     def SetPouNames(self, pou_names):
       
   173         self.PouNames = [pou_name.upper() for pou_name in pou_names]
       
   174         
       
   175     def SetPouElementNames(self, element_names):
       
   176         self.PouElementNames = [element_name.upper() for element_name in element_names]
       
   177         
       
   178     def SetValues(self, values):
   135     def SetValues(self, values):
   179         blocktype = values.get("type", None)
   136         blocktype = values.get("type", None)
       
   137         default_name_model = re.compile("%s[0-9]+" % blocktype)
   180         if blocktype is not None:
   138         if blocktype is not None:
   181             self.LibraryPanel.SelectTreeItem(blocktype, values.get("inputs", None))
   139             self.LibraryPanel.SelectTreeItem(blocktype, 
       
   140                                              values.get("inputs", None))
   182         for name, value in values.items():
   141         for name, value in values.items():
   183             if name == "name":
   142             if name == "name":
   184                 self.BlockName.SetValue(value)
   143                 self.DefaultBlockName = value
       
   144                 if default_name_model.match(value) is None:
       
   145                     self.CurrentBlockName = value
       
   146                 self.BlockName.ChangeValue(value)
   185             elif name == "extension":
   147             elif name == "extension":
   186                 self.Inputs.SetValue(value)
   148                 self.Inputs.SetValue(value)
   187             elif name == "executionOrder":
   149             elif name == "executionOrder":
   188                 self.ExecutionOrder.SetValue(value)
   150                 self.ExecutionOrder.SetValue(value)
   189             elif name == "executionControl":
   151             elif name == "executionControl":
   197         values["width"], values["height"] = self.Block.GetSize()
   159         values["width"], values["height"] = self.Block.GetSize()
   198         values["extension"] = self.Inputs.GetValue()
   160         values["extension"] = self.Inputs.GetValue()
   199         values["executionOrder"] = self.ExecutionOrder.GetValue()
   161         values["executionOrder"] = self.ExecutionOrder.GetValue()
   200         values["executionControl"] = self.ExecutionControl.GetValue()
   162         values["executionControl"] = self.ExecutionControl.GetValue()
   201         return values
   163         return values
   202 
   164         
   203     def OnLibraryTreeItemSelected(self, event):
   165     def OnLibraryTreeItemSelected(self, event):
   204         values = self.LibraryPanel.GetSelectedBlock()
   166         values = self.LibraryPanel.GetSelectedBlock()
   205         if values is not None:
   167         blocktype = (self.Controller.GetBlockType(values["type"], 
   206             blocktype = self.Controller.GetBlockType(values["type"], values["inputs"])
   168                                                   values["inputs"])
   207         else:
   169                      if values is not None else None)
   208             blocktype = None
   170         
   209         if blocktype is not None:
   171         if blocktype is not None:
   210             self.Inputs.SetValue(len(blocktype["inputs"]))
   172             self.Inputs.SetValue(len(blocktype["inputs"]))
   211             self.Inputs.Enable(blocktype["extensible"])
   173             self.Inputs.Enable(blocktype["extensible"])
   212             self.BlockName.Enable(blocktype["type"] != "function")
   174         else:
   213             wx.CallAfter(self.RefreshPreview)
   175             self.Inputs.SetValue(2)
       
   176             self.Inputs.Enable(False)
       
   177         
       
   178         if blocktype is not None and blocktype["type"] != "function":
       
   179             self.BlockName.Enable(True)
       
   180             self.BlockName.ChangeValue(
       
   181                 self.CurrentBlockName
       
   182                 if self.CurrentBlockName is not None
       
   183                 else self.Controller.GenerateNewName(
       
   184                     self.TagName, None, values["type"]+"%d", 0))
   214         else:
   185         else:
   215             self.BlockName.Enable(False)
   186             self.BlockName.Enable(False)
   216             self.Inputs.Enable(False)
   187             self.BlockName.ChangeValue("")
   217             self.Inputs.SetValue(2)
   188         
   218             wx.CallAfter(self.ErasePreview)
   189         self.RefreshPreview()
   219     
   190     
   220     def OnNameChanged(self, event):
   191     def OnNameChanged(self, event):
   221         if self.BlockName.IsEnabled():
   192         if self.BlockName.IsEnabled():
       
   193             self.CurrentBlockName = self.BlockName.GetValue()
   222             self.RefreshPreview()
   194             self.RefreshPreview()
   223         event.Skip()
   195         event.Skip()
   224     
   196     
   225     def OnInputsChanged(self, event):
   197     def OnInputsChanged(self, event):
   226         if self.Inputs.IsEnabled():
   198         if self.Inputs.IsEnabled():
   233     
   205     
   234     def OnExecutionControlChanged(self, event):
   206     def OnExecutionControlChanged(self, event):
   235         self.RefreshPreview()
   207         self.RefreshPreview()
   236         event.Skip()
   208         event.Skip()
   237     
   209     
   238     def ErasePreview(self):
       
   239         dc = wx.ClientDC(self.Preview)
       
   240         dc.Clear()
       
   241         self.Block = None
       
   242         
       
   243     def RefreshPreview(self):
   210     def RefreshPreview(self):
   244         dc = wx.ClientDC(self.Preview)
       
   245         dc.SetFont(self.Preview.GetFont())
       
   246         dc.Clear()
       
   247         values = self.LibraryPanel.GetSelectedBlock()
   211         values = self.LibraryPanel.GetSelectedBlock()
   248         if values is not None:
   212         if values is not None:
   249             if self.BlockName.IsEnabled():
   213             if self.BlockName.IsEnabled():
   250                 blockname = self.BlockName.GetValue()
   214                 blockname = self.BlockName.GetValue()
   251             else:
   215             else:
   254                     blockname, 
   218                     blockname, 
   255                     extension = self.Inputs.GetValue(), 
   219                     extension = self.Inputs.GetValue(), 
   256                     inputs = values["inputs"], 
   220                     inputs = values["inputs"], 
   257                     executionControl = self.ExecutionControl.GetValue(), 
   221                     executionControl = self.ExecutionControl.GetValue(), 
   258                     executionOrder = self.ExecutionOrder.GetValue())
   222                     executionOrder = self.ExecutionOrder.GetValue())
   259             width, height = self.MinBlockSize
       
   260             min_width, min_height = self.Block.GetMinSize()
       
   261             width, height = max(min_width, width), max(min_height, height)
       
   262             self.Block.SetSize(width, height)
       
   263             clientsize = self.Preview.GetClientSize()
       
   264             x = (clientsize.width - width) / 2
       
   265             y = (clientsize.height - height) / 2
       
   266             self.Block.SetPosition(x, y)
       
   267             self.Block.Draw(dc)
       
   268         else:
   223         else:
   269             self.Block = None        
   224             self.Block = None 
   270 
   225         BlockPreviewDialog.RefreshPreview(self)
   271     def OnPaint(self, event):
       
   272         if self.Block is not None:
       
   273             self.RefreshPreview()
       
   274         event.Skip()