/****************************************************************************** Header File: Project Node.H This describes the Project Node. This keeps the Project Control Window code simple, by having a project node which can create new intances of itself, import itself from another source, edit itself, etc. Most Menu and tree view notification messages wind up being handled by being passed to the currently selected node on the tree, which will be an instance of a class derived from this one. Copyright (c) 1996 by Microsoft Corporation A Pretty Penny Enterprises Production Change History: 12-16-96 KjelgaardR@acm.org Created it ******************************************************************************/ #if !defined(PROJECT_NODES) #define PROJECT_NODES #if defined(LONG_NAMES) #include "Utility Classes.H" #else #include "Utility.H" #endif // CBasicNode - base class for stuff we can manipulate class CBasicNode : public CObject { DECLARE_SERIAL(CBasicNode) CBasicNode* m_pcbnWorkspace;// Basic Node for the workspace protected: CString m_csName; // These should always have a name... HTREEITEM m_hti; // Handle in the owning tree view CTreeCtrl *m_pctcOwner; // The window that owns us CMDIChildWnd *m_pcmcwEdit; // The window we're being edited in. CDocument *m_pcdOwner; // Document we are part of CWordArray m_cwaMenuID; // Menu auto-fill bool m_bUniqueNameChange ; // True iff name change to make it // uniqe. (See UniqueName().) public: CBasicNode(); ~CBasicNode(); CString Name() const { return m_csName; } HTREEITEM Handle() const { return m_hti; } void NoteOwner(CDocument& cdOwner) { m_pcdOwner = &cdOwner; } CDocument* GetOwner() { return m_pcdOwner ; } void SetWorkspace(CBasicNode* pcbnWS) { m_pcbnWorkspace = pcbnWS; } CBasicNode* GetWorkspace() { return m_pcbnWorkspace ; } void Changed(BOOL bModified = TRUE, BOOL bWriteRC = FALSE) ; void UniqueName(bool bsizematters, bool bfile, LPCTSTR lpstrpath = _T("")) ; // Name ourselves and children- default to just our name, no children virtual void Fill(CTreeCtrl *pctcWhere, HTREEITEM htiParent = TVI_ROOT); // Overridable functions to allow polymorphic tree node handling virtual void ContextMenu(CWnd *pcw, CPoint cp); virtual CMDIChildWnd *CreateEditor() { return NULL; } virtual BOOL CanEdit() const { return TRUE; } virtual void Delete() { } // Default is don't honor it! virtual void Import() { } // Never at this level! // This override is called if our label is edited, or we are otherwise // renamed... virtual BOOL Rename(LPCTSTR lpstrNewName); void Edit() ; void OnEditorDestroyed() { m_pcmcwEdit = NULL ; } CMDIChildWnd* GetEditor() ; virtual void Serialize(CArchive& car); void WorkspaceChange(BOOL bModified = TRUE, BOOL bWriteRC = FALSE) { if (m_pcbnWorkspace) m_pcbnWorkspace -> Changed(bModified, bWriteRC); } }; // Sometimes, it is useful to know something about the type of data managed by // a fixed node or a strings node. The following enumeration one way to do // this. typedef enum { FNT_RESOURCES = 0, FNT_UFMS, FNT_GTTS, FNT_GPDS, FNT_STRINGS, FNT_OTHER, FNT_UNKNOWN } FIXEDNODETYPE ; // CStringsNode is a hybrid between CFixedNode and CProjectNode. It is a fixed // node that can be opened and edited. class CStringsNode : public CBasicNode { unsigned m_uidName; CSafeObArray &m_csoaDescendants; CMultiDocTemplate* m_pcmdt; // Used for importing data CRuntimeClass* m_pcrc; // The second half of the import FIXEDNODETYPE m_fntType ; // Node type int m_nFirstSelRCID ; // RC ID of first entry to select in editor DECLARE_DYNAMIC(CStringsNode) public: CStringsNode(unsigned uidName, CSafeObArray& csoa, FIXEDNODETYPE fnt = FNT_OTHER, CMultiDocTemplate *pcmdt = NULL, CRuntimeClass *pcrc = NULL); void SetMenu(CWordArray& cwaSpec) { m_cwaMenuID.Copy(cwaSpec); } virtual BOOL CanEdit() const { return TRUE; } virtual void Fill(CTreeCtrl *pctc, HTREEITEM hti); virtual CMDIChildWnd* CreateEditor(); int GetFirstSelRCID() { return m_nFirstSelRCID ; } void SetFirstSelRCID(int nrcid) { m_nFirstSelRCID = nrcid ; } }; class CFileNode : public CBasicNode { BOOL m_bEditPath, m_bCheckForValidity; CString m_csExtension, m_csPath; DECLARE_SERIAL(CFileNode) const CString ViewName() { return m_bEditPath ? m_csPath + m_csName : m_csName; } public: CFileNode(); // Attributes CString NameExt() const { return Name() + m_csExtension; } CString FullName() const { return m_csPath + Name() + m_csExtension; } const CString Path() const { return m_csPath; } const CString Extension() const { return m_csExtension; } virtual BOOL CanEdit() const; // Operations void SetExtension(LPCTSTR lpstrExt) { m_csExtension = lpstrExt; } void AllowPathEdit(BOOL bOK = TRUE) { m_bEditPath = bOK; } void EnableCreationCheck(BOOL bOn = TRUE) { m_bCheckForValidity = bOn; } void SetPath(LPCTSTR lpstrNew) { m_csPath = lpstrNew ; } void SetPathAndName(LPCTSTR lpstrpath, LPCTSTR lpstrname) ; // Overriden CBasicNode operations virtual BOOL Rename(LPCTSTR lpstrNewName); virtual void Fill(CTreeCtrl* pctc, HTREEITEM htiParent); virtual void Serialize(CArchive& car); }; // This class is used to manage the RC ID nodes in the Workspace view. // Currently, there is one of these for each UFM and GTT node. // // Note: This class must be enhanced to support extra functionality. class CRCIDNode : public CBasicNode { int m_nRCID; // RC ID FIXEDNODETYPE m_fntType ; // Node type DECLARE_SERIAL(CRCIDNode) public: CRCIDNode() ; ~CRCIDNode() {} ; virtual void Fill(CTreeCtrl *pctc, HTREEITEM hti, int nid, FIXEDNODETYPE fnt) ; int nGetRCID() { return m_nRCID ; } void nSetRCID(int nrcid) { m_nRCID = nrcid ; } FIXEDNODETYPE fntGetType() { return m_fntType ; } void fntSetType(FIXEDNODETYPE fnt) { m_fntType = fnt ; } virtual void Serialize(CArchive& car); void BuildDisplayName() ; }; // We bring it all together in a limited fashion at least, for the project // level node- it always contains a file name node. class CProjectNode : public CBasicNode { DECLARE_SERIAL(CProjectNode) bool m_bRefFlag ; // Referenced flag used in WS checking protected: CMultiDocTemplate* m_pcmdt; public: CProjectNode(); CFileNode m_cfn; CRCIDNode m_crinRCID; // Workspace view, RC ID node const CString FileName() const { return m_cfn.FullName(); } const CString FilePath() const { return m_cfn.Path(); } const CString FileTitle() const { return m_cfn.Name(); } const CString FileExt() const { return m_cfn.Extension(); } const CString FileTitleExt() const { return m_cfn.NameExt(); } const CString GetPath() const { return m_cfn.Path() ; } void SetPath(LPCTSTR lpstrNew) { m_cfn.SetPath(lpstrNew) ; } BOOL SetFileName(LPCTSTR lpstrNew) { return m_cfn.Rename(lpstrNew); } void EditorInfo(CMultiDocTemplate* pcmdt) { m_pcmdt = pcmdt; } BOOL ReTitle(LPCTSTR lpstrNewName) { return m_cfn.CBasicNode::Rename(lpstrNewName); } virtual void Fill(CTreeCtrl *pctcWhere, HTREEITEM htiParent = TVI_ROOT, unsigned urcid = -1, FIXEDNODETYPE fnt = FNT_UNKNOWN); virtual void Serialize(CArchive& car); // RC ID management routines int nGetRCID() { return m_crinRCID.nGetRCID() ; } void nSetRCID(int nrcid) { m_crinRCID.nSetRCID(nrcid) ; } void ChangeID(CRCIDNode* prcidn, int nnewid, CString csrestype) ; // Reference flag management routines bool GetRefFlag() { return m_bRefFlag ; } void SetRefFlag() { m_bRefFlag = true ; } void ClearRefFlag() { m_bRefFlag = false ; } }; // This is a special class for nodes with constant names. IE, labels for // groups of UFMs, GTTs, etc most of the time. class CFixedNode : public CBasicNode { unsigned m_uidName; CSafeObArray &m_csoaDescendants; CMultiDocTemplate* m_pcmdt; // Used for importing data CRuntimeClass* m_pcrc; // The second half of the import FIXEDNODETYPE m_fntType ; // Node type DECLARE_DYNAMIC(CFixedNode) public: CFixedNode(unsigned uidName, CSafeObArray& csoa, FIXEDNODETYPE fnt = FNT_OTHER, CMultiDocTemplate *pcmdt = NULL, CRuntimeClass *pcrc = NULL); void SetMenu(CWordArray& cwaSpec) { m_cwaMenuID.Copy(cwaSpec); } // GPD Deletion support void Zap(CProjectNode * pcpn, BOOL bdelfile) ; virtual BOOL CanEdit() const { return FALSE; } virtual void Import(); void Copy(CProjectNode *pcpnsrc, CString csorgdest) ; int GetNextRCID() ; virtual void Fill(CTreeCtrl *pctc, HTREEITEM hti); bool IsFileInWorkspace(LPCTSTR strfspec) ; bool IsRCIDUnique(int nid) ; FIXEDNODETYPE GetType() { return m_fntType ; } }; #endif