// XTPControlCustom.h : interface for the CXTPControlCustom 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(__XTPCONTROLCUSTOM_H__)
#define __XTPCONTROLCUSTOM_H__
//}}AFX_CODEJOCK_PRIVATE

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


class CXTPCommandBars;

//-----------------------------------------------------------------------
// Summary:
//     Vertical options enumerator.
// Example:
// <code>
// CXTPControlCustom* pControl = (CXTPControlCustom*)pToolBar->GetControls()->Add(xtpControlCustom, ID_VIEW_LOGO);
// pControl->SetVerticalPositionOption(xtpVerticalShow);
// </code>
// See Also: CXTPControlCustom::SetVerticalPositionOption
//
// <KEYWORDS xtpVerticalHide, xtpVerticalShow, xtpVerticalButton>
//-----------------------------------------------------------------------
enum XTPControlCustomVerticalOptions
{
	xtpVerticalHide,  // To hide control if parent toolbar vertically docked.
	xtpVerticalShow,  // To show control if parent toolbar vertically docked.
	xtpVerticalButton // To show control as button.
};


//===========================================================================
// Summary:
//     CXTPControlCustom is a CXTPControlButton derived class. It represents
//     the control with some child window.
//===========================================================================
class _XTP_EXT_CLASS CXTPControlCustom : public CXTPControlButton, public CXTPHookManagerHookAble
{
public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Constructs a CXTPControlCustom object
	//-----------------------------------------------------------------------
	CXTPControlCustom();

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

public:
	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to create new CXTPControlCustom object with pWndChild as child window,
	// Parameters:
	//     pWndChild - Pointer to the child window.
	// Returns:
	//     Pointer to new CXTPControlCustom object.
	//-----------------------------------------------------------------------
	static CXTPControlCustom* AFX_CDECL CreateControlCustom(CWnd* pWndChild);

public:

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to attach the window to the control.
	// Parameters:
	//     pWnd - Points to a child CWnd object.
	//-----------------------------------------------------------------------
	void SetControl(CWnd* pWnd);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to retrieve the child window of the control.
	// Returns:
	//     A pointer to a CWnd object.
	//-----------------------------------------------------------------------
	CWnd* GetControl();

	//-----------------------------------------------------------------------
	// Summary:
	//     This method sets the child window size.
	// Parameters:
	//     szControl - Size of the child window.
	//-----------------------------------------------------------------------
	void SetSize(CSize szControl);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method sets the margins of the child window.
	// Parameters:
	//     cxRight - Right border gap.
	//     cxTop - Top border gap.
	//     cxLeft - Left border gap.
	//     cxBottom - Bottom border gap.
	//-----------------------------------------------------------------------
	void SetBorders(int cxRight, int cxTop, int cxLeft, int cxBottom);

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method to set vertical options to the control.
	// Parameters:
	//     options - XTPControlCustomVerticalOptions type to be set
	//               Can be any of the values listed in the Remarks section.
	// Remarks:
	//     Vertical options refer to how the control will be displayed
	//     when the toolbar it docked vertically. It can be one of the following:
	//     * <b>xtpVerticalHide</b> To hide control
	//     * <b>xtpVerticalShow</b> To show control
	//     * <b>xtpVerticalButton</b> To show control as button.
	// See Also: XTPControlCustomVerticalOptions
	//-----------------------------------------------------------------------
	void SetVerticalPositionOption(XTPControlCustomVerticalOptions options);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when control enable state was changed
	//-----------------------------------------------------------------------
	virtual void OnEnabledChanged();


protected:

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this member to set the bounding rectangle of the control.
	// Parameters:
	//     rcControl - Bounding rectangle of the control.
	//-----------------------------------------------------------------------
	virtual void SetRect(CRect rcControl);

	//-----------------------------------------------------------------------
	// 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:
	//     This method is called to hide the control.
	// Parameters:
	//     dwFlags - Reasons to hide.
	// See Also: XTPControlHideFlags
	//-----------------------------------------------------------------------
	virtual void SetHideFlags(DWORD dwFlags);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when action property was changed
	// Parameters:
	//     nProperty - Property of the action
	// See Also: OnActionChanging
	//-----------------------------------------------------------------------
	virtual void OnActionChanged(int nProperty);

