📄 rowdragpl.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Name: rowdragpl.cpp
// Purpose: cbRowDragPlugin implementation.
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 06/10/98
// RCS-ID: $Id: rowdragpl.cpp,v 1.9 2006/04/26 16:27:18 PC Exp $
// Copyright: (c) Aleksandras Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/fl/rowdragpl.h"
#define MINIMAL_ROW_DRAG_OFS 5
// parameters for row-hints of NC-look
#define TRIANGLE_OFFSET 2
#define TRIANGLE_TO_PAT_GAP 2
#define PAT_OFFSET 2
#define COLLAPSED_ICON_WIDTH 45
#define COLLAPSED_ICON_HEIGHT 9
#define ROW_DRAG_HINT_WIDTH 10
#define ICON_TRIAN_WIDTH 6
#define ICON_TRIAN_HEIGHT 3
/***** Implementation for class cbHiddenBarInfo *****/
IMPLEMENT_DYNAMIC_CLASS( cbHiddenBarInfo, wxObject )
/***** Implementation for class cbRowDragPlugin *****/
IMPLEMENT_DYNAMIC_CLASS( cbRowDragPlugin, cbPluginBase )
BEGIN_EVENT_TABLE( cbRowDragPlugin, cbPluginBase )
EVT_PL_LEFT_DOWN ( cbRowDragPlugin::OnLButtonDown )
EVT_PL_LEFT_UP ( cbRowDragPlugin::OnLButtonUp )
EVT_PL_MOTION ( cbRowDragPlugin::OnMouseMove )
EVT_PL_DRAW_PANE_DECOR ( cbRowDragPlugin::OnDrawPaneBackground )
END_EVENT_TABLE()
// FIXME:: how to eliminated these cut and pasted constructors?
cbRowDragPlugin::cbRowDragPlugin(void)
: mHightColor ( 192, 192, 255 ),
mLowColor ( 192, 192, 192 ),
mTrianInnerColor ( 0,0,255 ),
mTrianInnerPen ( mTrianInnerColor, 1, wxSOLID ),
mDragStarted ( false ),
mDecisionMode ( false ),
mCurDragOfs ( 0 ),
mCaptureIsOn ( false ),
mSvTopMargin ( -1 ),
mSvBottomMargin ( -1 ),
mSvLeftMargin ( -1 ),
mSvRightMargin ( -1 ),
mpPaneImage ( NULL ),
mpRowImage ( NULL ),
mpCombinedImage ( NULL ),
mpRowInFocus ( NULL ),
mCollapsedIconInFocus( -1 ),
mpPane ( NULL )
{
}
cbRowDragPlugin::cbRowDragPlugin( wxFrameLayout* pLayout, int paneMask )
: cbPluginBase( pLayout, paneMask ),
mHightColor ( 192, 192, 255 ),
mLowColor ( 192, 192, 192 ),
mTrianInnerColor ( 0,0,255 ),
mTrianInnerPen ( mTrianInnerColor, 1, wxSOLID ),
mDragStarted ( false ),
mDecisionMode ( false ),
mCurDragOfs ( 0 ),
mCaptureIsOn ( false ),
mSvTopMargin ( -1 ),
mSvBottomMargin ( -1 ),
mSvLeftMargin ( -1 ),
mSvRightMargin ( -1 ),
mpPaneImage ( NULL ),
mpRowImage ( NULL ),
mpCombinedImage ( NULL ),
mpRowInFocus ( NULL ),
mCollapsedIconInFocus( -1 ),
mpPane ( NULL )
{
}
cbRowDragPlugin::~cbRowDragPlugin()
{
}
// handlers for plugin events
void cbRowDragPlugin::OnMouseMove( cbMotionEvent& event )
{
// short-cuts
wxPoint pos = event.mPos;
mpPane = event.mpPane;
mpPane->PaneToFrame( &pos.x, &pos.y );
if ( !mDragStarted )
{
if ( mDecisionMode && mpRowInFocus )
{
int ofs;
if ( mpPane->IsHorizontal() )
ofs = pos.y - mDragOrigin.y;
else
ofs = pos.x - mDragOrigin.x;
// check if the item was dragged sufficeintly
// far, enough to consider that user really intends
// to drag it
if ( ofs >= MINIMAL_ROW_DRAG_OFS ||
ofs <= -MINIMAL_ROW_DRAG_OFS )
{
// DBG::
//.wxPoint pos = event.mPos;
//wxPoint drg = mDragOrigin;
//int dif = event.mPos.x - mDragOrigin.x;
mDragStarted = true;
mDecisionMode = false;
mDragOrigin = pos;
PrepareForRowDrag();
return;
}
// this plugin "eats" all mouse input while item is dragged,
return;
}
cbRowInfo* pRow = GetFirstRow();
bool focusFound = false;
while( pRow )
{
if ( HitTestRowDragHint( pRow, pos ) )
{
CheckPrevItemInFocus( pRow, -1 );
SetMouseCapture( true );
focusFound = true;
mpRowInFocus = pRow;
mCollapsedIconInFocus = -1;
break;
}
pRow = pRow->mpNext;
}
if ( !focusFound )
{
int hrCnt = GetHRowsCountForPane( event.mpPane );
for( int i = 0; i != hrCnt; ++i )
{
if ( HitTestCollapsedRowIcon( i, pos ) )
{
CheckPrevItemInFocus( NULL, i );
SetMouseCapture( true );
focusFound = true;
mCollapsedIconInFocus = i;
mpRowInFocus = NULL;
break;
}
}
}
if ( !focusFound && ItemIsInFocus() )
{
// kill focus from item previously been in focus
UnhighlightItemInFocus();
mpRowInFocus = NULL;
mCollapsedIconInFocus = -1;
SetMouseCapture( false );
}
if ( !ItemIsInFocus() )
// delegate it to other plugins
event.Skip();
}
else
{
// otherwise mouse pointer moves, when dragging is started
if ( mpPane->IsHorizontal() )
{
// row is dragged up or down;
ShowDraggedRow( pos.y - mDragOrigin.y );
}
else
{
// row is dragged left or right
ShowDraggedRow( pos.x - mDragOrigin.x );
}
// this plugin "eats" all mouse input while item is dragged,
}
}
void cbRowDragPlugin::OnLButtonDown( cbLeftDownEvent& event )
{
mpPane = event.mpPane;
// DBG::
wxASSERT( !mDragStarted && !mDecisionMode );
if ( ItemIsInFocus() )
{
mDecisionMode = true;
wxPoint pos = event.mPos;
mpPane->PaneToFrame( &pos.x, &pos.y );
mDragOrigin = pos;
SetMouseCapture( true );
}
else
// propagate event to other plugins
event.Skip();
}
void cbRowDragPlugin::OnLButtonUp ( cbLeftUpEvent& event )
{
if ( !mDragStarted && !mDecisionMode )
{
event.Skip();
return;
}
mpPane = event.mpPane;
if ( mDecisionMode )
{
cbDockPane* pPane = mpPane;
SetMouseCapture( false );
mDecisionMode = false;
mDragStarted = false;
wxPoint frmPos = event.mPos;
pPane->PaneToFrame( &frmPos.x, &frmPos.y );
if ( mpRowInFocus )
{
CollapseRow( mpRowInFocus );
mpRowInFocus = 0;
}
else
{
ExpandRow( mCollapsedIconInFocus );
mCollapsedIconInFocus = -1;
}
mpRowInFocus = NULL;
mpPane = pPane;
pPane->FrameToPane( &frmPos.x, &frmPos.y );
// give it another try after relayouting bars
cbMotionEvent moveEvt( frmPos, pPane );
this->OnMouseMove( moveEvt );
// this plugin has "eaten" the mouse-up event
return;
}
else
{
// otherwise, the dragged row was dropped, determine
// where to insert it
// restore initial pane appearence
ShowPaneImage();
FinishOnScreenDraw();
cbRowInfo* pRow = GetFirstRow();
mpLayout->GetUpdatesManager().OnStartChanges();
pRow->mUMgrData.SetDirty(true);
cbBarInfo* pBar = mpRowInFocus->mBars[0];
while ( pBar )
{
pBar->mUMgrData.SetDirty(true);
if ( pBar->mpBarWnd )
{
// do complete refresh
pBar->mpBarWnd->Show(false);
pBar->mpBarWnd->Show(true);
}
pBar = pBar->mpNext;
}
while( pRow )
{
if ( mCurDragOfs < pRow->mRowY )
{
InsertDraggedRowBefore( pRow );
break;
}
pRow = pRow->mpNext;
}
if ( pRow == NULL ) InsertDraggedRowBefore( NULL );
mpRowInFocus = NULL;
mpLayout->RecalcLayout(false);
// finish change "transaction"
mpLayout->GetUpdatesManager().OnFinishChanges();
mpLayout->GetUpdatesManager().UpdateNow();
// finish drag action
SetMouseCapture( false );
mDragStarted = false;
}
}
void cbRowDragPlugin::OnDrawPaneBackground ( cbDrawPaneDecorEvent& event )
{
mpPane = event.mpPane;
// FIXME:: this may harm operation of other plugins
if ( GetNextHandler() && mpPane->GetRowList().GetCount() )
{
// first, let other plugins add their decorations now
GetNextHandler()->ProcessEvent( event );
event.Skip(false);
}
wxClientDC dc( &mpLayout->GetParentFrame() );
dc.SetClippingRegion( mpPane->mBoundsInParent.x,
mpPane->mBoundsInParent.y,
mpPane->mBoundsInParent.width,
mpPane->mBoundsInParent.height );
int cnt = GetHRowsCountForPane( event.mpPane );
if ( cnt > 0 )
DrawCollapsedRowsBorder( dc );
if ( mpPane->GetRowList().GetCount() )
DrawRowsDragHintsBorder( dc );
cbRowInfo* pRow = GetFirstRow();
while( pRow )
{
DrawRowDragHint( pRow, dc, false );
pRow = pRow->mpNext;
}
for( int i = 0; i != cnt; ++i )
DrawCollapsedRowIcon(i, dc, false );
}
int cbRowDragPlugin::GetHRowsCountForPane( cbDockPane* pPane )
{
wxNode* pNode = mHiddenBars.GetFirst();
int maxIconNo = -1;
while( pNode )
{
cbHiddenBarInfo* pHBInfo = (cbHiddenBarInfo*)pNode->GetData();
if ( pHBInfo->mAlignment == pPane->mAlignment )
maxIconNo = wxMax( maxIconNo, pHBInfo->mIconNo );
pNode = pNode->GetNext();
}
return ( maxIconNo + 1 );
}
int cbRowDragPlugin::GetCollapsedRowIconHeight()
{
return COLLAPSED_ICON_HEIGHT;
}
int cbRowDragPlugin::GetRowDragHintWidth()
{
return ROW_DRAG_HINT_WIDTH;
}
void cbRowDragPlugin::SetPaneMargins()
{
int hiddenRowsCnt = GetHRowsCountForPane( mpPane );
if ( mSvTopMargin == -1 )
{
mSvTopMargin = mpPane->mTopMargin;
mSvBottomMargin = mpPane->mBottomMargin;
mSvLeftMargin = mpPane->mLeftMargin;
mSvRightMargin = mpPane->mRightMargin;
}
if ( mpPane->IsHorizontal() )
{
mpPane->mTopMargin = mSvTopMargin;
mpPane->mBottomMargin = ( hiddenRowsCnt == 0 )
? mSvBottomMargin
: mSvBottomMargin + GetCollapsedRowIconHeight();
mpPane->mLeftMargin = mSvLeftMargin + GetRowDragHintWidth();
mpPane->mRightMargin = mSvRightMargin;
}
else
{
mpPane->mTopMargin = mSvTopMargin;
mpPane->mBottomMargin = mSvBottomMargin + GetRowDragHintWidth();
mpPane->mLeftMargin = mSvLeftMargin;
mpPane->mRightMargin = ( hiddenRowsCnt == 0 ) ?
mSvRightMargin : mSvRightMargin + GetCollapsedRowIconHeight();
}
}
void cbRowDragPlugin::OnInitPlugin()
{
cbDockPane** panes = mpLayout->GetPanesArray();
for( int i = 0; i != MAX_PANES; ++i )
if ( panes[i]->MatchesMask( mPaneMask ) )
{
mpPane = panes[i];
SetPaneMargins();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -