]> git.saurik.com Git - wxWidgets.git/commitdiff
wxDialog for wxUniv
authorVáclav Slavík <vslavik@fastmail.fm>
Tue, 18 Sep 2001 22:33:38 +0000 (22:33 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Tue, 18 Sep 2001 22:33:38 +0000 (22:33 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dialog.h
include/wx/univ/dialog.h [new file with mode: 0644]
src/univ/dialog.cpp [new file with mode: 0644]

index 41f00bde3a2746e72dea9f8de4617f0bc9d9657c..b3d75ccfbb25dbd41a7dedd0e3931e16b6dd57b3 100644 (file)
@@ -62,19 +62,22 @@ protected:
 };
 
 
-
-#if defined(__WXMSW__)
-    #include "wx/msw/dialog.h"
-#elif defined(__WXMOTIF__)
-    #include "wx/motif/dialog.h"
-#elif defined(__WXGTK__)
-    #include "wx/gtk/dialog.h"
-#elif defined(__WXMAC__)
-    #include "wx/mac/dialog.h"
-#elif defined(__WXPM__)
-    #include "wx/os2/dialog.h"
-#elif defined(__WXSTUBS__)
-    #include "wx/stubs/dialog.h"
+#if defined(__WXUNIVERSAL__)
+    #include "wx/univ/dialog.h"
+#else
+    #if defined(__WXMSW__)
+        #include "wx/msw/dialog.h"
+    #elif defined(__WXMOTIF__)
+        #include "wx/motif/dialog.h"
+    #elif defined(__WXGTK__)
+        #include "wx/gtk/dialog.h"
+    #elif defined(__WXMAC__)
+        #include "wx/mac/dialog.h"
+    #elif defined(__WXPM__)
+        #include "wx/os2/dialog.h"
+    #elif defined(__WXSTUBS__)
+        #include "wx/stubs/dialog.h"
+    #endif
 #endif
 
 #endif
diff --git a/include/wx/univ/dialog.h b/include/wx/univ/dialog.h
new file mode 100644 (file)
index 0000000..fb43ddb
--- /dev/null
@@ -0,0 +1,103 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        dialog.h
+// Purpose:     wxDialog class
+// Author:      Vaclav Slavik
+// Created:     2001/09/16
+// RCS-ID:      $Id$
+// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Licence:     wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_UNIV_DIALOG_H_
+#define _WX_UNIV_DIALOG_H_
+
+#ifdef __GNUG__
+    #pragma interface "univdialog.h"
+#endif
+
+WXDLLEXPORT_DATA(extern const wxChar*) wxDialogNameStr;
+class WXDLLEXPORT wxWindowDisabler;
+class WXDLLEXPORT wxEventLoop;
+
+// Dialog boxes
+class WXDLLEXPORT wxDialog : public wxDialogBase
+{
+public:
+    wxDialog() { Init(); }
+
+    // Constructor with a modal flag, but no window id - the old convention
+    wxDialog(wxWindow *parent,
+             const wxString& title, bool modal,
+             int x = -1, int y= -1, int width = 500, int height = 500,
+             long style = wxDEFAULT_DIALOG_STYLE,
+             const wxString& name = wxDialogNameStr)
+    {
+        long modalStyle = modal ? wxDIALOG_MODAL : wxDIALOG_MODELESS ;
+        Init();
+        Create(parent, -1, title, wxPoint(x, y), wxSize(width, height),
+               style | modalStyle, name);
+    }
+    
+    ~wxDialog();
+
+    // Constructor with no modal flag - the new convention.
+    wxDialog(wxWindow *parent, wxWindowID id,
+             const wxString& title,
+             const wxPoint& pos = wxDefaultPosition,
+             const wxSize& size = wxDefaultSize,
+             long style = wxDEFAULT_DIALOG_STYLE,
+             const wxString& name = wxDialogNameStr)
+    {
+        Init();
+        Create(parent, id, title, pos, size, style, name);
+    }
+
+    bool Create(wxWindow *parent, wxWindowID id,
+                const wxString& title,
+                const wxPoint& pos = wxDefaultPosition,
+                const wxSize& size = wxDefaultSize,
+                long style = wxDEFAULT_DIALOG_STYLE,
+                const wxString& name = wxDialogNameStr);
+
+    void SetModal(bool flag);
+    virtual bool IsModal() const;
+
+    // For now, same as Show(TRUE) but returns return code
+    virtual int ShowModal();
+
+    // may be called to terminate the dialog with the given return code
+    virtual void EndModal(int retCode);
+
+    // returns TRUE if we're in a modal loop
+    bool IsModalShowing() const;
+
+    bool Show(bool show);
+
+    // implementation only from now on
+    // -------------------------------
+
+    // event handlers
+    void OnCloseWindow(wxCloseEvent& event);
+    void OnOK(wxCommandEvent& event);
+    void OnApply(wxCommandEvent& event);
+    void OnCancel(wxCommandEvent& event);
+
+protected:
+    // common part of all ctors
+    void Init();
+
+private:
+    // while we are showing a modal dialog we disable the other windows using
+    // this object
+    wxWindowDisabler *m_windowDisabler;
+    // modal dialog runs its own event loop
+    wxEventLoop *m_eventLoop;
+    // is modal right now?
+    bool m_isShowingModal;
+
+    DECLARE_DYNAMIC_CLASS(wxDialog)
+    DECLARE_EVENT_TABLE()
+};
+
+#endif
+    // _WX_UNIV_DIALOG_H_
diff --git a/src/univ/dialog.cpp b/src/univ/dialog.cpp
new file mode 100644 (file)
index 0000000..6a29dbf
--- /dev/null
@@ -0,0 +1,209 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/univ/dialog.cpp
+// Author:      Robert Roebling, Vaclav Slavik
+// Id:          $Id$
+// Copyright:   (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "univdialog.h"
+#endif
+
+#include "wx/dialog.h"
+#include "wx/utils.h"
+#include "wx/evtloop.h"
+#include "wx/app.h"
+
+//-----------------------------------------------------------------------------
+// wxDialog
+//-----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(wxDialog,wxDialogBase)
+    EVT_BUTTON  (wxID_OK,       wxDialog::OnOK)
+    EVT_BUTTON  (wxID_CANCEL,   wxDialog::OnCancel)
+    EVT_BUTTON  (wxID_APPLY,    wxDialog::OnApply)
+    EVT_CLOSE   (wxDialog::OnCloseWindow)
+END_EVENT_TABLE()
+
+IMPLEMENT_DYNAMIC_CLASS(wxDialog,wxTopLevelWindow)
+
+void wxDialog::Init()
+{
+    m_returnCode = 0;
+    m_windowDisabler = NULL;
+    m_eventLoop = NULL;
+    m_isShowingModal = FALSE;
+}
+
+wxDialog::~wxDialog()
+{
+    delete m_eventLoop;
+}
+
+bool wxDialog::Create(wxWindow *parent,
+                      wxWindowID id, const wxString &title,
+                      const wxPoint &pos, const wxSize &size,
+                      long style, const wxString &name)
+{
+    SetExtraStyle(GetExtraStyle() | wxTLW_EX_DIALOG);
+
+    // all dialogs should have tab traversal enabled
+    style |= wxTAB_TRAVERSAL;
+
+    return wxTopLevelWindow::Create(parent, id, title, pos, size, style, name);
+}
+
+void wxDialog::OnApply(wxCommandEvent &WXUNUSED(event))
+{
+    if ( Validate() ) 
+        TransferDataFromWindow();
+}
+
+void wxDialog::OnCancel(wxCommandEvent &WXUNUSED(event))
+{
+    if ( IsModal() )
+    {
+        EndModal(wxID_CANCEL);
+    }
+    else
+    {
+        SetReturnCode(wxID_CANCEL);
+        Show(FALSE);
+    }
+}
+
+void wxDialog::OnOK(wxCommandEvent &WXUNUSED(event))
+{
+    if ( Validate() && TransferDataFromWindow() )
+    {
+        if ( IsModal() )
+        {
+            EndModal(wxID_OK);
+        }
+        else
+        {
+            SetReturnCode(wxID_OK);
+            Show(FALSE);
+        }
+    }
+}
+
+void wxDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
+{
+    // We'll send a Cancel message by default,
+    // which may close the dialog.
+    // Check for looping if the Cancel event handler calls Close().
+
+    // Note that if a cancel button and handler aren't present in the dialog,
+    // nothing will happen when you close the dialog via the window manager, or
+    // via Close().
+    // We wouldn't want to destroy the dialog by default, since the dialog may have been
+    // created on the stack.
+    // However, this does mean that calling dialog->Close() won't delete the dialog
+    // unless the handler for wxID_CANCEL does so. So use Destroy() if you want to be
+    // sure to destroy the dialog.
+    // The default OnCancel (above) simply ends a modal dialog, and hides a modeless dialog.
+
+    static wxList s_closing;
+
+    if (s_closing.Member(this))
+        return;   // no loops
+
+    s_closing.Append(this);
+
+    wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
+    cancelEvent.SetEventObject(this);
+    GetEventHandler()->ProcessEvent(cancelEvent);
+    s_closing.DeleteObject(this);
+}
+
+bool wxDialog::Show(bool show)
+{
+    if ( !show )
+    {
+        // if we had disabled other app windows, reenable them back now because
+        // if they stay disabled Windows will activate another window (one
+        // which is enabled, anyhow) and we will lose activation
+        if ( m_windowDisabler )
+        {
+            delete m_windowDisabler;
+            m_windowDisabler = NULL;
+        }
+
+        if ( IsModal() )
+            EndModal(wxID_CANCEL);
+    }
+
+    bool ret = wxDialogBase::Show(show);
+
+    if ( show ) 
+        InitDialog();
+
+    return ret;
+}
+
+bool wxDialog::IsModal() const
+{
+    return m_isShowingModal;
+}
+
+void wxDialog::SetModal(bool WXUNUSED(flag))
+{
+    wxFAIL_MSG( wxT("wxDialog:SetModal obsolete now") );
+}
+
+int wxDialog::ShowModal()
+{
+    if ( IsModal() )
+    {
+       wxFAIL_MSG( wxT("wxDialog:ShowModal called twice") );
+       return GetReturnCode();
+    }
+
+    // use the apps top level window as parent if none given unless explicitly
+    // forbidden
+    if ( !GetParent() && !(GetWindowStyleFlag() & wxDIALOG_NO_PARENT) )
+    {
+        wxWindow *parent = wxTheApp->GetTopWindow();
+        if ( parent && parent != this )
+        {
+            m_parent = parent;
+        }
+    }
+
+    wxBusyCursorSuspender cs; // temporarily suppress the busy cursor
+
+    Show(TRUE);
+
+    m_isShowingModal = TRUE;
+
+    wxASSERT_MSG( !m_windowDisabler, _T("disabling windows twice?") );
+
+    m_windowDisabler = new wxWindowDisabler(this);
+    if ( !m_eventLoop )
+        m_eventLoop = new wxEventLoop;
+
+    m_eventLoop->Run();
+
+    return GetReturnCode();
+}
+
+void wxDialog::EndModal(int retCode)
+{
+    wxASSERT_MSG( m_eventLoop, _T("wxDialog is not modal") );
+
+    SetReturnCode(retCode);
+
+    if ( !IsModal() )
+    {
+        wxFAIL_MSG( wxT("wxDialog:EndModal called twice") );
+        return;
+    }
+
+    m_isShowingModal = FALSE;
+    
+    m_eventLoop->Exit();
+
+    Show(FALSE);
+}