//+------------------------------------------------------------------------- // // 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 { 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 private: bool m_bCanCloseViews; public: bool CanCloseViews() {return m_bCanCloseViews;} // 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 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__