- Implementation of simple comctl32 v5.0 changes.
- TVM_SORTCHILDRENCB also accepts TVI_ROOT as a valid hParent.

diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index 5151306..8aacb30 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -459,6 +459,26 @@
 }
   
 static LRESULT
+TREEVIEW_GetLineColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
+{
+  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
+
+  TRACE("\n");
+  return (LRESULT) infoPtr->clrLine;
+}
+
+static LRESULT
+TREEVIEW_SetLineColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
+{
+  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
+  COLORREF prevColor=infoPtr->clrLine;
+
+  TRACE("\n");
+  infoPtr->clrLine=(COLORREF) lParam;
+  return (LRESULT) prevColor;
+}
+
+static LRESULT
 TREEVIEW_SetTextColor (HWND hwnd, WPARAM wParam, LPARAM lParam)
 {
   TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
@@ -522,11 +542,12 @@
   	hOldFont = SelectObject (hdc, infoPtr->hFont);
 
   cditem=0;
+  TRACE ("cdmode:%x\n",infoPtr->cdmode);
   if (infoPtr->cdmode & CDRF_NOTIFYITEMDRAW) {
 		drawmode=CDDS_ITEMPREPAINT;
 
 		if (infoPtr->cdmode & CDRF_NOTIFYSUBITEMDRAW) 
-      drawmode|=CDDS_SUBITEM;
+      		drawmode|=CDDS_SUBITEM;
 
 		cditem=TREEVIEW_SendCustomDrawItemNotify (hwnd, hdc, wineItem, drawmode);
 
@@ -597,9 +618,9 @@
       }
     
       /* 
-       * Get a doted pen
+       * Get a dotted pen
        */ 
-      hnewPen = CreatePen(PS_DOT, 0, GetSysColor(COLOR_WINDOWTEXT) );
+      hnewPen = CreatePen(PS_DOT, 0, infoPtr->clrLine);
       hOldPen = SelectObject( hdc, hnewPen );
   
       if (hasParentOrSibling)
@@ -874,7 +895,6 @@
 
   if (tvItem->mask & TVIF_INTEGRAL) {
         wineItem->iIntegral=tvItem->iIntegral; 
-        FIXME(" TVIF_INTEGRAL not supported yet\n");
   }
 
   if (tvItem->mask & TVIF_PARAM) {
@@ -907,6 +927,19 @@
   return TRUE;
 }
 
+static LRESULT
+TREEVIEW_GetItemState (HWND hwnd, WPARAM wParam, LPARAM lParam)
+
+{
+    TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
+	TREEVIEW_ITEM *wineItem;
+	
+  	wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)wParam);
+	if (!wineItem) return 0;
+	
+	return (wineItem->state & lParam);
+}
+
 
 
 
@@ -1141,7 +1174,6 @@
 
    if (tvItem->mask & TVIF_INTEGRAL) {
         tvItem->iIntegral=wineItem->iIntegral; 
-		FIXME(" TVIF_INTEGRAL not supported yet\n");
    }
 
    /* undocumented: windows ignores TVIF_PARAM and
@@ -1427,10 +1459,14 @@
   /* Obtain the TVSORTBC struct */
   infoPtr->pCallBackSort = pSort;
 
+	/* undocumented feature: TVI_ROOT means `sort the whole tree' */
+
+  if (parent==TVI_ROOT) parent=infoPtr->TopRootItem;
+
   /* Check for a valid handle to the parent item */
   if (!TREEVIEW_ValidItem(infoPtr, parent))
   {
-    ERR ("invalid item hParent=%d\n", (INT)parent);
+    ERR ("invalid item hParent=%x\n", (INT)parent);
     return FALSE;
   }
 
@@ -2053,9 +2089,9 @@
   
     TRACE("wnd %x\n",hwnd);
       /* allocate memory for info structure */
-      infoPtr = (TREEVIEW_INFO *) COMCTL32_Alloc (sizeof(TREEVIEW_INFO));
+    infoPtr = (TREEVIEW_INFO *) COMCTL32_Alloc (sizeof(TREEVIEW_INFO));
 
