// DfrgCtl.h : Declaration of the CDfrgCtl #ifndef __DFRGCTL_H_ #define __DFRGCTL_H_ #pragma warning( disable: 4530 ) #include "resource.h" // main symbols #include "ESButton.h" #include "ListView.h" #include "graphix.h" #include ///////////////////////////////////////////////////////////////////////////// // CDfrgCtl class ATL_NO_VTABLE CDfrgCtl : public CComObjectRootEx ,public CComCoClass ,public CComControl ,public CStockPropImpl ,public IProvideClassInfo2Impl<&CLSID_DfrgCtl, NULL, &LIBID_DFRGUILib> // needed ,public IPersistStreamInitImpl ,public IPersistStorageImpl ,public IQuickActivateImpl ,public IOleControlImpl // needed ,public IOleObjectImpl // needed ,public IOleInPlaceActiveObjectImpl ,public IViewObjectExImpl ,public IOleInPlaceObjectWindowlessImpl ,public IDataObjectImpl ,public ISupportErrorInfo ,public ISpecifyPropertyPagesImpl ,public IConnectionPointContainerImpl ,public IConnectionPointImpl { public: CDfrgCtl(); virtual ~CDfrgCtl(); DECLARE_REGISTRY_RESOURCEID(IDR_DFRGCTL) BEGIN_COM_MAP(CDfrgCtl) COM_INTERFACE_ENTRY(IDfrgCtl) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY_IMPL(IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject) COM_INTERFACE_ENTRY_IMPL(IOleControl) COM_INTERFACE_ENTRY_IMPL(IOleObject) COM_INTERFACE_ENTRY_IMPL(IQuickActivate) COM_INTERFACE_ENTRY_IMPL(IPersistStorage) COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit) COM_INTERFACE_ENTRY(IProvideClassInfo) COM_INTERFACE_ENTRY(IProvideClassInfo2) COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless) COM_INTERFACE_ENTRY_IMPL(IDataObject) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY_IMPL(ISpecifyPropertyPages) COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) END_COM_MAP() BEGIN_PROPERTY_MAP(CDfrgCtl) // Example entries // PROP_ENTRY("Property Description", dispid, clsid) PROP_PAGE(CLSID_StockColorPage) END_PROPERTY_MAP() BEGIN_MSG_MAP(CDfrgCtl) MESSAGE_HANDLER(WM_PAINT, OnPaint) MESSAGE_HANDLER(WM_SIZE, OnSize) MESSAGE_HANDLER(WM_NOTIFY, OnNotify) MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus) MESSAGE_HANDLER(WM_TIMER, OnTimer) MESSAGE_HANDLER(WM_COMMAND, OnCommand) MESSAGE_HANDLER(WM_CLOSE, OnClose) MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu) END_MSG_MAP() BEGIN_CONNECTION_POINT_MAP(CDfrgCtl) CONNECTION_POINT_ENTRY(IID_IDfrgEvents) END_CONNECTION_POINT_MAP() STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid); // IViewObjectEx STDMETHOD(GetViewStatus)(DWORD* pdwStatus) { ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n")); *pdwStatus = VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE; return S_OK; } // IDfrgCtl public: STDMETHOD(get_IsVolListLocked)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(get_IsDefragInProcess)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(get_IsEngineRunning)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(get_IsEnginePaused)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(get_ReportStatus)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(get_EngineState)(/*[out, retval]*/ short *pVal); HRESULT OnNotify(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnSizing(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnExitSizeMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnEraseBkgnd(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT SizeWindow(); HRESULT OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnFontChange(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT OnContextMenu(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); HRESULT RefreshListViewRow(CVolume *pVolume); #ifdef ESI_PROGRESS_BAR void InvalidateProgressBar(void); #endif HRESULT OnTimer(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& lResult); STDMETHOD(get_Command)(/*[out, retval]*/ short *pVal); STDMETHOD(put_Command)(/*[in]*/ short newVal); HRESULT CreateButtons(void); BOOL PaintClusterMap(IN BOOL bPartialRedraw, HDC WorkDC); void InvalidateGraphicsWindow(void); BOOL SizeGraphicsWindow(void); BOOL DrawButtons(HDC); void SizeLegend(void); void SizeButtons(void); void SetButtonState(void); HRESULT PreviousTab(); HRESULT NextTab(); STDMETHOD(TranslateAccelerator)(LPMSG pMsg); LRESULT OnSetFocus(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnKillFocus(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); // // Status change handler. // void SendStatusChange( LPCTSTR pszStatus ); // // Send to advises when control has changed OKToRun property. // void SendOKToRun( BOOL bOK ); // these are public cause they are used by the PostMsg public: STDMETHOD(get_Enabled)(/*[out, retval]*/ BOOL *pVal); STDMETHOD(put_Enabled)(/*[in]*/ BOOL newVal); STDMETHOD(get_IsOkToRun)(/*[out, retval]*/ BOOL *pVal); BOOL m_bPartialRedraw; // the graphics wells RECT rcAnalyzeDisp; RECT rcDefragDisp; ///////////////////////////////// // The volume list container // is public so that PostMessageLocal can see it ///////////////////////////////// CVolList m_VolumeList; private: // used to prevent more than one instance of the control from running BOOL m_bStart; BOOL m_bNeedMultiInstanceMessage; BOOL m_bNeedIllegalVolumeMessage; DWORD m_dwInstanceRegister; BOOL m_IsOkToRun; HANDLE m_hIsOkToRunSemaphore; HFONT m_hFont; UINT m_FontHeight; UINT GetStringWidth(PTCHAR stringBuf, HDC WorkDC); BOOL IsOnlyInstance(); ///////////////////////////////// // The entire graphics area ///////////////////////////////// BOOL DrawSingleInstanceScreen(HDC); RECT m_rcCtlRect; int m_Margin; ///////////////////////////////// // Progress Bar ///////////////////////////////// #ifdef ESI_PROGRESS_BAR BOOL DrawProgressBar(HDC); RECT rcProgressBarBG; RECT rcProgressBar; BOOL m_IsProgressBarMoved; int m_ProgressBarOffset; // offset top and bottom in legend window int m_ProgressBarLength; #endif ///////////////////////////////// // Legend ///////////////////////////////// BOOL DrawLegend(HDC); RECT rcLegendBG; int m_LegendTextWidth; // length of all the text if on 1 line int m_LegendGraphicSpacer; int m_LegendHeight; int m_LegendTextSpacer; int m_LegendTopSpace; int m_EtchedLineOffset; int m_BitmapVOffset; // space above and below the legend bitmaps ///////////////////////////////// // Graphics Area ///////////////////////////////// BOOL PaintGraphicsWindow(HDC); RECT rcGraphicsBG; // total BG // borders around the graphic wells RECT rcAnalyzeBorder; RECT rcDefragBorder; UINT m_GraphicWellSpacer; UINT m_GraphicWellHeight; ///////////////////////////////// // Buttons ///////////////////////////////// BOOL m_ButtonsLocked; RECT rcButtonBG; // position of the buttons // in absolute coodinates RECT rcDefragButton; RECT rcAnalyzeButton; RECT rcPauseButton; RECT rcCancelButton; RECT rcReportButton; // the buttons HRESULT DestroyButtons(void); BOOL m_bHaveButtons; UINT m_ButtonTopBottomSpacer; UINT m_ButtonHeight; UINT m_ButtonWidth; UINT m_ButtonSpacer; ESButton* m_pAnalyzeButton; ESButton* m_pDefragButton; ESButton* m_pPauseButton; ESButton* m_pStopButton; ESButton* m_pReportButton; HRESULT HandleEnterKeyPress(); ///////////////////////////////// // Listview ///////////////////////////////// CESIListView m_ListView; RECT rcListView; // Pointer to CBmp class that holds all the legend bitmap squares CBmp* m_pLegend; struct legendData { int length; // length of legend text plus bitmap plus spacers VString text; // legend entry text RECT rcBmp; // rectangle that defines location of bitmap } m_LegendData[7]; }; using namespace std; typedef vector< HWND, allocator > HWNDVECTOR; class CTabEnumerator { public: CTabEnumerator( HWND hWndParent, bool fForward ) { m_hWndParent = hWndParent; m_fForward = fForward; }; HWND GetNextTabWindow(); void AddChild( HWND hWnd ) { // // Only add this if it is a top-level child. // if ( GetParent( hWnd ) == m_hWndParent && IsWindowEnabled( hWnd ) ) m_Children.push_back( hWnd ); } protected: HWND m_hWndParent; HWNDVECTOR m_Children; bool m_fForward; }; #endif //__DFRGCTL_H_