Viewer.py
changeset 361 62570186dad4
parent 352 5cd60f7e510c
child 363 5eb9c5536334
--- a/Viewer.py	Thu May 28 08:10:18 2009 +0200
+++ b/Viewer.py	Sat May 30 17:15:22 2009 +0200
@@ -234,7 +234,7 @@
 manipulating graphic elements
 """
 
-class Viewer(wx.ScrolledWindow):
+class Viewer(wx.ScrolledWindow, DebugViewer):
     
     if wx.VERSION < (2, 6, 0):
         def Bind(self, event, function, id = None):
@@ -344,6 +344,7 @@
     def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
             style=wx.HSCROLL | wx.VSCROLL | wx.ALWAYS_SHOW_SB)
+        DebugViewer.__init__(self, controler, debug)
         self._init_menus()
         # Adding a rubberband to Viewer
         self.rubberBand = RubberBand(drawingSurface=self)
@@ -359,7 +360,6 @@
         self.current_id = 0
         self.TagName = tagname
         self.Errors = []
-        self.Debug = debug
         self.InstancePath = instancepath
         self.StartMousePos = None
         self.StartScreenPos = None
@@ -378,6 +378,8 @@
         if not self.Debug:
             self.SetDropTarget(ViewerDropTarget(self))
         
+        self.NewDataRefreshRect = None
+        
         dc = wx.ClientDC(self)
         font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
         dc.SetFont(font)
@@ -388,6 +390,8 @@
             dc.SetFont(font)
             width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
         self.SetFont(font)
+        self.MiniTextDC = wx.MemoryDC()
+        self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"]))
         
         self.SetScale(len(ZOOM_FACTORS) / 2)
         
@@ -442,6 +446,7 @@
     
     # Destructor
     def __del__(self):
+        DebugViewer.__del__(self)
         self.Flush()
         self.ResetView()
     
@@ -467,10 +472,12 @@
         dc.SetUserScale(self.ViewScale[0], self.ViewScale[1])
         return dc
 
+    def GetMiniTextExtent(self, text):
+        return self.MiniTextDC.GetTextExtent(text)
+    
     def GetMiniFont(self):
-        font = self.GetFont()
-        return wx.Font(font.GetPointSize() * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"])
-
+        return self.MiniTextDC.GetFont()
+    
 #-------------------------------------------------------------------------------
 #                         Element management functions
 #-------------------------------------------------------------------------------
@@ -549,7 +556,7 @@
                         iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
             elif isinstance(block, FBD_Variable):
                 iec_path = "%s.%s"%(self.InstancePath, block.GetName())
-        elif isinstance(element, (LD_Contact, LD_Coil)):
+        elif isinstance(element, LD_Contact):
             iec_path = "%s.%s"%(self.InstancePath, element.GetName())
         elif isinstance(element, SFC_Step):
             iec_path = "%s.%s.X"%(self.InstancePath, element.GetName())
@@ -574,8 +581,7 @@
         self.HighlightedElement = None
     
     def Flush(self):
-        for element, iec_path in self.Subscribed.iteritems():
-            self.Controler.UnsubscribeDebugIECVariable(iec_path, element)
+        self.DeleteDataConsumers()
         for block in self.Blocks:
             block.Flush()
     
@@ -643,6 +649,18 @@
 #                          Refresh functions
 #-------------------------------------------------------------------------------
 
+    def UpdateRefreshRect(self, refresh_rect):
+        if self.NewDataRefreshRect is None:
+            self.NewDataRefreshRect = refresh_rect
+        else:
+            self.NewDataRefreshRect.Union(refresh_rect)
+
+    def RefreshNewData(self):
+        if self.NewDataRefreshRect is not None:
+            refresh_rect, self.NewDataRefreshRect = self.NewDataRefreshRect, None
+            self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
+        DebugViewer.RefreshNewData(self)
+
     def ResetBuffer(self):
         pass
 
@@ -679,15 +697,11 @@
                             iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
                         else:
                             iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
-                    if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), wire) is not None:
-                        self.Subscribed[wire] = iec_path.upper()
-                    else:
+                    if self.AddDataConsumer(iec_path.upper(), wire) is None:
                         wire.SetValue("undefined")
                 elif isinstance(block, FBD_Variable):
                     iec_path = "%s.%s"%(self.InstancePath, block.GetName())
-                    if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), wire) is not None:
-                        self.Subscribed[wire] = iec_path.upper()
-                    else:
+                    if self.AddDataConsumer(iec_path.upper(), wire) is None:
                         wire.SetValue("undefined")
                 elif isinstance(block, FBD_Connector):
                     wire.SetValue("undefined")
@@ -697,10 +711,8 @@
                 block.SpreadCurrent()
                 iec_path = self.GetElementIECPath(block)
                 if iec_path is not None:
-                    result = self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block)
-                    if result is not None:
-                        self.Subscribed[block] = iec_path.upper()
-                
+                    self.AddDataConsumer(iec_path.upper(), block)
+        
         self.RefreshVisibleElements()
         self.ShowErrors()
         self.Refresh(False)
@@ -2687,7 +2699,7 @@
             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() for block in self.Blocks if isinstance(block, SFC_Step)]))
+            names.update(dict([(block.GetName().upper(), True) for block in self.Blocks if isinstance(block, SFC_Step)]))
             format = "Step%d"
         i = 1
         while names.get((format%i).upper(), False):