Viewer.py
changeset 138 9c74d00ce93e
parent 128 d16a8df4d322
child 140 06d28f03f6f4
--- a/Viewer.py	Mon Dec 10 15:52:49 2007 +0100
+++ b/Viewer.py	Wed Dec 26 16:38:09 2007 +0100
@@ -43,14 +43,21 @@
 #                       Graphic elements Viewer base class
 #-------------------------------------------------------------------------------
 
-# ID Constants for menu items
-[ID_FBDVIEWERCONTEXTUALMENUITEMS0, ID_FBDVIEWERCONTEXTUALMENUITEMS1,
- ID_FBDVIEWERCONTEXTUALMENUITEMS2, ID_FBDVIEWERCONTEXTUALMENUITEMS3,
- ID_FBDVIEWERCONTEXTUALMENUITEMS5, ID_FBDVIEWERCONTEXTUALMENUITEMS6,
- ID_FBDVIEWERCONTEXTUALMENUITEMS8, ID_FBDVIEWERCONTEXTUALMENUITEMS9,
- ID_FBDVIEWERCONTEXTUALMENUITEMS11, ID_FBDVIEWERCONTEXTUALMENUITEMS12,
- ID_FBDVIEWERCONTEXTUALMENUITEMS14, ID_FBDVIEWERCONTEXTUALMENUITEMS15,
-] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(12)]
+# ID Constants for alignment menu items
+[ID_VIEWERALIGNMENTMENUITEMS0, ID_VIEWERALIGNMENTMENUITEMS1,
+ ID_VIEWERALIGNMENTMENUITEMS2, ID_VIEWERALIGNMENTMENUITEMS4,
+ ID_VIEWERALIGNMENTMENUITEMS5, ID_VIEWERALIGNMENTMENUITEMS6,
+] = [wx.NewId() for _init_coll_AlignmentMenu_Items in range(6)]
+
+# ID Constants for contextual menu items
+[ID_VIEWERCONTEXTUALMENUITEMS0, ID_VIEWERCONTEXTUALMENUITEMS1,
+ ID_VIEWERCONTEXTUALMENUITEMS2, ID_VIEWERCONTEXTUALMENUITEMS3,
+ ID_VIEWERCONTEXTUALMENUITEMS5, ID_VIEWERCONTEXTUALMENUITEMS6,
+ ID_VIEWERCONTEXTUALMENUITEMS8, ID_VIEWERCONTEXTUALMENUITEMS9,
+ ID_VIEWERCONTEXTUALMENUITEMS11, ID_VIEWERCONTEXTUALMENUITEMS12,
+ ID_VIEWERCONTEXTUALMENUITEMS14, ID_VIEWERCONTEXTUALMENUITEMS16,
+ ID_VIEWERCONTEXTUALMENUITEMS17,
+] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(13)]
 
 
 class ViewerDropTarget(wx.TextDropTarget):
@@ -155,67 +162,101 @@
             else:
                 event(self, function)
     
+    # Create Alignment Menu items
+    def _init_coll_AlignmentMenu_Items(self, parent):
+        # Create menu items
+        AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS0,
+              kind=wx.ITEM_NORMAL, text=u'Left')
+        AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS1,
+              kind=wx.ITEM_NORMAL, text=u'Center')
+        AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS2,
+              kind=wx.ITEM_NORMAL, text=u'Right')
+        parent.AppendSeparator()
+        AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS4,
+              kind=wx.ITEM_NORMAL, text=u'Top')
+        AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS5,
+              kind=wx.ITEM_NORMAL, text=u'Middle')
+        AppendMenu(parent, help='', id=ID_VIEWERALIGNMENTMENUITEMS6,
+              kind=wx.ITEM_NORMAL, text=u'Bottom')
+        # Link menu event to corresponding called functions
+        self.Bind(wx.EVT_MENU, self.OnAlignLeftMenu,
+              id=ID_VIEWERALIGNMENTMENUITEMS0)
+        self.Bind(wx.EVT_MENU, self.OnAlignCenterMenu,
+              id=ID_VIEWERALIGNMENTMENUITEMS1)
+        self.Bind(wx.EVT_MENU, self.OnAlignRightMenu,
+              id=ID_VIEWERALIGNMENTMENUITEMS2)
+        self.Bind(wx.EVT_MENU, self.OnAlignTopMenu,
+              id=ID_VIEWERALIGNMENTMENUITEMS4)
+        self.Bind(wx.EVT_MENU, self.OnAlignMiddleMenu,
+              id=ID_VIEWERALIGNMENTMENUITEMS5)
+        self.Bind(wx.EVT_MENU, self.OnAlignBottomMenu,
+              id=ID_VIEWERALIGNMENTMENUITEMS6)
+    
     # Create Contextual Menu items
     def _init_coll_ContextualMenu_Items(self, parent):
         # Create menu items
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS0,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS0,
               kind=wx.ITEM_RADIO, text=u'No Modifier')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS1,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS1,
               kind=wx.ITEM_RADIO, text=u'Negated')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS2,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS2,
               kind=wx.ITEM_RADIO, text=u'Rising Edge')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS3,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS3,
               kind=wx.ITEM_RADIO, text=u'Falling Edge')
         parent.AppendSeparator()
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS5,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS5,
               kind=wx.ITEM_NORMAL, text=u'Add Wire Segment')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS6,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS6,
               kind=wx.ITEM_NORMAL, text=u'Delete Wire Segment')
         parent.AppendSeparator()
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS8,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS8,
               kind=wx.ITEM_NORMAL, text=u'Add Divergence Branch')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS9,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS9,
               kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch')
         parent.AppendSeparator()
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS11,
               kind=wx.ITEM_NORMAL, text=u'Clear Execution Order')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS12,
               kind=wx.ITEM_NORMAL, text=u'Reset Execution Order')
         parent.AppendSeparator()
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS14,
+        parent.AppendMenu(ID_VIEWERCONTEXTUALMENUITEMS14, "Alignment", self.AlignmentMenu)
+        parent.AppendSeparator()
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS16,
               kind=wx.ITEM_NORMAL, text=u'Edit Block')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS15,
