Toolbar cleanup regarding istring

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Fri Jan 18 11:25:30 CST 2002


Hallo,

appended patch clean up the meaning of istring in the TBUTTON_INFO
structure. It is either an index into the string pool or a string pointer.
SetButtonInfo sets the string unconditional, InsertButton checks whether the
passed istring is an index or a string and reacts acordingly. Also I use the
STR_[Get|Set]Ptr where I think they are appropriate.

This makes the gradient sidebar demo
http://www.codeproject.com/wtl/sidebarmenu.asp display strings in the toolbar

Changelog:
	dll/commctrl/toolbar.c
	Consistant usage of istring, use STR_[Get|Set]Ptr where appropriate

Bye

--
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Free Software: If you contribute nothing, expect nothing
--
Index: wine/dlls/comctl32/toolbar.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/toolbar.c,v
retrieving revision 1.100
diff -u -r1.100 toolbar.c
--- wine/dlls/comctl32/toolbar.c	14 Jan 2002 18:33:17 -0000	1.100
+++ wine/dlls/comctl32/toolbar.c	18 Jan 2002 17:11:02 -0000
@@ -148,13 +148,28 @@
 #define TOOLBAR_HasDropDownArrows(exStyle) ((exStyle & TBSTYLE_EX_DRAWDDARROWS) ? TRUE : FALSE)
 
 
+static LPWSTR
+TOOLBAR_GetText(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr)
+{
+    LPWSTR lpText = NULL;
+
+    /* FIXME: iString == -1 is undocumented */
+    if ((HIWORD(btnPtr->iString) != 0) && (btnPtr->iString != -1))
+        lpText = (LPWSTR)btnPtr->iString;
+    else if ((btnPtr->iString >= 0) && (btnPtr->iString < infoPtr->nNumStrings))
+        lpText = infoPtr->strings[btnPtr->iString];
+    
+    return lpText;
+}
+
 static void
 TOOLBAR_DumpButton(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *bP, INT btn_num, BOOL internal)
 {
     if (TRACE_ON(toolbar)){
-	TRACE("button %d id %d, bitmap=%d, state=%02x, style=%02x, data=%08lx, string=%d\n",
+	TRACE("button %d id %d, bitmap=%d, state=%02x, style=%02x, data=%08lx, stringid=%x\n",
 	      btn_num, bP->idCommand,
 	      bP->iBitmap, bP->fsState, bP->fsStyle, bP->dwData, bP->iString);
+	TRACE("string %s\n", debugstr_w(TOOLBAR_GetText(infoPtr,bP)));
 	if (internal)
 	    TRACE("button %d id %d, hot=%s, row=%d, rect=(%d,%d)-(%d,%d)\n",
 		  btn_num, bP->idCommand,
@@ -226,20 +241,6 @@
 			     (WPARAM) nmhdr->idFrom, (LPARAM)nmhdr);
 }
 
-static LPWSTR
-TOOLBAR_GetText(TOOLBAR_INFO *infoPtr, TBUTTON_INFO *btnPtr)
-{
-    LPWSTR lpText = NULL;
-
-    /* FIXME: iString == -1 is undocumented */
-    if ((HIWORD(btnPtr->iString) != 0) && (btnPtr->iString != -1))
-        lpText = (LPWSTR)btnPtr->iString;
-    else if ((btnPtr->iString >= 0) && (btnPtr->iString < infoPtr->nNumStrings))
-        lpText = infoPtr->strings[btnPtr->iString];
-    
-    return lpText;
-}
-
 /***********************************************************************
 * 		TOOLBAR_GetBitmapIndex
 *
@@ -443,7 +444,7 @@
     /* get a pointer to the text */
     lpText = TOOLBAR_GetText(infoPtr, btnPtr);
 
-    TRACE ("lpText: %s\n", debugstr_w(lpText));
+    TRACE ("Stringtext: %s\n", debugstr_w(lpText));
 
     /* draw text */
     if (lpText) {
@@ -814,11 +815,9 @@
     lpSize->cx = 0;
     lpSize->cy = 0;
 
-    if (!(btnPtr->fsState & TBSTATE_HIDDEN) &&
-         (btnPtr->iString > -1) &&
-         (btnPtr->iString < infoPtr->nNumStrings)) 
+    if (!(btnPtr->fsState & TBSTATE_HIDDEN) ) 
     {
-        LPWSTR lpText = infoPtr->strings[btnPtr->iString];
+        LPWSTR lpText = TOOLBAR_GetText(infoPtr, btnPtr);
 
 	/* first get size of all the text */
         GetTextExtentPoint32W (hdc, lpText, strlenW (lpText), lpSize);
@@ -2154,7 +2153,7 @@
 
     if ((wParam) && (HIWORD(lParam) == 0)) {
 	char szString[256];
-	INT len, lenW;
+	INT len;
 	TRACE("adding string from resource!\n");
 
 	len = LoadStringA ((HINSTANCE)wParam, (UINT)lParam,
@@ -2175,15 +2174,13 @@
 	    COMCTL32_Free (oldStrings);
 	}
 
-        lenW = MultiByteToWideChar( CP_ACP, 0, szString, -1, NULL, 0 );
-        infoPtr->strings[infoPtr->nNumStrings] = COMCTL32_Alloc (sizeof(WCHAR)*lenW);
-        MultiByteToWideChar( CP_ACP, 0, szString, -1,
-                             infoPtr->strings[infoPtr->nNumStrings], lenW );
+        /*COMCTL32_Alloc zeros out the allocated memory*/
+        Str_SetPtrAtoW (&infoPtr->strings[infoPtr->nNumStrings], szString );
 	infoPtr->nNumStrings++;
     }
     else {
 	LPSTR p = (LPSTR)lParam;
-	INT len, lenW;
+	INT len;
 
 	if (p == NULL)
 	    return -1;
@@ -2207,10 +2204,7 @@
 		COMCTL32_Free (oldStrings);
 	    }
 
-            lenW = MultiByteToWideChar( CP_ACP, 0, p, -1, NULL, 0 );
-            infoPtr->strings[infoPtr->nNumStrings] = COMCTL32_Alloc (sizeof(WCHAR)*lenW);
-            MultiByteToWideChar( CP_ACP, 0, p, -1,
-                                 infoPtr->strings[infoPtr->nNumStrings], lenW );
+            Str_SetPtrAtoW (&infoPtr->strings[infoPtr->nNumStrings], p );
 	    infoPtr->nNumStrings++;
 
 	    p += (len+1);
@@ -2284,9 +2278,7 @@
                 COMCTL32_Free (oldStrings);
             }
 
-            infoPtr->strings[infoPtr->nNumStrings] =
-                COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
-            strcpyW (infoPtr->strings[infoPtr->nNumStrings], szString);
+            Str_SetPtrW (&infoPtr->strings[infoPtr->nNumStrings], szString);
             infoPtr->nNumStrings++;
         }
     }
@@ -2315,9 +2307,7 @@
 		COMCTL32_Free (oldStrings);
 	    }
 
