Viewer.py
changeset 114 06454545e5d0
parent 111 0ec40799ba11
child 118 0c53d6a36013
--- a/Viewer.py	Wed Oct 24 16:00:00 2007 +0200
+++ b/Viewer.py	Wed Oct 24 16:01:06 2007 +0200
@@ -33,6 +33,12 @@
 WINDOW_BORDER = 10
 SCROLL_ZONE = 10
 
+def AppendMenu(parent, help, id, kind, text):
+    if wx.VERSION >= (2, 6, 0):
+        parent.Append(help=help, id=id, kind=kind, text=text)
+    else:
+        parent.Append(helpString=help, id=id, kind=kind, item=text)
+
 #-------------------------------------------------------------------------------
 #                       Graphic elements Viewer base class
 #-------------------------------------------------------------------------------
@@ -119,31 +125,38 @@
 
 class Viewer(wx.ScrolledWindow):
     
+    if wx.VERSION < (2, 6, 0):
+        def Bind(self, event, function, id = None):
+            if id is not None:
+                event(self, id, function)
+            else:
+                event(self, function)
+    
     # Create Contextual Menu items
     def _init_coll_ContextualMenu_Items(self, parent):
         # Create menu items
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS0,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS0,
               kind=wx.ITEM_RADIO, text=u'No Modifier')
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS1,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS1,
               kind=wx.ITEM_RADIO, text=u'Negated')
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS2,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS2,
               kind=wx.ITEM_RADIO, text=u'Rising Edge')
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS3,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS3,
               kind=wx.ITEM_RADIO, text=u'Falling Edge')
         parent.AppendSeparator()
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS5,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS5,
               kind=wx.ITEM_NORMAL, text=u'Add Wire Segment')
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS6,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS6,
               kind=wx.ITEM_NORMAL, text=u'Delete Wire Segment')
         parent.AppendSeparator()
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS8,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS8,
               kind=wx.ITEM_NORMAL, text=u'Add Divergence Branch')
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS9,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS9,
               kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch')
         parent.AppendSeparator()
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11,
               kind=wx.ITEM_NORMAL, text=u'Edit Block')
-        parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12,
               kind=wx.ITEM_NORMAL, text=u'Delete')
         # Link menu event to corresponding called functions
         self.Bind(wx.EVT_MENU, self.OnNoModifierMenu,
@@ -185,7 +198,7 @@
         self.Scaling = None
         #self.Scaling = (8, 8)
         self.DrawGrid = True
-        self.current_id = 0    
+        self.current_id = 0
         
         # Initialize Block, Wire and Comment numbers
         self.block_id = self.wire_id = self.comment_id = 0
@@ -193,6 +206,7 @@
         # Initialize Viewer mode to Selection mode
         self.Mode = MODE_SELECTION
         self.SavedMode = False
+        self.CurrentLanguage = "FBD"
         
         self.ParentWindow = window
         self.Controler = controler
@@ -227,7 +241,10 @@
             dc = wx.ClientDC(self)
         if wx.Platform != '__WXMSW__':
             dc.SetFont(wx.NORMAL_FONT)
-        self.DoPrepareDC(dc)
+        if wx.VERSION >= (2, 6, 0):
+            self.DoPrepareDC(dc)
+        else:
+            self.PrepareDC(dc)
         return dc
 
 #-------------------------------------------------------------------------------
@@ -1056,6 +1073,11 @@
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
                 self.Refresh(False)
+        elif keycode == wx.WXK_SPACE and self.SelectedElement is not None and self.SelectedElement.Dragging:
+            self.CopyBlock(self.SelectedElement, self.SelectedElement.Pos)
+            self.RefreshBuffer()
+            self.RefreshScrollBars()
+            self.Refresh()
         else:
             event.Skip()
 
@@ -1132,7 +1154,10 @@
         dialog.Destroy()
 
     def AddNewComment(self, bbox):
-        dialog = wx.TextEntryDialog(self.ParentWindow, "Add a new comment", "Please enter comment text", "", wx.OK|wx.CANCEL|wx.TE_MULTILINE)
+        if wx.VERSION >= (2, 5, 0):
+            dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", "", wx.OK|wx.CANCEL|wx.TE_MULTILINE)
+        else:
+            dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", "", wx.OK|wx.CANCEL)
         if dialog.ShowModal() == wx.ID_OK:
             value = dialog.GetValue()
             id = self.GetNewId()
@@ -1553,7 +1578,10 @@
         dialog.Destroy()
 
     def EditCommentContent(self, comment):
-        dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL|wx.TE_MULTILINE)
+        if wx.VERSION >= (2, 5, 0):
+            dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL|wx.TE_MULTILINE)
+        else:
+            dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL)
         if dialog.ShowModal() == wx.ID_OK:
             value = dialog.GetValue()
             comment.SetContent(value)
