|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: Dlg.cpp
//
// Contents: common dialog routines.
//
// Classes:
//
// Notes:
//
// History: 05-Nov-97 rogerg Created.
//
//--------------------------------------------------------------------------
#include "precomp.h"
extern HINSTANCE g_hInst; // current instance
//+---------------------------------------------------------------------------
//
// function: AddItemsFromQueueToListView, private
//
// Synopsis: Adds the items in the Queue to the ListView.
//
// Arguments:
// int iDateColumn,int iStatusColumn - if these are >= zero
// means the Column is Valid and the proper data is initialized.
//
// Returns:
//
// Modifies:
//
// History: 30-Jul-98 rogerg Created.
//
//----------------------------------------------------------------------------
BOOL AddItemsFromQueueToListView(CListView *pItemListView,CHndlrQueue *pHndlrQueue ,DWORD dwExtStyle,LPARAM lparam,int iDateColumn,int iStatusColumn,BOOL fHandlerParent ,BOOL fAddOnlyCheckedItems) { WORD wItemID; HIMAGELIST himageSmallIcon; HANDLERINFO *pHandlerId; WCHAR wszStatusText[MAX_STRING_RES]; DWORD dwDateReadingFlags;
dwDateReadingFlags = GetDateFormatReadingFlags(pItemListView->GetHwnd());
*wszStatusText = NULL;
if (!pItemListView) { Assert(pItemListView); return FALSE; }
if (!pHndlrQueue) { Assert(pHndlrQueue); return FALSE; }
pItemListView->SetExtendedListViewStyle(dwExtStyle);
// not an error to not get the small Icon, just won't have icons.
himageSmallIcon = pItemListView->GetImageList(LVSIL_SMALL );
pHandlerId = 0;; wItemID = 0;
// loop through queue finding any
while (S_OK == pHndlrQueue->FindNextItemInState(HANDLERSTATE_PREPAREFORSYNC, pHandlerId,wItemID,&pHandlerId,&wItemID)) { INT iListViewItem; CLSID clsidDataHandler; SYNCMGRITEM offlineItem; BOOL fHiddenItem; LVITEMEX lvItemInfo; // structure to pass into ListView Calls
// grab the offline item info.
if (S_OK == pHndlrQueue->GetItemDataAtIndex(pHandlerId,wItemID,&clsidDataHandler,&offlineItem,&fHiddenItem)) { LVHANDLERITEMBLOB lvHandlerItemBlob; int iParentItemId;
// if the item is hidden don't show it in the UI
if (fHiddenItem) { continue; }
// if only add checked items and this one isn't continue on
if (fAddOnlyCheckedItems && (SYNCMGRITEMSTATE_CHECKED != offlineItem.dwItemState)) { continue; }
// Check if item is already in the ListView and if so
// go on
lvHandlerItemBlob.cbSize = sizeof(LVHANDLERITEMBLOB); lvHandlerItemBlob.clsidServer = clsidDataHandler; lvHandlerItemBlob.ItemID = offlineItem.ItemID; if (-1 != pItemListView->FindItemFromBlob((LPLVBLOB) &lvHandlerItemBlob)) { // already in ListView, go on to the next item.
continue; }
if (!fHandlerParent) { iParentItemId = LVI_ROOT; } else { // need to add to list so find parent and if one doesn't exist, create it.
lvHandlerItemBlob.cbSize = sizeof(LVHANDLERITEMBLOB); lvHandlerItemBlob.clsidServer = clsidDataHandler; lvHandlerItemBlob.ItemID = GUID_NULL;
iParentItemId = pItemListView->FindItemFromBlob((LPLVBLOB) &lvHandlerItemBlob);
if (-1 == iParentItemId) { LVITEMEX itemInfoParent; SYNCMGRHANDLERINFO SyncMgrHandlerInfo;
// if can't get the ParentInfo then don't add the Item
if (S_OK != pHndlrQueue->GetHandlerInfo(clsidDataHandler,&SyncMgrHandlerInfo)) { continue; }
// Insert the Parent.
itemInfoParent.mask = LVIF_TEXT; itemInfoParent.iItem = LVI_LAST;; itemInfoParent.iSubItem = 0; itemInfoParent.iImage = -1; itemInfoParent.pszText = SyncMgrHandlerInfo.wszHandlerName; if (himageSmallIcon) { HICON hIcon = SyncMgrHandlerInfo.hIcon ? SyncMgrHandlerInfo.hIcon : offlineItem.hIcon;
// if have toplevel handler info icon use this else use the items icon
if (hIcon) { itemInfoParent.iImage = ImageList_AddIcon(himageSmallIcon,hIcon); if (itemInfoParent.iImage != -1) { itemInfoParent.mask |= LVIF_IMAGE ; } } }
// save the blob
itemInfoParent.maskEx = LVIFEX_BLOB; itemInfoParent.pBlob = (LPLVBLOB) &lvHandlerItemBlob; iParentItemId = pItemListView->InsertItem(&itemInfoParent);
// if parent insert failed go onto the next item
if (-1 == iParentItemId) { continue; } } }
// now attempt to insert the item.
lvItemInfo.mask = LVIF_TEXT | LVIF_PARAM; lvItemInfo.maskEx = LVIFEX_PARENT | LVIFEX_BLOB; lvItemInfo.iItem = LVI_LAST; lvItemInfo.iSubItem = 0; lvItemInfo.iParent = iParentItemId; lvItemInfo.pszText = offlineItem.wszItemName; lvItemInfo.iImage = -1; // set to -1 in case can't get image.
lvItemInfo.lParam = lparam;
if (himageSmallIcon && offlineItem.hIcon) { lvItemInfo.iImage = ImageList_AddIcon(himageSmallIcon,offlineItem.hIcon); lvItemInfo.mask |= LVIF_IMAGE ; }
// setup the blob
lvHandlerItemBlob.ItemID = offlineItem.ItemID; lvItemInfo.pBlob = (LPLVBLOB) &lvHandlerItemBlob;
iListViewItem = lvItemInfo.iItem = pItemListView->InsertItem(&lvItemInfo);
if (-1 == iListViewItem) { continue; }
// if the item has a date column insert it and the item
// has a last update time.
if (iDateColumn >= 0 && (offlineItem.dwFlags & SYNCMGRITEM_LASTUPDATETIME)) { SYSTEMTIME sysTime; FILETIME filetime; WCHAR DateTime[256]; LPWSTR pDateTime = DateTime; int cchWritten;
lvItemInfo.mask = LVIF_TEXT; lvItemInfo.iSubItem = iDateColumn; lvItemInfo.maskEx = 0;
FileTimeToLocalFileTime(&(offlineItem.ftLastUpdate),&filetime); FileTimeToSystemTime(&filetime,&sysTime);
// insert date in form of date<space>hour
*DateTime = NULL;
// want to insert the date
if (cchWritten = GetDateFormat(NULL,DATE_SHORTDATE | dwDateReadingFlags,&sysTime,NULL,pDateTime,ARRAYSIZE(DateTime))) { pDateTime += (cchWritten -1); // move number of characters written. (cchWritten includes the NULL)
*pDateTime = TEXT(' '); // pDateTime is now ponting at the NULL character.
++pDateTime; // if left to right add the LRM
if (DATE_LTRREADING & dwDateReadingFlags) { *pDateTime = LRM; ++pDateTime; }
// no try to get the hours if fails we make sure that the last char is NULL;
if (!GetTimeFormat(NULL,TIME_NOSECONDS,&sysTime,NULL,pDateTime,ARRAYSIZE(DateTime) - cchWritten)) { *pDateTime = NULL; } }
lvItemInfo.pszText = DateTime;
pItemListView->SetItem(&lvItemInfo); // if fail, then just don't have any date.
}
if (iStatusColumn >= 0) { lvItemInfo.iSubItem = iStatusColumn; lvItemInfo.maskEx = 0;
lvItemInfo.mask = LVIF_TEXT;
if (NULL == *wszStatusText) { LoadString(g_hInst, IDS_PENDING,wszStatusText, MAX_STRING_RES); }
lvItemInfo.pszText = wszStatusText;
pItemListView->SetItem(&lvItemInfo); // if fail, then just don't have any date.
}
// if the listbox has checkBoxes then set the CheckState accordingly
if (LVS_EX_CHECKBOXES & dwExtStyle) { if (SYNCMGRITEMSTATE_CHECKED == offlineItem.dwItemState) { lvItemInfo.state = LVIS_STATEIMAGEMASK_CHECK; } else { lvItemInfo.state = LVIS_STATEIMAGEMASK_UNCHECK; }
// if LVS_EX_CHECKBOXES set then setup the CheckBox State setitem State, must do after insert
pItemListView->SetItemState(iListViewItem,lvItemInfo.state,LVIS_STATEIMAGEMASK); } } }
// now loop through to see if any handlers that want to always show but don't
// yet have any items have been added
if (fHandlerParent) { LVHANDLERITEMBLOB lvHandlerItemBlob; int iParentItemId; HANDLERINFO *pHandlerID = 0; CLSID clsidDataHandler;
while (S_OK == pHndlrQueue->FindNextHandlerInState(pHandlerID, GUID_NULL,HANDLERSTATE_PREPAREFORSYNC,&pHandlerID ,&clsidDataHandler)) { SYNCMGRHANDLERINFO SyncMgrHandlerInfo;
// if can't get the ParentInfo then don't add.
if (S_OK != pHndlrQueue->GetHandlerInfo(clsidDataHandler,&SyncMgrHandlerInfo)) { continue; }
// only add if handler says too
if (!(SYNCMGRHANDLER_ALWAYSLISTHANDLER & SyncMgrHandlerInfo.SyncMgrHandlerFlags)) { continue; }
// need to add to list so find parent and if one doesn't exist, create it.
lvHandlerItemBlob.cbSize = sizeof(LVHANDLERITEMBLOB); lvHandlerItemBlob.clsidServer = clsidDataHandler; lvHandlerItemBlob.ItemID = GUID_NULL;
iParentItemId = pItemListView->FindItemFromBlob((LPLVBLOB) &lvHandlerItemBlob);
if (-1 == iParentItemId) { LVITEMEX itemInfoParent;
// Insert the Parent.
itemInfoParent.mask = LVIF_TEXT; itemInfoParent.iItem = LVI_LAST;; itemInfoParent.iSubItem = 0; itemInfoParent.iImage = -1;
itemInfoParent.pszText = SyncMgrHandlerInfo.wszHandlerName; if (himageSmallIcon) { HICON hIcon = SyncMgrHandlerInfo.hIcon;
// if have toplevel handler info icon use this else use the items icon
if (hIcon) { itemInfoParent.iImage = ImageList_AddIcon(himageSmallIcon, hIcon); if (itemInfoParent.iImage != -1) { itemInfoParent.mask |= LVIF_IMAGE ; } } }
// save the blob
itemInfoParent.maskEx = LVIFEX_BLOB; itemInfoParent.pBlob = (LPLVBLOB) &lvHandlerItemBlob; iParentItemId = pItemListView->InsertItem(&itemInfoParent); } } }
return TRUE; }
|