Viewer.py
changeset 384 ed27a676d5c9
parent 383 25ffba02b6a8
child 388 7ea1f5094df3
--- a/Viewer.py	Fri Jul 24 10:47:35 2009 +0200
+++ b/Viewer.py	Fri Jul 24 11:07:33 2009 +0200
@@ -2564,7 +2564,9 @@
     
     def Cut(self):
         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))
+            blocks, wires = self.SelectedElement.GetDefinition()
+            text = self.Controler.GetEditedElementInstancesCopy(self.TagName, blocks, wires, self.Debug)
+            self.ParentWindow.SetCopyBuffer(text)
             rect = self.SelectedElement.GetRedrawRect(1, 1)
             self.SelectedElement.Delete()
             self.SelectedElement = None
@@ -2576,42 +2578,30 @@
         
     def Copy(self):
         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))
+            blocks, wires = self.SelectedElement.GetDefinition()
+            text = self.Controler.GetEditedElementInstancesCopy(self.TagName, blocks, wires, self.Debug)
+            self.ParentWindow.SetCopyBuffer(text)
             
     def Paste(self):
-        element = self.ParentWindow.GetCopyBuffer()
-        if not self.Debug and element is not None and self.CanAddElement(element):
+        if not self.Debug:
+            element = self.ParentWindow.GetCopyBuffer()
             mouse_pos = self.ScreenToClient(wx.GetMousePosition())
-            if wx.Rect(0, 0, *self.GetClientSize()).InsideXY(mouse_pos.x, mouse_pos.y):
+            middle = wx.Rect(0, 0, *self.GetClientSize()).InsideXY(mouse_pos.x, mouse_pos.y)
+            if middle:
                 x, y = self.CalcUnscrolledPosition(mouse_pos.x, mouse_pos.y)
-                block_size = element.GetSize()
-                x = int(float(x) / self.ViewScale[0]) - block_size[0] / 2
-                y = int(float(y) / self.ViewScale[1]) - block_size[1] / 2
             else:
                 x, y = self.CalcUnscrolledPosition(0, 0)
-                x = int(x / self.ViewScale[0]) + 30
-                y = int(y / self.ViewScale[1]) + 30
-            if self.Scaling is not None:
-                new_pos = wx.Point(max(round_scaling(30, self.Scaling[0], 1), 
-                                       round_scaling(x, self.Scaling[0])),
-                                   max(round_scaling(30, self.Scaling[1], 1),
-                                       round_scaling(y, self.Scaling[1])))
+            new_pos = [int(x / self.ViewScale[0]), int(y / self.ViewScale[1])]
+            result = self.Controler.PasteEditedElementInstances(self.TagName, element, new_pos, middle, self.Debug)
+            if not isinstance(result, (StringType, UnicodeType)):
+                self.RefreshBuffer()
+                self.RefreshView(result)
+                self.ParentWindow.RefreshVariablePanel(self.TagName)
+                self.ParentWindow.RefreshInstancesTree()
             else:
-                new_pos = wx.Point(max(30, x), max(30, y))
-            block = self.CopyBlock(element, new_pos)
-            self.RefreshVisibleElements()
-            if self.SelectedElement is not None:
-                self.SelectedElement.SetSelected(False)
-            self.SelectedElement = block
-            self.SelectedElement.SetSelected(True)
-            self.RefreshBuffer()
-            self.RefreshScrollBars()
-            self.ParentWindow.RefreshVariablePanel(self.TagName)
-            self.ParentWindow.RefreshInstancesTree()
-        else:
-            message = wx.MessageDialog(self, "You can't paste the element in buffer here!", "Error", wx.OK|wx.ICON_ERROR)
-            message.ShowModal()
-            message.Destroy()
+                message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
+                message.ShowModal()
+                message.Destroy()
 
     def CanAddElement(self, block):
         if isinstance(block, Graphic_Group):
@@ -2625,17 +2615,11 @@
         return False
 
     def GenerateNewName(self, element, exclude={}):
-        names = exclude.copy()
-        if isinstance(element, FBD_Block):
-            names.update(dict([(varname.upper(), True) for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]))
-            format = "Block%d"
-        elif isinstance(element, SFC_Step):
-            names.update(dict([(block.GetName().upper(), True) for block in self.Blocks if isinstance(block, SFC_Step)]))
+        if isinstance(element, SFC_Step):
             format = "Step%d"
-        i = 1
-        while names.get((format%i).upper(), False):
-            i += 1
-        return format%i
+        else:
+            format = "Block%d"    
+        return self.Controler.GenerateNewName(self.TagName, element.GetName(), format, exclude, self.Debug)
 
     def IsNamedElement(self, element):
         return isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step)