	//-----------------------------------------------------------------------
	// 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. See Remarks section for a list of
	//              values.
	// Remarks:
	//     The following predefined flags are used to determine the height and
	//     width of the dynamic command bar. Use the bitwise-OR (|) operator to
	//     combine the flags.<p/>
	//
	//     * <b>LM_STRETCH</b> Indicates whether the command bar should be
	//                stretched to the size of the frame. Set if the bar is
	//                not a docking bar (not available for docking). Not set
	//                when the bar is docked or floating (available for
	//                docking). If set, LM_STRETCH returns dimensions based
	//                on the LM_HORZ state. LM_STRETCH works similarly to
	//                the the bStretch parameter used in CalcFixedLayout;
	//                see that member function for more information about
	//                the relationship between stretching and orientation.
	//     * <b>LM_HORZ</b> Indicates that the bar is horizontally or
	//                vertically oriented. Set if the bar is horizontally
	//                oriented, and if it is vertically oriented, it is not
	//                set. LM_HORZ works similarly to the the bHorz
	//                parameter used in CalcFixedLayout; see that member
	//                function for more information about the relationship
	//                between stretching and orientation.
	//     * <b>LM_MRUWIDTH</b> Most Recently Used Dynamic Width. Uses the
	//                remembered most recently used width.
	//     * <b>LM_HORZDOCK</b> Horizontal Docked Dimensions. Returns the
	//                dynamic size with the largest width.
	//     * <b>LM_VERTDOCK</b> Vertical Docked Dimensions. Returns the dynamic
	//                size with the largest height.
	//     * <b>LM_COMMIT</b> Resets LM_MRUWIDTH to current width of
	//                floating command bar.
	//
	//     The framework calls this member function to calculate the dimensions
	//     of a dynamic command bar.<p/>
	//
	//     Override this member function to provide your own layout in classes
	//     you derive from CXTPControl. XTP classes derived from CXTPControl,
	//     such as CXTPControlComboBox, override this member function to provide
	//     their own implementation.
	// See Also:
	//     CXTPControlComboBox, CXTPControl, CXTPControlEdit,
	//     CXTPControlWindowList, CXTPControlWorkspaceActions, CXTPControlToolbars,
	//     CXTPControlOleItems, CXTPControlRecentFileList, CXTPControlSelector,
	//     CXTPControlListBox
	//-----------------------------------------------------------------------
	virtual void OnCalcDynamicSize(DWORD dwMode);

	//-----------------------------------------------------------------------
	// 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);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called to copy the control.
	// Parameters:
	//     pControl - Points to a source CXTPControl object
	//     bRecursive - TRUE to copy recursively.
	//-----------------------------------------------------------------------
	virtual void Copy(CXTPControl* pControl, BOOL bRecursive = FALSE);

	//-----------------------------------------------------------------------
	// Summary:
	//     This method is called when the user clicks the control.
	// Parameters:
	//     bKeyboard - TRUE if the control is selected using the keyboard.
	//     pt - Mouse cursor position.
	//-----------------------------------------------------------------------
	virtual void OnClick(BOOL bKeyboard = FALSE, CPoint pt = CPoint(0, 0));

	//-----------------------------------------------------------------------
	// Summary:
	//     Call this method 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);

	//-----------------------------------------------------------------------
	// Summary:
	//     This member function is called by WindowProc, or is called
	//     during message reflection.
	// Parameters:
	//     hWnd     - Window handle that the message belongs to.
	//     nMessage - Specifies the message to be sent.
	//     wParam   - Specifies additional message-dependent information.
	//     lParam   - Specifies additional message-dependent information.
	//     lResult  - The return value of WindowProc. Depends on the message;
	//                may be NULL.
	//-----------------------------------------------------------------------
	int OnHookMessage(HWND hWnd, UINT nMessage, WPARAM& wParam, LPARAM& lParam, LRESULT& lResult);

	//-------------------------------------------------------------------------
	// Summary:
	//     This method is called when control was removed from parent controls collection
	//-------------------------------------------------------------------------
	virtual void OnRemoved();


private:
	CWnd* FindChildWindow(CXTPCommandBars* pCommandBars, UINT nID);
	void ShowHideChildControl();

protected:
	HWND m_hwndControl;                                 // The child window.
	CRect m_rcBorders;                                  // Borders.
	BOOL  m_bControlVisible;                            // TRUE if child window is visible.
	CSize m_szControl;                                  // Size of the control.
	XTPControlCustomVerticalOptions m_verticalOptions;  // Vertical options.
	int   m_nControlID;                                 // Id of the custom control

public:

	DECLARE_XTP_CONTROL(CXTPControlCustom)
};



#endif // #if !defined(__XTPCONTROLCUSTOM_H__)