Viewer.py
changeset 144 b67a5de5a24a
parent 140 06d28f03f6f4
child 145 4fb225afddf4
--- a/Viewer.py	Fri Jan 04 17:47:58 2008 +0100
+++ b/Viewer.py	Fri Jan 04 17:49:17 2008 +0100
@@ -104,7 +104,7 @@
                 self.ParentWindow.RefreshBlockModel(block)
                 self.ParentWindow.RefreshBuffer()
                 self.ParentWindow.RefreshScrollBars()
-                self.ParentWindow.ParentWindow.RefreshEditor()
+                self.ParentWindow.ParentWindow.RefreshVariablePanel(self.TagName)
                 self.ParentWindow.Refresh()
         elif values[1] != "location":
             if values[3] == self.ParentWindow.GetTagName():
@@ -297,9 +297,12 @@
         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
         self.Bind(wx.EVT_CHAR, self.OnChar)
-        if wx.VERSION < (2, 7, 0):
-            self.Bind(wx.EVT_SCROLLWIN, self.OnMoveWindow)
-            self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
+        self.Bind(wx.EVT_SCROLLWIN, self.OnMoveWindow)
+        self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
+    
+    def GetScrolledRect(self, rect):
+        rect.x, rect.y = self.CalcScrolledPosition(rect.x, rect.y)
+        return rect
     
     def SetTagName(self, tagname):
         self.TagName = tagname
@@ -409,7 +412,6 @@
         if self.Mode != MODE_SELECTION and self.SelectedElement:
             self.SelectedElement.SetSelected(False)
             self.SelectedElement = None
-            self.Refresh(False)
     
     # Return current drawing mode
     def GetDrawingMode(self):
@@ -450,17 +452,16 @@
         for wire in to_delete:
             wire.Delete()
     
-        self.Refresh(False)
+        self.Refresh()
     
     def RefreshScrollBars(self):
         xstart, ystart = self.GetViewStart()
         window_size = self.GetClientSize()
         maxx = maxy = 0
         for element in self.GetElements():
-            posx, posy = element.GetPosition()
-            width, height = element.GetSize()
-            maxx = max(maxx, posx + width)
-            maxy = max(maxy, posy + height)
+            bbox = element.GetBoundingBox()
+            maxx = max(maxx, bbox.x + bbox.width)
+            maxy = max(maxy, bbox.y + bbox.height)
         maxx = max(maxx + WINDOW_BORDER, xstart * SCROLLBAR_UNIT + window_size[0])
         maxy = max(maxy + WINDOW_BORDER, ystart * SCROLLBAR_UNIT + window_size[1])
         if self.rubberBand.IsShown():
@@ -1017,9 +1018,10 @@
                         element = self.SelectedElement
                         self.RefreshBuffer()
                     else:
+                        rect = self.SelectedElement.GetRedrawRect()
                         self.SelectedElement.Delete()
                         element = None
-                    self.Refresh(False)
+                        self.RefreshRect(self.GetScrolledRect(rect))
                 elif connector:
                     self.DrawingWire = True
                     pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)
@@ -1035,15 +1037,15 @@
                     if self.SelectedElement:
                         self.SelectedElement.SetSelected(False)
                     self.SelectedElement = wire
+                    self.SelectedElement.Refresh()
                 else:
                     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)
+                        self.SelectedElement.Refresh()
                     else:
                         self.rubberBand.Reset()
                         self.rubberBand.OnLeftDown(event, dc, self.Scaling)
@@ -1062,12 +1064,10 @@
                 if len(elements) == 1:
                     self.SelectedElement = elements[0]
                     self.SelectedElement.SetSelected(True)
-                    self.Refresh(False)
                 elif len(elements) > 1:
                     self.SelectedElement = Graphic_Group(self)
                     self.SelectedElement.SetElements(elements)
                     self.SelectedElement.SetSelected(True)
-                    self.Refresh(False)
             else:
                 bbox = self.rubberBand.GetCurrentExtent()
                 self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)                
@@ -1110,15 +1110,16 @@
                     self.SelectedElement.RefreshModel()
                     self.SelectedElement.SetSelected(True)
                     self.RefreshBuffer()
