From: Václav Slavík Date: Tue, 18 Sep 2001 22:33:38 +0000 (+0000) Subject: wxDialog for wxUniv X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0e0de6b8aa49309ba439fcfd7251967915749c09 wxDialog for wxUniv git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11639 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dialog.h b/include/wx/dialog.h index 41f00bde3a..b3d75ccfbb 100644 --- a/include/wx/dialog.h +++ b/include/wx/dialog.h @@ -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 index 0000000000..fb43ddb039 --- /dev/null +++ b/include/wx/univ/dialog.h @@ -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 index 0000000000..6a29dbf93d --- /dev/null +++ b/src/univ/dialog.cpp @@ -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); +}