treeview: unicodification

Huw D M Davies h.davies1 at physics.ox.ac.uk
Tue Nov 25 08:44:13 CST 2003


        Huw Davies <huw at codeweavers.com>
        Unicodification.  Based on a patch by Aric Stewart.
-- 
Huw Davies
huw at codeweavers.com
Index: treeview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/treeview.c,v
retrieving revision 1.134
diff -u -r1.134 treeview.c
--- treeview.c	21 Nov 2003 21:30:20 -0000	1.134
+++ treeview.c	25 Nov 2003 14:36:35 -0000
@@ -3,6 +3,7 @@
  * Copyright 1998 Eric Kohl <ekohl at abo.rhein-zeitung.de>
  * Copyright 1998,1999 Alex Priem <alexp at sci.kun.nl>
  * Copyright 1999 Sylvain St-Germain
+ * Copyright 2002 CodeWeavers, Aric Stewart
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -57,6 +58,7 @@
 #include "winnls.h"
 #include "commctrl.h"
 #include "comctl32.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 /* internal structures */
@@ -66,7 +68,7 @@
   UINT      callbackMask;
   UINT      state;
   UINT      stateMask;
-  LPSTR     pszText;
+  LPWSTR    pszText;
   int       cchTextMax;
   int       iImage;
   int       iSelectedImage;
@@ -137,7 +139,6 @@
   BOOL          bLabelChanged;
 
   BOOL          bNtfUnicode;    /* TRUE if should send NOTIFY with W */
-  BOOL          bUnicode;       /* set by CCM_SETUNICODEFORMAT       */
   HIMAGELIST    himlNormal;
   int           normalImageHeight;
   int           normalImageWidth;
@@ -149,7 +150,7 @@
   DWORD lastKeyPressTimestamp; /* Added */
   WPARAM charCode; /* Added */
   INT nSearchParamLength; /* Added */
-  CHAR szSearchParam[ MAX_PATH ]; /* Added */
+  WCHAR szSearchParam[ MAX_PATH ]; /* Added */
 } TREEVIEW_INFO;
 
 
@@ -224,7 +225,7 @@
 static TREEVIEW_INFO *
 TREEVIEW_GetInfoPtr(HWND hwnd)
 {
-    return (TREEVIEW_INFO *)GetWindowLongA(hwnd, 0);
+    return (TREEVIEW_INFO *)GetWindowLongW(hwnd, 0);
 }
 
 /* Don't call this. Nothing wants an item index. */
@@ -272,9 +273,9 @@
 TREEVIEW_ItemName(TREEVIEW_ITEM *item)
 {
     if (item == NULL) return "<null item>";
-    if (item->pszText == LPSTR_TEXTCALLBACKA) return "<callback>";
+    if (item->pszText == LPSTR_TEXTCALLBACKW) return "<callback>";
     if (item->pszText == NULL) return "<null>";
-    return item->pszText;
+    return debugstr_w(item->pszText);
 }
 
 /* An item is not a child of itself. */
@@ -457,7 +458,7 @@
 
     TRACE("%d\n", code);
     nmhdr.hwndFrom = hwnd;
-    nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
+    nmhdr.idFrom = GetWindowLongW(hwnd, GWL_ID);
     nmhdr.code = get_notifycode(infoPtr, code);
 
     return (BOOL)TREEVIEW_SendRealNotify(infoPtr,
@@ -465,33 +466,37 @@
 }
 
 static VOID
