/////////////////////////////////////////////////////////////////////////////
-// Name: src/mac/carbon/dialog.cpp
+// Name: src/osx/carbon/dialog.cpp
// Purpose: wxDialog class
// Author: Stefan Csomor
// Modified by:
#include "wx/settings.h"
#endif // WX_PRECOMP
-#include "wx/osx/uma.h"
+#include "wx/osx/private.h"
+#include "wx/evtloop.h"
-
-// Lists to keep track of windows, so we can disable/enable them
-// for modal dialogs
-wxList wxModalDialogs;
-
-IMPLEMENT_DYNAMIC_CLASS(wxDialog, wxTopLevelWindow)
-
-void wxDialog::Init()
-{
- m_isModalStyle = false;
-}
-
-bool wxDialog::Create( wxWindow *parent,
- wxWindowID id,
- const wxString& title,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxString& name )
-{
- SetExtraStyle( GetExtraStyle() | wxTOPLEVEL_EX_DIALOG );
-
- // All dialogs should really have this style...
- style |= wxTAB_TRAVERSAL;
-
- // ...but not these styles
- style &= ~(wxYES | wxOK | wxNO); // | wxCANCEL
-
- if ( !wxTopLevelWindow::Create( parent, id, title, pos, size, style, name ) )
- return false;
-
- return true;
-}
-
-void wxDialog::SetModal( bool flag )
-{
- if ( flag )
- {
- m_isModalStyle = true;
-
- SetWindowModality( (WindowRef)MacGetWindowRef(), kWindowModalityAppModal, NULL ) ;
- }
- else
- {
- m_isModalStyle = false;
- }
-}
-
-wxDialog::~wxDialog()
-{
- m_isBeingDeleted = true;
-
- // if the dialog is modal, this will end its event loop
- Show(false);
-}
-
-// On mac command-stop does the same thing as Esc, let the base class know
-// about it
-bool wxDialog::IsEscapeKey(const wxKeyEvent& event)
-{
- if ( event.GetKeyCode() == '.' && event.GetModifiers() == wxMOD_CMD )
- return true;
-
- return wxDialogBase::IsEscapeKey(event);
-}
-
-bool wxDialog::IsModal() const
+void wxDialog::EndWindowModal()
{
- return wxModalDialogs.Find((wxDialog *)this) != NULL; // const_cast
- // return m_isModalStyle;
+ // Nothing to do for now.
}
-
-bool wxDialog::Show(bool show)
+void wxDialog::DoShowWindowModal()
{
- if ( !wxDialogBase::Show(show) )
- // nothing to do
- return false;
-
- if (show && CanDoLayoutAdaptation())
- DoLayoutAdaptation();
-
- if ( show )
- // usually will result in TransferDataToWindow() being called
- InitDialog();
-
- HiliteMenu(0);
-
- if ( m_isModalStyle )
- {
- if ( show )
- {
- DoShowModal();
- }
- else // end of modal dialog
- {
- // this will cause IsModalShowing() return false and our local
- // message loop will terminate
- wxModalDialogs.DeleteObject(this);
- }
- }
-
- return true;
+ // If someone wants to add support for this to wxOSX Carbon, here would
+ // be the place to start: http://trac.wxwidgets.org/ticket/9459
+ // Unfortunately, supporting sheets in Carbon isn't as straightforward
+ // as with Cocoa, so it will probably take some tweaking.
+
+ m_modality = wxDIALOG_MODALITY_APP_MODAL;
+ ShowModal();
+ SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED );
}
void wxDialog::DoShowModal()
{
- wxCHECK_RET( !IsModal(), wxT("DoShowModal() called twice") );
-
- wxModalDialogs.Append(this);
SetFocus() ;
- WindowRef windowRef = (WindowRef) MacGetWindowRef();
- WindowGroupRef windowGroup;
- WindowGroupRef formerParentGroup;
+ WindowRef windowRef = (WindowRef) GetWXWindow();
+ WindowGroupRef windowGroup = NULL;
+ WindowGroupRef formerParentGroup = NULL;
bool resetGroupParent = false;
if ( GetParent() == NULL )
{
windowGroup = GetWindowGroup(windowRef) ;
- formerParentGroup = GetWindowGroupParent( windowGroup );
- SetWindowGroupParent( windowGroup, GetWindowGroupOfClass( kMovableModalWindowClass ) );
- resetGroupParent = true;
+ if ( windowGroup != GetWindowGroupOfClass( kMovableModalWindowClass ) )
+ {
+ formerParentGroup = GetWindowGroupParent( windowGroup );
+ SetWindowGroupParent( windowGroup, GetWindowGroupOfClass( kMovableModalWindowClass ) );
+ resetGroupParent = true;
+ }
}
BeginAppModalStateForWindow(windowRef) ;
+#if wxUSE_CONSOLE_EVENTLOOP
+ wxEventLoopGuarantor ensureHasLoop;
+#endif
+ wxEventLoopBase * const loop = wxEventLoop::GetActive();
while ( IsModal() )
- {
- wxTheApp->MacDoOneEvent() ;
- // calls process idle itself
- }
+ loop->Dispatch();
EndAppModalStateForWindow(windowRef) ;
if ( resetGroupParent )
SetWindowGroupParent( windowGroup , formerParentGroup );
}
}
-
-
-// Replacement for Show(true) for modal dialogs - returns return code
-int wxDialog::ShowModal()
-{
- if ( !m_isModalStyle )
- SetModal(true);
-
- if ( IsShown() )
- DoShowModal();
- else
- Show(true);
-
- return GetReturnCode();
-}
-
-// NB: this function (surprizingly) may be called for both modal and modeless
-// dialogs and should work for both of them
-void wxDialog::EndModal(int retCode)
-{
- SetReturnCode(retCode);
- Show(false);
- SetModal(false);
-}
-