-                elif connector is None:
+                elif connector is None or self.SelectedElement.GetDragging():
                     self.DrawingWire = False
+                    rect = self.SelectedElement.GetRedrawRect()
                     self.SelectedElement.Delete()
                     self.SelectedElement = None
-                self.Refresh(False)
+                    self.RefreshRect(self.GetScrolledRect(rect))
             else:
                 self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
                 wx.CallAfter(self.SetCursor, wx.NullCursor)
-                self.Refresh(False)
+                self.SelectedElement.Refresh()
         if self.Mode != MODE_SELECTION and not self.SavedMode:
             wx.CallAfter(self.ParentWindow.ResetCurrentMode)
         event.Skip()
@@ -1134,7 +1135,6 @@
             self.SelectedElement.SetSelected(True)
             self.SelectedElement.OnRightUp(event, self.GetLogicalDC(), self.Scaling)
             wx.CallAfter(self.SetCursor, wx.NullCursor)
-            self.Refresh(False)
         else:
             self.PopupDefaultMenu(False)
         event.Skip()
@@ -1145,7 +1145,6 @@
                 self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
             else:
                 self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
-                self.Refresh(False)
         event.Skip()
     
     def OnViewerMotion(self, event):
@@ -1155,12 +1154,11 @@
         if not event.Dragging():
             highlighted = self.FindElement(pos) 
             if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
+                rect = self.HighlightedElement.GetRedrawRect()
                 self.HighlightedElement.SetHighlighted(False)
                 self.HighlightedElement = None
-                refresh = True
-            if highlighted is not None:
+            if highlighted is not None and self.HighlightedElement != highlighted:
                 highlighted.SetHighlighted(True)
-                refresh = True
             self.HighlightedElement = highlighted
         if self.rubberBand.IsShown():
             self.rubberBand.OnMotion(event, dc, self.Scaling)
@@ -1169,21 +1167,23 @@
                 connector = self.FindBlockConnector(pos, False)
                 if not connector or self.SelectedElement.EndConnected == None:
                     self.SelectedElement.ResetPoints()
-                    self.SelectedElement.OnMotion(event, dc, self.Scaling)
+                    movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
                     self.SelectedElement.GeneratePoints()
-                    refresh = True
-            elif self.SelectedElement.OnMotion(event, dc, self.Scaling):
-                refresh = True
+                    if movex != 0 or movey != 0:
+                        self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)))
+            else:
+                movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
+                if movex != 0 or movey != 0:
+                    self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)))
         self.UpdateScrollPos(event)
-        if refresh:
-            self.Refresh(False)
         event.Skip()
 
     def OnLeaveViewer(self, event):
-        if self.HighlightedElement is not None:
+        if self.SelectedElement and self.SelectedElement.GetDragging():
+            event.Skip()
+        elif self.HighlightedElement is not None:
             self.HighlightedElement.SetHighlighted(False)
             self.HighlightedElement = None
-            self.Refresh(False)
         event.Skip()
 
     def UpdateScrollPos(self, event):
@@ -1218,13 +1218,13 @@
         else:
             scaling = (8, 8)
         if keycode == wx.WXK_DELETE and self.SelectedElement:
-            self.SelectedElement.Clean()
+            rect = self.SelectedElement.GetRedrawRect(1, 1)
             self.SelectedElement.Delete()
             self.SelectedElement = None
             self.RefreshBuffer()
             self.RefreshScrollBars()
             self.SetCursor(wx.NullCursor)
-            self.Refresh(False)
+            self.RefreshRect(self.GetScrolledRect(rect))
         elif keycode == wx.WXK_RETURN and self.SelectedElement:
             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
         elif keycode == wx.WXK_LEFT:
@@ -1237,7 +1237,7 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh(False)
+                self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(-scaling[0], 0)))
         elif keycode == wx.WXK_RIGHT:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(xmax, ypos)
@@ -1248,7 +1248,7 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh(False)
+                self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(scaling[0], 0)))
         elif keycode == wx.WXK_UP:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(xpos, 0)
@@ -1259,7 +1259,7 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh(False)
+                self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, -scaling[1])))
         elif keycode == wx.WXK_DOWN:
             if event.ControlDown() and event.ShiftDown():
                 self.Scroll(xpos, ymax)
