Viewer.py
changeset 138 9c74d00ce93e
parent 128 d16a8df4d322
child 140 06d28f03f6f4
equal deleted inserted replaced
137:fc7e0b8ed9d3 138:9c74d00ce93e
    41 
    41 
    42 #-------------------------------------------------------------------------------
    42 #-------------------------------------------------------------------------------
    43 #                       Graphic elements Viewer base class
    43 #                       Graphic elements Viewer base class
    44 #-------------------------------------------------------------------------------
    44 #-------------------------------------------------------------------------------
    45 
    45 
    46 # ID Constants for menu items
    46 # ID Constants for alignment menu items
    47 [ID_FBDVIEWERCONTEXTUALMENUITEMS0, ID_FBDVIEWERCONTEXTUALMENUITEMS1,
    47 [ID_VIEWERALIGNMENTMENUITEMS0, ID_VIEWERALIGNMENTMENUITEMS1,
    48  ID_FBDVIEWERCONTEXTUALMENUITEMS2, ID_FBDVIEWERCONTEXTUALMENUITEMS3,
    48  ID_VIEWERALIGNMENTMENUITEMS2, ID_VIEWERALIGNMENTMENUITEMS4,
    49  ID_FBDVIEWERCONTEXTUALMENUITEMS5, ID_FBDVIEWERCONTEXTUALMENUITEMS6,
    49  ID_VIEWERALIGNMENTMENUITEMS5, ID_VIEWERALIGNMENTMENUITEMS6,
    50  ID_FBDVIEWERCONTEXTUALMENUITEMS8, ID_FBDVIEWERCONTEXTUALMENUITEMS9,
    50 ] = [wx.NewId() for _init_coll_AlignmentMenu_Items in range(6)]
    51  ID_FBDVIEWERCONTEXTUALMENUITEMS11, ID_FBDVIEWERCONTEXTUALMENUITEMS12,
    51 
    52  ID_FBDVIEWERCONTEXTUALMENUITEMS14, ID_FBDVIEWERCONTEXTUALMENUITEMS15,
    52 # ID Constants for contextual menu items
    53 ] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(12)]
    53 [ID_VIEWERCONTEXTUALMENUITEMS0, ID_VIEWERCONTEXTUALMENUITEMS1,
       
    54  ID_VIEWERCONTEXTUALMENUITEMS2, ID_VIEWERCONTEXTUALMENUITEMS3,
       
    55  ID_VIEWERCONTEXTUALMENUITEMS5, ID_VIEWERCONTEXTUALMENUITEMS6,
       
    56  ID_VIEWERCONTEXTUALMENUITEMS8, ID_VIEWERCONTEXTUALMENUITEMS9,
       
    57  ID_VIEWERCONTEXTUALMENUITEMS11, ID_VIEWERCONTEXTUALMENUITEMS12,
       
    58  ID_VIEWERCONTEXTUALMENUITEMS14, ID_VIEWERCONTEXTUALMENUITEMS16,
       
    59  ID_VIEWERCONTEXTUALMENUITEMS17,
       
    60 ] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(13)]
    54 
    61 
    55 
    62 
    56 class ViewerDropTarget(wx.TextDropTarget):
    63 class ViewerDropTarget(wx.TextDropTarget):
    57     
    64     
    58     def __init__(self, parent):
    65     def __init__(self, parent):
   153             if id is not None:
   160             if id is not None:
   154                 event(self, id, function)
   161                 event(self, id, function)
   155             else:
   162             else:
   156                 event(self, function)
   163                 event(self, function)
   157     
   164     
       
   165     # Create Alignment Menu items
       
   166     def _init_coll_AlignmentMenu_Items(self, parent):
       
   167         # Create menu items
       
   168         AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS0,
       
   169               kind=wx.ITEM_NORMAL, text=u'Left')
       
   170         AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS1,
       
   171               kind=wx.ITEM_NORMAL, text=u'Center')
       
   172         AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS2,
       
   173               kind=wx.ITEM_NORMAL, text=u'Right')
       
   174         parent.AppendSeparator()
       
   175         AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS4,
       
   176               kind=wx.ITEM_NORMAL, text=u'Top')
       
   177         AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS5,
       
   178               kind=wx.ITEM_NORMAL, text=u'Middle')
       
   179         AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS6,
       
   180               kind=wx.ITEM_NORMAL, text=u'Bottom')
       
   181         # Link menu event to corresponding called functions
       
   182         self.Bind(wx.EVT_MENU, self.OnAlignLeftMenu,
       
   183               id=ID_VIEWERALIGNMENTMENUITEMS0)
       
   184         self.Bind(wx.EVT_MENU, self.OnAlignCenterMenu,
       
   185               id=ID_VIEWERALIGNMENTMENUITEMS1)
       
   186         self.Bind(wx.EVT_MENU, self.OnAlignRightMenu,
       
   187               id=ID_VIEWERALIGNMENTMENUITEMS2)
       
   188         self.Bind(wx.EVT_MENU, self.OnAlignTopMenu,
       
   189               id=ID_VIEWERALIGNMENTMENUITEMS4)
       
   190         self.Bind(wx.EVT_MENU, self.OnAlignMiddleMenu,
       
   191               id=ID_VIEWERALIGNMENTMENUITEMS5)
       
   192         self.Bind(wx.EVT_MENU, self.OnAlignBottomMenu,
       
   193               id=ID_VIEWERALIGNMENTMENUITEMS6)
       
   194     
   158     # Create Contextual Menu items
   195     # Create Contextual Menu items
   159     def _init_coll_ContextualMenu_Items(self, parent):
   196     def _init_coll_ContextualMenu_Items(self, parent):
   160         # Create menu items
   197         # Create menu items
   161         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS0,
   198         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS0,
   162               kind=wx.ITEM_RADIO, text=u'No Modifier')
   199               kind=wx.ITEM_RADIO, text=u'No Modifier')
   163         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS1,
   200         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS1,
   164               kind=wx.ITEM_RADIO, text=u'Negated')
   201               kind=wx.ITEM_RADIO, text=u'Negated')
   165         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS2,
   202         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS2,
   166               kind=wx.ITEM_RADIO, text=u'Rising Edge')
   203               kind=wx.ITEM_RADIO, text=u'Rising Edge')
   167         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS3,
   204         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS3,
   168               kind=wx.ITEM_RADIO, text=u'Falling Edge')
   205               kind=wx.ITEM_RADIO, text=u'Falling Edge')
   169         parent.AppendSeparator()
   206         parent.AppendSeparator()
   170         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS5,
   207         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS5,
   171               kind=wx.ITEM_NORMAL, text=u'Add Wire Segment')
   208               kind=wx.ITEM_NORMAL, text=u'Add Wire Segment')
   172         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS6,
   209         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS6,
   173               kind=wx.ITEM_NORMAL, text=u'Delete Wire Segment')
   210               kind=wx.ITEM_NORMAL, text=u'Delete Wire Segment')
   174         parent.AppendSeparator()
   211         parent.AppendSeparator()
   175         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS8,
   212         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS8,
   176               kind=wx.ITEM_NORMAL, text=u'Add Divergence Branch')
   213               kind=wx.ITEM_NORMAL, text=u'Add Divergence Branch')
   177         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS9,
   214         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS9,
   178               kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch')
   215               kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch')
   179         parent.AppendSeparator()
   216         parent.AppendSeparator()
   180         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11,
   217         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS11,
   181               kind=wx.ITEM_NORMAL, text=u'Clear Execution Order')
   218               kind=wx.ITEM_NORMAL, text=u'Clear Execution Order')
   182         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12,
   219         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS12,
   183               kind=wx.ITEM_NORMAL, text=u'Reset Execution Order')
   220               kind=wx.ITEM_NORMAL, text=u'Reset Execution Order')
   184         parent.AppendSeparator()
   221         parent.AppendSeparator()
   185         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS14,
   222         parent.AppendMenu(ID_VIEWERCONTEXTUALMENUITEMS14, "Alignment", self.AlignmentMenu)
       
   223         parent.AppendSeparator()
       
   224         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS16,
   186               kind=wx.ITEM_NORMAL, text=u'Edit Block')
   225               kind=wx.ITEM_NORMAL, text=u'Edit Block')
   187         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS15,
   226         AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS17,
   188               kind=wx.ITEM_NORMAL, text=u'Delete')
   227               kind=wx.ITEM_NORMAL, text=u'Delete')
   189         # Link menu event to corresponding called functions
   228         # Link menu event to corresponding called functions
   190         self.Bind(wx.EVT_MENU, self.OnNoModifierMenu,
   229         self.Bind(wx.EVT_MENU, self.OnNoModifierMenu,
   191               id=ID_FBDVIEWERCONTEXTUALMENUITEMS0)
   230               id=ID_VIEWERCONTEXTUALMENUITEMS0)
   192         self.Bind(wx.EVT_MENU, self.OnNegatedMenu,
   231         self.Bind(wx.EVT_MENU, self.OnNegatedMenu,
   193               id=ID_FBDVIEWERCONTEXTUALMENUITEMS1)
   232               id=ID_VIEWERCONTEXTUALMENUITEMS1)
   194         self.Bind(wx.EVT_MENU, self.OnRisingEdgeMenu,
   233         self.Bind(wx.EVT_MENU, self.OnRisingEdgeMenu,
   195               id=ID_FBDVIEWERCONTEXTUALMENUITEMS2)
   234               id=ID_VIEWERCONTEXTUALMENUITEMS2)
   196         self.Bind(wx.EVT_MENU, self.OnFallingEdgeMenu,
   235         self.Bind(wx.EVT_MENU, self.OnFallingEdgeMenu,
   197               id=ID_FBDVIEWERCONTEXTUALMENUITEMS3)
   236               id=ID_VIEWERCONTEXTUALMENUITEMS3)
   198         self.Bind(wx.EVT_MENU, self.OnAddSegmentMenu,
   237         self.Bind(wx.EVT_MENU, self.OnAddSegmentMenu,
   199               id=ID_FBDVIEWERCONTEXTUALMENUITEMS5)
   238               id=ID_VIEWERCONTEXTUALMENUITEMS5)
   200         self.Bind(wx.EVT_MENU, self.OnDeleteSegmentMenu,
   239         self.Bind(wx.EVT_MENU, self.OnDeleteSegmentMenu,
   201               id=ID_FBDVIEWERCONTEXTUALMENUITEMS6)
   240               id=ID_VIEWERCONTEXTUALMENUITEMS6)
   202         self.Bind(wx.EVT_MENU, self.OnAddBranchMenu,
   241         self.Bind(wx.EVT_MENU, self.OnAddBranchMenu,
   203               id=ID_FBDVIEWERCONTEXTUALMENUITEMS8)
   242               id=ID_VIEWERCONTEXTUALMENUITEMS8)
   204         self.Bind(wx.EVT_MENU, self.OnDeleteBranchMenu,
   243         self.Bind(wx.EVT_MENU, self.OnDeleteBranchMenu,
   205               id=ID_FBDVIEWERCONTEXTUALMENUITEMS9)
   244               id=ID_VIEWERCONTEXTUALMENUITEMS9)
   206         self.Bind(wx.EVT_MENU, self.OnClearExecutionOrderMenu,
   245         self.Bind(wx.EVT_MENU, self.OnClearExecutionOrderMenu,
   207               id=ID_FBDVIEWERCONTEXTUALMENUITEMS11)
   246               id=ID_VIEWERCONTEXTUALMENUITEMS11)
   208         self.Bind(wx.EVT_MENU, self.OnResetExecutionOrderMenu,
   247         self.Bind(wx.EVT_MENU, self.OnResetExecutionOrderMenu,
   209               id=ID_FBDVIEWERCONTEXTUALMENUITEMS12)
   248               id=ID_VIEWERCONTEXTUALMENUITEMS12)
   210         self.Bind(wx.EVT_MENU, self.OnEditBlockMenu,
   249         self.Bind(wx.EVT_MENU, self.OnEditBlockMenu,
   211               id=ID_FBDVIEWERCONTEXTUALMENUITEMS14)
   250               id=ID_VIEWERCONTEXTUALMENUITEMS16)
   212         self.Bind(wx.EVT_MENU, self.OnDeleteMenu,
   251         self.Bind(wx.EVT_MENU, self.OnDeleteMenu,
   213               id=ID_FBDVIEWERCONTEXTUALMENUITEMS15)
   252               id=ID_VIEWERCONTEXTUALMENUITEMS17)
   214     
   253     
   215     # Create and initialize Contextual Menu
   254     # Create and initialize Contextual Menu
   216     def _init_menus(self):
   255     def _init_menus(self):
       
   256         self.AlignmentMenu = wx.Menu(title='')
   217         self.ContextualMenu = wx.Menu(title='')
   257         self.ContextualMenu = wx.Menu(title='')
   218         
   258         
       
   259         self._init_coll_AlignmentMenu_Items(self.AlignmentMenu)
   219         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   260         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   220     
   261     
   221     # Create a new Viewer
   262     # Create a new Viewer
   222     def __init__(self, parent, tagname, window, controler):
   263     def __init__(self, parent, tagname, window, controler):
   223         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
   264         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
   228         self.SetBackgroundColour(wx.Colour(255,255,255))
   269         self.SetBackgroundColour(wx.Colour(255,255,255))
   229         self.ResetView()
   270         self.ResetView()
   230         self.Scaling = None
   271         self.Scaling = None
   231         #self.Scaling = (8, 8)
   272         #self.Scaling = (8, 8)
   232         self.DrawGrid = True
   273         self.DrawGrid = True
       
   274         self.DrawingWire = False
   233         self.current_id = 0
   275         self.current_id = 0
   234         self.TagName = tagname
   276         self.TagName = tagname
   235         
   277         
   236         # Initialize Block, Wire and Comment numbers
   278         # Initialize Block, Wire and Comment numbers
   237         self.block_id = self.wire_id = self.comment_id = 0
   279         self.block_id = self.wire_id = self.comment_id = 0
   739 #-------------------------------------------------------------------------------
   781 #-------------------------------------------------------------------------------
   740 
   782 
   741     def PopupBlockMenu(self, connector = None):
   783     def PopupBlockMenu(self, connector = None):
   742         if connector is not None and connector.IsCompatible("BOOL"):
   784         if connector is not None and connector.IsCompatible("BOOL"):
   743             type = self.Controler.GetEditedElementType(self.TagName)
   785             type = self.Controler.GetEditedElementType(self.TagName)
   744             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True)
   786             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, True)
   745             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True)
   787             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, True)
   746             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, type != "function")
   788             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, type != "function")
   747             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, type != "function")
   789             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, type != "function")
   748         else:
   790         else:
   749             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
   791             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
   750             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
   792             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
   751             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
   793             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
   752             self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
   794             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
   753         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
   795         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
   754         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
   796         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
   755         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
   797         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
   756         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
   798         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
   757         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames())
   799         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
   758         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
   800         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames())
       
   801         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
   759         if connector:
   802         if connector:
   760             if connector.IsNegated():
   803             if connector.IsNegated():
   761                 self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True)
   804                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS1, True)
   762             elif connector.GetEdge() == "rising":
   805             elif connector.GetEdge() == "rising":
   763                 self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS2, True)
   806                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS2, True)
   764             elif connector.GetEdge() == "falling":
   807             elif connector.GetEdge() == "falling":
   765                 self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS3, True)
   808                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS3, True)
   766             else:
   809             else:
   767                 self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True)
   810                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS0, True)
   768         self.PopupMenu(self.ContextualMenu)
   811         self.PopupMenu(self.ContextualMenu)
   769     
   812     
   770     def PopupWireMenu(self):
   813     def PopupWireMenu(self):
   771         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
   814         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
   772         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
   815         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
   773         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
   816         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
   774         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
   817         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
   775         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, True)
   818         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, True)
   776         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, True)
   819         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, True)
   777         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
   820         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
   778         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
   821         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
   779         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
   822         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
   780         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
   823         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
       
   824         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
   781         self.PopupMenu(self.ContextualMenu)
   825         self.PopupMenu(self.ContextualMenu)
   782     
   826     
   783     def PopupDivergenceMenu(self, connector):
   827     def PopupDivergenceMenu(self, connector):
   784         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
   828         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
   785         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
   829         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
   786         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
   830         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
   787         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
   831         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
   788         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
   832         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
   789         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
   833         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
   790         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, True)
   834         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, True)
   791         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, connector)
   835         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, connector)
   792         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
   836         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
   793         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
   837         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
       
   838         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
   794         self.PopupMenu(self.ContextualMenu)
   839         self.PopupMenu(self.ContextualMenu)
   795     
   840     
       
   841     def PopupGroupMenu(self):
       
   842         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
       
   843         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
       
   844         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
       
   845         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
       
   846         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
       
   847         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
       
   848         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
       
   849         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
       
   850         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, True)
       
   851         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
       
   852         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
       
   853         self.PopupMenu(self.ContextualMenu)
       
   854     
   796     def PopupDefaultMenu(self, block = True):
   855     def PopupDefaultMenu(self, block = True):
   797         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
   856         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
   798         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
   857         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
   799         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
   858         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
   800         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
   859         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
   801         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
   860         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
   802         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
   861         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
   803         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
   862         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
   804         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
   863         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
   805         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
   864         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
   806         self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, block)
   865         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
       
   866         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, block)
   807         self.PopupMenu(self.ContextualMenu)
   867         self.PopupMenu(self.ContextualMenu)
   808 
   868 
   809 #-------------------------------------------------------------------------------
   869 #-------------------------------------------------------------------------------
   810 #                            Menu items functions
   870 #                            Menu items functions
   811 #-------------------------------------------------------------------------------
   871 #-------------------------------------------------------------------------------
   812 
   872 
       
   873     def OnAlignLeftMenu(self, event):
       
   874         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
       
   875             self.SelectedElement.AlignElements(ALIGN_LEFT, None)
       
   876             self.RefreshBuffer()
       
   877         event.Skip()
       
   878     
       
   879     def OnAlignCenterMenu(self, event):
       
   880         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
       
   881             self.SelectedElement.AlignElements(ALIGN_CENTER, None)
       
   882             self.RefreshBuffer()
       
   883         event.Skip()
       
   884     
       
   885     def OnAlignRightMenu(self, event):
       
   886         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
       
   887             self.SelectedElement.AlignElements(ALIGN_RIGHT, None)
       
   888             self.RefreshBuffer()
       
   889         event.Skip()
       
   890     
       
   891     def OnAlignTopMenu(self, event):
       
   892         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
       
   893             self.SelectedElement.AlignElements(None, ALIGN_TOP)
       
   894             self.RefreshBuffer()
       
   895         event.Skip()
       
   896     
       
   897     def OnAlignMiddleMenu(self, event):
       
   898         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
       
   899             self.SelectedElement.AlignElements(None, ALIGN_MIDDLE)
       
   900             self.RefreshBuffer()
       
   901         event.Skip()
       
   902     
       
   903     def OnAlignBottomMenu(self, event):
       
   904         if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
       
   905             self.SelectedElement.AlignElements(None, ALIGN_BOTTOM)
       
   906             self.RefreshBuffer()
       
   907         event.Skip()
       
   908         
   813     def OnNoModifierMenu(self, event):
   909     def OnNoModifierMenu(self, event):
   814         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   910         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   815             self.SelectedElement.SetConnectorNegated(False)
   911             self.SelectedElement.SetConnectorNegated(False)
   816             self.RefreshBuffer()
   912             self.RefreshBuffer()
   817         event.Skip()
   913         event.Skip()
   856             self.RefreshBuffer()
   952             self.RefreshBuffer()
   857         event.Skip()
   953         event.Skip()
   858 
   954 
   859     def OnEditBlockMenu(self, event):
   955     def OnEditBlockMenu(self, event):
   860         if self.SelectedElement:
   956         if self.SelectedElement:
   861             self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
   957             self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType())
   862         event.Skip()
   958         event.Skip()
   863 
   959 
   864     def OnDeleteMenu(self, event):
   960     def OnDeleteMenu(self, event):
   865         if self.SelectedElement:
   961         if self.SelectedElement:
   866             self.SelectedElement.Delete()
   962             self.SelectedElement.Delete()
   903                     elif len(elements) == 1:
   999                     elif len(elements) == 1:
   904                         self.SelectedElement = elements[0]
  1000                         self.SelectedElement = elements[0]
   905                     self.SelectedElement.SetSelected(True)
  1001                     self.SelectedElement.SetSelected(True)
   906             else:
  1002             else:
   907                 element = self.FindElement(pos)
  1003                 element = self.FindElement(pos)
   908                 if self.SelectedElement and self.SelectedElement != element:
  1004                 connector = self.FindBlockConnector(pos)
   909                     self.SelectedElement.SetSelected(False)
  1005                 if self.DrawingWire:
   910                     self.SelectedElement = None
  1006                     self.DrawingWire = False
       
  1007                     if connector:
       
  1008                         event.Dragging = lambda : True
       
  1009                         self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
       
  1010                     if self.SelectedElement.EndConnected is not None:
       
  1011                         self.SelectedElement.ResetPoints()
       
  1012                         self.SelectedElement.GeneratePoints()
       
  1013                         self.SelectedElement.RefreshModel()
       
  1014                         self.SelectedElement.SetSelected(True)
       
  1015                         element = self.SelectedElement
       
  1016                         self.RefreshBuffer()
       
  1017                     else:
       
  1018                         self.SelectedElement.Delete()
       
  1019                         element = None
   911                     self.Refresh(False)
  1020                     self.Refresh(False)
   912                 if element:
  1021                 elif connector:
   913                     self.SelectedElement = element
  1022                     self.DrawingWire = True
   914                     self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
  1023                     pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)
   915                     self.Refresh(False)
  1024                     if (connector.GetDirection() == EAST):
       
  1025                         wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(pos.x, pos.y), WEST])
       
  1026                     else:
       
  1027                         wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST])
       
  1028                     wire.oldPos = pos
       
  1029                     wire.Handle = (HANDLE_POINT, 0)
       
  1030                     wire.ProcessDragging(0, 0)
       
  1031                     wire.Handle = (HANDLE_POINT, 1)
       
  1032                     self.AddWire(wire)
       
  1033                     if self.SelectedElement:
       
  1034                         self.SelectedElement.SetSelected(False)
       
  1035                     self.SelectedElement = wire
   916                 else:
  1036                 else:
   917                     self.rubberBand.Reset()
  1037                     if self.SelectedElement and self.SelectedElement != element:
   918                     self.rubberBand.OnLeftDown(event, dc, self.Scaling)
  1038                         self.SelectedElement.SetSelected(False)
       
  1039                         self.SelectedElement = None
       
  1040                         self.Refresh(False)
       
  1041                     if element:
       
  1042                         self.SelectedElement = element
       
  1043                         self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
       
  1044                         self.Refresh(False)
       
  1045                     else:
       
  1046                         self.rubberBand.Reset()
       
  1047                         self.rubberBand.OnLeftDown(event, dc, self.Scaling)
   919         elif self.Mode in [MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, 
  1048         elif self.Mode in [MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, 
   920                            MODE_CONTACT, MODE_COIL, MODE_POWERRAIL, MODE_INITIALSTEP, 
  1049                            MODE_CONTACT, MODE_COIL, MODE_POWERRAIL, MODE_INITIALSTEP, 
   921                            MODE_STEP, MODE_TRANSITION, MODE_DIVERGENCE, MODE_JUMP, MODE_ACTION]:
  1050                            MODE_STEP, MODE_TRANSITION, MODE_DIVERGENCE, MODE_JUMP, MODE_ACTION]:
   922             self.rubberBand.Reset()
  1051             self.rubberBand.Reset()
   923             self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling)
  1052             self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling)
   924         elif self.Mode == MODE_WIRE:
       
   925             pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)
       
   926             connector = self.FindBlockConnector(pos)
       
   927             if connector:
       
   928                 if (connector.GetDirection() == EAST):
       
   929                     wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(pos.x, pos.y), WEST])
       
   930                 else:
       
   931                     wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST])
       
   932                 wire.oldPos = pos
       
   933                 wire.Handle = (HANDLE_POINT, 0)
       
   934                 wire.ProcessDragging(0, 0)
       
   935                 wire.Handle = (HANDLE_POINT, 1)
       
   936                 self.AddWire(wire)
       
   937                 if self.SelectedElement:
       
   938                     self.SelectedElement.SetSelected(False)
       
   939                 self.SelectedElement = wire
       
   940             elif self.SelectedElement:
       
   941                 self.SelectedElement.SetSelected(False)
       
   942                 self.SelectedElement = None
       
   943             self.Refresh(False)
       
   944         event.Skip()
  1053         event.Skip()
   945 
  1054 
   946     def OnViewerLeftUp(self, event):
  1055     def OnViewerLeftUp(self, event):
   947         if self.rubberBand.IsShown():
  1056         if self.rubberBand.IsShown():
   948             if self.Mode == MODE_SELECTION:
  1057             if self.Mode == MODE_SELECTION:
   985                 elif self.Mode == MODE_JUMP:
  1094                 elif self.Mode == MODE_JUMP:
   986                     wx.CallAfter(self.AddNewJump, bbox)
  1095                     wx.CallAfter(self.AddNewJump, bbox)
   987                 elif self.Mode == MODE_ACTION:
  1096                 elif self.Mode == MODE_ACTION:
   988                     wx.CallAfter(self.AddNewActionBlock, bbox)
  1097                     wx.CallAfter(self.AddNewActionBlock, bbox)
   989         elif self.Mode == MODE_SELECTION and self.SelectedElement:
  1098         elif self.Mode == MODE_SELECTION and self.SelectedElement:
   990             self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
  1099             dc = self.GetLogicalDC()
   991             wx.CallAfter(self.SetCursor, wx.NullCursor)
  1100             if self.DrawingWire:
   992             self.Refresh(False)
  1101                 pos = event.GetLogicalPosition(dc)
   993         elif self.Mode == MODE_WIRE and self.SelectedElement:
  1102                 connector = self.FindBlockConnector(pos)
   994             if self.SelectedElement.EndConnected != None:
  1103                 if self.SelectedElement.EndConnected is not None:
   995                 self.SelectedElement.ResetPoints()
  1104                     self.DrawingWire = False
   996                 self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
  1105                     self.SelectedElement.ResetPoints()
   997                 self.SelectedElement.GeneratePoints()
  1106                     self.SelectedElement.OnMotion(event, dc, self.Scaling)
   998                 self.SelectedElement.RefreshModel()
  1107                     self.SelectedElement.GeneratePoints()
   999                 self.SelectedElement.SetSelected(True)
  1108                     self.SelectedElement.RefreshModel()
  1000                 self.RefreshBuffer()
  1109                     self.SelectedElement.SetSelected(True)
  1001             else:
  1110                     self.RefreshBuffer()
  1002                 self.SelectedElement.Delete()
  1111                 elif connector is None:
  1003                 self.SelectedElement = None
  1112                     self.DrawingWire = False
  1004             self.Refresh(False)
  1113                     self.SelectedElement.Delete()
       
  1114                     self.SelectedElement = None
       
  1115                 self.Refresh(False)
       
  1116             else:
       
  1117                 self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
       
  1118                 wx.CallAfter(self.SetCursor, wx.NullCursor)
       
  1119                 self.Refresh(False)
  1005         if self.Mode != MODE_SELECTION and not self.SavedMode:
  1120         if self.Mode != MODE_SELECTION and not self.SavedMode:
  1006             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
  1121             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
  1007         event.Skip()
  1122         event.Skip()
  1008     
  1123     
  1009     def OnViewerRightUp(self, event):
  1124     def OnViewerRightUp(self, event):
  1033     
  1148     
  1034     def OnViewerMotion(self, event):
  1149     def OnViewerMotion(self, event):
  1035         if self.rubberBand.IsShown():
  1150         if self.rubberBand.IsShown():
  1036             self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling)
  1151             self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling)
  1037         elif self.Mode == MODE_SELECTION and self.SelectedElement:
  1152         elif self.Mode == MODE_SELECTION and self.SelectedElement:
  1038             if self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling):
  1153             if self.DrawingWire:
  1039                 self.Refresh(False)
  1154                 dc = self.GetLogicalDC()
  1040         elif self.Mode == MODE_WIRE and self.SelectedElement:
  1155                 pos = GetScaledEventPosition(event, dc, self.Scaling)
  1041             dc = self.GetLogicalDC()
  1156                 connector = self.FindBlockConnector(pos, False)
  1042             pos = GetScaledEventPosition(event, dc, self.Scaling)
  1157                 if not connector or self.SelectedElement.EndConnected == None:
  1043             connector = self.FindBlockConnector(pos, False)
  1158                     self.SelectedElement.ResetPoints()
  1044             if not connector or self.SelectedElement.EndConnected == None:
  1159                     self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1045                 self.SelectedElement.ResetPoints()
  1160                     self.SelectedElement.GeneratePoints()
  1046                 self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1161                     self.Refresh(False)
  1047                 self.SelectedElement.GeneratePoints()
  1162             elif self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling):
  1048                 self.Refresh(False)
  1163                 self.Refresh(False)
  1049         self.UpdateScrollPos(event)
  1164         self.UpdateScrollPos(event)
  1050         event.Skip()
  1165         event.Skip()
  1051 
  1166 
  1052     def UpdateScrollPos(self, event):
  1167     def UpdateScrollPos(self, event):
  1084             self.SelectedElement.Clean()
  1199             self.SelectedElement.Clean()
  1085             self.SelectedElement.Delete()
  1200             self.SelectedElement.Delete()
  1086             self.SelectedElement = None
  1201             self.SelectedElement = None
  1087             self.RefreshBuffer()
  1202             self.RefreshBuffer()
  1088             self.RefreshScrollBars()
  1203             self.RefreshScrollBars()
  1089             self.Refresh(False)
  1204             self.SetCursor(wx.NullCursor)
       
  1205             self.Refresh(False)
       
  1206         elif keycode == wx.WXK_RETURN and self.SelectedElement:
       
  1207             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1090         elif keycode == wx.WXK_LEFT:
  1208         elif keycode == wx.WXK_LEFT:
  1091             if event.ControlDown() and event.ShiftDown():
  1209             if event.ControlDown() and event.ShiftDown():
  1092                 self.Scroll(0, ypos)
  1210                 self.Scroll(0, ypos)
  1093             elif event.ControlDown():
  1211             elif event.ControlDown():
  1094                 event.Skip()
  1212                 event.Skip()