Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// docking.cpp : implementation of the CDocking class
//
#include "stdafx.h"
#include "pbrush.h"
#include "pbrusfrm.h"
#include "pbrusvw.h"
#include "minifwnd.h"
#include "imgwell.h"
#include "toolbox.h"
#include "imgcolor.h"
#include "docking.h"
#ifdef _DEBUG
#undef THIS_FILE
static CHAR BASED_CODE THIS_FILE[] = __FILE__; #endif
IMPLEMENT_DYNAMIC( CDocking, CObject )
#include "memtrace.h"
/***************************************************************************/ // CDocking implementation
CDocking::CDocking() { m_bStarted = FALSE; m_bDocking = FALSE; m_iDockingX = ::GetSystemMetrics( SM_CXICON ); m_iDockingY = ::GetSystemMetrics( SM_CYICON ); m_iDockingX += m_iDockingX / 2; m_iDockingY += m_iDockingY / 2; }
/***************************************************************************/
BOOL CDocking::Create( CPoint ptDrop, CRect& rectCurrent, BOOL bDocked, CPBView::DOCKERS tool ) { ASSERT( ! m_bStarted );
m_Tool = tool; m_bDocked = bDocked; m_ptLast = ptDrop; m_bDocking = ! bDocked;
CRect rectTool; CRect rect = rectCurrent; CSize size = rectCurrent.Size();
if (bDocked) { switch (tool) { case CPBView::toolbox: case CPBView::colorbox: rect.InflateRect( theApp.m_cxBorder, theApp.m_cyBorder ); break;
}
rect.bottom += theApp.m_cyCaption; m_rectDocked = rectCurrent; m_rectFree = rect; } else { switch (tool) { case CPBView::toolbox: g_pImgToolWnd->GetWindowRect( &rectTool );
rect.right = rect.left + rectTool.Width(); rect.bottom = rect.top + rectTool.Height(); break;
case CPBView::colorbox: g_pImgColorsWnd->GetWindowRect( &rectTool );
rect.right = rect.left + rectTool.Width(); rect.bottom = rect.top + rectTool.Height(); break;
} m_rectDocked = rect; m_rectFree = rectCurrent; }
CPBView* pView = (CPBView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
ASSERT( pView != NULL );
if (pView != NULL && pView->IsKindOf( RUNTIME_CLASS( CPBView ) )) { m_ptDocking = pView->GetDockedPos( tool, size ); m_bStarted = DrawFocusRect();
m_rectDockingPort.SetRect( m_ptDocking.x - m_iDockingX, m_ptDocking.y - m_iDockingY, m_ptDocking.x + m_iDockingX, m_ptDocking.y + m_iDockingY ); } return m_bStarted; }
/***************************************************************************/
BOOL CDocking::Move( CPoint ptNew, CRect& rectFrame ) { Move( ptNew );
rectFrame = m_bDocked? m_rectDocked: m_rectFree;
return m_bDocked; }
/***************************************************************************/
void CDocking::Move( CPoint ptNew ) { ASSERT( m_bStarted );
if (DrawFocusRect()) { CPoint pt = ptNew - m_ptLast;
m_rectDocked.OffsetRect( pt ); m_rectFree.OffsetRect( pt );
pt = m_bDocked? m_rectDocked.TopLeft(): m_rectFree.TopLeft();
m_bDocked = m_rectDockingPort.PtInRect( pt );
m_ptLast = ptNew;
DrawFocusRect(); } }
/***************************************************************************/
BOOL CDocking::Clear( CRect* prectLast ) { ASSERT( m_bStarted );
DrawFocusRect(); m_bStarted = FALSE;
if (prectLast) *prectLast = m_bDocked? m_rectDocked: m_rectFree;
if (!m_bDocked) { CPBView* pView = (CPBView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
if (pView != NULL && pView->IsKindOf( RUNTIME_CLASS( CPBView ) )) pView->SetFloatPos( m_Tool, m_rectFree ); }
return m_bDocked; }
/***************************************************************************/
BOOL CDocking::DrawFocusRect() { if (m_bDocking) return TRUE;
BOOL bReturn = FALSE;
HDC hdc = ::GetDC( NULL );
if (hdc) { ::DrawFocusRect( hdc, (m_bDocked? &m_rectDocked: &m_rectFree) ); ::ReleaseDC( NULL, hdc );
bReturn = TRUE; }
return bReturn; }
/***************************************************************************/
|