// XTPControls.h : interface for the CXTPControls class. // // This file is a part of the XTREME COMMANDBARS MFC class library. // (c)1998-2012 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// //{{AFX_CODEJOCK_PRIVATE #if !defined(__XTPCONTROLS_H__) #define __XTPCONTROLS_H__ //}}AFX_CODEJOCK_PRIVATE #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 class CXTPCommandBar; class CXTPControl; class CXTPCommandBars; class CXTPCommandBarList; class CXTPPropExchange; struct XTP_COMMANDBARS_PROPEXCHANGE_PARAM; class CXTPOriginalControls; //=========================================================================== // Summary: // CXTPControls is a CCmdTarget derived class. It represents a collection // of the controls. //=========================================================================== class _XTP_EXT_CLASS CXTPControls : public CXTPCmdTarget { DECLARE_DYNCREATE(CXTPControls) private: struct XTPBUTTONINFO; // Internal helper structure. public: //----------------------------------------------------------------------- // Summary: // Protected constructor used by dynamic creation //----------------------------------------------------------------------- CXTPControls(); //----------------------------------------------------------------------- // Summary: // Destroys a CXTPControls object, handles cleanup and deallocation //----------------------------------------------------------------------- virtual ~CXTPControls(); public: //----------------------------------------------------------------------- // Summary: // Call this member to return the control at the specified index. // Parameters: // nIndex - An integer index. // Returns: // The CXTPControl pointer currently at this index. //----------------------------------------------------------------------- CXTPControl* GetAt(int nIndex) const; //----------------------------------------------------------------------- // Summary: // This member function returns the index of the first control, starting // at position 0, whose command ID matches nIDFind. // Parameters: // nIDFind - Command ID of the control to find. // Returns: // The index of the control, or -1 if no control has the given command ID. //----------------------------------------------------------------------- int CommandToIndex(int nIDFind) const; //----------------------------------------------------------------------- // Summary: // Call this member to add a new control. // Parameters: // pControl - A pointer to the control to be added. // controlType - The type of the control to be added. // nId - Identifier of the control to be added. // lpszParameter - Parameter of the control to be added. // nBefore - Index of the control to be inserted. // bTemporary - TRUE if this control is temporary. // Returns: // A pointer to the added control. //----------------------------------------------------------------------- CXTPControl* Add(CXTPControl* pControl, int nId, LPCTSTR lpszParameter = NULL, int nBefore = -1, BOOL bTemporary = FALSE); CXTPControl* Add(XTPControlType controlType, int nId, LPCTSTR lpszParameter = NULL, int nBefore = -1, BOOL bTemporary = FALSE); // CXTPControl* Add(CXTPControl* pControl);// //----------------------------------------------------------------------- // Summary: // Call this member to insert a new control. // Parameters: // pControl - A pointer to the control to be added. // nBefore - Index of the control to be inserted. // Returns: // A pointer to the added control. // See Also: Add //----------------------------------------------------------------------- CXTPControl* InsertAt(CXTPControl* pControl, int nBefore); //----------------------------------------------------------------------- // Summary: // Call this member to add a new control. // Parameters: // pMenu - Menu that contains the control. // nIndex - Index of the control to be added. // Returns: // Pointer to the added control. //----------------------------------------------------------------------- CXTPControl* AddMenuItem(CMenu* pMenu, int nIndex); //----------------------------------------------------------------------- // Summary: // Call this member to remove a control. // Parameters: // nIndex - Index of the control to be removed. // pControl - Control to be removed. //----------------------------------------------------------------------- virtual void Remove(CXTPControl* pControl); void Remove(int nIndex); // //----------------------------------------------------------------------- // Summary: // Call this member to remove all controls. //----------------------------------------------------------------------- void RemoveAll(); //----------------------------------------------------------------------- // Summary: // Call this member to get the count of the controls // Returns: // The count of the controls. //----------------------------------------------------------------------- int GetCount() const; //----------------------------------------------------------------------- // Summary: // Call this member to find the specified control. // Parameters: // type - The type of the control to find. // nId - The control's identifier. // bVisible - TRUE if the control is visible. // bRecursive - TRUE to find in the nested command bars. // Returns: // Pointer to the CXTPControl object if successful; otherwise returns NULL. //----------------------------------------------------------------------- CXTPControl* FindControl(int nId) const; CXTPControl* FindControl(XTPControlType type, int nId, BOOL bVisible, BOOL bRecursive) const; // //----------------------------------------------------------------------- // Summary: // Call this member to convert menu items to command bar controls. // Parameters: // pMenu - Menu to be converted. // Returns: // TRUE if the method was successful; otherwise FALSE. //----------------------------------------------------------------------- BOOL LoadMenu(CMenu* pMenu); public: //----------------------------------------------------------------------- // Summary: // Call this member to retrieve the first control. // Returns: // A pointer to a CXTPControl object //----------------------------------------------------------------------- CXTPControl* GetFirst() const; //----------------------------------------------------------------------- // Summary: // Finds the next control in the given direction. // Parameters: // nIndex - Current control index. // nDirection - Direction to find. // bKeyboard - TRUE to skip controls with xtpFlagSkipFocus flag. // bSkipTemporary - TRUE to skip all controls with Temporary flag // bSkipCollapsed - TRUE to skip all controls with xtpHideExpand hide flag. // pControl - Receives a pointer to the next control. // Returns: // Index of the next control. //----------------------------------------------------------------------- void GetNext(CXTPControl*& pControl) const; long GetNext(long nIndex, int nDirection = +1, BOOL bKeyboard = TRUE, BOOL bSkipTemporary = FALSE, BOOL bSkipCollapsed = TRUE) const; // //----------------------------------------------------------------------- // Summary: // This method determines where a point lies in a specified control. // Parameters: // point - Specifies the point to be tested. // Returns: // A pointer to a CXTPControl control that occupies the specified // point or NULL if no control occupies the point. //----------------------------------------------------------------------- CXTPControl* HitTest(CPoint point) const; //----------------------------------------------------------------------- // Summary: // Call this member to change the type of the control. // Parameters: // pControl - Points to a CXTPControl object // nIndex - Index of the control // type - Type needed to be changed. // Returns: // A pointer to a CXTPControl object //----------------------------------------------------------------------- CXTPControl* SetControlType(CXTPControl* pControl, XTPControlType type); CXTPControl* SetControlType(int nIndex, XTPControlType type); // //----------------------------------------------------------------------- // Summary: // Call this member to add the copy of the control. // Parameters: // pClone - Points to a CXTPControl object needed to copy. // nBefore - Index of the control to be inserted. // bRecursive - TRUE to copy recursively. // Returns: // A pointer to an added CXTPControl object //----------------------------------------------------------------------- CXTPControl* AddClone(CXTPControl* pClone, int nBefore = -1, BOOL bRecursive = FALSE); //----------------------------------------------------------------------- // Summary: // This method is called internally to reposition controls and // determine their size. // Parameters: // pDC - Pointer to a valid device context // nLength - Length of the parent bar. // dwMode - Mode of the parent bar. // rcBorder - Borders of commandbar. // nWidth - Width of the parent bar. // Returns: // Total size of the controls. //----------------------------------------------------------------------- CSize CalcDynamicSize(CDC* pDC, int nLength, DWORD dwMode, const CRect& rcBorder, int nWidth = 0); //----------------------------------------------------------------------- // Summary: // This method is called internally to reposition controls and // determine their size for popup bar. // Parameters: // pDC - Pointer to a valid device context // nLength - Length of the parent bar. // nWidth - Width of the parent bar. // rcBorder - Borders of popup bar. // Returns: // Total size of the controls. // See Also: CalcDynamicSize //----------------------------------------------------------------------- CSize CalcPopupSize(CDC* pDC, int nLength, int nWidth, const CRect& rcBorder); //----------------------------------------------------------------------- // Summary: // Call this member to get the number of visible controls. // Parameters: // bIgnoreWrap - TRUE to ignore controls that are wrapped. // Returns: // Number of visible controls. //----------------------------------------------------------------------- int GetVisibleCount(BOOL bIgnoreWrap = FALSE) const; //----------------------------------------------------------------------- // Input: nIndex - Control's identifier // bIgnoreWraps - TRUE to ignore controls that are wrapped // Summary: Finds the specified control by Id // Returns: Pointer to the CXTPControl object if successful; otherwise returns NULL //----------------------------------------------------------------------- CXTPControl* GetVisibleAt(int nIndex, BOOL bIgnoreWraps = FALSE) const; //----------------------------------------------------------------------- // Summary: // Call this member to attach the specified command bars object. // Parameters: // pCommandBars - Command bars object need to attach. // Remarks: // You can call this member if you create plain toolbar and want to set CommandBars for it. //----------------------------------------------------------------------- void SetCommandBars(CXTPCommandBars* pCommandBars); //----------------------------------------------------------------------- // Summary: // Makes a copy of all controls. // Parameters: // bRecursive - TRUE to copy recursively. // Returns: // A pointer to a CXTPControls object. //----------------------------------------------------------------------- CXTPControls* Duplicate(BOOL bRecursive = FALSE); //----------------------------------------------------------------------- // Summary: This method is called to copy the control. // Input: pControls - Controls needed to be copied. // bRecursive - TRUE to copy recursively. //----------------------------------------------------------------------- virtual void Copy(CXTPControls* pControls, BOOL bRecursive = FALSE); //----------------------------------------------------------------------- // Summary: // Retrieves the parent command bars object. // Returns: // A pointer to a CXTPCommandBars object //----------------------------------------------------------------------- CXTPCommandBars* GetCommandBars() const; //----------------------------------------------------------------------- // Summary: // Move the control to a specified position. // Parameters: // pControl - Points to a CXTPControl object // nBefore - Index to be moved. //----------------------------------------------------------------------- void MoveBefore(CXTPControl* pControl, int nBefore); //----------------------------------------------------------------------- // Summary: // Attaches the parent command bar. // Parameters: // pParent - Points to a CXTPCommandBar object //----------------------------------------------------------------------- void SetParent(CXTPCommandBar* pParent); //----------------------------------------------------------------------- // Summary: // Creates original controls set. //----------------------------------------------------------------------- void CreateOriginalControls(); //----------------------------------------------------------------------- // Summary: // Removes the original controls set. //----------------------------------------------------------------------- void ClearOriginalControls(); //----------------------------------------------------------------------- // Summary: // Retrieves original controls set. // Returns: // A pointer to a CXTPControls object //----------------------------------------------------------------------- CXTPOriginalControls* GetOriginalControls() const; //----------------------------------------------------------------------- // Summary: // Call this method to assign original controls // Parameters: // pControls - A pointer to a CXTPControls object to assign //----------------------------------------------------------------------- void SetOriginalControls(CXTPOriginalControls* pControls); //----------------------------------------------------------------------- // Summary: // Call this member to compare the controls. // Parameters: // pControls - Points to a CXTPControls object // Returns: // TRUE if the controls are identical. //----------------------------------------------------------------------- BOOL Compare(const CXTPControls* pControls); //----------------------------------------------------------------------- // Summary: // Returns the changed status flag of the control. // Returns: // TRUE if the internal control state was changed since last drawing, // FALSE otherwise. //----------------------------------------------------------------------- BOOL IsChanged() const; //----------------------------------------------------------------------- // Summary: // Reads or writes this object from or to an archive. // Parameters: // pPX - A CXTPPropExchange object to serialize to or from. //---------------------------------------------------------------------- virtual void DoPropExchange(CXTPPropExchange* pPX); //----------------------------------------------------------------------- // Input: pControl - Control to check to see if it need to be saved // Summary: This method is called to check if the control was changed and has to be saved // Returns: TRUE if control has to be saved //----------------------------------------------------------------------- virtual BOOL ShouldSerializeControl(CXTPControl* pControl); //----------------------------------------------------------------------- // Summary: // Call this member to get the parent command bar. // Returns: // The parent command bar object. //----------------------------------------------------------------------- CXTPCommandBar* GetParent() const; //----------------------------------------------------------------------- // Summary: Determines if all controls are original and not added or modified // by the user. // Returns: Returns TRUE if all Controls in the collection were added at // the time of creation or from the last time // CreateOriginalControls was called. //----------------------------------------------------------------------- BOOL IsOriginalControls() const; //----------------------------------------------------------------------- // Summary: // Sorts the commands list. //----------------------------------------------------------------------- void Sort(); protected: //----------------------------------------------------------------------- // Summary: // This method is called when control is added to collection // Parameters: // pControl - control that added to collection virtual void OnControlAdded(CXTPControl* pControl); //----------------------------------------------------------------------- // Summary: // This method is called when control is removed from collection // Parameters: // pControl - control that removed from collection //----------------------------------------------------------------------- virtual void OnControlRemoved(CXTPControl* pControl); //----------------------------------------------------------------------- // Summary: // This method is called when control is about to be removed from collection // Parameters: // pControl - control that removed from collection // Returns: TRUE to cancel removing controls //----------------------------------------------------------------------- virtual BOOL OnControlRemoving(CXTPControl* pControl); //{{AFX_CODEJOCK_PRIVATE protected: virtual void RefreshIndexes(); static int _cdecl CompareByCaption(const CXTPControl** ppItem1, const CXTPControl** ppItem2); protected: void GenerateCommandBarList(DWORD& nID, CXTPCommandBarList* pCommandBarList, XTP_COMMANDBARS_PROPEXCHANGE_PARAM* pParam); void RestoreCommandBarList(CXTPCommandBarList* pCommandBarList); CSize _CalcSize(XTPBUTTONINFO* pData, BOOL bVert); int _WrapToolBar(XTPBUTTONINFO* pData, int nWidth, DWORD& dwMode); void _SizeFloatableBar(XTPBUTTONINFO* pData, int nLength, DWORD dwMode); void _AdjustBorders(XTPBUTTONINFO* pData, CSize& sizeResult, DWORD dwMode, CRect rcBorder); void _CenterControlsInRow(XTPBUTTONINFO* pData, int nFirst, int nLast, int, BOOL, CSize sizeResult, CRect); void _MoveRightAlligned(XTPBUTTONINFO* pData, CSize sizeResult, CRect rcBorder, DWORD dwMode); void _SizePopupToolBar(XTPBUTTONINFO* pData, DWORD dwMode); CSize _CalcSmartLayoutToolBar(CDC* pDC, XTPBUTTONINFO* pData, DWORD& dwMode); CSize _WrapSmartLayoutToolBar(CDC* pDC, XTPBUTTONINFO* pData, int nWidth, DWORD& dwMode); CSize _ReduceSmartLayoutToolBar(CDC* pDC, XTPBUTTONINFO* pData, int nWidth, DWORD& dwMode); void _MakeSameWidth(int nStart, int nLast, int nWidth); //}}AFX_CODEJOCK_PRIVATE protected: CXTPCommandBar* m_pParent; // Parent Command Bar CArray m_arrControls; // Collection of controls CXTPCommandBars* m_pCommandBars; // Parent Command Bars CXTPOriginalControls* m_pOriginalControls; // Original controls collection. BOOL m_bOriginalControls; // TRUE if all controls are original and unmodified friend class CXTPCommandBar; friend class CXTPCommandBars; friend class CXTPToolBar; friend class CXTPMenuBar; friend class CXTPRibbonBar; }; //=========================================================================== // Summary: CXTPOriginalControls object //=========================================================================== class _XTP_EXT_CLASS CXTPOriginalControls : public CXTPControls { DECLARE_DYNCREATE(CXTPOriginalControls) public: //----------------------------------------------------------------------- // Summary: // Constructs a CXTPOriginalControls object //----------------------------------------------------------------------- CXTPOriginalControls(); friend class CXTPControls; }; ////////////////////////////////////////////////////////////////////////// AFX_INLINE CXTPControl* CXTPControls::GetAt(int nIndex) const { ASSERT(nIndex < m_arrControls.GetSize()); return (nIndex >= 0 && nIndex < m_arrControls.GetSize()) ? m_arrControls.GetAt(nIndex) : NULL; } AFX_INLINE int CXTPControls::GetCount() const { return (int)m_arrControls.GetSize(); } AFX_INLINE CXTPOriginalControls* CXTPControls::GetOriginalControls() const { return m_pOriginalControls; } AFX_INLINE CXTPCommandBar* CXTPControls::GetParent() const { return m_pParent; } AFX_INLINE BOOL CXTPControls::IsOriginalControls() const { return m_bOriginalControls; } #endif // #if !defined(__XTPCONTROLS_H__)