⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 barhintspl.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        barhintspl.h// Purpose:     Implementation for cbBarHintsPlugin// Author:      Aleksandras Gluchovas// Modified by:// Created:     30/11/98 (my 22th birthday :-)// RCS-ID:      $Id: barhintspl.cpp,v 1.8 2005/09/23 12:47:41 MR 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/utils.h"#include "wx/fl/barhintspl.h"// fixed settings#define GROOVE_WIDTH         3  // left shade + middle line + right shade#define GROOVE_TO_GROOVE_GAP 1  #define BOX_T_BOX_GAP        2#define BOX_TO_GROOVE_GAP    3#define BOXES_IN_HINT        2#define CLOSE_BOX_IDX        0#define COLLAPSE_BOX_IDX     1// used interally #define CLOSE_BOX_HITTED    1#define COLLAPSE_BOX_HITTED 2/***** Implementation fro class cbBarHintsPlugin *****/IMPLEMENT_DYNAMIC_CLASS( cbBarHintsPlugin, cbPluginBase )BEGIN_EVENT_TABLE( cbBarHintsPlugin, cbPluginBase )    EVT_PL_SIZE_BAR_WND  ( cbBarHintsPlugin::OnSizeBarWindow )    EVT_PL_DRAW_BAR_DECOR( cbBarHintsPlugin::OnDrawBarDecorations )    EVT_PL_LEFT_DOWN( cbBarHintsPlugin::OnLeftDown )    EVT_PL_LEFT_UP  ( cbBarHintsPlugin::OnLeftUp   )    EVT_PL_MOTION   ( cbBarHintsPlugin::OnMotion   )END_EVENT_TABLE()cbBarHintsPlugin::cbBarHintsPlugin(void)    : mpPane( 0 ),      mBtnPressed   ( false ),      mCloseBoxOn   ( true ),      mCollapseBoxOn( true ),      mGrooveCount  ( 2 ),      mHintGap      ( 4 ),      mXWeight      ( 2 ){    mBoxes[CLOSE_BOX_IDX]    = NULL;    mBoxes[COLLAPSE_BOX_IDX] = NULL;}cbBarHintsPlugin::cbBarHintsPlugin( wxFrameLayout* pLayout, int paneMask )    : cbPluginBase( pLayout, paneMask ),      mpPane( 0 ),      mBtnPressed   ( false ),      mCloseBoxOn   ( true ),      mCollapseBoxOn( true ),      mGrooveCount  ( 2 ),      mHintGap      ( 5 ),      mXWeight      ( 2 ){    mBoxes[CLOSE_BOX_IDX]    = NULL;    mBoxes[COLLAPSE_BOX_IDX] = NULL;}cbBarHintsPlugin::~cbBarHintsPlugin(){    if (mBoxes[CLOSE_BOX_IDX])        delete mBoxes[CLOSE_BOX_IDX];    if (mBoxes[COLLAPSE_BOX_IDX])        delete mBoxes[COLLAPSE_BOX_IDX];}  // cbBarHintsPlugin destructorvoid cbBarHintsPlugin::SetGrooveCount( int nGrooves ){    mGrooveCount = nGrooves;}void cbBarHintsPlugin::CreateBoxes(){    cbCloseBox*    box1 = new cbCloseBox();    cbCollapseBox* box2 = new cbCollapseBox();    mBoxes[CLOSE_BOX_IDX]    = box1;    mBoxes[COLLAPSE_BOX_IDX] = box2;    int i;    for ( i = 0; i != BOXES_IN_HINT; ++i )    {        mBoxes[i]->mpLayout = mpLayout;        mBoxes[i]->mpPlugin = this;        mBoxes[i]->mpWnd    = NULL;    }}void cbBarHintsPlugin::Draw3DBox( wxDC& WXUNUSED(dc), const wxPoint& WXUNUSED(pos), bool WXUNUSED(pressed) ){}void cbBarHintsPlugin::DrawCloseBox( wxDC& WXUNUSED(dc), const wxPoint& WXUNUSED(pos), bool WXUNUSED(pressed) ){}void cbBarHintsPlugin::DrawCollapseBox( wxDC& WXUNUSED(dc), const wxPoint& WXUNUSED(pos),                                         bool WXUNUSED(atLeft), bool WXUNUSED(disabled), bool WXUNUSED(pressed) ){}void cbBarHintsPlugin::DrawGrooves( wxDC& dc, const wxPoint& pos, int length ){    int ofs = 0;    int i;    for ( i = 0; i != mGrooveCount; ++i, ofs += ( GROOVE_WIDTH + GROOVE_TO_GROOVE_GAP ) )    {        if ( mpPane->IsHorizontal() )        {            dc.SetPen( mpLayout->mLightPen );            dc.DrawLine( pos.x + ofs, pos.y, pos.x + ofs, pos.y + length - 1 );            dc.DrawPoint( pos.x + ofs + 1, pos.y );            dc.SetPen( mpLayout->mDarkPen );            dc.DrawLine( pos.x + ofs + 2, pos.y, pos.x + ofs + 2, pos.y + length );            dc.DrawPoint( pos.x + ofs + 1, pos.y + length - 1 );            dc.DrawPoint( pos.x + ofs,     pos.y + length - 1 );        }        else        {            dc.SetPen( mpLayout->mLightPen );            dc.DrawLine( pos.x, pos.y + ofs, pos.x + length - 1, pos.y + ofs );            dc.DrawPoint( pos.x, pos.y + ofs + 1 );            dc.SetPen( mpLayout->mDarkPen );            dc.DrawLine( pos.x, pos.y + ofs + 2, pos.x + length, pos.y + ofs + 2 );            dc.DrawPoint( pos.x + length - 1, pos.y + ofs + 1 );            dc.DrawPoint( pos.x + length - 1, pos.y + ofs );        }    }}void cbBarHintsPlugin::ExcludeHints( wxRect& rect, cbBarInfo& info ){    int boxHeight = BTN_BOX_HEIGHT;    // collapse and close box are not placed on fixed bars    if ( info.IsFixed() || ( !mCloseBoxOn && !mCollapseBoxOn ) )        boxHeight = 0;    int height = wxMax( mGrooveCount*(GROOVE_WIDTH + GROOVE_TO_GROOVE_GAP)                         - GROOVE_TO_GROOVE_GAP,                         boxHeight                       );    if ( mpPane->IsHorizontal() )    {        rect.x     += ( mHintGap*2 + height );        rect.width -= (height + 2*mHintGap);        rect.x     -= info.mDimInfo.mHorizGap + 2;        rect.width += info.mDimInfo.mHorizGap + 2;    }    else    {        rect.y      += (mHintGap*2 + height);        rect.height -= (height + 2*mHintGap);        rect.y      -= info.mDimInfo.mVertGap + 2;        rect.height += info.mDimInfo.mVertGap + 2;    }}void cbBarHintsPlugin::DoDrawHint( wxDC& dc, wxRect& rect,                                    int pos, int WXUNUSED(boxOfs), int grooveOfs,                                   bool isFixed ){    if ( !isFixed )    {        if ( mpPane->IsHorizontal() )        {            if ( mCloseBoxOn )                mBoxes[CLOSE_BOX_IDX]->Draw( dc );            if ( mCollapseBoxOn )                            mBoxes[COLLAPSE_BOX_IDX]->Draw( dc );        }        else        {            if ( mCloseBoxOn )                            mBoxes[CLOSE_BOX_IDX]->Draw( dc );            if ( mCollapseBoxOn )                            mBoxes[COLLAPSE_BOX_IDX]->Draw( dc );        }    }    if ( mpPane->IsHorizontal() )            DrawGrooves( dc, wxPoint( rect.x + mHintGap + grooveOfs, pos ),                      rect.height - (pos - rect.y) - mHintGap );    else        DrawGrooves( dc, wxPoint( rect.x + mHintGap, rect.y + mHintGap + grooveOfs ),                      (pos - rect.x) - mHintGap );}void cbBarHintsPlugin::GetHintsLayout( wxRect& rect, cbBarInfo& info,                                        int& boxOfs, int& grooveOfs, int& pos ){    int boxHeight = BTN_BOX_HEIGHT;//  int boxWidth  = BTN_BOX_WIDTH + BOX_TO_GROOVE_GAP + BTN_BOX_WIDTH;    // collapse and close box are not placed on fixed bars    if ( info.IsFixed() || ( !mCloseBoxOn && !mCollapseBoxOn ) )    {        boxHeight = 0;//      boxWidth = 0;    }/*    else    if ( !mCloseBoxOn || !mCollapseBoxOn )        boxWidth = BTN_BOX_WIDTH;*/    int grooveHeight = mGrooveCount*(GROOVE_WIDTH + GROOVE_TO_GROOVE_GAP)                        - GROOVE_TO_GROOVE_GAP;    int height = wxMax( grooveHeight, boxHeight );    // center boxs and groves with respect to each other    boxOfs    = ( height - boxHeight    ) / 2;    grooveOfs = ( height - grooveHeight ) / 2;    pos = ( mpPane->IsHorizontal() ) ? rect.y + mHintGap                                     : rect.x + rect.width - mHintGap;    // setup positions for boxes    if ( !info.IsFixed() )    {        // what direction "collapse-triangle" should look at?        bool& isAtLeft = ((cbCollapseBox*)(mBoxes[COLLAPSE_BOX_IDX]))->mIsAtLeft;                 isAtLeft= info.mBounds.x <= mpPane->mPaneWidth - ( info.mBounds.x + info.mBounds.width );        if ( info.IsExpanded() )        {            isAtLeft = false;            cbBarInfo* pCur = info.mpPrev;            while( pCur )            {                if ( !pCur->IsFixed() )                {                    isAtLeft = true; break;                }                pCur = pCur->mpPrev;            }        }        // collapse/expand works only when more not-fixed bars are present in the same row        mBoxes[COLLAPSE_BOX_IDX]->Enable( info.mpRow->mNotFixedBarsCnt > 1 );        int i;        for ( i = 0; i != BOXES_IN_HINT; ++i )        {            mBoxes[i]->mpPane = mpPane;        }        if ( mpPane->IsHorizontal() )        {            if ( mCloseBoxOn )            {                mBoxes[CLOSE_BOX_IDX]->mPos = wxPoint( rect.x + mHintGap + boxOfs, pos );                pos += BTN_BOX_HEIGHT;            }            if ( mCollapseBoxOn )            {                if ( mCloseBoxOn ) pos += BOX_T_BOX_GAP;                mBoxes[COLLAPSE_BOX_IDX]->mPos = wxPoint( rect.x + mHintGap + boxOfs, pos );                pos += BTN_BOX_HEIGHT;                pos += BOX_TO_GROOVE_GAP;            }        }        else        {            if ( mCloseBoxOn )            {                pos -= BTN_BOX_WIDTH;                mBoxes[CLOSE_BOX_IDX]->mPos = wxPoint( pos , rect.y + mHintGap + boxOfs );            }            if ( mCollapseBoxOn )            {                if ( mCloseBoxOn ) pos -= BOX_T_BOX_GAP;                pos -= BTN_BOX_WIDTH;                mBoxes[COLLAPSE_BOX_IDX]->mPos = wxPoint( pos, rect.y + mHintGap + boxOfs );                pos -= BOX_TO_GROOVE_GAP;            }        }    }}static inline bool is_in_box( const wxPoint& rectPos, const wxPoint& mousePos ){    return ( mousePos.x >= rectPos.x &&             mousePos.y >= rectPos.y &&             mousePos.x < rectPos.x + BTN_BOX_WIDTH &&             mousePos.y < rectPos.y + BTN_BOX_HEIGHT );}int cbBarHintsPlugin::HitTestHints( cbBarInfo& info, const wxPoint& pos ){    wxPoint inPane = pos;    mpPane->PaneToFrame( &inPane.x, &inPane.y );    wxRect& rect = info.mBoundsInParent;    if ( info.IsFixed() ) return false;    int boxOfs, grooveOfs, coord;    GetHintsLayout( rect, info, boxOfs, grooveOfs, coord );    if ( mpPane->IsHorizontal() )    {        if ( mCloseBoxOn )        {            if ( is_in_box( wxPoint( rect.x + mHintGap + boxOfs, coord ), inPane ) )                return CLOSE_BOX_HITTED;            coord += BTN_BOX_HEIGHT;        }        if ( mCollapseBoxOn )        {            if ( mCloseBoxOn ) coord += BOX_T_BOX_GAP;            if ( is_in_box( wxPoint( rect.x + mHintGap + boxOfs, coord ), inPane ) )                return COLLAPSE_BOX_HITTED;            coord += BTN_BOX_HEIGHT;        }    }    else    {        if ( mCloseBoxOn )        {            coord -= BTN_BOX_WIDTH;            if ( is_in_box( wxPoint( coord , rect.y + mHintGap + boxOfs ), inPane ) )                return CLOSE_BOX_HITTED;        }        if ( mCollapseBoxOn )        {            if ( mCloseBoxOn ) coord -= BOX_T_BOX_GAP;            coord -= BTN_BOX_WIDTH;            if ( is_in_box( wxPoint( coord, rect.y + mHintGap + boxOfs ), inPane ) )                return COLLAPSE_BOX_HITTED;        }    }    return false;}// handlers for plugin-eventsvoid cbBarHintsPlugin::OnSizeBarWindow( cbSizeBarWndEvent& event ){    wxRect& rect     = event.mBoundsInParent;    mpPane           = event.mpPane;    ExcludeHints( rect, *event.mpBar );    event.Skip(); // pass event to the next plugin in the chain}void cbBarHintsPlugin::OnDrawBarDecorations( cbDrawBarDecorEvent& event ){    wxRect& rect     = event.mBoundsInParent;    mpPane           = event.mpPane;    int boxOfs, grooveOfs, pos;    GetHintsLayout( rect, *event.mpBar, boxOfs, grooveOfs, pos );    DoDrawHint( *event.mpDc, rect, pos, boxOfs, grooveOfs, event.mpBar->IsFixed() );    // let other plugins add on their decorations    event.Skip();}void cbBarHintsPlugin::OnLeftDown( cbLeftDownEvent& event ){    mpPane           = event.mpPane;    wxPoint inFrame = event.mPos;    mpPane->PaneToFrame( &inFrame.x, &inFrame.y );    wxBarIterator iter( mpPane->GetRowList() );    mpClickedBar = NULL;    while ( iter.Next() )    {        cbBarInfo& bar = iter.BarInfo();        int boxOfs, grooveOfs, pos;        GetHintsLayout( bar.mBoundsInParent, bar, boxOfs, grooveOfs, pos );        if ( !bar.IsFixed() )        {            int i;            for ( i = 0; i != BOXES_IN_HINT; ++i )            {                mBoxes[i]->mPressed = false;                mBoxes[i]->mWasClicked = false;            }            for ( i = 0; i != BOXES_IN_HINT; ++i )            {                mBoxes[i]->OnLeftDown( inFrame );                if ( mBoxes[i]->mPressed )                {                    mBtnPressed = true;                    mpClickedBar = &bar;                    return; // event handled                }            }        }    }    event.Skip();}void cbBarHintsPlugin::OnLeftUp( cbLeftUpEvent&   event ){    if ( mBtnPressed )    {        wxPoint inFrame = event.mPos;        mpPane->PaneToFrame( &inFrame.x, &inFrame.y );        int boxOfs, grooveOfs, pos;        GetHintsLayout( mpClickedBar->mBoundsInParent, *mpClickedBar, boxOfs, grooveOfs, pos );        HitTestHints( *mpClickedBar, event.mPos );        int i;        for ( i = 0; i != BOXES_IN_HINT; ++i )        {            mBoxes[i]->OnLeftUp( inFrame );            if ( mBoxes[i]->WasClicked() )            {                if ( i == 0 )                {                    mpLayout->SetBarState( mpClickedBar, wxCBAR_HIDDEN, true );                    // Notify bar child window of close event:                    if(mpClickedBar->mpBarWnd!=NULL)                        mpClickedBar->mpBarWnd->Close();                }                else                {                    if ( mpClickedBar->IsExpanded() )                        mpPane->ContractBar( mpClickedBar );                    else                        mpPane->ExpandBar( mpClickedBar );                }            }        }        mBtnPressed = false;        return;    }    else        event.Skip();}void cbBarHintsPlugin::OnMotion( cbMotionEvent&   event ){    if ( mBtnPressed )    {        wxPoint inFrame = event.mPos;        mpPane->PaneToFrame( &inFrame.x, &inFrame.y );        mpPane = event.mpPane;        int i;        for ( i = 0; i != BOXES_IN_HINT; ++i )        {            mBoxes[i]->OnMotion( inFrame );        }    }    else        event.Skip();}void cbBarHintsPlugin::OnInitPlugin(){    cbPluginBase::OnInitPlugin();    cbDockPane** panes = mpLayout->GetPanesArray();    int i;    for ( i = 0; i != MAX_PANES; ++i )    {            if ( panes[i]->MatchesMask( mPaneMask ) )        {            panes[i]->mProps.mMinCBarDim.x = 25;            panes[i]->mProps.mMinCBarDim.y = 16;        }    }    CreateBoxes();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -