Viewer.py
changeset 283 c4199b88cf60
parent 279 2ad276084038
child 290 56c4fe6b7012
--- a/Viewer.py	Mon Oct 13 16:07:52 2008 +0200
+++ b/Viewer.py	Fri Oct 17 16:22:15 2008 +0200
@@ -444,11 +444,11 @@
         wires = self.Wires.keys()
         comments = self.Comments.keys()
         if sort_blocks:
-            blocks.sort(lambda x,y:self.Blocks[x].__cmp__(self.Blocks[y]))
+            blocks.sort(lambda x, y: cmp(self.Blocks[x], self.Blocks[y]))
         if sort_wires:
-            wires.sort(lambda x,y:self.Wires[x].__cmp__(self.Wires[y]))
+            wires.sort(lambda x, y: cmp(self.Wires[x], self.Wires[y]))
         if sort_comments:
-            comments.sort(lambda x,y:self.Comments[x].__cmp__(self.Comments[y]))
+            comments.sort(lambda x, y: cmp(self.Comments[x], self.Comments[y]))
         return blocks + wires + comments
 
     def RefreshVisibleElements(self, xp = None, yp = None):
@@ -2430,7 +2430,7 @@
 #-------------------------------------------------------------------------------
     
     def Cut(self):
-        if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement)):
+        if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement) or isinstance(self.SelectedElement, Graphic_Group)):
             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone(self))
             rect = self.SelectedElement.GetRedrawRect(1, 1)
             self.SelectedElement.Delete()
@@ -2442,12 +2442,12 @@
             self.RefreshRect(self.GetScrolledRect(rect), False)
         
     def Copy(self):
-        if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement)):
+        if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement) or isinstance(self.SelectedElement, Graphic_Group)):
             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone(self))
             
     def Paste(self):
         element = self.ParentWindow.GetCopyBuffer()
-        if not self.Debug and element is not None and self.CanAddBlock(element):
+        if not self.Debug and element is not None and self.CanAddElement(element):
             block = self.CopyBlock(element, wx.Point(*self.CalcUnscrolledPosition(30, 30)))
             if self.SelectedElement is not None:
                 self.SelectedElement.SetSelected(False)
@@ -2458,9 +2458,15 @@
             self.RefreshVisibleElements()
             self.ParentWindow.RefreshVariablePanel(self.TagName)
             self.ParentWindow.RefreshInstancesTree()
-
-    def CanAddBlock(self, block):
-        if self.CurrentLanguage == "SFC":
+        else:
+            message = wx.MessageDialog(self, "You can't paste the element in buffer here!", "Error", wx.OK|wx.ICON_ERROR)
+            message.ShowModal()
+            message.Destroy()
+
+    def CanAddElement(self, block):
+        if isinstance(block, Graphic_Group):
+            return block.CanAddBlocks(self)
+        elif 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
@@ -2468,63 +2474,75 @@
             return True
         return False
 
+    def GenerateNewName(self, element):
+        if isinstance(element, FBD_Block):
+            names = [varname.upper() for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]
+            format = "Block%d"
+        elif isinstance(element, SFC_Step):
+            names = [block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]
+            format = "Step%d"
+        i = 1
+        while (format%i).upper() in names:
+            i += 1
+        return format%i
+
+    def IsNamedElement(self, element):
+        return isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step)
+
     def CopyBlock(self, element, pos):
         id = self.GetNewId()
-        if isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step):
-            if isinstance(element, FBD_Block):
-                names = [varname.upper() for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]
-                format = "Block%d"
-            elif isinstance(element, SFC_Step):
-                names = [block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]
-                format = "Step%d"
-            i = 1
-            while (format%i).upper() in names:
-                i += 1
-            name = format%i
-            block = element.Clone(self, id, name, pos)
+        if isinstance(element, Graphic_Group):
+            block = element.Clone(self, pos=pos)
         else:
-            name = None
-            block = element.Clone(self, id, pos=pos)
+            if self.IsNamedElement(element):
+                name = self.GenerateNewName(element)
+                block = element.Clone(self, id, name, pos)
+            else:
+                name = None
+                block = element.Clone(self, id, pos=pos)
+            self.AddBlockInModel(block)
+        return block
+    
+    def AddBlockInModel(self, block):
         if isinstance(block, Comment):
             self.AddComment(block)
-            self.Controler.AddEditedElementComment(self.TagName, id)
+            self.Controler.AddEditedElementComment(self.TagName, block.GetId())
             self.RefreshCommentModel(block)
         else:
             self.AddBlock(block)
             if isinstance(block, FBD_Block):
-                self.Controler.AddEditedElementBlock(self.TagName, id, block.GetType(), name)
+                self.Controler.AddEditedElementBlock(self.TagName, block.GetId(), block.GetType(), block.GetName())
                 self.RefreshBlockModel(block)
             elif isinstance(block, FBD_Variable):
-                self.Controler.AddEditedElementVariable(self.TagName, id, block.GetType())
+                self.Controler.AddEditedElementVariable(self.TagName, block.GetId(), block.GetType())
                 self.RefreshVariableModel(block)
             elif isinstance(block, FBD_Connector):
-                self.Controler.AddEditedElementConnection(self.TagName, id, block.GetType())
+                self.Controler.AddEditedElementConnection(self.TagName, block.GetId(), block.GetType())
                 self.RefreshConnectionModel(block)
             elif isinstance(block, LD_Contact):
-                self.Controler.AddEditedElementContact(self.TagName, id)
+                self.Controler.AddEditedElementContact(self.TagName, block.GetId())
                 self.RefreshContactModel(block)
             elif isinstance(block, LD_Coil):
-                self.Controler.AddEditedElementCoil(self.TagName, id)
+                self.Controler.AddEditedElementCoil(self.TagName, block.GetId())
                 self.RefreshCoilModel(block)
             elif isinstance(block, LD_PowerRail):
-                self.Controler.AddEditedElementPowerRail(self.TagName, id, block.GetType())
+                self.Controler.AddEditedElementPowerRail(self.TagName, block.GetId(), block.GetType())
                 self.RefreshPowerRailModel(block)
             elif isinstance(block, SFC_Step):
-                self.Controler.AddEditedElementStep(self.TagName, id)
+                self.Controler.AddEditedElementStep(self.TagName, block.GetId())
                 self.RefreshStepModel(block)    
             elif isinstance(block, SFC_Transition):
-                self.Controler.AddEditedElementTransition(self.TagName, id)
+                self.Controler.AddEditedElementTransition(self.TagName, block.GetId())
                 self.RefreshTransitionModel(block)       
             elif isinstance(block, SFC_Divergence):
-                self.Controler.AddEditedElementDivergence(self.TagName, id, block.GetType())
+                self.Controler.AddEditedElementDivergence(self.TagName, block.GetId(), block.GetType())
                 self.RefreshDivergenceModel(block)
             elif isinstance(block, SFC_Jump):
-                self.Controler.AddEditedElementJump(self.TagName, id)
+                self.Controler.AddEditedElementJump(self.TagName, block.GetId())
                 self.RefreshJumpModel(block)       
             elif isinstance(block, SFC_ActionBlock):
-                self.Controler.AddEditedElementActionBlock(self.TagName, id)
+                self.Controler.AddEditedElementActionBlock(self.TagName, block.GetId())
                 self.RefreshActionBlockModel(block)
-        return block
 
 
 #-------------------------------------------------------------------------------