@@ -1270,12 +1270,13 @@
                 self.SelectedElement.RefreshModel()
                 self.RefreshBuffer()
                 self.RefreshScrollBars()
-                self.Refresh(False)
+                self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])))
         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()
+            self.CopyBlock(self.SelectedElement, wx.Point(*self.SelectedElement.GetPosition()))
+            self.RefreshBuffer()
+            self.RefreshScrollBars()
+            self.ParentWindow.RefreshVariablePanel(self.TagName)
+            self.SelectedElement.Refresh()
         else:
             event.Skip()
 
@@ -1303,8 +1304,8 @@
             self.RefreshBlockModel(block)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.ParentWindow.RefreshEditor()
-            self.Refresh(False)
+            self.ParentWindow.RefreshVariablePanel(self.TagName)
+            block.Refresh()
         dialog.Destroy()
     
     def AddNewVariable(self, bbox):
@@ -1331,7 +1332,7 @@
             self.RefreshVariableModel(variable)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            variable.Refresh()
         dialog.Destroy()
 
     def AddNewConnection(self, bbox):
@@ -1348,7 +1349,7 @@
             self.RefreshConnectionModel(connection)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            connection.Refresh()
         dialog.Destroy()
 
     def AddNewComment(self, bbox):
@@ -1368,7 +1369,7 @@
             self.RefreshCommentModel(comment)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            comment.Refresh()
         dialog.Destroy()
 
     def AddNewContact(self, bbox):
@@ -1393,7 +1394,7 @@
             self.RefreshContactModel(contact)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            contact.Refresh()
         dialog.Destroy()
 
     def AddNewCoil(self, bbox):
@@ -1421,7 +1422,7 @@
             self.RefreshCoilModel(coil)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            coil.Refresh()
         dialog.Destroy()
 
     def AddNewPowerRail(self, bbox):
@@ -1438,7 +1439,7 @@
             self.RefreshPowerRailModel(powerrail)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            powerrail.Refresh()
         dialog.Destroy()
 
     def AddNewStep(self, bbox, initial = False):
@@ -1471,7 +1472,7 @@
             self.RefreshStepModel(step)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            step.Refresh()
         dialog.Destroy()
 
     def AddNewTransition(self, bbox):
@@ -1489,7 +1490,7 @@
             self.RefreshTransitionModel(transition)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            transition.Refresh()
         dialog.Destroy()
 
     def AddNewDivergence(self, bbox):
@@ -1507,7 +1508,7 @@
             self.RefreshDivergenceModel(divergence)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            divergence.Refresh()
         dialog.Destroy()
 
     def AddNewJump(self, bbox):
@@ -1528,7 +1529,7 @@
             self.RefreshJumpModel(jump)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            jump.Refresh()
         dialog.Destroy()
 
     def AddNewActionBlock(self, bbox):
@@ -1548,7 +1549,7 @@
             self.RefreshActionBlockModel(actionblock)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            actionblock.Refresh()
         dialog.Destroy()
 
 #-------------------------------------------------------------------------------
@@ -1579,8 +1580,8 @@
                 self.RefreshView()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.ParentWindow.RefreshEditor()
-            self.Refresh(False)
+            self.ParentWindow.RefreshVariablePanel(self.TagName)
+            block.Refresh()
         dialog.Destroy()
 
     def EditVariableContent(self, variable):
@@ -1614,7 +1615,7 @@
                 self.RefreshView()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            variable.Refresh()
         dialog.Destroy()
 
     def EditConnectionContent(self, connection):
@@ -1635,7 +1636,7 @@
             self.RefreshConnectionModel(connection)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            connection.Refresh()
         dialog.Destroy()
 
     def EditContactContent(self, contact):
@@ -1658,7 +1659,7 @@
             self.RefreshContactModel(contact)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            contact.Refresh()
         dialog.Destroy()
 
     def EditCoilContent(self, coil):
@@ -1684,7 +1685,7 @@
             self.RefreshCoilModel(coil)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            coil.Refresh()
         dialog.Destroy()
 
     def EditPowerRailContent(self, powerrail):
@@ -1702,7 +1703,7 @@
             self.RefreshPowerRailModel(powerrail)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            powerrail.Refresh()
         dialog.Destroy()
 
     def EditStepContent(self, step):
