278 lines
8.3 KiB
C
278 lines
8.3 KiB
C
// 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;
|
|
}
|