Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

578 lines
15 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: amcdoc.h
//
//--------------------------------------------------------------------------
// AMCDoc.h : interface of the CAMCDoc class
//
/////////////////////////////////////////////////////////////////////////////
#ifndef AMCDOC_H__
#define AMCDOC_H__
#include "mmcdata.h"
#include "amc.h" // for AMCGetApp
#include "picon.h" // for CPersistableIcon
#include "tstring.h" // for CStringTableStringBase
#include "condoc.h"
#define EXPLICIT_SAVE 0x1
class CAMCView;
class ViewSettings;
class CMasterStringTable;
class CFavorites;
class CMMCDocument;
struct Document;
/*+-------------------------------------------------------------------------*
* CStringTableString
*
*
*--------------------------------------------------------------------------*/
class CStringTableString : public CStringTableStringBase
{
typedef CStringTableStringBase BaseClass;
public:
CStringTableString (IStringTablePrivate* pstp)
: BaseClass (pstp) {}
CStringTableString (const CStringTableString& other)
: BaseClass (other) {}
CStringTableString (const tstring& str)
: BaseClass (GetStringTable(), str) {}
CStringTableString& operator= (const CStringTableString& other)
{ BaseClass::operator=(other); return (*this); }
CStringTableString& operator= (const tstring& str)
{ BaseClass::operator=(str); return (*this); }
CStringTableString& operator= (LPCTSTR psz)
{ BaseClass::operator=(psz); return (*this); }
private:
IStringTablePrivate* GetStringTable() const;
};
/*+-------------------------------------------------------------------------*
* CAMCViewPosition
*
* This class abstracts a POSITION. It can be used to iterate through a
* CAMCDoc's CAMCView objects using GetFirstAMCViewPosition and
* GetNextAMCView.
*
* It exists to guard against using GetFirstViewPosition with GetNextAMCView
* or GetFirstAMCViewPosition with GetNextView.
*--------------------------------------------------------------------------*/
class CAMCViewPosition
{
public:
CAMCViewPosition() : m_pos(NULL)
{}
POSITION& GetPosition () // returns non-const reference
{ return (m_pos); }
void SetPosition (POSITION pos)
{ m_pos = pos; }
/*
* for comparison to NULL
*/
bool operator==(int null) const
{
ASSERT (null == 0); // *only* support comparison to NULL
return (m_pos == NULL);
}
bool operator!=(int null) const
{
ASSERT (null == 0); // *only* support comparison to NULL
return (m_pos != NULL);
}
private:
POSITION m_pos;
};
/*+-------------------------------------------------------------------------*
* class CAMCDoc
*
*
*--------------------------------------------------------------------------*/
class CAMCDoc :
public CDocument,
public CTiedObject,
public CXMLObject,
public CConsoleDocument,
public CConsoleFilePersistor,
public CEventSource<CAMCDocumentObserver>
{
enum SaveStatus
{
eStat_Failed,
eStat_Succeeded,
eStat_Cancelled
};
protected: // create from serialization only
CAMCDoc();
DECLARE_DYNCREATE(CAMCDoc)
// Attributes
public:
virtual BOOL IsModified();
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAMCDoc)
public:
virtual BOOL OnNewDocument();
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
SC ScOnOpenDocument(LPCTSTR lpszPathName); // SC version of the above method.
virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
virtual void DeleteContents();
virtual void OnCloseDocument();
virtual BOOL SaveModified();
//}}AFX_VIRTUAL
// object model related methods.
// hand over an automation object - CHANGE to use smart pointers.
SC ScGetMMCDocument(Document **ppDocument);
// Document interface
SC ScSave();
SC ScSaveAs( BSTR bstrFilename);
SC ScClose( BOOL bSaveChanges);
SC ScCreateProperties( PPPROPERTIES ppProperties);
// properties
SC Scget_Views( PPVIEWS ppViews);
SC Scget_SnapIns( PPSNAPINS ppSnapIns);
SC Scget_ActiveView( PPVIEW ppView);
SC Scget_Name( PBSTR pbstrName);
SC Scput_Name( BSTR bstrName);
SC Scget_Location( PBSTR pbstrLocation);
SC Scget_IsSaved( PBOOL pBIsSaved);
SC Scget_Mode( PDOCUMENTMODE pMode);
SC Scput_Mode( DocumentMode mode);
SC Scget_RootNode( PPNODE ppNode);
SC Scget_ScopeNamespace( PPSCOPENAMESPACE ppScopeNamespace);
SC Scget_Application(PPAPPLICATION ppApplication);
// Views interface
SC Scget_Count( PLONG pCount);
SC ScAdd( PNODE pNode, ViewOptions fViewOptions /* = ViewOption_Default*/ );
SC ScItem( long Index, PPVIEW ppView);
// views enumerator
SC ScEnumNext(CAMCViewPosition &pos, PDISPATCH & pDispatch);
SC ScEnumSkip(unsigned long celt, unsigned long& celtSkipped, CAMCViewPosition &pos);
SC ScEnumReset(CAMCViewPosition &pos);
public:
// to iterate through the AMCViews only (not all child views)
// similar to GetNextView and GetFirstViewPosition.
CAMCView * GetNextAMCView(CAMCViewPosition &pos) const;
CAMCViewPosition GetFirstAMCViewPosition() const;
public:
// CXMLObject overrides
DEFINE_XML_TYPE(XML_TAG_MMC_CONSOLE_FILE);
virtual void Persist(CPersistor& persistor);
void PersistFrame(CPersistor& persistor);
void PersistViews(CPersistor& persistor);
SC ScCreateAndLoadView(CPersistor& persistor, int nViewID, const CBookmark& rootNode);
void PersistCustomData (CPersistor &persistor);
IScopeTree* GetScopeTree()
{
return m_spScopeTree;
}
CAMCView* CreateNewView(bool visible, bool bEmitScriptEvents = true);
static CAMCDoc* GetDocument()
{
return m_pDoc;
}
MTNODEID GetMTNodeIDForNewView()
{
return m_MTNodeIDForNewView;
}
void SetMTNodeIDForNewView(MTNODEID id)
{
m_MTNodeIDForNewView = id;
}
int GetViewIDForNewView()
{
return m_ViewIDForNewView;
}
long GetNewWindowOptions()
{
return m_lNewWindowOptions;
}
HELPDOCINFO* GetHelpDocInfo()
{
return &m_HelpDocInfo;
}
void SetNewWindowOptions(long lOptions)
{
m_lNewWindowOptions = lOptions;
}
void SetMode (ProgramMode eMode);
ProgramMode GetMode () const
{
return (m_ConsoleData.GetConsoleMode());
}
bool IsFrameModified () const
{
return (m_fFrameModified);
}
void SetFrameModifiedFlag (bool fFrameModified = TRUE)
{
m_fFrameModified = fFrameModified;
}
// implements CConsoleDocument for document access from node manager
virtual SC ScOnSnapinAdded (PSNAPIN pSnapIn);
virtual SC ScOnSnapinRemoved (PSNAPIN pSnapIn);
virtual SC ScSetHelpCollectionInvalid();
public:
// Implementation
virtual ~CAMCDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
virtual BOOL DoFileSave();
virtual BOOL DoSave(LPCTSTR lpszPathName, BOOL bReplace = TRUE);
virtual HMENU GetDefaultMenu(); // get menu depending on state
SConsoleData* GetConsoleData() { return &m_ConsoleData; }
public:
HRESULT InitNodeManager();
void ShowStatusBar (bool fVisible);
/*
* Custom data stuff
*/
private:
bool LoadCustomData (IStorage* pStorage);
bool LoadCustomIconData (IStorage* pStorage);
bool LoadCustomTitleData (IStorage* pStorage);
bool LoadStringTable (IStorage* pStorage);
/*
* Custom icon stuff
*/
public:
HICON GetCustomIcon (bool fLarge, CString* pstrIconFile = NULL, int* pnIconIndex = NULL) const;
void SetCustomIcon (LPCTSTR pszIconFile, int nIconIndex);
bool HasCustomIcon () const
{ return (m_CustomIcon); }
private:
CPersistableIcon m_CustomIcon;
/*
* Custom title stuff
*/
public:
bool HasCustomTitle () const;
CString GetCustomTitle () const;
void SetCustomTitle (CString strNewTitle);
IStringTablePrivate* GetStringTable() const;
private:
CComPtr<IStringTablePrivate> m_spStringTable;
CStringTableString * m_pstrCustomTitle;
/*
* Favorites stuff
*/
public:
CFavorites* GetFavorites() { return m_pFavorites; }
private:
bool LoadFavorites();
CFavorites* m_pFavorites;
private:
static CAMCDoc* m_pDoc;
// the one and only document for the application
IScopeTreePtr m_spScopeTree;
// master namespace for document
IPersistStoragePtr m_spScopeTreePersist;
// master namespace IPersistStorage interface
IStoragePtr m_spStorage;
// the currently opened storage
MTNODEID m_MTNodeIDForNewView;
// the node id to be used when creating the next view
int m_ViewIDForNewView;
// the node id to be used when creating the next view
SConsoleData m_ConsoleData;
long m_lNewWindowOptions;
bool m_bReadOnlyDoc;
bool m_fFrameModified;
SaveStatus m_eSaveStatus;
DWORD m_dwFlags;
HELPDOCINFO m_HelpDocInfo;
void ReleaseNodeManager();
bool LoadViews();
bool LoadFrame();
bool LoadAppMode();
bool NodeManagerIsInitialized();
bool NodeManagerIsLoaded();
bool AssertNodeManagerIsInitialized();
bool AssertNodeManagerIsLoaded();
BOOL OnNewDocumentFailed();
void SetConsoleFlag (ConsoleFlags eFlag, bool fSet);
void DeleteHelpFile ();
SC ScGetViewSettingsPersistorStream(IPersistStream **pIPersistStreamViewSettings);
private:
bool GetDocumentMode(DocumentMode* pMode);
bool SetDocumentMode(DocumentMode docMode);
public:
// Is this save called implicitly or is it a result of exiting a modified file?
bool IsExplicitSave() const
{ return (0 != (m_dwFlags & EXPLICIT_SAVE)); }
void SetExplicitSave(bool bNewVal)
{
if (bNewVal)
m_dwFlags |= EXPLICIT_SAVE;
else
m_dwFlags &= ~EXPLICIT_SAVE;
}
bool AllowViewCustomization() const
{ return ((m_ConsoleData.m_dwFlags & eFlag_PreventViewCustomization) == 0); }
bool IsLogicalReadOnly() const
{ return ((m_ConsoleData.m_dwFlags & eFlag_LogicalReadOnly) != 0); }
bool IsPhysicalReadOnly() const
{ return (m_bReadOnlyDoc); }
// physical ReadOnly does not apply to user mode - it is not saving to original console
// anyway.
bool IsReadOnly() const
{ return ((IsPhysicalReadOnly() && (AMCGetApp()->GetMode() == eMode_Author)) ||
(IsLogicalReadOnly() && (AMCGetApp()->GetMode() != eMode_Author))) ; }
void SetPhysicalReadOnlyFlag (bool fPhysicalReadOnly)
{ m_bReadOnlyDoc = fPhysicalReadOnly; }
void SetLogicalReadOnlyFlag (BOOL fLogicalReadOnly)
{ SetConsoleFlag (eFlag_LogicalReadOnly, fLogicalReadOnly); }
void AllowViewCustomization (BOOL fAllowCustomization)
{ SetConsoleFlag (eFlag_PreventViewCustomization, !fAllowCustomization); }
int GetNumberOfViews();
int GetNumberOfPersistedViews();
private:
//{{AFX_MSG(CAMCDoc)
afx_msg void OnUpdateFileSave(CCmdUI* pCmdUI);
afx_msg void OnConsoleAddremovesnapin();
afx_msg void OnUpdateConsoleAddremovesnapin(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
DocumentPtr m_sp_Document;
ViewsPtr m_spViews;
};
inline bool CAMCDoc::NodeManagerIsInitialized()
{
return m_spScopeTree != NULL && m_spScopeTreePersist != NULL;
}
inline bool CAMCDoc::NodeManagerIsLoaded()
{
return NodeManagerIsInitialized() && m_spStorage != NULL;
}
inline bool CAMCDoc::AssertNodeManagerIsInitialized()
{
bool const bInited = NodeManagerIsInitialized();
ASSERT(bInited);
return bInited;
}
inline bool CAMCDoc::AssertNodeManagerIsLoaded()
{
bool const bLoaded = NodeManagerIsLoaded();
ASSERT(bLoaded);
return bLoaded;
}
inline BOOL CAMCDoc::OnNewDocumentFailed()
{
ReleaseNodeManager();
return FALSE;
}
inline bool CAMCDoc::GetDocumentMode(DocumentMode* pMode)
{
if (! pMode)
return false;
switch(GetMode())
{
case eMode_Author:
*pMode = DocumentMode_Author;
break;
case eMode_User:
*pMode = DocumentMode_User;
break;
case eMode_User_MDI:
*pMode = DocumentMode_User_MDI;
break;
case eMode_User_SDI:
*pMode = DocumentMode_User_SDI;
break;
default:
ASSERT(FALSE && _T("Unknown program mode"));
return false;
break;
}
return true;
}
inline bool CAMCDoc::SetDocumentMode(DocumentMode docMode)
{
switch(docMode)
{
case DocumentMode_Author:
SetMode(eMode_Author);
break;
case DocumentMode_User:
SetMode(eMode_User);
break;
case DocumentMode_User_SDI:
SetMode(eMode_User_SDI);
break;
case DocumentMode_User_MDI:
SetMode(eMode_User_MDI);
break;
default:
return false; // Unknown mode.
break;
}
return true;
}
//+-------------------------------------------------------------------
//
// Member: CAMCDoc::ScGetViewSettingsPersistorStream
//
// Synopsis: helper to get the IPersistStream interface for
// CViewSettingsPersistor object.
//
// Arguments: [pIPersistStreamViewSettings] - [out]
//
// Returns: SC
//
//--------------------------------------------------------------------
inline SC CAMCDoc::ScGetViewSettingsPersistorStream (/*[out]*/IPersistStream **pIPersistStreamViewSettings)
{
DECLARE_SC(sc, _T("CAMCDoc::ScGetViewSettingsPersistorStream"));
sc = ScCheckPointers(pIPersistStreamViewSettings);
if (sc)
return sc;
sc = ScCheckPointers(m_spScopeTree, E_UNEXPECTED);
if (sc)
return sc;
INodeCallbackPtr spNodeCallback;
sc = m_spScopeTree->QueryNodeCallback(&spNodeCallback);
if (sc)
return sc;
sc = ScCheckPointers(spNodeCallback, E_UNEXPECTED);
if (sc)
return sc;
sc = spNodeCallback->QueryViewSettingsPersistor(pIPersistStreamViewSettings);
if (sc)
return sc;
sc = ScCheckPointers(pIPersistStreamViewSettings, E_UNEXPECTED);
if (sc)
return sc;
return (sc);
}
int DisplayFileOpenError (SC sc, LPCTSTR pszFilename);
/////////////////////////////////////////////////////////////////////////////
#endif // AMCDOC_H__