[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r7979 - trunk/gnue-forms/src/uidrivers/win32/widgets,
btami <=