made Freeze/Thaw recursively (un)freeze child windows too

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52283 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2008-03-03 11:30:07 +00:00
parent 9e85b0594d
commit 1c8e5c51f8
6 changed files with 62 additions and 62 deletions

View File

@ -215,9 +215,6 @@ protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;
virtual void DoFreeze();
virtual void DoThaw();
// return the text for the given column of the given item // return the text for the given column of the given item
virtual wxString OnGetItemText(long item, long column) const; virtual wxString OnGetItemText(long item, long column) const;

View File

@ -75,8 +75,6 @@ public:
virtual bool SetTransparent(wxByte alpha); virtual bool SetTransparent(wxByte alpha);
virtual bool CanSetTransparent(); virtual bool CanSetTransparent();
virtual void AddChild( wxWindowBase *child );
// implementation from now on // implementation from now on
// -------------------------- // --------------------------

View File

@ -888,16 +888,10 @@ public:
virtual void ClearBackground(); virtual void ClearBackground();
// freeze the window: don't redraw it until it is thawed // freeze the window: don't redraw it until it is thawed
void Freeze() { if ( !m_freezeCount++ ) DoFreeze(); } void Freeze();
// thaw the window: redraw it after it had been frozen // thaw the window: redraw it after it had been frozen
void Thaw() void Thaw();
{
wxASSERT_MSG( m_freezeCount, "Thaw() without matching Freeze()" );
if ( !--m_freezeCount )
DoThaw();
}
// return true if window had been frozen and not unthawed yet // return true if window had been frozen and not unthawed yet
bool IsFrozen() const { return m_freezeCount != 0; } bool IsFrozen() const { return m_freezeCount != 0; }

View File

@ -928,6 +928,52 @@ bool wxWindowBase::IsTopLevel() const
return false; return false;
} }
// ----------------------------------------------------------------------------
// Freeze/Thaw
// ----------------------------------------------------------------------------
void wxWindowBase::Freeze()
{
if ( !m_freezeCount++ )
{
// physically freeze this window:
DoFreeze();
// and recursively freeze all children:
for ( wxWindowList::iterator i = GetChildren().begin();
i != GetChildren().end(); ++i )
{
wxWindow *child = *i;
if ( child->IsTopLevel() )
continue;
child->Freeze();
}
}
}
void wxWindowBase::Thaw()
{
wxASSERT_MSG( m_freezeCount, "Thaw() without matching Freeze()" );
if ( !--m_freezeCount )
{
// recursively thaw all children:
for ( wxWindowList::iterator i = GetChildren().begin();
i != GetChildren().end(); ++i )
{
wxWindow *child = *i;
if ( child->IsTopLevel() )
continue;
child->Thaw();
}
// physically thaw this window:
DoThaw();
}
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// reparenting the window // reparenting the window
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -943,12 +989,22 @@ void wxWindowBase::AddChild(wxWindowBase *child)
GetChildren().Append((wxWindow*)child); GetChildren().Append((wxWindow*)child);
child->SetParent(this); child->SetParent(this);
// adding a child while frozen will assert when thawn, so freeze it as if
// it had been already present when we were frozen
if ( IsFrozen() && !child->IsTopLevel() )
child->Freeze();
} }
void wxWindowBase::RemoveChild(wxWindowBase *child) void wxWindowBase::RemoveChild(wxWindowBase *child)
{ {
wxCHECK_RET( child, wxT("can't remove a NULL child") ); wxCHECK_RET( child, wxT("can't remove a NULL child") );
// removing a child while frozen may result in permanently frozen window
// if used e.g. from Reparent(), so thaw it
if ( IsFrozen() && !child->IsTopLevel() )
child->Thaw();
GetChildren().DeleteObject((wxWindow *)child); GetChildren().DeleteObject((wxWindow *)child);
child->SetParent(NULL); child->SetParent(NULL);
} }

View File

@ -5901,14 +5901,4 @@ void wxGenericListCtrl::Refresh(bool eraseBackground, const wxRect *rect)
} }
} }
void wxGenericListCtrl::DoFreeze()
{
m_mainWin->Freeze();
}
void wxGenericListCtrl::DoThaw()
{
m_mainWin->Thaw();
}
#endif // wxUSE_LISTCTRL #endif // wxUSE_LISTCTRL

View File

@ -1175,49 +1175,14 @@ bool wxTopLevelWindowMSW::CanSetTransparent()
void wxTopLevelWindowMSW::DoFreeze() void wxTopLevelWindowMSW::DoFreeze()
{ {
if ( IsShown() ) // do nothing: freezing toplevel window causes paint and mouse events
{ // to go through it any TLWs under it, so the best we can do is to freeze
for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); // all children -- and wxWindowBase::Freeze() does that
node;
node = node->GetNext() )
{
wxWindow *child = node->GetData();
if ( child->IsTopLevel() )
continue;
child->Freeze();
}
}
} }
void wxTopLevelWindowMSW::DoThaw() void wxTopLevelWindowMSW::DoThaw()
{ {
if ( IsShown() ) // intentionally empty -- see DoFreeze()
{
for ( wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
node;
node = node->GetNext() )
{
wxWindow *child = node->GetData();
if ( child->IsTopLevel() )
continue;
child->Thaw();
}
}
}
void wxTopLevelWindowMSW::AddChild(wxWindowBase *child)
{
// adding a child while frozen will assert when thawn, so freeze it as if
// it had been already present when we were frozen
if ( child && !child->IsTopLevel() && IsFrozen() )
{
child->Freeze();
}
wxTopLevelWindowBase::AddChild(child);
} }