diff -r 9eeaebd867aa -r 06454545e5d0 Viewer.py --- a/Viewer.py Wed Oct 24 16:00:00 2007 +0200 +++ b/Viewer.py Wed Oct 24 16:01:06 2007 +0200 @@ -33,6 +33,12 @@ WINDOW_BORDER = 10 SCROLL_ZONE = 10 +def AppendMenu(parent, help, id, kind, text): + if wx.VERSION >= (2, 6, 0): + parent.Append(help=help, id=id, kind=kind, text=text) + else: + parent.Append(helpString=help, id=id, kind=kind, item=text) + #------------------------------------------------------------------------------- # Graphic elements Viewer base class #------------------------------------------------------------------------------- @@ -119,31 +125,38 @@ class Viewer(wx.ScrolledWindow): + if wx.VERSION < (2, 6, 0): + def Bind(self, event, function, id = None): + if id is not None: + event(self, id, function) + else: + event(self, function) + # Create Contextual Menu items def _init_coll_ContextualMenu_Items(self, parent): # Create menu items - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS0, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS0, kind=wx.ITEM_RADIO, text=u'No Modifier') - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS1, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS1, kind=wx.ITEM_RADIO, text=u'Negated') - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS2, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS2, kind=wx.ITEM_RADIO, text=u'Rising Edge') - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS3, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS3, kind=wx.ITEM_RADIO, text=u'Falling Edge') parent.AppendSeparator() - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS5, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS5, kind=wx.ITEM_NORMAL, text=u'Add Wire Segment') - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS6, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS6, kind=wx.ITEM_NORMAL, text=u'Delete Wire Segment') parent.AppendSeparator() - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS8, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS8, kind=wx.ITEM_NORMAL, text=u'Add Divergence Branch') - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS9, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS9, kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch') parent.AppendSeparator() - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11, kind=wx.ITEM_NORMAL, text=u'Edit Block') - parent.Append(help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12, + AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12, kind=wx.ITEM_NORMAL, text=u'Delete') # Link menu event to corresponding called functions self.Bind(wx.EVT_MENU, self.OnNoModifierMenu, @@ -185,7 +198,7 @@ self.Scaling = None #self.Scaling = (8, 8) self.DrawGrid = True - self.current_id = 0 + self.current_id = 0 # Initialize Block, Wire and Comment numbers self.block_id = self.wire_id = self.comment_id = 0 @@ -193,6 +206,7 @@ # Initialize Viewer mode to Selection mode self.Mode = MODE_SELECTION self.SavedMode = False + self.CurrentLanguage = "FBD" self.ParentWindow = window self.Controler = controler @@ -227,7 +241,10 @@ dc = wx.ClientDC(self) if wx.Platform != '__WXMSW__': dc.SetFont(wx.NORMAL_FONT) - self.DoPrepareDC(dc) + if wx.VERSION >= (2, 6, 0): + self.DoPrepareDC(dc) + else: + self.PrepareDC(dc) return dc #------------------------------------------------------------------------------- @@ -1056,6 +1073,11 @@ self.RefreshBuffer() self.RefreshScrollBars() self.Refresh(False) + 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() else: event.Skip() @@ -1132,7 +1154,10 @@ dialog.Destroy() def AddNewComment(self, bbox): - dialog = wx.TextEntryDialog(self.ParentWindow, "Add a new comment", "Please enter comment text", "", wx.OK|wx.CANCEL|wx.TE_MULTILINE) + if wx.VERSION >= (2, 5, 0): + dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", "", wx.OK|wx.CANCEL|wx.TE_MULTILINE) + else: + dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", "", wx.OK|wx.CANCEL) if dialog.ShowModal() == wx.ID_OK: value = dialog.GetValue() id = self.GetNewId() @@ -1553,7 +1578,10 @@ dialog.Destroy() def EditCommentContent(self, comment): - dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL|wx.TE_MULTILINE) + if wx.VERSION >= (2, 5, 0): + dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL|wx.TE_MULTILINE) + else: + dialog = wx.TextEntryDialog(self.ParentWindow, "Edit comment", "Please enter comment text", comment.GetContent(), wx.OK|wx.CANCEL) if dialog.ShowModal() == wx.ID_OK: value = dialog.GetValue() comment.SetContent(value) @@ -1822,13 +1850,80 @@ #------------------------------------------------------------------------------- def Cut(self): - pass + if self.IsBlock(self.SelectedElement): + self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone()) + self.SelectedElement.Delete() + self.RefreshBuffer() + self.RefreshScrollBars() + self.Refresh() def Copy(self): - pass + if self.IsBlock(self.SelectedElement): + self.ParentWindow.SetCopyBuffer(self.SelectedElement.Clone()) def Paste(self): - pass + element = self.ParentWindow.GetCopyBuffer() + if element is not None and self.CanAddBlock(element): + block = self.CopyBlock(element, wx.Point(*self.CalcUnscrolledPosition(30, 30))) + if self.SelectedElement is not None: + self.SelectedElement.SetSelected(False) + self.SelectedElement = block + self.SelectedElement.SetSelected(True) + self.RefreshBuffer() + self.RefreshScrollBars() + self.Refresh() + + def CanAddBlock(self, block): + if self.CurrentLanguage == "SFC": + return True + elif self.CurrentLanguage == "LD" and not isinstance(block, (SFC_Step, SFC_Transition, SFC_Divergence, SFC_Jump, SFC_ActionBlock)): + return True + elif self.CurrentLanguage == "FBD" and isinstance(block, (FBD_Block, FBD_Variable, FBD_Connector, Comment)): + return True + return False + + def CopyBlock(self, element, pos): + id = self.GetNewId() + block = element.Clone(id, pos) + self.AddBlock(block) + if isinstance(block, Comment): + self.Controler.AddCurrentElementEditingComment(id) + self.RefreshCommentModel(comment) + elif isinstance(block, FBD_Block): + self.Controler.AddCurrentElementEditingBlock(id, block.GetType(), None) + self.RefreshBlockModel(block) + elif isinstance(block, FBD_Variable): + self.Controler.AddCurrentElementEditingVariable(id, block.GetType()) + self.RefreshVariableModel(block) + elif isinstance(block, FBD_Connector): + self.Controler.AddCurrentElementEditingConnection(id, block.GetType()) + self.RefreshConnectionModel(block) + elif isinstance(block, LD_Contact): + self.Controler.AddCurrentElementEditingContact(id) + self.RefreshContactModel(block) + elif isinstance(block, LD_Coil): + self.Controler.AddCurrentElementEditingCoil(id) + self.RefreshCoilModel(block) + elif isinstance(block, LD_PowerRail): + self.Controler.AddCurrentElementEditingPowerRail(id, block.GetType()) + self.RefreshPowerRailModel(block) + elif isinstance(block, SFC_Step): + self.Controler.AddCurrentElementEditingStep(id) + self.RefreshStepModel(block) + elif isinstance(block, SFC_Transition): + self.Controler.AddCurrentElementEditingTransition(id) + self.RefreshTransitionModel(block) + elif isinstance(block, SFC_Divergence): + self.Controler.AddCurrentElementEditingDivergence(id, block.GetType()) + self.RefreshActionDivergenceModel(block) + elif isinstance(block, SFC_Jump): + self.Controler.AddCurrentElementEditingJump(id) + self.RefreshJumpModel(block) + elif isinstance(block, SFC_ActionBlock): + self.Controler.AddCurrentElementEditingActionBlock(id) + self.RefreshActionBlockModel(block) + return block + #------------------------------------------------------------------------------- # Drawing functions