// BUGBUG: this code is not used anymore! #include "shellprv.h" #include "listview.h" // Internal STREAM entry points BOOL Stream_WriteString(STREAM FAR* pstm, LPCTSTR psz); LPTSTR Stream_ReadString(STREAM FAR* pstm); UINT Stream_ReadStringBuffer(STREAM FAR* pstm, LPTSTR psz, UINT cb); // Read or write a ListView to a stream. flags indicate what aspects /* ;Internal */ // of the listview to write out. If aspects of a ListView state are /* ;Internal */ // not written, default values will be used when read back in. /* ;Internal */ // /* ;Internal */ #define LVRW_ICONS 0x0001 /* ;Internal */ #define LVRW_SMALLICONS 0x0002 /* ;Internal */ #define LVRW_FONT 0x0004 /* ;Internal */ #define LVRW_LPARAMS 0x0008 /* ;Internal */ #define LVRW_COLINFO 0x0010 /* ;Internal */ #define LVRW_ENUMORDER 0x0020 /* ;Internal */ /* ;Internal */ // BOOL ListView_Write(HWND hwndLV, STREAM FAR* pstm, UINT flags); /* ;Internal */ #define LVM_WRITE (LVM_FIRST + 31) /* ;Internal */ #define ListView_Write(hwndLV, pstm, flags) /* ;Internal */ \ (BOOL)SendMessage((hwndLV), LVM_WRITE, /* ;Internal */ \ (WPARAM)(BOOL)(flags), /* ;Internal */ \ (LPARAM)(STREAM FAR*)(pstm)) /* ;Internal */ /* ;Internal */ typedef struct _LV_READINFO /* ;Internal */ { /* ;Internal */ UINT flags; /* ;Internal */ HINSTANCE hinst; /* ;Internal */ HWND hwndParent; /* ;Internal */ } LV_READINFO; /* ;Internal */ /* ;Internal */ // HWND ListView_Read(STREAM FAR* pstm, LV_READINFO FAR* pinfo); /* ;Internal */ // BUGBUG This can't be a message! How do we want this to work? /* ;Internal */ #define LVM_READ (LVM_FIRST + 32) /* ;Internal */ #define ListView_Read(plv, pinfo) /* ;Internal */ /* ;Internal */ #define LV_MAGIC (TEXT('L') | (TEXT('V') << (8 * sizeof(TCHAR)))) typedef struct _LV_STREAMHDR { UINT magic; UINT flags; UINT style; UINT id; POINT ptOrigin; COLORREF clrBk; int cItem; } LV_STREAMHDR; typedef struct _LV_ITEMHDR { POINT pt; UINT state; int iImage; int iZOrder; } LV_ITEMHDR; BOOL NEAR ListView_OnWrite(LV* plv, STREAM FAR* pstm, UINT flags) { int i; LV_STREAMHDR hdr; hdr.magic = LV_MAGIC; hdr.flags = flags; hdr.style = plv->style; hdr.id = GetWindowID(plv->hwnd); hdr.ptOrigin = plv->ptOrigin; hdr.clrBk = plv->clrBk; hdr.cItem = ListView_Count(plv); if (!Stream_Write(pstm, &hdr, sizeof(hdr))) return FALSE; for (i = 0; i < hdr.cItem; i++) { LV_ITEMHDR ihdr; LISTITEM FAR* pitem = ListView_FastGetItemPtr(plv, i); ihdr.pt.x = pitem->pt.x; ihdr.pt.y = pitem->pt.y; ihdr.state = pitem->state; ihdr.iImage = pitem->iImage; ihdr.iZOrder = ListView_ZOrderIndex(plv, i); if (!Stream_Write(pstm, &ihdr, sizeof(ihdr))) return FALSE; if (flags & LVRW_LPARAMS) { if (!Stream_Write(pstm, &pitem->lParam, sizeof(pitem->lParam))) return FALSE; } if (!Stream_WriteString(pstm, pitem->pszText)) return FALSE; } if (flags & LVRW_FONT) { // REVIEW: Need to optionally write out log font... } if (flags & LVRW_ICONS) { if (!ImageList_Write(plv->himl, pstm)) return FALSE; } if (flags & LVRW_SMALLICONS) { if (!ImageList_Write(plv->himlSmall, pstm)) return FALSE; } if (!Stream_Flush(pstm)) return FALSE; return TRUE; } HWND NEAR ListView_OnRead(STREAM FAR* pstm, LV_READINFO FAR* pinfo) { HWND hwndLV; int i; LV* plv; LV_STREAMHDR hdr; BOOL fSuccess; UINT flags = pinfo->flags; fSuccess = FALSE; hwndLV = NULL; if (!Stream_Read(pstm, &hdr, sizeof(hdr))) return FALSE; if (hdr.magic != LV_MAGIC || hdr.flags != flags) return FALSE; // REVIEW: Could create window always with LVS_SHAREIMAGELISTS // so we don't have to destroy and recreate the imagelists // later. Probably only a negligible speed savings, though. // hwndLV = CreateWindowEx( 0L, // extendedStyle c_szListViewClass, // class name NULL, // text WS_CHILD | (DWORD)hdr.style, 0, 0, 0, 0, // x, y, cx, cy pinfo->hwndParent, // hwndParent (HMENU)hdr.id, // child window id pinfo->hinst, // hInstance NULL); if (!hwndLV) return FALSE; plv = ListView_GetPtr(hwndLV); if (!plv) goto Error; plv->ptOrigin = hdr.ptOrigin; plv->clrBk = hdr.clrBk; // Grow the Z-order array to cItem items... // for (i = 0; i < hdr.cItem; i++) { // Add a non-NULL item so we can test return value // of ReplaceItem() later... // if (DPA_InsertPtr(plv->hdpaZOrder, i, (void FAR*)1) == -1) goto Error; } for (i = 0; i < hdr.cItem; i++) { int i2; LV_ITEMHDR ihdr; LV_ITEM item; LISTITEM FAR* pitem; LPTSTR pszText; if (!Stream_Read(pstm, &ihdr, sizeof(ihdr))) goto Error; item.mask = LVIF_ALL; item.pszText = NULL; item.state = 0; item.iImage = ihdr.iImage; item.lParam = 0L; pitem = ListView_CreateItem(plv, &item); if (!pitem) goto Error; if (flags & LVRW_LPARAMS) { if (!Stream_Read(pstm, &pitem->lParam, sizeof(pitem->lParam))) goto Error; } pszText = Stream_ReadString(pstm); if (!pszText) { ListView_FreeItem(plv, pitem); goto Error; } pitem->pt.y = (short)ihdr.pt.y; pitem->pt.x = (short)ihdr.pt.x; pitem->state = ihdr.state; pitem->pszText = pszText; // If sorted, then insert sorted. // i2 = i; if (plv->style & (LVS_SORTASCENDING | LVS_SORTDESCENDING)) i2 = ListView_LookupString(plv, pszText, LVFI_SUBSTRING | LVFI_NEARESTXY, 0); if (DPA_InsertPtr(plv->hdpa, i2, (void FAR*)pitem) == -1) { ListView_FreeItem(plv, pitem); goto Error; } // Now set the Z order. // if (!DPA_SetPtr(plv->hdpaZOrder, ihdr.iZOrder, (void FAR*)i2)) goto Error; } if (flags & LVRW_FONT) { // REVIEW: Need to read & setfont } if (flags & LVRW_ICONS) { ImageList_Destroy(plv->himl); plv->himl = ImageList_Read(pstm); if (!plv->himl) goto Error; } if (flags & LVRW_SMALLICONS) { ImageList_Destroy(plv->himlSmall); plv->himlSmall = ImageList_Read(pstm); if (!plv->himlSmall) goto Error; } plv->rcView.left = RECOMPUTE; // Instead of sending out a zillion creates (one for each item we just // created), just destroy and re-create ourselves. ListView_NotifyRecreate(plv); fSuccess = TRUE; Error: if (!fSuccess && hwndLV) { DestroyWindow(hwndLV); hwndLV = NULL; } return hwndLV; }