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

📄 updatesmgr.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        updatesmgr.cpp// Purpose:     cbSimpleUpdatesMgr implementation.// Author:      Aleksandras Gluchovas// Modified by:// Created:     19/10/98// RCS-ID:      $Id: updatesmgr.cpp,v 1.7 2005/09/23 12:47:44 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/fl/updatesmgr.h"// helper functionstatic inline bool rect_hits_rect( const wxRect& r1, const wxRect& r2 ){    if ( ( r2.x >= r1.x && r2.x <= r1.x + r1.width ) ||         ( r1.x >= r2.x && r1.x <= r2.x + r2.width ) )        if ( ( r2.y >= r1.y && r2.y <= r1.y + r1.height ) ||             ( r1.y >= r2.y && r1.y <= r2.y + r2.height ) )                         return 1;    return 0;}/***** Implementation for class cbSimpleUpdatesMgr *****/IMPLEMENT_DYNAMIC_CLASS( cbSimpleUpdatesMgr, cbUpdatesManagerBase )cbSimpleUpdatesMgr::cbSimpleUpdatesMgr( wxFrameLayout* pPanel )    : cbUpdatesManagerBase( pPanel ){}bool cbSimpleUpdatesMgr::WasChanged( cbUpdateMgrData& data, wxRect& currentBounds ){    return (   data.IsDirty() ||             ( data.mPrevBounds.x      != currentBounds.x     ||               data.mPrevBounds.y      != currentBounds.y     ||               data.mPrevBounds.width  != currentBounds.width ||               data.mPrevBounds.height != currentBounds.height  )           );}void cbSimpleUpdatesMgr::OnStartChanges(){    // memorize states of ALL items in the layout -    // this is quite excessive, but OK for the simple     // implementation of updates manager    mpLayout->GetPrevClientRect() = mpLayout->GetClientRect();    cbDockPane** panes = mpLayout->GetPanesArray();    for( int n = 0; n != MAX_PANES; ++n )    {        cbDockPane& pane = *panes[n];        // store pane state        pane.mUMgrData.StoreItemState( pane.mBoundsInParent );        pane.mUMgrData.SetDirty( false );        for( size_t i = 0; i != pane.GetRowList().Count(); ++i )        {            cbRowInfo& row = *pane.GetRowList()[ i ];            // store row state            row.mUMgrData.StoreItemState( row.mBoundsInParent );            row.mUMgrData.SetDirty( false );            for( size_t k = 0; k != row.mBars.Count(); ++k )            {                cbBarInfo& bar = *row.mBars[ k ];                // store bar state                bar.mUMgrData.StoreItemState( bar.mBoundsInParent );                bar.mUMgrData.SetDirty( false );            }        }    }}void cbSimpleUpdatesMgr::OnFinishChanges(){    // nothing here, could be overriden by more sophisticated updates-managers}void cbSimpleUpdatesMgr::OnRowWillChange( cbRowInfo* WXUNUSED(pRow), cbDockPane* WXUNUSED(pInPane) ){    // -/-}void cbSimpleUpdatesMgr::OnBarWillChange( cbBarInfo* WXUNUSED(pBar),                                           cbRowInfo* WXUNUSED(pInRow), cbDockPane* WXUNUSED(pInPane) ){    // -/-}void cbSimpleUpdatesMgr::OnPaneMarginsWillChange( cbDockPane* WXUNUSED(pPane) ){    // -/-}void cbSimpleUpdatesMgr::OnPaneWillChange( cbDockPane* WXUNUSED(pPane) ){    // -/-}void cbSimpleUpdatesMgr::UpdateNow(){    cbDockPane** panes = mpLayout->GetPanesArray();    wxRect& r1 = mpLayout->GetClientRect();    wxRect& r2 = mpLayout->GetPrevClientRect();    // detect changes in client window's area    bool clientWindowChanged = ( r1.x      != r2.x     ||                                 r1.y      != r2.y     ||                                 r1.width  != r2.width ||                                 r1.height != r2.height );    // step #1 - detect changes in each row of each pane,    //           and repaint decorations around changed windows    wxList mBarsToRefresh;    wxList mPanesList;    for( int n = 0; n != MAX_PANES; ++n )    {        cbDockPane& pane = *(panes[n]);        bool paneChanged = WasChanged( pane.mUMgrData, pane.mBoundsInParent );        if ( paneChanged )        {            wxClientDC dc( &mpLayout->GetParentFrame() );            pane.PaintPaneBackground( dc );        }        wxRect realBounds;        for( size_t i = 0; i != pane.GetRowList().Count(); ++i )        {            cbRowInfo& row = *pane.GetRowList()[ i ];            wxDC* pDc = NULL;            bool rowChanged = false;            // FIXME:: the below should not be fixed            cbBarInfo* barsToRepaint[256];            // number of bars, that were changed in the current row            int nBars = 0;             if ( WasChanged( row.mUMgrData, row.mBoundsInParent ) )                            rowChanged = true;            else                for( size_t k = 0; k != row.mBars.Count(); ++k )                    if ( WasChanged( row.mBars[k]->mUMgrData,                          row.mBars[k]->mBoundsInParent )                        )                                            barsToRepaint[nBars++] = row.mBars[k];            if ( nBars || rowChanged )            {                realBounds = row.mBoundsInParent;                // include 1-pixel thick shades around the row                realBounds.x -= 1;                realBounds.y -= 1;                realBounds.width  += 2;                realBounds.height += 2;                pDc = pane.StartDrawInArea( realBounds );            }            if ( rowChanged )            {                // postphone the resizing and refreshing the changed                // bar windows                for( size_t k = 0; k != row.mBars.Count(); ++k )                {                    mBarsToRefresh.Append( (wxObject*)row.mBars[k] );                    mPanesList.Append( &pane );                }                // draw only their decorations now                pane.PaintRow( &row, *pDc );            }            else            if ( nBars != 0 )            {                for( int i = 0; i != nBars; ++i )                {                    // postphone the resizement and refreshing the changed                    // bar windows                    mBarsToRefresh.Append( (wxObject*)barsToRepaint[i] );                    mPanesList.Append( &pane );                }                // redraw decorations of entire row, regardless of how much                // of the bars were changed                pane.PaintRow( &row, *pDc );            }            if ( pDc )                        pane.FinishDrawInArea( realBounds );        } // end of while        if ( paneChanged )        {            wxClientDC dc( &mpLayout->GetParentFrame() );            pane.PaintPaneDecorations( dc );        }    } // end of for    if ( clientWindowChanged )    {        mpLayout->PositionClientWindow();        // ptr to client-window object is "marked" as 0    }    // step #2 - do ordered refreshing and resizing of bar window objects now    wxNode* pNode     = mBarsToRefresh.GetFirst();    wxNode* pPaneNode = mPanesList.GetFirst();    while( pNode )    {        cbBarInfo*  pBar  = (cbBarInfo*) pNode->GetData();        cbDockPane* pPane = (cbDockPane*)pPaneNode->GetData();        pPane->SizeBar( pBar );        pNode     = pNode->GetNext();        pPaneNode = pPaneNode->GetNext();    }    pNode = mBarsToRefresh.GetFirst();    while( pNode )    {        cbBarInfo* pBar = (cbBarInfo*)pNode->GetData();        if ( pBar->mpBarWnd )         {            pBar->mpBarWnd->Refresh();            // FIXME::            //info.mpBarWnd->Show(false);            //info.mpBarWnd->Show(true);        }        pNode  = pNode->GetNext();    }    if ( clientWindowChanged )    {        // FIXME:: excessive?        mpLayout->GetFrameClient()->Refresh();    }}

⌨️ 快捷键说明

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