/****************************************************************************
**
** 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