File indexing completed on 2024-04-28 16:24:40

0001 /* This file is part of the KDE project
0002    Copyright (C) 2007 - 2010 Dag Andersen <danders@get2net.dk>
0003    Copyright (C) 2012 Dag Andersen <danders@get2net.dk>
0004 
0005    This library is free software; you can redistribute it and/or
0006    modify it under the terms of the GNU Library General Public
0007    License as published by the Free Software Foundation; either
0008    version 2 of the License, or (at your option) any later version.
0009 
0010    This library is distributed in the hope that it will be useful,
0011    but WITHOUT ANY WARRANTY; without even the implied warranty of
0012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0013    Library General Public License for more details.
0014 
0015    You should have received a copy of the GNU Library General Public License
0016    along with this library; see the file COPYING.LIB.  If not, write to
0017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0018    Boston, MA 02110-1301, USA.
0019 */
0020 
0021 // clazy:excludeall=qstring-arg
0022 #include "kptviewlistdialog.h"
0023 #include "kptviewlist.h"
0024 #include "kptview.h"
0025 
0026 #ifdef PLAN_USE_KREPORT
0027 #include "reports/reportview.h"
0028 #endif
0029 
0030 #include <kptdebug.h>
0031 
0032 #include <KLocalizedString>
0033 
0034 #include <QTextEdit>
0035 
0036 namespace KPlato
0037 {
0038 
0039 ViewListDialog::ViewListDialog(View *view, ViewListWidget &viewlist, QWidget *parent)
0040     : KoDialog(parent)
0041 {
0042     setCaption(xi18nc("@title:window", "Add View"));
0043     setButtons(KoDialog::Ok | KoDialog::Cancel);
0044     setDefaultButton(Ok);
0045 
0046     m_panel = new AddViewPanel(view, viewlist, this);
0047 
0048     setMainWidget(m_panel);
0049 
0050     enableButtonOk(false);
0051 
0052     connect(this,&KoDialog::okClicked,this,&ViewListDialog::slotOk);
0053     connect(m_panel, &AddViewPanel::enableButtonOk, this, &KoDialog::enableButtonOk);
0054     connect(m_panel, &AddViewPanel::viewCreated, this, &ViewListDialog::viewCreated);
0055 
0056     connect(&viewlist, &ViewListWidget::viewListItemRemoved, this, &ViewListDialog::slotViewListItemRemoved);
0057 }
0058 
0059 void ViewListDialog::slotViewListItemRemoved(ViewListItem *)
0060 {
0061     reject();
0062 }
0063 
0064 void ViewListDialog::slotOk() {
0065     if (m_panel->ok()) {
0066         accept();
0067     }
0068 }
0069 
0070 //------------------------
0071 AddViewPanel::AddViewPanel(View *view, ViewListWidget &viewlist, QWidget *parent)
0072     : QWidget(parent),
0073       m_view(view),
0074       m_viewlist(viewlist),
0075       m_viewnameChanged(false),
0076       m_viewtipChanged(false)
0077 {
0078     widget.setupUi(this);
0079 
0080     // NOTE: these lists must match switch in ok() FIXME: refactor
0081     m_viewtypes << "ResourceEditor"
0082             << "TaskEditor"
0083             << "CalendarEditor"
0084             << "AccountsEditor"
0085             << "DependencyEditor"
0086             << "PertEditor"
0087             << "ScheduleHandlerView"
0088             << "TaskStatusView"
0089             << "TaskView"
0090             << "TaskWorkPackageView"
0091             << "GanttView"
0092             << "MilestoneGanttView"
0093             << "ResourceAppointmentsView"
0094             << "ResourceAppointmentsGanttView"
0095             << "AccountsView"
0096             << "ProjectStatusView"
0097             << "PerformanceStatusView"
0098             << "ReportsGeneratorView";
0099 #ifdef PLAN_USE_KREPORT
0100     m_viewtypes << "ReportView";
0101 #endif
0102     QStringList lst;
0103     lst << i18n("Resource Editor")
0104             << i18n("Task Editor")
0105             << i18n("Work & Vacation Editor")
0106             << i18n("Accounts Editor")
0107             << i18n("Dependency Editor (Graphic)")
0108             << i18n("Dependency Editor (List)")
0109             << i18n("Schedule Handler")
0110             << i18n("Task Status")
0111             << i18n("Task View")
0112             << i18n("Work Package View")
0113             << i18n("Gantt View")
0114             << i18n("Milestone Gantt View")
0115             << i18n("Resource Assignments")
0116             << i18n("Resource Assignments (Gantt)")
0117             << i18n("Cost Breakdown")
0118             << i18n("Project Performance Chart")
0119             << i18n("Tasks Performance Chart")
0120             << i18n("Reports generator");
0121 #ifdef PLAN_USE_KREPORT
0122       lst << i18n("Report");
0123 #endif
0124     widget.viewtype->addItems(lst);
0125 
0126     foreach (ViewListItem *item, m_viewlist.categories()) {
0127         m_categories.insert(item->text(0), item);
0128     }
0129     widget.category->addItems(m_categories.keys());
0130     ViewListItem *curr = m_viewlist.currentCategory();
0131     if (curr) {
0132         const QList<ViewListItem*> &items = m_categories.values();
0133         widget.category->setCurrentIndex(items.indexOf(curr));
0134     }
0135     fillAfter(m_categories.value(widget.category->currentText()));
0136 
0137     viewtypeChanged(widget.viewtype->currentIndex());
0138 
0139     connect(widget.viewname, &QLineEdit::textChanged, this, &AddViewPanel::changed);
0140     connect(widget.tooltip, &QLineEdit::textChanged, this, &AddViewPanel::changed);
0141     connect(widget.viewname, &QLineEdit::textChanged, this, &AddViewPanel::viewnameChanged);
0142     connect(widget.tooltip, &QLineEdit::textChanged, this, &AddViewPanel::viewtipChanged);
0143     connect(widget.insertAfter, SIGNAL(currentIndexChanged(int)), SLOT(changed()));
0144     connect(widget.viewtype, SIGNAL(currentIndexChanged(int)), SLOT(viewtypeChanged(int)));
0145     connect(widget.category, &QComboBox::editTextChanged, this, &AddViewPanel::categoryChanged);
0146 
0147     QString categoryWhatsThis = xi18nc("@info:whatsthis",
0148                                        "<title>The category of the view</title><nl/>"
0149                                        "The view is placed under this category in the view selector.<nl/>"
0150                                        "You can edit the category name to create a new category.");
0151     widget.categoryLabel->setWhatsThis(categoryWhatsThis);
0152     widget.category->setWhatsThis(categoryWhatsThis);
0153 
0154     QTimer::singleShot(0, this, &AddViewPanel::changed);
0155 }
0156 
0157 void AddViewPanel::viewnameChanged(const QString &text)
0158 {
0159     m_viewnameChanged = ! text.isEmpty();
0160 }
0161 
0162 void AddViewPanel::viewtipChanged(const QString &text)
0163 {
0164     m_viewtipChanged = ! text.isEmpty();
0165 }
0166 
0167 void AddViewPanel::viewtypeChanged(int idx)
0168 {
0169     ViewInfo vi = m_view->defaultViewInfo(m_viewtypes.value(idx));
0170     if (widget.viewname->text().isEmpty()) {
0171         m_viewnameChanged = false;
0172     }
0173     if (! m_viewnameChanged) {
0174         widget.viewname->setText(vi.name);
0175         m_viewnameChanged = false;
0176     }
0177     if (widget.tooltip->text().isEmpty()) {
0178         m_viewtipChanged = false;
0179     }
0180     if (! m_viewtipChanged) {
0181         QTextEdit e;
0182         e.setText(vi.tip);
0183         widget.tooltip->setText(e.toPlainText());
0184         m_viewtipChanged = false;
0185     }
0186 }
0187 
0188 void AddViewPanel::categoryChanged()
0189 {
0190     debugPlan<<widget.category->currentText();
0191     fillAfter(m_categories.value(widget.category->currentText()));
0192     changed();
0193 }
0194 
0195 void AddViewPanel::fillAfter(ViewListItem *cat)
0196 {
0197     debugPlan<<cat;
0198     widget.insertAfter->clear();
0199     if (cat) {
0200         widget.insertAfter->addItem(i18n("Top"));
0201 //        int idx = 0;
0202         for (int i = 0; i < cat->childCount(); ++i) {
0203             ViewListItem *itm = static_cast<ViewListItem*>(cat->child(i));
0204             widget.insertAfter->addItem(itm->text(0), QVariant::fromValue((void*)itm));
0205         }
0206         if (cat == m_viewlist.currentCategory()) {
0207             ViewListItem *v = m_viewlist.currentItem();
0208             if (v && v->type() != ViewListItem::ItemType_Category) {
0209                 widget.insertAfter->setCurrentIndex(cat->indexOfChild(v) + 1);
0210             }
0211         }
0212     }
0213 }
0214 
0215 bool AddViewPanel::ok()
0216 {
0217     QString n = widget.category->currentText();
0218     ViewListItem *curr = m_categories.value(n);
0219     QString c = curr == 0 ? n : curr->tag();
0220 
0221     ViewListItem *cat = m_viewlist.addCategory(c, n);
0222     if (cat == 0) {
0223         return false;
0224     }
0225     ViewBase *v = 0;
0226     int index = widget.insertAfter->currentIndex();
0227     int viewtype = widget.viewtype->currentIndex();
0228     switch (viewtype) {
0229         case 0: { // Resource editor
0230             v = m_view->createResourceEditor(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0231             break; }
0232         case 1: { // Task editor
0233             v = m_view->createTaskEditor(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0234             break; }
0235         case 2: { // Work & Vacation Editor
0236             v = m_view->createCalendarEditor(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0237             break; }
0238         case 3: { // Accounts Editor
0239             v = m_view->createAccountsEditor(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0240             break; }
0241         case 4: { // Dependency Editor (Graphic)
0242             v = m_view->createDependencyEditor(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0243             break; }
0244         case 5: { // Dependency Editor (List)
0245             v = m_view->createPertEditor(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0246             break; }
0247         case 6: { // Schedules Handler
0248             v = m_view->createScheduleHandler(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0249             break; }
0250         case 7: { // Task status
0251             v = m_view->createTaskStatusView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0252             break; }
0253         case 8: { // Task status
0254             v = m_view->createTaskView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0255             break; }
0256         case 9: { // Task work package
0257             v = m_view->createTaskWorkPackageView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0258             break; }
0259         case 10: { // Gantt View
0260             v = m_view->createGanttView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0261             break; }
0262         case 11: { // Milestone Gantt View
0263             v = m_view->createMilestoneGanttView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0264             break; }
0265         case 12: { // Resource Assignments
0266             v = m_view->createResourceAppointmentsView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0267             break; }
0268         case 13: { // Resource Assignments (Gantt)
0269             v = m_view->createResourceAppointmentsGanttView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0270             break; }
0271         case 14: { // Cost Breakdown
0272             v = m_view->createAccountsView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0273             break; }
0274         case 15: { // Project Performance Chart
0275             v = m_view->createProjectStatusView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0276             break; }
0277         case 16: { // Task Performance Chart
0278             v = m_view->createPerformanceStatusView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0279             break; }
0280         case 17: { // Reports generator
0281             v = m_view->createReportsGeneratorView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0282             break; }
0283 #ifdef PLAN_USE_KREPORT
0284         case 18: { // Report view
0285             v = m_view->createReportView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0286             break; }
0287 #endif
0288         default:
0289             errorPlan<<"Unknown view type!";
0290             break;
0291     }
0292     emit viewCreated(v);
0293     return true;
0294 }
0295 
0296 void AddViewPanel::changed()
0297 {
0298     bool disable = widget.viewname->text().isEmpty() | widget.viewtype->currentText().isEmpty() | widget.category->currentText().isEmpty();
0299     emit enableButtonOk(! disable);
0300 }
0301 
0302 //------------------------
0303 ViewListEditViewDialog::ViewListEditViewDialog(ViewListWidget &viewlist, ViewListItem *item, QWidget *parent)
0304     : KoDialog(parent)
0305 {
0306     setCaption(xi18nc("@title:window", "Configure View"));
0307     setButtons(KoDialog::Ok | KoDialog::Cancel);
0308     setDefaultButton(Ok);
0309 
0310     m_panel = new EditViewPanel(viewlist, item, this);
0311 
0312     setMainWidget(m_panel);
0313 
0314     enableButtonOk(false);
0315 
0316     connect(this,&KoDialog::okClicked,this,&ViewListEditViewDialog::slotOk);
0317     connect(m_panel, &EditViewPanel::enableButtonOk, this, &KoDialog::enableButtonOk);
0318 
0319     connect(&viewlist, &ViewListWidget::viewListItemRemoved, this, &ViewListEditViewDialog::slotViewListItemRemoved);
0320 }
0321 
0322 void ViewListEditViewDialog::slotViewListItemRemoved(ViewListItem *)
0323 {
0324     reject();
0325 }
0326 
0327 void ViewListEditViewDialog::slotOk() {
0328     if (m_panel->ok()) {
0329         accept();
0330     }
0331 }
0332 
0333 EditViewPanel::EditViewPanel(ViewListWidget &viewlist, ViewListItem *item, QWidget *parent)
0334     : QWidget(parent),
0335       m_item(item),
0336       m_viewlist(viewlist)
0337 {
0338     widget.setupUi(this);
0339 
0340     widget.viewname->setText(item->text(0));
0341     QTextEdit e;
0342     e.setText(item->toolTip(0));
0343     widget.tooltip->setText(e.toPlainText());
0344 
0345     foreach (ViewListItem *item, m_viewlist.categories()) {
0346         m_categories.insert(item->text(0), item);
0347     }
0348     widget.category->addItems(m_categories.keys());
0349     ViewListItem *curr = m_viewlist.currentCategory();
0350     if (curr) {
0351         const QList<ViewListItem*> &items = m_categories.values();
0352         widget.category->setCurrentIndex(items.indexOf(curr));
0353     }
0354     categoryChanged();
0355 
0356     connect(widget.viewname, &QLineEdit::textChanged, this, &EditViewPanel::changed);
0357     connect(widget.tooltip, &QLineEdit::textChanged, this, &EditViewPanel::changed);
0358     connect(widget.insertAfter, SIGNAL(currentIndexChanged(int)), SLOT(changed()));
0359     connect(widget.category, &QComboBox::editTextChanged, this, &EditViewPanel::categoryChanged);
0360 
0361     QString categoryWhatsThis = xi18nc("@info:whatsthis",
0362                                        "<title>The category of the view</title><nl/>"
0363                                        "The view is placed under this category in the view selector.<nl/>"
0364                                        "Selecting a different category will move the view to the new category.<nl/>"
0365                                        "You can edit the category name to create a new category.");
0366     widget.categoryLabel->setWhatsThis(categoryWhatsThis);
0367     widget.category->setWhatsThis(categoryWhatsThis);
0368 }
0369 
0370 bool EditViewPanel::ok()
0371 {
0372     QString n = widget.category->currentText();
0373     ViewListItem *curr = m_categories.value(n);
0374     QString c = curr == 0 ? n : curr->tag();
0375 
0376     ViewListItem *cat = m_viewlist.addCategory(c, n);
0377     if (cat == 0) {
0378         warnPlan<<"No category";
0379         return false;
0380     }
0381     if (widget.viewname->text() != m_item->text(0)) {
0382         m_item->setText(0, widget.viewname->text());
0383     }
0384     if (widget.tooltip->text() != m_item->toolTip(0)) {
0385         m_item->setToolTip(0, widget.tooltip->text());
0386     }
0387     m_viewlist.removeViewListItem(m_item);
0388     int index = qMin(widget.insertAfter->currentIndex(), cat->childCount());
0389     m_viewlist.addViewListItem(m_item, cat, index);
0390 
0391     return true;
0392 }
0393 
0394 void EditViewPanel::changed()
0395 {
0396     bool disable = widget.viewname->text().isEmpty() | widget.category->currentText().isEmpty();
0397     emit enableButtonOk(! disable);
0398 }
0399 
0400 void EditViewPanel::categoryChanged()
0401 {
0402     debugPlan<<widget.category->currentText();
0403     fillAfter(m_categories.value(widget.category->currentText()));
0404     changed();
0405 }
0406 
0407 void EditViewPanel::fillAfter(ViewListItem *cat)
0408 {
0409     debugPlan<<cat;
0410     widget.insertAfter->clear();
0411     if (cat) {
0412         widget.insertAfter->addItem(i18n("Top"));
0413 //        int idx = 0;
0414         for (int i = 0; i < cat->childCount(); ++i) {
0415             ViewListItem *itm = static_cast<ViewListItem*>(cat->child(i));
0416             widget.insertAfter->addItem(itm->text(0), QVariant::fromValue((void*)itm));
0417         }
0418         if (cat == m_viewlist.currentCategory()) {
0419             ViewListItem *v = m_viewlist.currentItem();
0420             if (v && v->type() != ViewListItem::ItemType_Category) {
0421                 widget.insertAfter->setCurrentIndex(cat->indexOfChild(v) + 1);
0422             }
0423         }
0424     }
0425 }
0426 
0427 //------------------------
0428 ViewListEditCategoryDialog::ViewListEditCategoryDialog(ViewListWidget &viewlist, ViewListItem *item, QWidget *parent)
0429     : KoDialog(parent)
0430 {
0431     setCaption(xi18nc("@title:window", "Configure Category"));
0432     setButtons(KoDialog::Ok | KoDialog::Cancel);
0433     setDefaultButton(Ok);
0434 
0435     m_panel = new EditCategoryPanel(viewlist, item, this);
0436 
0437     setMainWidget(m_panel);
0438 
0439     enableButtonOk(false);
0440 
0441     connect(this,&KoDialog::okClicked,this,&ViewListEditCategoryDialog::slotOk);
0442     connect(m_panel, &EditCategoryPanel::enableButtonOk, this, &KoDialog::enableButtonOk);
0443 
0444     connect(&viewlist, &ViewListWidget::viewListItemRemoved, this, &ViewListEditCategoryDialog::slotViewListItemRemoved);
0445 }
0446 
0447 void ViewListEditCategoryDialog::slotViewListItemRemoved(ViewListItem *)
0448 {
0449     reject();
0450 }
0451 
0452 void ViewListEditCategoryDialog::slotOk() {
0453     if (m_panel->ok()) {
0454         accept();
0455     }
0456 }
0457 
0458 EditCategoryPanel::EditCategoryPanel(ViewListWidget &viewlist, ViewListItem *item, QWidget *parent)
0459     : QWidget(parent),
0460       m_item(item),
0461       m_viewlist(viewlist)
0462 {
0463     widget.setupUi(this);
0464 
0465     widget.viewname->setText(item->text(0));
0466     QTextEdit e;
0467     e.setText(item->toolTip(0));
0468     widget.tooltip->setText(e.toPlainText());
0469 
0470     fillAfter();
0471 
0472     connect(widget.viewname, &QLineEdit::textChanged, this, &EditCategoryPanel::changed);
0473     connect(widget.tooltip, &QLineEdit::textChanged, this, &EditCategoryPanel::changed);
0474     connect(widget.insertAfter, SIGNAL(currentIndexChanged(int)), SLOT(changed()));
0475 }
0476 
0477 bool EditCategoryPanel::ok()
0478 {
0479     if (widget.viewname->text() != m_item->text(0)) {
0480         m_item->setText(0, widget.viewname->text());
0481     }
0482     if (widget.tooltip->text() != m_item->toolTip(0)) {
0483         m_item->setToolTip(0, widget.tooltip->text());
0484     }
0485     bool ex = m_item->isExpanded();
0486     m_viewlist.removeViewListItem(m_item);
0487     int index = widget.insertAfter->currentIndex();
0488     m_viewlist.addViewListItem(m_item, 0, index);
0489     m_item->setExpanded(ex);
0490     return true;
0491 }
0492 
0493 void EditCategoryPanel::changed()
0494 {
0495     bool disable = widget.viewname->text().isEmpty();
0496     emit enableButtonOk(! disable);
0497 }
0498 
0499 void EditCategoryPanel::fillAfter()
0500 {
0501     debugPlan;
0502     widget.insertAfter->clear();
0503     widget.insertAfter->addItem(i18n("Top"));
0504     int idx = 0;
0505     QList<ViewListItem*> lst = m_viewlist.categories();
0506     for (int i = 0; i < lst.count(); ++i) {
0507         ViewListItem *itm = lst[ i ];
0508         if (m_item == itm) {
0509             idx = i;
0510         } else {
0511             widget.insertAfter->addItem(itm->text(0), QVariant::fromValue((void*)itm));
0512         }
0513     }
0514     widget.insertAfter->setCurrentIndex(idx);
0515 }
0516 
0517 #ifdef PLAN_USE_KREPORT
0518 //------ Reports
0519 ViewListReportsDialog::ViewListReportsDialog(View *view, ViewListWidget &viewlist, const QDomDocument &doc, QWidget *parent)
0520     : KoDialog(parent)
0521 {
0522     setCaption(xi18nc("@title:window", "Add Report"));
0523     setButtons(KoDialog::Ok | KoDialog::Cancel);
0524     setDefaultButton(Ok);
0525 
0526     m_panel = new AddReportsViewPanel(view, viewlist, doc, this);
0527 
0528     setMainWidget(m_panel);
0529 
0530     enableButtonOk(true);
0531 
0532     connect(this,SIGNAL(okClicked()),this,SLOT(slotOk()));
0533     connect(m_panel, SIGNAL(enableButtonOk(bool)), SLOT(enableButtonOk(bool)));
0534     connect(m_panel, SIGNAL(viewCreated(KPlato::ViewBase*)), SIGNAL(viewCreated(KPlato::ViewBase*)));
0535 
0536     connect(&viewlist, SIGNAL(viewListItemRemoved(KPlato::ViewListItem*)), SLOT(slotViewListItemRemoved(KPlato::ViewListItem*)));
0537 }
0538 
0539 void ViewListReportsDialog::slotViewListItemRemoved(ViewListItem *)
0540 {
0541     reject();
0542 }
0543 
0544 void ViewListReportsDialog::slotOk() {
0545     if (m_panel->ok()) {
0546         accept();
0547     }
0548 }
0549 
0550 //------------------------
0551 AddReportsViewPanel::AddReportsViewPanel(View *view, ViewListWidget &viewlist, const QDomDocument &doc, QWidget *parent)
0552     : QWidget(parent),
0553       m_view(view),
0554       m_viewlist(viewlist),
0555       m_viewnameChanged(false),
0556       m_viewtipChanged(false),
0557       m_data(doc)
0558 {
0559     widget.setupUi(this);
0560 
0561     // NOTE: these lists must match switch in ok() FIXME: refactor
0562     m_viewtypes << "ReportView";
0563     QStringList lst;
0564     lst << xi18n("Report");
0565     widget.viewtype->addItems(lst);
0566 
0567     foreach (ViewListItem *item, m_viewlist.categories()) {
0568         m_categories.insert(item->text(0), item);
0569     }
0570     widget.category->addItems(m_categories.keys());
0571     ViewListItem *curr = m_viewlist.currentCategory();
0572     if (curr) {
0573         widget.category->setCurrentIndex(m_categories.values().indexOf(curr));
0574     }
0575     fillAfter(m_categories.value(widget.category->currentText()));
0576 
0577     viewtypeChanged(widget.viewtype->currentIndex());
0578 
0579     connect(widget.viewname, SIGNAL(textChanged(QString)), SLOT(changed()));
0580     connect(widget.tooltip, SIGNAL(textChanged(QString)), SLOT(changed()));
0581     connect(widget.viewname, SIGNAL(textChanged(QString)), SLOT(viewnameChanged(QString)));
0582     connect(widget.tooltip, SIGNAL(textChanged(QString)), SLOT(viewtipChanged(QString)));
0583     connect(widget.insertAfter, SIGNAL(currentIndexChanged(int)), SLOT(changed()));
0584     connect(widget.viewtype, SIGNAL(currentIndexChanged(int)), SLOT(viewtypeChanged(int)));
0585     connect(widget.category, SIGNAL(editTextChanged(QString)), SLOT(categoryChanged()));
0586 }
0587 
0588 void AddReportsViewPanel::viewnameChanged(const QString &text)
0589 {
0590     m_viewnameChanged = ! text.isEmpty();
0591 }
0592 
0593 void AddReportsViewPanel::viewtipChanged(const QString &text)
0594 {
0595     m_viewtipChanged = ! text.isEmpty();
0596 }
0597 
0598 void AddReportsViewPanel::viewtypeChanged(int idx)
0599 {
0600     ViewInfo vi = m_view->defaultViewInfo(m_viewtypes.value(idx));
0601     if (widget.viewname->text().isEmpty()) {
0602         m_viewnameChanged = false;
0603     }
0604     if (! m_viewnameChanged) {
0605         widget.viewname->setText(vi.name);
0606         m_viewnameChanged = false;
0607     }
0608     if (widget.tooltip->text().isEmpty()) {
0609         m_viewtipChanged = false;
0610     }
0611     if (! m_viewtipChanged) {
0612         QTextEdit e;
0613         e.setText(vi.tip);
0614         widget.tooltip->setText(e.toPlainText());
0615         m_viewtipChanged = false;
0616     }
0617 }
0618 
0619 void AddReportsViewPanel::categoryChanged()
0620 {
0621     debugPlan<<widget.category->currentText();
0622     fillAfter(m_categories.value(widget.category->currentText()));
0623     changed();
0624 }
0625 
0626 void AddReportsViewPanel::fillAfter(ViewListItem *cat)
0627 {
0628     debugPlan<<cat;
0629     widget.insertAfter->clear();
0630     if (cat) {
0631         widget.insertAfter->addItem(i18n("Top"));
0632 //        int idx = 0;
0633         for (int i = 0; i < cat->childCount(); ++i) {
0634             ViewListItem *itm = static_cast<ViewListItem*>(cat->child(i));
0635             widget.insertAfter->addItem(itm->text(0), QVariant::fromValue((void*)itm));
0636         }
0637         if (cat == m_viewlist.currentCategory()) {
0638             ViewListItem *v = m_viewlist.currentItem();
0639             if (v && v->type() != ViewListItem::ItemType_Category) {
0640                 widget.insertAfter->setCurrentIndex(cat->indexOfChild(v) + 1);
0641             }
0642         }
0643     }
0644 }
0645 
0646 bool AddReportsViewPanel::ok()
0647 {
0648     QString n = widget.category->currentText();
0649     ViewListItem *curr = m_categories.value(n);
0650     QString c = curr == 0 ? n : curr->tag();
0651 
0652     ViewListItem *cat = m_viewlist.addCategory(c, n);
0653     if (cat == 0) {
0654         return false;
0655     }
0656     ViewBase *v = 0;
0657     int index = widget.insertAfter->currentIndex();
0658     int viewtype = widget.viewtype->currentIndex();
0659     switch (viewtype) {
0660         case 0: { // Report view
0661             v = m_view->createReportView(cat, m_viewtypes.value(viewtype), widget.viewname->text(), widget.tooltip->text(), index);
0662             static_cast<ReportView*>(v)->loadXML(m_data);
0663             break; }
0664         default:
0665             errorPlan<<"Unknown view type!";
0666             break;
0667     }
0668     emit viewCreated(v);
0669     return true;
0670 }
0671 
0672 void AddReportsViewPanel::changed()
0673 {
0674     bool disable = widget.viewname->text().isEmpty() | widget.viewtype->currentText().isEmpty() | widget.category->currentText().isEmpty();
0675     emit enableButtonOk(! disable);
0676 }
0677 #endif
0678 
0679 }  //KPlato namespace