[Commits] (capps) First pass at in-place editing. Still need to clean up fonts, control size and magic numbers.

commits at osafoundation.org commits at osafoundation.org
Wed Feb 9 13:39:16 PST 2005


Commit by: capps
Modified files:
chandler/parcels/osaf/framework/blocks/calendar/CalendarCanvas.py 1.28 1.29
chandler/parcels/osaf/framework/blocks/calendar/CollectionCanvas.py 1.18 1.19

Log message:
First pass at in-place editing. Still need to clean up fonts, control size and magic numbers.

ViewCVS links:
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/blocks/calendar/CalendarCanvas.py.diff?r1=text&tr1=1.28&r2=text&tr2=1.29
http://cvs.osafoundation.org/index.cgi/chandler/parcels/osaf/framework/blocks/calendar/CollectionCanvas.py.diff?r1=text&tr1=1.18&r2=text&tr2=1.19

Index: chandler/parcels/osaf/framework/blocks/calendar/CalendarCanvas.py
diff -u chandler/parcels/osaf/framework/blocks/calendar/CalendarCanvas.py:1.28 chandler/parcels/osaf/framework/blocks/calendar/CalendarCanvas.py:1.29
--- chandler/parcels/osaf/framework/blocks/calendar/CalendarCanvas.py:1.28	Sat Feb  5 13:51:33 2005
+++ chandler/parcels/osaf/framework/blocks/calendar/CalendarCanvas.py	Wed Feb  9 13:39:15 2005
@@ -1,8 +1,8 @@
 """ Canvas for calendaring blocks
 """
 
-__version__ = "$Revision: 1.28 $"
-__date__ = "$Date: 2005/02/05 21:51:33 $"
+__version__ = "$Revision: 1.29 $"
+__date__ = "$Date: 2005/02/09 21:39:15 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -240,6 +240,8 @@
         self.fixed = True
 
     def OnInit(self):
+        self.editor = wxInPlaceEditor(self, -1)
+
         # Setup the navigation buttons
         today = DateTime.today()
         
@@ -479,6 +481,15 @@
                                                item.startTime.minute))
             self.Refresh()
 
+    def GrabFocusHack(self):
+        self.editor.Hide()
+
+    def OnEditItem(self, box):
+        position = box.bounds.GetPosition()
+        size = box.bounds.GetSize()
+
+        self.editor.SetItem(box.getItem(), position, size)
+
     def getDateTimeFromPosition(self, position):
         startDay = self.parent.blockItem.rangeStart
         # @@@ hack hack bug fix (Bug#1831)
@@ -503,6 +514,8 @@
         self.Refresh()
 
     def OnInit(self):
+        self.editor = wxInPlaceEditor(self, -1) 
+        
         # @@@ rationalize drawing calculations...
         self.SetVirtualSize((self.GetVirtualSize().width, 40*24))
         self.SetScrollRate(0, 10)
@@ -530,7 +543,7 @@
         
         # Paint the entire background
         dc.SetBrush(wx.WHITE_BRUSH)
-        dc.DrawRectangle(0, 0, self.size.width, self.size.height)
+        dc.DrawRectangle(0, 0, self.size.width, self.size.height + 10)
 
         # Set text properties for legend
         dc.SetTextForeground(wx.Colour(153, 153, 153))
@@ -663,6 +676,18 @@
 
     # handle mouse related actions: move, resize, create, select
 
+    def GrabFocusHack(self):
+        self.editor.Hide()
+
+    def OnEditItem(self, box):
+        position = self.CalcScrolledPosition(box.bounds.GetPosition())
+        size = box.bounds.GetSize()
+
+        textPos = wx.Point(position.x + 8, position.y + 15)
+        textSize = wx.Size(size.width - 13, size.height - 20)
+
+        self.editor.SetItem(box.getItem(), textPos, textSize)
+
     def OnSelectItem(self, item):
         self.parent.blockItem.selection = item
         self.parent.blockItem.postSelectItemBroadcast()
@@ -749,6 +774,7 @@
 
     def initAttributes(self):
         if not self.hasLocalAttributeValue('rangeStart'):
+            self.dayMode = False
             self.setRange(DateTime.today())
         if not self.hasLocalAttributeValue('rangeIncrement'):
             self.rangeIncrement = DateTime.RelativeDateTime(days=self.daysPerView)
@@ -770,8 +796,54 @@
         else:
             # otherwise, stick with the given date
             self.rangeStart = date
