From 2e902799df6298ad4c75b4c565a0baf9cb7f7ab8 Mon Sep 17 00:00:00 2001 From: Pasi Matilainen Date: Wed, 22 Aug 2012 11:27:36 +0300 Subject: [PATCH] Sand box support, fix for the file dialogs. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - Also get rid of all deprecated calls Task-number: QTBUG-21609 Change-Id: I284587517537c7be4229d99637c6907d7e7652a5 Reviewed-by: Christoph Schleifenbaum Reviewed-by: Morten Johan Sørvig --- .../platforms/cocoa/qcocoafiledialoghelper.mm | 87 +++++++++++----------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index c8ff1f2..872a5cb 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -135,7 +135,8 @@ typedef QSharedPointer SharedPointerFileDialogOptions; mOpenPanel = 0; } - [mSavePanel setLevel:NSModalPanelWindowLevel]; + if ([mSavePanel respondsToSelector:@selector(setLevel:)]) + [mSavePanel setLevel:NSModalPanelWindowLevel]; [mSavePanel setDelegate:self]; mReturnCode = -1; mHelper = helper; @@ -179,7 +180,8 @@ typedef QSharedPointer SharedPointerFileDialogOptions; delete mSelectedNameFilter; delete mCurrentSelection; - [mSavePanel orderOut:mSavePanel]; + if ([mSavePanel respondsToSelector:@selector(orderOut:)]) + [mSavePanel orderOut:mSavePanel]; [mSavePanel setAccessoryView:nil]; [mPopUpButton release]; [mTextField release]; @@ -212,38 +214,40 @@ static QString strippedText(QString s) - (void)closePanel { - *mCurrentSelection = QT_PREPEND_NAMESPACE(QCFString::toQString)([mSavePanel filename]); - [mSavePanel close]; + *mCurrentSelection = QT_PREPEND_NAMESPACE(QCFString::toQString)([[mSavePanel URL] path]); + if ([mSavePanel respondsToSelector:@selector(closePanel:)]) + [mSavePanel close]; } - (void)showModelessPanel { if (mOpenPanel){ QFileInfo info(*mCurrentSelection); - NSString *filename = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.fileName()); NSString *filepath = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath()); bool selectable = (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) || [self panel:nil shouldShowFilename:filepath]; - [mOpenPanel - beginForDirectory:mCurrentDir - file:selectable ? filename : nil - types:nil - modelessDelegate:self - didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) - contextInfo:nil]; + + [mOpenPanel setAllowedFileTypes:nil]; + [mOpenPanel setDirectoryURL:selectable ? [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath())] + : [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.path())]]; + [mOpenPanel beginWithCompletionHandler:^(NSInteger result){ + mReturnCode = result; + if (mHelper) + mHelper->QNSOpenSavePanelDelegate_panelClosed(result == NSOKButton); + }]; } } - (BOOL)runApplicationModalPanel { QFileInfo info(*mCurrentSelection); - NSString *filename = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.fileName()); NSString *filepath = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath()); bool selectable = (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) || [self panel:nil shouldShowFilename:filepath]; - mReturnCode = [mSavePanel - runModalForDirectory:mCurrentDir - file:selectable ? filename : @"untitled"]; + + [mOpenPanel setDirectoryURL:selectable ? [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath())] + : [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.path())]]; + mReturnCode = [mOpenPanel runModal]; QAbstractEventDispatcher::instance()->interrupt(); return (mReturnCode == NSOKButton); @@ -257,18 +261,19 @@ static QString strippedText(QString s) - (void)showWindowModalSheet:(QWindow *)parent { QFileInfo info(*mCurrentSelection); - NSString *filename = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.fileName()); NSString *filepath = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath()); bool selectable = (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) || [self panel:nil shouldShowFilename:filepath]; + + [mOpenPanel setDirectoryURL:selectable ? [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath())] + : [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.path())]]; NSWindow *nsparent = static_cast(qGuiApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parent)); - [mSavePanel - beginSheetForDirectory:mCurrentDir - file:selectable ? filename : nil - modalForWindow:nsparent - modalDelegate:self - didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:) - contextInfo:nil]; + + [mSavePanel beginSheetModalForWindow:nsparent completionHandler:^(NSInteger result){ + mReturnCode = result; + if (mHelper) + mHelper->QNSOpenSavePanelDelegate_panelClosed(result == NSOKButton); + }]; } - (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename @@ -345,7 +350,8 @@ static QString strippedText(QString s) Q_UNUSED(sender); QString selection = mNameFilterDropDownList->value([mPopUpButton indexOfSelectedItem]); *mSelectedNameFilter = [self findStrippedFilterWithVisualFilterName:selection]; - [mSavePanel validateVisibleColumns]; + if ([mSavePanel respondsToSelector:@selector(validateVisibleColumns:)]) + [mSavePanel validateVisibleColumns]; [self updateProperties]; if (mHelper) mHelper->QNSOpenSavePanelDelegate_filterSelected([mPopUpButton indexOfSelectedItem]); @@ -358,11 +364,15 @@ static QString strippedText(QString s) - (QStringList)selectedFiles { - if (mOpenPanel) - return QT_PREPEND_NAMESPACE(qt_mac_NSArrayToQStringList)([mOpenPanel filenames]); - else{ + if (mOpenPanel) { + QStringList result; + NSArray* array = [mOpenPanel URLs]; + for (NSUInteger i=0; i<[array count]; ++i) + result << QCFString::toQString([[array objectAtIndex:i] path]); + return result; + } else { QStringList result; - QString filename = QT_PREPEND_NAMESPACE(QCFString::toQString)([mSavePanel filename]); + QString filename = QT_PREPEND_NAMESPACE(QCFString::toQString)([[mSavePanel URL] path]); result << filename.remove(QLatin1String("___qt_very_unlikely_prefix_")); return result; } @@ -392,15 +402,17 @@ static QString strippedText(QString s) ext.prepend(defaultSuffix); [mSavePanel setAllowedFileTypes:ext.isEmpty() ? nil : QT_PREPEND_NAMESPACE(qt_mac_QStringListToNSMutableArray(ext))]; - if ([mSavePanel isVisible]) - [mOpenPanel validateVisibleColumns]; + if ([mOpenPanel respondsToSelector:@selector(isVisible)] && [mSavePanel isVisible]) { + if ([mOpenPanel respondsToSelector:@selector(validateVisibleColumns)]) + [mOpenPanel validateVisibleColumns]; + } } - (void)panelSelectionDidChange:(id)sender { Q_UNUSED(sender); if (mHelper) { - QString selection = QT_PREPEND_NAMESPACE(QCFString::toQString([mSavePanel filename])); + QString selection = QT_PREPEND_NAMESPACE(QCFString::toQString([[mSavePanel URL] path])); if (selection != mCurrentSelection) { *mCurrentSelection = selection; mHelper->QNSOpenSavePanelDelegate_selectionChanged(selection); @@ -408,15 +420,6 @@ static QString strippedText(QString s) } } -- (void)openPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo -{ - Q_UNUSED(panel); - Q_UNUSED(contextInfo); - mReturnCode = returnCode; - if (mHelper) - mHelper->QNSOpenSavePanelDelegate_panelClosed(returnCode == NSOKButton); -} - - (void)panel:(id)sender directoryDidChange:(NSString *)path { Q_UNUSED(sender); @@ -559,7 +562,7 @@ extern void qt_mac_to_pascal_string(QString s, Str255 str, TextEncoding encoding void QCocoaFileDialogHelper::setDirectory(const QString &directory) { QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast(mDelegate); - [delegate->mSavePanel setDirectory:QCFString::toNSString(directory)]; + [delegate->mSavePanel setDirectoryURL:[NSURL fileURLWithPath:QCFString::toNSString(directory)]]; } QString QCocoaFileDialogHelper::directory() const -- 2.7.4