src/gui/widgets/qcocoatoolbardelegate_mac.mm
author Eckhart Koeppen <eckhart.koppen@nokia.com>
Fri, 16 Apr 2010 11:39:52 +0300
branchRCL_3
changeset 9 740e5562c97f
parent 4 3b1da2848fc7
child 30 5dc02b23752f
permissions -rw-r--r--
8b5beb2a553102639e9eb38c8f8f0f6775e8545b

/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, 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.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#import <private/qcocoatoolbardelegate_mac_p.h>
#ifdef QT_MAC_USE_COCOA
#include <private/qmainwindowlayout_p.h>
#include <private/qt_mac_p.h>
#include <private/qt_cocoa_helpers_mac_p.h>
#include <private/qcocoaview_mac_p.h>
#include <private/qwidget_p.h>
#include <qtoolbar.h>
#include <qlayout.h>
#include <qdebug.h>

QT_BEGIN_NAMESPACE
extern QWidgetPrivate *qt_widget_private(QWidget *widget);
QT_END_NAMESPACE

QT_FORWARD_DECLARE_CLASS(QMainWindowLayout);
QT_FORWARD_DECLARE_CLASS(QToolBar);
QT_FORWARD_DECLARE_CLASS(QCFString);

@implementation QCocoaToolBarDelegate

- (id)initWithMainWindowLayout:(QMainWindowLayout *)layout
{
    self = [super init];
    if (self) {
        mainWindowLayout = layout;
    }
    return self;
}

- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
{
    Q_UNUSED(toolbar);
    return [NSArray arrayWithObject:@"com.trolltech.qt.nstoolbar-qtoolbar"];
}

- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar
{
    return [self toolbarAllowedItemIdentifiers:toolbar];
}

- (void)toolbarDidRemoveItem:(NSNotification *)notification
{
    NSToolbarItem *item = [[notification userInfo] valueForKey:@"item"];
    mainWindowLayout->unifiedToolbarHash.remove(item);
    for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) {
        if (mainWindowLayout->toolbarItemsCopy.at(i) == item) {
            // I know about it, so release it.
            mainWindowLayout->toolbarItemsCopy.removeAt(i);
            mainWindowLayout->qtoolbarsInUnifiedToolbarList.removeAt(i);
            [item release];
            break;
        }
    }
}

- (NSToolbarItem *)toolbar:(NSToolbar *)nstoolbar itemForItemIdentifier:(NSString *)itemIdentifier
    willBeInsertedIntoToolbar:(BOOL)flag
{
    Q_UNUSED(flag);
    Q_UNUSED(nstoolbar);
    QToolBar *tb = mainWindowLayout->cocoaItemIDToToolbarHash.value(
            QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)(itemIdentifier));
    NSToolbarItem *item = nil;
    if (tb) {
        item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];
        mainWindowLayout->unifiedToolbarHash.insert(item, tb);
    }
    return item;
}

- (void)toolbarWillAddItem:(NSNotification *)notification
{
    NSToolbarItem *item = [[notification userInfo] valueForKey:@"item"];
    QToolBar *tb = mainWindowLayout->cocoaItemIDToToolbarHash.value(
            QT_PREPEND_NAMESPACE(qt_mac_NSStringToQString)([item itemIdentifier]));
    if (!tb)
        return; // I can't really do anything about this.
    [item retain];
    [item setView:QT_PREPEND_NAMESPACE(qt_mac_nativeview_for)(tb)];

    NSArray *items = [[qt_mac_window_for(mainWindowLayout->layoutState.mainWindow->window()) toolbar] items];
    int someIndex = 0;
    for (NSToolbarItem *i in items) {
        if (i == item)
            break;
        ++someIndex;
    }
    mainWindowLayout->toolbarItemsCopy.insert(someIndex, item);

    // This is synchronization code that was needed in Carbon, but may not be needed anymore here.
    QToolBar *toolbar = mainWindowLayout->unifiedToolbarHash.value(item);
    if (toolbar) {
        int toolbarIndex = mainWindowLayout->qtoolbarsInUnifiedToolbarList.indexOf(toolbar);
        if (someIndex != toolbarIndex) {
            // Dang, we must be out of sync, rebuild it from the "toolbarItemsCopy"
            mainWindowLayout->qtoolbarsInUnifiedToolbarList.clear();
            for (int i = 0; i < mainWindowLayout->toolbarItemsCopy.size(); ++i) {
                // This will either append the correct toolbar or an
                // null toolbar. This is fine because this list
                // is really only kept to make sure that things are but in the right order.
                mainWindowLayout->qtoolbarsInUnifiedToolbarList.append(
                                  mainWindowLayout->unifiedToolbarHash.value(mainWindowLayout->
                                                                        toolbarItemsCopy.at(i)));
            }
        }
        toolbar->update();
    }
}

@end
#endif // QT_MAC_USE_COCOA