Mostly replace ungrammatical "allows to do" with correct "allows doing". Closes https://github.com/wxWidgets/wxWidgets/pull/1183
		
			
				
	
	
		
			150 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// 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 intercepting 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);
 | 
						|
};
 |