+        AppendMenu(parent, help='', id=ID_VIEWERCONTEXTUALMENUITEMS17,
               kind=wx.ITEM_NORMAL, text=u'Delete')
         # Link menu event to corresponding called functions
         self.Bind(wx.EVT_MENU, self.OnNoModifierMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS0)
+              id=ID_VIEWERCONTEXTUALMENUITEMS0)
         self.Bind(wx.EVT_MENU, self.OnNegatedMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS1)
+              id=ID_VIEWERCONTEXTUALMENUITEMS1)
         self.Bind(wx.EVT_MENU, self.OnRisingEdgeMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS2)
+              id=ID_VIEWERCONTEXTUALMENUITEMS2)
         self.Bind(wx.EVT_MENU, self.OnFallingEdgeMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS3)
+              id=ID_VIEWERCONTEXTUALMENUITEMS3)
         self.Bind(wx.EVT_MENU, self.OnAddSegmentMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS5)
+              id=ID_VIEWERCONTEXTUALMENUITEMS5)
         self.Bind(wx.EVT_MENU, self.OnDeleteSegmentMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS6)
+              id=ID_VIEWERCONTEXTUALMENUITEMS6)
         self.Bind(wx.EVT_MENU, self.OnAddBranchMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS8)
+              id=ID_VIEWERCONTEXTUALMENUITEMS8)
         self.Bind(wx.EVT_MENU, self.OnDeleteBranchMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS9)
+              id=ID_VIEWERCONTEXTUALMENUITEMS9)
         self.Bind(wx.EVT_MENU, self.OnClearExecutionOrderMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS11)
+              id=ID_VIEWERCONTEXTUALMENUITEMS11)
         self.Bind(wx.EVT_MENU, self.OnResetExecutionOrderMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS12)
+              id=ID_VIEWERCONTEXTUALMENUITEMS12)
         self.Bind(wx.EVT_MENU, self.OnEditBlockMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS14)
+              id=ID_VIEWERCONTEXTUALMENUITEMS16)
         self.Bind(wx.EVT_MENU, self.OnDeleteMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS15)
+              id=ID_VIEWERCONTEXTUALMENUITEMS17)
     
     # Create and initialize Contextual Menu
     def _init_menus(self):
+        self.AlignmentMenu = wx.Menu(title='')
         self.ContextualMenu = wx.Menu(title='')
         
+        self._init_coll_AlignmentMenu_Items(self.AlignmentMenu)
         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
     
     # Create a new Viewer
@@ -230,6 +271,7 @@
         self.Scaling = None
         #self.Scaling = (8, 8)
         self.DrawGrid = True
+        self.DrawingWire = False
         self.current_id = 0
         self.TagName = tagname
         
@@ -741,75 +783,129 @@
     def PopupBlockMenu(self, connector = None):
         if connector is not None and connector.IsCompatible("BOOL"):
             type = self.Controler.GetEditedElementType(self.TagName)
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True)
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True)
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, type != "function")
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, type != "function")
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, True)
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, True)
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, type != "function")
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, type != "function")
         else:
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
-            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames())
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
+            self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames())
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
         if connector:
             if connector.IsNegated():
-                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True)
+                self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS1, True)
             elif connector.GetEdge() == "rising":
-                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS2, True)
+                self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS2, True)
             elif connector.GetEdge() == "falling":