-        self.dayMode = False
-        self.selectedDate = self.rangeStart
+            
+        if self.dayMode:
+            self.selectedDate = date
+        else:
+            self.selectedDate = self.rangeStart
+
+class wxInPlaceEditor(wx.TextCtrl):
+    def __init__(self, *arguments, **keywords):
+        super(wxInPlaceEditor, self).__init__(style=wx.TE_PROCESS_ENTER | wx.NO_BORDER,
+                                              *arguments, **keywords)
+        
+        self.item = None
+        self.Bind(wx.EVT_TEXT_ENTER, self.OnTextEnter)
+        self.Bind(wx.EVT_KILL_FOCUS, self.OnTextEnter)
+        self.Hide()
+
+        #self.editor.Bind(wx.EVT_CHAR, self.OnChar)
+        parent = self.GetParent()
+        parent.Bind(wx.EVT_SIZE, self.OnSize)
+
+    def OnTextEnter(self, event):
+        if self.item != None:
+            self.item.displayName = self.GetValue()
+        self.Hide()
+        event.Skip()
+
+    def OnChar(self, event):
+        if (event.KeyCode() == wx.WXK_RETURN):
+            if self.item != None:
+                self.item.displayName = self.GetValue()
+            self.Hide()
+        event.Skip()
+
+    def SetItem(self, item, position, size):
+        self.item = item
+        self.SetValue(item.displayName)
+
+        self.SetSize(size)
+        self.Move(position)
+
+        self.SetInsertionPointEnd()
+        self.SetSelection(-1, -1)
+        self.Show()
+        self.SetFocus()
+
+    def OnSize(self, event):
+        self.Hide()
+        event.Skip()
 
 class wxMonthCanvas(CollectionCanvas.wxCollectionCanvas, CalendarEventHandler):
     def __init__(self, *arguments, **keywords):
@@ -831,7 +903,7 @@
 
         # Draw the background
         dc.SetBrush(wx.WHITE_BRUSH)
-        dc.DrawRectangle(0, 0, self.size.width, self.size.height)
+        dc.DrawRectangle(0, 0, self.size.width, self.size.height + 10)
         
         # Set up pen for drawing the grid
         dc.SetPen(wx.Pen(wx.Colour(204, 204, 204)))
@@ -983,6 +1055,8 @@
                                              weekday=(DateTime.Sunday, 0))
         return startDay
 
+
+
     
 
 

Index: chandler/parcels/osaf/framework/blocks/calendar/CollectionCanvas.py
diff -u chandler/parcels/osaf/framework/blocks/calendar/CollectionCanvas.py:1.18 chandler/parcels/osaf/framework/blocks/calendar/CollectionCanvas.py:1.19
--- chandler/parcels/osaf/framework/blocks/calendar/CollectionCanvas.py:1.18	Sat Feb  5 13:51:33 2005
+++ chandler/parcels/osaf/framework/blocks/calendar/CollectionCanvas.py	Wed Feb  9 13:39:15 2005
@@ -1,8 +1,8 @@
 """ Canvas block for displaying item collections
 """
 
-__version__ = "$Revision: 1.18 $"
-__date__ = "$Date: 2005/02/05 21:51:33 $"
+__version__ = "$Revision: 1.19 $"
+__date__ = "$Date: 2005/02/09 21:39:15 $"
 __copyright__ = "Copyright (c) 2004 Open Source Applications Foundation"
 __license__ = "http://osafoundation.org/Chandler_0.1_license_terms.htm"
 
@@ -294,7 +294,7 @@
         middleRect = rect.width / 2
         middleText = textExtent[0] / 2
         dc.DrawText(text, rect.x + middleRect - middleText, rect.y)
-        
+
     # Mouse movement
 
     def OnMouseEvent(self, event):
@@ -305,6 +305,14 @@
         3. Resizing an item
         """
 
+        # @@@ wxPanels don't ever get the focus if they have a child window.
+        # This causes us problems as we are using controls as in-place editors.
+        # The current hack is to notice when the panel might want to grab
+        # focus from the control, and hide the control. Entertaining better
+        # solutions...
+        if event.ButtonDown():
+            self.GrabFocusHack()
+
         position = event.GetPosition()
         unscrolledPosition = self.CalcUnscrolledPosition(position)
 
@@ -349,7 +357,14 @@
 
             # create an item on double click
             if event.LeftDClick():
-                self.OnCreateItem(unscrolledPosition, False)
+                hitBox = None
+                for box in self.canvasItemList:
+                    if box.isHit(unscrolledPosition):
+                        hitBox = box
+                if hitBox:
+                    self.OnEditItem(hitBox)
+                else:
+                    self.OnCreateItem(unscrolledPosition, False)
 
             # handle selection if mouse down event, set up drag
             elif event.LeftDown():
@@ -358,12 +373,6 @@
                     if box.isHit(unscrolledPosition):
                         hitBox = box
 
-                if hoverResize and not hitBox:
-                    print "error condition, methinks"
-                    print unscrolledPosition
-                    for box in self.canvasItemList:
-                        print box.bounds, box._resizeTopBounds, box._resizeLowBounds
-                    
                 if hitBox:
                     self.OnSelectItem(hitBox.getItem())
                     self._dragBox = hitBox
@@ -407,6 +416,8 @@
                             self._dragStart = None
                             self._dragBox = None
                         
+    def GrabFocusHack(self):
+        pass
 
     def OnCreateItem(self, position, createOnDrag):
         """ Creates a new item on the canvas.
@@ -467,6 +478,11 @@
         Subclasses can define to handle dragging
         """
         pass
+
+    def OnEditItem(self, hitBox):
+        """
+        """
+        pass
             
     # Painting and drawing
 



More information about the Commits mailing list