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 }