-     SetWindowLongA( hwnd, 0, (DWORD)infoPtr);
+    SetWindowLongA( hwnd, 0, (DWORD)infoPtr);
 
     if (infoPtr == NULL) {
 		ERR("could not allocate info memory!\n");
@@ -2072,8 +2108,9 @@
     /* set default settings */
     infoPtr->uInternalStatus=0;
     infoPtr->uNumItems=0;
-    infoPtr->clrBk = GetSysColor (COLOR_WINDOW);
+    infoPtr->clrBk   = GetSysColor (COLOR_WINDOW);
     infoPtr->clrText = GetSysColor (COLOR_BTNTEXT);
+    infoPtr->clrLine = GetSysColor (COLOR_WINDOWTEXT);
     infoPtr->cy = 0;
     infoPtr->cx = 0;
     infoPtr->uIndent = 15;
@@ -2234,7 +2271,7 @@
 
     TRACE("%x\n",code);
     nmhdr.hwndFrom = hwnd;
-    nmhdr.idFrom   =  GetWindowLongA( hwnd, GWL_ID);
+    nmhdr.idFrom   = GetWindowLongA( hwnd, GWL_ID);
     nmhdr.code     = code;
 
     return (BOOL) SendMessageA (GetParent (hwnd), WM_NOTIFY,
@@ -3544,6 +3581,15 @@
     	case TVM_GETSCROLLTIME:
       		FIXME("Unimplemented msg TVM_GETSCROLLTIME\n");
       		return 0;
+
+    	case TVM_GETITEMSTATE:
+      		return TREEVIEW_GetItemState (hwnd,wParam, lParam);
+
+    	case TVM_GETLINECOLOR:
+      		return TREEVIEW_GetLineColor (hwnd,wParam, lParam);
+
+    	case TVM_SETLINECOLOR:
+      		return TREEVIEW_SetLineColor (hwnd,wParam, lParam);
   
     	case TVM_SETINSERTMARKCOLOR:
       		FIXME("Unimplemented msg TVM_SETINSERTMARKCOLOR\n");
@@ -3586,14 +3632,12 @@
 		case WM_KEYDOWN:
 			return TREEVIEW_KeyDown (hwnd, wParam, lParam);
   
-  
 		case WM_SETFOCUS: 
 			return TREEVIEW_SetFocus (hwnd, wParam, lParam);
 
 		case WM_KILLFOCUS: 
 			return TREEVIEW_KillFocus (hwnd, wParam, lParam);
   
-  
 		case WM_LBUTTONDOWN:
 			return TREEVIEW_LButtonDown (hwnd, wParam, lParam);
 
@@ -3612,11 +3656,10 @@
 		case WM_MOUSEMOVE:
 			return TREEVIEW_MouseMove (hwnd, wParam, lParam);
   
-  
-/*		case WM_SYSCOLORCHANGE: */
 		case WM_STYLECHANGED: 
 			return TREEVIEW_StyleChanged (hwnd, wParam, lParam);
 
+/*		case WM_SYSCOLORCHANGE: */
 /*		case WM_SETREDRAW: */
   
 		case WM_TIMER:
diff --git a/include/commctrl.h b/include/commctrl.h
index bbd1b7a..a7cccc2 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -1669,9 +1669,34 @@
 #define TVM_UNKNOWN36           (TV_FIRST+36)
 #define TVM_SETINSERTMARKCOLOR  (TV_FIRST+37)
 #define TVM_GETINSERTMARKCOLOR  (TV_FIRST+38)
+#define TVM_GETITEMSTATE        (TV_FIRST+39)
+#define TVM_SETLINECOLOR        (TV_FIRST+40)
+#define TVM_GETLINECOLOR        (TV_FIRST+41)
 #define TVM_SETUNICODEFORMAT    CCM_SETUNICODEFORMAT
 #define TVM_GETUNICODEFORMAT    CCM_GETUNICODEFORMAT
 
+#define TreeView_GetItemState(hwndTV, hti, mask) \
+   (UINT)SendMessageA((hwndTV), TVM_GETITEMSTATE, (WPARAM)(hti), (LPARAM)(mask))
+#define TreeView_GetCheckState(hwndTV, hti) \
+   ((((UINT)(SendMessageA((hwndTV), TVM_GETITEMSTATE, (WPARAM)(hti),  \
+                     TVIS_STATEIMAGEMASK))) >> 12) -1)
+#define TreeView_SetLineColor(hwnd, clr) \
+    (COLORREF)SendMessageA((hwnd), TVM_SETLINECOLOR, 0, (LPARAM)(clr))
+#define TreeView_GetLineColor(hwnd) \
+    (COLORREF)SendMessageA((hwnd), TVM_GETLINECOLOR, 0, 0)
+#define TreeView_SetItemState(hwndTV, hti, data, _mask) \
+{ TVITEM _TVi; \
+  _TVi.mask = TVIF_STATE; \
+  _TVi.hItem = hti; \
+  _TVi.stateMask = _mask; \
+  _TVi.state = data; \
+  SendMessageA((hwndTV), TVM_SETITEM, 0, (LPARAM)(TV_ITEM *)&_TVi); \
+}
+
+
+
+
+
 #define TVN_FIRST               (0U-400U)
 #define TVN_LAST                (0U-499U)
 
diff --git a/include/treeview.h b/include/treeview.h
index 3dd3b6a..8e006a9 100644
--- a/include/treeview.h
+++ b/include/treeview.h
@@ -70,6 +70,7 @@
   INT           cx,cy;          /* current x/y place in list */
   COLORREF      clrBk;    
   COLORREF      clrText;
+  COLORREF      clrLine;
   HFONT         hFont;
   HFONT         hBoldFont;
   HWND          hwndToolTip;