Viewer.py
changeset 586 9aa96a36cf33
parent 585 bd8c7a033b17
child 599 4bb7b132e15d
equal deleted inserted replaced
585:bd8c7a033b17 586:9aa96a36cf33
    35 from plcopen.structures import *
    35 from plcopen.structures import *
    36 from PLCControler import ITEM_POU
    36 from PLCControler import ITEM_POU
    37 
    37 
    38 from dialogs import *
    38 from dialogs import *
    39 from graphics import *
    39 from graphics import *
       
    40 from controls import EditorPanel
    40 
    41 
    41 SCROLLBAR_UNIT = 10
    42 SCROLLBAR_UNIT = 10
    42 WINDOW_BORDER = 10
    43 WINDOW_BORDER = 10
    43 SCROLL_ZONE = 10
    44 SCROLL_ZONE = 10
    44 
    45 
   262                         self.ParentWindow.Controler.AddEditedElementBlock(tagname, id, values[0], blockname)
   263                         self.ParentWindow.Controler.AddEditedElementBlock(tagname, id, values[0], blockname)
   263                         self.ParentWindow.RefreshBlockModel(block)
   264                         self.ParentWindow.RefreshBlockModel(block)
   264                         self.ParentWindow.RefreshBuffer()
   265                         self.ParentWindow.RefreshBuffer()
   265                         self.ParentWindow.RefreshScrollBars()
   266                         self.ParentWindow.RefreshScrollBars()
   266                         self.ParentWindow.RefreshVisibleElements()
   267                         self.ParentWindow.RefreshVisibleElements()
   267                         self.ParentWindow.ParentWindow.RefreshVariablePanel(tagname)
   268                         self.ParentWindow.RefreshVariablePanel()
   268                         self.ParentWindow.Refresh(False)
   269                         self.ParentWindow.Refresh(False)
   269             elif values[1] == "location":
   270             elif values[1] == "location":
   270                 if len(values) > 2 and pou_type == "program":
   271                 if len(values) > 2 and pou_type == "program":
   271                     var_name = values[3]
   272                     var_name = values[3]
   272                     if var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
   273                     if var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetProjectPouNames(self.ParentWindow.Debug)]:
   280                             var_type = values[2]
   281                             var_type = values[2]
   281                         else:
   282                         else:
   282                             var_type = LOCATIONDATATYPES.get(values[0][2], ["BOOL"])[0]
   283                             var_type = LOCATIONDATATYPES.get(values[0][2], ["BOOL"])[0]
   283                         if not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
   284                         if not var_name.upper() in [name.upper() for name in self.ParentWindow.Controler.GetEditedElementVariables(tagname, self.ParentWindow.Debug)]:
   284                             self.ParentWindow.Controler.AddEditedElementPouVar(tagname, var_type, var_name, values[0], values[4])
   285                             self.ParentWindow.Controler.AddEditedElementPouVar(tagname, var_type, var_name, values[0], values[4])
   285                         self.ParentWindow.ParentWindow.RefreshVariablePanel(tagname)
   286                         self.ParentWindow.RefreshVariablePanel()
   286                         self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, var_name, var_type)
   287                         self.ParentWindow.AddVariableBlock(x, y, scaling, var_class, var_name, var_type)
   287             elif values[3] == tagname:
   288             elif values[3] == tagname:
   288                 if values[1] == "Output":
   289                 if values[1] == "Output":
   289                     var_class = OUTPUT
   290                     var_class = OUTPUT
   290                 elif values[1] == "InOut":
   291                 elif values[1] == "InOut":
   338 """
   339 """
   339 Class that implements a Viewer based on a wx.ScrolledWindow for drawing and 
   340 Class that implements a Viewer based on a wx.ScrolledWindow for drawing and 
   340 manipulating graphic elements
   341 manipulating graphic elements
   341 """
   342 """
   342 
   343 
   343 class Viewer(wx.ScrolledWindow, DebugViewer):
   344 class Viewer(EditorPanel, DebugViewer):
   344     
   345     
   345     if wx.VERSION < (2, 6, 0):
   346     if wx.VERSION < (2, 6, 0):
   346         def Bind(self, event, function, id = None):
   347         def Bind(self, event, function, id = None):
   347             if id is not None:
   348             if id is not None:
   348                 event(self, id, function)
   349                 event(self, id, function)
   444         self.ContextualMenu = wx.Menu(title='')
   445         self.ContextualMenu = wx.Menu(title='')
   445         
   446         
   446         self._init_coll_AlignmentMenu_Items(self.AlignmentMenu)
   447         self._init_coll_AlignmentMenu_Items(self.AlignmentMenu)
   447         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   448         self._init_coll_ContextualMenu_Items(self.ContextualMenu)
   448     
   449     
       
   450     def _init_Editor(self, prnt):
       
   451         self.Editor = wx.ScrolledWindow(prnt, name="Viewer", 
       
   452             pos=wx.Point(0, 0), size=wx.Size(0, 0), 
       
   453             style=wx.HSCROLL | wx.VSCROLL | wx.ALWAYS_SHOW_SB)
       
   454     
   449     # Create a new Viewer
   455     # Create a new Viewer
   450     def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
   456     def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
   451         wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0), 
   457         self.VARIABLE_PANEL_TYPE = controler.GetPouType(tagname.split("::")[1])
   452             style=wx.HSCROLL | wx.VSCROLL | wx.ALWAYS_SHOW_SB)
   458         
       
   459         EditorPanel.__init__(self, parent, tagname, window, controler)
   453         DebugViewer.__init__(self, controler, debug)
   460         DebugViewer.__init__(self, controler, debug)
       
   461         
   454         self._init_menus()
   462         self._init_menus()
       
   463         
   455         # Adding a rubberband to Viewer
   464         # Adding a rubberband to Viewer
   456         self.rubberBand = RubberBand(drawingSurface=self)
   465         self.rubberBand = RubberBand(viewer=self)
   457         self.SetBackgroundColour(wx.Colour(255,255,255))
   466         self.Editor.SetBackgroundColour(wx.Colour(255,255,255))
   458         self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
   467         self.Editor.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
   459         self.ResetView()
   468         self.ResetView()
   460         self.Scaling = None
   469         self.Scaling = None
   461         self.DrawGrid = True
   470         self.DrawGrid = True
   462         self.GridBrush = wx.TRANSPARENT_BRUSH
   471         self.GridBrush = wx.TRANSPARENT_BRUSH
   463         self.PageSize = None
   472         self.PageSize = None
   480         # Initialize Viewer mode to Selection mode
   489         # Initialize Viewer mode to Selection mode
   481         self.Mode = MODE_SELECTION
   490         self.Mode = MODE_SELECTION
   482         self.SavedMode = False
   491         self.SavedMode = False
   483         self.CurrentLanguage = "FBD"
   492         self.CurrentLanguage = "FBD"
   484         
   493         
   485         self.ParentWindow = window
       
   486         self.Controler = controler
       
   487         
       
   488         if not self.Debug:
   494         if not self.Debug:
   489             self.SetDropTarget(ViewerDropTarget(self))
   495             self.Editor.SetDropTarget(ViewerDropTarget(self))
   490         
   496         
   491         self.NewDataRefreshRect = None
   497         self.NewDataRefreshRect = None
   492         self.NewDataRefreshRect_lock = Lock()
   498         self.NewDataRefreshRect_lock = Lock()
   493         
   499         
   494         dc = wx.ClientDC(self)
   500         dc = wx.ClientDC(self.Editor)
   495         font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
   501         font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
   496         dc.SetFont(font)
   502         dc.SetFont(font)
   497         width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   503         width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   498         while width > 260:
   504         while width > 260:
   499             faces["size"] -= 1
   505             faces["size"] -= 1
   502             width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   508             width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
   503         self.SetFont(font)
   509         self.SetFont(font)
   504         self.MiniTextDC = wx.MemoryDC()
   510         self.MiniTextDC = wx.MemoryDC()
   505         self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"]))
   511         self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"]))
   506         
   512         
   507         self.SetScale(len(ZOOM_FACTORS) / 2)
   513         self.CurrentScale = None
       
   514         self.SetScale(len(ZOOM_FACTORS) / 2, False)
   508         
   515         
   509         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   516         self.RefreshHighlightsTimer = wx.Timer(self, -1)
   510         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   517         self.Bind(wx.EVT_TIMER, self.OnRefreshHighlightsTimer, self.RefreshHighlightsTimer)
   511         
   518         
   512         self.ResetView()
   519         self.ResetView()
   513         
   520         
   514         # Link Viewer event to corresponding methods
   521         # Link Viewer event to corresponding methods
   515         self.Bind(wx.EVT_PAINT, self.OnPaint)
   522         self.Editor.Bind(wx.EVT_PAINT, self.OnPaint)
   516         self.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
   523         self.Editor.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
   517         self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
   524         self.Editor.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
   518         self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
   525         self.Editor.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
   519         self.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
   526         self.Editor.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
   520         self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
   527         self.Editor.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
   521         self.Bind(wx.EVT_MIDDLE_DOWN, self.OnViewerMiddleDown)
   528         self.Editor.Bind(wx.EVT_MIDDLE_DOWN, self.OnViewerMiddleDown)
   522         self.Bind(wx.EVT_MIDDLE_UP, self.OnViewerMiddleUp)
   529         self.Editor.Bind(wx.EVT_MIDDLE_UP, self.OnViewerMiddleUp)
   523         self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
   530         self.Editor.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
   524         self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
   531         self.Editor.Bind(wx.EVT_MOTION, self.OnViewerMotion)
   525         self.Bind(wx.EVT_CHAR, self.OnChar)
   532         self.Editor.Bind(wx.EVT_CHAR, self.OnChar)
   526         self.Bind(wx.EVT_SCROLLWIN, self.OnScrollWindow)
   533         self.Editor.Bind(wx.EVT_SCROLLWIN, self.OnScrollWindow)
   527         self.Bind(wx.EVT_SCROLLWIN_THUMBRELEASE, self.OnScrollStop)
   534         self.Editor.Bind(wx.EVT_SCROLLWIN_THUMBRELEASE, self.OnScrollStop)
   528         self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheelWindow)
   535         self.Editor.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheelWindow)
   529         self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   536         self.Editor.Bind(wx.EVT_SIZE, self.OnMoveWindow)
   530     
   537     
   531     def __del__(self):
   538     def __del__(self):
   532         DebugViewer.__del__(self)
   539         DebugViewer.__del__(self)
   533         self.RefreshHighlightsTimer.Stop()
   540         self.RefreshHighlightsTimer.Stop()
   534     
   541     
   535     def SetCurrentCursor(self, cursor):
   542     def SetCurrentCursor(self, cursor):
   536         if self.Mode != MODE_MOTION:
   543         if self.Mode != MODE_MOTION:
   537             global CURSORS
   544             global CURSORS
   538             if self.CurrentCursor != cursor:
   545             if self.CurrentCursor != cursor:
   539                 self.CurrentCursor = cursor
   546                 self.CurrentCursor = cursor
   540                 self.SetCursor(CURSORS[cursor])
   547                 self.Editor.SetCursor(CURSORS[cursor])
   541     
   548     
   542     def GetScrolledRect(self, rect):
   549     def GetScrolledRect(self, rect):
   543         rect.x, rect.y = self.CalcScrolledPosition(int(rect.x * self.ViewScale[0]), 
   550         rect.x, rect.y = self.Editor.CalcScrolledPosition(int(rect.x * self.ViewScale[0]), 
   544                                                    int(rect.y * self.ViewScale[1]))
   551                                                    int(rect.y * self.ViewScale[1]))
   545         rect.width = int(rect.width * self.ViewScale[0]) + 2
   552         rect.width = int(rect.width * self.ViewScale[0]) + 2
   546         rect.height = int(rect.height * self.ViewScale[1]) + 2
   553         rect.height = int(rect.height * self.ViewScale[1]) + 2
   547         return rect
   554         return rect
   548     
   555     
       
   556     def GetTitle(self):
       
   557         if self.Debug:
       
   558             if len(self.InstancePath) > 15:
       
   559                 return "..." + self.InstancePath[-12:]
       
   560             return self.InstancePath
       
   561         return EditorPanel.GetTitle(self)
       
   562     
   549     def GetScaling(self):
   563     def GetScaling(self):
   550         return self.Scaling
   564         return self.Scaling
   551     
       
   552     def SetTagName(self, tagname):
       
   553         self.TagName = tagname
       
   554         
       
   555     def GetTagName(self):
       
   556         return self.TagName
       
   557     
   565     
   558     def GetInstancePath(self):
   566     def GetInstancePath(self):
   559         return self.InstancePath
   567         return self.InstancePath
   560     
   568     
   561     def IsViewing(self, tagname):
   569     def IsViewing(self, tagname):
   562         if self.Debug:
   570         if self.Debug:
   563             return self.InstancePath == tagname
   571             return self.InstancePath == tagname
   564         else:
   572         return EditorPanel.IsViewing(self, tagname)
   565             return self.TagName == tagname
       
   566     
   573     
   567     # Returns a new id
   574     # Returns a new id
   568     def GetNewId(self):
   575     def GetNewId(self):
   569         self.current_id += 1
   576         self.current_id += 1
   570         return self.current_id
   577         return self.current_id
   573     def __del__(self):
   580     def __del__(self):
   574         DebugViewer.__del__(self)
   581         DebugViewer.__del__(self)
   575         self.Flush()
   582         self.Flush()
   576         self.ResetView()
   583         self.ResetView()
   577     
   584     
   578     def SetScale(self, scale_number, refresh=True):
   585     def SetScale(self, scale_number, refresh=True, mouse_event=None):
   579         self.CurrentScale = max(0, min(scale_number, len(ZOOM_FACTORS) - 1))
   586         new_scale = max(0, min(scale_number, len(ZOOM_FACTORS) - 1))
   580         self.ViewScale = (ZOOM_FACTORS[self.CurrentScale], ZOOM_FACTORS[self.CurrentScale])
   587         if self.CurrentScale != new_scale:
   581         self.RefreshScaling(refresh)
   588             if refresh:
   582 
   589                 dc = self.GetLogicalDC()
       
   590             self.CurrentScale = new_scale
       
   591             self.ViewScale = (ZOOM_FACTORS[self.CurrentScale], ZOOM_FACTORS[self.CurrentScale])
       
   592             if refresh:
       
   593                 self.Editor.Freeze()
       
   594                 if mouse_event is None:
       
   595                     client_size = self.Editor.GetClientSize()
       
   596                     mouse_pos = wx.Point(client_size[0] / 2, client_size[1] / 2)
       
   597                     mouse_event = wx.MouseEvent(wx.EVT_MOUSEWHEEL.typeId)
       
   598                     mouse_event.m_x = mouse_pos.x
       
   599                     mouse_event.m_y = mouse_pos.y
       
   600                 else:
       
   601                     mouse_pos = mouse_event.GetPosition()
       
   602                 pos = mouse_event.GetLogicalPosition(dc)
       
   603                 xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL)
       
   604                 ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL)
       
   605                 scrollx = max(0, round(pos.x * self.ViewScale[0] - mouse_pos.x) / SCROLLBAR_UNIT)
       
   606                 scrolly = max(0, round(pos.y * self.ViewScale[1] - mouse_pos.y) / SCROLLBAR_UNIT)
       
   607                 if scrollx > xmax or scrolly > ymax:
       
   608                     self.RefreshScrollBars(max(0, scrollx - xmax), max(0, scrolly - ymax))
       
   609                     self.Scroll(scrollx, scrolly)
       
   610                 else:
       
   611                     self.Scroll(scrollx, scrolly)
       
   612                     self.RefreshScrollBars()
       
   613                 self.RefreshScaling(refresh)
       
   614                 self.Editor.Thaw()
       
   615     
   583     def GetScale(self):
   616     def GetScale(self):
   584         return self.CurrentScale
   617         return self.CurrentScale
   585 
   618 
   586     def GetLogicalDC(self, buffered=False):
   619     def GetLogicalDC(self, buffered=False):
   587         if buffered:
   620         if buffered:
   588             bitmap = wx.EmptyBitmap(*self.GetClientSize())
   621             bitmap = wx.EmptyBitmap(*self.Editor.GetClientSize())
   589             dc = wx.MemoryDC(bitmap)
   622             dc = wx.MemoryDC(bitmap)
   590         else:
   623         else:
   591             dc = wx.ClientDC(self)
   624             dc = wx.ClientDC(self.Editor)
   592         dc.SetFont(self.GetFont())
   625         dc.SetFont(self.GetFont())
   593         if wx.VERSION >= (2, 6, 0):
   626         if wx.VERSION >= (2, 6, 0):
   594             self.DoPrepareDC(dc)
   627             self.Editor.DoPrepareDC(dc)
   595         else:
   628         else:
   596             self.PrepareDC(dc)
   629             self.Editor.PrepareDC(dc)
   597         dc.SetUserScale(self.ViewScale[0], self.ViewScale[1])
   630         dc.SetUserScale(self.ViewScale[0], self.ViewScale[1])
   598         return dc
   631         return dc
   599 
   632     
       
   633     def RefreshRect(self, rect, eraseBackground=True):
       
   634         self.Editor.RefreshRect(rect, eraseBackground)
       
   635     
       
   636     def Scroll(self, x, y):
       
   637         self.Editor.Scroll(x, y)
       
   638     
       
   639     def GetScrollPos(self, orientation):
       
   640         return self.Editor.GetScrollPos(orientation)
       
   641     
       
   642     def GetScrollRange(self, orientation):
       
   643         return self.Editor.GetScrollRange(orientation)
       
   644     
       
   645     def GetScrollThumb(self, orientation):
       
   646         return self.Editor.GetScrollThumb(orientation)
       
   647     
       
   648     def CalcUnscrolledPosition(self, x, y):
       
   649         return self.Editor.CalcUnscrolledPosition(x, y)
       
   650     
       
   651     def GetViewStart(self):
       
   652         return self.Editor.GetViewStart()
       
   653     
       
   654     def GetTextExtent(self, text):
       
   655         return self.Editor.GetTextExtent(text)
       
   656     
       
   657     def GetFont(self):
       
   658         return self.Editor.GetFont()
       
   659     
   600     def GetMiniTextExtent(self, text):
   660     def GetMiniTextExtent(self, text):
   601         return self.MiniTextDC.GetTextExtent(text)
   661         return self.MiniTextDC.GetTextExtent(text)
   602     
   662     
   603     def GetMiniFont(self):
   663     def GetMiniFont(self):
   604         return self.MiniTextDC.GetFont()
   664         return self.MiniTextDC.GetFont()
   654                block.GetName() == name:
   714                block.GetName() == name:
   655                 return block
   715                 return block
   656         return None
   716         return None
   657     
   717     
   658     def RefreshVisibleElements(self, xp = None, yp = None):
   718     def RefreshVisibleElements(self, xp = None, yp = None):
   659         x, y = self.CalcUnscrolledPosition(0, 0)
   719         x, y = self.Editor.CalcUnscrolledPosition(0, 0)
   660         if xp is not None:
   720         if xp is not None:
   661             x = xp * self.GetScrollPixelsPerUnit()[0]
   721             x = xp * self.Editor.GetScrollPixelsPerUnit()[0]
   662         if yp is not None:
   722         if yp is not None:
   663             y = yp * self.GetScrollPixelsPerUnit()[1]
   723             y = yp * self.Editor.GetScrollPixelsPerUnit()[1]
   664         width, height = self.GetClientSize()
   724         width, height = self.Editor.GetClientSize()
   665         screen = wx.Rect(int(x / self.ViewScale[0]), int(y / self.ViewScale[1]),
   725         screen = wx.Rect(int(x / self.ViewScale[0]), int(y / self.ViewScale[1]),
   666                          int(width / self.ViewScale[0]), int(height / self.ViewScale[1]))
   726                          int(width / self.ViewScale[0]), int(height / self.ViewScale[1]))
   667         for comment in self.Comments.itervalues():
   727         for comment in self.Comments.itervalues():
   668             comment.TestVisible(screen)
   728             comment.TestVisible(screen)
   669         for wire in self.Wires.iterkeys():
   729         for wire in self.Wires.iterkeys():
   730     
   790     
   731     # Changes Viewer mode
   791     # Changes Viewer mode
   732     def SetMode(self, mode):
   792     def SetMode(self, mode):
   733         if self.Mode != mode or mode == MODE_SELECTION:    
   793         if self.Mode != mode or mode == MODE_SELECTION:    
   734             if self.Mode == MODE_MOTION:
   794             if self.Mode == MODE_MOTION:
   735                 wx.CallAfter(self.SetCursor, wx.NullCursor)
   795                 wx.CallAfter(self.Editor.SetCursor, wx.NullCursor)
   736             self.Mode = mode
   796             self.Mode = mode
   737             self.SavedMode = False
   797             self.SavedMode = False
   738         else:
   798         else:
   739             self.SavedMode = True
   799             self.SavedMode = True
   740         # Reset selection
   800         # Reset selection
   741         if self.Mode != MODE_SELECTION and self.SelectedElement:
   801         if self.Mode != MODE_SELECTION and self.SelectedElement:
   742             self.SelectedElement.SetSelected(False)
   802             self.SelectedElement.SetSelected(False)
   743             self.SelectedElement = None
   803             self.SelectedElement = None
   744         if self.Mode == MODE_MOTION:
   804         if self.Mode == MODE_MOTION:
   745             wx.CallAfter(self.SetCursor, wx.StockCursor(wx.CURSOR_HAND))
   805             wx.CallAfter(self.Editor.SetCursor, wx.StockCursor(wx.CURSOR_HAND))
   746             self.SavedMode = True
   806             self.SavedMode = True
   747         
   807         
   748     # Return current drawing mode
   808     # Return current drawing mode
   749     def GetDrawingMode(self):
   809     def GetDrawingMode(self):
   750         return self.ParentWindow.GetDrawingMode()
   810         return self.ParentWindow.GetDrawingMode()
   753     def RefreshBuffer(self):
   813     def RefreshBuffer(self):
   754         self.Controler.BufferProject()
   814         self.Controler.BufferProject()
   755         self.ParentWindow.RefreshTitle()
   815         self.ParentWindow.RefreshTitle()
   756         self.ParentWindow.RefreshFileMenu()
   816         self.ParentWindow.RefreshFileMenu()
   757         self.ParentWindow.RefreshEditMenu()
   817         self.ParentWindow.RefreshEditMenu()
   758 
   818     
       
   819     def GetBufferState(self):
       
   820         if not self.Debug:
       
   821             return self.Controler.GetBufferState()
       
   822         return False, False
       
   823     
       
   824     def Undo(self):
       
   825         if not self.Debug:
       
   826             self.Controler.LoadPrevious()
       
   827             self.ParentWindow.CloseTabsWithoutModel()
       
   828             self.ParentWindow.RefreshEditor()
       
   829             
       
   830     def Redo(self):
       
   831         if not self.Debug:
       
   832             self.Controler.LoadNext()
       
   833             self.ParentWindow.CloseTabsWithoutModel()
       
   834             self.ParentWindow.RefreshEditor()
       
   835     
       
   836     def HasNoModel(self):
       
   837         if not self.Debug:
       
   838             return self.Controler.GetEditedElement(self.TagName) is None
       
   839         return False
       
   840     
   759     # Refresh the current scaling
   841     # Refresh the current scaling
   760     def RefreshScaling(self, refresh=True):
   842     def RefreshScaling(self, refresh=True):
   761         properties = self.Controler.GetProjectProperties(self.Debug)
   843         properties = self.Controler.GetProjectProperties(self.Debug)
   762         scaling = properties["scaling"][self.CurrentLanguage]
   844         scaling = properties["scaling"][self.CurrentLanguage]
   763         if scaling[0] != 0 and scaling[1] != 0:
   845         if scaling[0] != 0 and scaling[1] != 0:
   765             if self.DrawGrid:
   847             if self.DrawGrid:
   766                 width = max(2, int(scaling[0] * self.ViewScale[0]))
   848                 width = max(2, int(scaling[0] * self.ViewScale[0]))
   767                 height = max(2, int(scaling[1] * self.ViewScale[1]))
   849                 height = max(2, int(scaling[1] * self.ViewScale[1]))
   768                 bitmap = wx.EmptyBitmap(width, height)
   850                 bitmap = wx.EmptyBitmap(width, height)
   769                 dc = wx.MemoryDC(bitmap)
   851                 dc = wx.MemoryDC(bitmap)
   770                 dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
   852                 dc.SetBackground(wx.Brush(self.Editor.GetBackgroundColour()))
   771                 dc.Clear()
   853                 dc.Clear()
   772                 dc.SetPen(MiterPen(wx.Colour(180, 180, 180)))
   854                 dc.SetPen(MiterPen(wx.Colour(180, 180, 180)))
   773                 dc.DrawPoint(0, 0)
   855                 dc.DrawPoint(0, 0)
   774                 self.GridBrush = wx.BrushFromBitmap(bitmap)
   856                 self.GridBrush = wx.BrushFromBitmap(bitmap)
   775             else:
   857             else:
   808             self.NewDataRefreshRect_lock.release()
   890             self.NewDataRefreshRect_lock.release()
   809             self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
   891             self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
   810         else:
   892         else:
   811             DebugViewer.RefreshNewData(self)
   893             DebugViewer.RefreshNewData(self)
   812         
   894         
   813     def ResetBuffer(self):
       
   814         pass
       
   815 
       
   816     # Refresh Viewer elements
   895     # Refresh Viewer elements
   817     def RefreshView(self, selection=None):
   896     def RefreshView(self, variablepanel=True, selection=None):
       
   897         EditorPanel.RefreshView(self, variablepanel)
       
   898         
   818         self.Inhibit(True)
   899         self.Inhibit(True)
   819         self.current_id = 0
   900         self.current_id = 0
   820         # Start by reseting Viewer
   901         # Start by reseting Viewer
   821         self.Flush()
   902         self.Flush()
   822         self.ResetView()
   903         self.ResetView()
   888             maxy = max(maxy, bbox.y + bbox.height)
   969             maxy = max(maxy, bbox.y + bbox.height)
   889         return maxx, maxy
   970         return maxx, maxy
   890     
   971     
   891     def RefreshScrollBars(self, width_incr=0, height_incr=0):
   972     def RefreshScrollBars(self, width_incr=0, height_incr=0):
   892         xstart, ystart = self.GetViewStart()
   973         xstart, ystart = self.GetViewStart()
   893         window_size = self.GetClientSize()
   974         window_size = self.Editor.GetClientSize()
   894         maxx, maxy = self.GetMaxSize()
   975         maxx, maxy = self.GetMaxSize()
   895         maxx = max(maxx + WINDOW_BORDER, (xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[0])
   976         maxx = max(maxx + WINDOW_BORDER, (xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[0])
   896         maxy = max(maxy + WINDOW_BORDER, (ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[1])
   977         maxy = max(maxy + WINDOW_BORDER, (ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[1])
   897         if self.rubberBand.IsShown():
   978         if self.rubberBand.IsShown():
   898             extent = self.rubberBand.GetCurrentExtent()
   979             extent = self.rubberBand.GetCurrentExtent()
   899             maxx = max(maxx, extent.x + extent.width)
   980             maxx = max(maxx, extent.x + extent.width)
   900             maxy = max(maxy, extent.y + extent.height)
   981             maxy = max(maxy, extent.y + extent.height)
   901         maxx = int(maxx * self.ViewScale[0])
   982         maxx = int(maxx * self.ViewScale[0])
   902         maxy = int(maxy * self.ViewScale[1])
   983         maxy = int(maxy * self.ViewScale[1])
   903         self.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
   984         self.Editor.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
   904             round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr, 
   985             round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr, 
   905             xstart, ystart, True)
   986             xstart, ystart, True)
   906     
   987     
   907     def SelectInGroup(self, element):
   988     def SelectInGroup(self, element):
   908         element.SetSelected(True)
   989         element.SetSelected(True)
  1117             self.Bind(wx.EVT_MENU, self.GetReleaseVariableMenuFunction(iec_path.upper()), id=new_id)
  1198             self.Bind(wx.EVT_MENU, self.GetReleaseVariableMenuFunction(iec_path.upper()), id=new_id)
  1118             if self.SelectedElement.IsForced():
  1199             if self.SelectedElement.IsForced():
  1119                 menu.Enable(new_id, True)
  1200                 menu.Enable(new_id, True)
  1120             else:
  1201             else:
  1121                 menu.Enable(new_id, False)
  1202                 menu.Enable(new_id, False)
  1122             self.PopupMenu(menu)
  1203             self.Editor.PopupMenu(menu)
  1123 
  1204 
  1124     def PopupBlockMenu(self, connector = None):
  1205     def PopupBlockMenu(self, connector = None):
  1125         if connector is not None and connector.IsCompatible("BOOL"):
  1206         if connector is not None and connector.IsCompatible("BOOL"):
  1126             type = self.Controler.GetEditedElementType(self.TagName, self.Debug)
  1207             type = self.Controler.GetEditedElementType(self.TagName, self.Debug)
  1127             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, True)
  1208             self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, True)
  1147                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS2, True)
  1228                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS2, True)
  1148             elif connector.GetEdge() == "falling":
  1229             elif connector.GetEdge() == "falling":
  1149                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS3, True)
  1230                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS3, True)
  1150             else:
  1231             else:
  1151                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS0, True)
  1232                 self.ContextualMenu.Check(ID_VIEWERCONTEXTUALMENUITEMS0, True)
  1152         self.PopupMenu(self.ContextualMenu)
  1233         self.Editor.PopupMenu(self.ContextualMenu)
  1153     
  1234     
  1154     def PopupWireMenu(self, delete=True):
  1235     def PopupWireMenu(self, delete=True):
  1155         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1236         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1156         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1237         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1157         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1238         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1161         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
  1242         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
  1162         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
  1243         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
  1163         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
  1244         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
  1164         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1245         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1165         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
  1246         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
  1166         self.PopupMenu(self.ContextualMenu)
  1247         self.Editor.PopupMenu(self.ContextualMenu)
  1167     
  1248     
  1168     def PopupDivergenceMenu(self, connector):
  1249     def PopupDivergenceMenu(self, connector):
  1169         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1250         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1170         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1251         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1171         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1252         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1175         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, True)
  1256         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, True)
  1176         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, connector)
  1257         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, connector)
  1177         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
  1258         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
  1178         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1259         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1179         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
  1260         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
  1180         self.PopupMenu(self.ContextualMenu)
  1261         self.Editor.PopupMenu(self.ContextualMenu)
  1181     
  1262     
  1182     def PopupGroupMenu(self):
  1263     def PopupGroupMenu(self):
  1183         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1264         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1184         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1265         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1185         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1266         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1189         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
  1270         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
  1190         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
  1271         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
  1191         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, True)
  1272         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, True)
  1192         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1273         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1193         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
  1274         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, True)
  1194         self.PopupMenu(self.ContextualMenu)
  1275         self.Editor.PopupMenu(self.ContextualMenu)
  1195     
  1276     
  1196     def PopupDefaultMenu(self, block = True):
  1277     def PopupDefaultMenu(self, block = True):
  1197         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1278         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS0, False)
  1198         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1279         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS1, False)
  1199         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1280         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS2, False)
  1203         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
  1284         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS8, False)
  1204         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
  1285         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS9, False)
  1205         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
  1286         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS14, False)
  1206         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1287         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS16, False)
  1207         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, block)
  1288         self.ContextualMenu.Enable(ID_VIEWERCONTEXTUALMENUITEMS17, block)
  1208         self.PopupMenu(self.ContextualMenu)
  1289         self.Editor.PopupMenu(self.ContextualMenu)
  1209 
  1290 
  1210 #-------------------------------------------------------------------------------
  1291 #-------------------------------------------------------------------------------
  1211 #                            Menu items functions
  1292 #                            Menu items functions
  1212 #-------------------------------------------------------------------------------
  1293 #-------------------------------------------------------------------------------
  1213 
  1294 
  1317     def OnViewerLeftDown(self, event):
  1398     def OnViewerLeftDown(self, event):
  1318         if self.Mode == MODE_SELECTION:
  1399         if self.Mode == MODE_SELECTION:
  1319             dc = self.GetLogicalDC()
  1400             dc = self.GetLogicalDC()
  1320             pos = event.GetLogicalPosition(dc)
  1401             pos = event.GetLogicalPosition(dc)
  1321             if event.ShiftDown() and not event.ControlDown() and self.SelectedElement is not None:
  1402             if event.ShiftDown() and not event.ControlDown() and self.SelectedElement is not None:
  1322                 element = self.FindElement(pos, True)
  1403                 element = self.FindElement(event, True)
  1323                 if element is not None:
  1404                 if element is not None:
  1324                     if isinstance(self.SelectedElement, Graphic_Group):
  1405                     if isinstance(self.SelectedElement, Graphic_Group):
  1325                         self.SelectedElement.SetSelected(False)
  1406                         self.SelectedElement.SetSelected(False)
  1326                         self.SelectedElement.SelectElement(element)
  1407                         self.SelectedElement.SelectElement(element)
  1327                     elif self.SelectedElement is not None:
  1408                     elif self.SelectedElement is not None:
  1568                     self.RefreshScrollBars()
  1649                     self.RefreshScrollBars()
  1569                 self.RefreshVisibleElements()
  1650                 self.RefreshVisibleElements()
  1570         else:
  1651         else:
  1571             if not event.Dragging():
  1652             if not event.Dragging():
  1572                 if self.Debug:
  1653                 if self.Debug:
  1573                     tooltip_pos = self.ClientToScreen(event.GetPosition())
  1654                     tooltip_pos = self.Editor.ClientToScreen(event.GetPosition())
  1574                     tooltip_pos.x += 10
  1655                     tooltip_pos.x += 10
  1575                     tooltip_pos.y += 10
  1656                     tooltip_pos.y += 10
  1576                 highlighted = self.FindElement(event) 
  1657                 highlighted = self.FindElement(event) 
  1577                 if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
  1658                 if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
  1578                     if self.Debug and isinstance(self.HighlightedElement, Wire):
  1659                     if self.Debug and isinstance(self.HighlightedElement, Wire):
  1611                             if isinstance(self.HighlightedElement, Wire):
  1692                             if isinstance(self.HighlightedElement, Wire):
  1612                                 self.HighlightedElement.ClearToolTip()
  1693                                 self.HighlightedElement.ClearToolTip()
  1613                             self.HighlightedElement.SetHighlighted(False)
  1694                             self.HighlightedElement.SetHighlighted(False)
  1614                             self.HighlightedElement = None
  1695                             self.HighlightedElement = None
  1615                         data = wx.TextDataObject(str((iec_path, "debug")))
  1696                         data = wx.TextDataObject(str((iec_path, "debug")))
  1616                         dragSource = wx.DropSource(self)
  1697                         dragSource = wx.DropSource(self.Editor)
  1617                         dragSource.SetData(data)
  1698                         dragSource.SetData(data)
  1618                         dragSource.DoDragDrop()
  1699                         dragSource.DoDragDrop()
  1619             self.UpdateScrollPos(event)
  1700             self.UpdateScrollPos(event)
  1620         event.Skip()
  1701         event.Skip()
  1621 
  1702 
  1633 
  1714 
  1634     def UpdateScrollPos(self, event):
  1715     def UpdateScrollPos(self, event):
  1635         if (event.Dragging() and self.SelectedElement is not None) or self.rubberBand.IsShown():
  1716         if (event.Dragging() and self.SelectedElement is not None) or self.rubberBand.IsShown():
  1636             position = event.GetPosition()
  1717             position = event.GetPosition()
  1637             move_window = wx.Point()
  1718             move_window = wx.Point()
  1638             window_size = self.GetClientSize()
  1719             window_size = self.Editor.GetClientSize()
  1639             xstart, ystart = self.GetViewStart()
  1720             xstart, ystart = self.GetViewStart()
  1640             if position.x < SCROLL_ZONE and xstart > 0:
  1721             if position.x < SCROLL_ZONE and xstart > 0:
  1641                 move_window.x = -1
  1722                 move_window.x = -1
  1642             elif position.x > window_size[0] - SCROLL_ZONE:
  1723             elif position.x > window_size[0] - SCROLL_ZONE:
  1643                 move_window.x = 1
  1724                 move_window.x = 1
  1646             elif position.y > window_size[1] - SCROLL_ZONE:
  1727             elif position.y > window_size[1] - SCROLL_ZONE:
  1647                 move_window.y = 1
  1728                 move_window.y = 1
  1648             if move_window.x != 0 or move_window.y != 0:
  1729             if move_window.x != 0 or move_window.y != 0:
  1649                 self.RefreshVisibleElements(xp = xstart + move_window.x, yp = ystart + move_window.y)
  1730                 self.RefreshVisibleElements(xp = xstart + move_window.x, yp = ystart + move_window.y)
  1650                 self.Scroll(xstart + move_window.x, ystart + move_window.y)
  1731                 self.Scroll(xstart + move_window.x, ystart + move_window.y)
  1651             self.RefreshScrollBars()
  1732                 self.RefreshScrollBars(move_window.x, move_window.y)
  1652 
  1733 
  1653 #-------------------------------------------------------------------------------
  1734 #-------------------------------------------------------------------------------
  1654 #                          Keyboard event functions
  1735 #                          Keyboard event functions
  1655 #-------------------------------------------------------------------------------
  1736 #-------------------------------------------------------------------------------
  1656 
  1737 
  1731                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False)
  1812                 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False)
  1732         elif not self.Debug and keycode == wx.WXK_SPACE and self.SelectedElement is not None and self.SelectedElement.Dragging:
  1813         elif not self.Debug and keycode == wx.WXK_SPACE and self.SelectedElement is not None and self.SelectedElement.Dragging:
  1733             if self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement):
  1814             if self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement):
  1734                 block = self.CopyBlock(self.SelectedElement, wx.Point(*self.SelectedElement.GetPosition()))
  1815                 block = self.CopyBlock(self.SelectedElement, wx.Point(*self.SelectedElement.GetPosition()))
  1735                 event = wx.MouseEvent()
  1816                 event = wx.MouseEvent()
  1736                 event.m_x, event.m_y = self.ScreenToClient(wx.GetMousePosition())
  1817                 event.m_x, event.m_y = self.Editor.ScreenToClient(wx.GetMousePosition())
  1737                 dc = self.GetLogicalDC()
  1818                 dc = self.GetLogicalDC()
  1738                 self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
  1819                 self.SelectedElement.OnLeftUp(event, dc, self.Scaling)
  1739                 self.SelectedElement.SetSelected(False)
  1820                 self.SelectedElement.SetSelected(False)
  1740                 block.OnLeftDown(event, dc, self.Scaling)
  1821                 block.OnLeftDown(event, dc, self.Scaling)
  1741                 self.SelectedElement = block
  1822                 self.SelectedElement = block
  1742                 self.SelectedElement.SetSelected(True)
  1823                 self.SelectedElement.SetSelected(True)
  1743                 self.ParentWindow.RefreshVariablePanel(self.TagName)
  1824                 self.RefreshVariablePanel()
  1744                 self.RefreshVisibleElements()
  1825                 self.RefreshVisibleElements()
  1745             else:
  1826             else:
  1746                 event.Skip()
  1827                 event.Skip()
       
  1828         elif keycode == ord("+"):
       
  1829             self.SetScale(self.CurrentScale + 1)
       
  1830             self.ParentWindow.RefreshDisplayMenu()
       
  1831         elif keycode == ord("-"):
       
  1832             self.SetScale(self.CurrentScale - 1)
       
  1833             self.ParentWindow.RefreshDisplayMenu()
  1747         else:
  1834         else:
  1748             event.Skip()
  1835             event.Skip()
  1749 
  1836 
  1750 #-------------------------------------------------------------------------------
  1837 #-------------------------------------------------------------------------------
  1751 #                  Model adding functions from Drop Target
  1838 #                  Model adding functions from Drop Target
  1801             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
  1888             self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
  1802             self.RefreshBlockModel(block)
  1889             self.RefreshBlockModel(block)
  1803             self.RefreshBuffer()
  1890             self.RefreshBuffer()
  1804             self.RefreshScrollBars()
  1891             self.RefreshScrollBars()
  1805             self.RefreshVisibleElements()
  1892             self.RefreshVisibleElements()
  1806             self.ParentWindow.RefreshVariablePanel(self.TagName)
  1893             self.RefreshVariablePanel()
  1807             self.ParentWindow.RefreshInstancesTree()
  1894             self.ParentWindow.RefreshInstancesTree()
  1808             block.Refresh()
  1895             block.Refresh()
  1809         dialog.Destroy()
  1896         dialog.Destroy()
  1810     
  1897     
  1811     def AddNewVariable(self, bbox):
  1898     def AddNewVariable(self, bbox):
  2112             rect = rect.Union(block.GetRedrawRect())
  2199             rect = rect.Union(block.GetRedrawRect())
  2113             self.RefreshBlockModel(block)
  2200             self.RefreshBlockModel(block)
  2114             self.RefreshBuffer()
  2201             self.RefreshBuffer()
  2115             self.RefreshScrollBars()
  2202             self.RefreshScrollBars()
  2116             self.RefreshVisibleElements()
  2203             self.RefreshVisibleElements()
  2117             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2204             self.RefreshVariablePanel()
  2118             self.ParentWindow.RefreshInstancesTree()
  2205             self.ParentWindow.RefreshInstancesTree()
  2119             if old_values["executionOrder"] != new_values["executionOrder"]:
  2206             if old_values["executionOrder"] != new_values["executionOrder"]:
  2120                 self.RefreshView()
  2207                 self.RefreshView()
  2121             else:
  2208             else:
  2122                 block.Refresh(rect)
  2209                 block.Refresh(rect)
  2525         block.Clean()
  2612         block.Clean()
  2526         self.RemoveBlock(block)
  2613         self.RemoveBlock(block)
  2527         self.Controler.RemoveEditedElementInstance(self.TagName, block.GetId())
  2614         self.Controler.RemoveEditedElementInstance(self.TagName, block.GetId())
  2528         for element in elements:
  2615         for element in elements:
  2529             element.RefreshModel()
  2616             element.RefreshModel()
  2530         wx.CallAfter(self.ParentWindow.RefreshVariablePanel, self.TagName)
  2617         wx.CallAfter(self.RefreshVariablePanel)
  2531         wx.CallAfter(self.ParentWindow.RefreshInstancesTree)
  2618         wx.CallAfter(self.ParentWindow.RefreshInstancesTree)
  2532         
  2619         
  2533     def DeleteVariable(self, variable):
  2620     def DeleteVariable(self, variable):
  2534         connectors = variable.GetConnectors()
  2621         connectors = variable.GetConnectors()
  2535         if len(connectors["outputs"]) > 0:
  2622         if len(connectors["outputs"]) > 0:
  2663             rect = self.SelectedElement.GetRedrawRect(1, 1)
  2750             rect = self.SelectedElement.GetRedrawRect(1, 1)
  2664             self.SelectedElement.Delete()
  2751             self.SelectedElement.Delete()
  2665             self.SelectedElement = None
  2752             self.SelectedElement = None
  2666             self.RefreshBuffer()
  2753             self.RefreshBuffer()
  2667             self.RefreshScrollBars()
  2754             self.RefreshScrollBars()
  2668             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2755             self.RefreshVariablePanel()
  2669             self.ParentWindow.RefreshInstancesTree()
  2756             self.ParentWindow.RefreshInstancesTree()
  2670             self.RefreshRect(self.GetScrolledRect(rect), False)
  2757             self.RefreshRect(self.GetScrolledRect(rect), False)
  2671         
  2758         
  2672     def Copy(self):
  2759     def Copy(self):
  2673         if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement) or isinstance(self.SelectedElement, Graphic_Group)):
  2760         if not self.Debug and (self.IsBlock(self.SelectedElement) or self.IsComment(self.SelectedElement) or isinstance(self.SelectedElement, Graphic_Group)):
  2676             self.ParentWindow.SetCopyBuffer(text)
  2763             self.ParentWindow.SetCopyBuffer(text)
  2677             
  2764             
  2678     def Paste(self):
  2765     def Paste(self):
  2679         if not self.Debug:
  2766         if not self.Debug:
  2680             element = self.ParentWindow.GetCopyBuffer()
  2767             element = self.ParentWindow.GetCopyBuffer()
  2681             mouse_pos = self.ScreenToClient(wx.GetMousePosition())
  2768             mouse_pos = self.Editor.ScreenToClient(wx.GetMousePosition())
  2682             middle = wx.Rect(0, 0, *self.GetClientSize()).InsideXY(mouse_pos.x, mouse_pos.y)
  2769             middle = wx.Rect(0, 0, *self.Editor.GetClientSize()).InsideXY(mouse_pos.x, mouse_pos.y)
  2683             if middle:
  2770             if middle:
  2684                 x, y = self.CalcUnscrolledPosition(mouse_pos.x, mouse_pos.y)
  2771                 x, y = self.CalcUnscrolledPosition(mouse_pos.x, mouse_pos.y)
  2685             else:
  2772             else:
  2686                 x, y = self.CalcUnscrolledPosition(0, 0)
  2773                 x, y = self.CalcUnscrolledPosition(0, 0)
  2687             new_pos = [int(x / self.ViewScale[0]), int(y / self.ViewScale[1])]
  2774             new_pos = [int(x / self.ViewScale[0]), int(y / self.ViewScale[1])]
  2688             result = self.Controler.PasteEditedElementInstances(self.TagName, element, new_pos, middle, self.Debug)
  2775             result = self.Controler.PasteEditedElementInstances(self.TagName, element, new_pos, middle, self.Debug)
  2689             if not isinstance(result, (StringType, UnicodeType)):
  2776             if not isinstance(result, (StringType, UnicodeType)):
  2690                 self.RefreshBuffer()
  2777                 self.RefreshBuffer()
  2691                 self.RefreshView(result)
  2778                 self.RefreshView(selection=result)
  2692                 self.ParentWindow.RefreshVariablePanel(self.TagName)
  2779                 self.RefreshVariablePanel()
  2693                 self.ParentWindow.RefreshInstancesTree()
  2780                 self.ParentWindow.RefreshInstancesTree()
  2694             else:
  2781             else:
  2695                 message = wx.MessageDialog(self, result, "Error", wx.OK|wx.ICON_ERROR)
  2782                 message = wx.MessageDialog(self.Editor, result, "Error", wx.OK|wx.ICON_ERROR)
  2696                 message.ShowModal()
  2783                 message.ShowModal()
  2697                 message.Destroy()
  2784                 message.Destroy()
  2698 
  2785 
  2699     def CanAddElement(self, block):
  2786     def CanAddElement(self, block):
  2700         if isinstance(block, Graphic_Group):
  2787         if isinstance(block, Graphic_Group):
  2817     def OnMouseWheelWindow(self, event):
  2904     def OnMouseWheelWindow(self, event):
  2818         if self.StartMousePos is None or self.StartScreenPos is None:
  2905         if self.StartMousePos is None or self.StartScreenPos is None:
  2819             rotation = event.GetWheelRotation() / event.GetWheelDelta()
  2906             rotation = event.GetWheelRotation() / event.GetWheelDelta()
  2820             if event.ShiftDown():
  2907             if event.ShiftDown():
  2821                 x, y = self.GetViewStart()
  2908                 x, y = self.GetViewStart()
  2822                 xp = max(0, min(x - rotation * 3, self.GetVirtualSize()[0] / self.GetScrollPixelsPerUnit()[0]))
  2909                 xp = max(0, min(x - rotation * 3, self.Editor.GetVirtualSize()[0] / self.Editor.GetScrollPixelsPerUnit()[0]))
  2823                 self.RefreshVisibleElements(xp = xp)
  2910                 self.RefreshVisibleElements(xp = xp)
  2824                 self.Scroll(xp, y)
  2911                 self.Scroll(xp, y)
  2825             elif event.ControlDown():
  2912             elif event.ControlDown():
  2826                 dc = self.GetLogicalDC()
  2913                 dc = self.GetLogicalDC()
  2827                 self.Freeze()
  2914                 self.SetScale(self.CurrentScale + rotation, mouse_event = event)
  2828                 pos = event.GetLogicalPosition(dc)
       
  2829                 mouse_pos = event.GetPosition()
       
  2830                 self.SetScale(self.CurrentScale + rotation, False)
       
  2831                 xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL)
       
  2832                 ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL)
       
  2833                 scrollx = max(0, round(pos.x * self.ViewScale[0] - mouse_pos.x) / SCROLLBAR_UNIT)
       
  2834                 scrolly = max(0, round(pos.y * self.ViewScale[1] - mouse_pos.y) / SCROLLBAR_UNIT)
       
  2835                 if scrollx > xmax or scrolly > ymax:
       
  2836                     self.RefreshScrollBars(max(0, scrollx - xmax), max(0, scrolly - ymax))
       
  2837                     self.Scroll(scrollx, scrolly)
       
  2838                 else:
       
  2839                     self.Scroll(scrollx, scrolly)
       
  2840                     self.RefreshScrollBars()
       
  2841                 self.RefreshVisibleElements()
       
  2842                 self.Refresh()
       
  2843                 self.Thaw()
       
  2844                 self.ParentWindow.RefreshDisplayMenu()
  2915                 self.ParentWindow.RefreshDisplayMenu()
  2845             else:
  2916             else:
  2846                 x, y = self.GetViewStart()
  2917                 x, y = self.GetViewStart()
  2847                 yp = max(0, min(y - rotation * 3, self.GetVirtualSize()[1] / self.GetScrollPixelsPerUnit()[1]))
  2918                 yp = max(0, min(y - rotation * 3, self.Editor.GetVirtualSize()[1] / self.Editor.GetScrollPixelsPerUnit()[1]))
  2848                 self.RefreshVisibleElements(yp = yp)
  2919                 self.RefreshVisibleElements(yp = yp)
  2849                 self.Scroll(x, yp)
  2920                 self.Scroll(x, yp)
  2850         
  2921         
  2851     def OnMoveWindow(self, event):
  2922     def OnMoveWindow(self, event):
  2852         if not USE_AUI:
  2923         if not USE_AUI:
  2853             self.GetBestSize()
  2924             self.Editor.GetBestSize()
  2854         self.RefreshScrollBars()
  2925         self.RefreshScrollBars()
  2855         self.RefreshVisibleElements()
  2926         self.RefreshVisibleElements()
  2856         event.Skip()
  2927         event.Skip()
  2857 
  2928 
  2858     def DoDrawing(self, dc, printing = False):
  2929     def DoDrawing(self, dc, printing = False):
  2861                 font = wx.Font(self.GetFont().GetPointSize(), wx.MODERN, wx.NORMAL, wx.NORMAL)
  2932                 font = wx.Font(self.GetFont().GetPointSize(), wx.MODERN, wx.NORMAL, wx.NORMAL)
  2862                 dc.SetFont(font)
  2933                 dc.SetFont(font)
  2863             else:
  2934             else:
  2864                 dc.SetFont(self.GetFont())
  2935                 dc.SetFont(self.GetFont())
  2865         else:
  2936         else:
  2866             dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
  2937             dc.SetBackground(wx.Brush(self.Editor.GetBackgroundColour()))
  2867             dc.Clear()
  2938             dc.Clear()
  2868             dc.BeginDrawing()
  2939             dc.BeginDrawing()
  2869         if self.Scaling is not None and self.DrawGrid and not printing:
  2940         if self.Scaling is not None and self.DrawGrid and not printing:
  2870             dc.SetPen(wx.TRANSPARENT_PEN)
  2941             dc.SetPen(wx.TRANSPARENT_PEN)
  2871             dc.SetBrush(self.GridBrush)
  2942             dc.SetBrush(self.GridBrush)
  2872             xstart, ystart = self.GetViewStart()
  2943             xstart, ystart = self.GetViewStart()
  2873             window_size = self.GetClientSize()
  2944             window_size = self.Editor.GetClientSize()
  2874             width, height = self.GetVirtualSize()
  2945             width, height = self.Editor.GetVirtualSize()
  2875             width = int(max(width, xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[0])
  2946             width = int(max(width, xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[0])
  2876             height = int(max(height, ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[1])
  2947             height = int(max(height, ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[1])
  2877             dc.DrawRectangle(1, 1, width, height)
  2948             dc.DrawRectangle(1, 1, width, height)
  2878         if self.PageSize is not None and not printing:
  2949         if self.PageSize is not None and not printing:
  2879             dc.SetPen(self.PagePen)
  2950             dc.SetPen(self.PagePen)
  2880             xstart, ystart = self.GetViewStart()
  2951             xstart, ystart = self.GetViewStart()
  2881             window_size = self.GetClientSize()
  2952             window_size = self.Editor.GetClientSize()
  2882             for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]):
  2953             for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]):
  2883                 dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), 
  2954                 dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), 
  2884                             xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0]))
  2955                             xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0]))
  2885             for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
  2956             for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
  2886                 dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, 
  2957                 dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, 
  2914             dc.EndDrawing()
  2985             dc.EndDrawing()
  2915 
  2986 
  2916     def OnPaint(self, event):
  2987     def OnPaint(self, event):
  2917         dc = self.GetLogicalDC(True)
  2988         dc = self.GetLogicalDC(True)
  2918         self.DoDrawing(dc)
  2989         self.DoDrawing(dc)
  2919         wx.BufferedPaintDC(self, dc.GetAsBitmap())
  2990         wx.BufferedPaintDC(self.Editor, dc.GetAsBitmap())
  2920         if self.Debug:
  2991         if self.Debug:
  2921             DebugViewer.RefreshNewData(self)
  2992             DebugViewer.RefreshNewData(self)
  2922         event.Skip()
  2993         event.Skip()
  2923 
  2994 
  2924 
  2995