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 -#include -#include -#include -#include -#include -#include -#import -#import - -#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 -- (void)windowDidResize:(NSNotification *)notification; -- (BOOL)windowShouldClose:(id)window; -@end -#endif - -QT_USE_NAMESPACE - -@class QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate); - -@interface QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) : NSObject { - 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(delegate)]; - } - [static_cast(delegate) setResultSet:NO]; - setCocoaPanelColor(initial); - [static_cast(delegate) showColorPanel]; -} - -void QColorDialogPrivate::closeCocoaColorPanel() -{ - [static_cast(delegate) onCancelClicked]; -} - -void QColorDialogPrivate::releaseCocoaColorPanelDelegate() -{ - [static_cast(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(delegate) exec]; -} - -void QColorDialogPrivate::setCocoaPanelColor(const QColor &color) -{ - QMacCocoaAutoReleasePool pool; - QT_MANGLE_NAMESPACE(QCocoaColorPanelDelegate) *theDelegate = static_cast(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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#import -#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 -#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; isize(); ++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; ivalue([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; icount(); ++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; isize(); ++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; isize(); ++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(mDelegate); - [delegate->mSavePanel setDirectory:qt_mac_QStringToNSString(directory)]; -} - -QString QFileDialogPrivate::directory_sys() const -{ - QMacCocoaAutoReleasePool pool; - QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast(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(mDelegate); - return [delegate selectedFiles]; -} - -void QFileDialogPrivate::setNameFilters_sys(const QStringList &filters) -{ - QMacCocoaAutoReleasePool pool; - QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast(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(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(mDelegate); - [delegate->mPopUpButton selectItemAtIndex:index]; - [delegate filterChanged:nil]; - } -} - -QString QFileDialogPrivate::selectedNameFilter_sys() const -{ - QMacCocoaAutoReleasePool pool; - QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast(mDelegate); - int index = [delegate->mPopUpButton indexOfSelectedItem]; - return index != -1 ? nameFilters.at(index) : QString(); -} - -void QFileDialogPrivate::deleteNativeDialog_sys() -{ - QMacCocoaAutoReleasePool pool; - [reinterpret_cast(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(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(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(mDelegate); - [delegate runApplicationModalPanel]; - dialogResultCode_sys() == QDialog::Accepted ? q->accept() : q->reject(); -} - -QDialog::DialogCode QFileDialogPrivate::dialogResultCode_sys() -{ - QT_MANGLE_NAMESPACE(QNSOpenSavePanelDelegate) *delegate = static_cast(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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#import -#import - -#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 -- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize; -@end - -#endif - -@interface QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) : NSObject { - 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([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 >(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 >(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(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(static_cast(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) isMultiple:NO]; - [static_cast(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(delegate); - [del runApplicationModalPanel]; -} - -bool QFontDialogPrivate::showCocoaFontPanel() -{ - if (!sharedFontPanelAvailable) - return false; - - Q_Q(QFontDialog); - QMacCocoaAutoReleasePool pool; - createNSFontPanelDelegate(); - QT_MANGLE_NAMESPACE(QCocoaFontPanelDelegate) *del = static_cast(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 -#if defined(Q_WS_MAC) -#include -#include -#import -#import -#import - -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(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