Author: reinhard
Date: 2010-12-12 15:50:36 -0600 (Sun, 12 Dec 2010)
New Revision: 10270

Modified:
   trunk/gnue-forms/
   trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py
Log:
Introduced "picker" controls for numeric and date input.  Now the user can
input numerical and date fields with the mouse.  Helpful for applications used
with a touch pen.



Property changes on: trunk/gnue-forms
___________________________________________________________________
Name: bzr:revision-info
   - timestamp: 2010-12-08 01:03:04.076999903 +0100
committer: Reinhard Müller <reinhard.muel...@bytewise.at>
properties: 
        branch-nick: forms

   + timestamp: 2010-12-11 17:52:20.673000097 +0100
committer: Reinhard Müller <reinhard.muel...@bytewise.at>
properties: 
        branch-nick: forms

Name: bzr:file-ids
   - src/GFObjects/GFBlock.py   
1...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2FGFObjects%2FGFBlock.py

   + src/uidrivers/wx/widgets/entry.py  
10...@3a364389-8fce-0310-8f11-cc363fde16c7:trunk%2Fgnue-forms:src%2Fuidrivers%2Fwx%2Fwidgets%2Fentry.py

Name: bzr:revision-id:v4
   - 3116 reinhard.muel...@bytewise.at-20100426083500-vtmq0qvd7htz02zx