-                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS3, True)
-            else:
-                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True)
+                self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS3, True)
+            else:
+                self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS0, True)
         self.PopupMenu(self.ContextualMenu)
     
     def PopupWireMenu(self):
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, True)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, True)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, True)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, True)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
         self.PopupMenu(self.ContextualMenu)
     
     def PopupDivergenceMenu(self, connector):
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, True)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, connector)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, True)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, connector)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
         self.PopupMenu(self.ContextualMenu)
     
+    def PopupGroupMenu(self):
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, True)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
+        self.PopupMenu(self.ContextualMenu)
+    
     def PopupDefaultMenu(self, block = True):
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
-        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, block)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS5, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS6, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
+        self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, block)
         self.PopupMenu(self.ContextualMenu)
 
 #-------------------------------------------------------------------------------
 #                            Menu items functions
 #-------------------------------------------------------------------------------
 
+    def OnAlignLeftMenu(self, event):
+        if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
+            self.SelectedElement.AlignElements(ALIGN_LEFT, None)
+            self.RefreshBuffer()
+        event.Skip()
+    
+    def OnAlignCenterMenu(self, event):
+        if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
+            self.SelectedElement.AlignElements(ALIGN_CENTER, None)
+            self.RefreshBuffer()
+        event.Skip()
+    
+    def OnAlignRightMenu(self, event):
+        if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
+            self.SelectedElement.AlignElements(ALIGN_RIGHT, None)
+            self.RefreshBuffer()
+        event.Skip()
+    
+    def OnAlignTopMenu(self, event):
+        if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
+            self.SelectedElement.AlignElements(None, ALIGN_TOP)
+            self.RefreshBuffer()
+        event.Skip()
+    
+    def OnAlignMiddleMenu(self, event):
+        if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
+            self.SelectedElement.AlignElements(None, ALIGN_MIDDLE)
+            self.RefreshBuffer()
+        event.Skip()
+    
+    def OnAlignBottomMenu(self, event):
+        if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
+            self.SelectedElement.AlignElements(None, ALIGN_BOTTOM)
+            self.RefreshBuffer()
+        event.Skip()
+        
     def OnNoModifierMenu(self, event):
         if self.SelectedElement and self.IsBlock(self.SelectedElement):
             self.SelectedElement.SetConnectorNegated(False)
@@ -858,7 +954,7 @@
 
     def OnEditBlockMenu(self, event):
         if self.SelectedElement:
-            self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
+            self.ParentWindow.EditProjectElement(ITEM_POU, "P::%s"%self.SelectedElement.GetType())
         event.Skip()
 
     def OnDeleteMenu(self, event):
@@ -905,42 +1001,55 @@
                     self.SelectedElement.SetSelected(True)
             else:
                 element = self.FindElement(pos)
-                if self.SelectedElement and self.SelectedElement != element:
-                    self.SelectedElement.SetSelected(False)
-                    self.SelectedElement = None
+                connector = self.FindBlockConnector(pos)
+                if self.DrawingWire:
+                    self.DrawingWire = False
+                    if connector:
+                        event.Dragging = lambda : True
+                        self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
+                    if self.SelectedElement.EndConnected is not None:
+                        self.SelectedElement.ResetPoints()
+                        self.SelectedElement.GeneratePoints()
+                        self.SelectedElement.RefreshModel()
+                        self.SelectedElement.SetSelected(True)
+                        element = self.SelectedElement
+                        self.RefreshBuffer()
+                    else:
+                        self.SelectedElement.Delete()
+                        element = None
                     self.Refresh(False)
-                if element:
-                    self.SelectedElement = element
-                    self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
-                    self.Refresh(False)
+                elif connector:
+                    self.DrawingWire = True
+                    pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)
+                    if (connector.GetDirection() == EAST):
+                        wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(pos.x, pos.y), WEST])
+                    else:
+                        wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST])
+                    wire.oldPos = pos
+                    wire.Handle = (HANDLE_POINT, 0)
+                    wire.ProcessDragging(0, 0)
+                    wire.Handle = (HANDLE_POINT, 1)
+                    self.AddWire(wire)
+                    if self.SelectedElement:
+                        self.SelectedElement.SetSelected(False)
+                    self.SelectedElement = wire
                 else:
-                    self.rubberBand.Reset()
-                    self.rubberBand.OnLeftDown(event, dc, self.Scaling)
+                    if self.SelectedElement and self.SelectedElement != element:
+                        self.SelectedElement.SetSelected(False)
+                        self.SelectedElement = None
+                        self.Refresh(False)
+                    if element:
+                        self.SelectedElement = element
+                        self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
+                        self.Refresh(False)
+                    else:
+                        self.rubberBand.Reset()
+                        self.rubberBand.OnLeftDown(event, dc, self.Scaling)
         elif self.Mode in [MODE_BLOCK, MODE_VARIABLE, MODE_CONNECTION, MODE_COMMENT, 
                            MODE_CONTACT, MODE_COIL, MODE_POWERRAIL, MODE_INITIALSTEP, 
                            MODE_STEP, MODE_TRANSITION, MODE_DIVERGENCE, MODE_JUMP, MODE_ACTION]:
             self.rubberBand.Reset()
             self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling)
