windows-nt/Source/XPSP1/NT/base/fs/utils/dfrg/dfrgui/dfrgctl.h
2020-09-26 16:20:57 +08:00

303 lines
8.8 KiB
C++

// 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 <vector>
/////////////////////////////////////////////////////////////////////////////
// CDfrgCtl
class ATL_NO_VTABLE CDfrgCtl :
public CComObjectRootEx<CComSingleThreadModel>
,public CComCoClass<CDfrgCtl, &CLSID_DfrgCtl>
,public CComControl<CDfrgCtl>
,public CStockPropImpl<CDfrgCtl, IDfrgCtl, &IID_IDfrgCtl, &LIBID_DFRGUILib>
,public IProvideClassInfo2Impl<&CLSID_DfrgCtl, NULL, &LIBID_DFRGUILib> // needed
,public IPersistStreamInitImpl<CDfrgCtl>
,public IPersistStorageImpl<CDfrgCtl>
,public IQuickActivateImpl<CDfrgCtl>
,public IOleControlImpl<CDfrgCtl> // needed
,public IOleObjectImpl<CDfrgCtl> // needed
,public IOleInPlaceActiveObjectImpl<CDfrgCtl>
,public IViewObjectExImpl<CDfrgCtl>
,public IOleInPlaceObjectWindowlessImpl<CDfrgCtl>
,public IDataObjectImpl<CDfrgCtl>
,public ISupportErrorInfo
,public ISpecifyPropertyPagesImpl<CDfrgCtl>
,public IConnectionPointContainerImpl<CDfrgCtl>
,public IConnectionPointImpl<CDfrgCtl,&IID_IDfrgEvents>
{
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<HWND> > 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_