3117 reinhard.muel...@bytewise.at-20100512151744-2jx8tmtop30kl5n0
3118 reinhard.muel...@bytewise.at-20100705094014-ks9yv7b8gs6ychrb
3119 reinhard.muel...@bytewise.at-20100706085143-hyxadj30ayg28jpx
3120 reinhard.muel...@bytewise.at-20100706140804-sn3npws1ykm81ubx
3121 reinhard.muel...@bytewise.at-20100909134008-5p7jq048nkutldse
3122 reinhard.muel...@bytewise.at-20100923144753-e8hthxho7n5mwg9z
3123 reinhard.muel...@bytewise.at-20100929193018-7r3injoy8g28fwm6
3124 reinhard.muel...@bytewise.at-20100930073631-ilf6smgjt6mfvkpz
3125 reinhard.muel...@bytewise.at-20101011191957-yaj9rkqbervc91ac
3126 reinhard.muel...@bytewise.at-20101020084039-jmfxjbctt6vc2usd
3127 reinhard.muel...@bytewise.at-20101020124425-0dpprxsmanmaenty
3128 reinhard.muel...@bytewise.at-20101020124541-zppkmzww1lnsk8x4
3129 reinhard.muel...@bytewise.at-20101020141905-vjg7r3wihnm7mxam
3130 reinhard.muel...@bytewise.at-20101020143045-pf9ywx1s3hdqbsh7
3131 reinhard.muel...@bytewise.at-20101020143328-ctfmr3fpp5quq1eo
3132 reinhard.muel...@bytewise.at-20101020152139-rlllh9m2qn45atcz
3133 reinhard.muel...@bytewise.at-20101020163022-tgnjcv18nzrc5sfw
3134 reinhard.muel...@bytewise.at-20101020165411-krluvclyw61ef9zp
3135 reinhard.muel...@bytewise.at-20101020185529-pmdkwkm59c1h630f
3136 reinhard.muel...@bytewise.at-20101020195954-1kd9avbmzkrzwzbt
3137 reinhard.muel...@bytewise.at-20101020202048-8q84nx5a54ifxkla
3138 reinhard.muel...@bytewise.at-20101027211256-o7pi879h2x1ceri2
3139 reinhard.muel...@bytewise.at-20101028135833-wftnu2r1cocknxyf
3140 reinhard.muel...@bytewise.at-20101028144709-dbamfa759xoeh127
3141 reinhard.muel...@bytewise.at-20101028145355-uhqftv7n1bcvuz8l
3142 reinhard.muel...@bytewise.at-20101028151042-ueeqwlufysjbke01
3143 reinhard.muel...@bytewise.at-20101028153459-522p7574jw2e11jj
3144 reinhard.muel...@bytewise.at-20101028164956-gua27xm7ad12a218
3145 reinhard.muel...@bytewise.at-20101028181046-hxaehghl84zx9ye0
3146 reinhard.muel...@bytewise.at-20101028194606-598w1lqua0te1m7j
3147 reinhard.muel...@bytewise.at-20101028205855-5k1f08wfdgofenjd
3148 reinhard.muel...@bytewise.at-20101102154340-basdvi9wrxzbx4va
3149 reinhard.muel...@bytewise.at-20101102155520-bbh74pv3qjur1epo
3150 reinhard.muel...@bytewise.at-20101112154024-57tv8mf0wbiycuw1
3151 reinhard.muel...@bytewise.at-20101112155954-ky2g6irsodlzg6yy
3152 reinhard.muel...@bytewise.at-20101114210345-8zsz8bdxtwjytkss
3153 reinhard.muel...@bytewise.at-20101114213813-m10tqf7r2elldh6l
3154 reinhard.muel...@bytewise.at-20101115202536-k0zrvggyt6jy8h0y
3155 reinhard.muel...@bytewise.at-20101122074637-ydmqkqy3udno2n5m
3156 reinhard.muel...@bytewise.at-20101122083336-1n0xys8y4ivtfzo4
3157 reinhard.muel...@bytewise.at-20101201210052-n8pz9fkj6z95zlo2
3158 reinhard.muel...@bytewise.at-20101202012351-kou0f0zchuws25al
3159 reinhard.muel...@bytewise.at-20101202125150-izgvlp3p35t6ny4q
3160 reinhard.muel...@bytewise.at-20101202145210-pf97mpvy5nvhkzqz
3161 reinhard.muel...@bytewise.at-20101202160021-cwhtwpidejk31t6w
3162 reinhard.muel...@bytewise.at-20101202174643-d9ydcs06o8kfy8h7
3163 reinhard.muel...@bytewise.at-20101202180214-zbmb7u0eec43z58g
3164 reinhard.muel...@bytewise.at-20101202202940-kv3x2nnl7ljp8ywo
3165 reinhard.muel...@bytewise.at-20101202204605-4conpgzutzq33iza
3166 reinhard.muel...@bytewise.at-20101202222547-mhsz18h7mqtifatt
3167 reinhard.muel...@bytewise.at-20101203082101-4u4p255falj52btx
3168 reinhard.muel...@bytewise.at-20101203101318-9xi1eyhql8obrhy1
3169 reinhard.muel...@bytewise.at-20101203101750-eeesm6a88ihyja18
3170 reinhard.muel...@bytewise.at-20101203105845-pb8n81gdqfjhb3fi
3171 reinhard.muel...@bytewise.at-20101203112140-2fva9rrj0j87abw4
3172 reinhard.muel...@bytewise.at-20101203115417-rw7t0y2fxoqksceo
3173 reinhard.muel...@bytewise.at-20101203133118-qtzn9umcgo0j75xj
3174 reinhard.muel...@bytewise.at-20101207234352-a0t9jal1a3hhl6w5
3175 reinhard.muel...@bytewise.at-20101208000304-7uofgoiy9afr66t0

   + 3116 reinhard.muel...@bytewise.at-20100426083500-vtmq0qvd7htz02zx