-        elif self.Mode == MODE_WIRE:
-            pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)
-            connector = self.FindBlockConnector(pos)
-            if connector:
-                if (connector.GetDirection() == EAST):
-                    wire = Wire(self, [wx.Point(pos.x, pos.y), EAST], [wx.Point(pos.x, pos.y), WEST])
-                else:
-                    wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST])
-                wire.oldPos = pos
-                wire.Handle = (HANDLE_POINT, 0)
-                wire.ProcessDragging(0, 0)
-                wire.Handle = (HANDLE_POINT, 1)
-                self.AddWire(wire)
-                if self.SelectedElement:
-                    self.SelectedElement.SetSelected(False)
-                self.SelectedElement = wire
-            elif self.SelectedElement:
-                self.SelectedElement.SetSelected(False)
-                self.SelectedElement = None
-            self.Refresh(False)
         event.Skip()
 
     def OnViewerLeftUp(self, event):
@@ -987,21 +1096,27 @@
                 elif self.Mode == MODE_ACTION:
                     wx.CallAfter(self.AddNewActionBlock, bbox)
         elif self.Mode == MODE_SELECTION and self.SelectedElement:
-            self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
-            wx.CallAfter(self.SetCursor, wx.NullCursor)
-            self.Refresh(False)
-        elif self.Mode == MODE_WIRE and self.SelectedElement:
-            if self.SelectedElement.EndConnected != None:
-                self.SelectedElement.ResetPoints()
-                self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
-                self.SelectedElement.GeneratePoints()
-                self.SelectedElement.RefreshModel()
-                self.SelectedElement.SetSelected(True)
-                self.RefreshBuffer()
-            else:
-                self.SelectedElement.Delete()
-                self.SelectedElement = None
-            self.Refresh(False)
+            dc = self.GetLogicalDC()
+            if self.DrawingWire:
+                pos = event.GetLogicalPosition(dc)
+                connector = self.FindBlockConnector(pos)
+                if self.SelectedElement.EndConnected is not None:
+                    self.DrawingWire = False
+                    self.SelectedElement.ResetPoints()
+                    self.SelectedElement.OnMotion(event, dc, self.Scaling)
+                    self.SelectedElement.GeneratePoints()
+                    self.SelectedElement.RefreshModel()
+                    self.SelectedElement.SetSelected(True)
+                    self.RefreshBuffer()
+                elif connector is None:
+                    self.DrawingWire = False
+                    self.SelectedElement.Delete()
+                    self.SelectedElement = None
+                self.Refresh(False)
+            else:
+                self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
+                wx.CallAfter(self.SetCursor, wx.NullCursor)
+                self.Refresh(False)
         if self.Mode != MODE_SELECTION and not self.SavedMode:
             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
         event.Skip()
@@ -1035,16 +1150,16 @@
         if self.rubberBand.IsShown():
             self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling)
         elif self.Mode == MODE_SELECTION and self.SelectedElement:
-            if self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling):
-                self.Refresh(False)
-        elif self.Mode == MODE_WIRE and self.SelectedElement:
-            dc = self.GetLogicalDC()
-            pos = GetScaledEventPosition(event, dc, self.Scaling)
-            connector = self.FindBlockConnector(pos, False)
-            if not connector or self.SelectedElement.EndConnected == None:
-                self.SelectedElement.ResetPoints()
-                self.SelectedElement.OnMotion(event, dc, self.Scaling)
-                self.SelectedElement.GeneratePoints()
+            if self.DrawingWire:
+                dc = self.GetLogicalDC()
+                pos = GetScaledEventPosition(event, dc, self.Scaling)
+                connector = self.FindBlockConnector(pos, False)
+                if not connector or self.SelectedElement.EndConnected == None:
+                    self.SelectedElement.ResetPoints()
+                    self.SelectedElement.OnMotion(event, dc, self.Scaling)
+                    self.SelectedElement.GeneratePoints()
+                    self.Refresh(False)
+            elif self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling):
                 self.Refresh(False)
         self.UpdateScrollPos(event)
         event.Skip()
@@ -1086,7 +1201,10 @@
             self.SelectedElement = None
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            self.SetCursor(wx.NullCursor)
+            self.Refresh(False)
+        elif keycode == wx.WXK_RETURN and self.SelectedElement:
+            self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
         elif keycode == wx.WXK_LEFT:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(0, ypos)