File indexing completed on 2024-05-12 16:01:59

0001 /*
0002     This file is part of the KDE project
0003 
0004     SPDX-FileCopyrightText: 2000 Simon Hausmann <hausmann@kde.org>
0005     SPDX-FileCopyrightText: 2006 Martin Pfeiffer <hubipete@gmx.net>
0006 
0007     SPDX-License-Identifier: LGPL-2.0-or-later
0008 */
0009 
0010 #include "KoDocumentInfoDlg.h"
0011 
0012 #include "ui_koDocumentInfoAboutWidget.h"
0013 #include "ui_koDocumentInfoAuthorWidget.h"
0014 
0015 #include "KoDocumentInfo.h"
0016 #include "KisDocument.h"
0017 #include "KoPageWidgetItem.h"
0018 #include <KoIcon.h>
0019 #include <kstandardguiitem.h>
0020 
0021 
0022 #include <klocalizedstring.h>
0023 
0024 #include <kmainwindow.h>
0025 #include <KoDialog.h>
0026 #include <QUrl>
0027 #include <QCompleter>
0028 #include <QLineEdit>
0029 #include <QDateTime>
0030 #include <KisMimeDatabase.h>
0031 
0032 class KoPageWidgetItemAdapter : public KPageWidgetItem
0033 {
0034 public:
0035     KoPageWidgetItemAdapter(KoPageWidgetItem *item)
0036         : KPageWidgetItem(item->widget(), item->name())
0037         , m_item(item)
0038     {
0039         setHeader(item->name());
0040         setIcon(KisIconUtils::loadIcon(item->iconName()));
0041     }
0042     ~KoPageWidgetItemAdapter() override { delete m_item; }
0043 
0044     bool shouldDialogCloseBeVetoed() { return m_item->shouldDialogCloseBeVetoed(); }
0045     void apply() { m_item->apply(); }
0046 
0047 private:
0048     KoPageWidgetItem * const m_item;
0049 };
0050 
0051 
0052 class KoDocumentInfoDlg::KoDocumentInfoDlgPrivate
0053 {
0054 public:
0055     KoDocumentInfoDlgPrivate() {}
0056     ~KoDocumentInfoDlgPrivate() {}
0057 
0058     KoDocumentInfo* info {nullptr};
0059     QList<KPageWidgetItem*> pages;
0060     Ui::KoDocumentInfoAboutWidget* aboutUi {nullptr};
0061     Ui::KoDocumentInfoAuthorWidget* authorUi {nullptr};
0062 
0063     bool documentSaved {false};
0064 };
0065 
0066 
0067 KoDocumentInfoDlg::KoDocumentInfoDlg(QWidget* parent, KoDocumentInfo* docInfo)
0068     : KPageDialog(parent)
0069     , d(new KoDocumentInfoDlgPrivate)
0070 {
0071     d->info = docInfo;
0072 
0073     setWindowTitle(i18n("Document Information"));
0074     //    setInitialSize(QSize(500, 500));
0075     setFaceType(KPageDialog::List);
0076     setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0077     button(QDialogButtonBox::Ok)->setDefault(true);
0078     KGuiItem::assign(button(QDialogButtonBox::Ok), KStandardGuiItem::ok());
0079     KGuiItem::assign(button(QDialogButtonBox::Cancel), KStandardGuiItem::cancel());
0080 
0081     d->aboutUi = new Ui::KoDocumentInfoAboutWidget();
0082     QWidget *infodlg = new QWidget();
0083     d->aboutUi->setupUi(infodlg);
0084     QStringList licenseExamples;
0085     licenseExamples << "CC-BY 4.0" << "CC-BY-SA 4.0" << "CC-BY-SA-NC 4.0" << "CC-0";
0086     QCompleter *examples = new QCompleter(licenseExamples);
0087     examples->setCaseSensitivity(Qt::CaseInsensitive);
0088     examples->setCompletionMode(QCompleter::PopupCompletion);
0089     d->aboutUi->leLicense->setCompleter(examples);
0090 
0091     KPageWidgetItem *page = new KPageWidgetItem(infodlg, i18n("General"));
0092     page->setHeader(i18n("General"));
0093 
0094     // Ugly hack, the mimetype should be a parameter, instead
0095     KisDocument* doc = dynamic_cast< KisDocument* >(d->info->parent());
0096     if (doc) {
0097         page->setIcon(KisIconUtils::loadIcon(KisMimeDatabase::iconNameForMimeType(doc->mimeType())));
0098     } else {
0099         // hide all entries not used in pages for KoDocumentInfoPropsPage
0100         d->aboutUi->filePathInfoLabel->setVisible(false);
0101         d->aboutUi->filePathLabel->setVisible(false);
0102         d->aboutUi->filePathSeparatorLine->setVisible(false);
0103         d->aboutUi->lblTypeDesc->setVisible(false);
0104         d->aboutUi->lblType->setVisible(false);
0105     }
0106     addPage(page);
0107     d->pages.append(page);
0108 
0109     initAboutTab();
0110 
0111     d->authorUi = new Ui::KoDocumentInfoAuthorWidget();
0112     QWidget *authordlg = new QWidget();
0113     d->authorUi->setupUi(authordlg);
0114     page = new KPageWidgetItem(authordlg, i18n("Author"));
0115     page->setHeader(i18n("Last saved by"));
0116     page->setIcon(koIcon("user-identity"));
0117     addPage(page);
0118     d->pages.append(page);
0119 
0120     initAuthorTab();
0121 }
0122 
0123 KoDocumentInfoDlg::~KoDocumentInfoDlg()
0124 {
0125     delete d->authorUi;
0126     delete d->aboutUi;
0127     delete d;
0128 }
0129 
0130 void KoDocumentInfoDlg::accept()
0131 {
0132     // check if any pages veto the close
0133     Q_FOREACH (KPageWidgetItem* item, d->pages) {
0134         KoPageWidgetItemAdapter *page = dynamic_cast<KoPageWidgetItemAdapter*>(item);
0135         if (page) {
0136             if (page->shouldDialogCloseBeVetoed()) {
0137                 return;
0138             }
0139         }
0140     }
0141 
0142     // all fine, go and apply
0143     saveAboutData();
0144     Q_FOREACH (KPageWidgetItem* item, d->pages) {
0145         KoPageWidgetItemAdapter *page = dynamic_cast<KoPageWidgetItemAdapter*>(item);
0146         if (page) {
0147             page->apply();
0148         }
0149     }
0150 
0151     KPageDialog::accept();
0152 }
0153 
0154 bool KoDocumentInfoDlg::isDocumentSaved()
0155 {
0156     return d->documentSaved;
0157 }
0158 
0159 void KoDocumentInfoDlg::initAboutTab()
0160 {
0161     KisDocument* doc = dynamic_cast< KisDocument* >(d->info->parent());
0162 
0163     if (doc) {
0164         d->aboutUi->filePathLabel->setText(doc->localFilePath());
0165     }
0166 
0167     d->aboutUi->leTitle->setText(d->info->aboutInfo("title"));
0168     d->aboutUi->leSubject->setText(d->info->aboutInfo("subject"));
0169 
0170     d->aboutUi->leKeywords->setToolTip(i18n("Use ';' (Example: Office;KDE;Calligra)"));
0171     if (!d->info->aboutInfo("keyword").isEmpty())
0172         d->aboutUi->leKeywords->setText(d->info->aboutInfo("keyword"));
0173 
0174     if (!d->info->aboutInfo("license").isEmpty()) {
0175         d->aboutUi->leLicense->setText(d->info->aboutInfo("license"));
0176     }
0177     d->aboutUi->meDescription->setPlainText(d->info->aboutInfo("abstract"));
0178     if (doc && !doc->mimeType().isEmpty()) {
0179         d->aboutUi->lblType->setText(KisMimeDatabase::descriptionForMimeType(doc->mimeType()));
0180     }
0181     if (!d->info->aboutInfo("creation-date").isEmpty()) {
0182         QDateTime t = QDateTime::fromString(d->info->aboutInfo("creation-date"),
0183                                             Qt::ISODate);
0184         QString s = QLocale().toString(t);
0185         d->aboutUi->lblCreated->setText(s + ", " +
0186                                         d->info->aboutInfo("initial-creator"));
0187     }
0188 
0189     if (!d->info->aboutInfo("date").isEmpty()) {
0190         QDateTime t = QDateTime::fromString(d->info->aboutInfo("date"), Qt::ISODate);
0191         QString s = QLocale().toString(t);
0192         d->aboutUi->lblModified->setText(s + ", " + d->info->authorInfo("creator"));
0193     }
0194 
0195     d->aboutUi->lblRevision->setText(d->info->aboutInfo("editing-cycles"));
0196 
0197     updateEditingTime();
0198 
0199     connect(d->aboutUi->pbReset, SIGNAL(clicked()),
0200             this, SLOT(slotResetMetaData()));
0201 }
0202 
0203 void KoDocumentInfoDlg::initAuthorTab()
0204 {
0205     d->authorUi->nickName->setText(d->info->authorInfo("creator"));
0206     d->authorUi->firstName->setText(d->info->authorInfo("creator-first-name"));
0207     d->authorUi->lastName->setText(d->info->authorInfo("creator-last-name"));
0208     d->authorUi->initials->setText(d->info->authorInfo("initial"));
0209     d->authorUi->title->setText(d->info->authorInfo("author-title"));
0210     d->authorUi->company->setText(d->info->authorInfo("company"));
0211     d->authorUi->position->setText(d->info->authorInfo("position"));
0212     QListWidget *contact = d->authorUi->leContact;
0213     Q_FOREACH(QString contactMode, d->info->authorContactInfo()) {
0214         if (!contactMode.isEmpty()) {
0215             contact->addItem(contactMode);
0216         }
0217     }
0218 }
0219 
0220 void KoDocumentInfoDlg::saveAboutData()
0221 {
0222     d->info->setAboutInfo("keyword", d->aboutUi->leKeywords->text());
0223     d->info->setAboutInfo("title", d->aboutUi->leTitle->text());
0224     d->info->setAboutInfo("subject", d->aboutUi->leSubject->text());
0225     d->info->setAboutInfo("abstract", d->aboutUi->meDescription->toPlainText());
0226     d->info->setAboutInfo("license", d->aboutUi->leLicense->text());
0227 }
0228 
0229 void KoDocumentInfoDlg::hideEvent( QHideEvent *event )
0230 {
0231     Q_UNUSED(event);
0232 }
0233 
0234 void KoDocumentInfoDlg::slotResetMetaData()
0235 {
0236     d->info->resetMetaData();
0237 
0238     if (!d->info->aboutInfo("creation-date").isEmpty()) {
0239         QDateTime t = QDateTime::fromString(d->info->aboutInfo("creation-date"),
0240                                             Qt::ISODate);
0241         QString s = QLocale().toString(t);
0242         d->aboutUi->lblCreated->setText(s + ", " +
0243                                         d->info->aboutInfo("initial-creator"));
0244     }
0245 
0246     if (!d->info->aboutInfo("date").isEmpty()) {
0247         QDateTime t = QDateTime::fromString(d->info->aboutInfo("date"), Qt::ISODate);
0248         QString s = QLocale().toString(t);
0249         d->aboutUi->lblModified->setText(s + ", " + d->info->authorInfo("creator"));
0250     }
0251 
0252     d->aboutUi->lblRevision->setText(d->info->aboutInfo("editing-cycles"));
0253 }
0254 
0255 QList<KPageWidgetItem*> KoDocumentInfoDlg::pages() const
0256 {
0257     return d->pages;
0258 }
0259 
0260 void KoDocumentInfoDlg::setReadOnly(bool ro)
0261 {
0262     d->aboutUi->meDescription->setReadOnly(ro);
0263 
0264     Q_FOREACH(KPageWidgetItem* page, d->pages) {
0265         Q_FOREACH(QLineEdit* le, page->widget()->findChildren<QLineEdit *>()) {
0266             le->setReadOnly(ro);
0267         }
0268         Q_FOREACH(QPushButton* le, page->widget()->findChildren<QPushButton *>()) {
0269             le->setDisabled(ro);
0270         }
0271     }
0272 }
0273 
0274 void KoDocumentInfoDlg::addPageItem(KoPageWidgetItem *item)
0275 {
0276     KPageWidgetItem * page = new KoPageWidgetItemAdapter(item);
0277 
0278     addPage(page);
0279     d->pages.append(page);
0280 }
0281 
0282 void KoDocumentInfoDlg::updateEditingTime()
0283 {
0284     const int timeElapsed = d->info->aboutInfo("editing-time").toInt();
0285 
0286     const int secondsElapsed = timeElapsed % 60;
0287     const int minutesElapsed = (timeElapsed / 60) % 60;
0288     const int hoursElapsed = (timeElapsed / 3600) % 24;
0289     const int daysElapsed = (timeElapsed / 86400) % 7;
0290     const int weeksElapsed = timeElapsed / 604800;
0291 
0292     QString majorTimeUnit;
0293     QString minorTimeUnit;
0294 
0295     if (weeksElapsed > 0) {
0296         majorTimeUnit = i18np("%1 week", "%1 weeks", weeksElapsed);
0297         minorTimeUnit = i18np("%1 day", "%1 days", daysElapsed);
0298     } else if (daysElapsed > 0) {
0299         majorTimeUnit = i18np("%1 day", "%1 days", daysElapsed);
0300         minorTimeUnit = i18np("%1 hour", "%1 hours", hoursElapsed);
0301     } else if (hoursElapsed > 0) {
0302         majorTimeUnit = i18np("%1 hour", "%1 hours", hoursElapsed);
0303         minorTimeUnit = i18np("%1 minute", "%1 minutes", minutesElapsed);
0304     } else if (minutesElapsed > 0) {
0305         majorTimeUnit = i18np("%1 minute", "%1 minutes", minutesElapsed);
0306         minorTimeUnit = i18np("%1 second", "%1 seconds", secondsElapsed);
0307     } else {
0308         d->aboutUi->lblEditing->setText(i18np("%1 second", "%1 seconds", secondsElapsed));
0309         return;
0310     }
0311 
0312     d->aboutUi->lblEditing->setText(i18nc(
0313                                         "major time unit and minor time unit",
0314                                         "%1 and %2",
0315                                         majorTimeUnit,
0316                                         minorTimeUnit
0317                                         ));
0318 }