summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/dialogs/dialogs.pri21
-rw-r--r--src/widgets/dialogs/qcolordialog_mac.mm505
-rw-r--r--src/widgets/dialogs/qfiledialog_mac.mm741
-rw-r--r--src/widgets/dialogs/qfontdialog_mac.mm676
-rw-r--r--src/widgets/dialogs/qnspanelproxy_mac.mm228
5 files changed, 0 insertions, 2171 deletions
diff --git a/src/widgets/dialogs/dialogs.pri b/src/widgets/dialogs/dialogs.pri
index f8ca43c5e4..53d1985fb5 100644
--- a/src/widgets/dialogs/dialogs.pri
+++ b/src/widgets/dialogs/dialogs.pri
@@ -20,27 +20,6 @@ HEADERS += \
dialogs/qfileinfogatherer_p.h \
dialogs/qwizard.h
-# TODO
-false:mac {
- OBJECTIVE_SOURCES += dialogs/qfiledialog_mac.mm \
- dialogs/qfontdialog_mac.mm \
- dialogs/qnspanelproxy_mac.mm
-
-# Compile qcolordialog_mac.mm with exception support, disregarding the -no-exceptions
-# configure option. (qcolordialog_mac needs to catch exceptions thrown by cocoa)
- EXCEPTION_SOURCES = dialogs/qcolordialog_mac.mm
- exceptions_compiler.commands = $$QMAKE_CXX -c
- exceptions_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
- exceptions_compiler.commands += -fexceptions
- exceptions_compiler.dependency_type = TYPE_C
- exceptions_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
- exceptions_compiler.input = EXCEPTION_SOURCES
- exceptions_compiler.variable_out = OBJECTS
- exceptions_compiler.name = compiling[exceptopns] ${QMAKE_FILE_IN}
- silent:exceptions_compiler.commands = @echo compiling[exceptopns] ${QMAKE_FILE_IN} && $$exceptions_compiler.commands
- QMAKE_EXTRA_COMPILERS += exceptions_compiler
-}
-
win32 {
HEADERS += dialogs/qwizard_win_p.h
SOURCES += dialogs/qwizard_win.cpp
diff --git a/src/widgets/dialogs/qcolordialog_mac.mm b/src/widgets/dialogs/qcolordialog_mac.mm
deleted file mode 100644
index 1496ba8300..0000000000
--- a/src/widgets/dialogs/qcolordialog_mac.mm
+++ /dev/null
@@ -1,505 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qcolordialog_p.h"
-#if !defined(QT_NO_COLORDIALOG) && defined(Q_WS_MAC)
-#include <qapplication.h>
-#include <qtimer.h>
-#include <qdialogbuttonbox.h>
-#include <qabstracteventdispatcher.h>
-#include <private/qapplication_p.h>
-#include <private/qt_mac_p.h>
-#include <qdebug.h>
-#import <AppKit/AppKit.h>
-#import <Foundation/Foundation.h>
-
-#if !CGFLOAT_DEFINED
-typedef float CGFloat; // Should only not be defined on 32-bit platforms
-#endif
-
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5
-@protocol NSWindowDelegate <NSObject>
-- (void)windowDidResize:(NSNotification *)notification;
-- (BOOL)windowShouldClose:(id)window;
-@end
-#endif
-
-QT_USE_NAMESPACE
-
-@class QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate);
-
-@interface QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) : NSObject<NSWindowDelegate> {
- NSColorPanel *mColorPanel;
- NSView *mStolenContentView;
- NSButton *mOkButton;
- NSButton *mCancelButton;
- QColorDialogPrivate *mPriv;
- QColor *mQtColor;
- CGFloat mMinWidth; // currently unused
- CGFloat mExtraHeight; // currently unused
- BOOL mHackedPanel;
- NSInteger mResultCode;
- BOOL mDialogIsExecuting;
- BOOL mResultSet;
-}
-- (id)initWithColorPanel:(NSColorPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QColorDialogPrivate *)priv;
-- (void)colorChanged:(NSNotification *)notification;
-- (void)relayout;
-- (void)onOkClicked;
-- (void)onCancelClicked;
-- (void)updateQtColor;
-- (NSColorPanel *)colorPanel;
-- (QColor)qtColor;
-- (void)finishOffWithCode:(NSInteger)result;
-- (void)showColorPanel;
-- (void)exec;
-- (void)setResultSet:(BOOL)result;
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate)
-- (id)initWithColorPanel:(NSColorPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QColorDialogPrivate *)priv
-{
- self = [super init];
-
- mColorPanel = panel;
- mStolenContentView = stolenContentView;
- mOkButton = okButton;
- mCancelButton = cancelButton;
- mPriv = priv;
- mMinWidth = 0.0;
- mExtraHeight = 0.0;
- mHackedPanel = (okButton != 0);
- mResultCode = NSCancelButton;
- mDialogIsExecuting = false;
- mResultSet = false;
-
- if (mHackedPanel) {
- [self relayout];
-
- [okButton setAction:@selector(onOkClicked)];
- [okButton setTarget:self];
-
- [cancelButton setAction:@selector(onCancelClicked)];
- [cancelButton setTarget:self];
- }
-
- [[NSNotificationCenter defaultCenter] addObserver:self
- selector:@selector(colorChanged:)
- name:NSColorPanelColorDidChangeNotification
- object:mColorPanel];
-
- mQtColor = new QColor();
- return self;
-}
-
-- (void)dealloc
-{
- QMacCocoaAutoReleasePool pool;
- if (mHackedPanel) {
- NSView *ourContentView = [mColorPanel contentView];
-
- // return stolen stuff to its rightful owner
- [mStolenContentView removeFromSuperview];
- [mColorPanel setContentView:mStolenContentView];
-
- [mOkButton release];
- [mCancelButton release];
- [ourContentView release];
- }
- [mColorPanel setDelegate:nil];
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- delete mQtColor;
- [super dealloc];
-}
-
-- (void)setResultSet:(BOOL)result
-{
- mResultSet = result;
-}
-
-- (BOOL)windowShouldClose:(id)window
-{
- Q_UNUSED(window);
- if (!mHackedPanel)
- [self updateQtColor];
- if (mDialogIsExecuting) {
- [self finishOffWithCode:NSCancelButton];
- } else {
- mResultSet = true;
- mPriv->colorDialog()->reject();
- }
- return true;
-}
-
-- (void)windowDidResize:(NSNotification *)notification
-{
- Q_UNUSED(notification);
- if (mHackedPanel)
- [self relayout];
-}
-
-- (void)colorChanged:(NSNotification *)notification
-{
- Q_UNUSED(notification);
- [self updateQtColor];
-}
-
-- (void)relayout
-{
- Q_ASSERT(mHackedPanel);
-
- NSRect rect = [[mStolenContentView superview] frame];
-
- // should a priori be kept in sync with qfontdialog_mac.mm
- const CGFloat ButtonMinWidth = 78.0; // 84.0 for Carbon
- const CGFloat ButtonMinHeight = 32.0;
- const CGFloat ButtonSpacing = 0.0;
- const CGFloat ButtonTopMargin = 0.0;
- const CGFloat ButtonBottomMargin = 7.0;
- const CGFloat ButtonSideMargin = 9.0;
-
- [mOkButton sizeToFit];
- NSSize okSizeHint = [mOkButton frame].size;
-
- [mCancelButton sizeToFit];
- NSSize cancelSizeHint = [mCancelButton frame].size;
-
- const CGFloat ButtonWidth = qMin(qMax(ButtonMinWidth,
- qMax(okSizeHint.width, cancelSizeHint.width)),
- CGFloat((rect.size.width - 2.0 * ButtonSideMargin - ButtonSpacing) * 0.5));
- const CGFloat ButtonHeight = qMax(ButtonMinHeight,
- qMax(okSizeHint.height, cancelSizeHint.height));
-
- NSRect okRect = { { rect.size.width - ButtonSideMargin - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mOkButton setFrame:okRect];
- [mOkButton setNeedsDisplay:YES];
-
- NSRect cancelRect = { { okRect.origin.x - ButtonSpacing - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mCancelButton setFrame:cancelRect];
- [mCancelButton setNeedsDisplay:YES];
-
- const CGFloat Y = ButtonBottomMargin + ButtonHeight + ButtonTopMargin;
- NSRect stolenCVRect = { { 0.0, Y },
- { rect.size.width, rect.size.height - Y } };
- [mStolenContentView setFrame:stolenCVRect];
- [mStolenContentView setNeedsDisplay:YES];
-
- [[mStolenContentView superview] setNeedsDisplay:YES];
- mMinWidth = 2 * ButtonSideMargin + ButtonSpacing + 2 * ButtonWidth;
- mExtraHeight = Y;
-}
-
-- (void)onOkClicked
-{
- Q_ASSERT(mHackedPanel);
- [[mStolenContentView window] close];
- [self updateQtColor];
- [self finishOffWithCode:NSOKButton];
-}
-
-- (void)onCancelClicked
-{
- if (mHackedPanel) {
- [[mStolenContentView window] close];
- delete mQtColor;
- mQtColor = new QColor();
- [self finishOffWithCode:NSCancelButton];
- }
-}
-
-- (void)updateQtColor
-{
- delete mQtColor;
- mQtColor = new QColor();
- NSColor *color = [mColorPanel color];
- NSString *colorSpaceName = [color colorSpaceName];
- if (colorSpaceName == NSDeviceCMYKColorSpace) {
- CGFloat cyan = 0, magenta = 0, yellow = 0, black = 0, alpha = 0;
- [color getCyan:&cyan magenta:&magenta yellow:&yellow black:&black alpha:&alpha];
- mQtColor->setCmykF(cyan, magenta, yellow, black, alpha);
- } else if (colorSpaceName == NSCalibratedRGBColorSpace || colorSpaceName == NSDeviceRGBColorSpace) {
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [color getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor->setRgbF(red, green, blue, alpha);
- } else if (colorSpaceName == NSNamedColorSpace) {
- NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor->setRgbF(red, green, blue, alpha);
- } else {
- NSColorSpace *colorSpace = [color colorSpace];
- if ([colorSpace colorSpaceModel] == NSCMYKColorSpaceModel && [color numberOfComponents] == 5){
- CGFloat components[5];
- [color getComponents:components];
- mQtColor->setCmykF(components[0], components[1], components[2], components[3], components[4]);
- } else {
- NSColor *tmpColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
- CGFloat red = 0, green = 0, blue = 0, alpha = 0;
- [tmpColor getRed:&red green:&green blue:&blue alpha:&alpha];
- mQtColor->setRgbF(red, green, blue, alpha);
- }
- }
-
- mPriv->setCurrentQColor(*mQtColor);
-}
-
-- (NSColorPanel *)colorPanel
-{
- return mColorPanel;
-}
-
-- (QColor)qtColor
-{
- return *mQtColor;
-}
-
-- (void)finishOffWithCode:(NSInteger)code
-{
- mResultCode = code;
- if (mDialogIsExecuting) {
- // We stop the current modal event loop. The control
- // will then return inside -(void)exec below.
- // It's important that the modal event loop is stopped before
- // we accept/reject QColorDialog, since QColorDialog has its
- // own event loop that needs to be stopped last.
- [NSApp stopModalWithCode:code];
- } else {
- // Since we are not in a modal event loop, we can safely close
- // down QColorDialog
- // Calling accept() or reject() can in turn call closeCocoaColorPanel.
- // This check will prevent any such recursion.
- if (!mResultSet) {
- mResultSet = true;
- if (mResultCode == NSCancelButton) {
- mPriv->colorDialog()->reject();
- } else {
- mPriv->colorDialog()->accept();
- }
- }
- }
-}
-
-- (void)showColorPanel
-{
- mDialogIsExecuting = false;
- [mColorPanel makeKeyAndOrderFront:mColorPanel];
-}
-
-- (void)exec
-{
- QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
- QMacCocoaAutoReleasePool pool;
- mDialogIsExecuting = true;
- bool modalEnded = false;
- while (!modalEnded) {
-#ifndef QT_NO_EXCEPTIONS
- @try {
- [NSApp runModalForWindow:mColorPanel];
- modalEnded = true;
- } @catch (NSException *) {
- // For some reason, NSColorPanel throws an exception when
- // clicking on 'SelectedMenuItemColor' from the 'Developer'
- // palette (tab three).
- }
-#else
- [NSApp runModalForWindow:mColorPanel];
- modalEnded = true;
-#endif
- }
-
- QAbstractEventDispatcher::instance()->interrupt();
- if (mResultCode == NSCancelButton)
- mPriv->colorDialog()->reject();
- else
- mPriv->colorDialog()->accept();
-}
-
-@end
-
-QT_BEGIN_NAMESPACE
-
-extern void macStartInterceptNSPanelCtor();
-extern void macStopInterceptNSPanelCtor();
-extern NSButton *macCreateButton(const char *text, NSView *superview);
-
-void QColorDialogPrivate::openCocoaColorPanel(const QColor &initial,
- QWidget *parent, const QString &title, QColorDialog::ColorDialogOptions options)
-{
- Q_UNUSED(parent); // we would use the parent if only NSColorPanel could be a sheet
- QMacCocoaAutoReleasePool pool;
-
- if (!delegate) {
- /*
- The standard Cocoa color panel has no OK or Cancel button and
- is created as a utility window, whereas we want something like
- the Carbon color panel. We need to take the following steps:
-
- 1. Intercept the color panel constructor to turn off the
- NSUtilityWindowMask flag. This is done by temporarily
- replacing initWithContentRect:styleMask:backing:defer:
- in NSPanel by our own method.
-
- 2. Modify the color panel so that its content view is part
- of a new content view that contains it as well as two
- buttons (OK and Cancel).
-
- 3. Lay out the original content view and the buttons when
- the color panel is shown and whenever it is resized.
-
- 4. Clean up after ourselves.
- */
-
- bool hackColorPanel = !(options & QColorDialog::NoButtons);
-
- if (hackColorPanel)
- macStartInterceptNSPanelCtor();
- NSColorPanel *colorPanel = [NSColorPanel sharedColorPanel];
- if (hackColorPanel)
- macStopInterceptNSPanelCtor();
-
- [colorPanel setHidesOnDeactivate:false];
-
- // set up the Cocoa color panel
- [colorPanel setShowsAlpha:options & QColorDialog::ShowAlphaChannel];
- [colorPanel setTitle:(NSString*)(CFStringRef)QCFString(title)];
-
- NSView *stolenContentView = 0;
- NSButton *okButton = 0;
- NSButton *cancelButton = 0;
-
- if (hackColorPanel) {
- // steal the color panel's contents view
- stolenContentView = [colorPanel contentView];
- [stolenContentView retain];
- [colorPanel setContentView:0];
-
- // create a new content view and add the stolen one as a subview
- NSRect frameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
- NSView *ourContentView = [[NSView alloc] initWithFrame:frameRect];
- [ourContentView addSubview:stolenContentView];
-
- // create OK and Cancel buttons and add these as subviews
- okButton = macCreateButton("&OK", ourContentView);
- cancelButton = macCreateButton("Cancel", ourContentView);
-
- [colorPanel setContentView:ourContentView];
- [colorPanel setDefaultButtonCell:[okButton cell]];
- }
-
- delegate = [[QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) alloc] initWithColorPanel:colorPanel
- stolenContentView:stolenContentView
- okButton:okButton
- cancelButton:cancelButton
- priv:this];
- [colorPanel setDelegate:static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate)];
- }
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) setResultSet:NO];
- setCocoaPanelColor(initial);
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) showColorPanel];
-}
-
-void QColorDialogPrivate::closeCocoaColorPanel()
-{
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) onCancelClicked];
-}
-
-void QColorDialogPrivate::releaseCocoaColorPanelDelegate()
-{
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) release];
-}
-
-void QColorDialogPrivate::mac_nativeDialogModalHelp()
-{
- // Do a queued meta-call to open the native modal dialog so it opens after the new
- // event loop has started to execute (in QDialog::exec). Using a timer rather than
- // a queued meta call is intentional to ensure that the call is only delivered when
- // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
- // running (which is the case if e.g a top-most QEventLoop has been
- // interrupted, and the second-most event loop has not yet been reactivated (regardless
- // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
- if (delegate){
- Q_Q(QColorDialog);
- QTimer::singleShot(1, q, SLOT(_q_macRunNativeAppModalPanel()));
- }
-}
-
-void QColorDialogPrivate::_q_macRunNativeAppModalPanel()
-{
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate) exec];
-}
-
-void QColorDialogPrivate::setCocoaPanelColor(const QColor &color)
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *theDelegate = static_cast<QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *>(delegate);
- NSColor *nsColor;
- const QColor::Spec spec = color.spec();
- if (spec == QColor::Cmyk) {
- nsColor = [NSColor colorWithDeviceCyan:color.cyanF()
- magenta:color.magentaF()
- yellow:color.yellowF()
- black:color.blackF()
- alpha:color.alphaF()];
- } else {
- nsColor = [NSColor colorWithCalibratedRed:color.redF()
- green:color.greenF()
- blue:color.blueF()
- alpha:color.alphaF()];
- }
- [[theDelegate colorPanel] setColor:nsColor];
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/widgets/dialogs/qfiledialog_mac.mm b/src/widgets/dialogs/qfiledialog_mac.mm
deleted file mode 100644
index 01ec736550..0000000000
--- a/src/widgets/dialogs/qfiledialog_mac.mm
+++ /dev/null
@@ -1,741 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qfiledialog.h"
-
-#ifndef QT_NO_FILEDIALOG
-
-/*****************************************************************************
- QFileDialog debug facilities
- *****************************************************************************/
-//#define DEBUG_FILEDIALOG_FILTERS
-
-#include <qapplication.h>
-#include <private/qapplication_p.h>
-#include <private/qfiledialog_p.h>
-#include <private/qt_mac_p.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
-#include <qregexp.h>
-#include <qbuffer.h>
-#include <qdebug.h>
-#include <qstringlist.h>
-#include <qaction.h>
-#include <qtextcodec.h>
-#include <qvarlengtharray.h>
-#include <qdesktopwidget.h>
-#include <stdlib.h>
-#include <qabstracteventdispatcher.h>
-#import <AppKit/NSSavePanel.h>
-#include "ui_qfiledialog.h"
-
-QT_BEGIN_NAMESPACE
-
-extern QStringList qt_make_filter_list(const QString &filter); // qfiledialog.cpp
-extern QStringList qt_clean_filter_list(const QString &filter); // qfiledialog.cpp
-extern const char *qt_file_dialog_filter_reg_exp; // qfiledialog.cpp
-extern bool qt_mac_is_macsheet(const QWidget *w); // qwidget_mac.mm
-
-QT_END_NAMESPACE
-
-QT_FORWARD_DECLARE_CLASS(QFileDialogPrivate)
-QT_FORWARD_DECLARE_CLASS(QString)
-QT_FORWARD_DECLARE_CLASS(QStringList)
-QT_FORWARD_DECLARE_CLASS(QWidget)
-QT_FORWARD_DECLARE_CLASS(QAction)
-QT_FORWARD_DECLARE_CLASS(QFileInfo)
-QT_USE_NAMESPACE
-
-@class QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate);
-
-@interface QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate)
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
- : NSObject<NSOpenSavePanelDelegate>
-#else
- : NSObject
-#endif
-{
- @public
- NSOpenPanel *mOpenPanel;
- NSSavePanel *mSavePanel;
- NSView *mAccessoryView;
- NSPopUpButton *mPopUpButton;
- NSTextField *mTextField;
- QFileDialogPrivate *mPriv;
- NSString *mCurrentDir;
- bool mConfirmOverwrite;
- int mReturnCode;
-
- QT_PREPEND_NAMESPACE(QFileDialog::AcceptMode) mAcceptMode;
- QT_PREPEND_NAMESPACE(QDir::Filters) *mQDirFilter;
- QT_PREPEND_NAMESPACE(QFileDialog::FileMode) mFileMode;
- QT_PREPEND_NAMESPACE(QFileDialog::Options) *mFileOptions;
-
- QString *mLastFilterCheckPath;
- QString *mCurrentSelection;
- QStringList *mQDirFilterEntryList;
- QStringList *mNameFilterDropDownList;
- QStringList *mSelectedNameFilter;
-}
-
-- (NSString *)strip:(const QString &)label;
-- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename;
-- (void)filterChanged:(id)sender;
-- (void)showModelessPanel;
-- (BOOL)runApplicationModalPanel;
-- (void)showWindowModalSheet:(QWidget *)docWidget;
-- (void)updateProperties;
-- (QStringList)acceptableExtensionsForSave;
-- (QString)removeExtensions:(const QString &)filter;
-- (void)createTextField;
-- (void)createPopUpButton:(const QString &)selectedFilter hideDetails:(BOOL)hideDetails;
-- (QStringList)findStrippedFilterWithVisualFilterName:(QString)name;
-- (void)createAccessory;
-
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate)
-
-- (id)initWithAcceptMode:(QT_PREPEND_NAMESPACE(QFileDialog::AcceptMode))acceptMode
- title:(const QString &)title
- hideNameFilterDetails:(bool)hideNameFilterDetails
- qDirFilter:(QT_PREPEND_NAMESPACE(QDir::Filters))qDirFilter
- fileOptions:(QT_PREPEND_NAMESPACE(QFileDialog::Options))fileOptions
- fileMode:(QT_PREPEND_NAMESPACE(QFileDialog::FileMode))fileMode
- selectFile:(const QString &)selectFile
- confirmOverwrite:(bool)confirm
- priv:(QFileDialogPrivate *)priv
-{
- self = [super init];
-
- mAcceptMode = acceptMode;
- if (mAcceptMode == QT_PREPEND_NAMESPACE(QFileDialog::AcceptOpen)){
- mOpenPanel = [NSOpenPanel openPanel];
- mSavePanel = mOpenPanel;
- } else {
- mSavePanel = [NSSavePanel savePanel];
- mOpenPanel = 0;
- }
-
- [mSavePanel setLevel:NSModalPanelWindowLevel];
- [mSavePanel setDelegate:self];
- mQDirFilter = new QT_PREPEND_NAMESPACE(QDir::Filters)(qDirFilter);
- mFileOptions = new QT_PREPEND_NAMESPACE(QFileDialog::Options)(fileOptions);
- mFileMode = fileMode;
- mConfirmOverwrite = confirm;
- mReturnCode = -1;
- mPriv = priv;
- mLastFilterCheckPath = new QString;
- mQDirFilterEntryList = new QStringList;
- mNameFilterDropDownList = new QStringList(priv->nameFilters);
- QString selectedVisualNameFilter = priv->qFileDialogUi->fileTypeCombo->currentText();
- mSelectedNameFilter = new QStringList([self findStrippedFilterWithVisualFilterName:selectedVisualNameFilter]);
-
- QFileInfo sel(selectFile);
- if (sel.isDir()){
- mCurrentDir = [qt_mac_QStringToNSString(sel.absoluteFilePath()) retain];
- mCurrentSelection = new QString;
- } else {
- mCurrentDir = [qt_mac_QStringToNSString(sel.absolutePath()) retain];
- mCurrentSelection = new QString(sel.absoluteFilePath());
- }
-
- [mSavePanel setTitle:qt_mac_QStringToNSString(title)];
- [self createPopUpButton:selectedVisualNameFilter hideDetails:hideNameFilterDetails];
- [self createTextField];
- [self createAccessory];
- [mSavePanel setAccessoryView:mNameFilterDropDownList->size() > 1 ? mAccessoryView : nil];
-
- if (mPriv){
- [mSavePanel setPrompt:[self strip:mPriv->acceptLabel]];
- if (mPriv->fileNameLabelExplicitlySat)
- [mSavePanel setNameFieldLabel:[self strip:mPriv->qFileDialogUi->fileNameLabel->text()]];
- }
-
- [self updateProperties];
- [mSavePanel retain];
- return self;
-}
-
-- (void)dealloc
-{
- delete mQDirFilter;
- delete mFileOptions;
- delete mLastFilterCheckPath;
- delete mQDirFilterEntryList;
- delete mNameFilterDropDownList;
- delete mSelectedNameFilter;
- delete mCurrentSelection;
-
- [mSavePanel orderOut:mSavePanel];
- [mSavePanel setAccessoryView:nil];
- [mPopUpButton release];
- [mTextField release];
- [mAccessoryView release];
- [mSavePanel setDelegate:nil];
- [mSavePanel release];
- [mCurrentDir release];
- [super dealloc];
-}
-
-- (NSString *)strip:(const QString &)label
-{
- QAction a(label, 0);
- return qt_mac_QStringToNSString(a.iconText());
-}
-
-- (void)closePanel
-{
- *mCurrentSelection = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)([mSavePanel filename]);
- [mSavePanel close];
-}
-
-- (void)showModelessPanel
-{
- if (mOpenPanel){
- QFileInfo info(*mCurrentSelection);
- NSString *filename = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.fileName());
- NSString *filepath = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.filePath());
- bool selectable = (mAcceptMode == QFileDialog::AcceptSave)
- || [self panel:nil shouldShowFilename:filepath];
- [mOpenPanel
- beginForDirectory:mCurrentDir
- file:selectable ? filename : nil
- types:nil
- modelessDelegate:self
- didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
- contextInfo:nil];
- }
-}
-
-- (BOOL)runApplicationModalPanel
-{
- QFileInfo info(*mCurrentSelection);
- NSString *filename = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.fileName());
- NSString *filepath = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.filePath());
- bool selectable = (mAcceptMode == QFileDialog::AcceptSave)
- || [self panel:nil shouldShowFilename:filepath];
- mReturnCode = [mSavePanel
- runModalForDirectory:mCurrentDir
- file:selectable ? filename : @"untitled"];
-
- QAbstractEventDispatcher::instance()->interrupt();
- return (mReturnCode == NSOKButton);
-}
-
-- (QT_PREPEND_NAMESPACE(QDialog::DialogCode))dialogResultCode
-{
- return (mReturnCode == NSOKButton) ? QT_PREPEND_NAMESPACE(QDialog::Accepted) : QT_PREPEND_NAMESPACE(QDialog::Rejected);
-}
-
-- (void)showWindowModalSheet:(QWidget *)docWidget
-{
- Q_UNUSED(docWidget);
- QFileInfo info(*mCurrentSelection);
- NSString *filename = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.fileName());
- NSString *filepath = QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(info.filePath());
- bool selectable = (mAcceptMode == QFileDialog::AcceptSave)
- || [self panel:nil shouldShowFilename:filepath];
- [mSavePanel
- beginSheetForDirectory:mCurrentDir
- file:selectable ? filename : nil
- modalForWindow:QT_PREPEND_NAMESPACE(qt_mac_window_for)(docWidget)
- modalDelegate:self
- didEndSelector:@selector(openPanelDidEnd:returnCode:contextInfo:)
- contextInfo:nil];
-}
-
-- (BOOL)panel:(id)sender shouldShowFilename:(NSString *)filename
-{
- Q_UNUSED(sender);
-
- if ([filename length] == 0)
- return NO;
-
- // Always accept directories regardless of their names (unless it is a bundle):
- BOOL isDir;
- if ([[NSFileManager defaultManager] fileExistsAtPath:filename isDirectory:&isDir] && isDir) {
- if ([mSavePanel treatsFilePackagesAsDirectories] == NO) {
- if ([[NSWorkspace sharedWorkspace] isFilePackageAtPath:filename] == NO)
- return YES;
- }
- }
-
- QString qtFileName = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)(filename);
- QFileInfo info(qtFileName.normalized(QT_PREPEND_NAMESPACE(QString::NormalizationForm_C)));
- QString path = info.absolutePath();
- if (path != *mLastFilterCheckPath){
- *mLastFilterCheckPath = path;
- *mQDirFilterEntryList = info.dir().entryList(*mQDirFilter);
- }
- // Check if the QDir filter accepts the file:
- if (!mQDirFilterEntryList->contains(info.fileName()))
- return NO;
-
- // No filter means accept everything
- if (mSelectedNameFilter->isEmpty())
- return YES;
- // Check if the current file name filter accepts the file:
- for (int i=0; i<mSelectedNameFilter->size(); ++i) {
- if (QDir::match(mSelectedNameFilter->at(i), qtFileName))
- return YES;
- }
- return NO;
-}
-
-- (NSString *)panel:(id)sender userEnteredFilename:(NSString *)filename confirmed:(BOOL)okFlag
-{
- Q_UNUSED(sender);
- if (!okFlag)
- return filename;
- if (mConfirmOverwrite)
- return filename;
-
- // User has clicked save, and no overwrite confirmation should occur.
- // To get the latter, we need to change the name we return (hence the prefix):
- return [@"___qt_very_unlikely_prefix_" stringByAppendingString:filename];
-}
-
-- (void)setNameFilters:(const QStringList &)filters hideDetails:(BOOL)hideDetails
-{
- [mPopUpButton removeAllItems];
- *mNameFilterDropDownList = filters;
- if (filters.size() > 0){
- for (int i=0; i<filters.size(); ++i) {
- QString filter = hideDetails ? [self removeExtensions:filters.at(i)] : filters.at(i);
- [mPopUpButton addItemWithTitle:QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(filter)];
- }
- [mPopUpButton selectItemAtIndex:0];
- [mSavePanel setAccessoryView:mAccessoryView];
- } else
- [mSavePanel setAccessoryView:nil];
-
- [self filterChanged:self];
-}
-
-- (void)filterChanged:(id)sender
-{
- // This mDelegate function is called when the _name_ filter changes.
- Q_UNUSED(sender);
- QString selection = mNameFilterDropDownList->value([mPopUpButton indexOfSelectedItem]);
- *mSelectedNameFilter = [self findStrippedFilterWithVisualFilterName:selection];
- [mSavePanel validateVisibleColumns];
- [self updateProperties];
- if (mPriv)
- mPriv->QNSOpenSavePanelDelegate_filterSelected([mPopUpButton indexOfSelectedItem]);
-}
-
-- (QString)currentNameFilter
-{
- return mNameFilterDropDownList->value([mPopUpButton indexOfSelectedItem]);
-}
-
-- (QStringList)selectedFiles
-{
- if (mOpenPanel)
- return QT_PREPEND_NAMESPACE(qt_mac_NSArrayToQStringList)([mOpenPanel filenames]);
- else{
- QStringList result;
- QString filename = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)([mSavePanel filename]);
- result << filename.remove(QLatin1String("___qt_very_unlikely_prefix_"));
- return result;
- }
-}
-
-- (void)updateProperties
-{
- // Call this functions if mFileMode, mFileOptions,
- // mNameFilterDropDownList or mQDirFilter changes.
- // The savepanel does not contain the neccessary functions for this.
- bool chooseFilesOnly = mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::ExistingFile)
- || mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::ExistingFiles);
- bool chooseDirsOnly = mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::Directory)
- || mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::DirectoryOnly)
- || *mFileOptions & QT_PREPEND_NAMESPACE(QFileDialog::ShowDirsOnly);
-
- [mOpenPanel setCanChooseFiles:!chooseDirsOnly];
- [mOpenPanel setCanChooseDirectories:!chooseFilesOnly];
- [mSavePanel setCanCreateDirectories:!(*mFileOptions & QT_PREPEND_NAMESPACE(QFileDialog::ReadOnly))];
- [mOpenPanel setAllowsMultipleSelection:(mFileMode == QT_PREPEND_NAMESPACE(QFileDialog::ExistingFiles))];
- [mOpenPanel setResolvesAliases:!(*mFileOptions & QT_PREPEND_NAMESPACE(QFileDialog::DontResolveSymlinks))];
-
- QStringList ext = [self acceptableExtensionsForSave];
- if (mPriv && !ext.isEmpty() && !mPriv->defaultSuffix.isEmpty())
- ext.prepend(mPriv->defaultSuffix);
- [mSavePanel setAllowedFileTypes:ext.isEmpty() ? nil : QT_PREPEND_NAMESPACE(qt_mac_QStringListToNSMutableArray(ext))];
-
- if ([mSavePanel isVisible])
- [mOpenPanel validateVisibleColumns];
-}
-
-- (void)panelSelectionDidChange:(id)sender
-{
- Q_UNUSED(sender);
- if (mPriv) {
- QString selection = QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString([mSavePanel filename]));
- if (selection != mCurrentSelection) {
- *mCurrentSelection = selection;
- mPriv->QNSOpenSavePanelDelegate_selectionChanged(selection);
- }
- }
-}
-
-- (void)openPanelDidEnd:(NSOpenPanel *)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
-{
- Q_UNUSED(panel);
- Q_UNUSED(contextInfo);
- mReturnCode = returnCode;
- if (mPriv)
- mPriv->QNSOpenSavePanelDelegate_panelClosed(returnCode == NSOKButton);
-}
-
-- (void)panel:(id)sender directoryDidChange:(NSString *)path
-{
- Q_UNUSED(sender);
- if (!mPriv)
- return;
- if ([path isEqualToString:mCurrentDir])
- return;
-
- [mCurrentDir release];
- mCurrentDir = [path retain];
- mPriv->QNSOpenSavePanelDelegate_directoryEntered(QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString(mCurrentDir)));
-}
-
-/*
- Returns a list of extensions (e.g. "png", "jpg", "gif")
- for the current name filter. If a filter do not conform
- to the format *.xyz or * or *.*, an empty list
- is returned meaning accept everything.
-*/
-- (QStringList)acceptableExtensionsForSave
-{
- QStringList result;
- for (int i=0; i<mSelectedNameFilter->count(); ++i) {
- const QString &filter = mSelectedNameFilter->at(i);
- if (filter.startsWith(QLatin1String("*."))
- && !filter.contains(QLatin1Char('?'))
- && filter.count(QLatin1Char('*')) == 1) {
- result += filter.mid(2);
- } else {
- return QStringList(); // Accept everything
- }
- }
- return result;
-}
-
-- (QString)removeExtensions:(const QString &)filter
-{
- QRegExp regExp(QT_PREPEND_NAMESPACE(QString::fromLatin1)(QT_PREPEND_NAMESPACE(qt_file_dialog_filter_reg_exp)));
- if (regExp.indexIn(filter) != -1)
- return regExp.cap(1).trimmed();
- return filter;
-}
-
-- (void)createTextField
-{
- NSRect textRect = { { 0.0, 3.0 }, { 100.0, 25.0 } };
- mTextField = [[NSTextField alloc] initWithFrame:textRect];
- [[mTextField cell] setFont:[NSFont systemFontOfSize:
- [NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
- [mTextField setAlignment:NSRightTextAlignment];
- [mTextField setEditable:false];
- [mTextField setSelectable:false];
- [mTextField setBordered:false];
- [mTextField setDrawsBackground:false];
- if (mPriv){
- [mTextField setStringValue:[self strip:mPriv->qFileDialogUi->fileTypeLabel->text()]];
- } else
- [mTextField setStringValue:QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(QT_PREPEND_NAMESPACE(QFileDialog::tr)("Files of type:"))];
-}
-
-- (void)createPopUpButton:(const QString &)selectedFilter hideDetails:(BOOL)hideDetails
-{
- NSRect popUpRect = { { 100.0, 5.0 }, { 250.0, 25.0 } };
- mPopUpButton = [[NSPopUpButton alloc] initWithFrame:popUpRect pullsDown:NO];
- [mPopUpButton setTarget:self];
- [mPopUpButton setAction:@selector(filterChanged:)];
-
- QStringList *filters = mNameFilterDropDownList;
- if (filters->size() > 0){
- for (int i=0; i<mNameFilterDropDownList->size(); ++i) {
- QString filter = hideDetails ? [self removeExtensions:filters->at(i)] : filters->at(i);
- [mPopUpButton addItemWithTitle:QT_PREPEND_NAMESPACE(qt_mac_QStringToNSString)(filter)];
- if (filters->at(i).startsWith(selectedFilter))
- [mPopUpButton selectItemAtIndex:i];
- }
- }
-}
-
-- (QStringList) findStrippedFilterWithVisualFilterName:(QString)name
-{
- for (int i=0; i<mNameFilterDropDownList->size(); ++i) {
- if (mNameFilterDropDownList->at(i).startsWith(name))
- return qt_clean_filter_list(mNameFilterDropDownList->at(i));
- }
- return QStringList();
-}
-
-- (void)createAccessory
-{
- NSRect accessoryRect = { { 0.0, 0.0 }, { 450.0, 33.0 } };
- mAccessoryView = [[NSView alloc] initWithFrame:accessoryRect];
- [mAccessoryView addSubview:mTextField];
- [mAccessoryView addSubview:mPopUpButton];
-}
-
-@end
-
-QT_BEGIN_NAMESPACE
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_selectionChanged(const QString &newPath)
-{
- emit q_func()->currentChanged(newPath);
-}
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_panelClosed(bool accepted)
-{
- if (accepted)
- q_func()->accept();
- else
- q_func()->reject();
-}
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_directoryEntered(const QString &newDir)
-{
- setLastVisitedDirectory(newDir);
- emit q_func()->directoryEntered(newDir);
-}
-
-void QFileDialogPrivate::QNSOpenSavePanelDelegate_filterSelected(int menuIndex)
-{
- emit q_func()->filterSelected(nameFilters.at(menuIndex));
-}
-
-extern OSErr qt_mac_create_fsref(const QString &, FSRef *); // qglobal.cpp
-extern void qt_mac_to_pascal_string(QString s, Str255 str, TextEncoding encoding=0, int len=-1); // qglobal.cpp
-
-void QFileDialogPrivate::setDirectory_sys(const QString &directory)
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate->mSavePanel setDirectory:qt_mac_QStringToNSString(directory)];
-}
-
-QString QFileDialogPrivate::directory_sys() const
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- return qt_mac_NSStringToQString([delegate->mSavePanel directory]);
-}
-
-void QFileDialogPrivate::selectFile_sys(const QString &filename)
-{
- QString filePath = filename;
- if (QDir::isRelativePath(filePath))
- filePath = QFileInfo(directory_sys(), filePath).filePath();
-
- // There seems to no way to select a file once the dialog is running.
- // So do the next best thing, set the file's directory:
- setDirectory_sys(QFileInfo(filePath).absolutePath());
-}
-
-QStringList QFileDialogPrivate::selectedFiles_sys() const
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- return [delegate selectedFiles];
-}
-
-void QFileDialogPrivate::setNameFilters_sys(const QStringList &filters)
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- bool hideDetails = q_func()->testOption(QFileDialog::HideNameFilterDetails);
- [delegate setNameFilters:filters hideDetails:hideDetails];
-}
-
-void QFileDialogPrivate::setFilter_sys()
-{
- Q_Q(QFileDialog);
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- *(delegate->mQDirFilter) = model->filter();
- delegate->mFileMode = fileMode;
- [delegate->mSavePanel setTitle:qt_mac_QStringToNSString(q->windowTitle())];
- [delegate->mSavePanel setPrompt:[delegate strip:acceptLabel]];
- if (fileNameLabelExplicitlySat)
- [delegate->mSavePanel setNameFieldLabel:[delegate strip:qFileDialogUi->fileNameLabel->text()]];
-
- [delegate updateProperties];
-}
-
-void QFileDialogPrivate::selectNameFilter_sys(const QString &filter)
-{
- int index = nameFilters.indexOf(filter);
- if (index != -1) {
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate->mPopUpButton selectItemAtIndex:index];
- [delegate filterChanged:nil];
- }
-}
-
-QString QFileDialogPrivate::selectedNameFilter_sys() const
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- int index = [delegate->mPopUpButton indexOfSelectedItem];
- return index != -1 ? nameFilters.at(index) : QString();
-}
-
-void QFileDialogPrivate::deleteNativeDialog_sys()
-{
- QMacCocoaAutoReleasePool pool;
- [reinterpret_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate) release];
- mDelegate = 0;
- nativeDialogInUse = false;
-}
-
-bool QFileDialogPrivate::setVisible_sys(bool visible)
-{
- Q_Q(QFileDialog);
- if (!visible == q->isHidden())
- return false;
-
- if (q->windowFlags() & Qt::WindowStaysOnTopHint) {
- // The native file dialog tries all it can to stay
- // on the NSModalPanel level. And it might also show
- // its own "create directory" dialog that we cannot control.
- // So we need to use the non-native version in this case...
- return false;
- }
-
- return visible ? showCocoaFilePanel() : hideCocoaFilePanel();
-}
-
-void QFileDialogPrivate::createNSOpenSavePanelDelegate()
-{
- Q_Q(QFileDialog);
- if (mDelegate)
- return;
-
- bool selectDir = q->selectedFiles().isEmpty();
- QString selection(selectDir ? q->directory().absolutePath() : q->selectedFiles().value(0));
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) alloc]
- initWithAcceptMode:acceptMode
- title:q->windowTitle()
- hideNameFilterDetails:q->testOption(QFileDialog::HideNameFilterDetails)
- qDirFilter:model->filter()
- fileOptions:opts
- fileMode:fileMode
- selectFile:selection
- confirmOverwrite:!q->testOption(QFileDialog::DontConfirmOverwrite)
- priv:this];
-
- mDelegate = delegate;
-}
-
-bool QFileDialogPrivate::showCocoaFilePanel()
-{
- Q_Q(QFileDialog);
- QMacCocoaAutoReleasePool pool;
- createNSOpenSavePanelDelegate();
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- if (qt_mac_is_macsheet(q))
- [delegate showWindowModalSheet:q->parentWidget()];
- else
- [delegate showModelessPanel];
- return true;
-}
-
-bool QFileDialogPrivate::hideCocoaFilePanel()
-{
- if (!mDelegate){
- // Nothing to do. We return false to leave the question
- // open regarding whether or not to go native:
- return false;
- } else {
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate closePanel];
- // Even when we hide it, we are still using a
- // native dialog, so return true:
- return true;
- }
-}
-
-
-void QFileDialogPrivate::platformNativeDialogModalHelp()
-{
- // Do a queued meta-call to open the native modal dialog so it opens after the new
- // event loop has started to execute (in QDialog::exec). Using a timer rather than
- // a queued meta call is intentional to ensure that the call is only delivered when
- // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
- // running (which is the case if e.g a top-most QEventLoop has been
- // interrupted, and the second-most event loop has not yet been reactivated (regardless
- // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
- if (nativeDialogInUse){
- Q_Q(QFileDialog);
- QTimer::singleShot(1, q, SLOT(_q_macRunNativeAppModalPanel()));
- }
-}
-
-void QFileDialogPrivate::_q_macRunNativeAppModalPanel()
-{
- QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
- Q_Q(QFileDialog);
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- [delegate runApplicationModalPanel];
- dialogResultCode_sys() == QDialog::Accepted ? q->accept() : q->reject();
-}
-
-QDialog::DialogCode QFileDialogPrivate::dialogResultCode_sys()
-{
- QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast<QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *>(mDelegate);
- return [delegate dialogResultCode];
-}
-
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_FILEDIALOG
-
diff --git a/src/widgets/dialogs/qfontdialog_mac.mm b/src/widgets/dialogs/qfontdialog_mac.mm
deleted file mode 100644
index bf8b88a0c9..0000000000
--- a/src/widgets/dialogs/qfontdialog_mac.mm
+++ /dev/null
@@ -1,676 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qfontdialog_p.h"
-#if !defined(QT_NO_FONTDIALOG) && defined(Q_WS_MAC)
-#include <qapplication.h>
-#include <qdialogbuttonbox.h>
-#include <qlineedit.h>
-#include <private/qapplication_p.h>
-#include <private/qfont_p.h>
-#include <private/qfontengine_p.h>
-#include <private/qt_cocoa_helpers_mac_p.h>
-#include <private/qt_mac_p.h>
-#include <qabstracteventdispatcher.h>
-#include <qdebug.h>
-#include <private/qfontengine_coretext_p.h>
-#import <AppKit/AppKit.h>
-#import <Foundation/Foundation.h>
-
-#if !CGFLOAT_DEFINED
-typedef float CGFloat; // Should only not be defined on 32-bit platforms
-#endif
-
-QT_BEGIN_NAMESPACE
-
-extern void macStartInterceptNSPanelCtor();
-extern void macStopInterceptNSPanelCtor();
-extern NSButton *macCreateButton(const char *text, NSView *superview);
-extern bool qt_mac_is_macsheet(const QWidget *w); // qwidget_mac.mm
-
-QT_END_NAMESPACE
-QT_USE_NAMESPACE
-
-// should a priori be kept in sync with qcolordialog_mac.mm
-const CGFloat ButtonMinWidth = 78.0;
-const CGFloat ButtonMinHeight = 32.0;
-const CGFloat ButtonSpacing = 0.0;
-const CGFloat ButtonTopMargin = 0.0;
-const CGFloat ButtonBottomMargin = 7.0;
-const CGFloat ButtonSideMargin = 9.0;
-
-// looks better with some margins
-const CGFloat DialogTopMargin = 7.0;
-const CGFloat DialogSideMargin = 9.0;
-
-const int StyleMask = NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask;
-
-@class QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate);
-
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_5
-
-@protocol NSWindowDelegate <NSObject>
-- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize;
-@end
-
-#endif
-
-@interface QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) : NSObject <NSWindowDelegate> {
- NSFontPanel *mFontPanel;
- NSView *mStolenContentView;
- NSButton *mOkButton;
- NSButton *mCancelButton;
- QFontDialogPrivate *mPriv;
- QFont *mQtFont;
- BOOL mPanelHackedWithButtons;
- CGFloat mDialogExtraWidth;
- CGFloat mDialogExtraHeight;
- int mReturnCode;
- BOOL mAppModal;
-}
-- (id)initWithFontPanel:(NSFontPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QFontDialogPrivate *)priv
- extraWidth:(CGFloat)extraWidth
- extraHeight:(CGFloat)extraHeight;
-- (void)showModelessPanel;
-- (void)showWindowModalSheet:(QWidget *)docWidget;
-- (void)runApplicationModalPanel;
-- (BOOL)isAppModal;
-- (void)changeFont:(id)sender;
-- (void)changeAttributes:(id)sender;
-- (BOOL)windowShouldClose:(id)window;
-- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize;
-- (void)relayout;
-- (void)relayoutToContentSize:(NSSize)frameSize;
-- (void)onOkClicked;
-- (void)onCancelClicked;
-- (NSFontPanel *)fontPanel;
-- (NSWindow *)actualPanel;
-- (NSSize)dialogExtraSize;
-- (void)setQtFont:(const QFont &)newFont;
-- (QFont)qtFont;
-- (void)finishOffWithCode:(NSInteger)result;
-- (void)cleanUpAfterMyself;
-- (void)setSubwindowStacking;
-@end
-
-static QFont qfontForCocoaFont(NSFont *cocoaFont, const QFont &resolveFont)
-{
- QFont newFont;
- if (cocoaFont) {
- int pSize = qRound([cocoaFont pointSize]);
- QString family(qt_mac_NSStringToQString([cocoaFont familyName]));
- QString typeface(qt_mac_NSStringToQString([cocoaFont fontName]));
-
- int hyphenPos = typeface.indexOf(QLatin1Char('-'));
- if (hyphenPos != -1) {
- typeface.remove(0, hyphenPos + 1);
- } else {
- typeface = QLatin1String("Normal");
- }
-
- newFont = QFontDatabase().font(family, typeface, pSize);
- newFont.setUnderline(resolveFont.underline());
- newFont.setStrikeOut(resolveFont.strikeOut());
-
- }
- return newFont;
-}
-
-@implementation QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate)
-- (id)initWithFontPanel:(NSFontPanel *)panel
- stolenContentView:(NSView *)stolenContentView
- okButton:(NSButton *)okButton
- cancelButton:(NSButton *)cancelButton
- priv:(QFontDialogPrivate *)priv
- extraWidth:(CGFloat)extraWidth
- extraHeight:(CGFloat)extraHeight
-{
- self = [super init];
- mFontPanel = panel;
- mStolenContentView = stolenContentView;
- mOkButton = okButton;
- mCancelButton = cancelButton;
- mPriv = priv;
- mPanelHackedWithButtons = (okButton != 0);
- mDialogExtraWidth = extraWidth;
- mDialogExtraHeight = extraHeight;
- mReturnCode = -1;
- mAppModal = false;
-
- if (mPanelHackedWithButtons) {
- [self relayout];
-
- [okButton setAction:@selector(onOkClicked)];
- [okButton setTarget:self];
-
- [cancelButton setAction:@selector(onCancelClicked)];
- [cancelButton setTarget:self];
- }
-
- mQtFont = new QFont();
- return self;
-}
-
-- (void)setSubwindowStacking
-{
- // Stack the native dialog in front of its parent, if any:
- QFontDialog *q = mPriv->fontDialog();
- if (!qt_mac_is_macsheet(q)) {
- if (QWidget *parent = q->parentWidget()) {
- if (parent->isWindow()) {
- [qt_mac_window_for(parent)
- addChildWindow:[mStolenContentView window] ordered:NSWindowAbove];
- }
- }
- }
-}
-
-- (void)dealloc
-{
- delete mQtFont;
- [super dealloc];
-}
-
-- (void)showModelessPanel
-{
- mAppModal = false;
- NSWindow *ourPanel = [mStolenContentView window];
- [ourPanel makeKeyAndOrderFront:self];
-}
-
-- (void)runApplicationModalPanel
-{
- QBoolBlocker nativeDialogOnTop(QApplicationPrivate::native_modal_dialog_active);
- mAppModal = true;
- NSWindow *ourPanel = [mStolenContentView window];
- [ourPanel setReleasedWhenClosed:NO];
- [NSApp runModalForWindow:ourPanel];
- QAbstractEventDispatcher::instance()->interrupt();
-
- if (mReturnCode == NSOKButton)
- mPriv->fontDialog()->accept();
- else
- mPriv->fontDialog()->reject();
-}
-
-- (BOOL)isAppModal
-{
- return mAppModal;
-}
-
-- (void)showWindowModalSheet:(QWidget *)docWidget
-{
- NSWindow *window = qt_mac_window_for(docWidget);
-
- mAppModal = false;
- NSWindow *ourPanel = [mStolenContentView window];
- [NSApp beginSheet:ourPanel
- modalForWindow:window
- modalDelegate:0
- didEndSelector:0
- contextInfo:0 ];
-
-}
-
-- (void)changeFont:(id)sender
-{
- NSFont *dummyFont = [NSFont userFontOfSize:12.0];
- [self setQtFont:qfontForCocoaFont([sender convertFont:dummyFont], *mQtFont)];
- if (mPriv)
- mPriv->updateSampleFont(*mQtFont);
-}
-
-- (void)changeAttributes:(id)sender
-{
- NSDictionary *dummyAttribs = [NSDictionary dictionary];
- NSDictionary *attribs = [sender convertAttributes:dummyAttribs];
-
- for (id key in attribs) {
- NSNumber *number = static_cast<NSNumber *>([attribs objectForKey:key]);
- if ([key isEqual:NSUnderlineStyleAttributeName]) {
- mQtFont->setUnderline([number intValue] != NSUnderlineStyleNone);
- } else if ([key isEqual:NSStrikethroughStyleAttributeName]) {
- mQtFont->setStrikeOut([number intValue] != NSUnderlineStyleNone);
- }
- }
-
- if (mPriv)
- mPriv->updateSampleFont(*mQtFont);
-}
-
-- (BOOL)windowShouldClose:(id)window
-{
- Q_UNUSED(window);
- if (mPanelHackedWithButtons) {
- [self onCancelClicked];
- } else {
- [self finishOffWithCode:NSCancelButton];
- }
- return true;
-}
-
-- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize
-{
- if (mFontPanel == window) {
- proposedFrameSize = [static_cast<id <NSWindowDelegate> >(mFontPanel) windowWillResize:mFontPanel toSize:proposedFrameSize];
- } else {
- /*
- Ugly hack: NSFontPanel rearranges the layout of its main
- component in windowWillResize:toSize:. So we temporarily
- restore the stolen content view to its rightful owner,
- call windowWillResize:toSize:, and steal the content view
- again.
- */
- [mStolenContentView removeFromSuperview];
- [mFontPanel setContentView:mStolenContentView];
- NSSize extraSize = [self dialogExtraSize];
- proposedFrameSize.width -= extraSize.width;
- proposedFrameSize.height -= extraSize.height;
- proposedFrameSize = [static_cast<id <NSWindowDelegate> >(mFontPanel) windowWillResize:mFontPanel toSize:proposedFrameSize];
- NSRect frameRect = { { 0.0, 0.0 }, proposedFrameSize };
- [mFontPanel setFrame:frameRect display:NO];
- [mFontPanel setContentView:0];
- [[window contentView] addSubview:mStolenContentView];
- proposedFrameSize.width += extraSize.width;
- proposedFrameSize.height += extraSize.height;
- }
- if (mPanelHackedWithButtons) {
- NSRect frameRect = { { 0.0, 0.0 }, proposedFrameSize };
- NSRect contentRect = [NSWindow contentRectForFrameRect:frameRect styleMask:[window styleMask]];
- [self relayoutToContentSize:contentRect.size];
- }
- return proposedFrameSize;
-}
-
-- (void)relayout
-{
- [self relayoutToContentSize:[[mStolenContentView superview] frame].size];
-}
-
-- (void)relayoutToContentSize:(NSSize)frameSize
-{
- Q_ASSERT(mPanelHackedWithButtons);
-
- [mOkButton sizeToFit];
- NSSize okSizeHint = [mOkButton frame].size;
-
- [mCancelButton sizeToFit];
- NSSize cancelSizeHint = [mCancelButton frame].size;
-
- const CGFloat ButtonWidth = qMin(qMax(ButtonMinWidth,
- qMax(okSizeHint.width, cancelSizeHint.width)),
- CGFloat((frameSize.width - 2.0 * ButtonSideMargin - ButtonSpacing) * 0.5));
- const CGFloat ButtonHeight = qMax(ButtonMinHeight,
- qMax(okSizeHint.height, cancelSizeHint.height));
-
- const CGFloat X = DialogSideMargin;
- const CGFloat Y = ButtonBottomMargin + ButtonHeight + ButtonTopMargin;
-
- NSRect okRect = { { frameSize.width - ButtonSideMargin - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mOkButton setFrame:okRect];
- [mOkButton setNeedsDisplay:YES];
-
- NSRect cancelRect = { { okRect.origin.x - ButtonSpacing - ButtonWidth,
- ButtonBottomMargin },
- { ButtonWidth, ButtonHeight } };
- [mCancelButton setFrame:cancelRect];
- [mCancelButton setNeedsDisplay:YES];
-
- NSRect stolenCVRect = { { X, Y },
- { frameSize.width - X - X, frameSize.height - Y - DialogTopMargin } };
- [mStolenContentView setFrame:stolenCVRect];
- [mStolenContentView setNeedsDisplay:YES];
-
- [[mStolenContentView superview] setNeedsDisplay:YES];
-}
-
-- (void)onOkClicked
-{
- Q_ASSERT(mPanelHackedWithButtons);
- NSFontManager *fontManager = [NSFontManager sharedFontManager];
- [self setQtFont:qfontForCocoaFont([fontManager convertFont:[fontManager selectedFont]],
- *mQtFont)];
- [self finishOffWithCode:NSOKButton];
-}
-
-- (void)onCancelClicked
-{
- Q_ASSERT(mPanelHackedWithButtons);
- [self finishOffWithCode:NSCancelButton];
-}
-
-- (NSFontPanel *)fontPanel
-{
- return mFontPanel;
-}
-
-- (NSWindow *)actualPanel
-{
- return [mStolenContentView window];
-}
-
-- (NSSize)dialogExtraSize
-{
- // this must be recomputed each time, because sometimes the
- // NSFontPanel has the NSDocModalWindowMask flag set, and sometimes
- // not -- which affects the frame rect vs. content rect measurements
-
- // take the different frame rectangles into account for dialogExtra{Width,Height}
- NSRect someRect = { { 0.0, 0.0 }, { 100000.0, 100000.0 } };
- NSRect sharedFontPanelContentRect = [mFontPanel contentRectForFrameRect:someRect];
- NSRect ourPanelContentRect = [NSWindow contentRectForFrameRect:someRect styleMask:StyleMask];
-
- NSSize result = { mDialogExtraWidth, mDialogExtraHeight };
- result.width -= ourPanelContentRect.size.width - sharedFontPanelContentRect.size.width;
- result.height -= ourPanelContentRect.size.height - sharedFontPanelContentRect.size.height;
- return result;
-}
-
-- (void)setQtFont:(const QFont &)newFont
-{
- delete mQtFont;
- mQtFont = new QFont(newFont);
-}
-
-- (QFont)qtFont
-{
- return *mQtFont;
-}
-
-- (void)finishOffWithCode:(NSInteger)code
-{
- QFontDialog *q = mPriv->fontDialog();
- if (QWidget *parent = q->parentWidget()) {
- if (parent->isWindow()) {
- [qt_mac_window_for(parent) removeChildWindow:[mStolenContentView window]];
- }
- }
-
- if(code == NSOKButton)
- mPriv->sampleEdit->setFont([self qtFont]);
-
- if (mAppModal) {
- mReturnCode = code;
- [NSApp stopModalWithCode:code];
- } else {
- if (code == NSOKButton)
- mPriv->fontDialog()->accept();
- else
- mPriv->fontDialog()->reject();
- }
-}
-
-- (void)cleanUpAfterMyself
-{
- if (mPanelHackedWithButtons) {
- NSView *ourContentView = [mFontPanel contentView];
-
- // return stolen stuff to its rightful owner
- [mStolenContentView removeFromSuperview];
- [mFontPanel setContentView:mStolenContentView];
-
- [mOkButton release];
- [mCancelButton release];
- [ourContentView release];
- }
- [mFontPanel setDelegate:nil];
- [[NSFontManager sharedFontManager] setDelegate:nil];
- [[NSFontManager sharedFontManager] setTarget:nil];
-}
-@end
-
-QT_BEGIN_NAMESPACE
-
-void QFontDialogPrivate::closeCocoaFontPanel()
-{
- QMacCocoaAutoReleasePool pool;
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *theDelegate = static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate);
- NSWindow *ourPanel = [theDelegate actualPanel];
- [ourPanel close];
- if ([theDelegate isAppModal])
- [ourPanel release];
- [theDelegate cleanUpAfterMyself];
- [theDelegate release];
- this->delegate = 0;
- sharedFontPanelAvailable = true;
-}
-
-void QFontDialogPrivate::setFont(void *delegate, const QFont &font)
-{
- QMacCocoaAutoReleasePool pool;
- QFontEngine *fe = font.d->engineForScript(QUnicodeTables::Common);
- NSFontManager *mgr = [NSFontManager sharedFontManager];
- const NSFont *nsFont = 0;
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
- if (qstrcmp(fe->name(), "CoreText") == 0) {
- nsFont = reinterpret_cast<const NSFont *>(static_cast<QCoreTextFontEngineMulti *>(fe)->ctfont);
- } else
-#endif
- {
- int weight = 5;
- NSFontTraitMask mask = 0;
- if (font.style() == QFont::StyleItalic) {
- mask |= NSItalicFontMask;
- }
- if (font.weight() == QFont::Bold) {
- weight = 9;
- mask |= NSBoldFontMask;
- }
-
- NSFontManager *mgr = [NSFontManager sharedFontManager];
- QFontInfo fontInfo(font);
- nsFont = [mgr fontWithFamily:qt_mac_QStringToNSString(fontInfo.family())
- traits:mask
- weight:weight
- size:fontInfo.pointSize()];
- }
-
- [mgr setSelectedFont:const_cast<NSFont *>(nsFont) isMultiple:NO];
- [static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate) setQtFont:font];
-}
-
-void QFontDialogPrivate::createNSFontPanelDelegate()
-{
- if (delegate)
- return;
-
- sharedFontPanelAvailable = false;
- QMacCocoaAutoReleasePool pool;
- bool sharedFontPanelExisted = [NSFontPanel sharedFontPanelExists];
- NSFontPanel *sharedFontPanel = [NSFontPanel sharedFontPanel];
- [sharedFontPanel setHidesOnDeactivate:false];
-
- // hack to ensure that QCocoaApplication's validModesForFontPanel:
- // implementation is honored
- if (!sharedFontPanelExisted) {
- [sharedFontPanel makeKeyAndOrderFront:sharedFontPanel];
- [sharedFontPanel close];
- }
-
- NSPanel *ourPanel = 0;
- NSView *stolenContentView = 0;
- NSButton *okButton = 0;
- NSButton *cancelButton = 0;
-
- CGFloat dialogExtraWidth = 0.0;
- CGFloat dialogExtraHeight = 0.0;
-
- // compute dialogExtra{Width,Height}
- dialogExtraWidth = 2.0 * DialogSideMargin;
- dialogExtraHeight = DialogTopMargin + ButtonTopMargin + ButtonMinHeight + ButtonBottomMargin;
-
- // compute initial contents rectangle
- NSRect contentRect = [sharedFontPanel contentRectForFrameRect:[sharedFontPanel frame]];
- contentRect.size.width += dialogExtraWidth;
- contentRect.size.height += dialogExtraHeight;
-
- // create the new panel
- ourPanel = [[NSPanel alloc] initWithContentRect:contentRect
- styleMask:StyleMask
- backing:NSBackingStoreBuffered
- defer:YES];
- [ourPanel setReleasedWhenClosed:YES];
- stolenContentView = [sharedFontPanel contentView];
-
- // steal the font panel's contents view
- [stolenContentView retain];
- [sharedFontPanel setContentView:0];
-
- {
- // create a new content view and add the stolen one as a subview
- NSRect frameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
- NSView *ourContentView = [[NSView alloc] initWithFrame:frameRect];
- [ourContentView addSubview:stolenContentView];
-
- // create OK and Cancel buttons and add these as subviews
- okButton = macCreateButton("&OK", ourContentView);
- cancelButton = macCreateButton("Cancel", ourContentView);
-
- [ourPanel setContentView:ourContentView];
- [ourPanel setDefaultButtonCell:[okButton cell]];
- }
-
- // create the delegate and set it
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *del = [[QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) alloc] initWithFontPanel:sharedFontPanel
- stolenContentView:stolenContentView
- okButton:okButton
- cancelButton:cancelButton
- priv:this
- extraWidth:dialogExtraWidth
- extraHeight:dialogExtraHeight];
- delegate = del;
- [ourPanel setDelegate:del];
-
- [[NSFontManager sharedFontManager] setDelegate:del];
- [[NSFontManager sharedFontManager] setTarget:del];
- setFont(del, q_func()->currentFont());
-
- {
- // hack to get correct initial layout
- NSRect frameRect = [ourPanel frame];
- frameRect.size.width += 1.0;
- [ourPanel setFrame:frameRect display:NO];
- frameRect.size.width -= 1.0;
- frameRect.size = [del windowWillResize:ourPanel toSize:frameRect.size];
- [ourPanel setFrame:frameRect display:NO];
- [ourPanel center];
- }
- [del setSubwindowStacking];
- NSString *title = @"Select font";
- [ourPanel setTitle:title];
-}
-
-void QFontDialogPrivate::mac_nativeDialogModalHelp()
-{
- // Copied from QFileDialogPrivate
- // Do a queued meta-call to open the native modal dialog so it opens after the new
- // event loop has started to execute (in QDialog::exec). Using a timer rather than
- // a queued meta call is intentional to ensure that the call is only delivered when
- // [NSApp run] runs (timers are handeled special in cocoa). If NSApp is not
- // running (which is the case if e.g a top-most QEventLoop has been
- // interrupted, and the second-most event loop has not yet been reactivated (regardless
- // if [NSApp run] is still on the stack)), showing a native modal dialog will fail.
- if (nativeDialogInUse) {
- Q_Q(QFontDialog);
- QTimer::singleShot(1, q, SLOT(_q_macRunNativeAppModalPanel()));
- }
-}
-
-// The problem with the native font dialog is that OS X does not
-// offer a proper dialog, but a panel (i.e. without Ok and Cancel buttons).
-// This means we need to "construct" a native dialog by taking the panel
-// and "adding" the buttons.
-void QFontDialogPrivate::_q_macRunNativeAppModalPanel()
-{
- createNSFontPanelDelegate();
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *del = static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate);
- [del runApplicationModalPanel];
-}
-
-bool QFontDialogPrivate::showCocoaFontPanel()
-{
- if (!sharedFontPanelAvailable)
- return false;
-
- Q_Q(QFontDialog);
- QMacCocoaAutoReleasePool pool;
- createNSFontPanelDelegate();
- QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *del = static_cast<QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *>(delegate);
- if (qt_mac_is_macsheet(q))
- [del showWindowModalSheet:q->parentWidget()];
- else
- [del showModelessPanel];
- return true;
-}
-
-bool QFontDialogPrivate::hideCocoaFontPanel()
-{
- if (!delegate){
- // Nothing to do. We return false to leave the question
- // open regarding whether or not to go native:
- return false;
- } else {
- closeCocoaFontPanel();
- // Even when we hide it, we are still using a
- // native dialog, so return true:
- return true;
- }
-}
-bool QFontDialogPrivate::setVisible_sys(bool visible)
-{
- Q_Q(QFontDialog);
- if (!visible == q->isHidden())
- return false;
-
- return visible ? showCocoaFontPanel() : hideCocoaFontPanel();
-}
-
-QT_END_NAMESPACE
-
-#endif
diff --git a/src/widgets/dialogs/qnspanelproxy_mac.mm b/src/widgets/dialogs/qnspanelproxy_mac.mm
deleted file mode 100644
index 403c3edc24..0000000000
--- a/src/widgets/dialogs/qnspanelproxy_mac.mm
+++ /dev/null
@@ -1,228 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <qdialogbuttonbox.h>
-#if defined(Q_WS_MAC)
-#include <private/qt_mac_p.h>
-#include <private/qcocoaintrospection_p.h>
-#import <AppKit/AppKit.h>
-#import <Foundation/Foundation.h>
-#import <objc/objc-class.h>
-
-QT_BEGIN_NAMESPACE
-static QWidget *currentWindow = 0;
-QT_END_NAMESPACE
-
-QT_USE_NAMESPACE
-
-@class QT_MANGLE_NAMESPACE(QNSPanelProxy);
-
-@interface QT_MANGLE_NAMESPACE(QNSPanelProxy) : NSWindow {
-}
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation;
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen;
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation;
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen;
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QNSPanelProxy)
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation
-{
- // remove evil flag
- windowStyle &= ~NSUtilityWindowMask;
- self = [self qt_fakeInitWithContentRect:contentRect styleMask:windowStyle
- backing:bufferingType defer:deferCreation];
- return self;
-}
-
-- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen
-{
- // remove evil flag
- windowStyle &= ~NSUtilityWindowMask;
- return [self qt_fakeInitWithContentRect:contentRect styleMask:windowStyle
- backing:bufferingType defer:deferCreation screen:screen];
-}
-
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation
-{
- Q_UNUSED(contentRect);
- Q_UNUSED(windowStyle);
- Q_UNUSED(bufferingType);
- Q_UNUSED(deferCreation);
- return nil;
-}
-
-- (id)qt_fakeInitWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)windowStyle
- backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation screen:(NSScreen *)screen
-{
- Q_UNUSED(contentRect);
- Q_UNUSED(windowStyle);
- Q_UNUSED(bufferingType);
- Q_UNUSED(deferCreation);
- Q_UNUSED(screen);
- return nil;
-}
-@end
-
-@class QT_MANGLE_NAMESPACE(QNSWindowProxy);
-
-@interface QT_MANGLE_NAMESPACE(QNSWindowProxy) : NSWindow {
-}
-- (void)setTitle:(NSString *)title;
-- (void)qt_fakeSetTitle:(NSString *)title;
-@end
-
-@implementation QT_MANGLE_NAMESPACE(QNSWindowProxy)
-- (void)setTitle:(NSString *)title
-{
- QCFString cftitle(currentWindow->windowTitle());
-
- // evil reverse engineering
- if ([title isEqualToString:@"Print"]
- || [title isEqualToString:@"Page Setup"]
- || [[self className] isEqualToString:@"PMPrintingWindow"])
- title = (NSString *)(static_cast<CFStringRef>(cftitle));
- return [self qt_fakeSetTitle:title];
-}
-
-- (void)qt_fakeSetTitle:(NSString *)title
-{
- Q_UNUSED(title);
-}
-@end
-
-QT_BEGIN_NAMESPACE
-
-/*
- Intercept the NSColorPanel constructor if the shared
- color panel doesn't exist yet. What's going on here is
- quite wacky, because we want to override the NSPanel
- constructor and at the same time call the old NSPanel
- constructor. So what we do is we effectively rename the
- old NSPanel constructor qt_fakeInitWithContentRect:...
- and have the new one call the old one.
-*/
-void macStartInterceptNSPanelCtor()
-{
- qt_cocoa_change_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:),
- [QT_MANGLE_NAMESPACE(QNSPanelProxy) class],
- @selector(initWithContentRect:styleMask:backing:defer:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:));
- qt_cocoa_change_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:screen:),
- [QT_MANGLE_NAMESPACE(QNSPanelProxy) class],
- @selector(initWithContentRect:styleMask:backing:defer:screen:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:screen:));
-}
-
-/*
- Restore things as they were.
-*/
-void macStopInterceptNSPanelCtor()
-{
- qt_cocoa_change_back_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:screen:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:screen:));
- qt_cocoa_change_back_implementation(
- [NSPanel class],
- @selector(initWithContentRect:styleMask:backing:defer:),
- @selector(qt_fakeInitWithContentRect:styleMask:backing:defer:));
-}
-
-/*
- Intercept the NSPrintPanel and NSPageLayout setTitle: calls. The
- hack is similar as for NSColorPanel above.
-*/
-void macStartInterceptWindowTitle(QWidget *window)
-{
- currentWindow = window;
- qt_cocoa_change_implementation(
- [NSWindow class],
- @selector(setTitle:),
- [QT_MANGLE_NAMESPACE(QNSWindowProxy) class],
- @selector(setTitle:),
- @selector(qt_fakeSetTitle:));
-}
-
-/*
- Restore things as they were.
-*/
-void macStopInterceptWindowTitle()
-{
- currentWindow = 0;
- qt_cocoa_change_back_implementation(
- [NSWindow class],
- @selector(setTitle:),
- @selector(qt_fakeSetTitle:));
-}
-
-/*
- Doesn't really belong in here.
-*/
-NSButton *macCreateButton(const char *text, NSView *superview)
-{
- static const NSRect buttonFrameRect = { { 0.0, 0.0 }, { 0.0, 0.0 } };
-
- NSButton *button = [[NSButton alloc] initWithFrame:buttonFrameRect];
- [button setButtonType:NSMomentaryLightButton];
- [button setBezelStyle:NSRoundedBezelStyle];
- [button setTitle:(NSString*)(CFStringRef)QCFString(QDialogButtonBox::tr(text)
- .remove(QLatin1Char('&')))];
- [[button cell] setFont:[NSFont systemFontOfSize:
- [NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
- [superview addSubview:button];
- return button;
-}
-
-QT_END_NAMESPACE
-
-#endif