| /**************************************************************************** |
| ** |
| ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). |
| ** All rights reserved. |
| ** Contact: Nokia Corporation (qt-info@nokia.com) |
| ** |
| ** This file is part of the Qt Designer 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 "itemview_propertysheet.h" |
| |
| #include <QtDesigner/QDesignerFormEditorInterface> |
| |
| #include <QtGui/QAbstractItemView> |
| #include <QtGui/QHeaderView> |
| #include <QtCore/QDebug> |
| |
| QT_BEGIN_NAMESPACE |
| |
| namespace qdesigner_internal { |
| |
| struct Property { |
| Property() : m_sheet(0),m_id(-1) {} |
| Property(QDesignerPropertySheetExtension *sheet, int id) |
| : m_sheet(sheet), m_id(id) {} |
| |
| QDesignerPropertySheetExtension *m_sheet; |
| int m_id; |
| }; |
| |
| typedef QMap<int, Property> FakePropertyMap; |
| |
| struct ItemViewPropertySheetPrivate { |
| ItemViewPropertySheetPrivate(QDesignerFormEditorInterface *core, |
| QHeaderView *horizontalHeader, |
| QHeaderView *verticalHeader); |
| |
| inline QStringList realPropertyNames(); |
| inline QString fakePropertyName(const QString &prefix, const QString &realName); |
| |
| // Maps index of fake property to index of real property in respective sheet |
| FakePropertyMap m_propertyIdMap; |
| |
| // Maps name of fake property to name of real property |
| QHash<QString, QString> m_propertyNameMap; |
| |
| QHash<QHeaderView *, QDesignerPropertySheetExtension *> m_propertySheet; |
| QStringList m_realPropertyNames; |
| }; |
| |
| // Name of the fake group |
| static const char *headerGroup = "Header"; |
| |
| // Name of the real properties |
| static const char *visibleProperty = "visible"; |
| static const char *cascadingSectionResizesProperty = "cascadingSectionResizes"; |
| static const char *defaultSectionSizeProperty = "defaultSectionSize"; |
| static const char *highlightSectionsProperty = "highlightSections"; |
| static const char *minimumSectionSizeProperty = "minimumSectionSize"; |
| static const char *showSortIndicatorProperty = "showSortIndicator"; |
| static const char *stretchLastSectionProperty = "stretchLastSection"; |
| } // namespace qdesigner_internal |
| |
| using namespace qdesigner_internal; |
| |
| |
| /***************** ItemViewPropertySheetPrivate *********************/ |
| |
| ItemViewPropertySheetPrivate::ItemViewPropertySheetPrivate(QDesignerFormEditorInterface *core, |
| QHeaderView *horizontalHeader, |
| QHeaderView *verticalHeader) |
| { |
| if (horizontalHeader) |
| m_propertySheet.insert(horizontalHeader, |
| qt_extension<QDesignerPropertySheetExtension*> |
| (core->extensionManager(), horizontalHeader)); |
| if (verticalHeader) |
| m_propertySheet.insert(verticalHeader, |
| qt_extension<QDesignerPropertySheetExtension*> |
| (core->extensionManager(), verticalHeader)); |
| } |
| |
| QStringList ItemViewPropertySheetPrivate::realPropertyNames() |
| { |
| if (m_realPropertyNames.isEmpty()) |
| m_realPropertyNames |
| << QLatin1String(visibleProperty) |
| << QLatin1String(cascadingSectionResizesProperty) |
| << QLatin1String(defaultSectionSizeProperty) |
| << QLatin1String(highlightSectionsProperty) |
| << QLatin1String(minimumSectionSizeProperty) |
| << QLatin1String(showSortIndicatorProperty) |
| << QLatin1String(stretchLastSectionProperty); |
| return m_realPropertyNames; |
| } |
| |
| QString ItemViewPropertySheetPrivate::fakePropertyName(const QString &prefix, |
| const QString &realName) |
| { |
| // prefix = "header", realPropertyName = "isVisible" returns "headerIsVisible" |
| QString fakeName = prefix + realName.at(0).toUpper() + realName.mid(1); |
| m_propertyNameMap.insert(fakeName, realName); |
| return fakeName; |
| } |
| |
| /***************** ItemViewPropertySheet *********************/ |
| |
| /*! |
| \class qdesigner_internal::ItemViewPropertySheet |
| |
| \brief |
| Adds header fake properties to QTreeView and QTableView objects |
| |
| QHeaderView objects are currently not shown in the object inspector. |
| This class adds some fake properties to the property sheet |
| of QTreeView and QTableView objects that nevertheless allow the manipulation |
| of the headers attached to the item view object. |
| |
| Currently the defaultAlignment property is not shown because the property sheet |
| would only show integers, instead of the Qt::Alignment enumeration. |
| |
| The fake properties here need special handling in QDesignerResource, uiloader and uic. |
| */ |
| |
| ItemViewPropertySheet::ItemViewPropertySheet(QTreeView *treeViewObject, QObject *parent) |
| : QDesignerPropertySheet(treeViewObject, parent), |
| d(new ItemViewPropertySheetPrivate(core(), treeViewObject->header(), 0)) |
| { |
| initHeaderProperties(treeViewObject->header(), QLatin1String("header")); |
| } |
| |
| ItemViewPropertySheet::ItemViewPropertySheet(QTableView *tableViewObject, QObject *parent) |
| : QDesignerPropertySheet(tableViewObject, parent), |
| d(new ItemViewPropertySheetPrivate(core(), |
| tableViewObject->horizontalHeader(), |
| tableViewObject->verticalHeader())) |
| { |
| initHeaderProperties(tableViewObject->horizontalHeader(), QLatin1String("horizontalHeader")); |
| initHeaderProperties(tableViewObject->verticalHeader(), QLatin1String("verticalHeader")); |
| } |
| |
| ItemViewPropertySheet::~ItemViewPropertySheet() |
| { |
| delete d; |
| } |
| |
| void ItemViewPropertySheet::initHeaderProperties(QHeaderView *hv, const QString &prefix) |
| { |
| QDesignerPropertySheetExtension *headerSheet = d->m_propertySheet.value(hv); |
| Q_ASSERT(headerSheet); |
| const QString headerGroupS = QLatin1String(headerGroup); |
| foreach (const QString &realPropertyName, d->realPropertyNames()) { |
| const int headerIndex = headerSheet->indexOf(realPropertyName); |
| Q_ASSERT(headerIndex != -1); |
| const QVariant defaultValue = realPropertyName == QLatin1String(visibleProperty) ? |
| QVariant(true) : headerSheet->property(headerIndex); |
| const QString fakePropertyName = d->fakePropertyName(prefix, realPropertyName); |
| const int fakeIndex = createFakeProperty(fakePropertyName, defaultValue); |
| d->m_propertyIdMap.insert(fakeIndex, Property(headerSheet, headerIndex)); |
| setAttribute(fakeIndex, true); |
| setPropertyGroup(fakeIndex, headerGroupS); |
| } |
| } |
| |
| /*! |
| Returns the mapping of fake property names to real property names |
| */ |
| QHash<QString,QString> ItemViewPropertySheet::propertyNameMap() const |
| { |
| return d->m_propertyNameMap; |
| } |
| |
| QVariant ItemViewPropertySheet::property(int index) const |
| { |
| const FakePropertyMap::const_iterator it = d->m_propertyIdMap.constFind(index); |
| if (it != d->m_propertyIdMap.constEnd()) |
| return it.value().m_sheet->property(it.value().m_id); |
| return QDesignerPropertySheet::property(index); |
| } |
| |
| void ItemViewPropertySheet::setProperty(int index, const QVariant &value) |
| { |
| const FakePropertyMap::iterator it = d->m_propertyIdMap.find(index); |
| if (it != d->m_propertyIdMap.end()) { |
| it.value().m_sheet->setProperty(it.value().m_id, value); |
| } else { |
| QDesignerPropertySheet::setProperty(index, value); |
| } |
| } |
| |
| void ItemViewPropertySheet::setChanged(int index, bool changed) |
| { |
| const FakePropertyMap::iterator it = d->m_propertyIdMap.find(index); |
| if (it != d->m_propertyIdMap.end()) { |
| it.value().m_sheet->setChanged(it.value().m_id, changed); |
| } else { |
| QDesignerPropertySheet::setChanged(index, changed); |
| } |
| } |
| |
| bool ItemViewPropertySheet::isChanged(int index) const |
| { |
| const FakePropertyMap::const_iterator it = d->m_propertyIdMap.constFind(index); |
| if (it != d->m_propertyIdMap.constEnd()) |
| return it.value().m_sheet->isChanged(it.value().m_id); |
| return QDesignerPropertySheet::isChanged(index); |
| } |
| |
| bool ItemViewPropertySheet::hasReset(int index) const |
| { |
| const FakePropertyMap::const_iterator it = d->m_propertyIdMap.constFind(index); |
| if (it != d->m_propertyIdMap.constEnd()) |
| return it.value().m_sheet->hasReset(it.value().m_id); |
| return QDesignerPropertySheet::hasReset(index); |
| } |
| |
| bool ItemViewPropertySheet::reset(int index) |
| { |
| const FakePropertyMap::iterator it = d->m_propertyIdMap.find(index); |
| if (it != d->m_propertyIdMap.end()) { |
| QDesignerPropertySheetExtension *headerSheet = it.value().m_sheet; |
| const int headerIndex = it.value().m_id; |
| const bool resetRC = headerSheet->reset(headerIndex); |
| // Resetting for "visible" might fail and the stored default |
| // of the Widget database is "false" due to the widget not being |
| // visible at the time it was determined. Reset to "true" manually. |
| if (!resetRC && headerSheet->propertyName(headerIndex) == QLatin1String(visibleProperty)) { |
| headerSheet->setProperty(headerIndex, QVariant(true)); |
| headerSheet->setChanged(headerIndex, false); |
| return true; |
| } |
| return resetRC; |
| } else { |
| return QDesignerPropertySheet::reset(index); |
| } |
| } |
| |
| QT_END_NAMESPACE |