Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
propdlg.c
Package: shell.rar [view]
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 134k
Category:
Windows Kernel
Development Platform:
Visual C++
- ////////////////////////////////////////////////////////////////////////////////
- //
- // propdlg.c
- //
- // The Properties dialog for MS Office.
- //
- // Change history:
- //
- // Date Who What
- // --------------------------------------------------------------------------
- // 06/09/94 B. Wentz Created file
- // 01/16/95 martinth Finished sticky dlg stuff. Lemme just say that
- // it's pretty lame. We have to call ApplyStickyDlgCoor
- // in the first WM_INITDIALOG, don't ask me why,
- // but otherwise we have redraw problems. Likewise,
- // we have to call SetStickyDlgCoor in the first
- // PSN_RESET/PSN_APPLY, I have no idea why, since
- // the main dialog shouldn't have been deleted but
- // it is. Thus we have to add calls everywhere.
- // Could it be that the tabs are getting deleted
- // one by one and the dialog changes size? Dunno.
- // But this works, so change at your own risk!;-)
- // 07/08/96 MikeHill Ignore unsupported (non-UDTYPE) properties.
- ////////////////////////////////////////////////////////////////////////////////
- #include "priv.h"
- #pragma hdrstop
- #include <winnls.h>
- #include <prsht.h>
- #include <commctrl.h>
- #include <shlwapi.h>
- #include <shlapip.h>
- #include "propdlg.h"
- #include "strings.h"
- #include "msohelp.h"
- // Max size of time/date string
- #define TIMEDATEMAX 256
- // Check button actions
- #define CLEAR 0
- #define CHECKED 1
- #define GREYED 2
- // Number of property sheet pages
- #define PAGESMAX 5
- // Max size for "short" temp buffers
- #define SHORTBUFMAX 128
- // The pages
- #ifdef _WIN2000_DOCPROP_
- #define itabCUSTOM 0
- #define itabFIRST itabCUSTOM
- #else //_WIN2000_DOCPROP_
- #define itabGENERAL 0
- #define itabSUMMARY 1
- #define itabSTATISTICS 2
- #define itabCONTENTS 3
- #define itabCUSTOM 4
- #define itabFIRST itabSUMMARY
- #endif //_WIN2000_DOCPROP_
- // Defines for printing file sizes
- #define DELIMITER TEXT(',')
- #define iszBYTES 0
- #define iszORDERKB 1
- #define iszORDERMB 2
- #define iszORDERGB 3
- #define iszORDERTB 4
- static TCHAR rgszOrders[iszORDERTB+1][SHORTBUFMAX];
- // "bytes", // iszBYTES
- // "KB", // iszORDERKB
- // "MB", // iszORDERMB
- // "GB", // iszORDERGB
- // "TB" // iszORDERTB
- // note that szBYTES is defined above...
- #define iszPAGES 1
- #define iszPARA 2
- #define iszLINES 3
- #define iszWORDS 4
- #define iszCHARS 5
- #define iszSLIDES 6
- #define iszNOTES 7
- #define iszHIDDENSLIDES 8
- #define iszMMCLIPS 9
- #define iszFORMAT 10
- // Strings for the statistics listbox
- static TCHAR rgszStats[iszFORMAT+1][SHORTBUFMAX];
- // "Bytes:", // iszBYTES
- // "Pages:", // iszPAGES
- // "Paragraphs:", // iszPARA
- // "Lines:", // iszLINES
- // "Words:", // iszWORDS
- // "Characters:", // iszCHARS
- // "Slides:", // iszSLIDES
- // "Notes:", // iszNOTES
- // "Hidden Slides:", // iszHIDDENSLIDES
- // "Multimedia Clips:", // iszMMCLIPS
- // "Presentation Format:"// iszFORMAT
- #define BASE10 10
- // Number of pre-defined custom names
- #define NUM_BUILTIN_CUSTOM_NAMES 27
- #define iszTEXT 0
- #define iszDATE 1
- #define iszNUM 2
- #define iszBOOL 3
- #define iszUNKNOWN 4
- // Strings for the types of user-defined properties
- static TCHAR rgszTypes[iszUNKNOWN+1][SHORTBUFMAX];
- // "Text", // iszTEXT
- // "Date", // iszDATE
- // "Number", // iszNUM
- // "Yes or No", // iszBOOL
- // "Unknown" // iszUNKNOWN
- #define iszNAME 0
- #define iszVAL 1
- #define iszTYPE 2
- // Strings for the column headings for the statistics tab
- static TCHAR rgszStatHeadings[iszVAL+1][SHORTBUFMAX];
- // "Statistic Name", // iszNAME
- // "Value" // iszVAL
- // Strings for the column headings for custom tab
- static TCHAR rgszHeadings[iszTYPE+1][SHORTBUFMAX];
- // "Property Name", // iszNAME
- // "Value", // iszVAL
- // "Type" // iszTYPE
- #define iszTRUE 0
- #define iszFALSE 1
- // Strings for Booleans
- static TCHAR rgszBOOL[iszFALSE+1][SHORTBUFMAX];
- // "Yes", // iszTRUE
- // "No" // iszFALSE
- #define iszADD 0
- #define iszMODIFY 1
- // Strings for the Add button
- static TCHAR rgszAdd[iszMODIFY+1][SHORTBUFMAX];
- // "Add", // iszADD
- // "Modify" // iszMODIFY
- #define iszVALUE 0
- #define iszSOURCE 1
- // Strings for the source/value caption
- static TCHAR rgszValue[iszSOURCE+1][SHORTBUFMAX];
- // "Value:", // iszVALUE
- // "Source:" // iszSOURCE
- // Date formatting codes
- #define MMDDYY TEXT('0')
- #define DDMMYY TEXT('1')
- #define YYMMDD TEXT('2')
- #define OLEEPOCH 1900
- #define SYSEPOCH 1601
- #define ONECENTURY 100
- #define YEARINCENTURY(year) ((year) % ONECENTURY)
- #define CENTURYFROMYEAR(year) ((year) - YEARINCENTURY(year))
- //
- // Global data, to be deleted when FShowOfficePropDlg exits
- //
- static LPTSTR glpstzName;
- static LPTSTR glpstzValue;
- static int giLinkIcon;
- static int giInvLinkIcon;
- static int giBlankIcon;
- static HBRUSH hBrushPropDlg = NULL;
- const TCHAR g_szHelpFile[] = TEXT("windows.hlp");
- //
- // Internal prototypes
- //
- INT_PTR CALLBACK FGeneralDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
- INT_PTR CALLBACK FSummaryDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
- INT_PTR CALLBACK FStatisticsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
- INT_PTR CALLBACK FCustomDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
- INT_PTR CALLBACK FContentsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
- INT_PTR CALLBACK FPropHeaderDlgProc (HWND hwnd, UINT message, LONG lParam);
- //static int CALLBACK ListViewCompareFunc(LPARAM, LPARAM, LPARAM);
- void PASCAL SetEditValLpsz (LPPROPVARIANT lppropvar, HWND hdlg, DWORD dwID );
- BOOL PASCAL GetEditValLpsz (LPPROPVARIANT lppropvar, HWND hDlg, DWORD dwId);
- BOOL PASCAL FAllocAndGetValLpstz (HWND hDlg, DWORD dwId, LPTSTR *lplpstz);
- BOOL PASCAL FAllocString (LPTSTR *lplpstz, DWORD cb);
- void PASCAL ClearEditControl (HWND hDlg, DWORD dwId);
- UDTYPES PASCAL UdtypesGetNumberType (LPTSTR lpstz, NUM *lpnumval,
- BOOL (*lpfnFSzToNum)(NUM *, LPTSTR));
- void PASCAL PrintTimeInDlg (HWND hDlg, DWORD dwId, FILETIME *pft);
- void PASCAL PrintEditTimeInDlg (HWND hDlg, FILETIME *pft);
- void PASCAL AddItemToListView (HWND hWnd, DWORD_PTR dw, const TCHAR *lpsz, BOOL fString);
- void PASCAL PopulateUDListView (HWND hWnd, LPUDOBJ lpUDObj);
- void PASCAL AddUDPropToListView (LPUDOBJ lpUDObj, HWND hWnd, LPTSTR lpszName, LPPROPVARIANT lppropvar, int iItem,
- BOOL fLink, BOOL fLinkInvalid, BOOL fMakeVisible);
- VOID PASCAL InitListView (HWND hDlg, int irgLast, TCHAR rgsz[][SHORTBUFMAX], BOOL fImageList);
- WORD PASCAL WUdtypeToSz (LPPROPVARIANT lppropvar, LPTSTR sz, DWORD cchMax,
- BOOL (*lpfnFNumToSz)(NUM *, LPTSTR, DWORD));
- BOOL PASCAL FSwapControls (HWND hWndVal, HWND hWndLinkVal, HWND hWndBoolTrue, HWND hWndBoolFalse, HWND hWndGroup, HWND hWndType, HWND hWndValText, BOOL fLink, BOOL fBool);
- VOID PASCAL PopulateControls (LPUDOBJ lpUDObj, LPTSTR szName, DWORD cLinks, DWQUERYLD lpfnDwQueryLinkData, HWND hDlg,
- HWND hWndName, HWND hWndVal, HWND hWndValText, HWND hWndLink, HWND hWndLinkVal, HWND hWndType,
- HWND hWndBoolTrue, HWND hWndBoolFalse, HWND hWndGroup, HWND hWndAdd, HWND hWndDelete, BOOL *pfLink, BOOL *pfAdd);
- BOOL PASCAL FSetupAddButton (DWORD iszType, BOOL fLink, BOOL *pfAdd, HWND hWndAdd, HWND hWndVal, HWND hWndName, HWND hDlg);
- BOOL PASCAL FCreateListOfLinks (DWORD cLinks, DWQUERYLD lpfnDwQueryLinkData, HWND hWndLinkVal);
- BOOL PASCAL FSetTypeControl (UDTYPES udtype, HWND hWndType);
- void PASCAL DeleteItem (LPUDOBJ lpUDObj, HWND hWndLV, int iItem, TCHAR sz[]);
- void PASCAL ResetTypeControl (HWND hDlg, DWORD dwId, DWORD *piszType);
- BOOL PASCAL FDisplayConversionWarning (HWND hDlg);
- BOOL PASCAL FLoadTextStrings (void);
- BOOL FGetCustomPropFromDlg(LPALLOBJS lpallobjs, HWND hDlg);
- VOID SetCustomDlgDefButton(HWND hDlg, int IDNew);
- INT PASCAL ISavePropDlgChanges(LPALLOBJS, HWND, HWND);
- /* WinHelp stuff. */
- static const DWORD rgIdhGeneral[] =
- {
- IDD_ITEMICON, IDH_GENERAL_ICON,
- IDD_NAME, IDH_GENERAL_NAME_BY_ICON,
- IDD_FILETYPE, IDH_GENERAL_FILETYPE,
- IDD_FILETYPE_LABEL, IDH_GENERAL_FILETYPE,
- IDD_LOCATION, IDH_GENERAL_LOCATION,
- IDD_LOCATION_LABEL, IDH_GENERAL_LOCATION,
- IDD_FILESIZE, IDH_GENERAL_FILESIZE,
- IDD_FILESIZE_LABEL, IDH_GENERAL_FILESIZE,
- IDD_FILENAME, IDH_GENERAL_MSDOSNAME,
- IDD_FILENAME_LABEL, IDH_GENERAL_MSDOSNAME,
- IDD_CREATED, IDH_GENERAL_CREATED,
- IDD_CREATED_LABEL, IDH_GENERAL_CREATED,
- IDD_LASTMODIFIED, IDH_GENERAL_MODIFIED,
- IDD_LASTMODIFIED_LABEL, IDH_GENERAL_MODIFIED,
- IDD_LASTACCESSED, IDH_GENERAL_ACCESSED,
- IDD_LASTACCESSED_LABEL, IDH_GENERAL_ACCESSED,
- IDD_ATTRIBUTES_LABEL, IDH_GENERAL_ATTRIBUTES,
- IDD_READONLY, IDH_GENERAL_READONLY,
- IDD_HIDDEN, IDH_GENERAL_HIDDEN,
- IDD_ARCHIVE, IDH_GENERAL_ARCHIVE,
- IDD_SYSTEM, IDH_GENERAL_SYSTEM
- };
- static const DWORD rgIdhSummary[] =
- {
- IDD_SUMMARY_TITLE, IDH_SUMMARY_TITLE,
- IDD_SUMMARY_TITLE_LABEL, IDH_SUMMARY_TITLE,
- IDD_SUMMARY_SUBJECT, IDH_SUMMARY_SUBJECT,
- IDD_SUMMARY_SUBJECT_LABEL, IDH_SUMMARY_SUBJECT,
- IDD_SUMMARY_AUTHOR, IDH_SUMMARY_AUTHOR,
- IDD_SUMMARY_AUTHOR_LABEL, IDH_SUMMARY_AUTHOR,
- IDD_SUMMARY_MANAGER, IDH_SUMMARY_MANAGER,
- IDD_SUMMARY_MANAGER_LABEL, IDH_SUMMARY_MANAGER,
- IDD_SUMMARY_COMPANY, IDH_SUMMARY_COMPANY,
- IDD_SUMMARY_COMPANY_LABEL, IDH_SUMMARY_COMPANY,
- IDD_SUMMARY_CATEGORY, IDH_SUMMARY_CATEGORY,
- IDD_SUMMARY_CATEGORY_LABEL, IDH_SUMMARY_CATEGORY,
- IDD_SUMMARY_KEYWORDS, IDH_SUMMARY_KEYWORDS,
- IDD_SUMMARY_KEYWORDS_LABEL, IDH_SUMMARY_KEYWORDS,
- IDD_SUMMARY_COMMENTS, IDH_SUMMARY_COMMENTS,
- IDD_SUMMARY_COMMENTS_LABEL, IDH_SUMMARY_COMMENTS,
- IDD_SUMMARY_TEMPLATE, IDH_SUMMARY_TEMPLATE,
- IDD_SUMMARY_TEMPLATETEXT, IDH_SUMMARY_TEMPLATE,
- IDD_SUMMARY_SAVEPREVIEW, IDH_SUMMARY_SAVEPREVIEW
- };
- static const DWORD rgIdhStatistics[] =
- {
- IDD_STATISTICS_CREATED, IDH_STATISTICS_CREATED,
- IDD_STATISTICS_CREATED_LABEL, IDH_STATISTICS_CREATED,
- IDD_STATISTICS_CHANGED, IDH_STATISTICS_MODIFIED,
- IDD_STATISTICS_CHANGED_LABEL, IDH_STATISTICS_MODIFIED,
- IDD_STATISTICS_ACCESSED, IDH_STATISTICS_ACCESSED,
- IDD_STATISTICS_ACCESSED_LABEL, IDH_STATISTICS_ACCESSED,
- IDD_STATISTICS_LASTPRINT, IDH_STATISTICS_LASTPRINT,
- IDD_STATISTICS_LASTPRINT_LABEL, IDH_STATISTICS_LASTPRINT,
- IDD_STATISTICS_LASTSAVEBY, IDH_STATISTICS_LASTSAVEBY,
- IDD_STATISTICS_LASTSAVEBY_LABEL, IDH_STATISTICS_LASTSAVEBY,
- IDD_STATISTICS_REVISION, IDH_STATISTICS_REVISION,
- IDD_STATISTICS_REVISION_LABEL, IDH_STATISTICS_REVISION,
- IDD_STATISTICS_TOTALEDIT, IDH_STATISTICS_TOTALEDIT,
- IDD_STATISTICS_TOTALEDIT_LABEL, IDH_STATISTICS_TOTALEDIT,
- IDD_STATISTICS_LVLABEL, IDH_STATISTICS_LISTVIEW,
- IDD_STATISTICS_LISTVIEW, IDH_STATISTICS_LISTVIEW
- };
- static const DWORD rgIdhContents[] =
- {
- IDD_CONTENTS_LISTBOX_LABEL, IDH_CONTENTS_LISTBOX,
- IDD_CONTENTS_LISTBOX, IDH_CONTENTS_LISTBOX
- };
- static const DWORD rgIdhCustom[] =
- {
- IDD_CUSTOM_NAME, IDH_CUSTOM_NAME,
- IDD_CUSTOM_NAME_LABEL, IDH_CUSTOM_NAME,
- IDD_CUSTOM_TYPE, IDH_CUSTOM_TYPE,
- IDD_CUSTOM_TYPE_LABEL, IDH_CUSTOM_TYPE,
- IDD_CUSTOM_VALUE, IDH_CUSTOM_VALUE,
- IDD_CUSTOM_VALUETEXT, IDH_CUSTOM_VALUE,
- IDD_CUSTOM_LINKVALUE, IDH_CUSTOM_LINKVALUE,
- IDD_CUSTOM_BOOLTRUE, IDH_CUSTOM_BOOLYES,
- IDD_CUSTOM_BOOLFALSE, IDH_CUSTOM_BOOLYES,
- IDD_CUSTOM_ADD, IDH_CUSTOM_ADDBUTTON,
- IDD_CUSTOM_DELETE, IDH_CUSTOM_DELETEBUTTON,
- IDD_CUSTOM_LINK, IDH_CUSTOM_LINKCHECK,
- IDD_CUSTOM_LISTVIEW, IDH_CUSTOM_LISTVIEW,
- IDD_CUSTOM_LISTVIEW_LABEL, IDH_CUSTOM_LISTVIEW
- };
- void FOfficeInitPropInfo(PROPSHEETPAGE * lpPsp, DWORD dwFlags, LPARAM lParam, LPFNPSPCALLBACK pfnCallback)
- {
- #ifndef _WIN2000_DOCPROP_
- lpPsp[itabSUMMARY-itabFIRST].dwSize = sizeof(PROPSHEETPAGE);
- lpPsp[itabSUMMARY-itabFIRST].dwFlags = dwFlags;
- lpPsp[itabSUMMARY-itabFIRST].hInstance = g_hmodThisDll;
- lpPsp[itabSUMMARY-itabFIRST].pszTemplate = MAKEINTRESOURCE (IDD_SUMMARY);
- lpPsp[itabSUMMARY-itabFIRST].pszIcon = NULL;
- lpPsp[itabSUMMARY-itabFIRST].pszTitle = NULL;
- lpPsp[itabSUMMARY-itabFIRST].pfnDlgProc = FSummaryDlgProc;
- lpPsp[itabSUMMARY-itabFIRST].pfnCallback = pfnCallback;
- lpPsp[itabSUMMARY-itabFIRST].pcRefParent = NULL;
- lpPsp[itabSUMMARY-itabFIRST].lParam = lParam;
- lpPsp[itabSTATISTICS-itabFIRST].dwSize = sizeof(PROPSHEETPAGE);
- lpPsp[itabSTATISTICS-itabFIRST].dwFlags = dwFlags;
- lpPsp[itabSTATISTICS-itabFIRST].hInstance = g_hmodThisDll;
- lpPsp[itabSTATISTICS-itabFIRST].pszTemplate = MAKEINTRESOURCE (IDD_STATISTICS);
- lpPsp[itabSTATISTICS-itabFIRST].pszIcon = NULL;
- lpPsp[itabSTATISTICS-itabFIRST].pszTitle = NULL;
- lpPsp[itabSTATISTICS-itabFIRST].pfnDlgProc = FStatisticsDlgProc;
- lpPsp[itabSTATISTICS-itabFIRST].pfnCallback = pfnCallback;
- lpPsp[itabSTATISTICS-itabFIRST].pcRefParent = NULL;
- lpPsp[itabSTATISTICS-itabFIRST].lParam = lParam;
- lpPsp[itabCONTENTS-itabFIRST].dwSize = sizeof(PROPSHEETPAGE);
- lpPsp[itabCONTENTS-itabFIRST].dwFlags = dwFlags;
- lpPsp[itabCONTENTS-itabFIRST].hInstance = g_hmodThisDll;
- lpPsp[itabCONTENTS-itabFIRST].pszTemplate = MAKEINTRESOURCE (IDD_CONTENTS);
- lpPsp[itabCONTENTS-itabFIRST].pszIcon = NULL;
- lpPsp[itabCONTENTS-itabFIRST].pszTitle = NULL;
- lpPsp[itabCONTENTS-itabFIRST].pfnDlgProc = FContentsDlgProc;
- lpPsp[itabCONTENTS-itabFIRST].pfnCallback = pfnCallback;
- lpPsp[itabCONTENTS-itabFIRST].pcRefParent = NULL;
- lpPsp[itabCONTENTS-itabFIRST].lParam = lParam;
- #endif // _WIN2000_DOCPROP_
- lpPsp[itabCUSTOM-itabFIRST].dwSize = sizeof(PROPSHEETPAGE);
- lpPsp[itabCUSTOM-itabFIRST].dwFlags = dwFlags;
- lpPsp[itabCUSTOM-itabFIRST].hInstance = g_hmodThisDll;
- lpPsp[itabCUSTOM-itabFIRST].pszTemplate = MAKEINTRESOURCE (IDD_CUSTOM);
- lpPsp[itabCUSTOM-itabFIRST].pszIcon = NULL;
- lpPsp[itabCUSTOM-itabFIRST].pszTitle = NULL;
- lpPsp[itabCUSTOM-itabFIRST].pfnDlgProc = FCustomDlgProc;
- lpPsp[itabCUSTOM-itabFIRST].pfnCallback = pfnCallback;
- lpPsp[itabCUSTOM-itabFIRST].pcRefParent = NULL;
- lpPsp[itabCUSTOM-itabFIRST].lParam = lParam;
- }
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Attach
- //
- // Purpose:
- // Assigns HPROPSHEETPAGE to appropriate data block member.
- //
- ////////////////////////////////////////////////////////////////////////////////
- BOOL FAttach( LPALLOBJS lpallobjs, PROPSHEETPAGE* ppsp, HPROPSHEETPAGE hPage )
- {
- #define ASSIGN_PAGE_HANDLE( pfn, phpage )
- if( ppsp->pfnDlgProc == pfn ) { *(phpage) = hPage ; return TRUE ; }
- #if _WIN2000_DOCPROP_
- ASSIGN_PAGE_HANDLE( FCustomDlgProc, &lpallobjs->lpUDObj->m_hPage );
- #else // _WIN2000_DOCPROP_
- ASSIGN_PAGE_HANDLE( FSummaryDlgProc, &lpallobjs->lpSIObj->m_hPage );
- ASSIGN_PAGE_HANDLE( FStatisticsDlgProc, &lpallobjs->lpDSIObj->m_hPage );
- ASSIGN_PAGE_HANDLE( FCustomDlgProc, &lpallobjs->lpUDObj->m_hPage );
- #endif // _WIN2000_DOCPROP_
- return FALSE;
- }
- ////////////////////////////////////////////////////////////////////////////////
- //
- // PropPageInit
- //
- // Purpose:
- // Keep track which pages have been init, such that we can know when we
- // can do the apply.
- //
- ////////////////////////////////////////////////////////////////////////////////
- void PropPageInit(LPALLOBJS lpallobjs, int iPage)
- {
- if (iPage > lpallobjs->iMaxPageInit)
- lpallobjs->iMaxPageInit = iPage;
- }
- ////////////////////////////////////////////////////////////////////////////////
- //
- // ApplyChangesBackToFile
- //
- // Purpose:
- // See if this is now the time to apply the changes back to the file
- //
- ////////////////////////////////////////////////////////////////////////////////
- BOOL ApplyChangesBackToFile(
- HWND hDlg,
- BOOL bFinalEdit /* user clicked OK rather than Apply*/,
- LPALLOBJS lpallobjs,
- int iPage)
- {
- HRESULT hres;
- BOOL fOK = FALSE;
- LPSTORAGE lpStg;
- WCHAR wszPath[ MAX_PATH ];
- if (iPage != lpallobjs->iMaxPageInit)
- return TRUE; // no errors
- #ifdef UNICODE
- lstrcpyn(wszPath, lpallobjs->szPath, ARRAYSIZE(wszPath));
- #else
- MultiByteToWideChar(CP_ACP, 0, lpallobjs->szPath, -1, wszPath, ARRAYSIZE(wszPath));
- #endif
- #ifdef WINNT
- hres = StgOpenStorageEx(wszPath,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,STGFMT_ANY,0,NULL,NULL,
- &IID_IStorage, (void**)&lpStg );
- #else
- hres = StgOpenStorage(wszPath, NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, 0L, &lpStg );
- #endif
- if (SUCCEEDED(hres) && lpStg)
- {
- MESSAGE(TEXT("Now trying to save out properties"));
- fOK = (BOOL)DwOfficeSaveProperties( lpStg,
- lpallobjs->lpSIObj,
- lpallobjs->lpDSIObj,
- lpallobjs->lpUDObj,
- 0, // Flags
- STGM_READWRITE | STGM_SHARE_EXCLUSIVE
- );
- // Release the Storage (we don't need to commit it;
- // it's in dicrect-mode).
- lpStg->lpVtbl->Release (lpStg);
- lpStg= NULL;
- //
- // if we did properly save out the properties, than we should
- // clear the we have changed things flag...
- //
- if (fOK)
- {
- lpallobjs->fPropDlgChanged = FALSE;
- lpallobjs->fPropDlgPrompted = FALSE;
- }
- } // if (SUCCEEDED(hres) && lpStorage)
- if (!fOK)
- {
- UINT nMsgFlags = bFinalEdit ? MB_OKCANCEL /* give option to not dismiss page*/ : MB_OK;
- if (ShellMessageBox(g_hmodThisDll, GetParent(hDlg),
- MAKEINTRESOURCE(idsErrorOnSave), NULL,
- nMsgFlags | MB_ICONHAND, PathFindFileName(lpallobjs->szPath)) == IDOK)
- {
- fOK = TRUE;
- }
- PropSheet_UnChanged(GetParent(hDlg), hDlg);
- }
- return fOK;
- } // ApplyChangesBackToFile
- ////////////////////////////////////////////////////////////////////////////////
- //
- // FSummaryDlgProc
- //
- // Purpose:
- // Summary window dialog handler.
- //
- ////////////////////////////////////////////////////////////////////////////////
- #ifndef _WIN2000_DOCPROP_
- INT_PTR CALLBACK FSummaryDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- DWORD dwMask;
- DWORD dwT;
- LPALLOBJS lpallobjs = (LPALLOBJS)GetWindowLongPtr(hDlg, DWLP_USER);
- switch (message)
- {
- case WM_INITDIALOG :
- {
- PROPSHEETPAGE *ppspDlg = (PROPSHEETPAGE *) lParam;
- LPSIOBJ lpSIObj; // All SumInfo data
- LPDSIOBJ lpDSIObj; // All DocSumInfo (first section)
- LPPROPVARIANT rgpropvarSumInfo, rgpropvarDocSumInfo;
- lpallobjs = (LPALLOBJS)ppspDlg->lParam;
- PropPageInit(lpallobjs, itabSUMMARY);
- SetWindowLongPtr(hDlg, DWLP_USER, ppspDlg->lParam);
- lpSIObj = lpallobjs->lpSIObj;
- lpDSIObj = lpallobjs->lpDSIObj;
- dwMask = lpallobjs->dwMask;
- //
- // Validate our data.
- //
- if ((lpSIObj == NULL) ||
- (lpSIObj->m_lpData == NULL) ||
- (lpDSIObj == NULL) ||
- (lpDSIObj->m_lpData == NULL))
- {
- AssertSz (0, TEXT("Bad object data in Summary dlg"));
- return FALSE;
- }
- //
- // Since we'll be referencing the PropVariants a lot, get
- // a pointer directly to them.
- //
- rgpropvarSumInfo = GETSINFO(lpSIObj)->rgpropvar;
- rgpropvarDocSumInfo = GETSINFO(lpDSIObj)->rgpropvar;
- //
- // Copy the properties from the PropVariants to the Edit controls.
- //
- SetEditValLpsz (&rgpropvarSumInfo[ PVSI_TITLE ], hDlg, IDD_SUMMARY_TITLE);
- SetEditValLpsz (&rgpropvarSumInfo[ PVSI_SUBJECT ], hDlg, IDD_SUMMARY_SUBJECT);
- SetEditValLpsz (&rgpropvarSumInfo[ PVSI_AUTHOR ], hDlg, IDD_SUMMARY_AUTHOR);
- SetEditValLpsz (&rgpropvarSumInfo[ PVSI_COMMENTS ], hDlg, IDD_SUMMARY_COMMENTS);
- SetEditValLpsz (&rgpropvarSumInfo[ PVSI_KEYWORDS ], hDlg, IDD_SUMMARY_KEYWORDS);
- //
- // Show the name of the template, if it exists, otherwise
- // don't even show the field.
- //
- if (rgpropvarSumInfo[ PVSI_TEMPLATE ].vt == VT_LPTSTR)
- {
- SetEditValLpsz (&rgpropvarSumInfo[ PVSI_TEMPLATE ], hDlg, IDD_SUMMARY_TEMPLATE);
- }
- else
- {
- EnableWindow (GetDlgItem (hDlg, IDD_SUMMARY_TEMPLATETEXT), SW_HIDE);
- }
- SetEditValLpsz (&rgpropvarDocSumInfo[ PVDSI_CATEGORY ], hDlg, IDD_SUMMARY_CATEGORY);
- SetEditValLpsz (&rgpropvarDocSumInfo[ PVDSI_COMPANY ], hDlg, IDD_SUMMARY_COMPANY);
- SetEditValLpsz (&rgpropvarDocSumInfo[ PVDSI_MANAGER ], hDlg, IDD_SUMMARY_MANAGER);
- SetEditValLpsz (&rgpropvarSumInfo[ PVSI_COMMENTS ], hDlg, IDD_SUMMARY_COMMENTS);
- if (dwMask & OSPD_NOSAVEPREVIEW)
- {
- ShowWindow(GetDlgItem(hDlg, IDD_SUMMARY_SAVEPREVIEW), SW_HIDE);
- }
- else
- {
- if (!GETSINFO(lpSIObj)->fSaveSINail)
- GETSINFO(lpSIObj)->fSaveSINail = (dwMask & OSPD_SAVEPREVIEW_ON);
- #ifdef SHELL
- if (!GETSINFO(lpSIObj)->fSaveSINail)
- EnableWindow (GetDlgItem (hDlg, IDD_SUMMARY_SAVEPREVIEW), FALSE);
- else
- #endif
- SendDlgItemMessage(hDlg, IDD_SUMMARY_SAVEPREVIEW, BM_SETCHECK,
- (WPARAM) GETSINFO(lpSIObj)->fSaveSINail,0);
- }
- lpallobjs->fPropDlgChanged = FALSE; // It might have been set by the EN_UPDATE check, so let's reset it here
- }
- return TRUE;
- case WM_CTLCOLOREDIT :
- if ((HWND)lParam != GetDlgItem(hDlg, IDD_SUMMARY_TEMPLATE)) // only change color for the
- break; // the template
- case WM_CTLCOLORDLG :
- case WM_CTLCOLORSTATIC :
- if (hBrushPropDlg == NULL)
- break;
- DeleteObject(hBrushPropDlg);
- if ((hBrushPropDlg = CreateSolidBrush(GetSysColor(COLOR_BTNFACE))) == NULL)
- break;
- SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNFACE));
- SetTextColor((HDC) wParam, GetSysColor(COLOR_WINDOWTEXT));
- return (INT_PTR) hBrushPropDlg;
- case WM_COMMAND:
- {
- BOOL fNailChanged = FALSE;
- AssertSz( (lpallobjs != NULL && lpallobjs->lpSIObj != NULL),
- TEXT("Invalid global structure in WM_COMMAND" ));
- if ((HIWORD (wParam) == BN_CLICKED) && (LOWORD(wParam) == IDD_SUMMARY_SAVEPREVIEW))
- {
- GETSINFO(lpallobjs->lpSIObj)->fSaveSINail = !GETSINFO(lpallobjs->lpSIObj)->fSaveSINail;
- OfficeDirtySIObj (lpallobjs->lpSIObj, TRUE);
- fNailChanged = TRUE;
- }
- if (HIWORD (wParam) == EN_UPDATE
- ||
- fNailChanged)
- {
- lpallobjs->fPropDlgChanged = TRUE;
- PropSheet_Changed(GetParent(hDlg), hDlg);
- }
- break;
- }
- case WM_NOTIFY :
- switch (((NMHDR FAR *) lParam)->code)
- {
- case PSN_APPLY :
- //
- // Save what user entered.
- //
- {
- LPSIOBJ lpSIObj; // All SumInfo data
- LPDSIOBJ lpDSIObj; // All DocSumInfo data
- BOOL fSIChanged = FALSE; // The SumInfo properties have changed
- BOOL fDSIChanged = FALSE; // The DocSumInfo properties have changed
- // SumInfo and DocSumInfo properties.
- LPPROPVARIANT rgpropvarSumInfo, rgpropvarDocSumInfo;
- lpSIObj = lpallobjs->lpSIObj;
- rgpropvarSumInfo = GETSINFO(lpSIObj)->rgpropvar;
- lpDSIObj = lpallobjs->lpDSIObj;
- rgpropvarDocSumInfo = GETDSINFO(lpDSIObj)->rgpropvar;
- fSIChanged |= GetEditValLpsz (&rgpropvarSumInfo[PVSI_TITLE], hDlg, IDD_SUMMARY_TITLE);
- fSIChanged |= GetEditValLpsz (&rgpropvarSumInfo[PVSI_SUBJECT], hDlg, IDD_SUMMARY_SUBJECT);
- fSIChanged |= GetEditValLpsz (&rgpropvarSumInfo[PVSI_AUTHOR], hDlg, IDD_SUMMARY_AUTHOR);
- fSIChanged |= GetEditValLpsz (&rgpropvarSumInfo[PVSI_COMMENTS], hDlg, IDD_SUMMARY_COMMENTS);
- fSIChanged |= GetEditValLpsz (&rgpropvarSumInfo[PVSI_KEYWORDS], hDlg, IDD_SUMMARY_KEYWORDS);
- fSIChanged |= GetEditValLpsz (&rgpropvarSumInfo[PVSI_TEMPLATE], hDlg, IDD_SUMMARY_TEMPLATE);
- fDSIChanged |= GetEditValLpsz (&rgpropvarDocSumInfo[PVDSI_CATEGORY], hDlg, IDD_SUMMARY_CATEGORY);
- fDSIChanged |= GetEditValLpsz (&rgpropvarDocSumInfo[PVDSI_MANAGER], hDlg, IDD_SUMMARY_MANAGER);
- fDSIChanged |= GetEditValLpsz (&rgpropvarDocSumInfo[PVDSI_COMPANY], hDlg, IDD_SUMMARY_COMPANY);
- if (fSIChanged)
- {
- OfficeDirtySIObj (lpSIObj, TRUE);
- }
- if (fDSIChanged)
- {
- OfficeDirtyDSIObj (lpDSIObj, TRUE);
- }
- MESSAGE (TEXT("PSN_APPLY - Summary Page"));
- if (FSumInfoShouldSave (lpSIObj)
- || FDocSumShouldSave (lpDSIObj)
- || lpallobjs->fPropDlgChanged )
- {
- ApplyChangesBackToFile(hDlg, (BOOL)((PSHNOTIFY*)lParam)->lParam, lpallobjs, itabSUMMARY);
- }
- }
- return TRUE;
- case PSN_QUERYCANCEL:
- if (lpallobjs->fPropDlgChanged && !lpallobjs->fPropDlgPrompted)
- ISavePropDlgChanges(lpallobjs, hDlg, ((NMHDR FAR *)lParam)->hwndFrom);
- return TRUE;
- case PSN_SETACTIVE :
- return TRUE;
- } // switch (WM_NOTIFY)
- break;
- case WM_CLOSE:
- //
- // This page contains multi-line edit controls, which swallow
- // the ESC key but generat a WM_CLOSE. We need to pass this
- // message on to our parent (the property sheet) so that it is
- // handled correctly...
- //
- PostMessage( GetParent(hDlg), WM_CLOSE, wParam, lParam );
- break;
- case WM_CONTEXTMENU:
- WinHelp((HANDLE)wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR)rgIdhSummary);
- break;
- case WM_HELP:
- WinHelp(((LPHELPINFO)lParam)->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR)rgIdhSummary);
- break;
- } // switch (message)
- return FALSE;
- } // FSummaryDlgProc
- #endif //_WIN2000_DOCPROP_
- ////////////////////////////////////////////////////////////////////////////////
- //
- // FStatisticsDlgProc
- //
- // Purpose;
- // Displays the Statistics dialog
- //
- ////////////////////////////////////////////////////////////////////////////////
- #ifndef _WIN2000_DOCPROP_
- INT_PTR CALLBACK FStatisticsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HWND hWndLV;
- LPSIOBJ lpSIObj; // All SumInfo data.
- LPDSIOBJ lpDSIObj; // All DocSumInfo data.
- LPPROPVARIANT rgpropvarSumInfo, rgpropvarDocSumInfo;
- HANDLE hFile;
- FILETIME ftTime;
- DWORD dwT;
- BOOL fListData; // Did we stick some data in the listview??
- switch (message)
- {
- case WM_INITDIALOG :
- {
- PROPSHEETPAGE *ppspDlg = (PROPSHEETPAGE *) lParam;
- LPALLOBJS lpallobjs = (LPALLOBJS)ppspDlg->lParam;
- // Page does not do apply so don't worry
- // PropPageInit(lpallobjs, itabSTATISTICS);
- lpSIObj = lpallobjs->lpSIObj; // Get the summary object.
- lpDSIObj = lpallobjs->lpDSIObj; // Get the doc sum. object.
- if (lpSIObj->m_lpData == NULL ||
- lpDSIObj->m_lpData == NULL)
- {
- MESSAGE (TEXT("Invalid SumInfo or DocSumInfo object"));
- return FALSE;
- }
- rgpropvarSumInfo = GETSINFO(lpSIObj)->rgpropvar;
- rgpropvarDocSumInfo = GETSINFO(lpDSIObj)->rgpropvar;
- // Let the app update the stats if they provided a callback
- if (((LPSINFO) ((LPOFFICESUMINFO) lpSIObj)->m_lpData)->lpfnFUpdateStats != NULL)
- (*(((LPSINFO) ((LPOFFICESUMINFO) lpSIObj)->m_lpData)->lpfnFUpdateStats))(
- GetFocus(),
- lpSIObj, lpDSIObj);
- hWndLV = GetDlgItem(hDlg, IDD_STATISTICS_LISTVIEW);
- InitListView (hWndLV, iszVAL, rgszStatHeadings, FALSE);
- // Last saved by
- if (rgpropvarSumInfo[ PVSI_LASTAUTHOR ].vt == VT_LPTSTR)
- {
- SendDlgItemMessage
- (hDlg, IDD_STATISTICS_LASTSAVEBY, WM_SETTEXT, 0,
- (LPARAM) rgpropvarSumInfo[ PVSI_LASTAUTHOR ].pszVal);
- }
- // Revision #
- if (rgpropvarSumInfo[ PVSI_REVNUMBER ].vt == VT_LPTSTR)
- {
- SendDlgItemMessage
- (hDlg, IDD_STATISTICS_REVISION, WM_SETTEXT, 0,
- (LPARAM) rgpropvarSumInfo[ PVSI_REVNUMBER ].pszVal);
- }
- fListData = FALSE;
- if (rgpropvarSumInfo[ PVSI_PAGECOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarSumInfo[ PVSI_PAGECOUNT ].lVal,
- rgszStats[iszPAGES], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_SLIDECOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarDocSumInfo[ PVDSI_SLIDECOUNT ].lVal,
- rgszStats[iszSLIDES], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_PARACOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarDocSumInfo[ PVDSI_PARACOUNT ].lVal,
- rgszStats[iszPARA], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_LINECOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarDocSumInfo[ PVDSI_LINECOUNT ].lVal,
- rgszStats[iszLINES], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarSumInfo[ PVSI_WORDCOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarSumInfo[ PVSI_WORDCOUNT ].lVal,
- rgszStats[iszWORDS], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarSumInfo[ PVSI_CHARCOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarSumInfo[ PVSI_CHARCOUNT ].lVal,
- rgszStats[iszCHARS], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_BYTECOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarDocSumInfo[ PVDSI_BYTECOUNT ].lVal,
- rgszStats[iszBYTES], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_NOTECOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarDocSumInfo[ PVDSI_NOTECOUNT ].lVal,
- rgszStats[iszNOTES], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_HIDDENCOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarDocSumInfo[ PVDSI_HIDDENCOUNT ].lVal,
- rgszStats[iszHIDDENSLIDES], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_MMCLIPCOUNT ].vt == VT_I4)
- {
- AddItemToListView (hWndLV, rgpropvarDocSumInfo[ PVDSI_MMCLIPCOUNT ].lVal,
- rgszStats[iszMMCLIPS], FALSE);
- fListData = TRUE;
- }
- if (rgpropvarDocSumInfo[ PVDSI_PRESFORMAT ].vt == VT_LPTSTR)
- {
- AddItemToListView (hWndLV, (DWORD_PTR) rgpropvarDocSumInfo[ PVDSI_PRESFORMAT ].pszVal,
- rgszStats[iszFORMAT], TRUE);
- fListData = TRUE;
- }
- if (!fListData)
- {
- ShowWindow(GetDlgItem(hDlg, IDD_LINE_2), SW_HIDE);
- ShowWindow(GetDlgItem(hDlg, IDD_STATISTICS_LVLABEL), SW_HIDE);
- ShowWindow(hWndLV, SW_HIDE);
- hWndLV = NULL;
- }
- if (!lpallobjs->fFiledataInit)
- {
- hFile = FindFirstFile(lpallobjs->szPath, &lpallobjs->filedata);
- lpallobjs->fFiledataInit = TRUE;
- if (hFile != INVALID_HANDLE_VALUE)
- {
- FindClose(hFile);
- lpallobjs->fFindFileSuccess = TRUE;
- }
- }
- if (lpallobjs->fFindFileSuccess)
- {
- // Last Access
- PrintTimeInDlg (hDlg, IDD_STATISTICS_ACCESSED, &(lpallobjs->filedata.ftLastAccessTime));
- // Last modified
- PrintTimeInDlg (hDlg, IDD_STATISTICS_CHANGED, &(lpallobjs->filedata.ftLastWriteTime));
- }
- // Create Time
- if (rgpropvarSumInfo[ PVSI_CREATE_DTM ].vt == VT_FILETIME)
- {
- PrintTimeInDlg(hDlg, IDD_STATISTICS_CREATED,
- &rgpropvarSumInfo[ PVSI_CREATE_DTM ].filetime);
- }
- // Last Printed Time
- if (rgpropvarSumInfo[ PVSI_LASTPRINTED ].vt == VT_FILETIME)
- {
- PrintTimeInDlg(hDlg, IDD_STATISTICS_LASTPRINT,
- &rgpropvarSumInfo[ PVSI_LASTPRINTED ].filetime);
- }
- // Total Edit Time
- // If we are not allowing time tracking display 0 minutes
- if (GETSINFO(lpSIObj)->fNoTimeTracking)
- {
- ftTime.dwLowDateTime = 0;
- ftTime.dwHighDateTime = 0;
- PrintEditTimeInDlg(hDlg, &ftTime);
- }
- else if (rgpropvarSumInfo[ PVSI_EDITTIME ].vt == VT_FILETIME)
- {
- PrintEditTimeInDlg(hDlg, &rgpropvarSumInfo[ PVSI_EDITTIME ].filetime);
- }
- // lpallobjs->fPropDlgChanged = FALSE;
- }
- return TRUE;
- case WM_CTLCOLORBTN :
- case WM_CTLCOLOREDIT :
- case WM_CTLCOLORDLG :
- case WM_CTLCOLORSTATIC :
- if (hBrushPropDlg == NULL)
- break;
- DeleteObject(hBrushPropDlg);
- if ((hBrushPropDlg = CreateSolidBrush(GetSysColor(COLOR_BTNFACE))) == NULL)
- break;
- SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNFACE));
- SetTextColor((HDC) wParam, GetSysColor(COLOR_WINDOWTEXT));
- return (INT_PTR) hBrushPropDlg;
- case WM_SYSCOLORCHANGE:
- hWndLV = GetDlgItem(hDlg, IDD_STATISTICS_LISTVIEW);
- PostMessage(hWndLV, WM_SYSCOLORCHANGE, wParam, lParam);
- return TRUE;
- break;
- case WM_NOTIFY :
- switch (((NMHDR FAR *) lParam)->code)
- {
- case PSN_SETACTIVE :
- return TRUE;
- case PSN_RESET:
- case PSN_APPLY:
- MESSAGE (TEXT("PSN_APPLY - Statistics Page"));
- return TRUE;
- } // switch
- break;
- case WM_CONTEXTMENU:
- WinHelp((HANDLE)wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR)rgIdhStatistics);
- break;
- case WM_HELP:
- WinHelp(((LPHELPINFO)lParam)->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR)rgIdhStatistics);
- break;
- } // switch
- return FALSE;
- } // FStatisticsDlgProc
- #endif //_WIN2000_DOCPROP_
- ////////////////////////////////////////////////////////////////////////////////
- //
- // FContentsDlgProc
- //
- // Purpose:
- // Display the contents dialog
- //
- ////////////////////////////////////////////////////////////////////////////////
- #ifndef _WIN2000_DOCPROP_
- INT_PTR CALLBACK FContentsDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- LPDSIOBJ lpDSIObj; // All DocSumInfo data.
- LPPROPVARIANT rgpropvarDocSumInfo; // Just the DocSumInfo properties.
- switch (message)
- {
- case WM_INITDIALOG :
- {
- BOOL fInitDialogSuccess = TRUE;
- PROPSHEETPAGE *ppspDlg = (PROPSHEETPAGE *)lParam;
- SHORT cT;
- LRESULT lError;
- TCHAR *psz;
- TCHAR ch;
- ULONG cHeadings; // Number of document headings
- ULONG cDocParts; // Total count of document parts.
- LPPROPVARIANT rgpropvarHeadings; // The Variant|Vector of heading pairs
- LPTSTR *rglptstrDocParts; // The document parts.
- ULONG ulHeadingIndex; // Index into rgpropvarHeadings
- ULONG ulTotalDocPartIndex; // Index into rglptstrDocParts
- ULONG ulSubDocPartIndex; // Index into rglptstrDocParts for the current heading
- ULONG cbDocPart = 0; // # bytes in a particular docpart.
- LPTSTR tszDocumentPart = NULL; // One DocPart with a pre-pending tab.
- lpDSIObj = ((LPALLOBJS)ppspDlg->lParam)->lpDSIObj; // Get the document sum. object.
- // Validate our objects.
- if (lpDSIObj == NULL || lpDSIObj->m_lpData == NULL)
- return FALSE;
- // Get to the DocSumInfo properties.
- rgpropvarDocSumInfo = GETDSINFO(lpDSIObj)->rgpropvar;
- // See if we have any headings.
- if (rgpropvarDocSumInfo[ PVDSI_HEADINGPAIR ].vt != (VT_VECTOR | VT_VARIANT))
- {
- // Nothing to display.
- return FALSE;
- }
- // Get the Heading-Pair array and count. Validate the size of the array.
- cHeadings = rgpropvarDocSumInfo[ PVDSI_HEADINGPAIR ].capropvar.cElems;
- rgpropvarHeadings = rgpropvarDocSumInfo[ PVDSI_HEADINGPAIR ].capropvar.pElems;
- if (cHeadings == 0)
- {
- goto ExitCaseWM_INITDIALOG;
- }
- if (cHeadings & 0x1)
- {
- // This is an invalid array; the elements always come in (heading,count) pairs,
- // so there should be an even number of elements in the array.
- MESSAGE (TEXT("Invalid Headings array (should be an even number of elements)"));
- goto ExitCaseWM_INITDIALOG;
- }
- // Get the DocParts array and its size. All elements of this array are LPTSTRs.
- // Note that this array need not exist.
- cDocParts = 0;
- if (rgpropvarDocSumInfo[ PVDSI_DOCPARTS ].vt == (VT_VECTOR | VT_LPTSTR))
- {
- rglptstrDocParts = (LPTSTR*) rgpropvarDocSumInfo[ PVDSI_DOCPARTS ].calpstr.pElems;
- cDocParts = rgpropvarDocSumInfo[ PVDSI_DOCPARTS ].calpstr.cElems;
- }
- // Loop through the Heading-Pair array. For each heading, we'll write it
- // to the list box, and then use the associated count to write Document Parts
- // to the list box. We'll stop when we've processed the array, or when
- // fInitDialogSuccess goes FALSE.
- ulTotalDocPartIndex = 0;
- for (ulHeadingIndex = 0;
- (ulHeadingIndex < cHeadings) && fInitDialogSuccess;
- ulHeadingIndex+=2)
- {
- // Verify that the next two elements in the Heading-Pair array are
- // a string and a Long.
- if (rgpropvarHeadings[ ulHeadingIndex ].vt != VT_LPTSTR
- ||
- rgpropvarHeadings[ ulHeadingIndex + 1 ].vt != VT_I4)
- {
- MESSAGE (TEXT("Invalid Heading Pair type"));
- fInitDialogSuccess = FALSE;
- break;
- }
- // Write the Heading to the list box.
- lError = SendDlgItemMessage (
- hDlg, IDD_CONTENTS_LISTBOX, LB_ADDSTRING, (WPARAM) 0,
- (LPARAM) rgpropvarHeadings[ ulHeadingIndex ].pszVal );
- if (lError == LB_ERR || lError == LB_ERRSPACE)
- {
- MESSAGE(TEXT("Could not write to list box"));
- fInitDialogSuccess = FALSE;
- break;
- }
- // Verify that the DocParts we've written so far, plus those we're about
- // to write, don't exceed the total in the DocParts array.
- if (ulTotalDocPartIndex + rgpropvarHeadings[ ulHeadingIndex + 1 ].lVal
- > cDocParts)
- {
- MESSAGE (TEXT("Invalid doc-part count for heading"));
- fInitDialogSuccess = FALSE;
- break;
- }
- // Now loop through the document parts that are associated with this
- // heading. We'll insert a tab character in front of each string
- // so that the display looks better. We'll stop when we've processed
- // all the DocParts under this heading, or when fInitDialogSuccess goes
- // FALSE;
- for (ulSubDocPartIndex = ulTotalDocPartIndex;
- fInitDialogSuccess
- && (ulSubDocPartIndex
- < ulTotalDocPartIndex + rgpropvarHeadings[ ulHeadingIndex + 1 ].lVal);
- ulSubDocPartIndex++)
- {
- // Determine how big the DocumentPart string is, including a NULL
- // terminator, and including a tab character that we're going to insert.
- cbDocPart // Count the characters.
- #ifdef UNICODE
- = CchTszLen (rglptstrDocParts[ ulSubDocPartIndex ]) + 2;
- #else
- = CchAnsiSzLen (rglptstrDocParts[ ulSubDocPartIndex ]) + 2;
- #endif
- cbDocPart *= sizeof(TCHAR); // Convert to a *byte* count.
- // Alloc a buffer which will hold a tab character followed by the DocPart string.
- // Since there's no easy way to add cleanup code for this case block,
- // we must ensure that we free this buffer before any break could possibly
- // occur.
- tszDocumentPart = PvMemAlloc (cbDocPart);
- if (tszDocumentPart == NULL)
- {
- AssertSz (0, TEXT("Couldn't alloc memory for doc-part display"));
- fInitDialogSuccess = FALSE;
- break;
- }
- // Put the tab in the new string, followed by the DocPart string.
- *tszDocumentPart = TEXT('t');
- PbMemCopy(&tszDocumentPart[1],
- rglptstrDocParts[ ulSubDocPartIndex ],
- cbDocPart - sizeof(TCHAR)); // Subtract the size of the tab
- // Write the result to the list box, and free the temporary string.
- lError = SendDlgItemMessage (
- hDlg, IDD_CONTENTS_LISTBOX, LB_ADDSTRING, (WPARAM) 0,
- (LPARAM) tszDocumentPart);
- if (tszDocumentPart != NULL)
- {
- VFreeMemP (tszDocumentPart, cbDocPart);
- tszDocumentPart = NULL;
- cbDocPart = 0;
- }
- if (lError == LB_ERR || lError == LB_ERRSPACE)
- {
- AssertSz (0, TEXT("Could not write to list box"));
- fInitDialogSuccess = FALSE;
- break;
- }
- } // for (ulSubDocPartIndex = ulTotalDocPartIndex; ...
- // Add the cont for all the doc-parts that we just displayed
- // to the total.
- ulTotalDocPartIndex = ulSubDocPartIndex;
- } // for (ulHeadingIndex = 0; ulHeadingIndex < cHeadings; ulHeadingIndex++)
- fInitDialogSuccess = TRUE;
- ExitCaseWM_INITDIALOG:
- // Now that the headings and document-parts are in the dialog,
- // we don't need to hold on to them any longer.
- PropVariantClear (&GETDSINFO(lpDSIObj)->rgpropvar[PVDSI_HEADINGPAIR]);
- PropVariantClear (&GETDSINFO(lpDSIObj)->rgpropvar[PVDSI_DOCPARTS]);
- return fInitDialogSuccess;
- } // end - case WM_INITDIALOG
- case WM_CTLCOLORBTN :
- case WM_CTLCOLORDLG :
- case WM_CTLCOLORSTATIC :
- if (hBrushPropDlg == NULL)
- break;
- DeleteObject(hBrushPropDlg);
- if ((hBrushPropDlg = CreateSolidBrush(GetSysColor(COLOR_BTNFACE))) == NULL)
- break;
- SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNFACE));
- SetTextColor((HDC) wParam, GetSysColor(COLOR_WINDOWTEXT));
- return (INT_PTR) hBrushPropDlg;
- case WM_NOTIFY :
- switch (((NMHDR FAR *) lParam)->code)
- {
- case PSN_SETACTIVE :
- return TRUE;
- case PSN_RESET:
- case PSN_APPLY:
- MESSAGE (TEXT("PSN_APPLY - Contents Page"));
- return TRUE;
- } // switch
- break;
- case WM_CONTEXTMENU:
- WinHelp((HANDLE)wParam, NULL, HELP_CONTEXTMENU, (DWORD_PTR)rgIdhContents);
- break;
- case WM_HELP:
- WinHelp(((LPHELPINFO)lParam)->hItemHandle, NULL, HELP_WM_HELP, (DWORD_PTR)rgIdhContents);
- break;
- } // switch
- return FALSE;
- } // FContentsDlgProc
- #endif // _WIN2000_DOCPROP_
- int gOKButtonID; // need this to store the ID of the OK button, since it's not in the dlg template
- ////////////////////////////////////////////////////////////////////////////////
- //
- // FCustomDlgProc
- //
- // Purpose:
- // Custom tab control
- //
- ////////////////////////////////////////////////////////////////////////////////
- INT_PTR CALLBACK FCustomDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
- {
- LPALLOBJS lpallobjs = (LPALLOBJS)GetWindowLongPtr(hDlg, DWLP_USER);
- switch (message)
- {
- case WM_INITDIALOG:
- {
- PROPSHEETPAGE *ppspDlg = (PROPSHEETPAGE *) lParam;
- int irg;
- HICON hIcon, hInvIcon;
- lpallobjs = (LPALLOBJS)ppspDlg->lParam;
- PropPageInit(lpallobjs, itabCUSTOM);
- SetWindowLongPtr(hDlg, DWLP_USER, ppspDlg->lParam);
- gOKButtonID = LOWORD(SendMessage(hDlg, DM_GETDEFID, 0L, 0L));
- AssertSz ((sizeof(NUM) == (sizeof(FILETIME))), TEXT("Ok, who changed base type sizes?"));
- //
- // Fill out the Name dropdown
- //
- for (irg = 0; irg < NUM_BUILTIN_CUSTOM_NAMES; ++irg)
- {
- if (!CchGetString( idsCustomName1+ irg,
- lpallobjs->CDP_sz,
- sizeof(lpallobjs->CDP_sz))
- )
- {
- return(FALSE);
- }
- SendDlgItemMessage(hDlg, IDD_CUSTOM_NAME, CB_ADDSTRING, 0, (LPARAM)lpallobjs->CDP_sz);
- }
- //
- // Fill out the type drop-down & select the text type
- //
- for (irg = 0; irg <= iszBOOL; irg++)
- {
- SendDlgItemMessage(hDlg, IDD_CUSTOM_TYPE, CB_ADDSTRING, 0, (LPARAM) rgszTypes[irg]);
- }
- ResetTypeControl (hDlg, IDD_CUSTOM_TYPE, &lpallobjs->CDP_iszType);
- //
- // Set the link checkbox to be off.
- //
- lpallobjs->CDP_fLink = FALSE;
- SendDlgItemMessage( hDlg,
- IDD_CUSTOM_LINK,
- BM_SETCHECK,
- (WPARAM) lpallobjs->CDP_fLink,
- 0
- );
- #ifndef __CUSTOM_LINK_ENABLED__
- ShowWindow( GetDlgItem( hDlg, IDD_CUSTOM_LINK ), SW_HIDE );
- #endif __CUSTOM_LINK_ENABLED__
- SendDlgItemMessage( hDlg,
- IDD_CUSTOM_VALUETEXT,
- WM_SETTEXT,
- 0,
- (LPARAM) rgszValue[iszVALUE]
- );
- //
- // Hang on to the window handle of the value edit control & others
- //
- lpallobjs->CDP_hWndVal = GetDlgItem (hDlg, IDD_CUSTOM_VALUE);
- lpallobjs->CDP_hWndName = GetDlgItem (hDlg, IDD_CUSTOM_NAME);
- lpallobjs->CDP_hWndLinkVal = GetDlgItem (hDlg, IDD_CUSTOM_LINKVALUE);
- lpallobjs->CDP_hWndValText = GetDlgItem (hDlg, IDD_CUSTOM_VALUETEXT);
- lpallobjs->CDP_hWndBoolTrue = GetDlgItem (hDlg, IDD_CUSTOM_BOOLTRUE);
- lpallobjs->CDP_hWndBoolFalse = GetDlgItem (hDlg, IDD_CUSTOM_BOOLFALSE);
- lpallobjs->CDP_hWndGroup = GetDlgItem (hDlg, IDD_CUSTOM_GBOX);
- lpallobjs->CDP_hWndAdd = GetDlgItem (hDlg, IDD_CUSTOM_ADD);
- lpallobjs->CDP_hWndDelete = GetDlgItem (hDlg, IDD_CUSTOM_DELETE);
- lpallobjs->CDP_hWndType = GetDlgItem (hDlg, IDD_CUSTOM_TYPE);
- lpallobjs->CDP_hWndCustomLV = GetDlgItem(hDlg, IDD_CUSTOM_LISTVIEW);
- InitListView (lpallobjs->CDP_hWndCustomLV, iszTYPE, rgszHeadings, TRUE);
- //
- // Initially disable the Add & Delete buttons
- //
- EnableWindow (lpallobjs->CDP_hWndAdd, FALSE);
- EnableWindow (lpallobjs->CDP_hWndDelete, FALSE);
- lpallobjs->CDP_fAdd = TRUE;
- //
- // Don't let the user enter too much text
- // If you change this value, you must change the buffer
- // size (szDate) in FConvertDate
- //
- SendMessage (lpallobjs->CDP_hWndVal, EM_LIMITTEXT, BUFMAX-1, 0);
- SendMessage (lpallobjs->CDP_hWndName, EM_LIMITTEXT, BUFMAX-1, 0);
- //
- // Add the link icon to the image list
- //
- hIcon = LoadIcon (g_hmodThisDll, MAKEINTRESOURCE (IDD_LINK_ICON));
- hInvIcon = LoadIcon (g_hmodThisDll, MAKEINTRESOURCE (IDD_INVLINK_ICON));
- if (hIcon != NULL)
- {
- lpallobjs->CDP_hImlS = ListView_GetImageList( lpallobjs->CDP_hWndCustomLV, TRUE );
- giLinkIcon = MsoImageList_ReplaceIcon( lpallobjs->CDP_hImlS, -1, hIcon );
- Assert ((giLinkIcon != -1));
- giInvLinkIcon = MsoImageList_ReplaceIcon (lpallobjs->CDP_hImlS, -1, hInvIcon);
- Assert ((giInvLinkIcon != -1));
- }
- else
- {
- DebugSz (TEXT("Icon load failed"));
- }
- //
- // Make a temporary copy of the custom data
- //
- FMakeTmpUDProps (lpallobjs->lpUDObj);
- //
- // Fill in the list view box with any data from the object
- //
- PopulateUDListView (lpallobjs->CDP_hWndCustomLV, lpallobjs->lpUDObj);
- //
- // See if the client supports links - turn off checkbox if they don't
- //
- lpallobjs->CDP_cLinks =
- #ifdef __CUSTOM_LINK_ENABLED__
- (lpallobjs->lpfnDwQueryLinkData != NULL) ?
- (*lpallobjs->lpfnDwQueryLinkData) (QLD_CLINKS, 0, NULL, NULL) :
- #endif __CUSTOM_LINK_ENABLED__
- 0;
- if (!lpallobjs->CDP_cLinks)
- {
- EnableWindow (GetDlgItem (hDlg, IDD_CUSTOM_LINK), FALSE);
- EnableWindow (lpallobjs->CDP_hWndLinkVal, FALSE);
- }
- // lpallobjs->fPropDlgChanged = FALSE;
- // fItemSel = FALSE;
- return TRUE;
- break;
- }
- case WM_CTLCOLORBTN :
- case WM_CTLCOLORDLG :
- case WM_CTLCOLORSTATIC :
- if (hBrushPropDlg == NULL)
- break;
- DeleteObject(hBrushPropDlg);
- if ((hBrushPropDlg = CreateSolidBrush(GetSysColor(COLOR_BTNFACE))) == NULL)
- break;
- SetBkColor ((HDC) wParam, GetSysColor (COLOR_BTNFACE));
- SetTextColor((HDC) wParam, GetSysColor(COLOR_WINDOWTEXT));
- return (INT_PTR) hBrushPropDlg;
- case WM_SYSCOLORCHANGE:
- PostMessage(lpallobjs->CDP_hWndCustomLV, WM_SYSCOLORCHANGE, wParam, lParam);
- return TRUE;
- break;
- //
- // This message is posted when ever the user does something with the
- // Name field. That allows the system to finish what they are doing
- // and fill in the edit field if they have to. See bug 2820.
- //
- case WM_USER+0x1000:
- if (!(lpallobjs->CDP_fLink && (lpallobjs->lpfnDwQueryLinkData == NULL)))
- {
- lpallobjs->CDP_iszType = (int)SendMessage (lpallobjs->CDP_hWndType, CB_GETCURSEL, 0, 0);
- FSetupAddButton (lpallobjs->CDP_iszType, lpallobjs->CDP_fLink, &lpallobjs->CDP_fAdd, lpallobjs->CDP_hWndAdd, lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndName, hDlg);
- if (FAllocAndGetValLpstz (hDlg, IDD_CUSTOM_NAME, &glpstzName))
- {
- LPUDPROP lpudp = LpudpropFindMatchingName (lpallobjs->lpUDObj, (LPTSTR)PSTR (glpstzName));
- if (lpudp != NULL)
- {
- if (lpallobjs->CDP_fAdd)
- {
- SendMessage (lpallobjs->CDP_hWndAdd, WM_SETTEXT, 0, (LPARAM) rgszAdd[iszMODIFY]);
- lpallobjs->CDP_fAdd = FALSE;
- }
- }
- }
- EnableWindow(lpallobjs->CDP_hWndDelete, FALSE); // If the user touches the Name field, disable Delete button
- // Are we showing an invalid link?
- if (lpallobjs->CDP_fLink && !IsWindowEnabled(GetDlgItem(hDlg,IDD_CUSTOM_LINK)))
- {
- // Turn off the link checkbox
- lpallobjs->CDP_fLink = FALSE;
- SendDlgItemMessage (hDlg, IDD_CUSTOM_LINK, BM_SETCHECK, (WPARAM) lpallobjs->CDP_fLink, 0);
- if (lpallobjs->CDP_cLinks) // Could be that the app is allowing links
- EnableWindow (GetDlgItem (hDlg, IDD_CUSTOM_LINK), TRUE);
- // Clear the value window
- ClearEditControl (lpallobjs->CDP_hWndVal, 0);
- FSwapControls (lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndLinkVal, lpallobjs->CDP_hWndBoolTrue, lpallobjs->CDP_hWndBoolFalse,
- lpallobjs->CDP_hWndGroup, lpallobjs->CDP_hWndType, lpallobjs->CDP_hWndValText, FALSE, FALSE);
- }
- }
- return(TRUE);
- break;
- case WM_COMMAND :
- switch (HIWORD (wParam))
- {
- case BN_CLICKED :
- switch (LOWORD (wParam))
- {
- case IDD_CUSTOM_ADD :
- if (FGetCustomPropFromDlg(lpallobjs, hDlg))
- {
- PropSheet_Changed(GetParent(hDlg), hDlg);
- }
- return(FALSE); // return 0 'cuz we process the message
- break;
- case IDD_CUSTOM_DELETE :
- // Assert (fItemSel);
- // fItemSel = FALSE; // We're about to delete it!
- DeleteItem (lpallobjs->lpUDObj, lpallobjs->CDP_hWndCustomLV, lpallobjs->CDP_iItem, lpallobjs->CDP_sz);
- // Turn off the link checkbox if it was on.
- lpallobjs->CDP_fLink = FALSE;
- SendDlgItemMessage (hDlg, IDD_CUSTOM_LINK, BM_SETCHECK, (WPARAM) lpallobjs->CDP_fLink, 0);
- ClearEditControl (lpallobjs->CDP_hWndVal, 0);
- FSwapControls (lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndLinkVal, lpallobjs->CDP_hWndBoolTrue, lpallobjs->CDP_hWndBoolFalse,
- lpallobjs->CDP_hWndGroup, lpallobjs->CDP_hWndType, lpallobjs->CDP_hWndValText, FALSE, FALSE);
- FSetupAddButton (lpallobjs->CDP_iszType, lpallobjs->CDP_fLink, &lpallobjs->CDP_fAdd, lpallobjs->CDP_hWndAdd, lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndName, hDlg);
- ResetTypeControl (hDlg, IDD_CUSTOM_TYPE, &lpallobjs->CDP_iszType);
- SendMessage(lpallobjs->CDP_hWndName, CB_SETEDITSEL, 0, MAKELPARAM(0,-1)); // Select entire string
- SendMessage(lpallobjs->CDP_hWndName, WM_CLEAR, 0, 0);
- SetFocus(lpallobjs->CDP_hWndName);
- // lpallobjs->fPropDlgChanged = TRUE;
- PropSheet_Changed(GetParent(hDlg), hDlg);
- return(FALSE); // return 0 'cuz we process the message
- break;
- case IDD_CUSTOM_LINK :
- {
- BOOL fMod = FALSE;
- // Should never get a message from a disabled control
- Assert (lpallobjs->CDP_cLinks);
- lpallobjs->CDP_fLink = !lpallobjs->CDP_fLink;
- SendDlgItemMessage (hDlg, IDD_CUSTOM_LINK, BM_SETCHECK, (WPARAM) lpallobjs->CDP_fLink, 0);
- // If the link box is checked, the value edit needs to change
- // to a combobox filled with link data
- if (lpallobjs->CDP_fLink)
- {
- Assert ((lpallobjs->lpfnDwQueryLinkData != NULL));
- FCreateListOfLinks (lpallobjs->CDP_cLinks, lpallobjs->lpfnDwQueryLinkData, lpallobjs->CDP_hWndLinkVal);
- SendMessage (lpallobjs->CDP_hWndLinkVal, CB_SETCURSEL, 0, 0);
- FSetTypeControl ((*lpallobjs->lpfnDwQueryLinkData) (QLD_LINKTYPE, 0, NULL, NULL), lpallobjs->CDP_hWndType);
- }
- else
- ClearEditControl (lpallobjs->CDP_hWndVal, 0);
- FSwapControls (lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndLinkVal, lpallobjs->CDP_hWndBoolTrue, lpallobjs->CDP_hWndBoolFalse,
- lpallobjs->CDP_hWndGroup, lpallobjs->CDP_hWndType, lpallobjs->CDP_hWndValText, lpallobjs->CDP_fLink, FALSE);
- // HACK, we don't want FSetupAddButton to change the text of the add
- // button
- if (!lpallobjs->CDP_fAdd)
- fMod = lpallobjs->CDP_fAdd = TRUE;
- // Set up the "Add" button correctly
- FSetupAddButton (lpallobjs->CDP_iszType, lpallobjs->CDP_fLink, &lpallobjs->CDP_fAdd, lpallobjs->CDP_hWndAdd, lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndName, hDlg);
- if (fMod)
- lpallobjs->CDP_fAdd = FALSE;
- return(FALSE); // return 0 'cuz we process the message
- break;
- }
- case IDD_CUSTOM_BOOLTRUE:
- case IDD_CUSTOM_BOOLFALSE:
- {
- BOOL fMod = FALSE;
- lpallobjs->CDP_iszType = (int)SendMessage (lpallobjs->CDP_hWndType, CB_GETCURSEL, 0, 0);
- // HACK, we don't want FSetupAddButton to change the text of the add
- // button
- if (!lpallobjs->CDP_fAdd)
- fMod = lpallobjs->CDP_fAdd = TRUE;
- FSetupAddButton (lpallobjs->CDP_iszType, lpallobjs->CDP_fLink, &lpallobjs->CDP_fAdd, lpallobjs->CDP_hWndAdd, lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndName, hDlg);
- if (fMod)
- lpallobjs->CDP_fAdd = FALSE;
- return(FALSE);
- }
- default:
- return(TRUE);
- }
- case CBN_CLOSEUP:
- // Hack!!
- // We need to post a message to ourselves to check if the user's
- // actions entered text in the edit field.
- PostMessage(hDlg, WM_USER+0x1000, 0L, 0L);
- return(FALSE);
- case CBN_SELCHANGE :
- switch (LOWORD (wParam))
- {
- case IDD_CUSTOM_NAME :
- // Hack!!
- // We need to post a message to ourselves to check if the user's
- // actions entered text in the edit field.
- PostMessage(hDlg, WM_USER+0x1000, 0L, 0L);
- return(FALSE); // return 0 'cuz we process the message
- break;
- case IDD_CUSTOM_TYPE :
- {
- BOOL fMod = FALSE;
- // If the user picks the Boolean type from the combo box,
- // we must replace the edit control for the value
- // with radio buttons. If the Link checkbox is set,
- // the type depends on the link value, not user selection
- lpallobjs->CDP_iszType = (int)SendMessage ((HWND) lParam, CB_GETCURSEL, 0, 0);
- FSwapControls (lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndLinkVal, lpallobjs->CDP_hWndBoolTrue, lpallobjs->CDP_hWndBoolFalse,
- lpallobjs->CDP_hWndGroup, lpallobjs->CDP_hWndType, lpallobjs->CDP_hWndValText, lpallobjs->CDP_fLink, (lpallobjs->CDP_iszType == iszBOOL));
- // HACK: FSwapControls() resets the type selection to be
- // the first one (since all other clients need that to
- // happen). In this case, the user has selected a new
- // type, so we need to force it manually to what they picked.
- SendMessage (lpallobjs->CDP_hWndType, CB_SETCURSEL, lpallobjs->CDP_iszType, 0);
- // HACK: FSetupAddButton will change the Add button to
- // say "Add" if lpallobjs->CDP_fAdd is FALSE. Since we just changed
- // the button to "Modify", fake it out to not change
- // the Add button by flipping lpallobjs->CDP_fAdd, then flipping it back.
- if (!lpallobjs->CDP_fAdd)
- fMod = lpallobjs->CDP_fAdd = TRUE;
- FSetupAddButton (lpallobjs->CDP_iszType, lpallobjs->CDP_fLink, &lpallobjs->CDP_fAdd, lpallobjs->CDP_hWndAdd, lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndName, hDlg);
- if (fMod)
- lpallobjs->CDP_fAdd = FALSE;
- return(FALSE); // return 0 'cuz we process the message
- }
- case IDD_CUSTOM_LINKVALUE :
- // If the user has the "Link" box checked and starts picking
- // link values, make sure that the "Type" combobox is updated
- // to the type of the static value of the link.
- {
- DWORD irg;
- AssertSz (lpallobjs->CDP_fLink, TEXT("Link box must be checked in order for this dialog to be visible!"));
- // Get the link value from the combobox, and store
- // the link name and static value.
- irg = (int)SendMessage (lpallobjs->CDP_hWndLinkVal, CB_GETCURSEL, 0, 0);
- Assert ((lpallobjs->lpfnDwQueryLinkData != NULL));
- // REVIEW: If apps really need the name, we can get it here....
- FSetTypeControl ((*lpallobjs->lpfnDwQueryLinkData) (QLD_LINKTYPE, irg, NULL, NULL), lpallobjs->CDP_hWndType);
- return(FALSE); // return 0 'cuz we process the message
- }
- default:
- return TRUE; // we didn't process message
- }
- case CBN_EDITCHANGE: // The user typed their own
- switch (LOWORD (wParam))
- {
- case IDD_CUSTOM_NAME :
- // Hack!!
- // We need to post a message to ourselves to check if the user's
- // actions entered text in the edit field.
- PostMessage(hDlg, WM_USER+0x1000, 0L, 0L);
- return(FALSE); // return 0 'cuz we process the message
- break;
- default:
- return(TRUE);
- break;
- }
- case EN_UPDATE :
- switch (LOWORD (wParam))
- {
- case IDD_CUSTOM_VALUE :
- {
- BOOL fMod = FALSE;
- if (FAllocAndGetValLpstz (hDlg, IDD_CUSTOM_NAME, &glpstzName))
- {
- LPUDPROP lpudp = LpudpropFindMatchingName (lpallobjs->lpUDObj, (LPTSTR)PSTR (glpstzName));
- if (lpudp != NULL)
- {
- if (lpallobjs->CDP_fAdd)
- {
- SendMessage (lpallobjs->CDP_hWndAdd, WM_SETTEXT, 0, (LPARAM) rgszAdd[iszMODIFY]);
- lpallobjs->CDP_fAdd = FALSE;
- }
- }
- // HACK: FSetupAddButton will change the Add button to
- // say "Add" if lpallobjs->CDP_fAdd is FALSE. Since we just changed
- // the button to "Modify", fake it out to not change
- // the Add button by flipping lpallobjs->CDP_fAdd, then flipping it back.
- if (!lpallobjs->CDP_fAdd)
- fMod = lpallobjs->CDP_fAdd = TRUE;
- FSetupAddButton (lpallobjs->CDP_iszType, lpallobjs->CDP_fLink, &lpallobjs->CDP_fAdd, lpallobjs->CDP_hWndAdd, lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndName, hDlg);
- if (fMod)
- lpallobjs->CDP_fAdd = FALSE;
- }
- return(FALSE); // return 0 'cuz we process the message
- }
- default:
- return TRUE; // we didn't process message
- }
- case EN_KILLFOCUS :
- switch (LOWORD (wParam))
- {
- // If the user finishes entering text in the Name edit control,
- // be really cool and check to see if the name they entered
- // is a property that is already defined. If it is,
- // change the Add button to Modify.
- case IDD_CUSTOM_NAME :
- if (FAllocAndGetValLpstz (hDlg, IDD_CUSTOM_NAME, &glpstzName))
- {
- LPUDPROP lpudp = LpudpropFindMatchingName (lpallobjs->lpUDObj, (LPTSTR)PSTR (glpstzName));
- if (lpudp != NULL)
- {
- if (lpallobjs->CDP_fAdd)
- {
- SendMessage (lpallobjs->CDP_hWndAdd, WM_SETTEXT, 0, (LPARAM) rgszAdd[iszMODIFY]);
- lpallobjs->CDP_fAdd = FALSE;
- }
- }
- }
- return FALSE;
- default:
- return TRUE;
- }
- default:
- return TRUE;
- } // switch
- case WM_DESTROY:
- MsoImageList_Destroy(lpallobjs->CDP_hImlS);
- return FALSE;
- case WM_NOTIFY :
- switch (((NMHDR FAR *) lParam)->code)
- {
- case LVN_ITEMCHANGING :
- // If an item is gaining focus, put it in the edit controls at
- // the top of the dialog.
- if (((NM_LISTVIEW FAR *) lParam)->uNewState & LVIS_SELECTED)
- {
- Assert ((((NM_LISTVIEW FAR *) lParam) != NULL));
- lpallobjs->CDP_iItem = ((NM_LISTVIEW FAR *) lParam)->iItem;
- ListView_GetItemText (lpallobjs->CDP_hWndCustomLV, lpallobjs->CDP_iItem, 0, lpallobjs->CDP_sz, BUFMAX);
- PopulateControls (lpallobjs->lpUDObj, lpallobjs->CDP_sz, lpallobjs->CDP_cLinks, lpallobjs->lpfnDwQueryLinkData, hDlg,
- GetDlgItem (hDlg, IDD_CUSTOM_NAME), lpallobjs->CDP_hWndVal, lpallobjs->CDP_hWndValText,
- GetDlgItem (hDlg, IDD_CUSTOM_LINK), lpallobjs->CDP_hWndLinkVal, lpallobjs->CDP_hWndType,
- lpallobjs->CDP_hWndBoolTrue, lpallobjs->CDP_hWndBoolFalse, lpallobjs->CDP_hWndGroup, lpallobjs->CDP_hWndAdd, lpallobjs->CDP_hWndDelete, &lpallobjs->CDP_fLink, &lpallobjs->CDP_fAdd);
- return FALSE;
- }
- return TRUE;
- break;
- #ifdef OFFICE_96
- case LVN_COLUMNCLICK:
- // We only sort the name column
- if (((LPARAM)((NM_LISTVIEW *)lParam)->iSubItem == 0))
- ListView_SortItems(((NM_LISTVIEW *) lParam)->hdr.lpallobjs->CDP_hWndFrom, ListViewCompareFunc,0);
- return TRUE;
- #endif
- case PSN_APPLY :
- if (IsWindowEnabled(lpallobjs->CDP_hWndAdd))
- FGetCustomPropFromDlg(lpallobjs, hDlg);
- // Swap the temp copy to be the real copy.
- FDeleteTmpUDProps (lpallobjs->lpUDObj);
- MESSAGE (TEXT("PSN_APPLY - Custom Page"));
- if (FUserDefShouldSave (lpallobjs->lpUDObj)
- || lpallobjs->fPropDlgChanged )
- {
- if( !ApplyChangesBackToFile(hDlg, (BOOL)((PSHNOTIFY*)lParam)->lParam, lpallobjs, itabCUSTOM) )
- {
- PostMessage( GetParent(hDlg), PSM_SETCURSEL, (WPARAM)-1, (LPARAM)lpallobjs->lpUDObj->m_hPage );