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 }