/*--------------------------------------------------------------------------*
 *
 *  Microsoft Windows
 *  Copyright (C) Microsoft Corporation, 1992 - 1999
 *
 *  File:      vwtrack.h
 *
 *  Contents:  Interface file for CViewTracker
 *
 *  History:   01-May-98 JeffRo     Created
 *
 *--------------------------------------------------------------------------*/

#ifndef VWTRACK_H
#define VWTRACK_H
#pragma once

#include "amcview.h"

class CFocusSubclasser;
class CFrameSubclasser;
class CViewSubclasser;
struct TRACKER_INFO;

typedef void (CALLBACK *TRACKER_CALLBACK)(TRACKER_INFO* pTrackerInfo, bool bAccept, bool bSyncLayout);

/*
 * This structure is copied in the CViewTracker using its (default) copy
 * constructor.  If you add any members for which member-wise copy is not
 * appropriate, you *must* define a copy constructor for this structure.
 */
typedef struct TRACKER_INFO
{
    CView*    pView;            // View to manage
    CRect     rectArea;         // Total area available
    CRect     rectTracker;      // Current tracker position
    CRect     rectBounds;       // Tracker movement bounds
    BOOL      bAllowLeftHide;   // Can left pane be hidden
    BOOL      bAllowRightHide;  // Can right pane be hidden
    LONG_PTR  lUserData;        // User data
    TRACKER_CALLBACK pCallback; // Tracking completion callback
} TRACKER_INFO;


class CHalftoneClientDC : public CClientDC
{
public:
    CHalftoneClientDC (CWnd* pwnd)
        :   CClientDC (pwnd), m_hBrush(NULL)
        { 
            CBrush *pBrush = SelectObject (GetHalftoneBrush ()); 
            if (pBrush != NULL)
                m_hBrush = *pBrush;
        }

    ~CHalftoneClientDC ()
        { 
            if (m_hBrush != NULL)
                SelectObject ( CBrush::FromHandle(m_hBrush) ); 
        }

private:
    HBRUSH  m_hBrush;
};

class CViewTracker : public CObject
{
    DECLARE_DYNAMIC (CViewTracker)

    // private ctor, use StartTracking to create one
    CViewTracker (TRACKER_INFO& TrackerInfo);

    // private dtor
    ~CViewTracker() {};

public:
    static bool StartTracking (TRACKER_INFO* pTrackerInfo);
    void StopTracking (BOOL fAcceptNewPosition);
    void Track(CPoint pt);

private:
    void DrawTracker (CRect& rect) const;
    CWnd* PrepTrackedWindow (CWnd* pwnd);
    void UnprepTrackedWindow (CWnd* pwnd);

private:
	/*
	 * m_fFullWindowDrag must be first, so it will be initialized first;
	 * other member initializers will use m_fFullWindowDrag's setting
	 */
	const bool					m_fFullWindowDrag;

	bool						m_fRestoreClipChildrenStyle;
    TRACKER_INFO                m_Info;
    CHalftoneClientDC mutable   m_dc;
    CFocusSubclasser *          m_pFocusSubclasser;
    CViewSubclasser  *          m_pViewSubclasser;
    CFrameSubclasser *          m_pFrameSubclasser;
	const LONG					m_lOriginalTrackerLeft;

};  /* class CViewTracker */


#endif /* VWTRACK_H */