Viewer.py
changeset 249 d8425712acef
parent 243 c5da8b706cde
child 253 d9391572655f
equal deleted inserted replaced
248:f7df265edd54 249:d8425712acef
    94             values = None
    94             values = None
    95         if not isinstance(values, TupleType):
    95         if not isinstance(values, TupleType):
    96             message = "Invalid value \"%s\" for viewer block"%data
    96             message = "Invalid value \"%s\" for viewer block"%data
    97             values = None
    97             values = None
    98         if values is not None:
    98         if values is not None:
    99             if values[1] == "program":
    99             if values[1] == "debug":
       
   100                 pass
       
   101             elif values[1] == "program":
   100                 message = "Programs can't be used by other POUs!"
   102                 message = "Programs can't be used by other POUs!"
   101             elif values[1] in ["function", "functionBlock", "program"]:
   103             elif values[1] in ["function", "functionBlock", "program"]:
   102                 name, type = self.ParentWindow.Controler.GetEditedElementType(self.ParentWindow.GetTagName())
   104                 name, type = self.ParentWindow.Controler.GetEditedElementType(self.ParentWindow.GetTagName(), self.ParentWindow.Debug)
   103                 if name == values[0]:
   105                 if name == values[0]:
   104                     message = "\"%s\" can't use itself!"%name
   106                     message = "\"%s\" can't use itself!"%name
   105                 elif type == "function" and values[1] != "function":
   107                 elif type == "function" and values[1] != "function":
   106                     message = "Function Blocks can't be used by Functions!"
   108                     message = "Function Blocks can't be used by Functions!"
   107                 elif self.ParentWindow.Controler.PouIsUsedBy(name, values[0]):
   109                 elif self.ParentWindow.Controler.PouIsUsedBy(name, values[0], self.ParentWindow.Debug):
   108                     message = "\"%s\" is already used by \"%s\"!"%(name, values[0])
   110                     message = "\"%s\" is already used by \"%s\"!"%(name, values[0])
   109                 else:
   111                 else:
   110                     blockname = values[2]
   112                     blockname = values[2]
   111                     if len(values) > 3:
   113                     if len(values) > 3:
   112                         blockinputs = values[3]
   114                         blockinputs = values[3]
   117                         if dialog.ShowModal() == wx.ID_OK:
   119                         if dialog.ShowModal() == wx.ID_OK:
   118                             blockname = dialog.GetValue()
   120                             blockname = dialog.GetValue()
   119                         else:
   121                         else:
   120                             return
   122                             return
   121                         dialog.Destroy()
   123                         dialog.Destroy()
   122                     if blockname.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames()]:
   124                     if blockname.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
   123                         message = "\"%s\" pou already exists!"%blockname
   125                         message = "\"%s\" pou already exists!"%blockname
   124                     elif blockname.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(self.ParentWindow.GetTagName())]:
   126                     elif blockname.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(self.ParentWindow.GetTagName(), self.ParentWindow.Debug)]:
   125                         message = "\"%s\" element for this pou already exists!"%blockname
   127                         message = "\"%s\" element for this pou already exists!"%blockname
   126                     else:
   128                     else:
   127                         id = self.ParentWindow.GetNewId()
   129                         id = self.ParentWindow.GetNewId()
   128                         block = FBD_Block(self.ParentWindow, values[0], blockname, id, inputs = blockinputs)
   130                         block = FBD_Block(self.ParentWindow, values[0], blockname, id, inputs = blockinputs)
   129                         width, height = block.GetMinSize()
   131                         width, height = block.GetMinSize()
   137                         self.ParentWindow.AddBlock(block)
   139                         self.ParentWindow.AddBlock(block)
   138                         self.ParentWindow.Controler.AddEditedElementBlock(self.ParentWindow.GetTagName(), id, values[0], blockname)
   140                         self.ParentWindow.Controler.AddEditedElementBlock(self.ParentWindow.GetTagName(), id, values[0], blockname)
   139                         self.ParentWindow.RefreshBlockModel(block)
   141                         self.ParentWindow.RefreshBlockModel(block)
   140                         self.ParentWindow.RefreshBuffer()
   142                         self.ParentWindow.RefreshBuffer()
   141                         self.ParentWindow.RefreshScrollBars()
   143                         self.ParentWindow.RefreshScrollBars()
       
   144                         self.ParentWindow.RefreshVisibleElements()
   142                         self.ParentWindow.ParentWindow.RefreshVariablePanel(self.ParentWindow.GetTagName())
   145                         self.ParentWindow.ParentWindow.RefreshVariablePanel(self.ParentWindow.GetTagName())
   143                         self.ParentWindow.Refresh(False)
   146                         self.ParentWindow.Refresh(False)
   144             elif values[1] != "location":
   147             elif values[1] != "location":
   145                 if values[3] == self.ParentWindow.GetTagName():
   148                 if values[3] == self.ParentWindow.GetTagName():
   146                     id = self.ParentWindow.GetNewId()
   149                     id = self.ParentWindow.GetNewId()
   162                     self.ParentWindow.AddBlock(variable)
   165                     self.ParentWindow.AddBlock(variable)
   163                     self.ParentWindow.Controler.AddEditedElementVariable(self.ParentWindow.GetTagName(), id, var_type)
   166                     self.ParentWindow.Controler.AddEditedElementVariable(self.ParentWindow.GetTagName(), id, var_type)
   164                     self.ParentWindow.RefreshVariableModel(variable)
   167                     self.ParentWindow.RefreshVariableModel(variable)
   165                     self.ParentWindow.RefreshBuffer()
   168                     self.ParentWindow.RefreshBuffer()
   166                     self.ParentWindow.RefreshScrollBars()
   169                     self.ParentWindow.RefreshScrollBars()
       
   170                     self.ParentWindow.RefreshVisibleElements()
   167                     self.ParentWindow.Refresh(False)
   171                     self.ParentWindow.Refresh(False)
   168                 else:
   172                 else:
   169                     message = "Variable don't belong to this POU!"
   173                     message = "Variable don't belong to this POU!"
   170         wx.CallAfter(self.ShowMessage, message)
   174         if message is not None:
       
   175             wx.CallAfter(self.ShowMessage, message)
   171 
   176 
   172     def ShowMessage(self, message):
   177     def ShowMessage(self, message):
   173         if message is not None:
   178         message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
   174             message = wx.MessageDialog(self.ParentWindow, message, "Error", wx.OK|wx.ICON_ERROR)
   179         message.ShowModal()
   175             message.ShowModal()
   180         message.Destroy()
   176             message.Destroy()
       
   177 
   181 
   178 
   182 
   179 """
   183 """
   180 Class that implements a Viewer based on a wx.ScrolledWindow for drawing and 
   184 Class that implements a Viewer based on a wx.ScrolledWindow for drawing and 
   181 manipulating graphic elements
   185 manipulating graphic elements
   286         
   290         
   287         self._init_coll_AlignmentMenu_Items(self.AlignmentMenu)
   291         self._init_coll_AlignmentMenu_Items(self.AlignmentMenu)
   288         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   292         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   289     
   293     
   290     # Create a new Viewer
   294     # Create a new Viewer
   291     def __init__(self, parent, tagname, window, controler):
   295     def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
   292         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
   296         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
   293             style=wx.HSCROLL | wx.VSCROLL)
   297             style=wx.HSCROLL | wx.VSCROLL)
   294         self._init_menus()
   298         self._init_menus()
   295         # Adding a rubberband to Viewer
   299         # Adding a rubberband to Viewer
   296         self.rubberBand = RubberBand(drawingSurface=self)
   300         self.rubberBand = RubberBand(drawingSurface=self)
   304         self.PagePen = wx.TRANSPARENT_PEN
   308         self.PagePen = wx.TRANSPARENT_PEN
   305         self.DrawingWire = False
   309         self.DrawingWire = False
   306         self.current_id = 0
   310         self.current_id = 0
   307         self.TagName = tagname
   311         self.TagName = tagname
   308         self.Errors = []
   312         self.Errors = []
       
   313         self.Debug = debug
       
   314         self.InstancePath = instancepath
   309         
   315         
   310         # Initialize Block, Wire and Comment numbers
   316         # Initialize Block, Wire and Comment numbers
   311         self.block_id = self.wire_id = self.comment_id = 0
   317         self.block_id = self.wire_id = self.comment_id = 0
   312         
   318         
   313         # Initialize Viewer mode to Selection mode
   319         # Initialize Viewer mode to Selection mode
   316         self.CurrentLanguage = "FBD"
   322         self.CurrentLanguage = "FBD"
   317         
   323         
   318         self.ParentWindow = window
   324         self.ParentWindow = window
   319         self.Controler = controler
   325         self.Controler = controler
   320         
   326         
   321         self.SetDropTarget(ViewerDropTarget(self))
   327         if not self.Debug:
       
   328             self.SetDropTarget(ViewerDropTarget(self))
   322         
   329         
   323         dc = wx.ClientDC(self)
   330         dc = wx.ClientDC(self)
   324         font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
   331         font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
   325         dc.SetFont(font)
   332         dc.SetFont(font)
   326         width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   333         width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   329             font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
   336             font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
   330             dc.SetFont(font)
   337             dc.SetFont(font)
   331             width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   338             width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   332         self.SetFont(font)
   339         self.SetFont(font)
   333         
   340         
       
   341         self.ResetView()
       
   342         
   334         # Link Viewer event to corresponding methods
   343         # Link Viewer event to corresponding methods
   335         self.Bind(wx.EVT_PAINT, self.OnPaint)
   344         self.Bind(wx.EVT_PAINT, self.OnPaint)
   336         self.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
   345         self.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
   337         self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
   346         self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
   338         self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
   347         self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
   339         self.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
   348         self.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
   340         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
   349         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
   341         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
   350         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
   342         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
   351         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
   343         self.Bind(wx.EVT_CHAR, self.OnChar)
   352         self.Bind(wx.EVT_CHAR, self.OnChar)
   344         #self.Bind(wx.EVT_SCROLLWIN, self.OnMoveWindow)
   353         self.Bind(wx.EVT_SCROLLWIN, self.OnScrollWindow)
   345         self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   354         self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   346     
   355     
   347     def GetScrolledRect(self, rect):
   356     def GetScrolledRect(self, rect):
   348         rect.x, rect.y = self.CalcScrolledPosition(rect.x, rect.y)
   357         rect.x, rect.y = self.CalcScrolledPosition(rect.x, rect.y)
   349         return rect
   358         return rect
   355         self.TagName = tagname
   364         self.TagName = tagname
   356         
   365         
   357     def GetTagName(self):
   366     def GetTagName(self):
   358         return self.TagName
   367         return self.TagName
   359     
   368     
       
   369     def GetInstancePath(self):
       
   370         return self.InstancePath
       
   371     
   360     def IsViewing(self, tagname):
   372     def IsViewing(self, tagname):
   361         return self.TagName == tagname
   373         if self.Debug:
       
   374             return self.InstancePath == tagname
       
   375         else:
       
   376             return self.TagName == tagname
   362     
   377     
   363     # Returns a new id
   378     # Returns a new id
   364     def GetNewId(self):
   379     def GetNewId(self):
   365         self.current_id += 1
   380         self.current_id += 1
   366         return self.current_id
   381         return self.current_id
   367     
   382     
   368     # Destructor
   383     # Destructor
   369     def __del__(self):
   384     def __del__(self):
       
   385         self.Flush()
   370         self.ResetView()
   386         self.ResetView()
   371 
   387 
   372     def GetLogicalDC(self, buffered=False):
   388     def GetLogicalDC(self, buffered=False):
   373         if buffered:
   389         if buffered:
   374             dc = wx.AutoBufferedPaintDC(self)
   390             dc = wx.AutoBufferedPaintDC(self)
   425             wires.sort(lambda x,y:self.Wires[x].__cmp__(self.Wires[y]))
   441             wires.sort(lambda x,y:self.Wires[x].__cmp__(self.Wires[y]))
   426         if sort_comments:
   442         if sort_comments:
   427             comments.sort(lambda x,y:self.Comments[x].__cmp__(self.Comments[y]))
   443             comments.sort(lambda x,y:self.Comments[x].__cmp__(self.Comments[y]))
   428         return blocks + wires + comments
   444         return blocks + wires + comments
   429 
   445 
       
   446     def RefreshVisibleElements(self, xp = None, yp = None):
       
   447         x, y = self.CalcUnscrolledPosition(0, 0)
       
   448         if xp is not None:
       
   449             x = xp * self.GetScrollPixelsPerUnit()[0]
       
   450         if yp is not None:
       
   451             y = yp * self.GetScrollPixelsPerUnit()[1]
       
   452         width, height = self.GetClientSize()
       
   453         screen = wx.Rect(x, y, width, height)
       
   454         for comment in self.Comments:
       
   455             comment.TestVisible(screen)
       
   456         for wire in self.Wires:
       
   457             wire.TestVisible(screen)
       
   458         for block in self.Blocks:
       
   459             block.TestVisible(screen)
       
   460             
   430 #-------------------------------------------------------------------------------
   461 #-------------------------------------------------------------------------------
   431 #                              Reset functions
   462 #                              Reset functions
   432 #-------------------------------------------------------------------------------
   463 #-------------------------------------------------------------------------------
   433 
   464 
   434     # Resets Viewer lists
   465     # Resets Viewer lists
   435     def ResetView(self):
   466     def ResetView(self):
   436         self.Blocks = {}
   467         self.Blocks = {}
   437         self.Wires = {}
   468         self.Wires = {}
   438         self.Comments = {}
   469         self.Comments = {}
       
   470         self.Subscribed = {}
   439         self.SelectedElement = None
   471         self.SelectedElement = None
   440         self.HighlightedElement = None
   472         self.HighlightedElement = None
       
   473     
       
   474     def Flush(self):
       
   475         for block in self.Blocks:
       
   476             block.Flush()
       
   477         for element, iec_path in self.Subscribed.iteritems():
       
   478             self.Controler.UnsubscribeDebugIECVariable(iec_path, element)
   441     
   479     
   442     # Remove all elements
   480     # Remove all elements
   443     def CleanView(self):
   481     def CleanView(self):
   444         for block in self.Blocks.keys():
   482         for block in self.Blocks.keys():
   445             block.Clean()
   483             block.Clean()
   467         self.ParentWindow.RefreshTitle()
   505         self.ParentWindow.RefreshTitle()
   468         self.ParentWindow.RefreshEditMenu()
   506         self.ParentWindow.RefreshEditMenu()
   469 
   507 
   470     # Refresh the current scaling
   508     # Refresh the current scaling
   471     def RefreshScaling(self, refresh=True):
   509     def RefreshScaling(self, refresh=True):
   472         properties = self.Controler.GetProjectProperties()
   510         properties = self.Controler.GetProjectProperties(self.Debug)
   473         scaling = properties["scaling"][self.CurrentLanguage]
   511         scaling = properties["scaling"][self.CurrentLanguage]
   474         if scaling != (0, 0):
   512         if scaling != (0, 0):
   475             self.Scaling = scaling
   513             self.Scaling = scaling
   476             if self.DrawGrid:
   514             if self.DrawGrid:
   477                 bitmap = wx.EmptyBitmap(*scaling)
   515                 bitmap = wx.EmptyBitmap(*scaling)
   506 
   544 
   507     # Refresh Viewer elements
   545     # Refresh Viewer elements
   508     def RefreshView(self):
   546     def RefreshView(self):
   509         self.current_id = 0
   547         self.current_id = 0
   510         # Start by reseting Viewer
   548         # Start by reseting Viewer
       
   549         self.Flush()
   511         self.ResetView()
   550         self.ResetView()
   512         instance = True
   551         instance = {}
   513         # List of ids of already loaded blocks
   552         # List of ids of already loaded blocks
   514         ids = []
   553         ids = []
   515         # Load Blocks until they are all loaded
   554         # Load Blocks until they are all loaded
   516         while instance:
   555         while instance is not None:
   517             instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, exclude=ids)
   556             instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, exclude = ids, debug = self.Debug)
   518             if instance:
   557             if instance is not None:
   519                 self.loadInstance(instance, ids)
   558                 self.loadInstance(instance, ids)
   520         self.RefreshScrollBars()
   559         self.RefreshScrollBars()
   521         
   560         
   522         for wire in self.Wires:
   561         for wire in self.Wires:
   523             if not wire.IsConnectedCompatible():
   562             if not wire.IsConnectedCompatible():
   524                 wire.MarkAsInvalid()
   563                 wire.MarkAsInvalid()
   525         
   564             if self.Debug:
       
   565                 block = wire.EndConnected.GetParentBlock()
       
   566                 if isinstance(block, LD_PowerRail):
       
   567                     wire.SetValue(True)
       
   568                 if isinstance(block, FBD_Block):
       
   569                     blockname = block.GetName()
       
   570                     connectorname = wire.EndConnected.GetName()
       
   571                     if blockname != "":
       
   572                         iec_path = "%s.%s.%s"%(self.InstancePath, block.GetName(), connectorname)
       
   573                     else:
       
   574                         if connectorname == "":
       
   575                             connectorname = "OUT"
       
   576                         iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
       
   577                     self.Subscribed[wire] = iec_path.upper()
       
   578                     self.Controler.SubscribeDebugIECVariable(iec_path.upper(), wire)
       
   579 
       
   580         if self.Debug:
       
   581             for block in self.Blocks.keys():
       
   582                 if isinstance(block, (LD_Contact, LD_Coil)):
       
   583                     block.SetValue(False)
       
   584                     block.SpreadCurrent()
       
   585                 if isinstance(block, LD_Contact):
       
   586                     iec_path = "%s.%s"%(self.InstancePath, block.GetName())
       
   587                     self.Subscribed[block] = iec_path.upper()
       
   588                     self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block)
       
   589         
       
   590         self.RefreshVisibleElements()
   526         self.ShowErrors()
   591         self.ShowErrors()
   527         self.Refresh(False)
   592         self.Refresh(False)
   528     
   593     
   529     def GetMaxSize(self):
   594     def GetMaxSize(self):
   530         maxx = maxy = 0
   595         maxx = maxy = 0
   794                     connector.SetPosition(wx.Point(*output_connector["position"]))
   859                     connector.SetPosition(wx.Point(*output_connector["position"]))
   795     
   860     
   796     def CreateWires(self, start_connector, links, ids):
   861     def CreateWires(self, start_connector, links, ids):
   797         for link in links:
   862         for link in links:
   798             refLocalId = link["refLocalId"]
   863             refLocalId = link["refLocalId"]
   799             if refLocalId != None:
   864             if refLocalId is not None:
   800                 if refLocalId not in ids:
   865                 if refLocalId not in ids:
   801                     new_instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, refLocalId)
   866                     new_instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, refLocalId, debug = self.Debug)
   802                     if new_instance:
   867                     if new_instance is not None:
   803                         self.loadInstance(new_instance, ids)
   868                         self.loadInstance(new_instance, ids)
   804                 connected = self.FindElementById(refLocalId)
   869                 connected = self.FindElementById(refLocalId)
   805                 if connected:
   870                 if connected is not None:
   806                     points = link["points"]
   871                     points = link["points"]
   807                     end_connector = connected.GetConnector(wx.Point(points[-1][0], points[-1][1]), link["formalParameter"])
   872                     end_connector = connected.GetConnector(wx.Point(points[-1][0], points[-1][1]), link["formalParameter"])
   808                     if end_connector:
   873                     if end_connector is not None:
   809                         wire = Wire(self)
   874                         wire = Wire(self)
   810                         wire.SetPoints(points)
   875                         wire.SetPoints(points)
   811                         start_connector.Connect((wire, 0), False)
   876                         start_connector.Connect((wire, 0), False)
   812                         end_connector.Connect((wire, -1), False)
   877                         end_connector.Connect((wire, -1), False)
   813                         wire.ConnectStartPoint(None, start_connector)
   878                         wire.ConnectStartPoint(None, start_connector)
   814                         wire.ConnectEndPoint(None, end_connector)
   879                         wire.ConnectEndPoint(None, end_connector)
   815                         self.AddWire(wire)
   880                         self.AddWire(wire)
   816 
   881 
   817     def IsOfType(self, type, reference):
   882     def IsOfType(self, type, reference):
   818         return self.Controler.IsOfType(type, reference)
   883         return self.Controler.IsOfType(type, reference, self.Debug)
   819     
   884     
   820     def IsEndType(self, type):
   885     def IsEndType(self, type):
   821         return self.Controler.IsEndType(type)
   886         return self.Controler.IsEndType(type)
   822 
   887 
   823     def GetBlockType(self, type, inputs = None):
   888     def GetBlockType(self, type, inputs = None):
   824         return self.Controler.GetBlockType(type, inputs)
   889         return self.Controler.GetBlockType(type, inputs, self.Debug)
   825 
   890 
   826 #-------------------------------------------------------------------------------
   891 #-------------------------------------------------------------------------------
   827 #                          Search Element functions
   892 #                          Search Element functions
   828 #-------------------------------------------------------------------------------
   893 #-------------------------------------------------------------------------------
   829 
   894 
   846         for element in self.GetElements():
   911         for element in self.GetElements():
   847             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
   912             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
   848                 return element
   913                 return element
   849         return None
   914         return None
   850     
   915     
   851     def FindBlockConnector(self, pos, direction = None, exclude = True):
   916     def FindBlockConnector(self, pos, direction = None, exclude = None):
   852         for block in self.Blocks:
   917         for block in self.Blocks:
   853             result = block.TestConnector(pos, direction, exclude)
   918             result = block.TestConnector(pos, direction, exclude)
   854             if result:
   919             if result:
   855                 return result
   920                 return result
   856         return None
   921         return None
   875 #                           Popup menu functions
   940 #                           Popup menu functions
   876 #-------------------------------------------------------------------------------
   941 #-------------------------------------------------------------------------------
   877 
   942 
   878     def PopupBlockMenu(self, connector = None):
   943     def PopupBlockMenu(self, connector = None):
   879         if connector is not None and connector.IsCompatible("BOOL"):
   944         if connector is not None and connector.IsCompatible("BOOL"):
   880             type = self.Controler.GetEditedElementType(self.TagName)
   945             type = self.Controler.GetEditedElementType(self.TagName, self.Debug)
   881             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, True)
   946             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, True)
   882             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, True)
   947             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, True)
   883             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, type != "function")
   948             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, type != "function")
   884             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, type != "function")
   949             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, type != "function")
   885         else:
   950         else:
   890         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
   955         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
   891         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
   956         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
   892         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
   957         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
   893         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
   958         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
   894         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
   959         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
   895         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames())
   960         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug))
   896         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
   961         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
   897         if connector:
   962         if connector is not None:
   898             if connector.IsNegated():
   963             if connector.IsNegated():
   899                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS1, True)
   964                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS1, True)
   900             elif connector.GetEdge() == "rising":
   965             elif connector.GetEdge() == "rising":
   901                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS2, True)
   966                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS2, True)
   902             elif connector.GetEdge() == "falling":
   967             elif connector.GetEdge() == "falling":
   964 #-------------------------------------------------------------------------------
  1029 #-------------------------------------------------------------------------------
   965 #                            Menu items functions
  1030 #                            Menu items functions
   966 #-------------------------------------------------------------------------------
  1031 #-------------------------------------------------------------------------------
   967 
  1032 
   968     def OnAlignLeftMenu(self, event):
  1033     def OnAlignLeftMenu(self, event):
   969         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
  1034         if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group):
   970             self.SelectedElement.AlignElements(ALIGN_LEFT, None)
  1035             self.SelectedElement.AlignElements(ALIGN_LEFT, None)
   971             self.RefreshBuffer()
  1036             self.RefreshBuffer()
   972             self.Refresh(False)
  1037             self.Refresh(False)
   973         event.Skip()
  1038         event.Skip()
   974     
  1039     
   975     def OnAlignCenterMenu(self, event):
  1040     def OnAlignCenterMenu(self, event):
   976         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
  1041         if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group):
   977             self.SelectedElement.AlignElements(ALIGN_CENTER, None)
  1042             self.SelectedElement.AlignElements(ALIGN_CENTER, None)
   978             self.RefreshBuffer()
  1043             self.RefreshBuffer()
   979             self.Refresh(False)
  1044             self.Refresh(False)
   980         event.Skip()
  1045         event.Skip()
   981     
  1046     
   982     def OnAlignRightMenu(self, event):
  1047     def OnAlignRightMenu(self, event):
   983         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
  1048         if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group):
   984             self.SelectedElement.AlignElements(ALIGN_RIGHT, None)
  1049             self.SelectedElement.AlignElements(ALIGN_RIGHT, None)
   985             self.RefreshBuffer()
  1050             self.RefreshBuffer()
   986             self.Refresh(False)
  1051             self.Refresh(False)
   987         event.Skip()
  1052         event.Skip()
   988     
  1053     
   989     def OnAlignTopMenu(self, event):
  1054     def OnAlignTopMenu(self, event):
   990         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
  1055         if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group):
   991             self.SelectedElement.AlignElements(None, ALIGN_TOP)
  1056             self.SelectedElement.AlignElements(None, ALIGN_TOP)
   992             self.RefreshBuffer()
  1057             self.RefreshBuffer()
   993             self.Refresh(False)
  1058             self.Refresh(False)
   994         event.Skip()
  1059         event.Skip()
   995     
  1060     
   996     def OnAlignMiddleMenu(self, event):
  1061     def OnAlignMiddleMenu(self, event):
   997         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
  1062         if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group):
   998             self.SelectedElement.AlignElements(None, ALIGN_MIDDLE)
  1063             self.SelectedElement.AlignElements(None, ALIGN_MIDDLE)
   999             self.RefreshBuffer()
  1064             self.RefreshBuffer()
  1000             self.Refresh(False)
  1065             self.Refresh(False)
  1001         event.Skip()
  1066         event.Skip()
  1002     
  1067     
  1003     def OnAlignBottomMenu(self, event):
  1068     def OnAlignBottomMenu(self, event):
  1004         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
  1069         if self.SelectedElement is not None and isinstance(self.SelectedElement, Graphic_Group):
  1005             self.SelectedElement.AlignElements(None, ALIGN_BOTTOM)
  1070             self.SelectedElement.AlignElements(None, ALIGN_BOTTOM)
  1006             self.RefreshBuffer()
  1071             self.RefreshBuffer()
  1007             self.Refresh(False)
  1072             self.Refresh(False)
  1008         event.Skip()
  1073         event.Skip()
  1009         
  1074         
  1010     def OnNoModifierMenu(self, event):
  1075     def OnNoModifierMenu(self, event):
  1011         if self.SelectedElement and self.IsBlock(self.SelectedElement):
  1076         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1012             self.SelectedElement.SetConnectorNegated(False)
  1077             self.SelectedElement.SetConnectorNegated(False)
  1013             self.SelectedElement.Refresh()
  1078             self.SelectedElement.Refresh()
  1014             self.RefreshBuffer()
  1079             self.RefreshBuffer()
  1015         event.Skip()
  1080         event.Skip()
  1016     
  1081     
  1017     def OnNegatedMenu(self, event):
  1082     def OnNegatedMenu(self, event):
  1018         if self.SelectedElement and self.IsBlock(self.SelectedElement):
  1083         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1019             self.SelectedElement.SetConnectorNegated(True)
  1084             self.SelectedElement.SetConnectorNegated(True)
  1020             self.SelectedElement.Refresh()
  1085             self.SelectedElement.Refresh()
  1021             self.RefreshBuffer()
  1086             self.RefreshBuffer()
  1022         event.Skip()
  1087         event.Skip()
  1023 
  1088 
  1024     def OnRisingEdgeMenu(self, event):
  1089     def OnRisingEdgeMenu(self, event):
  1025         if self.SelectedElement and self.IsBlock(self.SelectedElement):
  1090         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1026             self.SelectedElement.SetConnectorEdge("rising")
  1091             self.SelectedElement.SetConnectorEdge("rising")
  1027             self.SelectedElement.Refresh()
  1092             self.SelectedElement.Refresh()
  1028             self.RefreshBuffer()
  1093             self.RefreshBuffer()
  1029         event.Skip()
  1094         event.Skip()
  1030 
  1095 
  1031     def OnFallingEdgeMenu(self, event):
  1096     def OnFallingEdgeMenu(self, event):
  1032         if self.SelectedElement and self.IsBlock(self.SelectedElement):
  1097         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1033             self.SelectedElement.SetConnectorEdge("falling")
  1098             self.SelectedElement.SetConnectorEdge("falling")
  1034             self.SelectedElement.Refresh()
  1099             self.SelectedElement.Refresh()
  1035             self.RefreshBuffer()
  1100             self.RefreshBuffer()
  1036         event.Skip()
  1101         event.Skip()
  1037 
  1102 
  1038     def OnAddSegmentMenu(self, event):
  1103     def OnAddSegmentMenu(self, event):
  1039         if self.SelectedElement and self.IsWire(self.SelectedElement):
  1104         if self.SelectedElement is not None and self.IsWire(self.SelectedElement):
  1040             self.SelectedElement.AddSegment()
  1105             self.SelectedElement.AddSegment()
  1041             self.SelectedElement.Refresh()
  1106             self.SelectedElement.Refresh()
  1042         event.Skip()
  1107         event.Skip()
  1043 
  1108 
  1044     def OnDeleteSegmentMenu(self, event):
  1109     def OnDeleteSegmentMenu(self, event):
  1045         if self.SelectedElement and self.IsWire(self.SelectedElement):
  1110         if self.SelectedElement is not None and self.IsWire(self.SelectedElement):
  1046             self.SelectedElement.DeleteSegment()
  1111             self.SelectedElement.DeleteSegment()
  1047             self.SelectedElement.Refresh()
  1112             self.SelectedElement.Refresh()
  1048         event.Skip()
  1113         event.Skip()
  1049 
  1114 
  1050     def OnAddBranchMenu(self, event):
  1115     def OnAddBranchMenu(self, event):
  1051         if self.SelectedElement and self.IsBlock(self.SelectedElement):
  1116         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1052             self.AddDivergenceBranch(self.SelectedElement)
  1117             self.AddDivergenceBranch(self.SelectedElement)
  1053             self.RefreshBuffer()
  1118             self.RefreshBuffer()
  1054         event.Skip()
  1119         event.Skip()
  1055 
  1120 
  1056     def OnDeleteBranchMenu(self, event):
  1121     def OnDeleteBranchMenu(self, event):
  1057         if self.SelectedElement and self.IsBlock(self.SelectedElement):
  1122         if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
  1058             self.RemoveDivergenceBranch(self.SelectedElement)
  1123             self.RemoveDivergenceBranch(self.SelectedElement)
  1059             self.RefreshBuffer()
  1124             self.RefreshBuffer()
  1060         event.Skip()
  1125         event.Skip()
  1061 
  1126 
  1062     def OnEditBlockMenu(self, event):
  1127     def OnEditBlockMenu(self, event):
  1063         if self.SelectedElement:
  1128         if self.SelectedElement is not None:
  1064             self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType())
  1129             self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType())
  1065         event.Skip()
  1130         event.Skip()
  1066 
  1131 
  1067     def OnDeleteMenu(self, event):
  1132     def OnDeleteMenu(self, event):
  1068         if self.SelectedElement:
  1133         if self.SelectedElement is not None:
  1069             self.SelectedElement.Delete()
  1134             self.SelectedElement.Delete()
  1070             self.SelectedElement = None
  1135             self.SelectedElement = None
  1071             self.RefreshBuffer()
  1136             self.RefreshBuffer()
  1072             self.Refresh(False)
  1137             self.Refresh(False)
  1073         event.Skip()
  1138         event.Skip()
  1088 
  1153 
  1089     def OnViewerLeftDown(self, event):
  1154     def OnViewerLeftDown(self, event):
  1090         if self.Mode == MODE_SELECTION:
  1155         if self.Mode == MODE_SELECTION:
  1091             dc = self.GetLogicalDC()
  1156             dc = self.GetLogicalDC()
  1092             pos = event.GetLogicalPosition(dc)
  1157             pos = event.GetLogicalPosition(dc)
  1093             if event.ControlDown() and self.SelectedElement:
  1158             if event.ControlDown() and self.SelectedElement is not None:
  1094                 element = self.FindElement(pos, True)
  1159                 element = self.FindElement(pos, True)
  1095                 if element:
  1160                 if element is not None:
  1096                     if isinstance(self.SelectedElement, Graphic_Group):
  1161                     if isinstance(self.SelectedElement, Graphic_Group):
  1097                         self.SelectedElement.SetSelected(False)
  1162                         self.SelectedElement.SetSelected(False)
  1098                         self.SelectedElement.SelectElement(element)
  1163                         self.SelectedElement.SelectElement(element)
  1099                     elif self.SelectedElement:
  1164                     elif self.SelectedElement is not None:
  1100                         group = Graphic_Group(self)
  1165                         group = Graphic_Group(self)
  1101                         group.SelectElement(self.SelectedElement)
  1166                         group.SelectElement(self.SelectedElement)
  1102                         group.SelectElement(element)
  1167                         group.SelectElement(element)
  1103                         self.SelectedElement = group
  1168                         self.SelectedElement = group
  1104                     elements = self.SelectedElement.GetElements()
  1169                     elements = self.SelectedElement.GetElements()
  1107                     elif len(elements) == 1:
  1172                     elif len(elements) == 1:
  1108                         self.SelectedElement = elements[0]
  1173                         self.SelectedElement = elements[0]
  1109                     self.SelectedElement.SetSelected(True)
  1174                     self.SelectedElement.SetSelected(True)
  1110             else:
  1175             else:
  1111                 element = self.FindElement(pos)
  1176                 element = self.FindElement(pos)
  1112                 if element is None or element.TestHandle(pos) == (0, 0):
  1177                 if not self.Debug and (element is None or element.TestHandle(pos) == (0, 0)):
  1113                     connector = self.FindBlockConnector(pos)
  1178                     connector = self.FindBlockConnector(pos)
  1114                 else:
  1179                 else:
  1115                     connector = None
  1180                     connector = None
  1116                 if self.DrawingWire:
  1181                 if not self.Debug and self.DrawingWire:
  1117                     self.DrawingWire = False
  1182                     self.DrawingWire = False
  1118                     if self.SelectedElement is not None:
  1183                     if self.SelectedElement is not None:
  1119                         if element is None or element.TestHandle(pos) == (0, 0):
  1184                         if element is None or element.TestHandle(pos) == (0, 0):
  1120                             connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection())
  1185                             connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection())
  1121                         if connector:
  1186                         if connector is not None:
  1122                             event.Dragging = lambda : True
  1187                             event.Dragging = lambda : True
  1123                             self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
  1188                             self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
  1124                         if self.SelectedElement.EndConnected is not None:
  1189                         if self.SelectedElement.EndConnected is not None:
  1125                             self.SelectedElement.ResetPoints()
  1190                             self.SelectedElement.ResetPoints()
  1126                             self.SelectedElement.GeneratePoints()
  1191                             self.SelectedElement.GeneratePoints()
  1132                             rect = self.SelectedElement.GetRedrawRect()
  1197                             rect = self.SelectedElement.GetRedrawRect()
  1133                             self.SelectedElement.Delete()
  1198                             self.SelectedElement.Delete()
  1134                             self.SelectedElement = None
  1199                             self.SelectedElement = None
  1135                             element = None
  1200                             element = None
  1136                             self.RefreshRect(self.GetScrolledRect(rect), False)
  1201                             self.RefreshRect(self.GetScrolledRect(rect), False)
  1137                 elif connector:
  1202                 elif not self.Debug and connector is not None:
  1138                     self.DrawingWire = True
  1203                     self.DrawingWire = True
  1139                     scaled_pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)
  1204                     scaled_pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)
  1140                     if (connector.GetDirection() == EAST):
  1205                     if (connector.GetDirection() == EAST):
  1141                         wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(scaled_pos.x, scaled_pos.y), WEST])
  1206                         wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(scaled_pos.x, scaled_pos.y), WEST])
  1142                     else:
  1207                     else:
  1144                     wire.oldPos = scaled_pos
  1209                     wire.oldPos = scaled_pos
  1145                     wire.Handle = (HANDLE_POINT, 0)
  1210                     wire.Handle = (HANDLE_POINT, 0)
  1146                     wire.ProcessDragging(0, 0, False, None)
  1211                     wire.ProcessDragging(0, 0, False, None)
  1147                     wire.Handle = (HANDLE_POINT, 1)
  1212                     wire.Handle = (HANDLE_POINT, 1)
  1148                     self.AddWire(wire)
  1213                     self.AddWire(wire)
  1149                     if self.SelectedElement:
  1214                     if self.SelectedElement is not None:
  1150                         self.SelectedElement.SetSelected(False)
  1215                         self.SelectedElement.SetSelected(False)
  1151                     self.SelectedElement = wire
  1216                     self.SelectedElement = wire
  1152                     self.SelectedElement.Refresh()
  1217                     self.SelectedElement.Refresh()
  1153                 else:
  1218                 else:
  1154                     if self.SelectedElement and self.SelectedElement != element:
  1219                     if self.SelectedElement is not None and self.SelectedElement != element:
  1155                         self.SelectedElement.SetSelected(False)
  1220                         self.SelectedElement.SetSelected(False)
  1156                         self.SelectedElement = None
  1221                         self.SelectedElement = None
  1157                     if element:
  1222                     if element is not None:
  1158                         self.SelectedElement = element
  1223                         self.SelectedElement = element
  1159                         self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
  1224                         if self.Debug:
       
  1225                             Graphic_Element.OnLeftDown(self.SelectedElement, event, dc, self.Scaling)
       
  1226                         else:
       
  1227                             self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
  1160                         self.SelectedElement.Refresh()
  1228                         self.SelectedElement.Refresh()
  1161                     else:
  1229                     else:
  1162                         self.rubberBand.Reset()
  1230                         self.rubberBand.Reset()
  1163                         self.rubberBand.OnLeftDown(event, dc, self.Scaling)
  1231                         self.rubberBand.OnLeftDown(event, dc, self.Scaling)
  1164         elif self.Mode in [MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, 
  1232         elif self.Mode in [MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, 
  1207                     wx.CallAfter(self.AddNewDivergence, bbox)
  1275                     wx.CallAfter(self.AddNewDivergence, bbox)
  1208                 elif self.Mode == MODE_JUMP:
  1276                 elif self.Mode == MODE_JUMP:
  1209                     wx.CallAfter(self.AddNewJump, bbox)
  1277                     wx.CallAfter(self.AddNewJump, bbox)
  1210                 elif self.Mode == MODE_ACTION:
  1278                 elif self.Mode == MODE_ACTION:
  1211                     wx.CallAfter(self.AddNewActionBlock, bbox)
  1279                     wx.CallAfter(self.AddNewActionBlock, bbox)
  1212         elif self.Mode == MODE_SELECTION and self.SelectedElement:
  1280         elif self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1213             dc = self.GetLogicalDC()
  1281             dc = self.GetLogicalDC()
  1214             if self.DrawingWire:
  1282             if not self.Debug and self.DrawingWire:
  1215                 pos = event.GetLogicalPosition(dc)
  1283                 pos = event.GetLogicalPosition(dc)
  1216                 connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection())
  1284                 connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection())
  1217                 if self.SelectedElement.EndConnected is not None:
  1285                 if self.SelectedElement.EndConnected is not None:
  1218                     self.DrawingWire = False
  1286                     self.DrawingWire = False
  1219                     self.SelectedElement.StartConnected.HighlightParentBlock(False)
  1287                     self.SelectedElement.StartConnected.HighlightParentBlock(False)
  1234                     rect = self.SelectedElement.GetRedrawRect()
  1302                     rect = self.SelectedElement.GetRedrawRect()
  1235                     self.SelectedElement.Delete()
  1303                     self.SelectedElement.Delete()
  1236                     self.SelectedElement = None
  1304                     self.SelectedElement = None
  1237                     self.RefreshRect(self.GetScrolledRect(rect), False)
  1305                     self.RefreshRect(self.GetScrolledRect(rect), False)
  1238             else:
  1306             else:
  1239                 self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
  1307                 if self.Debug:
       
  1308                     Graphic_Element.OnLeftUp(self.SelectedElement, event, dc, self.Scaling)
       
  1309                 else:
       
  1310                     self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
  1240                 wx.CallAfter(self.SetCursor, wx.NullCursor)
  1311                 wx.CallAfter(self.SetCursor, wx.NullCursor)
  1241         if self.Mode != MODE_SELECTION and not self.SavedMode:
  1312         if self.Mode != MODE_SELECTION and not self.SavedMode:
  1242             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
  1313             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
  1243         event.Skip()
  1314         event.Skip()
  1244     
  1315     
  1245     def OnViewerRightDown(self, event):
  1316     def OnViewerRightDown(self, event):
  1246         if self.Mode == MODE_SELECTION:
  1317         if self.Mode == MODE_SELECTION:
  1247             dc = self.GetLogicalDC()
  1318             dc = self.GetLogicalDC()
  1248             pos = event.GetLogicalPosition(dc)
  1319             pos = event.GetLogicalPosition(dc)
  1249             element = self.FindElement(pos)
  1320             element = self.FindElement(pos)
  1250             if self.SelectedElement and self.SelectedElement != element:
  1321             if self.SelectedElement is not None and self.SelectedElement != element:
  1251                 self.SelectedElement.SetSelected(False)
  1322                 self.SelectedElement.SetSelected(False)
  1252                 self.SelectedElement = None
  1323                 self.SelectedElement = None
  1253             if element:
  1324             if element:
  1254                 self.SelectedElement = element
  1325                 self.SelectedElement = element
  1255                 self.SelectedElement.OnRightDown(event, dc, self.Scaling)
  1326                 if self.Debug:
       
  1327                     Graphic_Element.OnRightDown(self.SelectedElement, event, dc, self.Scaling)
       
  1328                 else:
       
  1329                     self.SelectedElement.OnRightDown(event, dc, self.Scaling)
  1256                 self.SelectedElement.Refresh()
  1330                 self.SelectedElement.Refresh()
  1257         event.Skip()
  1331         event.Skip()
  1258     
  1332     
  1259     def OnViewerRightUp(self, event):
  1333     def OnViewerRightUp(self, event):
  1260         dc = self.GetLogicalDC()
  1334         dc = self.GetLogicalDC()
  1261         if self.SelectedElement:
  1335         if self.SelectedElement is not None:
  1262             self.SelectedElement.OnRightUp(event, dc, self.Scaling)
  1336             if self.Debug:
       
  1337                 Graphic_Element.OnRightUp(self.SelectedElement, event, dc, self.Scaling)
       
  1338             else:
       
  1339                 self.SelectedElement.OnRightUp(event, dc, self.Scaling)
  1263             wx.CallAfter(self.SetCursor, wx.NullCursor)
  1340             wx.CallAfter(self.SetCursor, wx.NullCursor)
  1264         else:
  1341         elif not self.Debug:
  1265             self.PopupDefaultMenu(False)
  1342             self.PopupDefaultMenu(False)
  1266         event.Skip()
  1343         event.Skip()
  1267     
  1344     
  1268     def OnViewerLeftDClick(self, event):
  1345     def OnViewerLeftDClick(self, event):
  1269         if self.Mode == MODE_SELECTION and self.SelectedElement:
  1346         if self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1270             if event.ControlDown() and self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames():
  1347             if self.Debug:
       
  1348                 Graphic_Element.OnLeftDClick(self.SelectedElement, event, self.GetLogicalDC(), self.Scaling)
       
  1349             elif event.ControlDown() and self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug):
  1271                 self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
  1350                 self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
  1272             else:
  1351             else:
  1273                 self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1352                 self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1274         event.Skip()
  1353         event.Skip()
  1275     
  1354     
  1285             if highlighted is not None and self.HighlightedElement != highlighted:
  1364             if highlighted is not None and self.HighlightedElement != highlighted:
  1286                 highlighted.SetHighlighted(True)
  1365                 highlighted.SetHighlighted(True)
  1287             self.HighlightedElement = highlighted
  1366             self.HighlightedElement = highlighted
  1288         if self.rubberBand.IsShown():
  1367         if self.rubberBand.IsShown():
  1289             self.rubberBand.OnMotion(event, dc, self.Scaling)
  1368             self.rubberBand.OnMotion(event, dc, self.Scaling)
  1290         elif self.Mode == MODE_SELECTION and self.SelectedElement:
  1369         elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1291             if self.DrawingWire:
  1370             if self.DrawingWire:
  1292                 connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection(), False)
  1371                 connector = self.FindBlockConnector(pos, self.SelectedElement.GetConnectionDirection(), self.SelectedElement.EndConnected)
  1293                 if not connector or self.SelectedElement.EndConnected == None:
  1372                 if not connector or self.SelectedElement.EndConnected == None:
  1294                     self.SelectedElement.ResetPoints()
  1373                     self.SelectedElement.ResetPoints()
  1295                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1374                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1296                     self.SelectedElement.GeneratePoints()
  1375                     self.SelectedElement.GeneratePoints()
  1297                     if movex != 0 or movey != 0:
  1376                     if movex != 0 or movey != 0:
  1302                     self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1381                     self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1303         self.UpdateScrollPos(event)
  1382         self.UpdateScrollPos(event)
  1304         event.Skip()
  1383         event.Skip()
  1305 
  1384 
  1306     def OnLeaveViewer(self, event):
  1385     def OnLeaveViewer(self, event):
  1307         if self.SelectedElement and self.SelectedElement.GetDragging():
  1386         if self.SelectedElement is not None and self.SelectedElement.GetDragging():
  1308             event.Skip()
  1387             event.Skip()
  1309         elif self.HighlightedElement is not None:
  1388         elif self.HighlightedElement is not None:
  1310             self.HighlightedElement.SetHighlighted(False)
  1389             self.HighlightedElement.SetHighlighted(False)
  1311             self.HighlightedElement = None
  1390             self.HighlightedElement = None
  1312         event.Skip()
  1391         event.Skip()
  1313 
  1392 
  1314     def UpdateScrollPos(self, event):
  1393     def UpdateScrollPos(self, event):
  1315         if (event.Dragging() and self.SelectedElement) or self.rubberBand.IsShown():
  1394         if (event.Dragging() and self.SelectedElement is not None) or self.rubberBand.IsShown():
  1316             position = event.GetPosition()
  1395             position = event.GetPosition()
  1317             move_window = wx.Point()
  1396             move_window = wx.Point()
  1318             window_size = self.GetClientSize()
  1397             window_size = self.GetClientSize()
  1319             xstart, ystart = self.GetViewStart()
  1398             xstart, ystart = self.GetViewStart()
  1320             if position.x < SCROLL_ZONE and xstart > 0:
  1399             if position.x < SCROLL_ZONE and xstart > 0:
  1336     def OnChar(self, event):
  1415     def OnChar(self, event):
  1337         xpos, ypos = self.GetScrollPos(wx.HORIZONTAL), self.GetScrollPos(wx.VERTICAL)
  1416         xpos, ypos = self.GetScrollPos(wx.HORIZONTAL), self.GetScrollPos(wx.VERTICAL)
  1338         xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL)
  1417         xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL)
  1339         ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL)
  1418         ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL)
  1340         keycode = event.GetKeyCode()
  1419         keycode = event.GetKeyCode()
  1341         if self.Scaling:
  1420         if self.Scaling is not None:
  1342             scaling = self.Scaling
  1421             scaling = self.Scaling
  1343         else:
  1422         else:
  1344             scaling = (8, 8)
  1423             scaling = (8, 8)
  1345         if keycode == wx.WXK_DELETE and self.SelectedElement:
  1424         if not self.Debug and keycode == wx.WXK_DELETE and self.SelectedElement is not None:
  1346             rect = self.SelectedElement.GetRedrawRect(1, 1)
  1425             rect = self.SelectedElement.GetRedrawRect(1, 1)
  1347             self.SelectedElement.Delete()
  1426             self.SelectedElement.Delete()
  1348             self.SelectedElement = None
  1427             self.SelectedElement = None
  1349             self.RefreshBuffer()
  1428             self.RefreshBuffer()
  1350             self.RefreshScrollBars()
  1429             self.RefreshScrollBars()
  1351             self.SetCursor(wx.NullCursor)
  1430             self.SetCursor(wx.NullCursor)
  1352             self.RefreshRect(self.GetScrolledRect(rect), False)
  1431             self.RefreshRect(self.GetScrolledRect(rect), False)
  1353         elif keycode == wx.WXK_RETURN and self.SelectedElement:
  1432         elif not self.Debug and keycode == wx.WXK_RETURN and self.SelectedElement is not None:
  1354             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1433             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1355         elif keycode == wx.WXK_LEFT:
  1434         elif keycode == wx.WXK_LEFT:
  1356             if event.ControlDown() and event.ShiftDown():
  1435             if event.ControlDown() and event.ShiftDown():
  1357                 self.Scroll(0, ypos)
  1436                 self.Scroll(0, ypos)
  1358             elif event.ControlDown():
  1437             elif event.ControlDown():
  1359                 event.Skip()
  1438                 event.Skip()
  1360             elif self.SelectedElement:
  1439             elif not self.Debug and self.SelectedElement is not None:
  1361                 self.SelectedElement.Move(-scaling[0], 0)
  1440                 self.SelectedElement.Move(-scaling[0], 0)
  1362                 self.SelectedElement.RefreshModel()
  1441                 self.SelectedElement.RefreshModel()
  1363                 self.RefreshBuffer()
  1442                 self.RefreshBuffer()
  1364                 self.RefreshScrollBars()
  1443                 self.RefreshScrollBars()
  1365                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(-scaling[0], 0)), False)
  1444                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(-scaling[0], 0)), False)
  1366         elif keycode == wx.WXK_RIGHT:
  1445         elif keycode == wx.WXK_RIGHT:
  1367             if event.ControlDown() and event.ShiftDown():
  1446             if event.ControlDown() and event.ShiftDown():
  1368                 self.Scroll(xmax, ypos)
  1447                 self.Scroll(xmax, ypos)
  1369             elif event.ControlDown():
  1448             elif event.ControlDown():
  1370                 event.Skip()
  1449                 event.Skip()
  1371             elif self.SelectedElement:
  1450             elif not self.Debug and self.SelectedElement is not None:
  1372                 self.SelectedElement.Move(scaling[0], 0)
  1451                 self.SelectedElement.Move(scaling[0], 0)
  1373                 self.SelectedElement.RefreshModel()
  1452                 self.SelectedElement.RefreshModel()
  1374                 self.RefreshBuffer()
  1453                 self.RefreshBuffer()
  1375                 self.RefreshScrollBars()
  1454                 self.RefreshScrollBars()
  1376                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(scaling[0], 0)), False)
  1455                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(scaling[0], 0)), False)
  1377         elif keycode == wx.WXK_UP:
  1456         elif keycode == wx.WXK_UP:
  1378             if event.ControlDown() and event.ShiftDown():
  1457             if event.ControlDown() and event.ShiftDown():
  1379                 self.Scroll(xpos, 0)
  1458                 self.Scroll(xpos, 0)
  1380             elif event.ControlDown():
  1459             elif event.ControlDown():
  1381                 event.Skip()
  1460                 event.Skip()
  1382             elif self.SelectedElement:
  1461             elif not self.Debug and self.SelectedElement is not None:
  1383                 self.SelectedElement.Move(0, -scaling[1])
  1462                 self.SelectedElement.Move(0, -scaling[1])
  1384                 self.SelectedElement.RefreshModel()
  1463                 self.SelectedElement.RefreshModel()
  1385                 self.RefreshBuffer()
  1464                 self.RefreshBuffer()
  1386                 self.RefreshScrollBars()
  1465                 self.RefreshScrollBars()
  1387                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, -scaling[1])), False)
  1466                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, -scaling[1])), False)
  1388         elif keycode == wx.WXK_DOWN:
  1467         elif keycode == wx.WXK_DOWN:
  1389             if event.ControlDown() and event.ShiftDown():
  1468             if event.ControlDown() and event.ShiftDown():
  1390                 self.Scroll(xpos, ymax)
  1469                 self.Scroll(xpos, ymax)
  1391             elif event.ControlDown():
  1470             elif event.ControlDown():
  1392                 event.Skip()
  1471                 event.Skip()
  1393             elif self.SelectedElement:
  1472             elif not self.Debug and self.SelectedElement is not None:
  1394                 self.SelectedElement.Move(0, scaling[1])
  1473                 self.SelectedElement.Move(0, scaling[1])
  1395                 self.SelectedElement.RefreshModel()
  1474                 self.SelectedElement.RefreshModel()
  1396                 self.RefreshBuffer()
  1475                 self.RefreshBuffer()
  1397                 self.RefreshScrollBars()
  1476                 self.RefreshScrollBars()
  1398                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False)
  1477                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False)
  1399         elif keycode == wx.WXK_SPACE and self.SelectedElement is not None and self.SelectedElement.Dragging:
  1478         elif not self.Debug and keycode == wx.WXK_SPACE and self.SelectedElement is not None and self.SelectedElement.Dragging:
  1400             if self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement):
  1479             if self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement):
  1401                 self.CopyBlock(self.SelectedElement, wx.Point(*self.SelectedElement.GetPosition()))
  1480                 self.CopyBlock(self.SelectedElement, wx.Point(*self.SelectedElement.GetPosition()))
  1402                 self.RefreshBuffer()
  1481                 self.RefreshBuffer()
  1403                 self.RefreshScrollBars()
  1482                 self.RefreshScrollBars()
  1404                 self.ParentWindow.RefreshVariablePanel(self.TagName)
  1483                 self.ParentWindow.RefreshVariablePanel(self.TagName)
  1419         return width, height
  1498         return width, height
  1420 
  1499 
  1421     def AddNewBlock(self, bbox):
  1500     def AddNewBlock(self, bbox):
  1422         dialog = BlockPropertiesDialog(self.ParentWindow, self.Controler)
  1501         dialog = BlockPropertiesDialog(self.ParentWindow, self.Controler)
  1423         dialog.SetPreviewFont(self.GetFont())
  1502         dialog.SetPreviewFont(self.GetFont())
  1424         dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName))
  1503         dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName, self.Debug))
  1425         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1504         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1426         dialog.SetPouElementNames(self.Controler.GetEditedElementVariables(self.TagName))
  1505         dialog.SetPouElementNames(self.Controler.GetEditedElementVariables(self.TagName, self.Debug))
  1427         dialog.SetMinBlockSize((bbox.width, bbox.height))
  1506         dialog.SetMinBlockSize((bbox.width, bbox.height))
  1428         if dialog.ShowModal() == wx.ID_OK:
  1507         if dialog.ShowModal() == wx.ID_OK:
  1429             id = self.GetNewId()
  1508             id = self.GetNewId()
  1430             values = dialog.GetValues()
  1509             values = dialog.GetValues()
  1431             if "name" in values:
  1510             if "name" in values:
  1437             self.AddBlock(block)
  1516             self.AddBlock(block)
  1438             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
  1517             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
  1439             self.RefreshBlockModel(block)
  1518             self.RefreshBlockModel(block)
  1440             self.RefreshBuffer()
  1519             self.RefreshBuffer()
  1441             self.RefreshScrollBars()
  1520             self.RefreshScrollBars()
       
  1521             self.RefreshVisibleElements()
  1442             self.ParentWindow.RefreshVariablePanel(self.TagName)
  1522             self.ParentWindow.RefreshVariablePanel(self.TagName)
  1443             self.ParentWindow.RefreshInstancesTree()
  1523             self.ParentWindow.RefreshInstancesTree()
  1444             block.Refresh()
  1524             block.Refresh()
  1445         dialog.Destroy()
  1525         dialog.Destroy()
  1446     
  1526     
  1447     def AddNewVariable(self, bbox):
  1527     def AddNewVariable(self, bbox):
  1448         dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
  1528         dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
  1449         dialog.SetPreviewFont(self.GetFont())
  1529         dialog.SetPreviewFont(self.GetFont())
  1450         dialog.SetMinVariableSize((bbox.width, bbox.height))
  1530         dialog.SetMinVariableSize((bbox.width, bbox.height))
  1451         varlist = []
  1531         varlist = []
  1452         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  1532         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
  1453         if vars:
  1533         if vars:
  1454             for var in vars:
  1534             for var in vars:
  1455                 if var["Edit"]:
  1535                 if var["Edit"]:
  1456                     varlist.append((var["Name"], var["Class"], var["Type"]))
  1536                     varlist.append((var["Name"], var["Class"], var["Type"]))
  1457         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
  1537         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug)
  1458         if returntype:
  1538         if returntype:
  1459             varlist.append((self.Controler.GetEditedElementName(self.TagName), "Output", returntype))
  1539             varlist.append((self.Controler.GetEditedElementName(self.TagName), "Output", returntype))
  1460         dialog.SetVariables(varlist)
  1540         dialog.SetVariables(varlist)
  1461         if dialog.ShowModal() == wx.ID_OK:
  1541         if dialog.ShowModal() == wx.ID_OK:
  1462             id = self.GetNewId()
  1542             id = self.GetNewId()
  1467             self.AddBlock(variable)
  1547             self.AddBlock(variable)
  1468             self.Controler.AddEditedElementVariable(self.TagName, id, values["type"])
  1548             self.Controler.AddEditedElementVariable(self.TagName, id, values["type"])
  1469             self.RefreshVariableModel(variable)
  1549             self.RefreshVariableModel(variable)
  1470             self.RefreshBuffer()
  1550             self.RefreshBuffer()
  1471             self.RefreshScrollBars()
  1551             self.RefreshScrollBars()
       
  1552             self.RefreshVisibleElements()
  1472             variable.Refresh()
  1553             variable.Refresh()
  1473         dialog.Destroy()
  1554         dialog.Destroy()
  1474 
  1555 
  1475     def AddNewConnection(self, bbox):
  1556     def AddNewConnection(self, bbox):
  1476         dialog = ConnectionPropertiesDialog(self.ParentWindow, self.Controler)
  1557         dialog = ConnectionPropertiesDialog(self.ParentWindow, self.Controler)
  1485             self.AddBlock(connection)
  1566             self.AddBlock(connection)
  1486             self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
  1567             self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
  1487             self.RefreshConnectionModel(connection)
  1568             self.RefreshConnectionModel(connection)
  1488             self.RefreshBuffer()
  1569             self.RefreshBuffer()
  1489             self.RefreshScrollBars()
  1570             self.RefreshScrollBars()
       
  1571             self.RefreshVisibleElements()
  1490             connection.Refresh()
  1572             connection.Refresh()
  1491         dialog.Destroy()
  1573         dialog.Destroy()
  1492 
  1574 
  1493     def AddNewComment(self, bbox):
  1575     def AddNewComment(self, bbox):
  1494         if wx.VERSION >= (2, 5, 0):
  1576         if wx.VERSION >= (2, 5, 0):
  1505             self.AddComment(comment)
  1587             self.AddComment(comment)
  1506             self.Controler.AddEditedElementComment(self.TagName, id)
  1588             self.Controler.AddEditedElementComment(self.TagName, id)
  1507             self.RefreshCommentModel(comment)
  1589             self.RefreshCommentModel(comment)
  1508             self.RefreshBuffer()
  1590             self.RefreshBuffer()
  1509             self.RefreshScrollBars()
  1591             self.RefreshScrollBars()
       
  1592             self.RefreshVisibleElements()
  1510             comment.Refresh()
  1593             comment.Refresh()
  1511         dialog.Destroy()
  1594         dialog.Destroy()
  1512 
  1595 
  1513     def AddNewContact(self, bbox):
  1596     def AddNewContact(self, bbox):
  1514         dialog = LDElementDialog(self.ParentWindow, self.Controler, "contact")
  1597         dialog = LDElementDialog(self.ParentWindow, self.Controler, "contact")
  1515         dialog.SetPreviewFont(self.GetFont())
  1598         dialog.SetPreviewFont(self.GetFont())
  1516         varlist = []
  1599         varlist = []
  1517         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  1600         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
  1518         if vars:
  1601         if vars:
  1519             for var in vars:
  1602             for var in vars:
  1520                 if var["Class"] != "Output" and var["Type"] == "BOOL":
  1603                 if var["Class"] != "Output" and var["Type"] == "BOOL":
  1521                     varlist.append(var["Name"])
  1604                     varlist.append(var["Name"])
  1522         dialog.SetVariables(varlist)
  1605         dialog.SetVariables(varlist)
  1531             self.AddBlock(contact)
  1614             self.AddBlock(contact)
  1532             self.Controler.AddEditedElementContact(self.TagName, id)
  1615             self.Controler.AddEditedElementContact(self.TagName, id)
  1533             self.RefreshContactModel(contact)
  1616             self.RefreshContactModel(contact)
  1534             self.RefreshBuffer()
  1617             self.RefreshBuffer()
  1535             self.RefreshScrollBars()
  1618             self.RefreshScrollBars()
       
  1619             self.RefreshVisibleElements()
  1536             contact.Refresh()
  1620             contact.Refresh()
  1537         dialog.Destroy()
  1621         dialog.Destroy()
  1538 
  1622 
  1539     def AddNewCoil(self, bbox):
  1623     def AddNewCoil(self, bbox):
  1540         dialog = LDElementDialog(self.ParentWindow, self.Controler, "coil")
  1624         dialog = LDElementDialog(self.ParentWindow, self.Controler, "coil")
  1541         dialog.SetPreviewFont(self.GetFont())
  1625         dialog.SetPreviewFont(self.GetFont())
  1542         varlist = []
  1626         varlist = []
  1543         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  1627         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
  1544         if vars:
  1628         if vars:
  1545             for var in vars:
  1629             for var in vars:
  1546                 if var["Class"] != "Input" and var["Type"] == "BOOL":
  1630                 if var["Class"] != "Input" and var["Type"] == "BOOL":
  1547                     varlist.append(var["Name"])
  1631                     varlist.append(var["Name"])
  1548         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
  1632         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug)
  1549         if returntype == "BOOL":
  1633         if returntype == "BOOL":
  1550             varlist.append(self.Controler.GetEditedElementName(self.TagName))
  1634             varlist.append(self.Controler.GetEditedElementName(self.TagName))
  1551         dialog.SetVariables(varlist)
  1635         dialog.SetVariables(varlist)
  1552         dialog.SetValues({"name":"","type":COIL_NORMAL})
  1636         dialog.SetValues({"name":"","type":COIL_NORMAL})
  1553         dialog.SetElementSize((bbox.width, bbox.height))
  1637         dialog.SetElementSize((bbox.width, bbox.height))
  1560             self.AddBlock(coil)
  1644             self.AddBlock(coil)
  1561             self.Controler.AddEditedElementCoil(self.TagName, id)
  1645             self.Controler.AddEditedElementCoil(self.TagName, id)
  1562             self.RefreshCoilModel(coil)
  1646             self.RefreshCoilModel(coil)
  1563             self.RefreshBuffer()
  1647             self.RefreshBuffer()
  1564             self.RefreshScrollBars()
  1648             self.RefreshScrollBars()
       
  1649             self.RefreshVisibleElements()
  1565             coil.Refresh()
  1650             coil.Refresh()
  1566         dialog.Destroy()
  1651         dialog.Destroy()
  1567 
  1652 
  1568     def AddNewPowerRail(self, bbox):
  1653     def AddNewPowerRail(self, bbox):
  1569         dialog = LDPowerRailDialog(self.ParentWindow, self.Controler)
  1654         dialog = LDPowerRailDialog(self.ParentWindow, self.Controler)
  1578             self.AddBlock(powerrail)
  1663             self.AddBlock(powerrail)
  1579             self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
  1664             self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
  1580             self.RefreshPowerRailModel(powerrail)
  1665             self.RefreshPowerRailModel(powerrail)
  1581             self.RefreshBuffer()
  1666             self.RefreshBuffer()
  1582             self.RefreshScrollBars()
  1667             self.RefreshScrollBars()
       
  1668             self.RefreshVisibleElements()
  1583             powerrail.Refresh()
  1669             powerrail.Refresh()
  1584         dialog.Destroy()
  1670         dialog.Destroy()
  1585 
  1671 
  1586     def AddNewStep(self, bbox, initial = False):
  1672     def AddNewStep(self, bbox, initial = False):
  1587         dialog = StepContentDialog(self.ParentWindow, self.Controler, initial)
  1673         dialog = StepContentDialog(self.ParentWindow, self.Controler, initial)
  1588         dialog.SetPreviewFont(self.GetFont())
  1674         dialog.SetPreviewFont(self.GetFont())
  1589         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1675         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1590         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName))
  1676         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  1591         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
  1677         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
  1592         dialog.SetMinStepSize((bbox.width, bbox.height))
  1678         dialog.SetMinStepSize((bbox.width, bbox.height))
  1593         if dialog.ShowModal() == wx.ID_OK:
  1679         if dialog.ShowModal() == wx.ID_OK:
  1594             id = self.GetNewId()
  1680             id = self.GetNewId()
  1595             values = dialog.GetValues()
  1681             values = dialog.GetValues()
  1612             self.AddBlock(step)
  1698             self.AddBlock(step)
  1613             self.Controler.AddEditedElementStep(self.TagName, id)
  1699             self.Controler.AddEditedElementStep(self.TagName, id)
  1614             self.RefreshStepModel(step)
  1700             self.RefreshStepModel(step)
  1615             self.RefreshBuffer()
  1701             self.RefreshBuffer()
  1616             self.RefreshScrollBars()
  1702             self.RefreshScrollBars()
       
  1703             self.RefreshVisibleElements()
  1617             step.Refresh()
  1704             step.Refresh()
  1618         dialog.Destroy()
  1705         dialog.Destroy()
  1619 
  1706 
  1620     def AddNewTransition(self, bbox):
  1707     def AddNewTransition(self, bbox):
  1621         dialog = TransitionContentDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
  1708         dialog = TransitionContentDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
  1622         dialog.SetPreviewFont(self.GetFont())
  1709         dialog.SetPreviewFont(self.GetFont())
  1623         dialog.SetTransitions(self.Controler.GetEditedElementTransitions(self.TagName))
  1710         dialog.SetTransitions(self.Controler.GetEditedElementTransitions(self.TagName, self.Debug))
  1624         if dialog.ShowModal() == wx.ID_OK:
  1711         if dialog.ShowModal() == wx.ID_OK:
  1625             id = self.GetNewId()
  1712             id = self.GetNewId()
  1626             values = dialog.GetValues()
  1713             values = dialog.GetValues()
  1627             transition = SFC_Transition(self, values["type"], values["value"], values["priority"], id)
  1714             transition = SFC_Transition(self, values["type"], values["value"], values["priority"], id)
  1628             transition.SetPosition(bbox.x, bbox.y)
  1715             transition.SetPosition(bbox.x, bbox.y)
  1631             self.AddBlock(transition)
  1718             self.AddBlock(transition)
  1632             self.Controler.AddEditedElementTransition(self.TagName, id)
  1719             self.Controler.AddEditedElementTransition(self.TagName, id)
  1633             self.RefreshTransitionModel(transition)
  1720             self.RefreshTransitionModel(transition)
  1634             self.RefreshBuffer()
  1721             self.RefreshBuffer()
  1635             self.RefreshScrollBars()
  1722             self.RefreshScrollBars()
       
  1723             self.RefreshVisibleElements()
  1636             transition.Refresh()
  1724             transition.Refresh()
  1637         dialog.Destroy()
  1725         dialog.Destroy()
  1638 
  1726 
  1639     def AddNewDivergence(self, bbox):
  1727     def AddNewDivergence(self, bbox):
  1640         dialog = DivergenceCreateDialog(self.ParentWindow, self.Controler)
  1728         dialog = DivergenceCreateDialog(self.ParentWindow, self.Controler)
  1650             self.AddBlock(divergence)
  1738             self.AddBlock(divergence)
  1651             self.Controler.AddEditedElementDivergence(self.TagName, id, values["type"])
  1739             self.Controler.AddEditedElementDivergence(self.TagName, id, values["type"])
  1652             self.RefreshDivergenceModel(divergence)
  1740             self.RefreshDivergenceModel(divergence)
  1653             self.RefreshBuffer()
  1741             self.RefreshBuffer()
  1654             self.RefreshScrollBars()
  1742             self.RefreshScrollBars()
       
  1743             self.RefreshVisibleElements()
  1655             divergence.Refresh()
  1744             divergence.Refresh()
  1656         dialog.Destroy()
  1745         dialog.Destroy()
  1657 
  1746 
  1658     def AddNewJump(self, bbox):
  1747     def AddNewJump(self, bbox):
  1659         choices = []
  1748         choices = []
  1671             self.AddBlock(jump)
  1760             self.AddBlock(jump)
  1672             self.Controler.AddEditedElementJump(self.TagName, id)
  1761             self.Controler.AddEditedElementJump(self.TagName, id)
  1673             self.RefreshJumpModel(jump)
  1762             self.RefreshJumpModel(jump)
  1674             self.RefreshBuffer()
  1763             self.RefreshBuffer()
  1675             self.RefreshScrollBars()
  1764             self.RefreshScrollBars()
       
  1765             self.RefreshVisibleElements()
  1676             jump.Refresh()
  1766             jump.Refresh()
  1677         dialog.Destroy()
  1767         dialog.Destroy()
  1678 
  1768 
  1679     def AddNewActionBlock(self, bbox):
  1769     def AddNewActionBlock(self, bbox):
  1680         dialog = ActionBlockDialog(self.ParentWindow)
  1770         dialog = ActionBlockDialog(self.ParentWindow)
  1681         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
  1771         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
  1682         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName))
  1772         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
  1683         dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName))
  1773         dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  1684         if dialog.ShowModal() == wx.ID_OK:
  1774         if dialog.ShowModal() == wx.ID_OK:
  1685             actions = dialog.GetValues()
  1775             actions = dialog.GetValues()
  1686             id = self.GetNewId()
  1776             id = self.GetNewId()
  1687             actionblock = SFC_ActionBlock(self, actions, id)
  1777             actionblock = SFC_ActionBlock(self, actions, id)
  1688             actionblock.SetPosition(bbox.x, bbox.y)
  1778             actionblock.SetPosition(bbox.x, bbox.y)
  1691             self.AddBlock(actionblock)
  1781             self.AddBlock(actionblock)
  1692             self.Controler.AddEditedElementActionBlock(self.TagName, id)
  1782             self.Controler.AddEditedElementActionBlock(self.TagName, id)
  1693             self.RefreshActionBlockModel(actionblock)
  1783             self.RefreshActionBlockModel(actionblock)
  1694             self.RefreshBuffer()
  1784             self.RefreshBuffer()
  1695             self.RefreshScrollBars()
  1785             self.RefreshScrollBars()
       
  1786             self.RefreshVisibleElements()
  1696             actionblock.Refresh()
  1787             actionblock.Refresh()
  1697         dialog.Destroy()
  1788         dialog.Destroy()
  1698 
  1789 
  1699 #-------------------------------------------------------------------------------
  1790 #-------------------------------------------------------------------------------
  1700 #                          Edit element content functions
  1791 #                          Edit element content functions
  1701 #-------------------------------------------------------------------------------
  1792 #-------------------------------------------------------------------------------
  1702 
  1793 
  1703     def EditBlockContent(self, block):
  1794     def EditBlockContent(self, block):
  1704         dialog = BlockPropertiesDialog(self.ParentWindow, self.Controler)
  1795         dialog = BlockPropertiesDialog(self.ParentWindow, self.Controler)
  1705         dialog.SetPreviewFont(self.GetFont())
  1796         dialog.SetPreviewFont(self.GetFont())
  1706         dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName))
  1797         dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName, self.Debug))
  1707         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1798         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1708         variable_names = self.Controler.GetEditedElementVariables(self.TagName)
  1799         variable_names = self.Controler.GetEditedElementVariables(self.TagName, self.Debug)
  1709         if block.GetName() != "":
  1800         if block.GetName() != "":
  1710             variable_names.remove(block.GetName())
  1801             variable_names.remove(block.GetName())
  1711         dialog.SetPouElementNames(variable_names)
  1802         dialog.SetPouElementNames(variable_names)
  1712         dialog.SetMinBlockSize(block.GetSize())
  1803         dialog.SetMinBlockSize(block.GetSize())
  1713         old_values = {"name" : block.GetName(), "type" : block.GetType(), "inputs" : block.GetInputTypes(), 
  1804         old_values = {"name" : block.GetName(), "type" : block.GetType(), "inputs" : block.GetInputTypes(), 
  1727             self.RefreshBlockModel(block)
  1818             self.RefreshBlockModel(block)
  1728             if old_values["executionOrder"] != new_values["executionOrder"]:
  1819             if old_values["executionOrder"] != new_values["executionOrder"]:
  1729                 self.RefreshView()
  1820                 self.RefreshView()
  1730             self.RefreshBuffer()
  1821             self.RefreshBuffer()
  1731             self.RefreshScrollBars()
  1822             self.RefreshScrollBars()
       
  1823             self.RefreshVisibleElements()
  1732             self.ParentWindow.RefreshVariablePanel(self.TagName)
  1824             self.ParentWindow.RefreshVariablePanel(self.TagName)
  1733             self.ParentWindow.RefreshInstancesTree()
  1825             self.ParentWindow.RefreshInstancesTree()
  1734             block.Refresh(rect)
  1826             block.Refresh(rect)
  1735         dialog.Destroy()
  1827         dialog.Destroy()
  1736 
  1828 
  1737     def EditVariableContent(self, variable):
  1829     def EditVariableContent(self, variable):
  1738         dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
  1830         dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
  1739         dialog.SetPreviewFont(self.GetFont())
  1831         dialog.SetPreviewFont(self.GetFont())
  1740         dialog.SetMinVariableSize(variable.GetSize())
  1832         dialog.SetMinVariableSize(variable.GetSize())
  1741         varlist = []
  1833         varlist = []
  1742         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  1834         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
  1743         if vars:
  1835         if vars:
  1744             for var in vars:
  1836             for var in vars:
  1745                 if var["Edit"]:
  1837                 if var["Edit"]:
  1746                     varlist.append((var["Name"], var["Class"], var["Type"]))
  1838                     varlist.append((var["Name"], var["Class"], var["Type"]))
  1747         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
  1839         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug)
  1748         if returntype:
  1840         if returntype:
  1749             varlist.append((self.Controler.GetEditedElementName(self.TagName), "Output", returntype))
  1841             varlist.append((self.Controler.GetEditedElementName(self.TagName), "Output", returntype))
  1750         dialog.SetVariables(varlist)
  1842         dialog.SetVariables(varlist)
  1751         old_values = {"name" : variable.GetName(), "type" : variable.GetType(), 
  1843         old_values = {"name" : variable.GetName(), "type" : variable.GetType(), 
  1752             "executionOrder" : variable.GetExecutionOrder()}
  1844             "executionOrder" : variable.GetExecutionOrder()}
  1765                 self.Controler.AddEditedElementVariable(self.TagName, id, new_values["type"])
  1857                 self.Controler.AddEditedElementVariable(self.TagName, id, new_values["type"])
  1766             self.RefreshVariableModel(variable)
  1858             self.RefreshVariableModel(variable)
  1767             if old_values["executionOrder"] != new_values["executionOrder"]:
  1859             if old_values["executionOrder"] != new_values["executionOrder"]:
  1768                 self.RefreshView()
  1860                 self.RefreshView()
  1769             self.RefreshBuffer()
  1861             self.RefreshBuffer()
       
  1862             self.RefreshVisibleElements()
  1770             self.RefreshScrollBars()
  1863             self.RefreshScrollBars()
  1771             variable.Refresh(rect)
  1864             variable.Refresh(rect)
  1772         dialog.Destroy()
  1865         dialog.Destroy()
  1773 
  1866 
  1774     def EditConnectionContent(self, connection):
  1867     def EditConnectionContent(self, connection):
  1790                 self.Controler.RemoveEditedElementInstance(self.TagName, id)
  1883                 self.Controler.RemoveEditedElementInstance(self.TagName, id)
  1791                 self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
  1884                 self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
  1792             self.RefreshConnectionModel(connection)
  1885             self.RefreshConnectionModel(connection)
  1793             self.RefreshBuffer()
  1886             self.RefreshBuffer()
  1794             self.RefreshScrollBars()
  1887             self.RefreshScrollBars()
       
  1888             self.RefreshVisibleElements()
  1795             connection.Refresh(rect)
  1889             connection.Refresh(rect)
  1796         dialog.Destroy()
  1890         dialog.Destroy()
  1797 
  1891 
  1798     def EditContactContent(self, contact):
  1892     def EditContactContent(self, contact):
  1799         dialog = LDElementDialog(self.ParentWindow, self.Controler, "contact")
  1893         dialog = LDElementDialog(self.ParentWindow, self.Controler, "contact")
  1800         dialog.SetPreviewFont(self.GetFont())
  1894         dialog.SetPreviewFont(self.GetFont())
  1801         varlist = []
  1895         varlist = []
  1802         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  1896         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
  1803         if vars:
  1897         if vars:
  1804             for var in vars:
  1898             for var in vars:
  1805                 if var["Class"] != "Output" and var["Type"] == "BOOL":
  1899                 if var["Class"] != "Output" and var["Type"] == "BOOL":
  1806                     varlist.append(var["Name"])
  1900                     varlist.append(var["Name"])
  1807         dialog.SetVariables(varlist)
  1901         dialog.SetVariables(varlist)
  1816             contact.SetSize(*self.GetScaledSize(values["width"], values["height"]))
  1910             contact.SetSize(*self.GetScaledSize(values["width"], values["height"]))
  1817             rect = rect.Union(contact.GetRedrawRect())
  1911             rect = rect.Union(contact.GetRedrawRect())
  1818             self.RefreshContactModel(contact)
  1912             self.RefreshContactModel(contact)
  1819             self.RefreshBuffer()
  1913             self.RefreshBuffer()
  1820             self.RefreshScrollBars()
  1914             self.RefreshScrollBars()
       
  1915             self.RefreshVisibleElements()
  1821             contact.Refresh(rect)
  1916             contact.Refresh(rect)
  1822         dialog.Destroy()
  1917         dialog.Destroy()
  1823 
  1918 
  1824     def EditCoilContent(self, coil):
  1919     def EditCoilContent(self, coil):
  1825         dialog = LDElementDialog(self.ParentWindow, self.Controler, "coil")
  1920         dialog = LDElementDialog(self.ParentWindow, self.Controler, "coil")
  1826         dialog.SetPreviewFont(self.GetFont())
  1921         dialog.SetPreviewFont(self.GetFont())
  1827         varlist = []
  1922         varlist = []
  1828         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName)
  1923         vars = self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)
  1829         if vars:
  1924         if vars:
  1830             for var in vars:
  1925             for var in vars:
  1831                 if var["Class"] != "Input" and var["Type"] == "BOOL":
  1926                 if var["Class"] != "Input" and var["Type"] == "BOOL":
  1832                     varlist.append(var["Name"])
  1927                     varlist.append(var["Name"])
  1833         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName)
  1928         returntype = self.Controler.GetEditedElementInterfaceReturnType(self.TagName, self.Debug)
  1834         if returntype == "BOOL":
  1929         if returntype == "BOOL":
  1835             varlist.append(self.Controler.GetEditedElementName(self.TagName))
  1930             varlist.append(self.Controler.GetEditedElementName(self.TagName))
  1836         dialog.SetVariables(varlist)
  1931         dialog.SetVariables(varlist)
  1837         values = {"name" : coil.GetName(), "type" : coil.GetType()}
  1932         values = {"name" : coil.GetName(), "type" : coil.GetType()}
  1838         dialog.SetValues(values)
  1933         dialog.SetValues(values)
  1845             coil.SetSize(*self.GetScaledSize(values["width"], values["height"]))
  1940             coil.SetSize(*self.GetScaledSize(values["width"], values["height"]))
  1846             rect = rect.Union(coil.GetRedrawRect())
  1941             rect = rect.Union(coil.GetRedrawRect())
  1847             self.RefreshCoilModel(coil)
  1942             self.RefreshCoilModel(coil)
  1848             self.RefreshBuffer()
  1943             self.RefreshBuffer()
  1849             self.RefreshScrollBars()
  1944             self.RefreshScrollBars()
       
  1945             self.RefreshVisibleElements()
  1850             coil.Refresh(rect)
  1946             coil.Refresh(rect)
  1851         dialog.Destroy()
  1947         dialog.Destroy()
  1852 
  1948 
  1853     def EditPowerRailContent(self, powerrail):
  1949     def EditPowerRailContent(self, powerrail):
  1854         dialog = LDPowerRailDialog(self.ParentWindow, self.Controler, powerrail.GetType(), len(powerrail.GetConnectors()))
  1950         dialog = LDPowerRailDialog(self.ParentWindow, self.Controler, powerrail.GetType(), len(powerrail.GetConnectors()))
  1866                 self.Controler.RemoveEditedElementInstance(self.TagName, id)
  1962                 self.Controler.RemoveEditedElementInstance(self.TagName, id)
  1867                 self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
  1963                 self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
  1868             self.RefreshPowerRailModel(powerrail)
  1964             self.RefreshPowerRailModel(powerrail)
  1869             self.RefreshBuffer()
  1965             self.RefreshBuffer()
  1870             self.RefreshScrollBars()
  1966             self.RefreshScrollBars()
       
  1967             self.RefreshVisibleElements()
  1871             powerrail.Refresh(rect)
  1968             powerrail.Refresh(rect)
  1872         dialog.Destroy()
  1969         dialog.Destroy()
  1873 
  1970 
  1874     def EditStepContent(self, step):
  1971     def EditStepContent(self, step):
  1875         dialog = StepContentDialog(self.ParentWindow, self.Controler, step.GetInitial())
  1972         dialog = StepContentDialog(self.ParentWindow, self.Controler, step.GetInitial())
  1876         dialog.SetPreviewFont(self.GetFont())
  1973         dialog.SetPreviewFont(self.GetFont())
  1877         dialog.SetPouNames(self.Controler.GetProjectPouNames())
  1974         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1878         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName))
  1975         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  1879         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
  1976         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
  1880         dialog.SetMinStepSize(step.GetSize())
  1977         dialog.SetMinStepSize(step.GetSize())
  1881         values = {"name" : step.GetName()}
  1978         values = {"name" : step.GetName()}
  1882         connectors = step.GetConnectors()
  1979         connectors = step.GetConnectors()
  1883         values["input"] = connectors["input"] != None
  1980         values["input"] = connectors["input"] != None
  1903             step.UpdateSize(*self.GetScaledSize(values["width"], values["height"]))
  2000             step.UpdateSize(*self.GetScaledSize(values["width"], values["height"]))
  1904             rect = rect.Union(step.GetRedrawRect())
  2001             rect = rect.Union(step.GetRedrawRect())
  1905             self.RefreshStepModel(step)
  2002             self.RefreshStepModel(step)
  1906             self.RefreshBuffer()
  2003             self.RefreshBuffer()
  1907             self.RefreshScrollBars()
  2004             self.RefreshScrollBars()
       
  2005             self.RefreshVisibleElements()
  1908             step.Refresh(rect)
  2006             step.Refresh(rect)
  1909         
  2007         
  1910     def EditTransitionContent(self, transition):
  2008     def EditTransitionContent(self, transition):
  1911         dialog = TransitionContentDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
  2009         dialog = TransitionContentDialog(self.ParentWindow, self.Controler, self.GetDrawingMode() == FREEDRAWING_MODE)
  1912         dialog.SetPreviewFont(self.GetFont())
  2010         dialog.SetPreviewFont(self.GetFont())
  1913         dialog.SetTransitions(self.Controler.GetEditedElementTransitions(self.TagName))
  2011         dialog.SetTransitions(self.Controler.GetEditedElementTransitions(self.TagName, self.Debug))
  1914         dialog.SetValues({"type":transition.GetType(),"value":transition.GetCondition(), "priority":transition.GetPriority()})
  2012         dialog.SetValues({"type":transition.GetType(),"value":transition.GetCondition(), "priority":transition.GetPriority()})
  1915         dialog.SetElementSize(transition.GetSize())
  2013         dialog.SetElementSize(transition.GetSize())
  1916         if dialog.ShowModal() == wx.ID_OK:
  2014         if dialog.ShowModal() == wx.ID_OK:
  1917             values = dialog.GetValues()
  2015             values = dialog.GetValues()
  1918             rect = transition.GetRedrawRect(1, 1)
  2016             rect = transition.GetRedrawRect(1, 1)
  1920             transition.SetPriority(values["priority"])
  2018             transition.SetPriority(values["priority"])
  1921             rect = rect.Union(transition.GetRedrawRect())
  2019             rect = rect.Union(transition.GetRedrawRect())
  1922             self.RefreshTransitionModel(transition)
  2020             self.RefreshTransitionModel(transition)
  1923             self.RefreshBuffer()
  2021             self.RefreshBuffer()
  1924             self.RefreshScrollBars()
  2022             self.RefreshScrollBars()
       
  2023             self.RefreshVisibleElements()
  1925             transition.Refresh(rect)
  2024             transition.Refresh(rect)
  1926         dialog.Destroy()
  2025         dialog.Destroy()
  1927 
  2026 
  1928     def EditJumpContent(self, jump):
  2027     def EditJumpContent(self, jump):
  1929         choices = []
  2028         choices = []
  1938             jump.SetTarget(value)
  2037             jump.SetTarget(value)
  1939             rect = rect.Union(jump.GetRedrawRect())
  2038             rect = rect.Union(jump.GetRedrawRect())
  1940             self.RefreshJumpModel(jump)
  2039             self.RefreshJumpModel(jump)
  1941             self.RefreshBuffer()
  2040             self.RefreshBuffer()
  1942             self.RefreshScrollBars()
  2041             self.RefreshScrollBars()
       
  2042             self.RefreshVisibleElements()
  1943             jump.Refresh(rect)
  2043             jump.Refresh(rect)
  1944         dialog.Destroy()
  2044         dialog.Destroy()
  1945 
  2045 
  1946     def EditActionBlockContent(self, actionblock):
  2046     def EditActionBlockContent(self, actionblock):
  1947         dialog = ActionBlockDialog(self.ParentWindow)
  2047         dialog = ActionBlockDialog(self.ParentWindow)
  1948         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
  2048         dialog.SetQualifierList(self.Controler.GetQualifierTypes())
  1949         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName))
  2049         dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
  1950         dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName))
  2050         dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  1951         dialog.SetValues(actionblock.GetActions())
  2051         dialog.SetValues(actionblock.GetActions())
  1952         if dialog.ShowModal() == wx.ID_OK:
  2052         if dialog.ShowModal() == wx.ID_OK:
  1953             actions = dialog.GetValues()
  2053             actions = dialog.GetValues()
  1954             rect = actionblock.GetRedrawRect(1, 1)
  2054             rect = actionblock.GetRedrawRect(1, 1)
  1955             actionblock.SetActions(actions)
  2055             actionblock.SetActions(actions)
  1956             actionblock.SetSize(*self.GetScaledSize(*actionblock.GetSize()))
  2056             actionblock.SetSize(*self.GetScaledSize(*actionblock.GetSize()))
  1957             rect = rect.Union(actionblock.GetRedrawRect())
  2057             rect = rect.Union(actionblock.GetRedrawRect())
  1958             self.RefreshActionBlockModel(actionblock)
  2058             self.RefreshActionBlockModel(actionblock)
  1959             self.RefreshBuffer()
  2059             self.RefreshBuffer()
  1960             self.RefreshScrollBars()
  2060             self.RefreshScrollBars()
       
  2061             self.RefreshVisibleElements()
  1961             actionblock.Refresh(rect)
  2062             actionblock.Refresh(rect)
  1962         dialog.Destroy()
  2063         dialog.Destroy()
  1963 
  2064 
  1964     def EditCommentContent(self, comment):
  2065     def EditCommentContent(self, comment):
  1965         if wx.VERSION >= (2, 5, 0):
  2066         if wx.VERSION >= (2, 5, 0):
  1973             comment.SetSize(*self.GetScaledSize(*comment.GetSize()))
  2074             comment.SetSize(*self.GetScaledSize(*comment.GetSize()))
  1974             rect = rect.Union(comment.GetRedrawRect())
  2075             rect = rect.Union(comment.GetRedrawRect())
  1975             self.RefreshCommentModel(comment)
  2076             self.RefreshCommentModel(comment)
  1976             self.RefreshBuffer()
  2077             self.RefreshBuffer()
  1977             self.RefreshScrollBars()
  2078             self.RefreshScrollBars()
       
  2079             self.RefreshVisibleElements()
  1978             comment.Refresh(rect)
  2080             comment.Refresh(rect)
  1979         dialog.Destroy()
  2081         dialog.Destroy()
  1980 
  2082 
  1981 #-------------------------------------------------------------------------------
  2083 #-------------------------------------------------------------------------------
  1982 #                          Model update functions
  2084 #                          Model update functions
  2240 #-------------------------------------------------------------------------------
  2342 #-------------------------------------------------------------------------------
  2241 #                            Editing functions
  2343 #                            Editing functions
  2242 #-------------------------------------------------------------------------------
  2344 #-------------------------------------------------------------------------------
  2243     
  2345     
  2244     def Cut(self):
  2346     def Cut(self):
  2245         if self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement):
  2347         if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement)):
  2246             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone(self))
  2348             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone(self))
  2247             rect = self.SelectedElement.GetRedrawRect(1, 1)
  2349             rect = self.SelectedElement.GetRedrawRect(1, 1)
  2248             self.SelectedElement.Delete()
  2350             self.SelectedElement.Delete()
  2249             self.SelectedElement = None
  2351             self.SelectedElement = None
  2250             self.RefreshBuffer()
  2352             self.RefreshBuffer()
  2252             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2354             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2253             self.ParentWindow.RefreshInstancesTree()
  2355             self.ParentWindow.RefreshInstancesTree()
  2254             self.RefreshRect(self.GetScrolledRect(rect), False)
  2356             self.RefreshRect(self.GetScrolledRect(rect), False)
  2255         
  2357         
  2256     def Copy(self):
  2358     def Copy(self):
  2257         if self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement):
  2359         if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement)):
  2258             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone(self))
  2360             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone(self))
  2259             
  2361             
  2260     def Paste(self):
  2362     def Paste(self):
  2261         element = self.ParentWindow.GetCopyBuffer()
  2363         element = self.ParentWindow.GetCopyBuffer()
  2262         if element is not None and self.CanAddBlock(element):
  2364         if not self.Debug and element is not None and self.CanAddBlock(element):
  2263             block = self.CopyBlock(element, wx.Point(*self.CalcUnscrolledPosition(30, 30)))
  2365             block = self.CopyBlock(element, wx.Point(*self.CalcUnscrolledPosition(30, 30)))
  2264             if self.SelectedElement is not None:
  2366             if self.SelectedElement is not None:
  2265                 self.SelectedElement.SetSelected(False)
  2367                 self.SelectedElement.SetSelected(False)
  2266             self.SelectedElement = block
  2368             self.SelectedElement = block
  2267             self.SelectedElement.SetSelected(True)
  2369             self.SelectedElement.SetSelected(True)
  2268             self.RefreshBuffer()
  2370             self.RefreshBuffer()
  2269             self.RefreshScrollBars()
  2371             self.RefreshScrollBars()
       
  2372             self.RefreshVisibleElements()
  2270             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2373             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2271             self.ParentWindow.RefreshInstancesTree()
  2374             self.ParentWindow.RefreshInstancesTree()
  2272 
  2375 
  2273     def CanAddBlock(self, block):
  2376     def CanAddBlock(self, block):
  2274         if self.CurrentLanguage == "SFC":
  2377         if self.CurrentLanguage == "SFC":
  2281 
  2384 
  2282     def CopyBlock(self, element, pos):
  2385     def CopyBlock(self, element, pos):
  2283         id = self.GetNewId()
  2386         id = self.GetNewId()
  2284         if isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step):
  2387         if isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step):
  2285             if isinstance(element, FBD_Block):
  2388             if isinstance(element, FBD_Block):
  2286                 names = [varname.upper() for varname in self.Controler.GetEditedElementVariables(self.TagName)]
  2389                 names = [varname.upper() for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]
  2287                 format = "Block%d"
  2390                 format = "Block%d"
  2288             elif isinstance(element, SFC_Step):
  2391             elif isinstance(element, SFC_Step):
  2289                 names = [block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]
  2392                 names = [block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]
  2290                 format = "Step%d"
  2393                 format = "Step%d"
  2291             i = 1
  2394             i = 1
  2358         
  2461         
  2359 #-------------------------------------------------------------------------------
  2462 #-------------------------------------------------------------------------------
  2360 #                            Drawing functions
  2463 #                            Drawing functions
  2361 #-------------------------------------------------------------------------------
  2464 #-------------------------------------------------------------------------------
  2362 
  2465 
       
  2466     def OnScrollWindow(self, event):
       
  2467         if event.GetOrientation() == wx.HORIZONTAL:
       
  2468             self.RefreshVisibleElements(xp = event.GetPosition())
       
  2469         else:
       
  2470             self.RefreshVisibleElements(yp = event.GetPosition())
       
  2471         event.Skip()
       
  2472 
  2363     def OnMoveWindow(self, event):
  2473     def OnMoveWindow(self, event):
  2364         self.GetBestSize()
  2474         self.GetBestSize()
  2365         self.RefreshScrollBars()
  2475         self.RefreshScrollBars()
       
  2476         self.RefreshVisibleElements()
  2366         event.Skip()
  2477         event.Skip()
  2367 
  2478 
  2368     def DoDrawing(self, dc, printing = False):
  2479     def DoDrawing(self, dc, printing = False):
  2369         if printing:
  2480         if printing:
  2370             if getattr(dc, "printing", False):
  2481             if getattr(dc, "printing", False):
  2396                 dc.DrawLine(xstart * SCROLLBAR_UNIT, ystart * SCROLLBAR_UNIT + y + 1, 
  2507                 dc.DrawLine(xstart * SCROLLBAR_UNIT, ystart * SCROLLBAR_UNIT + y + 1, 
  2397                             xstart * SCROLLBAR_UNIT + window_size[0], ystart * SCROLLBAR_UNIT + y + 1)
  2508                             xstart * SCROLLBAR_UNIT + window_size[0], ystart * SCROLLBAR_UNIT + y + 1)
  2398         
  2509         
  2399         # Draw all elements
  2510         # Draw all elements
  2400         for comment in self.Comments:
  2511         for comment in self.Comments:
  2401             if comment != self.SelectedElement:
  2512             if comment != self.SelectedElement and (comment.IsVisible() or printing):
  2402                 comment.Draw(dc)
  2513                 comment.Draw(dc)
  2403         for wire in self.Wires:
  2514         for wire in self.Wires:
  2404             if wire != self.SelectedElement:
  2515             if wire != self.SelectedElement and (wire.IsVisible() or printing):
  2405                 wire.Draw(dc)
  2516                  if not self.Debug or wire.GetValue() != True:
       
  2517                     wire.Draw(dc)
       
  2518         if self.Debug:
       
  2519             for wire in self.Wires:
       
  2520                 if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue() == True:
       
  2521                     wire.Draw(dc)
  2406         for block in self.Blocks:
  2522         for block in self.Blocks:
  2407             if block != self.SelectedElement:
  2523             if block != self.SelectedElement and (block.IsVisible() or printing):
  2408                 block.Draw(dc)
  2524                 block.Draw(dc)
  2409         
  2525         
  2410         if self.SelectedElement:
  2526         if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing):
  2411                 self.SelectedElement.Draw(dc)
  2527             self.SelectedElement.Draw(dc)
  2412         
  2528         
  2413         if not printing:
  2529         if not printing:
  2414             if self.rubberBand.IsShown():
  2530             if self.rubberBand.IsShown():
  2415                 self.rubberBand.Draw(dc)
  2531                 self.rubberBand.Draw(dc)
  2416             dc.EndDrawing()
  2532             dc.EndDrawing()