@@ -1736,7 +1737,7 @@
             step.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            step.Refresh()
         
     def EditTransitionContent(self, transition):
         dialog = TransitionContentDialog(self.ParentWindow, self.GetDrawingMode() == FREEDRAWING_MODE)
@@ -1750,7 +1751,7 @@
             transition.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            transition.Refresh()
         dialog.Destroy()
 
     def EditJumpContent(self, jump):
@@ -1766,7 +1767,7 @@
             jump.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            jump.Refresh()
         dialog.Destroy()
 
     def EditActionBlockContent(self, actionblock):
@@ -1781,7 +1782,7 @@
             actionblock.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            actionblock.Refresh()
         dialog.Destroy()
 
     def EditCommentContent(self, comment):
@@ -1795,7 +1796,7 @@
             comment.RefreshModel()
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh(False)
+            comment.Refresh()
         dialog.Destroy()
 
 #-------------------------------------------------------------------------------
@@ -1933,7 +1934,7 @@
         self.Controler.RemoveEditedElementInstance(self.TagName, block.GetId())
         for element in elements:
             element.RefreshModel()
-        wx.CallAfter(self.ParentWindow.RefreshEditor)
+        wx.CallAfter(self.ParentWindow.RefreshVariablePanel, self.TagName)
 
     def DeleteVariable(self, variable):
         connectors = variable.GetConnectors()
@@ -2062,15 +2063,17 @@
     def Cut(self):
         if self.IsBlock(self.SelectedElement):
             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone())
+            rect = self.SelectedElement.GetRedrawRect(1, 1)
             self.SelectedElement.Delete()
-            self.RefreshBuffer()
-            self.RefreshScrollBars()
-            self.Refresh()
+            self.SelectedElement = None
+            self.RefreshBuffer()
+            self.RefreshScrollBars()
+            self.RefreshRect(self.GetScrolledRect(rect))
         
     def Copy(self):
         if self.IsBlock(self.SelectedElement):
             self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone())
-    
+            
     def Paste(self):
         element = self.ParentWindow.GetCopyBuffer()
         if element is not None and self.CanAddBlock(element):
@@ -2081,7 +2084,7 @@
             self.SelectedElement.SetSelected(True)
             self.RefreshBuffer()
             self.RefreshScrollBars()
-            self.Refresh()
+            self.ParentWindow.RefreshVariablePanel(self.TagName)
 
     def CanAddBlock(self, block):
         if self.CurrentLanguage == "SFC":
@@ -2094,13 +2097,27 @@
 
     def CopyBlock(self, element, pos):
         id = self.GetNewId()
-        block = element.Clone(id, pos)
+        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)]
+                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(id, name, pos)
+        else:
+            name = None
+            block = element.Clone(id, pos=pos)
         self.AddBlock(block)
         if isinstance(block, Comment):
             self.Controler.AddEditedElementComment(self.TagName, id)
-            self.RefreshCommentModel(comment)
+            self.RefreshCommentModel(block)
         elif isinstance(block, FBD_Block):
-            self.Controler.AddEditedElementBlock(self.TagName, id, block.GetType(), None)
+            self.Controler.AddEditedElementBlock(self.TagName, id, block.GetType(), name)
             self.RefreshBlockModel(block)
         elif isinstance(block, FBD_Variable):
             self.Controler.AddEditedElementVariable(self.TagName, id, block.GetType())
@@ -2156,14 +2173,6 @@
             for i in xrange(1, height / self.Scaling[1] + 1):
                 dc.DrawLine(0, i * self.Scaling[1], width, i * self.Scaling[1])
         
-        # Draw highlighted elements
-        for comment in self.Comments:
-            comment.DrawHighlightment(dc)
-        for wire in self.Wires:
-            wire.DrawHighlightment(dc)
-        for block in self.Blocks:
-            block.DrawHighlightment(dc)
-        
         # Draw all elements
         for comment in self.Comments:
             if comment != self.SelectedElement:
@@ -2174,6 +2183,7 @@
         for block in self.Blocks:
             if block != self.SelectedElement:
                 block.Draw(dc)
+        
         if self.SelectedElement:
             self.SelectedElement.Draw(dc)