File indexing completed on 2024-05-12 16:35:54
0001 /* This file is part of the KDE project 0002 Copyright 2005 Ariya Hidayat <ariya@kde.org> 0003 0004 This library is free software; you can redistribute it and/or 0005 modify it under the terms of the GNU Library General Public 0006 License as published by the Free Software Foundation; only 0007 version 2 of the License. 0008 0009 This library is distributed in the hope that it will be useful, 0010 but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0012 Library General Public License for more details. 0013 0014 You should have received a copy of the GNU Library General Public License 0015 along with this library; see the file COPYING.LIB. If not, write to 0016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0017 Boston, MA 02110-1301, USA. 0018 */ 0019 0020 #include "inspector.h" 0021 0022 // Qt 0023 #include <QFrame> 0024 #include <QLayout> 0025 #include <QTextStream> 0026 #include <QTreeWidget> 0027 #include <QVBoxLayout> 0028 #include <QPen> 0029 0030 // Sheets 0031 #include "Cell.h" 0032 #include "DependencyManager.h" 0033 #include "Map.h" 0034 #include "Region.h" 0035 #include "Sheet.h" 0036 #include "Style.h" 0037 #include "Value.h" 0038 0039 namespace Calligra 0040 { 0041 namespace Sheets 0042 { 0043 0044 class Inspector::Private 0045 { 0046 public: 0047 Cell cell; 0048 Style style; 0049 Sheet* sheet; 0050 0051 QTreeWidget *cellView; 0052 QTreeWidget *sheetView; 0053 QTreeWidget *styleView; 0054 QTreeWidget* depView; 0055 0056 void handleCell(); 0057 void handleSheet(); 0058 void handleStyle(); 0059 void handleDep(); 0060 }; 0061 0062 } // namespace Sheets 0063 } // namespace Calligra 0064 0065 using namespace Calligra::Sheets; 0066 0067 static QString boolAsString(bool b) 0068 { 0069 if (b) return QString("True"); 0070 else return QString("False"); 0071 } 0072 0073 #if 0 0074 static QString longAsHexstring(long l) 0075 { 0076 return QString("%1").arg(l, 8, 16); 0077 } 0078 #endif 0079 0080 static QString dirAsString(Qt::LayoutDirection dir) 0081 { 0082 QString str; 0083 switch (dir) { 0084 case Qt::LeftToRight: str = "Left to Right"; break; 0085 case Qt::RightToLeft: str = "Right to Left"; break; 0086 default: str = "Unknown"; break; 0087 } 0088 return str; 0089 } 0090 0091 void Inspector::Private::handleCell() 0092 { 0093 QString str; 0094 0095 cellView->clear(); 0096 0097 new QTreeWidgetItem(cellView, QStringList() << "Column" << QString::number(cell.column())); 0098 new QTreeWidgetItem(cellView, QStringList() << "Row" << QString::number(cell.row())); 0099 new QTreeWidgetItem(cellView, QStringList() << "Name" << cell.name()); 0100 new QTreeWidgetItem(cellView, QStringList() << "Full Name" << cell.fullName()); 0101 0102 new QTreeWidgetItem(cellView, QStringList() << "Default" << boolAsString(cell.isDefault())); 0103 new QTreeWidgetItem(cellView, QStringList() << "Empty" << boolAsString(cell.isEmpty())); 0104 new QTreeWidgetItem(cellView, QStringList() << "Formula" << boolAsString(cell.isFormula())); 0105 // new QTreeWidgetItem( cellView, QStringList() << "Format Properties" << longAsHexstring( static_cast<long>( cell.style()->propertiesMask() ) ) ); 0106 // new QTreeWidgetItem( cellView, QStringList() << "Style Properties" << longAsHexstring( static_cast<long>( cell.style()->style()->features() ) ) ); 0107 new QTreeWidgetItem(cellView, QStringList() << "Text" << cell.userInput()); 0108 new QTreeWidgetItem(cellView, QStringList() << "Text (Displayed)" << 0109 cell.displayText().replace(QChar('\n'), "\\n")); 0110 0111 QTextStream ts(&str, QIODevice::WriteOnly); 0112 ts << cell.value(); 0113 new QTreeWidgetItem(cellView, QStringList() << "Value" << str); 0114 0115 new QTreeWidgetItem(cellView, QStringList() << "Link" << cell.link()); 0116 0117 new QTreeWidgetItem(cellView, QStringList() << "Width" << QString::number(cell.width())); 0118 new QTreeWidgetItem(cellView, QStringList() << "Height" << QString::number(cell.height())); 0119 } 0120 0121 void Inspector::Private::handleStyle() // direct style access 0122 { 0123 styleView->clear(); 0124 const Style style = cell.style(); 0125 0126 new QTreeWidgetItem(styleView, QStringList() << "Style Name" << style.parentName()); 0127 0128 new QTreeWidgetItem(styleView, QStringList() << "Angle" << QString::number(style.angle())); 0129 new QTreeWidgetItem(styleView, QStringList() << "Multirow" << boolAsString(style.wrapText())); 0130 new QTreeWidgetItem(styleView, QStringList() << "Protected" << boolAsString(!style.notProtected())); 0131 new QTreeWidgetItem(styleView, QStringList() << "Vertical Text" << boolAsString(style.verticalText())); 0132 0133 new QTreeWidgetItem(styleView, QStringList() << "Currency symbol" << style.currency().symbol()); 0134 new QTreeWidgetItem(styleView, QStringList() << "Currency code" << style.currency().code()); 0135 0136 QTreeWidgetItem* flags = new QTreeWidgetItem(styleView, QStringList("Flags")); 0137 new QTreeWidgetItem(flags, QStringList() << "Border (left)" << 0138 boolAsString(style.hasAttribute(Style::LeftPen))); 0139 new QTreeWidgetItem(flags, QStringList() << "Border (right)" << 0140 boolAsString(style.hasAttribute(Style::RightPen))); 0141 new QTreeWidgetItem(flags, QStringList() << "Border (top)" << 0142 boolAsString(style.hasAttribute(Style::TopPen))); 0143 new QTreeWidgetItem(flags, QStringList() << "Border (bottom)" << 0144 boolAsString(style.hasAttribute(Style::BottomPen))); 0145 0146 new QTreeWidgetItem(styleView, QStringList() << "Border pen width (bottom)" << 0147 QString::number(style.bottomBorderPen().width())); 0148 } 0149 0150 void Inspector::Private::handleSheet() 0151 { 0152 sheetView->clear(); 0153 0154 new QTreeWidgetItem(sheetView, QStringList() << "Name" << sheet->sheetName()) ; 0155 new QTreeWidgetItem(sheetView, QStringList() << "Layout Direction" << dirAsString(sheet->layoutDirection())); 0156 } 0157 0158 void Inspector::Private::handleDep() 0159 { 0160 DependencyManager* manager = sheet->map()->dependencyManager(); 0161 Region deps = manager->consumingRegion(cell); 0162 0163 depView->clear(); 0164 Region::ConstIterator end(deps.constEnd()); 0165 for (Region::ConstIterator it(deps.constBegin()); it != end; ++it) { 0166 const QRect range = (*it)->rect(); 0167 for (int col = range.left(); col <= range.right(); ++col) 0168 for (int row = range.top(); row <= range.bottom(); ++row) { 0169 QString k1, k2; 0170 0171 k1 = Cell::fullName((*it)->sheet(), col, row); 0172 0173 new QTreeWidgetItem(depView, QStringList() << k1 << k2); 0174 } 0175 } 0176 0177 } 0178 0179 Inspector::Inspector(const Cell& cell) 0180 : KPageDialog() 0181 , d(new Private) 0182 { 0183 setFaceType(Tabbed); 0184 setWindowTitle("Inspector"); 0185 setStandardButtons(QDialogButtonBox::Close); 0186 0187 d->cell = cell; 0188 d->style = cell.style(); 0189 d->sheet = cell.sheet(); 0190 0191 QFrame* cellPage = new QFrame(); 0192 addPage(cellPage, QString("Cell")); 0193 QVBoxLayout* cellLayout = new QVBoxLayout(cellPage); 0194 d->cellView = new QTreeWidget(cellPage); 0195 cellLayout->addWidget(d->cellView); 0196 d->cellView->setHeaderLabels(QStringList() << "Key" << "Value"); 0197 0198 QFrame* stylePage = new QFrame(); 0199 addPage(stylePage, QString("Style")); 0200 QVBoxLayout* styleLayout = new QVBoxLayout(stylePage); 0201 d->styleView = new QTreeWidget(stylePage); 0202 styleLayout->addWidget(d->styleView); 0203 d->styleView->setHeaderLabels(QStringList() << "Key" << "Value"); 0204 0205 QFrame* sheetPage = new QFrame(); 0206 addPage(sheetPage, QString("Sheet")); 0207 QVBoxLayout* sheetLayout = new QVBoxLayout(sheetPage); 0208 d->sheetView = new QTreeWidget(sheetPage); 0209 sheetLayout->addWidget(d->sheetView); 0210 d->sheetView->setHeaderLabels(QStringList() << "Key" << "Value"); 0211 0212 QFrame* depPage = new QFrame(); 0213 addPage(depPage, QString("Dependencies")); 0214 QVBoxLayout* depLayout = new QVBoxLayout(depPage); 0215 d->depView = new QTreeWidget(depPage); 0216 depLayout->addWidget(d->depView); 0217 d->depView->setHeaderLabels(QStringList() << "Cell" << "Content"); 0218 0219 d->handleCell(); 0220 d->handleSheet(); 0221 d->handleStyle(); 0222 d->handleDep(); 0223 0224 resize(350, 400); 0225 } 0226 0227 Inspector::~Inspector() 0228 { 0229 delete d; 0230 }