-	    infoPtr->strings[infoPtr->nNumStrings] =
-		COMCTL32_Alloc (sizeof(WCHAR)*(len+1));
-	    strcpyW (infoPtr->strings[infoPtr->nNumStrings], p);
+	    Str_SetPtrW (&infoPtr->strings[infoPtr->nNumStrings], p);
 	    infoPtr->nNumStrings++;
 
 	    p += (len+1);
@@ -2723,14 +2713,9 @@
     if (lpTbInfo->dwMask & TBIF_STYLE)
 	lpTbInfo->fsStyle = btnPtr->fsStyle;
      if (lpTbInfo->dwMask & TBIF_TEXT) {
-         if ((btnPtr->iString >= 0) && (btnPtr->iString < infoPtr->nNumStrings))
-         {	
-             if (!WideCharToMultiByte( CP_ACP, 0, (LPWSTR)infoPtr->strings[btnPtr->iString], -1,
-                                       lpTbInfo->pszText, lpTbInfo->cchText, NULL, NULL ))
-                 lpTbInfo->pszText[lpTbInfo->cchText-1] = 0;
+         LPWSTR lpText = TOOLBAR_GetText(infoPtr,btnPtr);
+	 Str_GetPtrWtoA (lpText, lpTbInfo->pszText,lpTbInfo->cchText);
          }
-         else lpTbInfo->pszText[0]=0;
-    }
     return nIndex;
 }
 
@@ -2770,10 +2755,8 @@
     if (lpTbInfo->dwMask & TBIF_STYLE)
 	lpTbInfo->fsStyle = btnPtr->fsStyle;
     if (lpTbInfo->dwMask & TBIF_TEXT) {
-	if ((btnPtr->iString >= 0) || (btnPtr->iString < infoPtr->nNumStrings))
-	    lstrcpynW (lpTbInfo->pszText,
-		       (LPWSTR)infoPtr->strings[btnPtr->iString],
-		       lpTbInfo->cchText);
+	LPWSTR lpText = TOOLBAR_GetText(infoPtr,btnPtr);
+	Str_GetPtrW (lpText,lpTbInfo->pszText,lpTbInfo->cchText);
     }
 
     return nIndex;
