//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: Dlg.h // // Contents: Dialog box classes // // Classes: CBaseDlg // CChoiceDlg // CProgressDlg // // Notes: // // History: 05-Nov-97 rogerg Created. // //-------------------------------------------------------------------------- #ifndef _ONESTOPDLG_ #define _ONESTOPDLG_ //Used for item data on Progress Results UI // !!!!Warning - Automated test look at this structure directly // If you change it you need to notify Testing so they can also // Update their tests typedef struct tagLBDATA { BOOL fTextRectValid; // flag to indicate if rcText has been calculated. RECT rcTextHitTestRect; // rectangle for hitTesting. RECT rcText; // total bounding box of text to use for draw INT IconIndex; BOOL fIsJump; BOOL fHasBeenClicked; BOOL fAddLineSpacingAtEnd; // set if should leave space after item HANDLERINFO * pHandlerID; SYNCMGRERRORID ErrorID; DWORD dwErrorLevel; // Error level of this item TCHAR pszText[1]; // errorText, dynamic array. } LBDATA; // cmdIds passed ot the ReleaseDlg method #define RELEASEDLGCMDID_DESTROY 0 // cmdid send when dialog was destroyed before added to list #define RELEASEDLGCMDID_DEFAULT 1 // cmdid sent if cmd hasn't been explicitly set. #define RELEASEDLGCMDID_OK 2 // treated as if user Pressed Okay #define RELEASEDLGCMDID_CANCEL 3 // treated as if user pressed Cancel // helper utilities BOOL AddItemsFromQueueToListView(CListView *pItemListView,CHndlrQueue *pHndlrQueue ,DWORD dwExtStyle,LPARAM lparam,int iDateColumn,int iStatusColumn,BOOL fHandlerParent ,BOOL fAddOnlyCheckedItems); typedef struct _tagDlgResizeList { int iCtrlId; DWORD dwDlgResizeFlags; } DlgResizeList; // structure passed as lParam to call completion routine. // must free after processin the message // CallCompletion message declarations. // DWORD dwThreadMsg; // passed as wParam. typedef struct _tagCALLCOMPLETIONMSGLPARAM { HRESULT hCallResult; CLSID clsidHandler; SYNCMGRITEMID itemID; } CALLCOMPLETIONMSGLPARAM , *LPCALLCOMPLETIONMSGLPARAM; // base class both dialogs derive from #define CHOICELIST_NAMECOLUMN 0 #define CHOICELIST_LASTUPDATECOLUMN 1 #define PROGRESSLIST_NAMECOLUMN 0 #define PROGRESSLIST_STATUSCOLUMN 1 #define PROGRESSLIST_INFOCOLUMN 2 #define PROGRESS_TAB_UPDATE 0 #define PROGRESS_TAB_ERRORS 1 class CBaseDlg { public: HWND m_hwnd; DWORD m_dwThreadID; BOOL m_fForceClose; // passed in generic release. BOOL m_fHwndRightToLeft; inline HWND GetHwnd() { return m_hwnd; }; virtual BOOL Initialize(DWORD dwThreadID,int nCmdShow) = 0; virtual void ReleaseDlg(WORD wCommandID) = 0; virtual void UpdateWndPosition(int nCmdShow,BOOL fForce)= 0; // make HandleLogError as a base dialog class so can call it from queue and // other locations without worrying about the dialog type. virtual void HandleLogError(HWND hwnd,HANDLERINFO *pHandlerID,MSGLogErrors *lpmsgLogErrors) = 0; virtual void PrivReleaseDlg(WORD wCommandID) = 0; virtual void CallCompletionRoutine(DWORD dwThreadMsg,LPCALLCOMPLETIONMSGLPARAM lpCallCompletelParam) = 0; virtual HRESULT QueryCanSystemShutdown(/* [out] */ HWND *phwnd, /* [out] */ UINT *puMessageId, /* [out] */ BOOL *pfLetUserDecide) = 0; }; // Messages Shared between both dialogs #define WM_BASEDLG_SHOWWINDOW (WM_USER + 3) #define WM_BASEDLG_COMPLETIONROUTINE (WM_USER + 4) #define WM_BASEDLG_HANDLESYSSHUTDOWN (WM_USER + 5) #define WM_BASEDLG_NOTIFYLISTVIEWEX (WM_USER + 6) #define WM_BASEDLG_LAST WM_BASEDLG_NOTIFYLISTVIEWEX // choice dialog messages #define WM_CHOICE_FIRST (WM_BASEDLG_LAST + 1) #define WM_CHOICE_SETQUEUEDATA (WM_CHOICE_FIRST + 1) #define WM_CHOICE_RELEASEDLGCMD (WM_CHOICE_FIRST + 2) #define WM_CHOICE_LAST WM_CHOICE_RELEASEDLGCMD // progress dialog messages #define WM_PROGRESS_FIRST (WM_CHOICE_LAST + 1) #define WM_PROGRESS_UPDATE (WM_PROGRESS_FIRST + 1) #define WM_PROGRESS_LOGERROR (WM_PROGRESS_FIRST + 2) #define WM_PROGRESS_DELETELOGERROR (WM_PROGRESS_FIRST + 3) #define WM_PROGRESS_STARTPROGRESS (WM_PROGRESS_FIRST + 4) #define WM_PROGRESS_RELEASEDLGCMD (WM_PROGRESS_FIRST + 5) #define WM_PROGRESS_TRANSFERQUEUEDATA (WM_PROGRESS_FIRST + 6) #define WM_PROGRESS_SHELLTRAYNOTIFICATION (WM_PROGRESS_FIRST + 7) #define WM_PROGRESS_SHUTDOWN (WM_PROGRESS_FIRST + 8) #define WM_PROGRESS_RESETKILLHANDLERSTIMER (WM_PROGRESS_FIRST + 9) // helper macros for sending window messages #define BASEDLG_SHOWWINDOW(hwnd,nCmdShow) SendMessage(hwnd,WM_BASEDLG_SHOWWINDOW,nCmdShow,0); BOOL CALLBACK CChoiceDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); typedef struct _tagSetQueueDataInfo { const CLSID *rclsid; CHndlrQueue * pHndlrQueue; } SetQueueDataInfo; #define NUM_DLGRESIZEINFOCHOICE 6 // make sure update if change numitems class CChoiceDlg : public CBaseDlg { public: CChoiceDlg(REFCLSID rclsid); BOOL Initialize(DWORD dwThreadID,int nCmdShow); // called to initialize the choice dialog BOOL SetQueueData(REFCLSID rclsid,CHndlrQueue * pHndlrQueue); void ReleaseDlg(WORD wCommandID); void UpdateWndPosition(int nCmdShow,BOOL fForce); HRESULT QueryCanSystemShutdown(/* [out] */ HWND *phwnd, /* [out] */ UINT *puMessageId, /* [out] */ BOOL *pfLetUserDecide); void HandleLogError(HWND hwnd,HANDLERINFO *pHandlerID,MSGLogErrors *lpmsgLogErrors); void PrivReleaseDlg(WORD wCommandID); void CallCompletionRoutine(DWORD dwThreadMsg,LPCALLCOMPLETIONMSGLPARAM lpCallCompletelParam); private: BOOL PrivSetQueueData(REFCLSID rclsid,CHndlrQueue * pHndlrQueue); BOOL SetButtonState(int nIDDlgItem,BOOL fEnabled); int CalcListViewWidth(HWND hwndList); BOOL OnInitialize(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); void OnClose(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnCommand(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnGetMinMaxInfo(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT OnNotifyListViewEx(UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT OnNotify(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnHelp(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnContextMenu(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnSetQueueData(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnStartCommand(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnPropertyCommand(UINT uMsg,WPARAM wParam,LPARAM lParam); // Set QueueData has to be in sync with BOOL ShowChoiceDialog(); BOOL AddNewItemsToListView(); HRESULT ShowProperties(int iItem); CHndlrQueue *m_pHndlrQueue; BOOL m_fDead; int m_nCmdShow; // How to show dialog, same flags pased to ShowWindow. BOOL m_fInternalAddref; // bool to indicate if dialog has placed an addref on self. DWORD m_dwShowPropertiesCount; // keeps track of number of show properties open. CLSID m_clsid; // clsid associated with this dialog. ULONG m_ulNumDlgResizeItem; DLGRESIZEINFO m_dlgResizeInfo[NUM_DLGRESIZEINFOCHOICE]; POINT m_ptMinimizeDlgSize; CListView *m_pItemListView; friend BOOL CALLBACK CChoiceDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); }; // structures for dialog messages // wparam of the progress update message, // lparam of the Update is teh SYNCPROGRESSITEM. typedef struct _tagPROGRESSUPDATEDATA { HANDLERINFO *pHandlerID; WORD wItemId; CLSID clsidHandler; SYNCMGRITEMID ItemID; } PROGRESSUPDATEDATA; // flags for keeping track of progress dlg state. // make sure all flags are unique bits. typedef enum _tagPROGRESSFLAG { // general state of the dialog PROGRESSFLAG_NEWDIALOG = 0x01, // dialog is new and no items have been added yet. PROGRESSFLAG_TRANSFERADDREF = 0x02, // an addref has been placed on dialog by queue items getting trasferred. PROGRESSFLAG_SYNCINGITEMS = 0x04, // process of synchronizing items in queue has started but not finished. PROGRESSFLAG_INCANCELCALL = 0x08, // cancel call is in progress. PROGRESSFLAG_CANCELWHILESHUTTINGDOWN = 0x10, // cancel was pressed while in shutdownloop PROGRESSFLAG_DEAD = 0x20, // done with dialog no methods should be called. PROGRESSFLAG_CALLBACKPOSTED = 0x40, // at leasted on callback message is in the queue. PROGRESSFLAG_STARTPROGRESSPOSTED = 0x80, // anyone who posts a start process check this before posting // flags used by main sync loop to figure out what to do next. PROGRESSFLAG_NEWITEMSINQUEUE = 0x0100, // new items have been placed in the queue. PROGRESSFLAG_IDLENETWORKTIMER = 0x0200, // idle timer has been setup for network idles. PROGRESSFLAG_PROGRESSANIMATION = 0x0400, // progress animatiion has been turned on. PROGRESSFLAG_SHUTTINGDOWNLOOP = 0x0800, // set when no more items in queue and starting shutdown process PROGRESSFLAG_INHANDLEROUTCALL = 0x1000, // set when in main loop and making an out call. PROGRESSFLAG_COMPLETIONROUTINEWHILEINOUTCALL = 0x2000, // set in callback when handler is already in an out calll. PROGRESSFLAG_INSHOWERRORSCALL = 0x4000, // set when in showerrors call PROGRESSFLAG_SHOWERRORSCALLBACKCALLED = 0x8000, // set when showerrors callback comes in while still in original cal. // flags used to keep track of Idle state (if any) PROGRESSFLAG_REGISTEREDFOROFFIDLE = 0x010000, // off idle callback has been registered. PROGRESSFLAG_RECEIVEDOFFIDLE = 0x020000, // queue has receive the offIdle event PROGRESSFLAG_IDLERETRYENABLED = 0x040000, // retry on idle has been set. PROGRESSFLAG_INOFFIDLE = 0x080000, // set when handling an offidle PROGRESSFLAG_CANCELPRESSED = 0x100000, // set when cancel has been pressed and never reset. //flag used to terminate unresponsive hanlders PROGRESSFLAG_INTERMINATE = 0x200000 //We are terminating unresponsive handlers. } PROGRESSFLAG; BOOL CALLBACK ProgressWndProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam); #define NUM_DLGRESIZEINFO_PROGRESS 15 #define NUM_DLGRESIZEINFO_PROGRESS_COLLAPSED 7 #define NUM_PROGRESS_ERRORIMAGES 3 ///////////////////////////////////////////////////////////////////////////// // Images // typedef enum _tagErrorImageIndex { ErrorImage_Information = 0, ErrorImage_Warning = 1, ErrorImage_Error = 2, } ErrorImageIndex; enum { IMAGE_TACK_IN = 0, IMAGE_TACK_OUT }; class CProgressDlg : public CBaseDlg { public: CProgressDlg(REFCLSID rclsid); BOOL Initialize(DWORD dwThreadID,int nCmdShow); // transfer queue has to be synced with person doing the transfer. STDMETHODIMP TransferQueueData(CHndlrQueue *HndlrQueue); void ReleaseDlg(WORD wCommandID); void UpdateWndPosition(int nCmdShow,BOOL fForce); void HandleLogError(HWND hwnd,HANDLERINFO *pHandlerID,MSGLogErrors *lpmsgLogErrors); void HandleDeleteLogError(HWND hwnd,MSGDeleteLogErrors *pDeleteLogError); void CallCompletionRoutine(DWORD dwThreadMsg,LPCALLCOMPLETIONMSGLPARAM lpCallCompletelParam); HRESULT QueryCanSystemShutdown(/* [out] */ HWND *phwnd, /* [out] */ UINT *puMessageId, /* [out] */ BOOL *pfLetUserDecide); void PrivReleaseDlg(WORD wCommandID); void OffIdle(); void OnIdle(); void SetIdleParams( ULONG m_ulIdleRetryMinutes,ULONG m_ulDelayIdleShutDownTime,BOOL fRetryEnabled); private: STDMETHODIMP_(ULONG) AddRefProgressDialog(); STDMETHODIMP_(ULONG) ReleaseProgressDialog(BOOL fForce); // methods called from the wndProc BOOL InitializeHwnd(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL OnCommand(HWND hwnd, WORD wID, WORD wNotifyCode); BOOL OnSysCommand(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnTimer(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnTaskBarCreated(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnPaint(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnShellTrayNotification(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnClose(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnSize(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnGetMinMaxInfo(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnMoving(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnCommand(UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT OnNotify(UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL OnContextMenu(UINT uMsg,WPARAM wParam,LPARAM lParam); BOOL OnPowerBroadcast(UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT OnNotifyListViewEx(UINT uMsg,WPARAM wParam,LPARAM lParam); void OnResetKillHandlersTimers(void); STDMETHODIMP PrivTransferQueueData(CHndlrQueue *HndlrQueue); BOOL KeepProgressAlive(); void OnCancel(BOOL fOffIdle); STDMETHODIMP CreateListViewItem(HWND hwnd,HANDLERINFO *pHandlerID,REFCLSID clsidHandler,SYNCMGRITEM *pofflineItem, INT *piListViewItem, INT iItem); STDMETHODIMP OnShowError(HANDLERINFO *pHandlerId,HWND hWndParent,REFSYNCMGRERRORID ErrorID); BOOL RedrawIcon(); void ShowProgressTab(int iTab); void UpdateProgressValues(); STDMETHODIMP PrepareNewItemsForSync(void); void DoSyncTask(HWND hwnd); void HandleProgressUpdate(HWND hwnd, WPARAM wParam,LPARAM lParam); void ExpandCollapse(BOOL fExpand, BOOL fForce); BOOL InitializeTabs(HWND hwnd); BOOL InitializeToolbar(HWND hwnd); BOOL InitializeUpdateList(HWND hwnd); BOOL InitializeResultsList(HWND hwnd); BOOL ShowCompletedProgress(BOOL fComplete,BOOL fDialogIsLocked); BOOL AnimateTray(BOOL fTayAdded); BOOL RegisterShellTrayIcon(BOOL fRegister); BOOL UpdateTrayIcon(); BOOL SetButtonState(int nIDDlgItem,BOOL fEnabled); BOOL IsItemWorking(int iListViewItem); void UpdateDetailsInfo(DWORD dwStatusType,int iItem, TCHAR *pszItemInfo); void AddListData(LBDATA *pData, int iNumChars, HWND hwndList); private: LONG m_cInternalcRefs; LONG m_lTimerSet; HWND m_hwndTabs; WNDPROC m_fnResultsListBox; // function for ListBoxSubClass. BOOL m_fSensInstalled; // variables for resizing. DLGRESIZEINFO m_dlgResizeInfo[NUM_DLGRESIZEINFO_PROGRESS]; ULONG m_cbNumDlgResizeItemsCollapsed; ULONG m_cbNumDlgResizeItemsExpanded; POINT m_ptMinimumDlgExpandedSize; // minimum size dialog can be in expanded mode. DWORD m_cyCollapsed; // min Height of the collapsed dialog BOOL m_fExpanded; // TRUE if the details part of the dialog is visible BOOL m_fPushpin; //Pushpin state BOOL m_fMaximized; // set to true when the window has been maximized. RECT m_rcDlg; // Size of the fully expanded dialog HIMAGELIST m_errorimage; int m_iIconMetricX; int m_iIconMetricY; INT m_ErrorImages[NUM_PROGRESS_ERRORIMAGES]; INT m_iProgressSelectedItem; INT m_iResultCount; INT m_iInfoCount; INT m_iWarningCount; INT m_iErrorCount; LBDATA *m_CurrentListEntry; int m_iLastItem; DWORD m_dwLastStatusType; INT m_iTab; // The index of the current tab CHndlrQueue *m_HndlrQueue; // Idle specific members CSyncMgrIdle *m_pSyncMgrIdle; ULONG m_ulIdleRetryMinutes; ULONG m_ulDelayIdleShutDownTime; DWORD m_dwProgressFlags; DWORD m_dwShowErrorRefCount; // number of RefCounts showError calls have on the dialog. DWORD m_dwSetItemStateRefCount; // number of RefCounts SetItemState OutCall has on the dialog. DWORD m_dwHandleThreadNestcount; // make sure main handler thread isn't re-entrant DWORD m_dwPrepareForSyncOutCallCount; // number of prepareForSyncs in progress. DWORD m_dwSynchronizeOutCallCount; // number of prepareForSyncs in progress. DWORD m_dwHandlerOutCallCount; // total number of outcalls in progress. CLSID m_clsidHandlerInSync; // clsid associated with handler that is currently synchronizing. DWORD m_dwQueueTransferCount; // number of queue transfers in progress. BOOL m_fHasShellTrayIcon; BOOL m_fAddedIconToTray; int m_iTrayAniFrame; CLSID m_clsid; // clsid associated with this dialog. INT m_iItem; // index to any new item to the list box. int m_nCmdShow; // How to show dialog, same flags pased to ShowWindow. CListView *m_pItemListView; UINT m_nKillHandlerTimeoutValue; // TimeoutValue for ForceKill TCHAR m_pszStatusText[8][MAX_STRING_RES + 1]; friend BOOL CALLBACK ProgressWndProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam); friend BOOL OnProgressUpdateNotify(HWND hwnd,CProgressDlg *pProgress, int idFrom, LPNMHDR pnmhdr); friend BOOL OnProgressResultsDrawItem(HWND hwnd,CProgressDlg *pProgress,UINT idCtl, const DRAWITEMSTRUCT* lpDrawItem); friend BOOL OnProgressResultsNotify(HWND hwnd,CProgressDlg *pProgress, int idFrom, LPNMHDR pnmhdr); friend BOOL CALLBACK ResultsListBoxWndProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam); friend BOOL CALLBACK ResultsProgressWndProc(HWND hwnd, UINT uMsg,WPARAM wParam,LPARAM lParam); friend BOOL OnProgressResultsMeasureItem(HWND hwnd,CProgressDlg *pProgress, UINT *horizExtent, UINT idCtl, MEASUREITEMSTRUCT *pMeasureItem); }; #endif // _ONESTOPDLG_