dolphin/Externals/wxWidgets3/src/common/modalhook.cpp

120 lines
3.4 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: src/common/modalhook.cpp
// Purpose: wxModalDialogHook implementation
// Author: Vadim Zeitlin
// Created: 2013-05-19
// Copyright: (c) 2013 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/modalhook.h"
#ifndef WX_PRECOMP
#endif // WX_PRECOMP
wxModalDialogHook::Hooks wxModalDialogHook::ms_hooks;
// ============================================================================
// wxModalDialogHook implementation
// ============================================================================
// ----------------------------------------------------------------------------
// Hooks management
// ----------------------------------------------------------------------------
void wxModalDialogHook::Register()
{
#if wxDEBUG_LEVEL
for ( Hooks::const_iterator it = ms_hooks.begin();
it != ms_hooks.end();
++it)
{
if ( *it == this )
{
wxFAIL_MSG( wxS("Registering already registered hook?") );
return;
}
}
#endif // wxDEBUG_LEVEL
ms_hooks.insert(ms_hooks.begin(), this);
}
void wxModalDialogHook::Unregister()
{
if ( !DoUnregister() )
{
wxFAIL_MSG( wxS("Unregistering not registered hook?") );
}
}
bool wxModalDialogHook::DoUnregister()
{
for ( Hooks::iterator it = ms_hooks.begin();
it != ms_hooks.end();
++it )
{
if ( *it == this )
{
ms_hooks.erase(it);
return true;
}
}
return false;
}
// ----------------------------------------------------------------------------
// Invoking hooks methods
// ----------------------------------------------------------------------------
/* static */
int wxModalDialogHook::CallEnter(wxDialog* dialog)
{
// Make a copy of the hooks list to avoid problems if it's modified while
// we're iterating over it: this is unlikely to happen in our case, but
// quite possible in CallExit() as the hooks may remove themselves after
// the call to their Exit(), so do it here for symmetry as well.
const Hooks hooks = ms_hooks;
for ( Hooks::const_iterator it = hooks.begin(); it != hooks.end(); ++it )
{
const int rc = (*it)->Enter(dialog);
if ( rc != wxID_NONE )
{
// Skip calling all the rest of the hooks if one of them preempts
// showing the dialog completely.
return rc;
}
}
return wxID_NONE;
}
/* static */
void wxModalDialogHook::CallExit(wxDialog* dialog)
{
// See comment in CallEnter() for the reasons for making a copy here.
const Hooks hooks = ms_hooks;
for ( Hooks::const_iterator it = hooks.begin(); it != hooks.end(); ++it )
{
(*it)->Exit(dialog);
}
}