- Fixed crashes in helpview when opening a file.
- Added wxMutex::LockTimeout() (Aleksandr Napylov)
- Set locale to the default in all ports, not just wxGTK
+- Added wxGridUpdateLocker helper class (Evgeniy Tarassov)
wxGTK:
\input gridrend.tex
\input gridtbl.tex
\input gridsizr.tex
+\input gupdlock.tex
\input hashmap.tex
\input hashset.tex
\input hash.tex
modification can be enclosed between BeginBatch and EndBatch calls to avoid
screen flicker. The final EndBatch will cause the grid to be repainted.
+\wxheading{See also}
+
+\helpref{wxGridUpdateLocker}{wxgridupdatelocker}
+
\membersection{wxGrid::BlockToDeviceRect}\label{wxgridblocktodevicerect}
BeginBatch and EndBatch calls to avoid screen flicker. The final EndBatch will
cause the grid to be repainted.
+\wxheading{See also}
+
+\helpref{wxGridUpdateLocker}{wxgridupdatelocker}
+
\membersection{wxGrid::Fit}\label{wxgridfit}
--- /dev/null
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Name: gupdlock.tex
+%% Purpose: wxGridUpdateLocker documentation
+%% Author: Evgeniy Tarassov
+%% Created: 2007-03-15
+%% RCS-ID: $Id$
+%% Copyright: (c) 2007 TT-Solutions SARL
+%% License: wxWindows license
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\section{\class{wxGridUpdateLocker}}\label{wxgridupdatelocker}
+
+This small class can be used to prevent \helpref{wxGrid}{wxgrid} from redrawing
+during its lifetime by calling \helpref{wxGrid::BeginBatch}{wxgridbeginbatch}
+in its constructor and \helpref{wxGrid::EndBatch}{wxgridendbatch} in its
+destructor. It is typically used in a function performing several operations
+with a grid which would otherwise result in flicker. For example:
+
+{\small
+\begin{verbatim}
+ void MyFrame::Foo()
+ {
+ m_grid = new wxGrid(this, ...);
+
+ wxGridUpdateLocker noUpdates(m_grid);
+ m_grid->AppendColumn();
+ ... many other operations with m_grid...
+ m_grid->AppendRow();
+
+ // destructor called, grid refreshed
+ }
+\end{verbatim}
+}
+
+Using this class is easier and safer than calling
+\helpref{BeginBatch}{wxgridbeginbatch} and \helpref{EndBatch}{wxgridendbatch}
+because you don't risk not to call the latter (due to an exception for example).
+
+\wxheading{Derived from}
+
+None.
+
+\wxheading{Include files}
+
+<wx/grid.h>
+
+
+\latexignore{\rtfignore{\wxheading{Members}}}
+
+
+\membersection{wxGridUpdateLocker::wxGridUpdateLocker}\label{wxgridupdatelockerctor}
+
+\func{}{wxGridUpdateLocker}{\param{wxGrid *}{grid = \NULL}}
+
+Creates an object preventing the updates of the specified \arg{grid}. The
+parameter could be \NULL in which case nothing is done. If \arg{grid} is
+non-\NULL then the grid must exist for longer than wxGridUpdateLocker object
+itself.
+
+The default constructor could be followed by a call to
+\helpref{wxGridUpdateLocker::Create}{wxgridupdatelockercreate} to set the
+grid object later.
+
+
+
+\membersection{wxGridUpdateLocker::\destruct{wxGridUpdateLocker}}\label{wxgridupdatelockerdtor}
+
+\func{}{\destruct{wxGridUpdateLocker}}{\void}
+
+Destructor reenables updates for the grid this object is associated with.
+
+
+
+\membersection{wxGridUpdateLocker::Create}\label{wxgridupdatelockercreate}
+
+\func{void}{Create}{\param{wxGrid* }{grid}}
+
+This method can be called if the object had been constructed using the default
+constructor. It must not be called more than once.
+
+
};
+// ----------------------------------------------------------------------------
+// wxGridUpdateLocker prevents updates to a grid during its lifetime
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_ADV wxGridUpdateLocker
+{
+public:
+ // if the pointer is NULL, Create() can be called later
+ wxGridUpdateLocker(wxGrid *grid = NULL)
+ {
+ Init(grid);
+ }
+
+ // can be called if ctor was used with a NULL pointer, must not be called
+ // more than once
+ void Create(wxGrid *grid)
+ {
+ wxASSERT_MSG( !m_grid, _T("shouldn't be called more than once") );
+
+ Init(grid);
+ }
+
+ ~wxGridUpdateLocker()
+ {
+ if ( m_grid )
+ m_grid->EndBatch();
+ }
+
+private:
+ void Init(wxGrid *grid)
+ {
+ m_grid = grid;
+ if ( m_grid )
+ m_grid->BeginBatch();
+ }
+
+ wxGrid *m_grid;
+
+ DECLARE_NO_COPY_CLASS(wxGridUpdateLocker)
+};
+
// ----------------------------------------------------------------------------
// Grid event class and event types
// ----------------------------------------------------------------------------
{
if ( grid->IsSelection() )
{
- grid->BeginBatch();
+ wxGridUpdateLocker locker(grid);
for ( int n = 0; n < grid->GetNumberRows(); )
{
if ( grid->IsInSelection( n , 0 ) )
else
n++;
}
- grid->EndBatch();
}
}
{
if ( grid->IsSelection() )
{
- grid->BeginBatch();
+ wxGridUpdateLocker locker(grid);
for ( int n = 0; n < grid->GetNumberCols(); )
{
if ( grid->IsInSelection( 0 , n ) )
else
n++;
}
- grid->EndBatch();
}
}
{
wxDbGridCellAttrProvider *provider;
+ wxGridUpdateLocker locker(GetView());
+
//Remove Information from grid about old data
if (GetView())
{
wxGrid *grid = GetView();
- grid->BeginBatch();
grid->ClearSelection();
if (grid->IsCellEditControlEnabled())
{
wxGrid * grid = GetView();
wxGridTableMessage msg(this, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_rowtotal);
grid->ProcessTableMessage(msg);
- grid->EndBatch();
}
m_dbowner = takeOwnership;
m_rowmodified = false;
{
int width = m_rowLabelWidth;
- if ( !calcOnly )
- BeginBatch();
+ wxGridUpdateLocker locker;
+ if(!calcOnly)
+ locker.Create(this);
for ( int col = 0; col < m_numCols; col++ )
{
width += GetColWidth(col);
}
- if ( !calcOnly )
- EndBatch();
-
return width;
}
{
int height = m_colLabelHeight;
- if ( !calcOnly )
- BeginBatch();
+ wxGridUpdateLocker locker;
+ if(!calcOnly)
+ locker.Create(this);
for ( int row = 0; row < m_numRows; row++ )
{
height += GetRowHeight(row);
}
- if ( !calcOnly )
- EndBatch();
-
return height;
}
void wxGrid::AutoSize()
{
- BeginBatch();
+ wxGridUpdateLocker locker(this);
// we need to round up the size of the scrollable area to a multiple of
// scroll step to ensure that we don't get the scrollbars when we're sized
// client size but also leave space for (not needed any more) scrollbars
SetScrollbars(0, 0, 0, 0, 0, 0, true);
SetClientSize(sizeFit.x + m_rowLabelWidth, sizeFit.y + m_colLabelHeight);
-
- EndBatch();
}
void wxGrid::AutoSizeRowLabelSize( int row )