@@ -1822,13 +1850,80 @@
 #-------------------------------------------------------------------------------
     
     def Cut(self):
-        pass
+        if self.IsBlock(self.SelectedElement):
+            self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone())
+            self.SelectedElement.Delete()
+            self.RefreshBuffer()
+            self.RefreshScrollBars()
+            self.Refresh()
         
     def Copy(self):
-        pass
+        if self.IsBlock(self.SelectedElement):
+            self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone())
     
     def Paste(self):
-        pass
+        element = self.ParentWindow.GetCopyBuffer()
+        if element is not None and self.CanAddBlock(element):
+            block = self.CopyBlock(element, wx.Point(*self.CalcUnscrolledPosition(30, 30)))
+            if self.SelectedElement is not None:
+                self.SelectedElement.SetSelected(False)
+            self.SelectedElement = block
+            self.SelectedElement.SetSelected(True)
+            self.RefreshBuffer()
+            self.RefreshScrollBars()
+            self.Refresh()
+
+    def CanAddBlock(self, block):
+        if self.CurrentLanguage == "SFC":
+            return True
+        elif self.CurrentLanguage == "LD" and not isinstance(block, (SFC_Step, SFC_Transition, SFC_Divergence, SFC_Jump, SFC_ActionBlock)):
+            return True
+        elif self.CurrentLanguage == "FBD" and isinstance(block, (FBD_Block, FBD_Variable, FBD_Connector, Comment)):
+            return True
+        return False
+
+    def CopyBlock(self, element, pos):
+        id = self.GetNewId()
+        block = element.Clone(id, pos)
+        self.AddBlock(block)
+        if isinstance(block, Comment):
+            self.Controler.AddCurrentElementEditingComment(id)
+            self.RefreshCommentModel(comment)
+        elif isinstance(block, FBD_Block):
+            self.Controler.AddCurrentElementEditingBlock(id, block.GetType(), None)
+            self.RefreshBlockModel(block)
+        elif isinstance(block, FBD_Variable):
+            self.Controler.AddCurrentElementEditingVariable(id, block.GetType())
+            self.RefreshVariableModel(block)
+        elif isinstance(block, FBD_Connector):
+            self.Controler.AddCurrentElementEditingConnection(id, block.GetType())
+            self.RefreshConnectionModel(block)
+        elif isinstance(block, LD_Contact):
+            self.Controler.AddCurrentElementEditingContact(id)
+            self.RefreshContactModel(block)
+        elif isinstance(block, LD_Coil):
+            self.Controler.AddCurrentElementEditingCoil(id)
+            self.RefreshCoilModel(block)
+        elif isinstance(block, LD_PowerRail):
+            self.Controler.AddCurrentElementEditingPowerRail(id, block.GetType())
+            self.RefreshPowerRailModel(block)
+        elif isinstance(block, SFC_Step):
+            self.Controler.AddCurrentElementEditingStep(id)
+            self.RefreshStepModel(block)    
+        elif isinstance(block, SFC_Transition):
+            self.Controler.AddCurrentElementEditingTransition(id)
+            self.RefreshTransitionModel(block)       
+        elif isinstance(block, SFC_Divergence):
+            self.Controler.AddCurrentElementEditingDivergence(id, block.GetType())
+            self.RefreshActionDivergenceModel(block)
+        elif isinstance(block, SFC_Jump):
+            self.Controler.AddCurrentElementEditingJump(id)
+            self.RefreshJumpModel(block)       
+        elif isinstance(block, SFC_ActionBlock):
+            self.Controler.AddCurrentElementEditingActionBlock(id)
+            self.RefreshActionBlockModel(block)
+        return block
+            
 
 #-------------------------------------------------------------------------------
 #                            Drawing functions