]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxTLW::ShouldPreventAppExit() which can be overridden to allow closing the...
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 7 Apr 2006 00:38:49 +0000 (00:38 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 7 Apr 2006 00:38:49 +0000 (00:38 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38607 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/tlw.tex
include/wx/html/helpfrm.h
include/wx/toplevel.h
src/common/toplvcmn.cpp

index 91e4a75f3a183cead195e7e9a57b37d061d553a1..dfdf848b7af93d3c77128b6f429663359f1612d7 100644 (file)
@@ -263,6 +263,17 @@ Sets the window title.
 \helpref{wxTopLevelWindow::GetTitle}{wxtoplevelwindowgettitle}
 
 
 \helpref{wxTopLevelWindow::GetTitle}{wxtoplevelwindowgettitle}
 
 
+\membersection{wxTopLevelWindow::ShouldPreventAppExit}\label{wxtoplevelwindowshouldpreventappexit}
+
+\constfunc{virtual bool}{ShouldPreventAppExit}{\void}
+
+This virtual function is not meant to be called directly but can be overridden
+to return \false (it returns \true by default) to allow the application to
+close even if this, presumably not very important, window is still opened.
+By default, the application stays alive as long as there are any open top level
+windows.
+
+
 \membersection{wxTopLevelWindow::ShowFullScreen}\label{wxtoplevelwindowshowfullscreen}
 
 \func{bool}{ShowFullScreen}{\param{bool}{ show}, \param{long}{ style = wxFULLSCREEN\_ALL}}
 \membersection{wxTopLevelWindow::ShowFullScreen}\label{wxtoplevelwindowshowfullscreen}
 
 \func{bool}{ShowFullScreen}{\param{bool}{ show}, \param{long}{ style = wxFULLSCREEN\_ALL}}
index afe7ae849f3e7df30f29a03004f0c2af072a01b0..fa3c26e6097b84877feaf3062866e8f8b84c50af 100644 (file)
@@ -106,6 +106,10 @@ public:
     virtual void AddToolbarButtons(wxToolBar* WXUNUSED(toolBar), int WXUNUSED(style)) {};
 
 protected:
     virtual void AddToolbarButtons(wxToolBar* WXUNUSED(toolBar), int WXUNUSED(style)) {};
 
 protected:
+    // we don't want to prevent the app from closing just because a help window
+    // remains opened
+    virtual bool ShouldPreventAppExit() const { return false; }
+
     void Init(wxHtmlHelpData* data = NULL);
 
     void OnCloseWindow(wxCloseEvent& event);
     void Init(wxHtmlHelpData* data = NULL);
 
     void OnCloseWindow(wxCloseEvent& event);
index ecb99fd9cb2df875c58d4c744bdd5887bf34c8ef..dbfa07ef6bfb566ca116d1a59aeb735d919b4607 100644 (file)
@@ -229,8 +229,14 @@ protected:
     virtual bool IsOneOfBars(const wxWindow *WXUNUSED(win)) const
         { return false; }
 
     virtual bool IsOneOfBars(const wxWindow *WXUNUSED(win)) const
         { return false; }
 
-    // check if we should exit the program after deleting this top level
-    // window (this is used in common dtor and wxMSW code)
+    // this function may be overridden to return false to allow closing the
+    // application even when this top level window is still open
+    //
+    // notice that the window is still closed prior to the application exit and
+    // so it can still veto it even if it returns false from here
+    virtual bool ShouldPreventAppExit() const { return true; }
+
+    // check if we should exit the program after deleting this window
     bool IsLastBeforeExit() const;
 
     // send the iconize event, return true if processed
     bool IsLastBeforeExit() const;
 
     // send the iconize event, return true if processed
index d99000e5e24428c455252cf89662b60bddfeca28..8441f436ebd1a678027af927f82473ba5362d42e 100644 (file)
@@ -62,13 +62,11 @@ wxTopLevelWindowBase::~wxTopLevelWindowBase()
     if ( wxTheApp && wxTheApp->GetTopWindow() == this )
         wxTheApp->SetTopWindow(NULL);
 
     if ( wxTheApp && wxTheApp->GetTopWindow() == this )
         wxTheApp->SetTopWindow(NULL);
 
-    bool shouldExit = IsLastBeforeExit();
-
     wxTopLevelWindows.DeleteObject(this);
 
     wxTopLevelWindows.DeleteObject(this);
 
-    if ( shouldExit )
+    if ( IsLastBeforeExit() )
     {
     {
-        // then do it
+        // no other (important) windows left, quit the app
         wxTheApp->ExitMainLoop();
     }
 }
         wxTheApp->ExitMainLoop();
     }
 }
@@ -96,11 +94,43 @@ bool wxTopLevelWindowBase::Destroy()
 
 bool wxTopLevelWindowBase::IsLastBeforeExit() const
 {
 
 bool wxTopLevelWindowBase::IsLastBeforeExit() const
 {
-    // we exit the application if there are no more top level windows left
-    // normally but wxApp can prevent this from happening
-    return wxTopLevelWindows.GetCount() == 1 &&
-            wxTopLevelWindows.GetFirst()->GetData() == (wxWindow *)this &&
-            wxTheApp && wxTheApp->GetExitOnFrameDelete();
+    // first of all, automatically exiting the app on last window close can be
+    // completely disabled at wxTheApp level
+    if ( !wxTheApp || !wxTheApp->GetExitOnFrameDelete() )
+        return false;
+
+    wxWindowList::const_iterator i;
+    const wxWindowList::const_iterator end = wxTopLevelWindows.end();
+
+    // then decide whether we should exit at all
+    for ( i = wxTopLevelWindows.begin(); i != end; ++i )
+    {
+        wxTopLevelWindow * const win = wx_static_cast(wxTopLevelWindow *, *i);
+        if ( win->ShouldPreventAppExit() )
+        {
+            // there remains at least one important TLW, don't exit
+            return false;
+        }
+    }
+
+    // if yes, close all the other windows: this could still fail
+    for ( i = wxTopLevelWindows.begin(); i != end; ++i )
+    {
+        // don't close twice the windows which are already marked for deletion
+        wxTopLevelWindow * const win = wx_static_cast(wxTopLevelWindow *, *i);
+        if ( !wxPendingDelete.Member(win) && !win->Close() )
+        {
+            // one of the windows refused to close, don't exit
+            //
+            // NB: of course, by now some other windows could have been already
+            //     closed but there is really nothing we can do about it as we
+            //     have no way just to ask the window if it can close without
+            //     forcing it to do it
+            return false;
+        }
+    }
+
+    return true;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------