| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: wx/modalhook.h
- // Purpose: Public interface of wxModalDialogHook class.
- // Author: Vadim Zeitlin
- // Copyright: (c) 2013 Vadim Zeitlin <vadim@wxwidgets.org>
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- Allows to intercept all modal dialog calls.
- This class can be used to hook into normal modal dialog handling for some
- special needs. One of the most common use cases is for testing: as
- automatic tests can't continue if a modal dialog is shown while they run,
- this class can be used to avoid showing the modal dialogs during unattended
- execution. wxModalDialogHook can also be used for disabling some background
- operation while a modal dialog is shown.
- To install a modal dialog hook, you need to derive your own class from this
- one and implement its pure virtual Enter() method. Then simply create an
- object of your class and call Register() on it to start receiving calls to
- your overridden Enter() (and possibly Exit()) methods:
- @code
- class MyModalDialogHook : public wxModalDialogHook
- {
- protected:
- virtual int Enter(wxDialog* dialog)
- {
- // Just for demonstration purposes, intercept all uses of
- // wxFileDialog. Notice that this doesn't provide any real
- // sandboxing, of course, the program can still read and write
- // files by not using wxFileDialog to ask the user for their
- // names.
- if ( wxDynamicCast(dialog, wxFileDialog) )
- {
- wxLogError("Access to file system disallowed.");
- // Skip showing the file dialog entirely.
- return wxID_CANCEL;
- }
- m_lastEnter = wxDateTime::Now();
- // Allow the dialog to be shown as usual.
- return wxID_NONE;
- }
- virtual void Exit(wxDialog* dialog)
- {
- // Again, just for demonstration purposes, show how long did
- // the user take to dismiss the dialog. Notice that we
- // shouldn't use wxLogMessage() here as this would result in
- // another modal dialog call and hence infinite recursion. In
- // general, the hooks should be as unintrusive as possible.
- wxLogDebug("%s dialog took %s to be dismissed",
- dialog->GetClassInfo()->GetClassName(),
- (wxDateTime::Now() - m_lastEnter).Format());
- }
- };
- class MyApp : public wxApp
- {
- public:
- virtual bool OnInit()
- {
- ...
- m_myHook.Register();
- ...
- }
- private:
- MyModalDialogHook m_myHook;
- };
- @endcode
- @since 2.9.5
- */
- class wxModalDialogHook
- {
- public:
- /**
- Default and trivial constructor.
- The constructor doesn't do anything, call Register() to make this hook
- active.
- */
- wxModalDialogHook();
- /**
- Destructor unregisters the hook if it's currently active.
- */
- virtual ~wxModalDialogHook();
- /**
- Register this hook as being active.
- After registering the hook, its Enter() and Exit() methods will be
- called whenever a modal dialog is shown.
- Notice that the order of registration matters: the last hook registered
- is called first, and if its Enter() returns a value different from
- ::wxID_NONE, the subsequent hooks are skipped.
- It is an error to register the same hook twice.
- */
- void Register();
- /**
- Unregister this hook.
- Notice that is done automatically from the destructor, so usually
- calling this method explicitly is unnecessary.
- The hook must be currently registered.
- */
- void Unregister();
- protected:
- /**
- Called by wxWidgets before showing any modal dialogs.
- Override this to be notified whenever a modal dialog is about to be
- shown.
- If the return value of this method is ::wxID_NONE, the dialog is shown
- as usual and Exit() will be called when it is dismissed. If the return
- value is anything else, the dialog is not shown at all and its
- wxDialog::ShowModal() simply returns with the given result. In this
- case, Exit() won't be called neither.
- @param dialog The dialog about to be shown, never @NULL.
- @return wxID_NONE to continue with showing the dialog or anything else
- to skip showing the dialog and just return this value from its
- ShowModal().
- */
- virtual int Enter(wxDialog* dialog) = 0;
- /**
- Called by wxWidgets after dismissing the modal dialog.
- Notice that it won't be called if Enter() hadn't been called because
- another modal hook, registered after this one, intercepted the dialog
- or if our Enter() was called but returned a value different from
- ::wxID_NONE.
- @param dialog The dialog that was shown and dismissed, never @NULL.
- */
- virtual void Exit(wxDialog* dialog);
- };
|