📄 panedrawpl.cpp
字号:
if ( mIsUpperHandle )
mHandleOfs = mpResizedRow->mRowY;
else
mHandleOfs = mpResizedRow->mRowY +
mpResizedRow->mRowHeight -
event.mpPane->mProps.mResizeHandleSize;
}
else
{
// otehrwise if bar handle dragged
// cbRowInfo& rowInfo = *mpDraggedBar->mpRow;
wxRect& bounds = mpDraggedBar->mBounds;
mHandleIsVertical = ( event.mpPane->IsHorizontal() ) ? true : false;
mHandleDragArea.x = from;
mHandleDragArea.width = till - from;
mHandleDragArea.y = bounds.y;
mHandleDragArea.height = bounds.height;
// left-side-handle mBounds
if ( mIsLeftHandle )
mHandleOfs = bounds.x;
else
mHandleOfs = bounds.x +
bounds.width - event.mpPane->mProps.mResizeHandleSize;
}
event.mpPane->PaneToFrame( &mHandleDragArea );
DrawDraggedHandle(mDragOrigin, *event.mpPane);
mPrevPos = mDragOrigin;
return;
// handled is dragged, thus event is "eaten" by this plugin
}
else
{
cbBarInfo* pDraggedBar;
if ( event.mpPane->HitTestPaneItems( event.mPos, // in pane's coordiantes
&mpResizedRow,
&pDraggedBar ) == CB_BAR_CONTENT_HITTED
)
{
int x = event.mPos.x,
y = event.mPos.y;
event.mpPane->PaneToFrame( &x, &y );
cbStartBarDraggingEvent dragEvt( pDraggedBar, wxPoint(x,y), event.mpPane );
mpLayout->FirePluginEvent( dragEvt );
return; // event is "eaten" by this plugin
}
}
event.Skip(); // pass event to the next plugin in the chain
}
void cbPaneDrawPlugin::OnLButtonUp( cbLeftUpEvent& event )
{
if ( mResizeStarted )
{
DrawDraggedHandle( event.mPos, *event.mpPane );
mResizeStarted = false;
mResizeCursorOn = false;
mpLayout->ReleaseEventsFromPane( event.mpPane );
mpLayout->ReleaseEventsFromPlugin( this );
// In Windows, at least, the frame needs to have a null cursor
// else child windows (such as text windows) inherit the cursor
#if 1
mpLayout->GetParentFrame().SetCursor( wxNullCursor );
#else
mpLayout->GetParentFrame().SetCursor( *mpLayout->mpNormalCursor );
#endif
if ( mRowHandleHitted )
{
event.mpPane->ResizeRow( mpResizedRow,
mDraggedDelta,
mIsUpperHandle );
}
else
{
event.mpPane->ResizeBar( mpDraggedBar,
mDraggedDelta,
mIsLeftHandle );
}
mpDraggedBar = NULL;
mpResizedRow = NULL;
// handled dragging action was finished by this mouse-up,
// thus event is "eaten" by this plugin
return;
}
event.Skip(); // pass event to the next plugin
}
void cbPaneDrawPlugin::OnRButtonUp( cbRightUpEvent& event )
{
wxPoint fpos = event.mPos;
event.mpPane->PaneToFrame( &fpos.x, &fpos.y );
cbBarInfo* pDraggedBar;
// user clicks inside the bar contnet, fire bar-customization event
if ( event.mpPane->HitTestPaneItems( event.mPos, // in pane's coordiantes
&mpResizedRow,
&pDraggedBar ) == CB_BAR_CONTENT_HITTED
)
{
cbCustomizeBarEvent cbEvt( pDraggedBar, fpos, event.mpPane );
mpLayout->FirePluginEvent( cbEvt );
return; // event is "eaten" by this plugin
}
// otherwise fire whole-layout customization event
cbCustomizeLayoutEvent csEvt( fpos );
mpLayout->FirePluginEvent( csEvt );
// event is "eaten" by this plugin
}
void cbPaneDrawPlugin::OnSizeBarWindow( cbSizeBarWndEvent& event )
{
cbBarInfo& bar = *event.mpBar;
mpPane = event.mpPane;
// it's possible that a bar does not have it's own window!
if ( !bar.mpBarWnd ) return;
wxRect& bounds = event.mBoundsInParent;
// check visibility
if ( bounds.height != 0 )
{
// size smaller than bounds, to leave space for shade lines
// FIXME:: +/- 1s
int nNewHeight = bounds.height - 2 - bar.mDimInfo.mVertGap *2;
if(nNewHeight < 0)
nNewHeight = 0;
bar.mpBarWnd->wxWindow::SetSize( bounds.x + 1 + bar.mDimInfo.mHorizGap,
bounds.y + 1 + bar.mDimInfo.mVertGap,
bounds.width - 2 - bar.mDimInfo.mHorizGap*2,
nNewHeight,
0
);
if ( !bar.mpBarWnd->IsShown() )
bar.mpBarWnd->Show( true );
}
else
// hide bar if not visible
bar.mpBarWnd->Show( false );
event.Skip(); // pass event to the next plugin in the chain
}
void cbPaneDrawPlugin::OnDrawRowDecorations( cbDrawRowDecorEvent& event )
{
DrawPaneShadeForRow( event.mpRow, *event.mpDc );
event.Skip(); // pass event to the next plugin
}
void cbPaneDrawPlugin::DrawUpperRowHandle( cbRowInfo* pRow, wxDC& dc )
{
wxRect& bounds = pRow->mBoundsInParent;
if ( mpPane->IsHorizontal() )
{
if ( pRow->mHasUpperHandle )
mpPane->DrawHorizHandle( dc, bounds.x,
bounds.y-1,
pRow->mRowWidth );
}
else
{
if ( pRow->mHasUpperHandle )
mpPane->DrawVertHandle( dc, bounds.x-1,
bounds.y, pRow->mRowWidth );
}
}
void cbPaneDrawPlugin::DrawLowerRowHandle( cbRowInfo* pRow, wxDC& dc )
{
wxRect& bounds = pRow->mBoundsInParent;
// check if iter-row handles present
if ( mpPane->IsHorizontal() )
{
if ( pRow->mHasLowerHandle )
mpPane->DrawHorizHandle( dc, bounds.x, bounds.y + bounds.height - mpPane->mProps.mResizeHandleSize - 1,
pRow->mRowWidth );
}
else
{
if ( pRow->mHasLowerHandle )
mpPane->DrawVertHandle( dc, bounds.x + bounds.width - mpPane->mProps.mResizeHandleSize - 1,
bounds.y, pRow->mRowWidth );
}
}
void cbPaneDrawPlugin::OnDrawRowHandles( cbDrawRowHandlesEvent& event )
{
// short-cuts
cbRowInfo* pRow = event.mpRow;
wxDC& dc = *event.mpDc;
mpPane = event.mpPane;
// draw handles of surrounding rows first
if ( pRow->mpPrev && pRow->mpPrev->mHasLowerHandle )
DrawLowerRowHandle( pRow->mpPrev, dc );
if ( pRow->mpNext && pRow->mpNext->mHasUpperHandle )
DrawUpperRowHandle( pRow->mpNext, dc );
// draw handles of the given row
if ( pRow->mHasUpperHandle )
DrawUpperRowHandle( pRow, dc );
if ( pRow->mHasLowerHandle )
DrawLowerRowHandle( pRow, dc );
event.Skip(); // pass event to the next plugin
}
void cbPaneDrawPlugin::OnDrawPaneBackground ( cbDrawPaneBkGroundEvent& event )
{
wxDC& dc = *event.mpDc;
mpPane = event.mpPane;
// FOR NOW:: hard-coded
wxBrush bkBrush( mpLayout->mBorderPen.GetColour(), wxSOLID );
dc.SetBrush( bkBrush );
dc.SetPen( mpLayout->mNullPen );
wxRect& bounds = mpPane->mBoundsInParent;
if ( mpPane->mTopMargin >= 1 )
dc.DrawRectangle( bounds.x, bounds.y,
bounds.width+1,
mpPane->mTopMargin + 1);
if ( mpPane->mBottomMargin >= 1 )
dc.DrawRectangle( bounds.x,
bounds.y + bounds.height - mpPane->mBottomMargin,
bounds.width + 1,
mpPane->mBottomMargin + 1);
if ( mpPane->mLeftMargin >= 1 )
dc.DrawRectangle( bounds.x,
bounds.y + mpPane->mTopMargin - 1,
mpPane->mLeftMargin + 1,
bounds.height - mpPane->mTopMargin - mpPane->mBottomMargin + 2);
if ( mpPane->mRightMargin >= 1 )
dc.DrawRectangle( bounds.x + bounds.width - mpPane->mRightMargin,
bounds.y + mpPane->mTopMargin - 1,
mpPane->mRightMargin + 1,
bounds.height - mpPane->mTopMargin - mpPane->mBottomMargin + 2);
event.Skip(); // pass event to the next plugin
}
void cbPaneDrawPlugin::OnDrawRowBackground ( cbDrawRowBkGroundEvent& event )
{
// short-cuts
cbRowInfo* pRow = event.mpRow;
wxDC& dc = *event.mpDc;
mpPane = event.mpPane;
// get ready
wxRect rowBounds = pRow->mBoundsInParent;
bool isHorizontal = event.mpPane->IsHorizontal();
// int prevPos;
if ( isHorizontal )
{
// prevPos = rowBounds.x;
// include one line above and below the row
--rowBounds.y;
rowBounds.height += 2;
--rowBounds.x;
rowBounds.width += 2;
}
else
{
// prevPos = rowBounds.y;
// include one line above and below the row
--rowBounds.x;
rowBounds.width += 2;
--rowBounds.y;
rowBounds.height += 2;
}
//#define TEST_BK_ERASING
#ifdef TEST_BK_ERASING
// DBG::
wxBrush br0( wxColour(0,160,160), wxSOLID );
dc.SetBrush(br0);
dc.SetPen ( mpLayout->mNullPen );
dc.DrawRectangle( rowBounds.x, rowBounds.y,
rowBounds.width + 1,
rowBounds.height + 1 );
#endif
wxBrush bkBrush( mpLayout->mGrayPen.GetColour(), wxSOLID );
dc.SetPen ( mpLayout->mNullPen );
dc.SetBrush( bkBrush );
// fill background-recatangle of entire row area
dc.DrawRectangle( rowBounds.x, rowBounds.y,
rowBounds.width + 1,
rowBounds.height + 1 );
dc.SetBrush( wxNullBrush );
// draw "shaded-side-bars" for each bar
for( size_t i = 0; i != pRow->mBars.Count(); ++i )
{
wxRect& bounds = pRow->mBars[i]->mBoundsInParent;
if ( isHorizontal )
{
DrawShade( 1, bounds, FL_ALIGN_LEFT, dc );
DrawShade( 1, bounds, FL_ALIGN_RIGHT, dc );
}
else
{
DrawShade( 1, bounds, FL_ALIGN_TOP, dc );
DrawShade( 1, bounds, FL_ALIGN_BOTTOM, dc );
}
}
// draw extra shades to simulate "glued-bricks" effect
// TBD:: reduce exessive drawing of shades, when the
// row handle is present, and shades will be overr-drawn anyway
DrawUpperRowShades( pRow, dc, 1 ); // outer shade
if ( pRow->mpPrev )
{
DrawLowerRowShades( pRow->mpPrev, dc, 1 ); // outter shade
DrawLowerRowShades( pRow->mpPrev, dc, 0 ); // inner shade
}
DrawLowerRowShades( pRow, dc, 1 );
if ( pRow->mpNext )
{
DrawUpperRowShades( pRow->mpNext, dc, 1 );
DrawUpperRowShades( pRow->mpNext, dc, 0 );
}
event.Skip(); // pass event to the next plugin
}
void cbPaneDrawPlugin::DrawUpperRowShades( cbRowInfo* pRow, wxDC& dc, int level )
{
for( size_t i = 0; i != pRow->mBars.Count(); ++i )
{
wxRect& bounds = pRow->mBars[i]->mBoundsInParent;
if ( mpPane->IsHorizontal() )
{
DrawShade( level, bounds, FL_ALIGN_TOP, dc );
if ( level == 1 )
{
dc.SetPen( mpLayout->mDarkPen );
dc.DrawPoint( bounds.x - 1, bounds.y );
dc.SetPen( mpLayout->mLightPen );
dc.DrawPoint( bounds.x + bounds.width , bounds.y );
}
}
else
{
DrawShade( level, bounds, FL_ALIGN_LEFT, dc );
if ( level == 1 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -