]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/osx/cocoa/dirdlg.mm
fixing class
[wxWidgets.git] / src / osx / cocoa / dirdlg.mm
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/osx/cocoa/dirdlg.mm
3// Purpose: wxDirDialog
4// Author: Stefan Csomor
5// Modified by:
6// Created: 2008-08-30
7// RCS-ID: $Id$
8// Copyright: (c) Stefan Csomor
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx.h".
21#include "wx/wxprec.h"
22
23#if wxUSE_DIRDLG && !defined(__WXUNIVERSAL__)
24
25#include "wx/dirdlg.h"
26
27#ifndef WX_PRECOMP
28 #include "wx/msgdlg.h"
29 #include "wx/filedlg.h"
30 #include "wx/app.h"
31#endif
32
33#include "wx/filename.h"
34#include "wx/evtloop.h"
35#include "wx/testing.h"
36
37#include "wx/osx/private.h"
38
39IMPLEMENT_CLASS(wxDirDialog, wxDialog)
40
41wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
42 const wxString& defaultPath, long style, const wxPoint& WXUNUSED(pos),
43 const wxSize& WXUNUSED(size), const wxString& WXUNUSED(name))
44{
45 m_parent = parent;
46
47 SetMessage( message );
48 SetWindowStyle(style);
49 SetPath(defaultPath);
50 m_sheetDelegate = [[ModalDialogDelegate alloc] init];
51 [(ModalDialogDelegate*)m_sheetDelegate setImplementation: this];
52}
53
54wxDirDialog::~wxDirDialog()
55{
56 [m_sheetDelegate release];
57}
58
59WX_NSOpenPanel wxDirDialog::OSXCreatePanel() const
60{
61 NSOpenPanel *oPanel = [NSOpenPanel openPanel];
62 [oPanel setCanChooseDirectories:YES];
63 [oPanel setResolvesAliases:YES];
64 [oPanel setCanChooseFiles:NO];
65
66 wxCFStringRef cf( m_message );
67 [oPanel setMessage:cf.AsNSString()];
68
69 if ( !HasFlag(wxDD_DIR_MUST_EXIST) )
70 [oPanel setCanCreateDirectories:YES];
71
72 return oPanel;
73}
74
75void wxDirDialog::ShowWindowModal()
76{
77 wxNonOwnedWindow* parentWindow = NULL;
78
79 if (GetParent())
80 parentWindow = dynamic_cast<wxNonOwnedWindow*>(wxGetTopLevelParent(GetParent()));
81
82 wxCHECK_RET(parentWindow, "Window modal display requires parent.");
83
84 m_modality = wxDIALOG_MODALITY_WINDOW_MODAL;
85
86 NSOpenPanel *oPanel = OSXCreatePanel();
87
88 NSWindow* nativeParent = parentWindow->GetWXWindow();
89 wxCFStringRef dir( m_path );
90 [oPanel beginSheetForDirectory:dir.AsNSString() file:nil types: nil
91 modalForWindow: nativeParent modalDelegate: m_sheetDelegate
92 didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
93 contextInfo: nil];
94}
95
96int wxDirDialog::ShowModal()
97{
98 WX_TESTING_SHOW_MODAL_HOOK();
99
100 wxCFEventLoopPauseIdleEvents pause;
101
102 NSOpenPanel *oPanel = OSXCreatePanel();
103
104 wxCFStringRef dir( m_path );
105
106 m_path = wxEmptyString;
107
108 int returnCode = -1;
109
110 returnCode = (NSInteger)[oPanel runModalForDirectory:dir.AsNSString() file:nil types:nil];
111 ModalFinishedCallback(oPanel, returnCode);
112
113 return GetReturnCode();
114}
115
116void wxDirDialog::ModalFinishedCallback(void* panel, int returnCode)
117{
118 int result = wxID_CANCEL;
119
120 if (returnCode == NSOKButton )
121 {
122 NSOpenPanel* oPanel = (NSOpenPanel*)panel;
123 SetPath( wxCFStringRef::AsString([[oPanel filenames] objectAtIndex:0]));
124 result = wxID_OK;
125 }
126 SetReturnCode(result);
127
128 if (GetModality() == wxDIALOG_MODALITY_WINDOW_MODAL)
129 SendWindowModalDialogEvent ( wxEVT_WINDOW_MODAL_DIALOG_CLOSED );
130}
131
132#endif // wxUSE_DIRDLG