187 lines
3.9 KiB
C++
187 lines
3.9 KiB
C++
// 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;
|
|
}
|
|
|
|
|