commctl32 datetime fields mad editable with keyboard

Siim Karus siim04 at ut.ee
Fri Jan 6 11:45:28 CST 2006


Hi!

  This patch makes datetime fields editable by keyboard (you can just type in 
the time). Platform SDK for Windows XP SP2 does no longer require pressing 
function keys for that functionality (actually my Windows 98SE did not require 
it either) as the older API (like the one that comes with MinGW documents) states.

  Siim Karus
-------------- next part --------------
Index: wine/dlls/comctl32/datetime.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/datetime.c,v
retrieving revision 1.62
diff -u -p -r1.62 datetime.c
--- wine/dlls/comctl32/datetime.c	8 Nov 2005 12:52:35 -0000	1.62
+++ wine/dlls/comctl32/datetime.c	4 Jan 2006 20:52:10 -0000
@@ -441,6 +441,81 @@
 }
 
 static void
+DATETIME_EditField (DATETIME_INFO *infoPtr, int number, int num)
+{
+    SYSTEMTIME *date = &infoPtr->date;
+
+    TRACE ("%d\n", number);
+    if ((number > infoPtr->nrFields) || (number < 0)) return;
+
+    if ((infoPtr->fieldspec[number] & DTHT_DATEFIELD) == 0) return;
+
+    switch (infoPtr->fieldspec[number]) {
+	/*case ONEDIGITYEAR:
+	case TWODIGITYEAR:
+	case FULLYEAR:
+	    date->wYear = wrap(date->wYear, num-date->wYear, 1752, 9999);
+	    break;*/
+	case ONEDIGITMONTH:
+	case TWODIGITMONTH:
+	case THREECHARMONTH:
+	case FULLMONTH:
+	    if((date->wMonth%10)*10 + num < 12)
+	        num += (date->wMonth%10)*10;
+	    date->wMonth = wrap(date->wMonth, num-date->wMonth, 1, 12);
+	    num = date->wDay;
+	    /* fall through */
+	case ONEDIGITDAY:
+	case TWODIGITDAY:
+	case THREECHARDAY:
+	case FULLDAY:
+	    if(num < 10 && (date->wDay%10)*10 + num < MONTHCAL_MonthLength(date->wMonth, date->wYear))
+	        num += (date->wDay%10)*10;
+	    date->wDay = wrap(date->wDay, num-date->wDay, 1, MONTHCAL_MonthLength(date->wMonth, date->wYear));
+	    break;
+	case ONEDIGIT12HOUR:
+	case TWODIGIT12HOUR:
+	    if((date->wHour%10)*10 + num < 12)
+	        num += (date->wHour%10)*10;
+	case ONEDIGIT24HOUR:
+	case TWODIGIT24HOUR:
+	    if((date->wHour%10)*10 + num < 24 && num<10)
+	        num += (date->wHour%10)*10;
+	    date->wHour = wrap(date->wHour, num-date->wHour, 0, 23);
+	    break;
+	case ONEDIGITMINUTE:
+	case TWODIGITMINUTE:
+	    if((date->wMinute%10)*10 + num < 60)
+	        num += (date->wMinute%10)*10;
+	    date->wMinute = wrap(date->wMinute, num-date->wMinute, 0, 59);
+	    break;
+	case ONEDIGITSECOND:
+	case TWODIGITSECOND:
+	    if((date->wSecond%10)*10 + num < 60)
+	        num += (date->wSecond%10)*10;
+	    date->wSecond = wrap(date->wSecond, num-date->wSecond, 0, 59);
+	    break;
+	case FORMATCALLBACK:
+	    FIXME ("Not implemented\n");
+	    break;
+    }
+
+    /* FYI: On 1752/9/14 the calendar changed and England and the
+     * American colonies changed to the Gregorian calendar. This change
+     * involved having September 14th follow September 2nd. So no date
+     * algorithm works before that date.
+     */
+    if (10000 * date->wYear + 100 * date->wMonth + date->wDay < 17520914) {
+	date->wYear = 1752;
+    	date->wMonth = 9;
+	date->wDay = 14;
+	date->wSecond = 0;
+	date->wMinute = 0;
+	date->wHour = 0;
+    }
+}
+
+static void
 DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
 {
     SYSTEMTIME *date = &infoPtr->date;
@@ -962,6 +1037,33 @@
 	    DATETIME_IncreaseField (infoPtr, fieldNum, INT_MAX);
 	    DATETIME_SendDateTimeChangeNotify (infoPtr);
 	    break;
+    	case VK_NUMPAD0:
+    	case VK_NUMPAD1:
+    	case VK_NUMPAD2:
+    	case VK_NUMPAD3:
+    	case VK_NUMPAD4:
+    	case VK_NUMPAD5:
+    	case VK_NUMPAD6:
+    	case VK_NUMPAD7:
+    	case VK_NUMPAD8:
+    	case VK_NUMPAD9:
+	    DATETIME_EditField (infoPtr, fieldNum, vkCode-VK_NUMPAD0);
+	    DATETIME_SendDateTimeChangeNotify (infoPtr);
+	    break;
+    	case (WORD)'0':
+    	case (WORD)'1':
+    	case (WORD)'2':
+    	case (WORD)'3':
+    	case (WORD)'4':
+    	case (WORD)'5':
+    	case (WORD)'6':
+    	case (WORD)'7':
+    	case (WORD)'8':
+    	case (WORD)'9':
+	    DATETIME_EditField (infoPtr, fieldNum, vkCode-(WORD)('0'));
+	    DATETIME_SendDateTimeChangeNotify (infoPtr);
+	    break;
+
 	case VK_LEFT:
 	    do {
 		if (infoPtr->select == 0) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: siim04.vcf
Type: text/x-vcard
Size: 165 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-patches/attachments/20060106/a8363aeb/siim04-0001.vcf


More information about the wine-patches mailing list