// XTPRibbonSystemButton.h: interface for the CXTPRibbonControlSystemButton class.
//
// This file is a part of the XTREME RIBBON MFC class library.
// (c)1998-2011 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(__XTPRIBBONSYSTEMBUTTON_H__)
#define __XTPRIBBONSYSTEMBUTTON_H__
//}}AFX_CODEJOCK_PRIVATE

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include "CommandBars/XTPControlPopup.h"
#include "CommandBars/XTPPopupBar.h"


//===========================================================================
// Summary:
//     CXTPRibbonControlSystemButton is CXTPControlPopup derived class used as system
//     button of ribbon bar
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonControlSystemButton : public CXTPControlPopup
{
	DECLARE_XTP_CONTROL(CXTPRibbonControlSystemButton)
public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonControlSystemButton object
	//-----------------------------------------------------------------------
	CXTPRibbonControlSystemButton();

public:
	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw the control.
	// Parameters:
	//     pDC - Pointer to a valid device context.
	//----------------------------------------------------------------------
	void Draw(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine if the system button is a normal
	//     button or the Office 2007 style system button.
	// Returns:
	//     TRUE if this is a normal button, FALSE if this is an Office 2007
	//     style system button.
	//----------------------------------------------------------------------
	BOOL IsSimpleButton() const;

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine the size of the control.
	// Parameters:
	//     pDC - Pointer to a valid device context
	// Returns:
	//     Size of the control.
	//----------------------------------------------------------------------
	virtual CSize GetSize(CDC* pDC);

protected:
	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user double-clicks the left mouse button.
	// Parameters:
	//     point - Specifies the x- and y-coordinates of the cursor.
	// Returns:
	//     TRUE if successful; otherwise returns FALSE
	//----------------------------------------------------------------------
	virtual BOOL OnLButtonDblClk(CPoint point);

	// ----------------------------------------------------------------------
	// Summary:
	//         Updates rectangle to set position where child popup bar become
	//         visible.
	// Parameters:
	//     rc :         CRect object specifying size of area.
	//     bVertical :  TRUE if vertical. FALSE otherwise.
	// ----------------------------------------------------------------------
	void AdjustExcludeRect(CRect& rc, BOOL bVertical);

protected:
	BOOL m_bCloseOnDblClick;

	friend class CXTPRibbonBackstageView;
	friend class CXTPRibbonBar;
};


//===========================================================================
// Summary:
//     CXTPRibbonControlSystemPopupBarButton is CXTPControlButton derived class used
//     in system popupbar as bottom option buttons
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonControlSystemPopupBarButton : public CXTPControlButton
{
	DECLARE_XTP_CONTROL(CXTPRibbonControlSystemPopupBarButton)

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonControlSystemPopupBarButton object
	//-----------------------------------------------------------------------
	CXTPRibbonControlSystemPopupBarButton();

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine the size of the control.
	// Parameters:
	//     pDC - Pointer to a valid device context
	// Returns:
	//     Size of the control.
	//----------------------------------------------------------------------
	virtual CSize GetSize(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw the control.
	// Parameters:
	//     pDC - Pointer to a valid device context.
	//----------------------------------------------------------------------
	virtual void Draw(CDC* pDC);

	//-----------------------------------------------------------------------
	// Summary:
	//     Determines if control need to draw its background
	// Returns:
	//     TRUE if paint manager must skip filling background of control
	//-----------------------------------------------------------------------
	BOOL IsTransparent() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this function to get the size of the command bar button.
	// Returns:
	//     The width and height values of the command bar button.
	//-----------------------------------------------------------------------
	virtual CSize GetButtonSize() const;

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member function to get the size of a toolbar icon.
	// See Also:
	//     GetButtonSize
	//-----------------------------------------------------------------------
	virtual CSize GetIconSize() const;

private:
	BOOL IsSystemPopupButton() const;
};

//===========================================================================
// Summary:
//     CXTPRibbonSystemPopupBar is CXTPPopupBar derived class used
//     as system popupbar of RibbonBar.
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonSystemPopupBar : public CXTPPopupBar
{
	DECLARE_XTP_COMMANDBAR(CXTPRibbonSystemPopupBar)

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonSystemPopupBar object
	//-----------------------------------------------------------------------
	CXTPRibbonSystemPopupBar();

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to get borders margins of commandbar
	// Returns:
	//     Rectangle contains border margins
	//-----------------------------------------------------------------------
	virtual CRect GetBorders();

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw background of command bar
	// Parameters:
	//     pDC - POinter to device context to draw
	// See Also: DrawCommandBar
	//-----------------------------------------------------------------------
	virtual void FillCommandBarEntry(CDC* pDC);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to get the size of the command bar.
	// Parameters:
	//      nLength - The requested dimension of the control bar, either horizontal or vertical, depending on dwMode.
	//      dwMode - see CControlBar::CalcDynamicLayout for list of supported flags.
	// Returns:
	//     Size of the command bar.
	//-----------------------------------------------------------------------
	virtual CSize CalcDynamicLayout(int nLength, DWORD dwMode);

protected:
//{{AFX_CODEJOCK_PRIVATE
	DECLARE_MESSAGE_MAP()

	afx_msg LRESULT OnNcHitTest(CPoint point);
//}}AFX_CODEJOCK_PRIVATE
};

//===========================================================================
// Summary:
//     CXTPRibbonSystemPopupBarPage is CXTPPopupBar derived class used
//     as system popupbar page of RibbonBar.
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonSystemPopupBarPage : public CXTPPopupBar
{
	DECLARE_XTP_COMMANDBAR(CXTPRibbonSystemPopupBarPage)

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonSystemPopupBarPage object
	//-----------------------------------------------------------------------
	CXTPRibbonSystemPopupBarPage();

protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to get the size of the command bar.
	// Parameters:
	//      nLength - The requested dimension of the control bar, either horizontal or vertical, depending on dwMode.
	//      dwMode - see CControlBar::CalcDynamicLayout for list of supported flags.
	// Returns:
	//     Size of the command bar.
	//-----------------------------------------------------------------------
	virtual CSize CalcDynamicLayout(int nLength, DWORD dwMode);

	//-----------------------------------------------------------------------
	// Summary:
	//     Updates rectangle to set position where popup bar become visible.
	// Parameters:
	//     rc - CRect object specifying size of exclude area.
	//     bVertical :  TRUE if vertical. FALSE otherwise.
	//-----------------------------------------------------------------------
	virtual void AdjustExcludeRect(CRect& rc, BOOL bVertical);
};

//===========================================================================
// Summary:
//     CXTPRibbonControlSystemPopupBarListCaption is CXTPControl derived class.
//     It used in Ribbon system popup to draw caption of enumerable controls
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonControlSystemPopupBarListCaption : public CXTPControl
{
	DECLARE_XTP_CONTROL(CXTPRibbonControlSystemPopupBarListCaption)
public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonControlSystemPopupBarListCaption object
	//-----------------------------------------------------------------------
	CXTPRibbonControlSystemPopupBarListCaption();

protected:
	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine the size of the control.
	// Parameters:
	//     pDC - Pointer to a valid device context
	// Returns:
	//     Size of the control.
	//----------------------------------------------------------------------
	virtual CSize GetSize(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw the control.
	// Parameters:
	//     pDC - Pointer to a valid device context.
	//----------------------------------------------------------------------
	virtual void Draw(CDC* pDC);
};

//===========================================================================
// Summary:
//     CXTPRibbonControlSystemPopupBarListItem is CXTPControlButton derived class.
//     It used in Ribbon system popup to draw button of enumerable controls
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonControlSystemPopupBarListItem : public CXTPControlButton
{
	DECLARE_XTP_CONTROL(CXTPRibbonControlSystemPopupBarListItem)

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonControlSystemPopupBarListItem object
	//-----------------------------------------------------------------------
	CXTPRibbonControlSystemPopupBarListItem();

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to determine the size of the control.
	// Parameters:
	//     pDC - Pointer to a valid device context
	// Returns:
	//     Size of the control.
	//----------------------------------------------------------------------
	virtual CSize GetSize(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw the control.
	// Parameters:
	//     pDC - Pointer to a valid device context.
	//----------------------------------------------------------------------
	virtual void Draw(CDC* pDC);

protected:
	BOOL m_bAlignShortcut;  // Alignment of the shortcut in the list.
};

//===========================================================================
// Summary:
//     CXTPRibbonControlSystemPopupBarPinableListItem is CXTPRibbonControlSystemPopupBarListItem derived class.
//     It used in Ribbon system popup to draw recent file list items.
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonControlSystemPopupBarPinableListItem : public CXTPRibbonControlSystemPopupBarListItem
{
	DECLARE_XTP_CONTROL(CXTPRibbonControlSystemPopupBarPinableListItem)

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonControlSystemPopupBarListItem object
	//-----------------------------------------------------------------------
	CXTPRibbonControlSystemPopupBarPinableListItem();

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPRibbonControlSystemPopupBarPinableListItem object, handles cleanup and deallocation
	//-----------------------------------------------------------------------
	~CXTPRibbonControlSystemPopupBarPinableListItem();


protected:
	//----------------------------------------------------------------------
	// Summary:
	//     This method is called to draw the control.
	// Parameters:
	//     pDC - Pointer to a valid device context.
	//----------------------------------------------------------------------
	virtual void Draw(CDC* pDC);

	//----------------------------------------------------------------------
	// Summary:
	//     This member is called when the mouse cursor moves.
	// Parameters:
	//     point - Specifies the x- and y-coordinate of the cursor.
	//----------------------------------------------------------------------
	virtual void OnMouseMove(CPoint point);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member is called when the user releases the left mouse button.
	// Parameters:
	//     point - Specifies the x- and y-coordinate of the cursor.
	//-----------------------------------------------------------------------
	virtual void OnLButtonUp(CPoint point);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when the MRU item becomes selected.
	// Parameters:
	//     bSelected - TRUE if the MRU item becomes selected.
	// Returns:
	//     TRUE if successful; otherwise returns FALSE
	//-----------------------------------------------------------------------
	virtual BOOL OnSetSelected(int bSelected);

protected:
	CXTPImageManager* m_pIcons;  // Icons used for the MRU item.

};

//===========================================================================
// Summary:
//     CXTPRibbonControlSystemRecentFileList is a CXTPRibbonControlSystemPopupBarListCaption derived class.
//     It used in Ribbon system popup to draw recent file list controls
//===========================================================================
class _XTP_EXT_CLASS CXTPRibbonControlSystemRecentFileList : public CXTPRibbonControlSystemPopupBarListCaption
{
	class CControlFileItem;
	class CControlPinableFileItem;
public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPRibbonControlSystemRecentFileList object
	//-----------------------------------------------------------------------
	CXTPRibbonControlSystemRecentFileList();

protected:

	//----------------------------------------------------------------------
	// Summary:
	//     This method is called before recalculating the parent command
	//     bar size to calculate the dimensions of the control.
	// Parameters:
	//     dwMode - Flags used to determine the height and width of the
	//              dynamic command bar.
	//-----------------------------------------------------------------------
	virtual void OnCalcDynamicSize(DWORD dwMode);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to check if the user can drop the control.
	// Parameters:
	//     pCommandBar - Points to a CXTPCommandBar object
	//     point - Mouse position.
	//     dropEffect - DROPEFFECT enumerator.
	// Returns:
	//     TRUE if successful, otherwise returns FALSE
	//-----------------------------------------------------------------------
	virtual BOOL IsCustomizeDragOverAvail(CXTPCommandBar* pCommandBar, CPoint point, DROPEFFECT& dropEffect);

protected:
	//-----------------------------------------------------------------------
	// Summary:
	//     Returns pointer to recent file list collection
	// Returns:
	//     Pointer to recent file list collection
	//-----------------------------------------------------------------------
	virtual CRecentFileList* GetRecentFileList();

	//-----------------------------------------------------------------------
	// Summary:
	//     Returns ID_FILE_MRU_FILE1.
	//-----------------------------------------------------------------------
	virtual int GetFirstMruID();

private:
	CString ConstructCaption(const CString& lpszTitle, int nIndex);

private:
	DECLARE_XTP_CONTROL(CXTPRibbonControlSystemRecentFileList)
};


//===========================================================================
// Summary:
//     CXTPPinableRecentFileList is CRecentFileList derived class.  This is used as a
//     pinnable MRU for the ribbon.
//===========================================================================
class _XTP_EXT_CLASS CXTPPinableRecentFileList : public CCmdTarget, public CRecentFileList
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPPinableRecentFileList object
	// Parameters:
	//     nStart - Index of item to start pinned
	//     lpszSection - Section
	//     lpszEntryFormat - Format
	//     nSize - Initial list size
	//     nMaxDispLen - Maximum list size
	//-----------------------------------------------------------------------
	CXTPPinableRecentFileList(UINT nStart, LPCTSTR lpszSection, LPCTSTR lpszEntryFormat, int nSize, int nMaxDispLen = AFX_ABBREV_FILENAME_LEN);

	//-----------------------------------------------------------------------
	// Summary:
	//     Destroys a CXTPPinableRecentFileList object, handles cleanup and deallocation
	//-----------------------------------------------------------------------
	~CXTPPinableRecentFileList();

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Removes an item from the MRU.
	// Parameters:
	//     nIndex - Index of the item to remove from the MRU.
	//-----------------------------------------------------------------------
	virtual void Remove(int nIndex);

	//-----------------------------------------------------------------------
	// Summary:
	//     Adds an item to the MRU.
	// Parameters:
	//     lpszPathName - Path of the filename, including file name, to include
	//     in the MRU.  Only the filename will be drawn in the MRU.  The entire
	//     path will be displayed in a tooltip on mouseover.
	//-----------------------------------------------------------------------
	virtual void Add(LPCTSTR lpszPathName);

	//-----------------------------------------------------------------------
	// Summary:
	//     Reads from registry or ini file.
	//-----------------------------------------------------------------------
	virtual void ReadList();

	//-----------------------------------------------------------------------
	// Summary:
	//     Writes to registry or ini file.
	//-----------------------------------------------------------------------
	virtual void WriteList();




public:
	BOOL* m_pbPinState;     // Current pin state of the selected item in the MRU.
	BOOL m_bPinable;        // True if the MRU is a pinnable MRU (for ribbon).

};


#endif // !defined(__XTPRIBBONSYSTEMBUTTON_H__)