@@ -2797,23 +2780,19 @@
 TOOLBAR_GetButtonTextA (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
-    INT nIndex, nStringIndex;
+    INT nIndex;
+    LPWSTR lpText;
 
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
-    if (nIndex == -1)
+    if (lParam == 0)
 	return -1;
 
-    nStringIndex = infoPtr->buttons[nIndex].iString;
-
-    TRACE("index=%d stringIndex=%d\n", nIndex, nStringIndex);
-
-    if ((nStringIndex < 0) || (nStringIndex >= infoPtr->nNumStrings))
+    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+    if (nIndex == -1)
 	return -1;
 
-    if (lParam == 0)
-	return -1;
+    lpText = TOOLBAR_GetText(infoPtr,&infoPtr->buttons[nIndex]);
 
-    return WideCharToMultiByte( CP_ACP, 0, (LPWSTR)infoPtr->strings[nStringIndex], -1,
+    return WideCharToMultiByte( CP_ACP, 0, lpText, -1,
                                 (LPSTR)lParam, 0x7fffffff, NULL, NULL ) - 1;
 }
 
@@ -2822,25 +2801,21 @@
 TOOLBAR_GetButtonTextW (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
     TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd);
-    INT nIndex, nStringIndex;
+    INT nIndex;
+    LPWSTR lpText;
 
-    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
-    if (nIndex == -1)
+    if (lParam == 0)
 	return -1;
 
-    nStringIndex = infoPtr->buttons[nIndex].iString;
-
-    TRACE("index=%d stringIndex=%d\n", nIndex, nStringIndex);
-
-    if ((nStringIndex < 0) || (nStringIndex >= infoPtr->nNumStrings))
+    nIndex = TOOLBAR_GetButtonIndex (infoPtr, (INT)wParam, FALSE);
+    if (nIndex == -1)
 	return -1;
 
-    if (lParam == 0)
-	return -1;
+    lpText = TOOLBAR_GetText(infoPtr,&infoPtr->buttons[nIndex]);
 
-    strcpyW ((LPWSTR)lParam, (LPWSTR)infoPtr->strings[nStringIndex]);
+    strcpyW ((LPWSTR)lParam, lpText);
 
-    return strlenW ((LPWSTR)infoPtr->strings[nStringIndex]);
+    return strlenW (lpText);
 }
 
 
@@ -3163,26 +3138,18 @@
 		nIndex * sizeof(TBUTTON_INFO));
     }
 
-    /* if passed string and not index, then add string */
-    if(HIWORD(lpTbb->iString) && lpTbb->iString!=-1) {
-	int	len;
-	LPSTR	ptr;
-
-	len = strlen((char*)lpTbb->iString) + 2;
-	ptr = COMCTL32_Alloc(len*sizeof(char));
-	strcpy(ptr, (char*)lpTbb->iString);
-	ptr[len - 1] = 0; /* ended by two '\0' */
-	lpTbb->iString = TOOLBAR_AddStringA(hwnd, 0, (LPARAM)ptr);
-	COMCTL32_Free(ptr);
-    }
-
     /* insert new button */
     infoPtr->buttons[nIndex].iBitmap   = lpTbb->iBitmap;
     infoPtr->buttons[nIndex].idCommand = lpTbb->idCommand;
     infoPtr->buttons[nIndex].fsState   = lpTbb->fsState;
     infoPtr->buttons[nIndex].fsStyle   = lpTbb->fsStyle;
     infoPtr->buttons[nIndex].dwData    = lpTbb->dwData;
-    infoPtr->buttons[nIndex].iString   = lpTbb->iString;
+    /* if passed string and not index, then add string */
+    if(HIWORD(lpTbb->iString) && lpTbb->iString!=-1) {
+        Str_SetPtrAtoW ((LPWSTR *)&infoPtr->buttons[nIndex].iString, (LPCSTR )lpTbb->iString);
+    }
+    else
+        infoPtr->buttons[nIndex].iString   = lpTbb->iString;
 
     if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) {
 	TTTOOLINFOA ti;
@@ -3242,18 +3209,6 @@
 		nIndex * sizeof(TBUTTON_INFO));
     }
 