3117 reinhard.muel...@bytewise.at-20100512151744-2jx8tmtop30kl5n0
3118 reinhard.muel...@bytewise.at-20100705094014-ks9yv7b8gs6ychrb
3119 reinhard.muel...@bytewise.at-20100706085143-hyxadj30ayg28jpx
3120 reinhard.muel...@bytewise.at-20100706140804-sn3npws1ykm81ubx
3121 reinhard.muel...@bytewise.at-20100909134008-5p7jq048nkutldse
3122 reinhard.muel...@bytewise.at-20100923144753-e8hthxho7n5mwg9z
3123 reinhard.muel...@bytewise.at-20100929193018-7r3injoy8g28fwm6
3124 reinhard.muel...@bytewise.at-20100930073631-ilf6smgjt6mfvkpz
3125 reinhard.muel...@bytewise.at-20101011191957-yaj9rkqbervc91ac
3126 reinhard.muel...@bytewise.at-20101020084039-jmfxjbctt6vc2usd
3127 reinhard.muel...@bytewise.at-20101020124425-0dpprxsmanmaenty
3128 reinhard.muel...@bytewise.at-20101020124541-zppkmzww1lnsk8x4
3129 reinhard.muel...@bytewise.at-20101020141905-vjg7r3wihnm7mxam
3130 reinhard.muel...@bytewise.at-20101020143045-pf9ywx1s3hdqbsh7
3131 reinhard.muel...@bytewise.at-20101020143328-ctfmr3fpp5quq1eo
3132 reinhard.muel...@bytewise.at-20101020152139-rlllh9m2qn45atcz
3133 reinhard.muel...@bytewise.at-20101020163022-tgnjcv18nzrc5sfw
3134 reinhard.muel...@bytewise.at-20101020165411-krluvclyw61ef9zp
3135 reinhard.muel...@bytewise.at-20101020185529-pmdkwkm59c1h630f
3136 reinhard.muel...@bytewise.at-20101020195954-1kd9avbmzkrzwzbt
3137 reinhard.muel...@bytewise.at-20101020202048-8q84nx5a54ifxkla
3138 reinhard.muel...@bytewise.at-20101027211256-o7pi879h2x1ceri2
3139 reinhard.muel...@bytewise.at-20101028135833-wftnu2r1cocknxyf
3140 reinhard.muel...@bytewise.at-20101028144709-dbamfa759xoeh127
3141 reinhard.muel...@bytewise.at-20101028145355-uhqftv7n1bcvuz8l
3142 reinhard.muel...@bytewise.at-20101028151042-ueeqwlufysjbke01
3143 reinhard.muel...@bytewise.at-20101028153459-522p7574jw2e11jj
3144 reinhard.muel...@bytewise.at-20101028164956-gua27xm7ad12a218
3145 reinhard.muel...@bytewise.at-20101028181046-hxaehghl84zx9ye0
3146 reinhard.muel...@bytewise.at-20101028194606-598w1lqua0te1m7j
3147 reinhard.muel...@bytewise.at-20101028205855-5k1f08wfdgofenjd
3148 reinhard.muel...@bytewise.at-20101102154340-basdvi9wrxzbx4va
3149 reinhard.muel...@bytewise.at-20101102155520-bbh74pv3qjur1epo
3150 reinhard.muel...@bytewise.at-20101112154024-57tv8mf0wbiycuw1
3151 reinhard.muel...@bytewise.at-20101112155954-ky2g6irsodlzg6yy
3152 reinhard.muel...@bytewise.at-20101114210345-8zsz8bdxtwjytkss
3153 reinhard.muel...@bytewise.at-20101114213813-m10tqf7r2elldh6l
3154 reinhard.muel...@bytewise.at-20101115202536-k0zrvggyt6jy8h0y
3155 reinhard.muel...@bytewise.at-20101122074637-ydmqkqy3udno2n5m
3156 reinhard.muel...@bytewise.at-20101122083336-1n0xys8y4ivtfzo4
3157 reinhard.muel...@bytewise.at-20101201210052-n8pz9fkj6z95zlo2
3158 reinhard.muel...@bytewise.at-20101202012351-kou0f0zchuws25al
3159 reinhard.muel...@bytewise.at-20101202125150-izgvlp3p35t6ny4q
3160 reinhard.muel...@bytewise.at-20101202145210-pf97mpvy5nvhkzqz
3161 reinhard.muel...@bytewise.at-20101202160021-cwhtwpidejk31t6w
3162 reinhard.muel...@bytewise.at-20101202174643-d9ydcs06o8kfy8h7
3163 reinhard.muel...@bytewise.at-20101202180214-zbmb7u0eec43z58g
3164 reinhard.muel...@bytewise.at-20101202202940-kv3x2nnl7ljp8ywo
3165 reinhard.muel...@bytewise.at-20101202204605-4conpgzutzq33iza
3166 reinhard.muel...@bytewise.at-20101202222547-mhsz18h7mqtifatt
3167 reinhard.muel...@bytewise.at-20101203082101-4u4p255falj52btx
3168 reinhard.muel...@bytewise.at-20101203101318-9xi1eyhql8obrhy1
3169 reinhard.muel...@bytewise.at-20101203101750-eeesm6a88ihyja18
3170 reinhard.muel...@bytewise.at-20101203105845-pb8n81gdqfjhb3fi
3171 reinhard.muel...@bytewise.at-20101203112140-2fva9rrj0j87abw4
3172 reinhard.muel...@bytewise.at-20101203115417-rw7t0y2fxoqksceo
3173 reinhard.muel...@bytewise.at-20101203133118-qtzn9umcgo0j75xj
3174 reinhard.muel...@bytewise.at-20101207234352-a0t9jal1a3hhl6w5
3175 reinhard.muel...@bytewise.at-20101208000304-7uofgoiy9afr66t0
3176 reinhard.muel...@bytewise.at-20101211165220-2jxsfkmi6hfk5vix

