- implemented simple column order array functionality
- implemented some virtual listview notifications

diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 325e31e..5d8af56 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -16,7 +16,7 @@
  *   LISTVIEW_Notify : most notifications from children (editbox and header)
  *
  * Data structure:
- *   LISTVIEW_SetItemCount : empty stub 
+ *   LISTVIEW_SetItemCount : not completed
  * 
  * Unicode:
  *   LISTVIEW_SetItemW : no unicode support
@@ -31,8 +31,8 @@
  *   LISTVIEW_GetHoverTime : not implemented
  *   LISTVIEW_GetISearchString : not implemented 
  *   LISTVIEW_GetBkImage : not implemented
- *   LISTVIEW_GetColumnOrderArray : not implemented
- *   LISTVIEW_SetColumnOrderArray : not implemented
+ *   LISTVIEW_GetColumnOrderArray : simple hack only
+ *   LISTVIEW_SetColumnOrderArray : simple hack only
  *   LISTVIEW_Arrange : empty stub
  *   LISTVIEW_ApproximateViewRect : incomplete
  *   LISTVIEW_Scroll : not implemented 
@@ -2034,6 +2034,22 @@
   /* add 1 for displaying a partial item at the bottom */
   nLast = nItem + LISTVIEW_GetCountPerColumn(hwnd) + 1;
   nLast = min(nLast, GETITEMCOUNT(infoPtr));
+
+  /* send cache hint notification */
+  if (GetWindowLongA(hwnd,GWL_STYLE) & LVS_OWNERDATA)
+  {
+    NMLVCACHEHINT nmlv;
+
+    nmlv.hdr.hwndFrom = hwnd;
+    nmlv.hdr.idFrom = GetWindowLongA(hwnd,GWL_ID);
+    nmlv.hdr.code = LVN_ODCACHEHINT;
+    nmlv.iFrom = nItem;
+    nmlv.iTo   = nLast;
+
+    SendMessageA(GetParent(hwnd), WM_NOTIFY, (WPARAM)nmlv.hdr.idFrom,
+                 (LPARAM)&nmlv);
+  }
+
   for (; nItem < nLast; nItem++)
   {
     nColumnCount = Header_GetItemCount(infoPtr->hwndHeader);
@@ -3335,7 +3351,22 @@
 }
 
 /* LISTVIEW_GetColumnW */
-/* LISTVIEW_GetColumnOrderArray */
+
+
+static LRESULT LISTVIEW_GetColumnOrderArray(HWND hwnd, INT iCount, LPINT lpiArray)
+{
+/*  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(hwnd, 0); */
+    INT i;
+
+    if (!lpiArray)
+	return FALSE;
+
+    /* little hack */
+    for (i = 0; i < iCount; i++)
+	lpiArray[i] = i;
+
+    return TRUE;
+}
 
 /***
  * DESCRIPTION:
@@ -5144,7 +5175,32 @@
 }
 
 /* LISTVIEW_SetColumnW */
-/* LISTVIEW_SetColumnOrderArray */
+
+/***
+ * DESCRIPTION:
+ * Sets the column order array
+ *
+ * PARAMETERS:
+ * [I] HWND : window handle
+ * [I] INT : number of elements in column order array
+ * [I] INT : pointer to column order array
+ *
+ * RETURN:
+ *   SUCCESS : TRUE
+ *   FAILURE : FALSE
+ */
+static LRESULT LISTVIEW_SetColumnOrderArray(HWND hwnd, INT iCount, LPINT lpiArray)
+{
+/*  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(hwnd, 0); */
+
+    FIXME("iCount %d lpiArray %p\n", iCount, lpiArray);
+
+    if (!lpiArray)
+	return FALSE;
+
+    return TRUE;
+}
+
 
 /***
  * DESCRIPTION:
@@ -5346,7 +5402,7 @@
  * 
  * PARAMETER(S):
  * [I] HWND : window handle
- * [I] INT : item count (prjected number of items)
+ * [I] INT   : item count (projected number of items)
  * [I] DWORD : update flags
  *
  * RETURN:
@@ -5362,6 +5418,12 @@
   if (nItems == 0)
     return LISTVIEW_DeleteAllItems (hwnd);
 
+  if (GetWindowLongA(hwnd, GWL_STYLE) & LVS_OWNERDATA)
+  {
+    FIXME("LVS_OWNERDATA is set!\n");
+  }
+  else
+  {
   if (nItems > GETITEMCOUNT(infoPtr))
 {
     /* append items */
