Dialogs.py
changeset 95 ee66a9a1748b
parent 80 c798a68c5560
child 96 d178cfa9e77f
equal deleted inserted replaced
94:e7f5a251f251 95:ee66a9a1748b
    67         parent.AddGrowableRow(2)
    67         parent.AddGrowableRow(2)
    68 
    68 
    69     def _init_coll_RightUpGridSizer_Items(self, parent):
    69     def _init_coll_RightUpGridSizer_Items(self, parent):
    70         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW|wx.ALIGN_BOTTOM)
    70         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW|wx.ALIGN_BOTTOM)
    71         parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW|wx.ALIGN_BOTTOM)
    71         parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW|wx.ALIGN_BOTTOM)
    72         parent.AddWindow(self.Name, 0, border=0, flag=wx.GROW)
    72         parent.AddWindow(self.BlockName, 0, border=0, flag=wx.GROW)
    73         parent.AddWindow(self.Inputs, 0, border=0, flag=wx.GROW)
    73         parent.AddWindow(self.Inputs, 0, border=0, flag=wx.GROW)
    74 
    74 
    75     def _init_sizers(self):
    75     def _init_sizers(self):
    76         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
    76         self.flexGridSizer1 = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10)
    77         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
    77         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
   110 
   110 
   111         self.staticText4 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT4,
   111         self.staticText4 = wx.StaticText(id=ID_BLOCKPROPERTIESDIALOGSTATICTEXT4,
   112               label='Preview:', name='staticText4', parent=self,
   112               label='Preview:', name='staticText4', parent=self,
   113               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
   113               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
   114 
   114 
       
   115         if wx.Platform == '__WXMSW__':
       
   116             treestyle = wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER
       
   117         else:
       
   118             treestyle = wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER
   115         self.TypeTree = wx.TreeCtrl(id=ID_BLOCKPROPERTIESDIALOGTYPETREE,
   119         self.TypeTree = wx.TreeCtrl(id=ID_BLOCKPROPERTIESDIALOGTYPETREE,
   116               name='TypeTree', parent=self, pos=wx.Point(0, 0),
   120               name='TypeTree', parent=self, pos=wx.Point(0, 0),
   117               size=wx.Size(0, 0), style=wx.TR_HAS_BUTTONS|wx.TR_HIDE_ROOT|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   121               size=wx.Size(0, 0), style=wx.TR_HAS_BUTTONS|wx.TR_SINGLE|wx.SUNKEN_BORDER)
   118         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypeTreeItemSelected,
   122         self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnTypeTreeItemSelected,
   119               id=ID_BLOCKPROPERTIESDIALOGTYPETREE)
   123               id=ID_BLOCKPROPERTIESDIALOGTYPETREE)
   120 
   124 
   121         self.TypeDesc = wx.TextCtrl(id=ID_BLOCKPROPERTIESDIALOGTYPEDESC,
   125         self.TypeDesc = wx.TextCtrl(id=ID_BLOCKPROPERTIESDIALOGTYPEDESC,
   122               name='TypeDesc', parent=self, pos=wx.Point(0, 0),
   126               name='TypeDesc', parent=self, pos=wx.Point(0, 0),
   123               size=wx.Size(0, 0), style=wx.TE_READONLY|wx.TE_MULTILINE)
   127               size=wx.Size(0, 0), style=wx.TE_READONLY|wx.TE_MULTILINE)
   124 
   128 
   125         self.Name = wx.TextCtrl(id=ID_BLOCKPROPERTIESDIALOGNAME, value='',
   129         self.BlockName = wx.TextCtrl(id=ID_BLOCKPROPERTIESDIALOGNAME, value='',
   126               name='Name', parent=self, pos=wx.Point(0, 0),
   130               name='BlockName', parent=self, pos=wx.Point(0, 0),
   127               size=wx.Size(0, 24), style=0)
   131               size=wx.Size(0, 24), style=0)
   128         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_BLOCKPROPERTIESDIALOGNAME)
   132         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_BLOCKPROPERTIESDIALOGNAME)
   129 
   133 
   130         self.Inputs = wx.SpinCtrl(id=ID_BLOCKPROPERTIESDIALOGINPUTS,
   134         self.Inputs = wx.SpinCtrl(id=ID_BLOCKPROPERTIESDIALOGINPUTS,
   131               name='Inputs', parent=self, pos=wx.Point(0, 0),
   135               name='Inputs', parent=self, pos=wx.Point(0, 0),
   145         
   149         
   146         self._init_sizers()
   150         self._init_sizers()
   147 
   151 
   148     def __init__(self, parent):
   152     def __init__(self, parent):
   149         self._init_ctrls(parent)
   153         self._init_ctrls(parent)
   150         self.Name.SetValue("")
   154         self.BlockName.SetValue("")
   151         self.Name.Enable(False)
   155         self.BlockName.Enable(False)
   152         self.Inputs.Enable(False)
   156         self.Inputs.Enable(False)
   153         self.Block = None
   157         self.Block = None
   154         self.MinBlockSize = None
   158         self.MinBlockSize = None
   155         
   159         
   156         self.PouNames = []
   160         self.PouNames = []
   175         return None
   179         return None
   176     
   180     
   177     def OnOK(self, event):
   181     def OnOK(self, event):
   178         error = []
   182         error = []
   179         selected = self.TypeTree.GetSelection()
   183         selected = self.TypeTree.GetSelection()
   180         block_name = self.Name.GetValue()
   184         block_name = self.BlockName.GetValue()
   181         name_enabled = self.Name.IsEnabled()
   185         name_enabled = self.BlockName.IsEnabled()
   182         if not selected.IsOk() or self.TypeTree.GetItemParent(selected) == self.TypeTree.GetRootItem() or selected == self.TypeTree.GetRootItem():
   186         if not selected.IsOk() or self.TypeTree.GetItemParent(selected) == self.TypeTree.GetRootItem() or selected == self.TypeTree.GetRootItem():
   183             message = wx.MessageDialog(self, "Form isn't complete. Valid block type must be selected!", "Error", wx.OK|wx.ICON_ERROR)
   187             message = wx.MessageDialog(self, "Form isn't complete. Valid block type must be selected!", "Error", wx.OK|wx.ICON_ERROR)
   184             message.ShowModal()
   188             message.ShowModal()
   185             message.Destroy()
   189             message.Destroy()
   186         elif name_enabled and block_name == "":
   190         elif name_enabled and block_name == "":
   205             message.Destroy()
   209             message.Destroy()
   206         else:
   210         else:
   207             self.EndModal(wx.ID_OK)
   211             self.EndModal(wx.ID_OK)
   208 
   212 
   209     def SetBlockList(self, blocktypes):
   213     def SetBlockList(self, blocktypes):
   210         root = self.TypeTree.AddRoot("")
   214         if wx.Platform == '__WXMSW__':
       
   215             root = self.TypeTree.AddRoot("Block Types")
       
   216         else:
       
   217             root = self.TypeTree.AddRoot("")
   211         self.TypeTree.SetPyData(root, {"type" : CATEGORY})
   218         self.TypeTree.SetPyData(root, {"type" : CATEGORY})
   212         for category in blocktypes:
   219         for category in blocktypes:
   213             category_item = self.TypeTree.AppendItem(root, category["name"])
   220             category_item = self.TypeTree.AppendItem(root, category["name"])
   214             self.TypeTree.SetPyData(category_item, {"type" : CATEGORY})
   221             self.TypeTree.SetPyData(category_item, {"type" : CATEGORY})
   215             for blocktype in category["list"]:
   222             for blocktype in category["list"]:
   216                 blocktype_item = self.TypeTree.AppendItem(category_item, blocktype["name"])
   223                 blocktype_item = self.TypeTree.AppendItem(category_item, blocktype["name"])
   217                 self.TypeTree.SetPyData(blocktype_item, {"type" : BLOCK, "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
   224                 self.TypeTree.SetPyData(blocktype_item, {"type" : BLOCK, "inputs" : tuple([type for name, type, modifier in blocktype["inputs"]])})
       
   225         if wx.Platform == '__WXMSW__':
       
   226             self.TypeTree.Expand(root)
   218 
   227 
   219     def SetMinBlockSize(self, size):
   228     def SetMinBlockSize(self, size):
   220         self.MinBlockSize = size
   229         self.MinBlockSize = size
   221 
   230 
   222     def SetPouNames(self, pou_names):
   231     def SetPouNames(self, pou_names):
   233                     inputs = values["inputs"]
   242                     inputs = values["inputs"]
   234                 item = self.FindTreeItem(self.TypeTree.GetRootItem(), value, inputs)
   243                 item = self.FindTreeItem(self.TypeTree.GetRootItem(), value, inputs)
   235                 if item:
   244                 if item:
   236                     self.TypeTree.SelectItem(item)
   245                     self.TypeTree.SelectItem(item)
   237             elif name == "name":
   246             elif name == "name":
   238                 self.Name.SetValue(value)
   247                 self.BlockName.SetValue(value)
   239             elif name == "extension":
   248             elif name == "extension":
   240                 self.Inputs.SetValue(value)
   249                 self.Inputs.SetValue(value)
   241         self.RefreshPreview()
   250         self.RefreshPreview()
   242 
   251 
   243     def GetValues(self):
   252     def GetValues(self):
   244         values = {}
   253         values = {}
   245         item = self.TypeTree.GetSelection()
   254         item = self.TypeTree.GetSelection()
   246         values["type"] = self.TypeTree.GetItemText(item)
   255         values["type"] = self.TypeTree.GetItemText(item)
   247         values["inputs"] = self.TypeTree.GetPyData(item)["inputs"]
   256         values["inputs"] = self.TypeTree.GetPyData(item)["inputs"]
   248         if self.Name.GetValue() != "":
   257         if self.BlockName.GetValue() != "":
   249             values["name"] = self.Name.GetValue()
   258             values["name"] = self.BlockName.GetValue()
   250         values["width"], values["height"] = self.Block.GetSize()
   259         values["width"], values["height"] = self.Block.GetSize()
   251         values["extension"] = self.Inputs.GetValue()
   260         values["extension"] = self.Inputs.GetValue()
   252         return values
   261         return values
   253 
   262 
   254     def OnTypeTreeItemSelected(self, event):
   263     def OnTypeTreeItemSelected(self, event):
   255         self.Name.SetValue("")
   264         self.BlockName.SetValue("")
   256         selected = event.GetItem()
   265         selected = event.GetItem()
   257         pydata = self.TypeTree.GetPyData(selected)
   266         pydata = self.TypeTree.GetPyData(selected)
   258         if pydata["type"] != CATEGORY:
   267         if pydata["type"] != CATEGORY:
   259             blocktype = GetBlockType(self.TypeTree.GetItemText(selected), pydata["inputs"])
   268             blocktype = GetBlockType(self.TypeTree.GetItemText(selected), pydata["inputs"])
   260             if blocktype:
   269             if blocktype:
   261                 self.Inputs.SetValue(len(blocktype["inputs"]))
   270                 self.Inputs.SetValue(len(blocktype["inputs"]))
   262                 self.Inputs.Enable(blocktype["extensible"])
   271                 self.Inputs.Enable(blocktype["extensible"])
   263                 self.Name.Enable(blocktype["type"] != "function")
   272                 self.BlockName.Enable(blocktype["type"] != "function")
   264                 self.TypeDesc.SetValue(blocktype["comment"])
   273                 self.TypeDesc.SetValue(blocktype["comment"])
   265                 wx.CallAfter(self.RefreshPreview)
   274                 wx.CallAfter(self.RefreshPreview)
   266             else:
   275             else:
   267                 self.Name.Enable(False)
   276                 self.BlockName.Enable(False)
   268                 self.Inputs.Enable(False)
   277                 self.Inputs.Enable(False)
   269                 self.Inputs.SetValue(2)
   278                 self.Inputs.SetValue(2)
   270                 self.TypeDesc.SetValue("")
   279                 self.TypeDesc.SetValue("")
   271                 wx.CallAfter(self.ErasePreview)
   280                 wx.CallAfter(self.ErasePreview)
   272         else:
   281         else:
   273             self.Name.Enable(False)
   282             self.BlockName.Enable(False)
   274             self.Inputs.Enable(False)
   283             self.Inputs.Enable(False)
   275             self.Inputs.SetValue(2)
   284             self.Inputs.SetValue(2)
   276             self.TypeDesc.SetValue("")
   285             self.TypeDesc.SetValue("")
   277             wx.CallAfter(self.ErasePreview)
   286             wx.CallAfter(self.ErasePreview)
   278         event.Skip()
   287         event.Skip()
   279 
   288 
   280     def OnNameChanged(self, event):
   289     def OnNameChanged(self, event):
   281         if self.Name.IsEnabled():
   290         if self.BlockName.IsEnabled():
   282             self.RefreshPreview()
   291             self.RefreshPreview()
   283         event.Skip()
   292         event.Skip()
   284     
   293     
   285     def OnInputsChanged(self, event):
   294     def OnInputsChanged(self, event):
   286         if self.Inputs.IsEnabled():
   295         if self.Inputs.IsEnabled():
   301             if pydata["type"] == CATEGORY:
   310             if pydata["type"] == CATEGORY:
   302                 self.Block = None
   311                 self.Block = None
   303             else:
   312             else:
   304                 blocktype = self.TypeTree.GetItemText(item)
   313                 blocktype = self.TypeTree.GetItemText(item)
   305                 if blocktype:
   314                 if blocktype:
   306                     self.Block = FBD_Block(self.Preview, blocktype, self.Name.GetValue(), extension = self.Inputs.GetValue(), inputs = pydata["inputs"])
   315                     self.Block = FBD_Block(self.Preview, blocktype, self.BlockName.GetValue(), extension = self.Inputs.GetValue(), inputs = pydata["inputs"])
   307                     width, height = self.MinBlockSize
   316                     width, height = self.MinBlockSize
   308                     min_width, min_height = self.Block.GetMinSize()
   317                     min_width, min_height = self.Block.GetMinSize()
   309                     width, height = max(min_width, width), max(min_height, height)
   318                     width, height = max(min_width, width), max(min_height, height)
   310                     self.Block.SetSize(width, height)
   319                     self.Block.SetSize(width, height)
   311                     clientsize = self.Preview.GetClientSize()
   320                     clientsize = self.Preview.GetClientSize()
   317                     self.Block = None
   326                     self.Block = None
   318 
   327 
   319     def OnPaint(self, event):
   328     def OnPaint(self, event):
   320         if self.Block:
   329         if self.Block:
   321             self.RefreshPreview()
   330             self.RefreshPreview()
   322 
   331         event.Skip()
   323 
   332 
   324 #-------------------------------------------------------------------------------
   333 #-------------------------------------------------------------------------------
   325 #                          Create New Variable Dialog
   334 #                          Create New Variable Dialog
   326 #-------------------------------------------------------------------------------
   335 #-------------------------------------------------------------------------------
   327 
   336 
   365         parent.AddGrowableCol(0)
   374         parent.AddGrowableCol(0)
   366         parent.AddGrowableRow(2)
   375         parent.AddGrowableRow(2)
   367             
   376             
   368     def _init_coll_RightGridSizer_Items(self, parent):
   377     def _init_coll_RightGridSizer_Items(self, parent):
   369         parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
   378         parent.AddWindow(self.staticText3, 0, border=0, flag=wx.GROW)
   370         parent.AddWindow(self.Name, 0, border=0, flag=wx.GROW)
   379         parent.AddWindow(self.VariableName, 0, border=0, flag=wx.GROW)
   371         
   380         
   372     def _init_coll_RightGridSizer_Growables(self, parent):
   381     def _init_coll_RightGridSizer_Growables(self, parent):
   373         parent.AddGrowableCol(0)
   382         parent.AddGrowableCol(0)
   374         parent.AddGrowableRow(1)
   383         parent.AddGrowableRow(1)
   375         
   384         
   418         self.Class = wx.Choice(id=ID_VARIABLEPROPERTIESDIALOGCLASS,
   427         self.Class = wx.Choice(id=ID_VARIABLEPROPERTIESDIALOGCLASS,
   419               name='Class', parent=self, pos=wx.Point(0, 0),
   428               name='Class', parent=self, pos=wx.Point(0, 0),
   420               size=wx.Size(0, 24), style=0)
   429               size=wx.Size(0, 24), style=0)
   421         self.Bind(wx.EVT_CHOICE, self.OnClassChanged, id=ID_VARIABLEPROPERTIESDIALOGCLASS)
   430         self.Bind(wx.EVT_CHOICE, self.OnClassChanged, id=ID_VARIABLEPROPERTIESDIALOGCLASS)
   422         
   431         
   423         self.Name = wx.ListBox(id=ID_VARIABLEPROPERTIESDIALOGNAME,
   432         self.VariableName = wx.ListBox(id=ID_VARIABLEPROPERTIESDIALOGNAME,
   424               name='Name', parent=self, pos=wx.Point(0, 0),
   433               name='Name', parent=self, pos=wx.Point(0, 0),
   425               size=wx.Size(0, 90), style=wx.LB_SINGLE)
   434               size=wx.Size(0, 90), style=wx.LB_SINGLE)
   426         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, id=ID_VARIABLEPROPERTIESDIALOGNAME)
   435         self.Bind(wx.EVT_LISTBOX, self.OnNameChanged, id=ID_VARIABLEPROPERTIESDIALOGNAME)
   427 
   436 
   428         self.Expression = wx.TextCtrl(id=ID_VARIABLEPROPERTIESDIALOGEXPRESSION,
   437         self.Expression = wx.TextCtrl(id=ID_VARIABLEPROPERTIESDIALOGEXPRESSION,
   456         for choice in ["Input", "Output", "InOut"]:
   465         for choice in ["Input", "Output", "InOut"]:
   457             self.Class.Append(choice)
   466             self.Class.Append(choice)
   458         self.Class.SetStringSelection("Input")
   467         self.Class.SetStringSelection("Input")
   459 
   468 
   460     def RefreshNameList(self):
   469     def RefreshNameList(self):
   461         selected = self.Name.GetStringSelection()
   470         selected = self.VariableName.GetStringSelection()
   462         self.Name.Clear()
   471         self.VariableName.Clear()
   463         self.Name.Append("")
   472         self.VariableName.Append("")
   464         for name, var_type, value_type in self.VarList:
   473         for name, var_type, value_type in self.VarList:
   465             if var_type in ["Local","Temp","Global","External"]:
   474             if var_type in ["Local","Temp","Global","External"]:
   466                 self.Name.Append(name)
   475                 self.VariableName.Append(name)
   467             elif var_type == "Input" and self.Class.GetStringSelection() == "Input":
   476             elif var_type == "Input" and self.Class.GetStringSelection() == "Input":
   468                 self.Name.Append(name)
   477                 self.VariableName.Append(name)
   469             elif var_type == "Output" and self.Class.GetStringSelection() == "Output":
   478             elif var_type == "Output" and self.Class.GetStringSelection() == "Output":
   470                 self.Name.Append(name)
   479                 self.VariableName.Append(name)
   471             elif var_type == "InOut" and self.Class.GetStringSelection() == "InOut":
   480             elif var_type == "InOut" and self.Class.GetStringSelection() == "InOut":
   472                 self.Name.Append(name)
   481                 self.VariableName.Append(name)
   473         if self.Name.FindString(selected) != wx.NOT_FOUND:
   482         if self.VariableName.FindString(selected) != wx.NOT_FOUND:
   474             self.Name.SetStringSelection(selected)
   483             self.VariableName.SetStringSelection(selected)
   475         else:
   484         else:
   476             self.Name.SetStringSelection("")
   485             self.VariableName.SetStringSelection("")
   477         self.Name.Enable(self.Name.GetCount() > 0)
   486         self.VariableName.Enable(self.VariableName.GetCount() > 0)
   478             
   487             
   479     def SetMinVariableSize(self, size):
   488     def SetMinVariableSize(self, size):
   480         self.MinVariableSize = size
   489         self.MinVariableSize = size
   481 
   490 
   482     def SetVariables(self, vars):
   491     def SetVariables(self, vars):
   493                 self.Class.SetStringSelection("Output")
   502                 self.Class.SetStringSelection("Output")
   494             if value_type == INOUT:
   503             if value_type == INOUT:
   495                 self.Class.SetStringSelection("InOut")
   504                 self.Class.SetStringSelection("InOut")
   496             self.RefreshNameList()
   505             self.RefreshNameList()
   497         if value_name:
   506         if value_name:
   498             if self.Name.FindString(value_name) != wx.NOT_FOUND:
   507             if self.VariableName.FindString(value_name) != wx.NOT_FOUND:
   499                 self.Name.SetStringSelection(value_name)
   508                 self.VariableName.SetStringSelection(value_name)
   500                 self.Expression.Enable(False)
   509                 self.Expression.Enable(False)
   501             else:
   510             else:
   502                 self.Expression.SetValue(value_name)
   511                 self.Expression.SetValue(value_name)
   503                 self.Name.Enable(False)
   512                 self.VariableName.Enable(False)
   504         self.RefreshPreview()
   513         self.RefreshPreview()
   505         
   514         
   506     def GetValues(self):
   515     def GetValues(self):
   507         values = {}
   516         values = {}
   508         classtype = self.Class.GetStringSelection()
   517         classtype = self.Class.GetStringSelection()
   514             values["type"] = INOUT
   523             values["type"] = INOUT
   515         expression = self.Expression.GetValue()
   524         expression = self.Expression.GetValue()
   516         if self.Expression.IsEnabled() and expression != "":
   525         if self.Expression.IsEnabled() and expression != "":
   517             values["name"] = expression
   526             values["name"] = expression
   518         else:
   527         else:
   519             values["name"] = self.Name.GetStringSelection()
   528             values["name"] = self.VariableName.GetStringSelection()
   520         values["value_type"] = ""
   529         values["value_type"] = ""
   521         for var_name, var_type, value_type in self.VarList:
   530         for var_name, var_type, value_type in self.VarList:
   522             if var_name == values["name"]:
   531             if var_name == values["name"]:
   523                 values["value_type"] = value_type
   532                 values["value_type"] = value_type
   524         values["width"], values["height"] = self.Variable.GetSize()
   533         values["width"], values["height"] = self.Variable.GetSize()
   532             self.Expression.Enable(False)
   541             self.Expression.Enable(False)
   533         self.RefreshPreview()
   542         self.RefreshPreview()
   534         event.Skip()
   543         event.Skip()
   535 
   544 
   536     def OnNameChanged(self, event):
   545     def OnNameChanged(self, event):
   537         if self.Name.GetStringSelection() != "":
   546         if self.VariableName.GetStringSelection() != "":
   538             self.Expression.Enable(False)
   547             self.Expression.Enable(False)
   539         elif self.Class.GetStringSelection() == "Input":
   548         elif self.Class.GetStringSelection() == "Input":
   540             self.Expression.Enable(True)
   549             self.Expression.Enable(True)
   541         self.RefreshPreview()
   550         self.RefreshPreview()
   542         event.Skip()
   551         event.Skip()
   543     
   552     
   544     def OnExpressionChanged(self, event):
   553     def OnExpressionChanged(self, event):
   545         if self.Expression.GetValue() != "":
   554         if self.Expression.GetValue() != "":
   546             self.Name.Enable(False)
   555             self.VariableName.Enable(False)
   547         else:
   556         else:
   548             self.Name.Enable(True)
   557             self.VariableName.Enable(True)
   549         self.RefreshPreview()
   558         self.RefreshPreview()
   550         event.Skip()
   559         event.Skip()
   551     
   560     
   552     def RefreshPreview(self):
   561     def RefreshPreview(self):
   553         dc = wx.ClientDC(self.Preview)
   562         dc = wx.ClientDC(self.Preview)
   554         dc.Clear()
   563         dc.Clear()
   555         expression = self.Expression.GetValue()
   564         expression = self.Expression.GetValue()
   556         if self.Expression.IsEnabled() and expression != "":
   565         if self.Expression.IsEnabled() and expression != "":
   557             name = expression
   566             name = expression
   558         else:
   567         else:
   559             name = self.Name.GetStringSelection()
   568             name = self.VariableName.GetStringSelection()
   560         type = ""
   569         type = ""
   561         for var_name, var_type, value_type in self.VarList:
   570         for var_name, var_type, value_type in self.VarList:
   562             if var_name == name:
   571             if var_name == name:
   563                 type = value_type
   572                 type = value_type
   564         classtype = self.Class.GetStringSelection()
   573         classtype = self.Class.GetStringSelection()
   578         self.Variable.SetPosition(x, y)
   587         self.Variable.SetPosition(x, y)
   579         self.Variable.Draw(dc)
   588         self.Variable.Draw(dc)
   580 
   589 
   581     def OnPaint(self, event):
   590     def OnPaint(self, event):
   582         self.RefreshPreview()
   591         self.RefreshPreview()
       
   592         event.Skip()
   583 
   593 
   584 #-------------------------------------------------------------------------------
   594 #-------------------------------------------------------------------------------
   585 #                          Create New Connection Dialog
   595 #                          Create New Connection Dialog
   586 #-------------------------------------------------------------------------------
   596 #-------------------------------------------------------------------------------
   587 
   597 
   608     def _init_coll_LeftGridSizer_Items(self, parent):
   618     def _init_coll_LeftGridSizer_Items(self, parent):
   609         parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
   619         parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
   610         parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
   620         parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
   611         parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
   621         parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
   612         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
   622         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
   613         parent.AddWindow(self.Name, 0, border=0, flag=wx.GROW)
   623         parent.AddWindow(self.ConnectionName, 0, border=0, flag=wx.GROW)
   614         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
   624         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
   615     
   625     
   616     def _init_coll_LeftGridSizer_Growables(self, parent):
   626     def _init_coll_LeftGridSizer_Growables(self, parent):
   617         parent.AddGrowableCol(0)
   627         parent.AddGrowableCol(0)
   618         parent.AddGrowableRow(5)
   628         parent.AddGrowableRow(5)
   670               label='Continuation', name='radioButton2', parent=self, 
   680               label='Continuation', name='radioButton2', parent=self, 
   671               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
   681               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
   672         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON2)
   682         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_CONNECTIONPROPERTIESDIALOGRADIOBUTTON2)
   673         self.radioButton2.SetValue(False)
   683         self.radioButton2.SetValue(False)
   674         
   684         
   675         self.Name = wx.TextCtrl(id=ID_CONNECTIONPROPERTIESDIALOGNAME,
   685         self.ConnectionName = wx.TextCtrl(id=ID_CONNECTIONPROPERTIESDIALOGNAME,
   676               name='Name', parent=self, pos=wx.Point(0, 0),
   686               name='Name', parent=self, pos=wx.Point(0, 0),
   677               size=wx.Size(0, 24), style=0)
   687               size=wx.Size(0, 24), style=0)
   678         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_CONNECTIONPROPERTIESDIALOGNAME)
   688         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_CONNECTIONPROPERTIESDIALOGNAME)
   679 
   689 
   680         self.Preview = wx.Panel(id=ID_CONNECTIONPROPERTIESDIALOGPREVIEW,
   690         self.Preview = wx.Panel(id=ID_CONNECTIONPROPERTIESDIALOGPREVIEW,
   707                 if value == CONNECTOR:
   717                 if value == CONNECTOR:
   708                     self.radioButton1.SetValue(True)
   718                     self.radioButton1.SetValue(True)
   709                 elif value == CONTINUATION:
   719                 elif value == CONTINUATION:
   710                     self.radioButton2.SetValue(True)
   720                     self.radioButton2.SetValue(True)
   711             elif name == "name":
   721             elif name == "name":
   712                 self.Name.SetValue(value)
   722                 self.ConnectionName.SetValue(value)
   713         self.RefreshPreview()
   723         self.RefreshPreview()
   714     
   724     
   715     def GetValues(self):
   725     def GetValues(self):
   716         values = {}
   726         values = {}
   717         if self.radioButton1.GetValue():
   727         if self.radioButton1.GetValue():
   718             values["type"] = CONNECTOR
   728             values["type"] = CONNECTOR
   719         else:
   729         else:
   720             values["type"] = CONTINUATION
   730             values["type"] = CONTINUATION
   721         values["name"] = self.Name.GetValue()
   731         values["name"] = self.ConnectionName.GetValue()
   722         values["width"], values["height"] = self.Connection.GetSize()
   732         values["width"], values["height"] = self.Connection.GetSize()
   723         return values
   733         return values
   724 
   734 
   725     def OnTypeChanged(self, event):
   735     def OnTypeChanged(self, event):
   726         self.RefreshPreview()
   736         self.RefreshPreview()
   732         
   742         
   733     def RefreshPreview(self):
   743     def RefreshPreview(self):
   734         dc = wx.ClientDC(self.Preview)
   744         dc = wx.ClientDC(self.Preview)
   735         dc.Clear()
   745         dc.Clear()
   736         if self.radioButton1.GetValue():
   746         if self.radioButton1.GetValue():
   737             self.Connection = FBD_Connector(self.Preview, CONNECTOR, self.Name.GetValue())
   747             self.Connection = FBD_Connector(self.Preview, CONNECTOR, self.ConnectionName.GetValue())
   738         else:
   748         else:
   739             self.Connection = FBD_Connector(self.Preview, CONTINUATION, self.Name.GetValue())
   749             self.Connection = FBD_Connector(self.Preview, CONTINUATION, self.ConnectionName.GetValue())
   740         width, height = self.MinConnectionSize
   750         width, height = self.MinConnectionSize
   741         min_width, min_height = self.Connection.GetMinSize()
   751         min_width, min_height = self.Connection.GetMinSize()
   742         width, height = max(min_width, width), max(min_height, height)
   752         width, height = max(min_width, width), max(min_height, height)
   743         self.Connection.SetSize(width, height)
   753         self.Connection.SetSize(width, height)
   744         clientsize = self.Preview.GetClientSize()
   754         clientsize = self.Preview.GetClientSize()
   747         self.Connection.SetPosition(x, y)
   757         self.Connection.SetPosition(x, y)
   748         self.Connection.Draw(dc)
   758         self.Connection.Draw(dc)
   749 
   759 
   750     def OnPaint(self, event):
   760     def OnPaint(self, event):
   751         self.RefreshPreview()
   761         self.RefreshPreview()
   752 
   762         event.Skip()
   753 
   763 
   754 #-------------------------------------------------------------------------------
   764 #-------------------------------------------------------------------------------
   755 #                        Edit Ladder Element Properties Dialog
   765 #                        Edit Ladder Element Properties Dialog
   756 #-------------------------------------------------------------------------------
   766 #-------------------------------------------------------------------------------
   757 
   767 
   782         parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
   792         parent.AddWindow(self.radioButton1, 0, border=0, flag=wx.GROW)
   783         parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
   793         parent.AddWindow(self.radioButton2, 0, border=0, flag=wx.GROW)
   784         parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
   794         parent.AddWindow(self.radioButton3, 0, border=0, flag=wx.GROW)
   785         parent.AddWindow(self.radioButton4, 0, border=0, flag=wx.GROW)
   795         parent.AddWindow(self.radioButton4, 0, border=0, flag=wx.GROW)
   786         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
   796         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
   787         parent.AddWindow(self.Name, 0, border=0, flag=wx.GROW)
   797         parent.AddWindow(self.ElementName, 0, border=0, flag=wx.GROW)
   788         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
   798         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
   789         
   799         
   790     def _init_coll_LeftGridSizer_Growables(self, parent):
   800     def _init_coll_LeftGridSizer_Growables(self, parent):
   791         parent.AddGrowableCol(0)
   801         parent.AddGrowableCol(0)
   792         parent.AddGrowableRow(7)
   802         parent.AddGrowableRow(7)
   853         self.radioButton4 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON4,
   863         self.radioButton4 = wx.RadioButton(id=ID_LDELEMENTDIALOGRADIOBUTTON4,
   854               label=labels[3], name='radioButton4', parent=self, 
   864               label=labels[3], name='radioButton4', parent=self, 
   855               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
   865               pos=wx.Point(0, 0), size=wx.Size(0, 24), style=0)
   856         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON4)
   866         self.Bind(wx.EVT_RADIOBUTTON, self.OnTypeChanged, id=ID_LDELEMENTDIALOGRADIOBUTTON4)
   857 
   867 
   858         self.Name = wx.Choice(id=ID_LDELEMENTDIALOGNAME,
   868         self.ElementName = wx.Choice(id=ID_LDELEMENTDIALOGNAME,
   859               name='Name', parent=self, pos=wx.Point(0, 0),
   869               name='Name', parent=self, pos=wx.Point(0, 0),
   860               size=wx.Size(0, 24), style=0)
   870               size=wx.Size(0, 24), style=0)
   861         self.Bind(wx.EVT_CHOICE, self.OnNameChanged, id=ID_LDELEMENTDIALOGNAME)
   871         self.Bind(wx.EVT_CHOICE, self.OnNameChanged, id=ID_LDELEMENTDIALOGNAME)
   862 
   872 
   863         self.Preview = wx.Panel(id=ID_LDELEMENTDIALOGPREVIEW,
   873         self.Preview = wx.Panel(id=ID_LDELEMENTDIALOGPREVIEW,
   889         min_width, min_height = self.Element.GetMinSize()
   899         min_width, min_height = self.Element.GetMinSize()
   890         width, height = max(min_width, size[0]), max(min_height, size[1])
   900         width, height = max(min_width, size[0]), max(min_height, size[1])
   891         self.Element.SetSize(width, height)
   901         self.Element.SetSize(width, height)
   892         
   902         
   893     def SetVariables(self, vars):
   903     def SetVariables(self, vars):
   894         self.Name.Clear()
   904         self.ElementName.Clear()
   895         for name in vars:
   905         for name in vars:
   896             self.Name.Append(name)
   906             self.ElementName.Append(name)
   897         self.Name.Enable(self.Name.GetCount() > 0)
   907         self.ElementName.Enable(self.ElementName.GetCount() > 0)
   898 
   908 
   899     def SetValues(self, values):
   909     def SetValues(self, values):
   900         for name, value in values.items():
   910         for name, value in values.items():
   901             if name == "name":
   911             if name == "name":
   902                 self.Element.SetName(value)
   912                 self.Element.SetName(value)
   903                 self.Name.SetStringSelection(value)
   913                 self.ElementName.SetStringSelection(value)
   904             elif name == "type":
   914             elif name == "type":
   905                 self.Element.SetType(value)
   915                 self.Element.SetType(value)
   906                 if self.Type == "contact":
   916                 if self.Type == "contact":
   907                     if value == CONTACT_NORMAL:
   917                     if value == CONTACT_NORMAL:
   908                         self.radioButton1.SetValue(True)
   918                         self.radioButton1.SetValue(True)
   950                 self.Element.SetType(COIL_RESET)
   960                 self.Element.SetType(COIL_RESET)
   951         self.RefreshPreview()
   961         self.RefreshPreview()
   952         event.Skip()
   962         event.Skip()
   953 
   963 
   954     def OnNameChanged(self, event):
   964     def OnNameChanged(self, event):
   955         self.Element.SetName(self.Name.GetStringSelection())
   965         self.Element.SetName(self.ElementName.GetStringSelection())
   956         self.RefreshPreview()
   966         self.RefreshPreview()
   957         event.Skip()
   967         event.Skip()
   958 
   968 
   959     def RefreshPreview(self):
   969     def RefreshPreview(self):
   960         dc = wx.ClientDC(self.Preview)
   970         dc = wx.ClientDC(self.Preview)
  1156         parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
  1166         parent.AddSizer(self.LeftGridSizer, 1, border=5, flag=wx.GROW|wx.RIGHT)
  1157         parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
  1167         parent.AddSizer(self.RightGridSizer, 1, border=5, flag=wx.GROW|wx.LEFT)
  1158     
  1168     
  1159     def _init_coll_LeftGridSizer_Items(self, parent):
  1169     def _init_coll_LeftGridSizer_Items(self, parent):
  1160         parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
  1170         parent.AddWindow(self.staticText1, 0, border=0, flag=wx.GROW)
  1161         parent.AddWindow(self.Name, 0, border=0, flag=wx.GROW)
  1171         parent.AddWindow(self.StepName, 0, border=0, flag=wx.GROW)
  1162         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
  1172         parent.AddWindow(self.staticText2, 0, border=0, flag=wx.GROW)
  1163         parent.AddWindow(self.checkBox1, 0, border=0, flag=wx.GROW)
  1173         parent.AddWindow(self.checkBox1, 0, border=0, flag=wx.GROW)
  1164         parent.AddWindow(self.checkBox2, 0, border=0, flag=wx.GROW)
  1174         parent.AddWindow(self.checkBox2, 0, border=0, flag=wx.GROW)
  1165         parent.AddWindow(self.checkBox3, 0, border=0, flag=wx.GROW)
  1175         parent.AddWindow(self.checkBox3, 0, border=0, flag=wx.GROW)
  1166         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
  1176         parent.AddWindow(self.Spacer, 0, border=0, flag=wx.GROW)
  1210 
  1220 
  1211         self.staticText3 = wx.StaticText(id=ID_STEPCONTENTDIALOGSTATICTEXT3,
  1221         self.staticText3 = wx.StaticText(id=ID_STEPCONTENTDIALOGSTATICTEXT3,
  1212               label='Preview:', name='staticText4', parent=self,
  1222               label='Preview:', name='staticText4', parent=self,
  1213               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
  1223               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
  1214 
  1224 
  1215         self.Name = wx.TextCtrl(id=ID_STEPCONTENTDIALOGNAME,
  1225         self.StepName = wx.TextCtrl(id=ID_STEPCONTENTDIALOGNAME,
  1216               name='Name', parent=self, pos=wx.Point(0, 0),
  1226               name='Name', parent=self, pos=wx.Point(0, 0),
  1217               size=wx.Size(0, 24), style=0)
  1227               size=wx.Size(0, 24), style=0)
  1218         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_STEPCONTENTDIALOGNAME)
  1228         self.Bind(wx.EVT_TEXT, self.OnNameChanged, id=ID_STEPCONTENTDIALOGNAME)
  1219 
  1229 
  1220         self.checkBox1 = wx.CheckBox(id=ID_STEPCONTENTDIALOGCHECKBOX1,
  1230         self.checkBox1 = wx.CheckBox(id=ID_STEPCONTENTDIALOGCHECKBOX1,
  1259         self.PouNames = []
  1269         self.PouNames = []
  1260         self.Variables = []
  1270         self.Variables = []
  1261         self.StepNames = []
  1271         self.StepNames = []
  1262     
  1272     
  1263     def OnOK(self, event):
  1273     def OnOK(self, event):
  1264         step_name = self.Name.GetValue()
  1274         step_name = self.StepName.GetValue()
  1265         if step_name == "":
  1275         if step_name == "":
  1266             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
  1276             message = wx.MessageDialog(self, "You must type a name!", "Error", wx.OK|wx.ICON_ERROR)
  1267             message.ShowModal()
  1277             message.ShowModal()
  1268             message.Destroy()
  1278             message.Destroy()
  1269         elif not TestIdentifier(step_name):
  1279         elif not TestIdentifier(step_name):
  1302         self.StepNames = [step_name.upper() for step_name in step_names]
  1312         self.StepNames = [step_name.upper() for step_name in step_names]
  1303 
  1313 
  1304     def SetValues(self, values):
  1314     def SetValues(self, values):
  1305         value_name = values.get("name", None)
  1315         value_name = values.get("name", None)
  1306         if value_name:
  1316         if value_name:
  1307             self.Name.SetValue(value_name)
  1317             self.StepName.SetValue(value_name)
  1308         else:
  1318         else:
  1309             self.Name.SetValue("")
  1319             self.StepName.SetValue("")
  1310         self.checkBox1.SetValue(values.get("input", False))
  1320         self.checkBox1.SetValue(values.get("input", False))
  1311         self.checkBox2.SetValue(values.get("output", False))
  1321         self.checkBox2.SetValue(values.get("output", False))
  1312         self.checkBox3.SetValue(values.get("action", False))
  1322         self.checkBox3.SetValue(values.get("action", False))
  1313         self.RefreshPreview()
  1323         self.RefreshPreview()
  1314         
  1324         
  1315     def GetValues(self):
  1325     def GetValues(self):
  1316         values = {}
  1326         values = {}
  1317         values["name"] = self.Name.GetValue()
  1327         values["name"] = self.StepName.GetValue()
  1318         values["input"] = self.checkBox1.IsChecked()
  1328         values["input"] = self.checkBox1.IsChecked()
  1319         values["output"] = self.checkBox2.IsChecked()
  1329         values["output"] = self.checkBox2.IsChecked()
  1320         values["action"] = self.checkBox3.IsChecked()
  1330         values["action"] = self.checkBox3.IsChecked()
  1321         values["width"], values["height"] = self.Step.GetSize()
  1331         values["width"], values["height"] = self.Step.GetSize()
  1322         return values
  1332         return values
  1330         event.Skip()
  1340         event.Skip()
  1331     
  1341     
  1332     def RefreshPreview(self):
  1342     def RefreshPreview(self):
  1333         dc = wx.ClientDC(self.Preview)
  1343         dc = wx.ClientDC(self.Preview)
  1334         dc.Clear()
  1344         dc.Clear()
  1335         self.Step = SFC_Step(self.Preview, self.Name.GetValue(), self.Initial)
  1345         self.Step = SFC_Step(self.Preview, self.StepName.GetValue(), self.Initial)
  1336         if self.checkBox1.IsChecked():
  1346         if self.checkBox1.IsChecked():
  1337             self.Step.AddInput()
  1347             self.Step.AddInput()
  1338         else:
  1348         else:
  1339             self.Step.RemoveInput()
  1349             self.Step.RemoveInput()
  1340         if self.checkBox2.IsChecked():
  1350         if self.checkBox2.IsChecked():
  1355         self.Step.SetPosition(x, y)
  1365         self.Step.SetPosition(x, y)
  1356         self.Step.Draw(dc)
  1366         self.Step.Draw(dc)
  1357 
  1367 
  1358     def OnPaint(self, event):
  1368     def OnPaint(self, event):
  1359         self.RefreshPreview()
  1369         self.RefreshPreview()
       
  1370         event.Skip()
  1360 
  1371 
  1361 #-------------------------------------------------------------------------------
  1372 #-------------------------------------------------------------------------------
  1362 #                          Edit Transition Content Dialog
  1373 #                          Edit Transition Content Dialog
  1363 #-------------------------------------------------------------------------------
  1374 #-------------------------------------------------------------------------------
  1364 
  1375 
  1614         self.Element.SetPosition((clientsize.width - rect.width) / 2 + diffx, (clientsize.height - rect.height) / 2 + diffy)
  1625         self.Element.SetPosition((clientsize.width - rect.width) / 2 + diffx, (clientsize.height - rect.height) / 2 + diffy)
  1615         self.Element.Draw(dc)
  1626         self.Element.Draw(dc)
  1616 
  1627 
  1617     def OnPaint(self, event):
  1628     def OnPaint(self, event):
  1618         self.RefreshPreview()
  1629         self.RefreshPreview()
       
  1630         event.Skip()
  1619 
  1631 
  1620 #-------------------------------------------------------------------------------
  1632 #-------------------------------------------------------------------------------
  1621 #                         Create New Divergence Dialog
  1633 #                         Create New Divergence Dialog
  1622 #-------------------------------------------------------------------------------
  1634 #-------------------------------------------------------------------------------
  1623 
  1635 
  1794         self.Divergence.SetPosition(x, y)
  1806         self.Divergence.SetPosition(x, y)
  1795         self.Divergence.Draw(dc)
  1807         self.Divergence.Draw(dc)
  1796 
  1808 
  1797     def OnPaint(self, event):
  1809     def OnPaint(self, event):
  1798         self.RefreshPreview()
  1810         self.RefreshPreview()
       
  1811         event.Skip()
  1799 
  1812 
  1800 
  1813 
  1801 #-------------------------------------------------------------------------------
  1814 #-------------------------------------------------------------------------------
  1802 #                            Action Block Dialog
  1815 #                            Action Block Dialog
  1803 #-------------------------------------------------------------------------------
  1816 #-------------------------------------------------------------------------------