-    /* if passed string and not index, then add string */
-    if(HIWORD(lpTbb->iString) && lpTbb->iString!=-1) {
-	int	len;
-	LPWSTR	ptr;
-
-	len = strlenW((WCHAR*)lpTbb->iString) + 2;
-	ptr = COMCTL32_Alloc(len*sizeof(WCHAR));
-	strcpyW(ptr, (WCHAR*)lpTbb->iString);
-	ptr[len - 1] = 0; /* ended by two '\0' */
-	lpTbb->iString = TOOLBAR_AddStringW(hwnd, 0, (LPARAM)ptr);
-	COMCTL32_Free(ptr);
-    }
 
     /* insert new button */
     infoPtr->buttons[nIndex].iBitmap   = lpTbb->iBitmap;
@@ -3261,7 +3216,12 @@
     infoPtr->buttons[nIndex].fsState   = lpTbb->fsState;
     infoPtr->buttons[nIndex].fsStyle   = lpTbb->fsStyle;
     infoPtr->buttons[nIndex].dwData    = lpTbb->dwData;
-    infoPtr->buttons[nIndex].iString   = lpTbb->iString;
+    /* if passed string and not index, then add string */
+    if(HIWORD(lpTbb->iString) && lpTbb->iString!=-1) {
+        Str_SetPtrW ((LPWSTR *)&infoPtr->buttons[nIndex].iString, (LPWSTR)lpTbb->iString);
+    }
+    else
+        infoPtr->buttons[nIndex].iString   = lpTbb->iString;
 
     if ((infoPtr->hwndToolTip) && !(lpTbb->fsStyle & TBSTYLE_SEP)) {
 	TTTOOLINFOW ti;
@@ -3542,21 +3502,13 @@
     if (lptbbi->dwMask & TBIF_STYLE)
 	btnPtr->fsStyle = lptbbi->fsStyle;
 
-    if (lptbbi->dwMask & TBIF_TEXT) {
-	if ((btnPtr->iString >= 0) || 
-	    (btnPtr->iString < infoPtr->nNumStrings)) {
-	   TRACE("Ooooooch\n");
-#if 0
-	    WCHAR **lpString = &infoPtr->strings[btnPtr->iString];
-	    INT len = lstrlenA (lptbbi->pszText);
-	    *lpString = COMCTL32_ReAlloc (lpString, sizeof(WCHAR)*(len+1));
-#endif
-
-	    /* this is the ultimate sollution */
-/*	    Str_SetPtrA (&infoPtr->strings[btnPtr->iString], lptbbi->pszText); */
-	}
+    if ((lptbbi->dwMask & TBIF_TEXT) && ((INT)lptbbi->pszText != -1)) {
+        if ((HIWORD(btnPtr->iString) == 0) || (btnPtr->iString == -1))
+	    /* iString is index, zero it to make Str_SetPtr succeed */
+	    btnPtr->iString=0;
+      
+         Str_SetPtrAtoW ((LPWSTR *)&btnPtr->iString, lptbbi->pszText);
     }
-
     return TRUE;
 }
 
@@ -3593,20 +3545,12 @@
     if (lptbbi->dwMask & TBIF_STYLE)
 	btnPtr->fsStyle = lptbbi->fsStyle;
 
-    if (lptbbi->dwMask & TBIF_TEXT) {
-	if ((btnPtr->iString >= 0) ||
-	    (btnPtr->iString < infoPtr->nNumStrings)) {
-#if 0
-	    WCHAR **lpString = &infoPtr->strings[btnPtr->iString];
-	    INT len = lstrlenW (lptbbi->pszText);
-	    *lpString = COMCTL32_ReAlloc (lpString, sizeof(WCHAR)*(len+1));
-#endif
-
-	    /* this is the ultimate solution */
-/*	    Str_SetPtrA (&infoPtr->strings[btnPtr->iString], lptbbi->pszText); */
-	}
+    if ((lptbbi->dwMask & TBIF_TEXT) && ((INT)lptbbi->pszText != -1)) {
+        if ((HIWORD(btnPtr->iString) == 0) || (btnPtr->iString == -1))
+	    /* iString is index, zero it to make Str_SetPtr succeed */
+	    btnPtr->iString=0;
+        Str_SetPtrW ((LPWSTR *)&btnPtr->iString, lptbbi->pszText);
     }
-
     return TRUE;
 }
 




More information about the wine-patches mailing list