windows-nt/Source/XPSP1/NT/shell/comctl32/v5/lvfile.c
2020-09-26 16:20:57 +08:00

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;
}