[PATCH 5/6] Use locale data to compute field widthes for day and month

Nikolay Sivov bunglehead at gmail.com
Thu Oct 8 16:19:33 CDT 2009


---
 dlls/comctl32/datetime.c |   74 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 58 insertions(+), 16 deletions(-)

diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c
index b21eb0f..acf0b08 100644
--- a/dlls/comctl32/datetime.c
+++ b/dlls/comctl32/datetime.c
@@ -543,7 +543,7 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
 
 
 static void
-DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *fieldWidthPtr)
+DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *width)
 {
     /* fields are a fixed width, determined by the largest possible string */
     /* presumably, these widths should be language dependent */
@@ -552,10 +552,6 @@ DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHO
     static const WCHAR fld_d4W[] = { '2', '2', '2', '2', 0 };
     static const WCHAR fld_am1[] = { 'A', 0 };
     static const WCHAR fld_am2[] = { 'A', 'M', 0 };
-    static const WCHAR fld_day[] = { 'W', 'e', 'd', 'n', 'e', 's', 'd', 'a', 'y', 0 };
-    static const WCHAR fld_day3[] = { 'W', 'e', 'd', 0 };
-    static const WCHAR fld_mon[] = { 'S', 'e', 'p', 't', 'e', 'm', 'b', 'e', 'r', 0 };
-    static const WCHAR fld_mon3[] = { 'D', 'e', 'c', 0 };
     int spec;
     WCHAR buffer[80];
     LPCWSTR bufptr;
@@ -602,18 +598,64 @@ DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHO
 	    case FULLYEAR:
 	        bufptr = fld_d4W;
 	        break;
-	    case THREECHARDAY:
-	        bufptr = fld_day3;
-	        break;
-	    case FULLDAY:
-	        bufptr = fld_day;
-	        break;
 	    case THREECHARMONTH:
-	        bufptr = fld_mon3;
-	        break;
 	    case FULLMONTH:
-	        bufptr = fld_mon;
-	        break;
+	    case THREECHARDAY:
+	    case FULLDAY:
+	    {
+		static const WCHAR fld_day[] = {'W','e','d','n','e','s','d','a','y',0};
+		static const WCHAR fld_abbrday[] = {'W','e','d',0};
+		static const WCHAR fld_mon[] = {'S','e','p','t','e','m','b','e','r',0};
+		static const WCHAR fld_abbrmon[] = {'D','e','c',0};
+
+		const WCHAR *fall;
+		LCTYPE lctype;
+		INT i, max_count;
+		LONG cx;
+
+		/* choose locale data type and fallback string */
+		switch (spec) {
+		case THREECHARDAY:
+		    fall   = fld_abbrday;
+		    lctype = LOCALE_SABBREVDAYNAME1;
+		    max_count = 7;
+		    break;
+		case FULLDAY:
+		    fall   = fld_day;
+		    lctype = LOCALE_SDAYNAME1;
+		    max_count = 7;
+		    break;
+		case THREECHARMONTH:
+		    fall   = fld_abbrmon;
+		    lctype = LOCALE_SABBREVMONTHNAME1;
+		    max_count = 12;
+		    break;
+		case FULLMONTH:
+		    fall   = fld_mon;
+		    lctype = LOCALE_SMONTHNAME1;
+		    max_count = 12;
+		    break;
+		}
+
+		cx = 0;
+		for (i = 0; i < max_count; i++)
+		{
+		    if(GetLocaleInfoW(LOCALE_USER_DEFAULT, lctype + i,
+			buffer, lstrlenW(buffer)))
+		    {
+			GetTextExtentPoint32W(hdc, buffer, lstrlenW(buffer), &size);
+			if (size.cx > cx) cx = size.cx;
+		    }
+		    else /* locale independent fallback on failure */
+		    {
+		        GetTextExtentPoint32W(hdc, fall, lstrlenW(fall), &size);
+			cx = size.cx;
+          	        break;
+		    }
+		}
+		*width = cx;
+		return;
+	    }
 	    case ONELETTERAMPM:
 	        bufptr = fld_am1;
 	        break;
@@ -626,7 +668,7 @@ DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHO
         }
     }
     GetTextExtentPoint32W (hdc, bufptr, strlenW(bufptr), &size);
-    *fieldWidthPtr = size.cx;
+    *width = size.cx;
 }
 
 static void 
-- 
1.5.6.5


--=-2BByLg1uWOKokvIizGQt--




More information about the wine-patches mailing list