Name: bzr:text-parents
   - src/GFObjects/GFBlock.py   
reinhard.muel...@bytewise.at-20101203115417-rw7t0y2fxoqksceo

   + src/uidrivers/wx/widgets/entry.py  
reinhard.muel...@bytewise.at-20101203112140-2fva9rrj0j87abw4


Modified: trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py  2010-12-12 21:50:33 UTC 
(rev 10269)
+++ trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py  2010-12-12 21:50:36 UTC 
(rev 10270)
@@ -24,8 +24,10 @@
 Implementation of the <entry> tag
 """
 
+import locale
 import os
 import wx
+import wx.combo
 
 from gnue.forms.uidrivers.wx.widgets import _base
 from gnue.forms.input import GFKeyMapper
@@ -85,28 +87,34 @@
 
     def __build_default(self, parent, password=False, multiline=False):
 
-        xFlags = wx.TE_PROCESS_TAB
+        if multiline and not self.managed:
+            self.__border = self._uiDriver.control_border('default')
 
-        if password:
-            xFlags |= wx.TE_PASSWORD
-
-        if multiline:
-            xFlags |= wx.TE_MULTILINE
-        else:
-            xFlags |= wx.TE_PROCESS_ENTER
-
-        # Right-align numeric fields.  This does work on wxMSW and wxGTK only.
         if self._gfObject._field.datatype == 'number':
-            xFlags |= wx.TE_RIGHT
+            style = wx.CB_DROPDOWN
+            ctrl = NumberEntryCtrl(parent, style=style)
 
-        if multiline and not self.managed:
-            self.__border = self._uiDriver.control_border('default')
+        elif self._gfObject._field.datatype == 'date':
+            style = wx.DP_DROPDOWN | wx.DP_ALLOWNONE
+            ctrl = DatePickerCtrl(parent, style=style)
 
-        ctrl = wx.TextCtrl(parent, -1, style=xFlags)
+        else:
+            style = wx.TE_PROCESS_TAB
+            if password:
+                style |= wx.TE_PASSWORD
+            if multiline:
+                style |= wx.TE_MULTILINE
+            else:
+                style |= wx.TE_PROCESS_ENTER
+            ctrl = wx.TextCtrl(parent, style=style)
 
         self.__set_size(ctrl)
 
-        ctrl.Bind(wx.EVT_TEXT, self.__on_text_changed)
+        if isinstance(ctrl, DatePickerCtrl):
+            ctrl.Bind(wx.EVT_DATE_CHANGED, self.__on_datepicker_date_changed)
+            ctrl.Bind(wx.EVT_TEXT, self.__on_datepicker_text)
+        else:
+            ctrl.Bind(wx.EVT_TEXT, self.__on_text_changed)
         ctrl.Bind(wx.EVT_CHAR, self.__on_keypress)
         ctrl.Bind(wx.EVT_KEY_DOWN, self.__on_key_down)
         ctrl.Bind(wx.EVT_SET_FOCUS, self.__on_set_focus)
@@ -311,6 +319,8 @@
             if self.__old_background is not None:
                 widget.SetBackgroundColour(self.__old_background)
 
+        event.Skip()                
+
     # -------------------------------------------------------------------------
 
     def __on_mac_choice_clicked(self, event):
@@ -345,6 +355,23 @@
 
     # -------------------------------------------------------------------------
 
+    def __on_datepicker_date_changed(self, event):
+
+        widget = event.GetEventObject()
+
+        self._request('REPLACEVALUE', text=widget.GetText())
+
+    # -------------------------------------------------------------------------
+
+    def __on_datepicker_text(self, event):
+
+        widget = event.GetEventObject()
+
+        self._request('REPLACEVALUE', text=widget.GetValue(),
+                position=widget.GetInsertionPoint())
+
+    # -------------------------------------------------------------------------
+
     def __on_gtk_text_changed(self, event):
 
         # FIXME: workaround for issue-144.  Setting a selection within an
@@ -406,6 +433,12 @@
                 event.Skip()
                 return
 
+        # Let Windows' date picker handle up/down.
+        if 'wxMSW' in wx.PlatformInfo and isinstance(control, DatePickerCtrl):
+            if keycode in (wx.WXK_UP, wx.WXK_DOWN):
+                event.Skip()
+                return
+
         # Handle cursor up/down and page up/down.
         if not (event.ShiftDown() or event.CmdDown() or event.AltDown()):
             if keycode == wx.WXK_UP:
@@ -541,6 +574,8 @@
                 # with the string value (e.g. in Choice-Controls on OS X)
                 if not widget.SetStringSelection(value):
                     widget.SetValue(value)
+            elif isinstance(widget, DatePickerCtrl):
+                widget.SetText(value)
             else:
                 widget.SetValue(value)
 
@@ -602,6 +637,10 @@
             # Take care: SetSelection in a ListBox sets the selected item!
             pass
 
+        elif isinstance(widget, DatePickerCtrl) and 'wxMSW' in wx.PlatformInfo:
+            # Windows' native DatePickerCtrl doesn't have a selection.
+            pass
+        
         elif hasattr(widget, 'SetSelection'):
             if 'wxGTK' in wx.PlatformInfo:
                 wx.CallAfter(widget.SetSelection, selection1, selection2)
@@ -743,7 +782,9 @@
             # Add border width.
             # FIXME: This is only an estimate, but I haven't found out how to
             # determine the real border width in wx.
-            if self._gfObject.style.lower() == 'dropdown':
+            if isinstance (control, wx.ComboBox) \
+                    or isinstance (control, NumberEntryCtrl) \
+                    or isinstance (control, DatePickerCtrl):
                 min_w += 4
                 if max_w:
                     max_w += 4
@@ -826,6 +867,271 @@
 
 
 # =============================================================================
+# Number Entry Control
+# =============================================================================
+
+class NumberEntryCtrl(wx.combo.ComboCtrl):
+
+    def __init__(self, *args, **kwargs):
+
+        wx.combo.ComboCtrl.__init__(self, *args, **kwargs)
+
+        popup = NumberEntryPopup()
+        popup.TextCtrl = self.GetTextCtrl()
+        self.SetPopupControl(popup)
+
+        # In wxWidgets 2.8, wxComboCtrl receives the EVT_SET_FOCUS events from
+        # the TextCtrl, but not EVT_KILL_FOCUS events. This seems to be fixed
+        # in wxWidgets 2.9, so this workaround can be removed when we require
+        # higher versions of wxWidgets.
+        self.GetTextCtrl().Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
+
+    # -------------------------------------------------------------------------
+
+    def OnKillFocus(self, event):
+
+        e = event.Clone()
+        e.SetEventObject(self)
+        self.GetEventHandler().ProcessEvent(e)
+
+        event.Skip()
+
+    # -------------------------------------------------------------------------
+
+    def GetBackgroundColour(self, *args, **kwargs):
+
+        return self.GetTextCtrl().GetBackgroundColour(*args, **kwargs)
+
+    # -------------------------------------------------------------------------
+
+    def SetBackgroundColour(self, *args, **kwargs):
+
+        return self.GetTextCtrl().SetBackgroundColour(*args, **kwargs)
+
+    # -------------------------------------------------------------------------
+
+    def SetSelection(self, *args, **kwargs):
+
+        return self.GetTextCtrl().SetSelection(*args, **kwargs)
+
+    # -------------------------------------------------------------------------
+
+    def SetInsertionPoint(self, *args, **kwargs):
+
+        return self.GetTextCtrl().SetInsertionPoint(*args, **kwargs)
+
+# =============================================================================
+
+class NumberEntryPopup(wx.combo.ComboPopup):
+
+    def Create(self, parent, *args, **kwargs):
+
+        wx.combo.ComboPopup.Create(self, parent, *args, **kwargs)
+
+        self.panel = wx.Panel(parent, style=wx.BORDER_SIMPLE)
+
+        radixc = u" " + locale.localeconv()['decimal_point'] + u" "
+
+        self.b1 = wx.Button(self.panel, label=u" 1 ", style=wx.BU_EXACTFIT)
+        self.b2 = wx.Button(self.panel, label=u" 2 ", style=wx.BU_EXACTFIT)
+        self.b3 = wx.Button(self.panel, label=u" 3 ", style=wx.BU_EXACTFIT)
+        self.b4 = wx.Button(self.panel, label=u" 4 ", style=wx.BU_EXACTFIT)
+        self.b5 = wx.Button(self.panel, label=u" 5 ", style=wx.BU_EXACTFIT)
+        self.b6 = wx.Button(self.panel, label=u" 6 ", style=wx.BU_EXACTFIT)
+        self.b7 = wx.Button(self.panel, label=u" 7 ", style=wx.BU_EXACTFIT)
+        self.b8 = wx.Button(self.panel, label=u" 8 ", style=wx.BU_EXACTFIT)
+        self.b9 = wx.Button(self.panel, label=u" 9 ", style=wx.BU_EXACTFIT)
+        self.b0 = wx.Button(self.panel, label=u" 0 ", style=wx.BU_EXACTFIT)
+        self.br = wx.Button(self.panel, label=radixc, style=wx.BU_EXACTFIT)
+        self.bx = wx.Button(self.panel, label=u" x ", style=wx.BU_EXACTFIT)
+        self.b1.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b2.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b3.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b4.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b5.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b6.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b7.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b8.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b9.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.b0.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.br.Bind(wx.EVT_BUTTON, self.OnClick)
+        self.bx.Bind(wx.EVT_BUTTON, self.OnClick)
+
+        box = wx.GridSizer(rows=4, cols=3)
+        box.Add(self.b1, flag=wx.EXPAND)
+        box.Add(self.b2, flag=wx.EXPAND)
+        box.Add(self.b3, flag=wx.EXPAND)
+        box.Add(self.b4, flag=wx.EXPAND)
+        box.Add(self.b5, flag=wx.EXPAND)
+        box.Add(self.b6, flag=wx.EXPAND)
+        box.Add(self.b7, flag=wx.EXPAND)
+        box.Add(self.b8, flag=wx.EXPAND)
+        box.Add(self.b9, flag=wx.EXPAND)
+        box.Add(self.b0, flag=wx.EXPAND)
+        box.Add(self.br, flag=wx.EXPAND)
+        box.Add(self.bx, flag=wx.EXPAND)
+        self.panel.SetSizerAndFit(box)
+
+    # -------------------------------------------------------------------------
+
+    def OnClick(self, event):
+
+        char = event.GetEventObject().GetLabel()[1:2]
+        if char == "x":
+            self.TextCtrl.ChangeValue(self.TextCtrl.GetValue()[:-1])
+            self.TextCtrl.SetInsertionPointEnd()
+        else:
+            self.TextCtrl.WriteText(char)
+
+    # -------------------------------------------------------------------------
+
+    def GetControl(self, *args, **kwds):
+
+        return self.panel
+
+    # -------------------------------------------------------------------------
+
+    def GetAdjustedSize(self, *args, **kwds):
+
+        return self.panel.GetMinSize()
+
+
+# =============================================================================
+# Date Picker Control
+# =============================================================================
+
+class DatePickerCtrl(wx.DatePickerCtrl):
+
+    def __init__(self, *args, **kwargs):
+
+        wx.DatePickerCtrl.__init__(self, *args, **kwargs)
+
+        # The native control available in Windows doesn't have all the breakage
+        # we try to fix here, so we just do nothing.
+        if 'wxMSW' in wx.PlatformInfo:
+            return
+        
+        self.combo = None
+
+        for child in self.GetChildren():
+            if isinstance (child, wx.combo.ComboCtrl):
+                self.combo = child
+
+        # Make sure we receive the interesting events from the TextCtrl.
+        self.combo.GetTextCtrl().Bind(wx.EVT_KEY_DOWN, self.OnEvent)
+        self.combo.GetTextCtrl().Bind(wx.EVT_CHAR, self.OnEvent)
+        self.combo.GetTextCtrl().Bind(wx.EVT_SET_FOCUS, self.OnEvent)
+        self.combo.GetTextCtrl().Bind(wx.EVT_KILL_FOCUS, self.OnEvent)
+
+        self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
+        self.Bind(wx.EVT_TEXT, self.OnText)
+
+        self.propagating_event = False
+
+    # -------------------------------------------------------------------------
+
+    def OnEvent(self, event):
+
+        self.propagating_event = True
+        try:
+            e = event.Clone()
+            e.SetEventObject(self)
+            self.GetEventHandler().ProcessEvent(e)
+        finally:
+            self.propagating_event = False
+
+        event.Skip()
+
+    # -------------------------------------------------------------------------
+
+    def OnSetFocus(self, event):
+
+        # wxDatePickerCtrl's EVT_SET_FOCUS handler unconditionally sets the
+        # focus on the ComboCtrl element, and the combo element sets the focus
+        # on its TextCtrl element.  Since we propagate the TextCtrl's
+        # EVT_SET_FOCUS up to the DatePickerCtrl, this would create an endless
+        # recursion.  We avoid this here.
+
+        if not self.propagating_event:
+            event.Skip()
+
+    # -------------------------------------------------------------------------
+
+    def OnText(self, event):
+
+        # wxDatePickerCtrl's EVT_TEXT handler sends bogus EVT_DATE_CHANGED
+        # events around.  We avoid this here.
+
+        pass
+
+    # -------------------------------------------------------------------------
+
+    def GetText(self):
+
+        if 'wxMSW' in wx.PlatformInfo:
+            date = self.GetValue()
+            if date.IsOk():
+                return date.FormatDate()
+            else:
+                return u""
+        else:
+            return self.combo.GetValue()
+
+    # -------------------------------------------------------------------------
+
+    def SetText(self, text):
+
+        # Don't call SetValue() if the value hasn't really changed, since this
+        # function messes with the cursor position and the selection, and under
+        # Windows, we have no way to restore the cursor.
+        if text != self.GetText():
+            if 'wxMSW' in wx.PlatformInfo:
+                date = wx.DateTime()
+                date.ParseFormat(text, '%x')
+                self.SetValue(date)
+            else:
+                self.combo.SetValue(text)
+
+    # -------------------------------------------------------------------------
+
+    def GetBackgroundColour(self, *args, **kwargs):
+
+        if 'wxMSW' in wx.PlatformInfo:
+            return wx.DatePickerCtrl.GetBackgroundColour(self, *args, **kwargs)
+        else:
+            return self.combo.GetTextCtrl().GetBackgroundColour(*args, 
**kwargs)
+
+    # -------------------------------------------------------------------------
+
+    def SetBackgroundColour(self, *args, **kwargs):
+
+        
+        if 'wxMSW' in wx.PlatformInfo:
+            return wx.DatePickerCtrl.SetBackgroundColour(self, *args, **kwargs)
+        else:
+            return self.combo.GetTextCtrl().SetBackgroundColour(*args, 
**kwargs)
+
+    # -------------------------------------------------------------------------
+
+    def SetSelection(self, *args, **kwargs):
+
+        if not 'wxMSW' in wx.PlatformInfo:
+            return self.combo.GetTextCtrl().SetSelection(*args, **kwargs)
+
+    # -------------------------------------------------------------------------
+
+    def GetInsertionPoint(self, *args, **kwargs):
+
+        return self.combo.GetTextCtrl().GetInsertionPoint(*args, **kwargs)
+
+    # -------------------------------------------------------------------------
+
+    def SetInsertionPoint(self, *args, **kwargs):
+
+        if not 'wxMSW' in wx.PlatformInfo:
+            return self.combo.GetTextCtrl().SetInsertionPoint(*args, **kwargs)
+
+# =============================================================================
 # Configuration
 # =============================================================================
 


Property changes on: trunk/gnue-forms/src/uidrivers/wx/widgets/entry.py
___________________________________________________________________
Name: svn:executable
   + *


_______________________________________________
commit-gnue mailing list
commit-gnue@gnu.org
http://lists.gnu.org/mailman/listinfo/commit-gnue

Reply via email to