commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r7979 - trunk/gnue-forms/src/uidrivers/win32/widgets


From: btami
Subject: [gnue] r7979 - trunk/gnue-forms/src/uidrivers/win32/widgets
Date: Wed, 28 Sep 2005 12:35:37 -0500 (CDT)

Author: btami
Date: 2005-09-23 08:39:47 -0500 (Fri, 23 Sep 2005)
New Revision: 7979

Modified:
   trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py
   trunk/gnue-forms/src/uidrivers/win32/widgets/entry.py
Log:
incremental search in dropdown

Modified: trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py       2005-09-23 
12:27:51 UTC (rev 7978)
+++ trunk/gnue-forms/src/uidrivers/win32/widgets/_base.py       2005-09-23 
13:39:47 UTC (rev 7979)
@@ -25,7 +25,6 @@
 # NOTES:
 #
 
-import re
 import struct
 
 import win32ui
@@ -48,6 +47,14 @@
 
 #TCN_SELCHANGE = (commctrl.TCN_FIRST - 1)
 #TCN_SELCHANGING = (commctrl.TCN_FIRST - 2)
+
+# user defined events for edit part of dropdown
+WM_TAB = win32con.WM_USER
+WM_RETURN = win32con.WM_USER + 1
+
+def _MyCallback( hwnd, windows ):
+    windows.append(hwnd)
+
 
 class Win32Base:
   _connectTable = {}
@@ -66,18 +73,58 @@
       parent._children.append(self)
 
     self._hwnd = win32gui.CreateWindowEx(styleEx, className, windowTitle, 
style, x,y, width,height, hparent, menu, instance, None)
-
+    
     # this is only for SetFont
     self._PyCWnd = win32ui.CreateWindowFromHandle(self._hwnd)
 
     self._uiDriver = uidriver
     self._uiDriver._win32app._HwndToTkObj[self._hwnd] = self
 
-    if className in ['STATIC', 'BUTTON', 'COMBOBOX', 'LISTBOX', 'EDIT']:
+    if className in ['STATIC', 'BUTTON', 'COMBOBOX', 'LISTBOX', 'EDIT']:
+      # subclassing edit control part of the combo box eventhandler
+      # to produce incremental search/autocomplete
+      if className == 'COMBOBOX':
+        self._AutoComplete = True
+        windows = []
+        try:
+          win32gui.EnumChildWindows(self._hwnd, _MyCallback, windows)
+          self._editHwnd = windows[0]
+          self._oldWndProc1 = win32gui.SetWindowLong(self._editHwnd, 
win32con.GWL_WNDPROC, self._wndproc1)
+        except:
+          pass
+
       self.Show() 
       self._oldWndProc = win32gui.SetWindowLong(self._hwnd, 
win32con.GWL_WNDPROC, self._wndproc)
-
-  def _wndproc(self, hwnd, msg, wParam, lParam):
+
+  # edit control part of the combo box eventhandler
+  def _wndproc1(self, hwnd, msg, wParam, lParam):
+    if msg == win32con.WM_KEYDOWN:
+      keycode = wParam
+      self._AutoComplete = True
+      # let the delete/back keys do their job
+      if keycode in (win32con.VK_DELETE, win32con.VK_BACK):
+        self._AutoComplete = False
+      elif keycode == win32con.VK_TAB:
+        # we have to deal with tab and enter
+        ShiftDown = (win32api.GetKeyState(win32con.VK_SHIFT) & 0x8000) and 1 
or 0
+        if ShiftDown:
+          win32gui.SendMessage(self._hwnd, WM_TAB, 0, 1)
+        else:
+          win32gui.SendMessage(self._hwnd, WM_TAB, 0, 0)
+        return 0
+      elif keycode == win32con.VK_RETURN:
+        win32gui.SendMessage(self._hwnd, WM_RETURN, 0, 0)
+        return 0
+        
+    elif msg == win32con.WM_CHAR:
+      keycode = wParam
+      if keycode in (win32con.VK_TAB, win32con.VK_RETURN):
+        return 0 
+        
+    return win32gui.CallWindowProc(self._oldWndProc1, hwnd, msg, wParam, 
lParam)
+
+  # main eventhandler
+  def _wndproc(self, hwnd, msg, wParam, lParam):
     if msg == win32con.WM_LBUTTONDOWN:
       gfObject = self._uiDriver._IdToGFObj[self._id]
       uiObject = self._uiDriver._IdToUIObj[self._id]
@@ -98,7 +145,7 @@
           cursorPosition = self.getSelectedArea()[1]
           uiObject._request ('CURSORMOVE', position = cursorPosition)
 
-        win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, lParam)
+        return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
 
     elif msg == win32con.WM_LBUTTONUP:
       gfObject = self._uiDriver._IdToGFObj[self._id]
@@ -112,7 +159,7 @@
           uiObject._request ('SELECTWITHMOUSE', position1 = left,
                                                 position2 = right)
           
-      win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, lParam)
+      return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
 
     elif msg == win32con.WM_KEYDOWN:
       keycode = wParam
@@ -223,17 +270,46 @@
            command == 'NEWLINE':
           return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
       