@@ -5374,6 +5436,7 @@
     FIXME("remove items\n");
 
   }
+  }
 
   return TRUE;
 }
@@ -5901,7 +5964,6 @@
     case SB_PAGEUP:
       if (scrollInfo.nPos > scrollInfo.nMin)
       {
-
         if (scrollInfo.nPos >= scrollInfo.nPage)
         {
           scrollInfo.nPos -= scrollInfo.nPage;
@@ -6989,8 +7051,7 @@
 /*	case LVM_GETCOLUMNW: */
 
   case LVM_GETCOLUMNORDERARRAY:
-    FIXME("Unimplemented msg LVM_GETCOLUMNORDERARRAY\n");
-    return 0;
+    return LISTVIEW_GetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
 
   case LVM_GETCOLUMNWIDTH:
     return LISTVIEW_GetColumnWidth(hwnd, (INT)wParam);
@@ -7120,8 +7181,7 @@
     return 0;
 
   case LVM_SETCOLUMNORDERARRAY:
-    FIXME("Unimplemented msg LVM_SETCOLUMNORDERARRAY\n");
-    return 0;
+    return LISTVIEW_SetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
 
   case LVM_SETCOLUMNWIDTH:
     return LISTVIEW_SetColumnWidth(hwnd, (INT)wParam, (INT)lParam);
diff --git a/include/commctrl.h b/include/commctrl.h
index 71d0331..9e047c9 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -26,6 +26,8 @@
 
 BOOL WINAPI InitCommonControlsEx (LPINITCOMMONCONTROLSEX);
 
+#define COMCTL32_VERSION                5  /* dll version */
+
 #define ICC_LISTVIEW_CLASSES   0x00000001  /* listview, header */
 #define ICC_TREEVIEW_CLASSES   0x00000002  /* treeview, tooltips */
 #define ICC_BAR_CLASSES        0x00000004  /* toolbar, statusbar, trackbar, tooltips */
@@ -66,6 +68,9 @@
 #define CCM_GETDROPTARGET    (CCM_FIRST+4)
 #define CCM_SETUNICODEFORMAT (CCM_FIRST+5)
 #define CCM_GETUNICODEFORMAT (CCM_FIRST+6)
+#define CCM_SETVERSION       (CCM_FIRST+7)
+#define CCM_GETVERSION       (CCM_FIRST+8)
+#define CCM_SETNOTIFYWINDOW  (CCM_FIRST+9)     /* wParam = hwndParent */
 
 
 /* common notification codes (WM_NOTIFY)*/
@@ -941,20 +946,13 @@
 } TBBUTTON, *PTBBUTTON, *LPTBBUTTON;
 typedef const TBBUTTON *LPCTBBUTTON;
 
-typedef struct tagNMTOOLBAR {
-        NMHDR           hdr;
-        int             iItem;
-        TBBUTTON        tbButton;
-        int             cchText;
-        LPWSTR          pszText;
-        RECT            rcButton; /*Version 5.80*/
-} NMTOOLBARW, * LPNMTOOLBARW;
 
 typedef struct _COLORMAP {
     COLORREF from;
     COLORREF to;
 } COLORMAP, *LPCOLORMAP;
 
+
 typedef struct tagTBADDBITMAP {
     HINSTANCE hInst;
     UINT      nID;
@@ -1064,6 +1062,29 @@
 #define NMTBGETINFOTIP   WINELIB_NAME_AW(NMTBGETINFOFTIP)
 #define LPNMTBGETINFOTIP WINELIB_NAME_AW(LPNMTBGETINFOTIP)
 
+typedef struct tagNMTOOLBARA
+{
+    NMHDR    hdr;
+    INT      iItem;
+    TBBUTTON tbButton;
+    INT      cchText;
+    LPSTR    pszText;
+    RECT     rcButton; /* Version 5.80 */
+} NMTOOLBARA, *LPNMTOOLBARA;
+
+typedef struct tagNMTOOLBARW
+{
+    NMHDR    hdr;
+    INT      iItem;
+    TBBUTTON tbButton;
+    INT      cchText;
+    LPWSTR   pszText;
+    RECT     rcButton; /* Version 5.80 */
+} NMTOOLBARW, *LPNMTOOLBARW;
+
+#define NMTOOLBAR   WINELIB_NAME_AW(NMTOOLBAR)
+#define LPNMTOOLBAR WINELIB_NAME_AW(LPNMTOOLBAR)
+
 typedef struct
 {
 	HINSTANCE hInstOld;
@@ -2379,18 +2400,19 @@
 #define LVN_BEGINDRAG           (LVN_FIRST-9)
 #define LVN_BEGINRDRAG          (LVN_FIRST-11)
 #define LVN_ODCACHEHINT         (LVN_FIRST-13)
-#define LVN_ODFINDITEMA       (LVN_FIRST-52)
-#define LVN_ODFINDITEMW       (LVN_FIRST-79)
-#define LVN_ODFINDITEM WINELIB_NAME_AW(LVN_ODFINDITEM)
 #define LVN_ITEMACTIVATE        (LVN_FIRST-14)
 #define LVN_ODSTATECHANGED      (LVN_FIRST-15)
 #define LVN_HOTTRACK            (LVN_FIRST-21)
+#define LVN_ODFINDITEMA         (LVN_FIRST-52)
+#define LVN_ODFINDITEMW         (LVN_FIRST-79)
+#define LVN_ODFINDITEM WINELIB_NAME_AW(LVN_ODFINDITEM)
 #define LVN_GETDISPINFOA      (LVN_FIRST-50)
 #define LVN_GETDISPINFOW      (LVN_FIRST-77)
 #define LVN_GETDISPINFO WINELIB_NAME_AW(LVN_GETDISPINFO)
 #define LVN_SETDISPINFOA      (LVN_FIRST-51)
 #define LVN_SETDISPINFOW      (LVN_FIRST-78)
 #define LVN_SETDISPINFO WINELIB_NAME_AW(LVN_SETDISPINFO)
+#define LVN_KEYDOWN             (LVN_FIRST-55)
 
 #define LVA_ALIGNLEFT           0x0000
 #define LVA_DEFAULT             0x0001
@@ -2501,8 +2523,6 @@
 
 #define LV_DISPINFO     NMLVDISPINFO
 
-#define LVN_KEYDOWN     (LVN_FIRST-55)
-
 typedef struct tagLVKEYDOWN
 {
   NMHDR hdr;
@@ -2545,6 +2565,17 @@
 
 typedef INT (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM);
 
+typedef struct tagNMLVCACHEHINT
+{
+	NMHDR	hdr;
+	INT	iFrom;
+	INT	iTo;
+} NMLVCACHEHINT, *LPNMLVCACHEHINT;
+
+#define LPNM_CACHEHINT LPNMLVCACHEHINT
+#define PNM_CACHEHINT  LPNMLVCACHEHINT
+#define NM_CACHEHINT   NMLVCACHEHINT
+
 #define ListView_GetNextItem(hwnd,nItem,flags) \
     (INT)SendMessageA((hwnd),LVM_GETNEXTITEM,(WPARAM)(INT)(nItem),(LPARAM)(MAKELPARAM(flags,0)))
 #define ListView_FindItem(hwnd,nItem,plvfi) \