};
-
-#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
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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_
--- /dev/null
+/////////////////////////////////////////////////////////////////////////////
+// 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);
+}