// Author: Stefan Csomor
// Modified by:
// Created: 1998-01-01
-// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#include "wx/filename.h"
#include "wx/osx/private.h"
+#include "wx/modalhook.h"
#ifndef __DARWIN__
#include <Navigation.h>
{
public:
OpenUserDataRec( wxFileDialog* dialog );
-
+
bool FilterCallback( AEDesc *theItem, void *info, NavFilterModes filterMode );
void EventProc( NavEventCallbackMessage inSelector, NavCBRecPtr ioParams );
int GetCurrentFilter() const {return m_currentfilter;}
CFArrayRef GetMenuItems() const { return m_menuitems;}
-
-
+
+
private:
void EventProcCBEvent( NavCBRecPtr ioParams );
void EventProcCBEventMouseDown( NavCBRecPtr ioParams);
void EventProcCBAdjustRect( NavCBRecPtr ioParams );
bool CheckFile( const wxString &filename , OSType type);
void MakeUserDataRec( const wxString& filter);
-
+
wxFileDialog* m_dialog;
int m_currentfilter;
wxString m_defaultLocation;
bool m_saveMode;
SInt16 m_lastRight;
SInt16 m_lastBottom;
- bool m_firstAdjustRect;
+ bool m_controlAdded;
};
OpenUserDataRec::OpenUserDataRec( wxFileDialog* d)
{
m_dialog = d;
- m_firstAdjustRect = true;
+ m_controlAdded = false;
m_saveMode = m_dialog->HasFdFlag(wxFD_SAVE);
-
+
m_defaultLocation = m_dialog->GetDirectory();
MakeUserDataRec(m_dialog->GetWildcard());
m_currentfilter = m_dialog->GetFilterIndex();
-
+
m_menuitems = NULL;
-
+
size_t numFilters = m_extensions.GetCount();
if (numFilters)
{
EventProcCBEventMouseDown(callBackParms);
break;
}
- }
+ }
}
void OpenUserDataRec::EventProcCBEventMouseDown(NavCBRecPtr callBackParms)
EventRecord *evt = callBackParms->eventData.eventDataParms.event;
Point where = evt->where;
QDGlobalToLocalPoint(GetWindowPort(callBackParms->window), &where);
-
+
ControlRef whichControl = FindControlUnderMouse(where, callBackParms->window, NULL);
if (whichControl != NULL)
{
ControlKind theKind;
GetControlKind(whichControl, &theKind);
-
+
// Moving the focus if we clicked in an focusable control
- if ((theKind.kind == kControlKindEditUnicodeText) ||
- (theKind.kind == kControlKindEditText) ||
- (theKind.kind == kControlKindDataBrowser) ||
+ if ((theKind.kind == kControlKindEditUnicodeText) ||
+ (theKind.kind == kControlKindEditText) ||
+ (theKind.kind == kControlKindDataBrowser) ||
(theKind.kind == kControlKindListBox))
{
ControlRef currentlyFocusedControl;
if (noErr == ::AECreateDesc(typeFSRef, &theFile, sizeof(FSRef), &theLocation))
::NavCustomControl(ioParams->context, kNavCtlSetLocation, (void *) &theLocation);
}
-
+
if( m_extensions.GetCount() > 0 )
{
NavMenuItemSpec menuItem;
menuItem.menuType = m_currentfilter;
::NavCustomControl(ioParams->context, kNavCtlSelectCustomType, &menuItem);
}
-
+
if (m_dialog->GetExtraControl())
{
+ m_controlAdded = true;
ControlRef ref = m_dialog->GetExtraControl()->GetPeer()->GetControlRef();
NavCustomControl(ioParams->context, kNavCtlAddControl, ref);
}
-
+
}
void OpenUserDataRec::EventProcCBPopupMenuSelect(NavCBRecPtr ioParams)
{
NavMenuItemSpec * menu = (NavMenuItemSpec *) ioParams->eventData.eventDataParms.param ;
const size_t numFilters = m_extensions.GetCount();
-
+
if ( menu->menuType < numFilters )
{
m_currentfilter = menu->menuType ;
if ( m_saveMode )
{
int i = menu->menuType ;
-
+
// isolate the first extension string
wxString firstExtension = m_extensions[i].BeforeFirst('|').BeforeFirst(';');
-
+
wxString extension = firstExtension.AfterLast('.') ;
wxString sfilename ;
-
+
wxCFStringRef cfString( wxCFRetain( NavDialogGetSaveFileName( ioParams->context ) ) );
sfilename = cfString.AsString() ;
-
+
int pos = sfilename.Find('.', true) ;
if ( pos != wxNOT_FOUND && extension != wxT("*") )
{
void OpenUserDataRec::EventProcCBCustomize(NavCBRecPtr ioParams)
{
wxWindow* control = m_dialog->GetExtraControl();
-
+
if ( control )
{
SInt16 neededRight, neededBottom;
-
+
wxSize size = m_dialog->GetExtraControl()->GetSize();
neededRight = ioParams->customRect.left + size.x;
neededBottom = ioParams->customRect.top + size.y;
-
+
if (ioParams->customRect.right == 0 && ioParams->customRect.bottom == 0)
{
ioParams->customRect.right = neededRight;
ioParams->customRect.bottom = neededBottom;
}
- else
+ else
{
if ( ioParams->customRect.right != m_lastRight )
{
void OpenUserDataRec::EventProcCBAdjustRect(NavCBRecPtr ioParams)
{
wxWindow* control = m_dialog->GetExtraControl();
-
- if ( control )
+
+ if ( control && m_controlAdded)
{
- // workaround because the first time this is called it still seems to be
- // in composited coordinates, while later it is not
- if ( !m_firstAdjustRect )
- {
- control->Move(ioParams->customRect.left , ioParams->customRect.top);
- }
- m_firstAdjustRect = false;
+ control->SetSize(ioParams->customRect.left , ioParams->customRect.top,
+ ioParams->customRect.right - ioParams->customRect.left,
+ ioParams->customRect.bottom - ioParams->customRect.top);
}
}
wxString extension = m_extensions[i];
// Remove leading '*'
- if (extension.length() && (extension.GetChar(0) == '*'))
+ if ( !extension.empty() && (extension.GetChar(0) == '*') )
extension = extension.Mid( 1 );
// Remove leading '.'
- if (extension.length() && (extension.GetChar(0) == '.'))
+ if ( !extension.empty() && (extension.GetChar(0) == '.') )
extension = extension.Mid( 1 );
if (wxFileName::MacFindDefaultTypeAndCreator( extension, &fileType, &creator ))
// check if a folder is a package before deciding what to do.
NavFileOrFolderInfo* theInfo = (NavFileOrFolderInfo*) info ;
FSRef fsref;
-
+
if ( theInfo->isFolder )
{
// check bundle bit (using Finder Services - used by OS9 on some bundles)
FSCatalogInfo catalogInfo;
if (FSGetCatalogInfo (&fsref, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL) != noErr)
return true;
-
+
// Check bundle item (using Launch Services - used by OS-X through info.plist or APP)
LSItemInfoRecord lsInfo;
if (LSCopyItemInfoForRef(&fsref, kLSRequestBasicFlagsOnly, &lsInfo ) != noErr)
return true;
-
+
// If it's not a bundle, then it's a normal folder and it passes our filter
FileInfo *fileInfo = (FileInfo *) catalogInfo.finderInfo;
if ( !(fileInfo->finderFlags & kHasBundle) &&
}
}
}
-
+
return true;
}
}
-wxFileDialog::wxFileDialog(
+void wxFileDialog::Init()
+{
+}
+
+void wxFileDialog::Create(
wxWindow *parent, const wxString& message,
const wxString& defaultDir, const wxString& defaultFileName, const wxString& wildCard,
long style, const wxPoint& pos, const wxSize& sz, const wxString& name)
- : wxFileDialogBase(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name)
{
+ wxFileDialogBase::Create(parent, message, defaultDir, defaultFileName, wildCard, style, pos, sz, name);
+
wxASSERT_MSG( NavServicesAvailable() , wxT("Navigation Services are not running") ) ;
}
+void wxFileDialog::SetupExtraControls(WXWindow nativeWindow)
+{
+ wxTopLevelWindow::Create( GetParent(), nativeWindow );
+
+ if (HasExtraControlCreator())
+ {
+ CreateExtraControl();
+ }
+}
+
int wxFileDialog::ShowModal()
{
+ WX_HOOK_MODAL_DIALOG();
+
m_paths.Empty();
m_fileNames.Empty();
-
+
OSErr err;
NavDialogCreationOptions dialogCreateOptions;
NavDialogRef dialog;
NavObjectFilterUPP navFilterUPP = NULL;
OpenUserDataRec myData( this );
-
+
dialogCreateOptions.popupExtension = myData.GetMenuItems();
-
+
if (HasFdFlag(wxFD_SAVE))
{
dialogCreateOptions.optionFlags |= kNavDontAutoTranslate;
(void *) &myData, // inClientData
&dialog );
}
-
- wxNonOwnedWindow::Create( GetParent(), NavDialogGetWindow(dialog) );
- if (HasExtraControlCreator())
- {
- CreateExtraControl();
- }
-
+ SetupExtraControls(NavDialogGetWindow(dialog));
+
if (err == noErr)
+ {
+ wxDialog::OSXBeginModalDialog();
err = ::NavDialogRun(dialog);
+ wxDialog::OSXEndModalDialog();
+ }
// clean up filter related data, etc.
if (navFilterUPP)
m_dir = wxPathOnly(m_path);
}
+ UnsubclassWin();
::NavDisposeReply(&navReply);
::NavDialogDispose(dialog);