--- 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