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.
 
 
 
 
 
 

422 lines
17 KiB

#ifndef __PANEL_H
#define __PANEL_H
// A "panel" is basically a tiled window inside the outer Mars window
class CMarsDocument;
class CMarsWindow;
interface IBrowserService;
#include "axhost.h"
#include "external.h"
#include "profsvc.h"
#include "pandef.h"
class CPanelCollection;
EXTERN_C const GUID CLASS_CMarsPanel;
class CMarsPanel :
public CMarsComObject,
public MarsIDispatchImpl<IMarsPanel, &IID_IMarsPanel>,
public IHlinkFrame,
public IInternetSecurityManager,
public IServiceProvider,
public IProfferServiceImpl,
public IOleInPlaceSite,
public IOleControlSite,
public IPropertyNotifySink,
public IOleInPlaceUIWindow
{
friend CPanelCollection;
CMarsPanel(CPanelCollection *pParent, CMarsWindow *pMarsWindow);
protected:
virtual ~CMarsPanel();
HRESULT DoPassivate();
public:
virtual HRESULT Passivate();
HRESULT Create( MarsAppDef_Panel* pLayout);
HRESULT NavigateMk(IMoniker *pmk);
HRESULT NavigateURL(LPCWSTR lpszURL, BOOL fForceLoad);
HRESULT Layout( RECT *prcClient );
void OnWindowPosChanging( WINDOWPOS *pWindowPos );
void OnWindowPosChanged ( WINDOWPOS *pWindowPos );
void GetMinMaxInfo( POINT& ptMin, POINT& ptMax );
bool CanLayout( RECT& rcClient, POINT& ptDiff );
void GetUrl ( CComBSTR& rbstrUrl );
BSTR GetName () { return m_bstrName; }
CMarsAxWindow *Window () { return &m_Content; }
CPanelCollection *Panels () { return m_spPanelCollection; }
long GetWidth () { return m_lWidth; }
long GetHeight() { return m_lHeight; }
HRESULT UIDeactivate();
HRESULT TranslateAccelerator(MSG *pMsg);
void ForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
CMarsDocument *Document() { return m_spMarsDocument; }
bool IsWebBrowser () { return (m_dwFlags & PANEL_FLAG_WEBBROWSER ) != 0; }
bool IsCustomControl () { return (m_dwFlags & PANEL_FLAG_CUSTOMCONTROL) != 0; }
bool IsPopup () { return (m_Position == PANEL_POPUP); }
bool IsVisible () { return !!m_fVisible; }
bool WasInPreviousPlace() { return !!m_fPresentInPlace; }
bool IsTrusted () { return (m_dwFlags & PANEL_FLAG_TRUSTED ) != 0; }
bool AutoPersists () { return (m_dwFlags & PANEL_FLAG_AUTOPERSIST ) != 0; }
bool IsAutoSizing () { return (m_dwFlags & PANEL_FLAG_AUTOSIZE ) != 0; }
LONG GetReadyState () { return m_lReadyState; }
PANEL_POSITION GetPosition () { return m_Position; }
BOOL GetTabCycle() { return m_fTabCycle; }
void ResetTabCycle() { ATLASSERT(m_fTabCycle); m_fTabCycle = FALSE; }
void SetPresenceInPlace( BOOL fPresent ) { m_fPresentInPlace = fPresent; }
BOOL IsContentInvalid() { return m_fContentInvalid; }
HRESULT DoEnableModeless(BOOL fEnable);
// IUnknown
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
// IMarsPanel
STDMETHOD(get_name )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(get_content )( /*[out, retval]*/ IDispatch* *pVal );
STDMETHOD(get_visible )( /*[out, retval]*/ VARIANT_BOOL *pVal );
STDMETHOD(put_visible )( /*[in ]*/ VARIANT_BOOL newVal );
STDMETHOD(get_startUrl )( /*[out, retval]*/ BSTR *pVal );
STDMETHOD(put_startUrl )( /*[in ]*/ BSTR newVal );
STDMETHOD(get_height )( /*[out, retval]*/ long *pVal );
STDMETHOD(put_height )( /*[in ]*/ long newVal );
STDMETHOD(get_width )( /*[out, retval]*/ long *pVal );
STDMETHOD(put_width )( /*[in ]*/ long newVal );
STDMETHOD(get_x )( /*[out, retval]*/ long *pVal );
STDMETHOD(put_x )( /*[in ]*/ long newVal );
STDMETHOD(get_y )( /*[out, retval]*/ long *pVal );
STDMETHOD(put_y )( /*[in ]*/ long newVal );
STDMETHOD(get_position )( /*[out, retval]*/ VARIANT *pVal );
STDMETHOD(put_position )( /*[in ]*/ VARIANT newVal );
STDMETHOD(get_autoSize )( /*[out, retval]*/ VARIANT_BOOL *pVal );
STDMETHOD(put_autoSize )( /*[in ]*/ VARIANT_BOOL newVal );
STDMETHOD(get_contentInvalid )( /*[out, retval]*/ VARIANT_BOOL *pVal );
STDMETHOD(put_contentInvalid )( /*[in ]*/ VARIANT_BOOL newVal );
STDMETHOD(get_layoutIndex )( /*[out, retval]*/ long *pVal );
STDMETHOD(get_isCurrentlyVisible)( /*[out, retval]*/ VARIANT_BOOL *pVal );
STDMETHOD(moveto)( VARIANT lX, VARIANT lY, VARIANT lWidth, VARIANT lHeight );
STDMETHOD(restrictHeight)( VARIANT lMin, VARIANT lMax, VARIANT varMarker );
STDMETHOD(restrictWidth )( VARIANT lMin, VARIANT lMax, VARIANT varMarker );
STDMETHOD(canResize)( long lDX, long lDY, VARIANT_BOOL *pVal );
STDMETHOD(navigate)( VARIANT varTarget, VARIANT varForceLoad );
STDMETHOD(refresh )();
STDMETHOD(activate)();
STDMETHOD(insertBefore)( VARIANT varInsertBefore );
STDMETHOD(execMshtml)( DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut );
////////////////////////////////////////////////////////////////////////////////
// IServiceProvider methods
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv);
// IHlinkFrame
STDMETHODIMP GetBrowseContext(IHlinkBrowseContext **ppihlbc)
{ return E_NOTIMPL; }
STDMETHODIMP OnNavigate(DWORD grfHLNF, IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, DWORD dwreserved)
{ return E_NOTIMPL; }
STDMETHODIMP UpdateHlink(ULONG uHLID, IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName)
{ return E_NOTIMPL; }
STDMETHODIMP SetBrowseContext(IHlinkBrowseContext *pihlbc)
{ return E_NOTIMPL; }
STDMETHODIMP Navigate(DWORD grfHLNF, LPBC pbc, IBindStatusCallback *pibsc, IHlink *pihlNavigate);
// IInternetSecurityManager
STDMETHODIMP SetSecuritySite(IInternetSecurityMgrSite *pSite);
STDMETHODIMP GetSecuritySite(IInternetSecurityMgrSite **ppSite);
STDMETHODIMP MapUrlToZone(LPCWSTR pwszUrl, DWORD *pdwZone, DWORD dwFlags);
STDMETHODIMP GetSecurityId(LPCWSTR pwszUrl, BYTE *pbSecurityId,
DWORD *pcbSecurityId, DWORD_PTR dwReserved);
STDMETHODIMP ProcessUrlAction(LPCWSTR pwszUrl, DWORD dwAction, BYTE __RPC_FAR *pPolicy,
DWORD cbPolicy, BYTE *pContext, DWORD cbContext,
DWORD dwFlags, DWORD dwReserved);
STDMETHODIMP QueryCustomPolicy(LPCWSTR pwszUrl, REFGUID guidKey, BYTE **ppPolicy,
DWORD *pcbPolicy, BYTE *pContext, DWORD cbContext,
DWORD dwReserved);
STDMETHODIMP SetZoneMapping(DWORD dwZone, LPCWSTR lpszPattern, DWORD dwFlags);
STDMETHODIMP GetZoneMappings(DWORD dwZone, IEnumString **ppenumString, DWORD dwFlags);
// IOleWindow
STDMETHODIMP GetWindow(HWND *phwnd)
{ return E_NOTIMPL; }
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
// IOleInPlaceSite
STDMETHODIMP CanInPlaceActivate()
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP OnInPlaceActivate()
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP OnUIActivate();
STDMETHODIMP GetWindowContext(IOleInPlaceFrame **ppFrame,
IOleInPlaceUIWindow **ppDoc,
LPRECT lprcPosRect,
LPRECT lprcClipRect,
LPOLEINPLACEFRAMEINFO lpFrameInfo)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP Scroll(SIZE scrollExtant)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP OnUIDeactivate(BOOL fUndoable)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP OnInPlaceDeactivate()
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP DiscardUndoState()
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP DeactivateAndUndo()
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP OnPosRectChange(LPCRECT lprcPosRect)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
// IOleControlSite
STDMETHODIMP OnControlInfoChanged()
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP LockInPlaceActive(BOOL fLock)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP GetExtendedControl(IDispatch **ppDisp)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP TransformCoords(POINTL *pPtlHimetric, POINTF *pPtfContainer,DWORD dwFlags)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP TranslateAccelerator(MSG *pMsg,DWORD grfModifiers);
STDMETHODIMP OnFocus(BOOL fGotFocus)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
STDMETHODIMP ShowPropertyFrame(void)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
// IPropertyNotifySink methods
STDMETHODIMP OnChanged(DISPID dispID);
STDMETHODIMP OnRequestEdit(DISPID dispID)
{ ATLASSERT(FALSE); return E_NOTIMPL; }
// IOleInPlaceUIWindow
STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/)
{
return S_OK;
}
STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return INPLACE_E_NOTOOLSPACE;
}
STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return S_OK;
}
STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/)
{
m_spActiveObject = pActiveObject;
return S_OK;
}
static HRESULT GetFromUnknown(IUnknown *punk, CMarsPanel **ppMarsPanel)
{
return IUnknown_QueryService(punk, SID_SMarsPanel, CLASS_CMarsPanel, (void **)ppMarsPanel);
}
HRESULT OnDocHostUIExec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt,
VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
protected:
HRESULT CreateControl();
HRESULT CreateControlObject();
HRESULT GetRect(RECT *prcClient, RECT *prcMyClient);
VOID ConnectCompletionAdviser();
VOID DisconnectCompletionAdviser();
VOID ComputeDimensionsOfContent(long *plWidth, long *plHeight);
void MakeVisible(VARIANT_BOOL bVisible, VARIANT_BOOL bForce);
void OnLayoutChange();
void GetMyClientRectInParentCoords(RECT *prc);
class CBrowserEvents : public CMarsPanelSubObject,
public IDispatch
{
friend CMarsPanel;
CBrowserEvents(CMarsPanel *pParent);
~CBrowserEvents() {}
HRESULT DoPassivate() { return S_OK; }
DWORD m_dwCookie;
DWORD m_dwCookie2;
public:
void Connect(IUnknown *punk, BOOL bConnect);
// IUnknown
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo)
{
*pctinfo = 0;
return E_NOTIMPL;
}
STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
*pptinfo = NULL;
return E_NOTIMPL;
}
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
LCID lcid, DISPID* rgdispid)
{
return E_NOTIMPL;
}
STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr);
};
protected:
friend class CBrowserEvents;
CMarsAxWindow m_Content; // Content in this panel
CBrowserEvents m_BrowserEvents;
CMarsExternal m_MarsExternal;
CComBSTR m_bstrName;
// Active object within this doc
CComPtr<IOleInPlaceActiveObject> m_spActiveObject;
CComClassPtr<CPanelCollection> m_spPanelCollection; // Parent collection
CComClassPtr<CMarsDocument> m_spMarsDocument; // Parent document
CComBSTR m_bstrStartUrl; // Used until control is created
PANEL_POSITION m_Position;
long m_lWidth; // Used for "left", "right", or "popup"
long m_lHeight; // Used for "top", "bottom", or "popup"
long m_lX; // Used for "popup"
long m_lY; // Used for "popup"
DWORD m_dwFlags; // PANEL_FLAG_*
long m_lMinWidth; // size constraints
long m_lMaxWidth; // ""
long m_lMinHeight; // ""
long m_lMaxHeight; // ""
DWORD m_dwCookie; // Cookie for mshtml sink for resize events
long m_lReadyState; // READYSTATE_*
BOOL m_fControlCreated : 1; // Has control been created?
BOOL m_fVisible : 1; // Should we be visible?
BOOL m_fPresentInPlace : 1; // Were we in the previous place?
BOOL m_fTabCycle : 1;
BOOL m_fInRefresh : 1; // Are we the one calling Trident to refresh?
BOOL m_fContentInvalid : 1; // Does this panel need updating after a theme switch?
CComPtr<IBrowserService> m_spBrowserService;
};
typedef CMarsSimpleArray<CComClassPtr<CMarsPanel> > CPanelArray;
typedef MarsIDispatchImpl<IMarsPanelCollection, &IID_IMarsPanelCollection> IMarsPanelCollectionImpl;
class CPanelCollection :
public CPanelArray,
public CMarsComObject,
public IMarsPanelCollectionImpl
{
friend CMarsDocument;
CPanelCollection(CMarsDocument *pMarsDocument);
HRESULT DoPassivate();
protected:
virtual ~CPanelCollection();
public:
// IUnknown
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
// IDispatch
IMPLEMENT_IDISPATCH_DELEGATE_TO_BASE(IMarsPanelCollectionImpl);
// IMarsPanelCollection
STDMETHOD(get_panel)(/*[in]*/ BSTR bstrName, /*[out, retval]*/ IMarsPanel **ppPanel);
STDMETHOD(addPanel)(/*[in]*/ BSTR bstrName, /*[in]*/ VARIANT varType, /*[in]*/ BSTR bstrStartUrl, /*[in]*/ VARIANT varCreate, /*[in]*/ long lFlags, /*[out, retval]*/ IMarsPanel **ppPanel);
STDMETHOD(removePanel)(/*[in]*/ BSTR bstrName);
STDMETHOD(lockLayout)();
STDMETHOD(unlockLayout)();
STDMETHOD(get_activePanel)(/*out, retval*/ IMarsPanel **ppPanel);
// IMarsPanelCollection standard collection methods
STDMETHOD(get_length)(/*[out, retval]*/ LONG *plNumPanels);
STDMETHOD(get_item)(/*[in]*/ VARIANT varIndexOrName, /*[out, retval]*/ IMarsPanel **ppPanel);
STDMETHOD(get__newEnum)(/*[out, retval]*/ IUnknown **ppEnumPanels);
HRESULT DoEnableModeless(BOOL fEnable);
void Layout();
BOOL IsLayoutLocked() { return (m_iLockLayout != 0); }
void SetActivePanel(CMarsPanel *pPanel, BOOL bActive);
CMarsPanel *ActivePanel() { return m_spActivePanel; }
CMarsDocument *Document() { return m_spMarsDocument; }
HRESULT AddPanel( MarsAppDef_Panel* pLayout, /*optional*/ IMarsPanel **ppPanel);
void FreePanels();
CMarsPanel *FindPanel(LPCWSTR pwszName);
HRESULT FindPanelIndex(CMarsPanel *pPanel, long *plIndex);
HRESULT InsertPanelFromTo(long lOldIndex, long lNewIndex);
void InvalidatePanels();
void RefreshInvalidVisiblePanels();
protected:
CComClassPtr<CMarsDocument> m_spMarsDocument;
CComClassPtr<CMarsPanel> m_spActivePanel;
int m_iLockLayout; // Is our panel layout temporarily locked (refcount)?
BOOL m_fPendingLayout : 1; // Do we have pending layouts because of lock?
};
#endif // __PANEL_H