-    elif msg == win32con.WM_COMMAND:
-      if win32api.HIWORD(wParam) == win32con.CBN_SELCHANGE:
-        gfObject = self._uiDriver._IdToGFObj[self._id]
-        uiObject = self._uiDriver._IdToUIObj[self._id]
-        if gfObject.style == 'dropdown':
+    elif msg == win32con.WM_COMMAND:
+      gfObject = self._uiDriver._IdToGFObj[self._id]
+      uiObject = self._uiDriver._IdToUIObj[self._id]
+      
+      if gfObject.style == 'dropdown':
+        # Autocompletition goes here:
+        # First find if there any element in the dropdown wth prefix matching, 
then
+        # select it with CB_SELECTSTRING, then
+        # highlight(select) the not typed yet part of the string
+        if win32api.HIWORD(wParam) == win32con.EN_UPDATE and 
self._AutoComplete:
+             
+          text = win32gui.GetWindowText(hwnd)
+          length = len(text)
+          gs = win32gui.SendMessage(self._editHwnd, win32con.EM_GETSEL, 0, 0)
+          (start, end) = (win32api.LOWORD(gs), win32api.HIWORD(gs))
+          
+          if win32gui.SendMessage(hwnd, win32con.CB_SELECTSTRING, -1, text) == 
win32con.CB_ERR:
+            win32gui.SetWindowText(self._editHwnd, text)
+  
+          if end < length:
+            win32gui.SendMessage(self._editHwnd, win32con.EM_SETSEL, start, 
end)
+          else:
+            win32gui.SendMessage(self._editHwnd, win32con.EM_SETSEL, length, 
-1)
+
           selection = self.GetValue()
           string = gfObject._field.allowedValues()[1][selection]
-          uiObject._eventHandler('requestREPLACEVALUE',object=gfObject,
+        
+        # selection from listbox part of dropdown with mouse or arrows
+        elif win32api.HIWORD(wParam) == win32con.CBN_SELCHANGE:
+          selection = self.GetValue()
+          string = gfObject._field.allowedValues()[1][selection]
+          if selection >= 0:
+            uiObject._eventHandler('requestREPLACEVALUE',object=gfObject,
                               index=selection, text=string,
-                            _form=gfObject._form)
-        return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
+                            _form=gfObject._form)
+        else:
+          return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
+      else:
+        return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
+
 
     elif msg == win32con.WM_PAINT:
       try:
@@ -248,9 +324,33 @@
         win32gui.ReleaseDC(self._hwnd,hdc)
       else:
         return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
+
+    # user defined events for edit part of dropdown
+    elif msg == WM_TAB or msg == WM_RETURN:
+      gfObject = self._uiDriver._IdToGFObj[self._id]
+      uiObject = self._uiDriver._IdToUIObj[self._id]
+
+      text = win32gui.GetWindowText(hwnd)
+      win32gui.SendMessage(hwnd, win32con.CB_SELECTSTRING, -1, text)
+      
+      selection = self.GetValue()
+      if selection == -1:
+        selection = 0
+        
+      string = gfObject._field.allowedValues()[1][selection]
+      uiObject._eventHandler('requestREPLACEVALUE',object=gfObject,
+                          index=selection, text=string,
+                        _form=gfObject._form)
+      if lParam == 1:
+        action = events.Event('requestPREVENTRY')
+      else:
+        action = events.Event('requestNEXTENTRY')
+      action.__dict__.update({'_form':gfObject._form})
+      uiObject._eventHandler(action)
 
     else:
       return win32gui.CallWindowProc(self._oldWndProc, hwnd, msg, wParam, 
lParam)
+
 
   def SetFont(self, font):
       self._PyCWnd.SetFont(font,1)
@@ -326,7 +426,7 @@
       elif child._className == commctrl.TOOLBARCLASSNAME:
         win32gui.SendMessage(child.GetHwnd(), commctrl.TB_AUTOSIZE, 0, 0)
     
-  def OnWMCommand(self, hwnd, msg, wParam, lParam):
+  def OnWMCommand(self, hwnd, msg, wParam, lParam):
     # menu/toolbar selection happend'
     self._connectTable[wParam]()
 

Modified: trunk/gnue-forms/src/uidrivers/win32/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/win32/widgets/entry.py       2005-09-23 
12:27:51 UTC (rev 7978)
+++ trunk/gnue-forms/src/uidrivers/win32/widgets/entry.py       2005-09-23 
13:39:47 UTC (rev 7979)
@@ -47,8 +47,10 @@
     title = ""
     
     if ostyle == 'dropdown':
-      style = win32con.WS_CHILD | win32con.WS_VSCROLL | win32con.LBS_NOTIFY | \
-                 win32con.CBS_DROPDOWNLIST | win32con.CBS_NOINTEGRALHEIGHT
+      #~ style = win32con.WS_CHILD | win32con.WS_VSCROLL | win32con.LBS_NOTIFY 
| \
+                 #~ win32con.CBS_DROPDOWNLIST | win32con.CBS_NOINTEGRALHEIGHT
+      style = win32con.WS_CHILD | win32con.WS_VSCROLL | \
+                 win32con.CBS_DROPDOWN | win32con.CBS_NOINTEGRALHEIGHT
       styleEx = 0
       className = "COMBOBOX"
       height = self.itemHeight +100 # TODO





reply via email to

[Prev in Thread] Current Thread [Next in Thread]