Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

397 lines
14 KiB

#ifndef __MARSWIN_H
#define __MARSWIN_H
#include "marsevt.h"
#include "profsvc.h"
//
// The compiler doesn't like this perfectly correct code:
//
// MESSAGE_RANGE_HANDLER(0, 0xFFFF, ForwardToMarsHost);
//
#pragma warning(disable:4296) // expression is always true/false
EXTERN_C const GUID CLASS_CMarsWindow;
EXTERN_C const GUID CLASS_CMarsDocument;
const LONG FLASH_TIMER_ID = 42;
class CMarsPanel;
struct CMarsEventSink
{
CComPtr<IDispatch> m_spDispatchSink;
CComPtr<IUnknown> m_spUnknownOwner;
CMarsEventSink *m_pNext;
BOOL m_fPendingDelete : 1; // Needs to be deleted ASAP
CMarsEventSink(IDispatch *pDispatchSink, IUnknown *pUnknownOwner, CMarsEventSink *pNext)
{
m_spDispatchSink = pDispatchSink;
m_spUnknownOwner = pUnknownOwner;
m_pNext = pNext;
}
};
struct CEventSinkList
{
CMarsEventSink *m_pEventSinks;
int m_cBusyLock; // Not safe to delete items in the list
BOOL m_fPendingDeletes : 1; // Have items to delete
void DoPendingDeletes()
{
if (m_fPendingDeletes)
{
CMarsEventSink **ppNextEventSink = &m_pEventSinks;
CMarsEventSink *pEventSink;
while (*ppNextEventSink)
{
pEventSink = *ppNextEventSink;
if (pEventSink->m_fPendingDelete)
{
*ppNextEventSink = pEventSink->m_pNext;
if (pEventSink->m_pNext)
{
ppNextEventSink = &pEventSink->m_pNext->m_pNext;
}
delete pEventSink;
}
else
{
ppNextEventSink = &pEventSink->m_pNext;
}
}
m_fPendingDeletes = FALSE;
}
}
~CEventSinkList()
{
CMarsEventSink *pEventSink = m_pEventSinks;
while (NULL != pEventSink)
{
CMarsEventSink *pNextSink = pEventSink->m_pNext;
delete pEventSink;
pEventSink = pNextSink;
}
}
};
struct CMarsPanelProp
{
CComPtr<IUnknown> m_spUnknownOwner;
CComVariant m_var;
CMarsPanelProp(VARIANT& var, IUnknown *pUnknownOwner)
{
m_var = var;
m_spUnknownOwner = pUnknownOwner;
}
};
class CMarsDocument : public CMarsComObject,
public IServiceProvider
{
protected:
virtual ~CMarsDocument();
CMarsDocument();
HRESULT DoPassivate();
HRESULT Init(CMarsWindow *pMarsWindow, CMarsPanel *pHostPanel);
public:
// IUnknown
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
// IServiceProvider
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv);
static HRESULT CreateInstance(CMarsWindow *pMarsWindow, CMarsPanel *pHostPanel, CMarsDocument **ppObj);
// Panel/Place methods
HRESULT ReadPanelDefinition(LPCWSTR pwszUrl);
class CPanelCollection *GetPanels() { ATLASSERT(m_spPanels); return m_spPanels; }
class CPlaceCollection *GetPlaces() { ATLASSERT(m_spPlaces); return m_spPlaces; }
HRESULT GetPlaces(IMarsPlaceCollection **ppPlaces);
// Window that the document is in.
CWindow *Window() { return &m_cwndDocument; }
// Window that the application is in.
CMarsWindow *MarsWindow() { ATLASSERT(m_spMarsWindow); return m_spMarsWindow; }
void ForwardMessageToChildren(UINT uMsg, WPARAM wParam, LPARAM lParam);
static HRESULT GetFromUnknown(IUnknown *punk, CMarsDocument **ppMarsDocument)
{
return IUnknown_QueryService(punk, SID_SMarsDocument, CLASS_CMarsDocument, (void **)ppMarsDocument);
}
private:
// Topmost application window + app services
CComClassPtr<CMarsWindow> m_spMarsWindow;
// Panels and places within this document
CComClassPtr<class CPanelCollection> m_spPanels;
CComClassPtr<class CPlaceCollection> m_spPlaces;
// Window for this document (either CMarsWindow or CPanel)
CWindow m_cwndDocument;
// Panel that this doc is hosted in (if any)
CComClassPtr<class CMarsPanel> m_spHostPanel;
};
typedef MarsIDispatchImpl<IMarsWindowOM, &IID_IMarsWindowOM> IMarsWindowOMImpl;
class CMarsWindow :
public CMarsDocument,
public CWindowImpl<CMarsWindow>,
public IMarsWindowOMImpl,
public IProfferServiceImpl,
public IOleInPlaceFrame
{
protected:
virtual ~CMarsWindow();
CMarsWindow();
HRESULT DoPassivate();
HRESULT Init(IMarsHost *pMarsHost, MARSTHREADPARAM *pThreadParam);
HRESULT Startup();
void DoShowWindow(int nCmdShow);
public:
static HRESULT CreateInstance(IMarsHost *pMarsHost, MARSTHREADPARAM *pThreadParam, CMarsWindow **ppObj);
// IUnknown
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
// IDispatch
IMPLEMENT_IDISPATCH_DELEGATE_TO_BASE(IMarsWindowOMImpl);
// IMarsWindowOM
STDMETHOD(get_active)(VARIANT_BOOL *pbActive);
STDMETHOD(get_minimized)(VARIANT_BOOL *pbMinimized);
STDMETHOD(put_minimized)(VARIANT_BOOL bMinimized);
STDMETHOD(get_maximized)(VARIANT_BOOL *pbMaximized);
STDMETHOD(put_maximized)(VARIANT_BOOL bMaximized);
STDMETHOD(get_title)(BSTR *pbstrTitle);
STDMETHOD(put_title)(BSTR bstrTitle);
STDMETHOD(get_height)(long *plHeight);
STDMETHOD(put_height)(long lHeight);
STDMETHOD(get_width)(long *plWidth);
STDMETHOD(put_width)(long lWidth);
STDMETHOD(get_x)(long *plX);
STDMETHOD(put_x)(long lX);
STDMETHOD(get_y)(long *plY);
STDMETHOD(put_y)(long lY);
STDMETHOD(get_visible)(VARIANT_BOOL *pbVisible);
STDMETHOD(put_visible)(VARIANT_BOOL bVisible);
STDMETHOD(get_panels)(IMarsPanelCollection **ppPanels);
STDMETHOD(get_places)(IMarsPlaceCollection **ppPlaces);
STDMETHOD(setWindowDimensions)( /*[in]*/ long lX, /*[in]*/ long lY, /*[in]*/ long lW, /*[in]*/ long lH );
STDMETHOD(close)();
STDMETHOD(refreshLayout)();
// IServiceProvider methods
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv);
// IOleWindow
STDMETHODIMP GetWindow(HWND *phwnd);
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode);
// IOleInPlaceUIWindow
STDMETHODIMP GetBorder(LPRECT lprectBorder);
STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS pborderwidths);
STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS pborderwidths);
STDMETHODIMP SetActiveObject(IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName);
// IOleInPlaceFrame
STDMETHODIMP InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
STDMETHODIMP SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);
STDMETHODIMP RemoveMenus(HMENU hmenuShared);
STDMETHODIMP SetStatusText(LPCOLESTR pszStatusText);
STDMETHODIMP EnableModeless(BOOL fEnable);
STDMETHODIMP TranslateAccelerator(LPMSG lpmsg, WORD wID);
// CWindowImpl
static CWndClassInfo& GetWndClassInfo()
{
static CWndClassInfo wc =
{
{ sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc,
0, 0, NULL, NULL, NULL,
(HBRUSH)(COLOR_WINDOW + 1), NULL, _T("PCHShell Window"), NULL },
NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
};
return wc;
}
BEGIN_MSG_MAP(CMarsWindow)
MESSAGE_RANGE_HANDLER(0, 0xFFFF , ForwardToMarsHost);
MESSAGE_HANDLER (WM_CREATE , OnCreate );
MESSAGE_HANDLER (WM_SIZE , OnSize );
MESSAGE_HANDLER (WM_CLOSE , OnClose );
MESSAGE_HANDLER (WM_NCCALCSIZE , OnNCCalcSize );
MESSAGE_HANDLER (WM_NCACTIVATE , OnNCActivate );
MESSAGE_HANDLER (WM_ACTIVATE , OnActivate );
MESSAGE_HANDLER (WM_ERASEBKGND , OnEraseBkgnd );
MESSAGE_HANDLER (WM_PAINT , OnPaint );
MESSAGE_HANDLER (WM_NCPAINT , OnNCPaint );
MESSAGE_HANDLER (WM_PALETTECHANGED , OnPaletteChanged );
MESSAGE_HANDLER (WM_QUERYNEWPALETTE, OnQueryNewPalette);
MESSAGE_HANDLER (WM_SYSCOLORCHANGE , OnSysColorChange );
MESSAGE_HANDLER (WM_DISPLAYCHANGE , OnDisplayChange );
MESSAGE_HANDLER (WM_SYSCOMMAND , OnSysCommand );
MESSAGE_HANDLER (WM_SETFOCUS , OnSetFocus );
MESSAGE_HANDLER (WM_SETTEXT , OnSetText );
MESSAGE_HANDLER (WM_GETMINMAXINFO , OnGetMinMaxInfo );
END_MSG_MAP()
// Window message handlers
BOOL PreTranslateMessage (MSG &msg);
BOOL TranslateAccelerator(MSG &msg);
LRESULT ForwardToMarsHost(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnCreate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSize (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnClose (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnNCCalcSize (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnNCActivate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnActivate (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnEraseBkgnd (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnPaint (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnNCPaint (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnPaletteChanged (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnQueryNewPalette(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSysColorChange (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnDisplayChange (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSysCommand (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSetFocus (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSetText (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnGetMinMaxInfo (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
////////////////////////////////////////
void GetMinMaxInfo( CPanelCollection *spPanels, int pos, POINT& ptMin, POINT& ptMax );
void FixLayout ( CPanelCollection *spPanels, int index, RECT rcClient, POINT& ptDiff );
bool CanLayout( /*[in]*/ RECT rcClient );
void FixLayout( /*[in]*/ RECT rcClient );
////////////////////////////////////////
void OnFinalMessage (HWND hWnd);
// Eventing Methods
STDMETHODIMP ReleaseOwnedObjects(IUnknown *pUnknownOwner);
void CancelEvent(VARIANT_BOOL bCancel) { m_bEventCancelled = bCancel; }
VARIANT_BOOL IsEventCancelled() { return m_bEventCancelled; }
void OnTransitionComplete();
void SetFirstPlace( LPCWSTR szPlace );
// Other methods
HRESULT Passivate();
BOOL IsWindowActive() { return m_fActiveWindow; }
void ShowTitleBar(BOOL fShowTitleBar);
STDMETHODIMP GetSetting(BSTR bstrSubPath, BSTR bstrName, VARIANT *pvarVal);
STDMETHODIMP PutSetting(BSTR bstrSubPath, BSTR bstrName, VARIANT varVal);
STDMETHODIMP PutProperty(BSTR bstrName, VARIANT varVal, IUnknown *punkOwner);
STDMETHODIMP GetProperty(BSTR bstrName, VARIANT *pvarVal);
VARIANT_BOOL get_SingleButtonMouse() { return m_bSingleButtonMouse; }
void put_SingleButtonMouse(VARIANT_BOOL bVal) { m_bSingleButtonMouse = bVal; }
void SpinMessageLoop( BOOL fWait );
HRESULT NotifyHost(MARSHOSTEVENT event, IUnknown *punk, LPARAM lParam)
{
HRESULT hr;
if(m_spMarsHost)
{
hr = m_spMarsHost->OnHostNotify(event, punk, lParam);
if(hr == E_NOTIMPL)
{
hr = S_OK;
}
}
else
{
hr = S_OK;
}
return hr;
}
void GetAccelerators(HACCEL *phAccel, UINT *pcAccel)
{
if (!m_hAccel)
{
ACCEL ac = { 0,0,0 };
m_hAccel = CreateAcceleratorTable(&ac, 1);
}
*phAccel = m_hAccel;
*pcAccel = m_hAccel ? 1 : 0;
}
MARSTHREADPARAM *GetThreadParam()
{
ATLASSERT(m_pThreadParam);
return m_pThreadParam;
};
static HRESULT GetFromUnknown(IUnknown *punk, CMarsWindow **ppMarsWindow)
{
return IUnknown_QueryService(punk, SID_SMarsWindow, CLASS_CMarsWindow, (void **) ppMarsWindow);
}
bool InitWindowPosition( CGlobalSettingsRegKey& regkey, BOOL fWrite );
void SaveWindowPosition( CGlobalSettingsRegKey& regkey );
void LoadWindowPosition( CGlobalSettingsRegKey& regkey, BOOL fAllowMaximized, WINDOWPLACEMENT& wp, BOOL& fMaximized );
protected:
HWND m_hwndFocus;
BOOL m_fActiveWindow : 1; // Are we the active window?
BOOL m_fShowTitleBar : 1;
BOOL m_fStartMaximized : 1; // Will we start off maximized?
BOOL m_fUIPanelsReady : 1; // Have all our UI panels finished loading yet?
BOOL m_fDeferMakeVisible : 1; // Did someone put_visible(TRUE) before the UI was ready?
BOOL m_fEnableModeless : 1; // Should modeless dlgs and stuff be enabled?
BOOL m_fLayoutLocked : 1; // When minimized, layout is locked.
HACCEL m_hAccel;
VARIANT_BOOL m_bEventCancelled;
VARIANT_BOOL m_bSingleButtonMouse;
CComPtr<IMarsHost> m_spMarsHost;
MARSTHREADPARAM* m_pThreadParam;
CComBSTR m_bstrFirstPlace;
};
#endif // __MARSWIN_H