-TREEVIEW_TVItemFromItem(TREEVIEW_INFO *infoPtr, UINT mask, TVITEMA *tvItem, TREEVIEW_ITEM *item)
+TREEVIEW_TVItemFromItem(TREEVIEW_INFO *infoPtr, UINT mask, TVITEMW *tvItem, TREEVIEW_ITEM *item)
 {
     tvItem->mask = mask;
     tvItem->hItem = item;
     tvItem->state = item->state;
     tvItem->stateMask = 0;
     tvItem->iImage = item->iImage;
-    tvItem->cchTextMax = item->cchTextMax;
     tvItem->iImage = item->iImage;
     tvItem->iSelectedImage = item->iSelectedImage;
     tvItem->cChildren = item->cChildren;
     tvItem->lParam = item->lParam;
 
-    /* **** **** **** **** WARNING **** **** **** **** */
-    /* This control stores all the data in A format    */
-    /* we will convert it to W if the notify format    */
-    /* is Unicode.                                     */
-    /* **** **** **** **** WARNING **** **** **** **** */
-    if (infoPtr->bNtfUnicode) {
-        INT len = MultiByteToWideChar( CP_ACP, 0, item->pszText, -1, NULL, 0 );
-        if (len > 1) {
-            tvItem->pszText = (LPSTR)Alloc (len*sizeof(WCHAR));
-            MultiByteToWideChar( CP_ACP, 0, item->pszText, -1, (LPWSTR)tvItem->pszText, len*sizeof(WCHAR) );
+    if(mask & TVIF_TEXT)
+    {
+        if (!infoPtr->bNtfUnicode)
+        {
+            tvItem->cchTextMax = WideCharToMultiByte( CP_ACP, 0, item->pszText, -1, NULL, 0, NULL, NULL );
+            tvItem->pszText = Alloc (tvItem->cchTextMax);
+            WideCharToMultiByte( CP_ACP, 0, item->pszText, -1, (LPSTR)tvItem->pszText, tvItem->cchTextMax, 0, 0 );
 	}
+        else
+        {
+            tvItem->cchTextMax = item->cchTextMax;
+            tvItem->pszText = item->pszText;
+        }
     }
     else
-	tvItem->pszText = item->pszText;
+    {
+        tvItem->cchTextMax = 0;
+        tvItem->pszText = NULL;
+    }
 }
 
 static BOOL
@@ -499,7 +504,7 @@
 			    UINT mask, HTREEITEM oldItem, HTREEITEM newItem)
 {
     HWND hwnd = infoPtr->hwnd;
-    NMTREEVIEWA nmhdr;
+    NMTREEVIEWW nmhdr;
     BOOL ret;
 
     TRACE("code:%d action:%x olditem:%p newitem:%p\n",
@@ -508,7 +513,7 @@
     ZeroMemory(&nmhdr, sizeof(NMTREEVIEWA));
 
     nmhdr.hdr.hwndFrom = hwnd;
-    nmhdr.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
+    nmhdr.hdr.idFrom = GetWindowLongW(hwnd, GWL_ID);
     nmhdr.hdr.code = get_notifycode(infoPtr, code);
     nmhdr.action = action;
 
@@ -522,9 +527,10 @@
     nmhdr.ptDrag.y = 0;
 
     ret = (BOOL)TREEVIEW_SendRealNotify(infoPtr,
-			      (WPARAM)GetWindowLongA(hwnd, GWL_ID),
+                              (WPARAM)nmhdr.hdr.idFrom,
 			      (LPARAM)&nmhdr);
-    if (infoPtr->bNtfUnicode) {
+    if (!infoPtr->bNtfUnicode)
+    {
 	Free(nmhdr.itemOld.pszText);
 	Free(nmhdr.itemNew.pszText);
     }
@@ -536,12 +542,12 @@
 			       HTREEITEM dragItem, POINT pt)
 {
     HWND hwnd = infoPtr->hwnd;
-    NMTREEVIEWA nmhdr;
+    NMTREEVIEWW nmhdr;
 
     TRACE("code:%d dragitem:%p\n", code, dragItem);
 
     nmhdr.hdr.hwndFrom = hwnd;
-    nmhdr.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
+    nmhdr.hdr.idFrom = GetWindowLongW(hwnd, GWL_ID);
     nmhdr.hdr.code = get_notifycode(infoPtr, code);
     nmhdr.action = 0;
     nmhdr.itemNew.mask = TVIF_STATE | TVIF_PARAM | TVIF_HANDLE;
@@ -553,7 +559,7 @@
     nmhdr.ptDrag.y = pt.y;
 
     return (BOOL)TREEVIEW_SendRealNotify(infoPtr,
-			      (WPARAM)GetWindowLongA(hwnd, GWL_ID),
+			      (WPARAM)nmhdr.hdr.idFrom,
 			      (LPARAM)&nmhdr);
 }
 
@@ -570,7 +576,7 @@
 
     nmcd = &nmcdhdr.nmcd;
     nmcd->hdr.hwndFrom = hwnd;
-    nmcd->hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
+    nmcd->hdr.idFrom = GetWindowLongW(hwnd, GWL_ID);
     nmcd->hdr.code = NM_CUSTOMDRAW;
     nmcd->dwDrawStage = dwDrawStage;
     nmcd->hdc = hdc;
@@ -583,7 +589,7 @@
     nmcdhdr.iLevel = 0;
 
     return (BOOL)TREEVIEW_SendRealNotify(infoPtr,
-			      (WPARAM)GetWindowLongA(hwnd, GWL_ID),
+			      (WPARAM)nmcd->hdr.idFrom,
 			      (LPARAM)&nmcdhdr);
 }
 
@@ -614,7 +620,7 @@
 
     nmcd = &nmcdhdr.nmcd;
     nmcd->hdr.hwndFrom = hwnd;
-    nmcd->hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
+    nmcd->hdr.idFrom = GetWindowLongW(hwnd, GWL_ID);
     nmcd->hdr.code = NM_CUSTOMDRAW;
     nmcd->dwDrawStage = dwDrawStage;
     nmcd->hdc = hdc;
@@ -631,7 +637,7 @@
 	  nmcd->uItemState, nmcd->lItemlParam);
 
     retval = TREEVIEW_SendRealNotify(infoPtr,
-			  (WPARAM)GetWindowLongA(hwnd, GWL_ID),
+                          (WPARAM)nmcd->hdr.idFrom,
 			  (LPARAM)&nmcdhdr);
 
     infoPtr->clrText = nmcdhdr.clrText;
@@ -643,40 +649,21 @@
 TREEVIEW_BeginLabelEditNotify(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *editItem)
 {
     HWND hwnd = infoPtr->hwnd;
-    LPSTR allocated = NULL;
-    NMTVDISPINFOA tvdi;
+    NMTVDISPINFOW tvdi;
     BOOL ret;
 
     tvdi.hdr.hwndFrom = hwnd;
-    tvdi.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
+    tvdi.hdr.idFrom = GetWindowLongW(hwnd, GWL_ID);
     tvdi.hdr.code = get_notifycode(infoPtr, TVN_BEGINLABELEDITW);
 
-    tvdi.item.mask = TVIF_HANDLE | TVIF_STATE | TVIF_PARAM | TVIF_TEXT;
-    tvdi.item.hItem = editItem;
-    tvdi.item.state = editItem->state;
-    tvdi.item.lParam = editItem->lParam;
-    if (infoPtr->bNtfUnicode) {
-        INT len = MultiByteToWideChar( CP_ACP, 0, editItem->pszText, -1, NULL, 0 );
-        if (len > 1) {
-            tvdi.item.pszText = allocated = (LPSTR)Alloc (len*sizeof(WCHAR));
-            MultiByteToWideChar( CP_ACP, 0, editItem->pszText, -1, (LPWSTR)tvdi.item.pszText, len*sizeof(WCHAR) );
-	    tvdi.item.cchTextMax = len*sizeof(WCHAR);
-	}
-	else {
-	    tvdi.item.pszText = editItem->pszText;  /* ??? */
-	    tvdi.item.cchTextMax = editItem->cchTextMax;  /* ??? */
-	}
-    }
-    else {
-	tvdi.item.pszText = editItem->pszText;
-	tvdi.item.cchTextMax = editItem->cchTextMax;
-    }
+    TREEVIEW_TVItemFromItem(infoPtr, TVIF_HANDLE | TVIF_STATE | TVIF_PARAM | TVIF_TEXT,
+                            &tvdi.item, editItem);
+
+    ret = (BOOL)TREEVIEW_SendRealNotify(infoPtr, tvdi.hdr.idFrom, (LPARAM)&tvdi);
+
+    if (!infoPtr->bNtfUnicode)
+	Free(tvdi.item.pszText);
 
-    ret = (BOOL)TREEVIEW_SendRealNotify(infoPtr,
-					 tvdi.hdr.idFrom,
-					(LPARAM)&tvdi);
-    if (allocated)
-	Free(allocated);
     return ret;
 }
 
@@ -684,15 +671,16 @@
 TREEVIEW_UpdateDispInfo(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
 			UINT mask)
 {
-    NMTVDISPINFOA callback;
+    NMTVDISPINFOW callback;
     HWND hwnd = infoPtr->hwnd;
 
+    TRACE("mask %x callbackMask %x\n", mask, wineItem->callbackMask);
     mask &= wineItem->callbackMask;
 
     if (mask == 0) return;
 
     callback.hdr.hwndFrom         = hwnd;
-    callback.hdr.idFrom           = GetWindowLongA(hwnd, GWL_ID);
+    callback.hdr.idFrom           = GetWindowLongW(hwnd, GWL_ID);
     callback.hdr.code             = get_notifycode(infoPtr, TVN_GETDISPINFOW);
 
     /* 'state' always contains valid value, as well as 'lParam'.
@@ -718,68 +706,67 @@
     if ((mask & TVIF_TEXT) && callback.item.pszText != wineItem->pszText)
     {
 	/* Instead of copying text into our buffer user specified its own */
-	if (infoPtr->bNtfUnicode) {
+	if (!infoPtr->bNtfUnicode) {
 	    LPWSTR newText;
 	    int buflen;
-            int len = WideCharToMultiByte( CP_ACP, 0,
-					   (LPWSTR)callback.item.pszText, -1,
-                                           NULL, 0, NULL, NULL );
-	    buflen = max((len+1)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
+            int len = MultiByteToWideChar( CP_ACP, 0,
+					   (LPSTR)callback.item.pszText, -1,
+                                           NULL, 0);
+	    buflen = max((len)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
 	    newText = (LPWSTR)ReAlloc(wineItem->pszText, buflen);
 
-	    TRACE("returned wstr %s, len=%d, buflen=%d\n",
-		  debugstr_w((LPWSTR)callback.item.pszText), len, buflen);
+	    TRACE("returned str %s, len=%d, buflen=%d\n",
+		  debugstr_a((LPSTR)callback.item.pszText), len, buflen);
 
 	    if (newText)
 	    {
-		wineItem->pszText = (LPSTR)newText;
-		WideCharToMultiByte( CP_ACP, 0,
-				     (LPWSTR)callback.item.pszText, -1,
-				     wineItem->pszText, buflen,
-				     NULL, NULL );
+		wineItem->pszText = newText;
+		MultiByteToWideChar( CP_ACP, 0,
+				     (LPSTR)callback.item.pszText, -1,
+				     wineItem->pszText, buflen);
 		wineItem->cchTextMax = buflen;
 	    }
 	    /* If ReAlloc fails we have nothing to do, but keep original text */
 	}
 	else {
-	    int len = max(lstrlenA(callback.item.pszText) + 1,
+	    int len = max(lstrlenW(callback.item.pszText) + 1,
 			  TEXT_CALLBACK_SIZE);
-	    LPSTR newText = ReAlloc(wineItem->pszText, len);
+	    LPWSTR newText = ReAlloc(wineItem->pszText, len);
 
-	    TRACE("returned str %s, len=%d\n",
-		  debugstr_a(callback.item.pszText), len);
+	    TRACE("returned wstr %s, len=%d\n",
+		  debugstr_w(callback.item.pszText), len);
 
 	    if (newText)
 	    {
 		wineItem->pszText = newText;
-		strcpy(wineItem->pszText, callback.item.pszText);
+		strcpyW(wineItem->pszText, callback.item.pszText);
 		wineItem->cchTextMax = len;
 	    }
 	    /* If ReAlloc fails we have nothing to do, but keep original text */
 	}
     }
     else if (mask & TVIF_TEXT) {
-	/* User put text into our buffer, that is ok unless W string */
-	if (infoPtr->bNtfUnicode) {
+	/* User put text into our buffer, that is ok unless A string */
+	if (!infoPtr->bNtfUnicode) {
 	    LPWSTR newText;
-	    LPSTR oldText = NULL;
+	    LPWSTR oldText = NULL;
 	    int buflen;
-            int len = WideCharToMultiByte( CP_ACP, 0,
-					   (LPWSTR)callback.item.pszText, -1,
-                                           NULL, 0, NULL, NULL );
-	    buflen = max((len+1)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
+            int len = MultiByteToWideChar( CP_ACP, 0,
+					  (LPSTR)callback.item.pszText, -1,
+                                           NULL, 0);
+	    buflen = max((len)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
 	    newText = (LPWSTR)Alloc(buflen);
 
-	    TRACE("same buffer wstr %s, len=%d, buflen=%d\n",
-		  debugstr_w((LPWSTR)callback.item.pszText), len, buflen);
+	    TRACE("same buffer str %s, len=%d, buflen=%d\n",
+		  debugstr_a((LPSTR)callback.item.pszText), len, buflen);
 
 	    if (newText)
 	    {
 		oldText = wineItem->pszText;
-		wineItem->pszText = (LPSTR)newText;
-		WideCharToMultiByte( CP_ACP, 0,
-				     (LPWSTR)callback.item.pszText, -1,
-				     wineItem->pszText, buflen, NULL, NULL );
+		wineItem->pszText = newText;
+		MultiByteToWideChar( CP_ACP, 0,
+				     (LPSTR)callback.item.pszText, -1,
+				     wineItem->pszText, buflen);
 		wineItem->cchTextMax = buflen;
 		if (oldText)
 		    Free(oldText);
@@ -870,7 +857,7 @@
 	hOldFont = SelectObject(hdc, TREEVIEW_FontForItem(infoPtr, item));
     }
 
-    GetTextExtentPoint32A(hdc, item->pszText, strlen(item->pszText), &sz);
+    GetTextExtentPoint32W(hdc, item->pszText, strlenW(item->pszText), &sz);
     item->textWidth = sz.cx;
 
     if (hDC == 0)
@@ -1075,19 +1062,21 @@
 
 static BOOL
 TREEVIEW_DoSetItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
-		   const TVITEMEXA *tvItem)
+		   const TVITEMEXW *tvItem)
 {
     UINT callbackClear = 0;
     UINT callbackSet = 0;
 
+    TRACE("item %p\n", wineItem);
     /* Do this first in case it fails. */
     if (tvItem->mask & TVIF_TEXT)
     {
         wineItem->textWidth = 0; /* force width recalculation */
-	if (tvItem->pszText != LPSTR_TEXTCALLBACKA)
+	if (tvItem->pszText != LPSTR_TEXTCALLBACKW)
 	{
-	    int len = lstrlenA(tvItem->pszText) + 1;
-	    LPSTR newText = ReAlloc(wineItem->pszText, len);
+	    int len = lstrlenW(tvItem->pszText) + 1;
+	    LPWSTR newText = ReAlloc(wineItem->pszText,
+                                         len * sizeof(WCHAR));
 
 	    if (newText == NULL) return FALSE;
 
@@ -1095,16 +1084,16 @@
 
 	    wineItem->pszText = newText;
 	    wineItem->cchTextMax = len;
-	    lstrcpynA(wineItem->pszText, tvItem->pszText, len);
+	    lstrcpynW(wineItem->pszText, tvItem->pszText, len);
 	    TRACE("setting text %s, item %p\n",
-		  debugstr_a(wineItem->pszText), wineItem);
+		  debugstr_w(wineItem->pszText), wineItem);
 	}
 	else
 	{
 	    callbackSet |= TVIF_TEXT;
 
 	    wineItem->pszText = ReAlloc(wineItem->pszText,
-						 TEXT_CALLBACK_SIZE);
+						 TEXT_CALLBACK_SIZE * sizeof(WCHAR));
 	    wineItem->cchTextMax = TEXT_CALLBACK_SIZE;
 	    TRACE("setting callback, item %p\n",
 		  wineItem);
@@ -1155,9 +1144,6 @@
 	      tvItem->stateMask);
 	wineItem->state &= ~tvItem->stateMask;
 	wineItem->state |= (tvItem->state & tvItem->stateMask);
-
-	if (tvItem->stateMask & TVIS_BOLD)
-	  callbackSet |= TVIF_TEXT;
     }
 
     wineItem->callbackMask |= callbackSet;
@@ -1168,10 +1154,10 @@
 
 /* Note that the new item is pre-zeroed. */
 static LRESULT
-TREEVIEW_InsertItemA(TREEVIEW_INFO *infoPtr, LPARAM lParam)
+TREEVIEW_InsertItemW(TREEVIEW_INFO *infoPtr, LPARAM lParam)
 {
-    const TVINSERTSTRUCTA *ptdi = (LPTVINSERTSTRUCTA) lParam;
-    const TVITEMEXA *tvItem = &ptdi->DUMMYUNIONNAME.itemex;
+    const TVINSERTSTRUCTW *ptdi = (LPTVINSERTSTRUCTW) lParam;
+    const TVITEMEXW *tvItem = &ptdi->DUMMYUNIONNAME.itemex;
     HTREEITEM insertAfter;
     TREEVIEW_ITEM *newItem, *parentItem;
     BOOL bTextUpdated = FALSE;
@@ -1210,10 +1196,10 @@
 	}
     }
 
-    TRACE("parent %p position %p: '%s'\n", parentItem, insertAfter,
+    TRACE("parent %p position %p: %s\n", parentItem, insertAfter,
 	  (tvItem->mask & TVIF_TEXT)
-	  ? ((tvItem->pszText == LPSTR_TEXTCALLBACKA) ? "<callback>"
-	     : tvItem->pszText)
+	  ? ((tvItem->pszText == LPSTR_TEXTCALLBACKW) ? "<callback>"
+	     : debugstr_w(tvItem->pszText))
 	  : "<no label>");
 
     newItem = TREEVIEW_AllocateItem(infoPtr);
@@ -1267,7 +1253,7 @@
 		INT comp;
 
 		TREEVIEW_UpdateDispInfo(infoPtr, aChild, TVIF_TEXT);
-		comp = lstrcmpA(newItem->pszText, aChild->pszText);
+		comp = lstrcmpW(newItem->pszText, aChild->pszText);
 
 		if (comp < 0)	/* we are smaller than the current one */
 		{
@@ -1370,56 +1356,57 @@
 
 
 static LRESULT
-TREEVIEW_InsertItemW(TREEVIEW_INFO *infoPtr, LPARAM lParam)
+TREEVIEW_InsertItemA(TREEVIEW_INFO *infoPtr, LPARAM lParam)
 {
-    TVINSERTSTRUCTW *tvisW;
-    TVINSERTSTRUCTA tvisA;
+    TVINSERTSTRUCTW tvisW;
+    TVINSERTSTRUCTA *tvisA;
     LRESULT lRes;
 
-    tvisW = (LPTVINSERTSTRUCTW) lParam;
+    tvisA = (LPTVINSERTSTRUCTA) lParam;
 
-    tvisA.hParent = tvisW->hParent;
-    tvisA.hInsertAfter = tvisW->hInsertAfter;
+    tvisW.hParent = tvisA->hParent;
+    tvisW.hInsertAfter = tvisA->hInsertAfter;
 
-    tvisA.DUMMYUNIONNAME.item.mask = tvisW->DUMMYUNIONNAME.item.mask;
-    tvisA.DUMMYUNIONNAME.item.hItem = tvisW->DUMMYUNIONNAME.item.hItem;
-    tvisA.DUMMYUNIONNAME.item.state = tvisW->DUMMYUNIONNAME.item.state;
-    tvisA.DUMMYUNIONNAME.item.stateMask = tvisW->DUMMYUNIONNAME.item.stateMask;
-    tvisA.DUMMYUNIONNAME.item.cchTextMax =
-	tvisW->DUMMYUNIONNAME.item.cchTextMax;
-
-    if (tvisW->DUMMYUNIONNAME.item.pszText)
-    {
-	if (tvisW->DUMMYUNIONNAME.item.pszText != LPSTR_TEXTCALLBACKW)
-	{
-            int len = WideCharToMultiByte( CP_ACP, 0, tvisW->DUMMYUNIONNAME.item.pszText, -1,
-                                           NULL, 0, NULL, NULL );
-	    tvisA.DUMMYUNIONNAME.item.pszText = Alloc(len);
-            WideCharToMultiByte( CP_ACP, 0, tvisW->DUMMYUNIONNAME.item.pszText, -1,
-                                 tvisA.DUMMYUNIONNAME.item.pszText, len, NULL, NULL );
+    tvisW.DUMMYUNIONNAME.item.mask = tvisA->DUMMYUNIONNAME.item.mask;
+    tvisW.DUMMYUNIONNAME.item.hItem = tvisA->DUMMYUNIONNAME.item.hItem;
+    tvisW.DUMMYUNIONNAME.item.state = tvisA->DUMMYUNIONNAME.item.state;
+    tvisW.DUMMYUNIONNAME.item.stateMask = tvisA->DUMMYUNIONNAME.item.stateMask;
+    tvisW.DUMMYUNIONNAME.item.cchTextMax =
+	tvisA->DUMMYUNIONNAME.item.cchTextMax;
+
+    if ((tvisA->DUMMYUNIONNAME.item.pszText) &&
+        (tvisA->DUMMYUNIONNAME.item.mask & TVIF_TEXT))
+        
+    {
+	if (tvisA->DUMMYUNIONNAME.item.pszText != LPSTR_TEXTCALLBACKA)
+	{
+            int len = MultiByteToWideChar( CP_ACP, 0, tvisA->DUMMYUNIONNAME.item.pszText, -1,
+                                           NULL, 0 );
+	    tvisW.DUMMYUNIONNAME.item.pszText = Alloc(len * sizeof(WCHAR));
+            MultiByteToWideChar( CP_ACP, 0, tvisA->DUMMYUNIONNAME.item.pszText, -1,
+                                 tvisW.DUMMYUNIONNAME.item.pszText, len );
 	}
 	else
 	{
-	    tvisA.DUMMYUNIONNAME.item.pszText = LPSTR_TEXTCALLBACKA;
-	    tvisA.DUMMYUNIONNAME.item.cchTextMax = 0;
+	    tvisW.DUMMYUNIONNAME.item.pszText = LPSTR_TEXTCALLBACKW;
+	    tvisW.DUMMYUNIONNAME.item.cchTextMax = 0;
 	}
     }
 
-    tvisA.DUMMYUNIONNAME.item.iImage = tvisW->DUMMYUNIONNAME.item.iImage;
-    tvisA.DUMMYUNIONNAME.item.iSelectedImage =
-	tvisW->DUMMYUNIONNAME.item.iSelectedImage;
-    tvisA.DUMMYUNIONNAME.item.cChildren = tvisW->DUMMYUNIONNAME.item.cChildren;
-    tvisA.DUMMYUNIONNAME.item.lParam = tvisW->DUMMYUNIONNAME.item.lParam;
+    tvisW.DUMMYUNIONNAME.item.iImage = tvisA->DUMMYUNIONNAME.item.iImage;
+    tvisW.DUMMYUNIONNAME.item.iSelectedImage =
+	tvisA->DUMMYUNIONNAME.item.iSelectedImage;
+    tvisW.DUMMYUNIONNAME.item.cChildren = tvisA->DUMMYUNIONNAME.item.cChildren;
+    tvisW.DUMMYUNIONNAME.item.lParam = tvisA->DUMMYUNIONNAME.item.lParam;
 
-    lRes = TREEVIEW_InsertItemA(infoPtr, (LPARAM)&tvisA);
+    lRes = TREEVIEW_InsertItemW(infoPtr, (LPARAM)&tvisW);
 
-    if (tvisA.DUMMYUNIONNAME.item.pszText != LPSTR_TEXTCALLBACKA)
+    if (tvisW.DUMMYUNIONNAME.item.pszText && tvisW.DUMMYUNIONNAME.item.pszText != LPSTR_TEXTCALLBACKW)
     {
-	Free(tvisA.DUMMYUNIONNAME.item.pszText);
+	Free(tvisW.DUMMYUNIONNAME.item.pszText);
     }
 
     return lRes;
-
 }
 
 
@@ -1486,7 +1473,7 @@
 
     infoPtr->uNumItems--;
 
-    if (wineItem->pszText != LPSTR_TEXTCALLBACKA)
+    if (wineItem->pszText && wineItem->pszText != LPSTR_TEXTCALLBACKW)
 	Free(wineItem->pszText);
 
     TREEVIEW_FreeItem(infoPtr, wineItem);
@@ -1658,6 +1645,19 @@
     return (LRESULT)prevToolTip;
 }
 
+static LRESULT
+TREEVIEW_SetUnicodeFormat(TREEVIEW_INFO *infoPtr, BOOL fUnicode)
+{
+    BOOL rc = infoPtr->bNtfUnicode;
+    infoPtr->bNtfUnicode = fUnicode;
+    return rc;
+}
+
+static LRESULT
+TREEVIEW_GetUnicodeFormat(TREEVIEW_INFO *infoPtr)
+{
+     return infoPtr->bNtfUnicode;
+}
 
 static LRESULT
 TREEVIEW_GetScrollTime(TREEVIEW_INFO *infoPtr)
@@ -1753,11 +1753,11 @@
 static UINT
 TREEVIEW_NaturalHeight(TREEVIEW_INFO *infoPtr)
 {
-    TEXTMETRICA tm;
+    TEXTMETRICW tm;
     HDC hdc = GetDC(0);
     HFONT hOldFont = SelectObject(hdc, infoPtr->hFont);
 
-    GetTextMetricsA(hdc, &tm);
+    GetTextMetricsW(hdc, &tm);
 
     SelectObject(hdc, hOldFont);
     ReleaseDC(0, hdc);
@@ -2007,7 +2007,7 @@
 
 
 static LRESULT
-TREEVIEW_GetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
+TREEVIEW_GetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXW tvItem)
 {
     TREEVIEW_ITEM *wineItem;
 
@@ -2045,7 +2045,7 @@
     }
 
     if (tvItem->mask & TVIF_TEXT)
-	lstrcpynA(tvItem->pszText, wineItem->pszText, tvItem->cchTextMax);
+	lstrcpynW(tvItem->pszText, wineItem->pszText, tvItem->cchTextMax);
 
     TRACE("item <%p>, txt %p, img %p, mask %x\n",
 	  wineItem, tvItem->pszText, &tvItem->iImage, tvItem->mask);
@@ -2056,7 +2056,7 @@
 /* Beware MSDN Library Visual Studio 6.0. It says -1 on failure, 0 on success,
  * which is wrong. */
 static LRESULT
-TREEVIEW_SetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
+TREEVIEW_SetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXW tvItem)
 {
     TREEVIEW_ITEM *wineItem;
     TREEVIEW_ITEM originalItem;
@@ -2111,11 +2111,9 @@
 }
 
 static LRESULT
-TREEVIEW_GetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXW tvItem)
+TREEVIEW_GetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
 {
     TREEVIEW_ITEM *wineItem;
-    INT         iItem;
-    iItem = (INT)tvItem->hItem;
 
     wineItem = tvItem->hItem;
     if(!TREEVIEW_ValidItem (infoPtr, wineItem))
@@ -2149,57 +2147,64 @@
     }
 
     if (tvItem->mask & TVIF_TEXT) {
-        if (wineItem->pszText == LPSTR_TEXTCALLBACKA) {
-            tvItem->pszText = LPSTR_TEXTCALLBACKW;
+        if (wineItem->pszText == LPSTR_TEXTCALLBACKW) {
+            tvItem->pszText = LPSTR_TEXTCALLBACKA;
             FIXME(" GetItem called with LPSTR_TEXTCALLBACK\n");
         }
         else if (wineItem->pszText) {
 	    TRACE("orig str %s at %p\n",
-		  debugstr_a(wineItem->pszText), wineItem->pszText);
-            MultiByteToWideChar(CP_ACP, 0, wineItem->pszText,
-                                -1 , tvItem->pszText, tvItem->cchTextMax);
+		  debugstr_w(wineItem->pszText), wineItem->pszText);
+            WideCharToMultiByte(CP_ACP, 0, wineItem->pszText,
+                                -1 , tvItem->pszText, tvItem->cchTextMax, NULL, NULL);
         }
     }
 
-    TRACE("item %d<%p>, txt %p<%s>, img %p, action %x\n",
-	  iItem, tvItem, tvItem->pszText, debugstr_w(tvItem->pszText),
-	  &tvItem->iImage, tvItem->mask);
+    TRACE("item <%p>, txt %p, img %p, action %x\n",
+	  tvItem, tvItem->pszText, &tvItem->iImage, tvItem->mask);
     return TRUE;
 }
 
 static LRESULT
-TREEVIEW_SetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXW tvItem)
+TREEVIEW_SetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
 {
-    TVITEMEXA tvItemA;
+    TVITEMEXW tvItemW;
     INT len;
     LRESULT rc;
 
-    tvItemA.mask = tvItem->mask;
-    tvItemA.hItem = tvItem->hItem;
-    tvItemA.state = tvItem->state;
-    tvItemA.stateMask = tvItem->stateMask;
-    if (tvItem->mask & TVIF_TEXT) {
-	len = WideCharToMultiByte(CP_ACP, 0, tvItem->pszText, -1,
-				  NULL ,0 , NULL,NULL);
-	if (len) {
-	    len ++;
-	    tvItemA.pszText = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
-	    len = WideCharToMultiByte(CP_ACP, 0, tvItem->pszText, -1,
-				      tvItemA.pszText ,len*sizeof(WCHAR),
-				      NULL,NULL);
-	}
-	else
-	    tvItemA.pszText = NULL;
-    }
-    tvItemA.cchTextMax = tvItem->cchTextMax;
-    tvItemA.iImage = tvItem->iImage;
-    tvItemA.iSelectedImage = tvItem->iSelectedImage;
-    tvItemA.cChildren = tvItem->cChildren;
-    tvItemA.lParam = tvItem->lParam;
-    tvItemA.iIntegral = tvItem->iIntegral;
+    tvItemW.mask = tvItem->mask;
+    tvItemW.hItem = tvItem->hItem;
+    tvItemW.state = tvItem->state;
+    tvItemW.stateMask = tvItem->stateMask;
+    tvItemW.cchTextMax = 0;
+    tvItemW.pszText = 0;
 
-    rc = TREEVIEW_SetItemA(infoPtr,&tvItemA);
-    HeapFree(GetProcessHeap(),0,tvItemA.pszText);
+    if (tvItem->mask & TVIF_TEXT)
+    {
+        if(tvItem->pszText && tvItem->pszText != LPSTR_TEXTCALLBACKA)
+        {
+            len = MultiByteToWideChar(CP_ACP, 0, tvItem->pszText, -1,
+                                      NULL, 0);
+            if (len)
+            {
+                tvItemW.pszText = Alloc(len*sizeof(WCHAR));
+                MultiByteToWideChar(CP_ACP, 0, tvItem->pszText, -1,
+                                    tvItemW.pszText ,len);
+                tvItemW.cchTextMax = len;
+            }
+        }
+        else if(tvItem->pszText == LPSTR_TEXTCALLBACKA)
+            tvItemW.pszText = LPSTR_TEXTCALLBACKW;
+    }
+           
+    tvItemW.iImage = tvItem->iImage;
+    tvItemW.iSelectedImage = tvItem->iSelectedImage;
+    tvItemW.cChildren = tvItem->cChildren;
+    tvItemW.lParam = tvItem->lParam;
+    tvItemW.iIntegral = tvItem->iIntegral;
+
+    rc = TREEVIEW_SetItemW(infoPtr,&tvItemW);
+    if(tvItemW.pszText && tvItemW.pszText != LPSTR_TEXTCALLBACKW)
+        Free(tvItemW.pszText);
     return rc;
 }
 
@@ -2582,13 +2587,13 @@
 	    InflateRect(&rcText, -2, -1); /* allow for the focus rect */
 
 	    TRACE("drawing text %s at (%ld,%ld)-(%ld,%ld)\n",
-		  debugstr_a(wineItem->pszText),
+		  debugstr_w(wineItem->pszText),
 		  rcText.left, rcText.top, rcText.right, rcText.bottom);
 
 	    /* Draw it */
-	    DrawTextA(hdc,
+	    DrawTextW(hdc,
 		      wineItem->pszText,
-		      lstrlenA(wineItem->pszText),
+		      lstrlenW(wineItem->pszText),
 		      &rcText,
 		      DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
 
@@ -2910,7 +2915,14 @@
     TREEVIEW_UpdateDispInfo(infoPtr, first, TVIF_TEXT);
     TREEVIEW_UpdateDispInfo(infoPtr, second, TVIF_TEXT);
 
-    return strcasecmp(first->pszText, second->pszText);
+    if(first->pszText && second->pszText)
+        return lstrcmpiW(first->pszText, second->pszText);
+    else if(first->pszText)
+        return -1;
+    else if(second->pszText)
+        return 1;
+    else
+        return 0;
 }
 
 /* Returns the number of physical children belonging to item. */
@@ -3455,7 +3467,7 @@
     {
     case WM_PAINT:
 	 TRACE("WM_PAINT start\n");
-	 rc = CallWindowProcA(infoPtr->wpEditOrig, hwnd, uMsg, wParam,
+	 rc = CallWindowProcW(infoPtr->wpEditOrig, hwnd, uMsg, wParam,
 				 lParam);
 	 TRACE("WM_PAINT done\n");
 	 return rc;
@@ -3481,7 +3493,7 @@
 
 	/* fall through */
     default:
-	return CallWindowProcA(infoPtr->wpEditOrig, hwnd, uMsg, wParam, lParam);
+	return CallWindowProcW(infoPtr->wpEditOrig, hwnd, uMsg, wParam, lParam);
     }
 
     /* Processing TVN_ENDLABELEDIT message could kill the focus       */
@@ -3509,7 +3521,7 @@
 	    /*
 	     * Adjust the edit window size
 	     */
-	    char buffer[1024];
+	    WCHAR buffer[1024];
 	    TREEVIEW_ITEM *editItem = infoPtr->selectedItem;
 	    HDC hdc = GetDC(infoPtr->hwndEdit);
 	    SIZE sz;
@@ -3518,21 +3530,22 @@
 
 	    infoPtr->bLabelChanged = TRUE;
 
-	    len = GetWindowTextA(infoPtr->hwndEdit, buffer, sizeof(buffer));
+	    len = GetWindowTextW(infoPtr->hwndEdit, buffer, sizeof(buffer));
 
 	    /* Select font to get the right dimension of the string */
-	    hFont = (HFONT)SendMessageA(infoPtr->hwndEdit, WM_GETFONT, 0, 0);
+	    hFont = (HFONT)SendMessageW(infoPtr->hwndEdit, WM_GETFONT, 0, 0);
+
 	    if (hFont != 0)
 	    {
 		hOldFont = SelectObject(hdc, hFont);
 	    }
 
-	    if (GetTextExtentPoint32A(hdc, buffer, strlen(buffer), &sz))
+	    if (GetTextExtentPoint32W(hdc, buffer, strlenW(buffer), &sz))
 	    {
-		TEXTMETRICA textMetric;
+		TEXTMETRICW textMetric;
 
 		/* Add Extra spacing for the next character */
-		GetTextMetricsA(hdc, &textMetric);
+		GetTextMetricsW(hdc, &textMetric);
 		sz.cx += (textMetric.tmMaxCharWidth * 2);
 
 		sz.cx = max(sz.cx, textMetric.tmMaxCharWidth * 3);
@@ -3558,23 +3571,24 @@
 	}
 
     default:
-	return SendMessageA(infoPtr->hwndNotify, WM_COMMAND, wParam, lParam);
+	return SendMessageW(infoPtr->hwndNotify, WM_COMMAND, wParam, lParam);
     }
 
     return 0;
 }
 
 static HWND
-TREEVIEW_EditLabelA(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
+TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
 {
     HWND hwnd = infoPtr->hwnd;
     HWND hwndEdit;
     SIZE sz;
     TREEVIEW_ITEM *editItem = hItem;
-    HINSTANCE hinst = (HINSTANCE)GetWindowLongA(hwnd, GWL_HINSTANCE);
+    HINSTANCE hinst = (HINSTANCE)GetWindowLongW(hwnd, GWL_HINSTANCE);
     HDC hdc;
     HFONT hOldFont=0;
-    TEXTMETRICA textMetric;
+    TEXTMETRICW textMetric;
+    WCHAR EditW[] = {'E','d','i','t',0};
 
     TRACE("%x %p\n", (unsigned)hwnd, hItem);
     if (!TREEVIEW_ValidItem(infoPtr, editItem))
@@ -3599,11 +3613,11 @@
     }
 
     /* Get string length in pixels */
-    GetTextExtentPoint32A(hdc, editItem->pszText, strlen(editItem->pszText),
+    GetTextExtentPoint32W(hdc, editItem->pszText, strlenW(editItem->pszText),
 			  &sz);
 
     /* Add Extra spacing for the next character */
-    GetTextMetricsA(hdc, &textMetric);
+    GetTextMetricsW(hdc, &textMetric);
     sz.cx += (textMetric.tmMaxCharWidth * 2);
 
     sz.cx = max(sz.cx, textMetric.tmMaxCharWidth * 3);
@@ -3615,8 +3629,8 @@
     }
 
     ReleaseDC(hwnd, hdc);
-    hwndEdit = CreateWindowExA(WS_EX_LEFT,
-			       "EDIT",
+    hwndEdit = CreateWindowExW(WS_EX_LEFT,
+			       EditW,
 			       0,
 			       WS_CHILD | WS_BORDER | ES_AUTOHSCROLL |
 			       WS_CLIPSIBLINGS | ES_WANTRETURN |
@@ -3629,15 +3643,15 @@
     infoPtr->hwndEdit = hwndEdit;
 
     /* Get a 2D border. */
-    SetWindowLongA(hwndEdit, GWL_EXSTYLE,
-		   GetWindowLongA(hwndEdit, GWL_EXSTYLE) & ~WS_EX_CLIENTEDGE);
-    SetWindowLongA(hwndEdit, GWL_STYLE,
-		   GetWindowLongA(hwndEdit, GWL_STYLE) | WS_BORDER);
+    SetWindowLongW(hwndEdit, GWL_EXSTYLE,
+		   GetWindowLongW(hwndEdit, GWL_EXSTYLE) & ~WS_EX_CLIENTEDGE);
+    SetWindowLongW(hwndEdit, GWL_STYLE,
+		   GetWindowLongW(hwndEdit, GWL_STYLE) | WS_BORDER);
 
-    SendMessageA(hwndEdit, WM_SETFONT,
+    SendMessageW(hwndEdit, WM_SETFONT,
 		 (WPARAM)TREEVIEW_FontForItem(infoPtr, editItem), FALSE);
 
-    infoPtr->wpEditOrig = (WNDPROC)SetWindowLongA(hwndEdit, GWL_WNDPROC,
+    infoPtr->wpEditOrig = (WNDPROC)SetWindowLongW(hwndEdit, GWL_WNDPROC,
 						  (DWORD)
 						  TREEVIEW_Edit_SubclassProc);
 
@@ -3649,9 +3663,9 @@
     }
 
     infoPtr->selectedItem = hItem;
-    SetWindowTextA(hwndEdit, editItem->pszText);
+    SetWindowTextW(hwndEdit, editItem->pszText);
     SetFocus(hwndEdit);
-    SendMessageA(hwndEdit, EM_SETSEL, 0, -1);
+    SendMessageW(hwndEdit, EM_SETSEL, 0, -1);
     ShowWindow(hwndEdit, SW_SHOW);
 
     return hwndEdit;
@@ -3663,16 +3677,17 @@
 {
     HWND hwnd = infoPtr->hwnd;
     TREEVIEW_ITEM *editedItem = infoPtr->selectedItem;
-    NMTVDISPINFOA tvdi;
+    NMTVDISPINFOW tvdi;
     BOOL bCommit;
-    char tmpText[1024] = { '\0' };
+    WCHAR tmpText[1024] = { '\0' };
+    WCHAR *newText = tmpText;
     int iLength = 0;
 
     if (!infoPtr->hwndEdit)
 	return FALSE;
 
     tvdi.hdr.hwndFrom = hwnd;
-    tvdi.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
+    tvdi.hdr.idFrom = GetWindowLongW(hwnd, GWL_ID);
     tvdi.hdr.code = get_notifycode(infoPtr, TVN_ENDLABELEDITW);
     tvdi.item.mask = 0;
     tvdi.item.hItem = editedItem;
@@ -3681,13 +3696,17 @@
 
     if (!bCancel)
     {
-	iLength = GetWindowTextA(infoPtr->hwndEdit, tmpText, 1023);
+        if (!infoPtr->bNtfUnicode)
+            iLength = GetWindowTextA(infoPtr->hwndEdit, (LPSTR)tmpText, 1023);
+        else
+            iLength = GetWindowTextW(infoPtr->hwndEdit, tmpText, 1023);
 
 	if (iLength >= 1023)
 	{
 	    ERR("Insufficient space to retrieve new item label\n");
 	}
 
+        tvdi.item.mask = TVIF_TEXT;
 	tvdi.item.pszText = tmpText;
 	tvdi.item.cchTextMax = iLength + 1;
     }
@@ -3702,21 +3721,30 @@
 
     if (!bCancel && bCommit)	/* Apply the changes */
     {
-	if (strcmp(tmpText, editedItem->pszText) != 0)
-	{
-	    if (NULL == ReAlloc(editedItem->pszText, iLength + 1))
-	    {
-		ERR("OutOfMemory, cannot allocate space for label\n");
-		DestroyWindow(infoPtr->hwndEdit);
-		infoPtr->hwndEdit = 0;
-		return FALSE;
-	    }
-	    else
-	    {
-		editedItem->cchTextMax = iLength + 1;
-		lstrcpyA(editedItem->pszText, tmpText);
-	    }
-	}
+        if (!infoPtr->bNtfUnicode)
+        {
+            DWORD len = MultiByteToWideChar( CP_ACP, 0, (LPSTR)tmpText, -1, NULL, 0 );
+            newText = Alloc(len * sizeof(WCHAR));
+            MultiByteToWideChar( CP_ACP, 0, (LPSTR)tmpText, -1, newText, len );
+            iLength = len - 1;
+        }
+
+        if (strcmpW(newText, editedItem->pszText) != 0)
+        {
+            if (NULL == ReAlloc(editedItem->pszText, iLength + 1))
+            {
+                ERR("OutOfMemory, cannot allocate space for label\n");
+                DestroyWindow(infoPtr->hwndEdit);
+                infoPtr->hwndEdit = 0;
+                return FALSE;
+            }
+            else
+            {
+                editedItem->cchTextMax = iLength + 1;
+                strcpyW(editedItem->pszText, newText);
+            }
+        }
+        if(newText != tmpText) Free(newText);
     }
 
     ShowWindow(infoPtr->hwndEdit, SW_HIDE);
@@ -3737,7 +3765,7 @@
     KillTimer(infoPtr->hwnd, TV_EDIT_TIMER);
     infoPtr->Timer &= ~TV_EDIT_TIMER_SET;
 
-    TREEVIEW_EditLabelA(infoPtr, infoPtr->selectedItem);
+    TREEVIEW_EditLabel(infoPtr, infoPtr->selectedItem);
 
     return 0;
 }
@@ -4089,10 +4117,10 @@
     hdc = CreateCompatibleDC(htopdc);
 
     hOldFont = SelectObject(hdc, infoPtr->hFont);
-    GetTextExtentPoint32A(hdc, dragItem->pszText, lstrlenA(dragItem->pszText),
+    GetTextExtentPoint32W(hdc, dragItem->pszText, strlenW(dragItem->pszText),
 			  &size);
-    TRACE("%ld %ld %s %d\n", size.cx, size.cy, dragItem->pszText,
-	  lstrlenA(dragItem->pszText));
+    TRACE("%ld %ld %s %d\n", size.cx, size.cy, debugstr_w(dragItem->pszText),
+	  strlenW(dragItem->pszText));
     hbmp = CreateCompatibleBitmap(htopdc, size.cx, size.cy);
     hOldbmp = SelectObject(hdc, hbmp);
 
@@ -4113,7 +4141,7 @@
 /* draw item text */
 
     SetRect(&rc, cx, 0, size.cx, size.cy);
-    DrawTextA(hdc, dragItem->pszText, lstrlenA(dragItem->pszText), &rc,
+    DrawTextW(hdc, dragItem->pszText, strlenW(dragItem->pszText), &rc,
 	      DT_LEFT);
     SelectObject(hdc, hOldFont);
     SelectObject(hdc, hOldbmp);
@@ -4275,15 +4303,15 @@
     TREEVIEW_INFO *infoPtr;
     HTREEITEM nItem;
     HTREEITEM endidx,idx;
-    TVITEMEXA item;
-    CHAR buffer[MAX_PATH];
+    TVITEMEXW item;
+    WCHAR buffer[MAX_PATH];
     DWORD timestamp,elapsed;
 
     /* simple parameter checking */
     if (!hwnd || !charCode || !keyData)
         return 0;
 
-    infoPtr=(TREEVIEW_INFO*)GetWindowLongA(hwnd, 0);
+    infoPtr=(TREEVIEW_INFO*)GetWindowLongW(hwnd, 0);
     if (!infoPtr)
         return 0;
 
@@ -4311,7 +4339,7 @@
     /* update the search parameters */
     infoPtr->lastKeyPressTimestamp=timestamp;
     if (elapsed < KEY_DELAY) {
-        if (infoPtr->nSearchParamLength < sizeof(infoPtr->szSearchParam)) {
+        if (infoPtr->nSearchParamLength < sizeof(infoPtr->szSearchParam) / sizeof(WCHAR)) {
             infoPtr->szSearchParam[infoPtr->nSearchParamLength++]=charCode;
         }
         if (infoPtr->charCode != charCode) {
@@ -4353,15 +4381,15 @@
         item.hItem = idx;
         item.pszText = buffer;
         item.cchTextMax = sizeof(buffer);
-        TREEVIEW_GetItemA( infoPtr, &item );
+        TREEVIEW_GetItemW( infoPtr, &item );
 
         /* check for a match */
-        if (strncasecmp(item.pszText,infoPtr->szSearchParam,infoPtr->nSearchParamLength) == 0) {
+        if (strncmpiW(item.pszText,infoPtr->szSearchParam,infoPtr->nSearchParamLength) == 0) {
             nItem=idx;
             break;
         } else if ( (charCode != 0) && (nItem == NULL) &&
                     (nItem != infoPtr->selectedItem) &&
-                    (strncasecmp(item.pszText,infoPtr->szSearchParam,1) == 0) ) {
+                    (strncmpiW(item.pszText,infoPtr->szSearchParam,1) == 0) ) {
             /* This would work but we must keep looking for a longer match */
             nItem=idx;
         }
@@ -4435,12 +4463,12 @@
         /* Scroll window so item's text is visible as much as possible */
         /* Calculation of amount of extra space is taken from EditLabel code */
         INT pos, x;
-        TEXTMETRICA textMetric;
+        TEXTMETRICW textMetric;
         HDC hdc = GetWindowDC(infoPtr->hwnd);
 
         x = item->textWidth;
 
-        GetTextMetricsA(hdc, &textMetric);
+        GetTextMetricsW(hdc, &textMetric);
         ReleaseDC(infoPtr->hwnd, hdc);
 
         x += (textMetric.tmMaxCharWidth * 2);
@@ -4725,7 +4753,7 @@
     RECT rcClient;
     TREEVIEW_INFO *infoPtr;
 
-    TRACE("wnd %p, style %lx\n", hwnd, GetWindowLongA(hwnd, GWL_STYLE));
+    TRACE("wnd %p, style %lx\n", hwnd, GetWindowLongW(hwnd, GWL_STYLE));
 
     infoPtr = (TREEVIEW_INFO *)Alloc(sizeof(TREEVIEW_INFO));
 
@@ -4735,10 +4763,10 @@
 	return 0;
     }
 
-    SetWindowLongA(hwnd, 0, (DWORD)infoPtr);
+    SetWindowLongW(hwnd, 0, (DWORD)infoPtr);
 
     infoPtr->hwnd = hwnd;
-    infoPtr->dwStyle = GetWindowLongA(hwnd, GWL_STYLE);
+    infoPtr->dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
     infoPtr->uInternalStatus = 0;
     infoPtr->Timer = 0;
     infoPtr->uNumItems = 0;
@@ -4801,12 +4829,12 @@
 
     infoPtr->hwndNotify = lpcs->hwndParent;
 #if 0
-    infoPtr->bTransparent = ( GetWindowLongA( hwnd, GWL_STYLE) & TBSTYLE_FLAT);
+    infoPtr->bTransparent = ( GetWindowLongW( hwnd, GWL_STYLE) & TBSTYLE_FLAT);
 #endif
 
     infoPtr->hwndToolTip = 0;
 
-    infoPtr->bUnicode = IsWindowUnicode (hwnd);
+    infoPtr->bNtfUnicode = IsWindowUnicode (hwnd);
 
     /* Determine what type of notify should be issued */
     /* sets infoPtr->bNtfUnicode */
@@ -4873,11 +4901,11 @@
 
     /* Restore original wndproc */
     if (infoPtr->hwndEdit)
-	SetWindowLongA(infoPtr->hwndEdit, GWL_WNDPROC,
+	SetWindowLongW(infoPtr->hwndEdit, GWL_WNDPROC,
 		       (LONG)infoPtr->wpEditOrig);
 
     /* Deassociate treeview from the window before doing anything drastic. */
-    SetWindowLongA(infoPtr->hwnd, 0, (LONG)NULL);
+    SetWindowLongW(infoPtr->hwnd, 0, (LONG)NULL);
 
     DeleteObject(infoPtr->hBoldFont);
     Free(infoPtr);
@@ -5195,11 +5223,10 @@
 	return TREEVIEW_DeleteItem(infoPtr, (HTREEITEM)lParam);
 
     case TVM_EDITLABELA:
-	return (LRESULT)TREEVIEW_EditLabelA(infoPtr, (HTREEITEM)lParam);
+	return (LRESULT)TREEVIEW_EditLabel(infoPtr, (HTREEITEM)lParam);
 
     case TVM_EDITLABELW:
-	FIXME("Unimplemented msg TVM_EDITLABELW\n");
-	return 0;
+	return (LRESULT)TREEVIEW_EditLabel(infoPtr, (HTREEITEM)lParam);
 
     case TVM_ENDEDITLABELNOW:
 	return TREEVIEW_EndEditLabelNow(infoPtr, (BOOL)wParam);
@@ -5267,8 +5294,7 @@
 	return TREEVIEW_GetToolTips(infoPtr);
 
     case TVM_GETUNICODEFORMAT:
-	FIXME("Unimplemented msg TVM_GETUNICODEFORMAT\n");
-	return 0;
+        return TREEVIEW_GetUnicodeFormat(infoPtr);
 
     case TVM_GETVISIBLECOUNT:
 	return TREEVIEW_GetVisibleCount(infoPtr);
@@ -5304,8 +5330,7 @@
 	return TREEVIEW_SetItemA(infoPtr, (LPTVITEMEXA)lParam);
 
     case TVM_SETITEMW:
-    return TREEVIEW_SetItemW(infoPtr, (LPTVITEMEXW)lParam);
-	return 0;
+        return TREEVIEW_SetItemW(infoPtr, (LPTVITEMEXW)lParam);
 
     case TVM_SETLINECOLOR:
 	return TREEVIEW_SetLineColor(infoPtr, (COLORREF)lParam);
@@ -5323,8 +5348,7 @@
 	return TREEVIEW_SetToolTips(infoPtr, (HWND)wParam);
 
     case TVM_SETUNICODEFORMAT:
-	FIXME("Unimplemented msg TVM_SETUNICODEFORMAT\n");
-	return 0;
+        return TREEVIEW_SetUnicodeFormat(infoPtr, (BOOL)wParam);
 
     case TVM_SORTCHILDREN:
 	return TREEVIEW_SortChildren(infoPtr, wParam, lParam);



More information about the wine-patches mailing list