File indexing completed on 2024-04-28 05:27:03

0001 /* This file is part of the KDE project
0002    SPDX-FileCopyrightText: 2000, 2007 David Faure <faure@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
0005 */
0006 
0007 // Own
0008 #include "keditfiletype.h"
0009 #include "mimetypewriter.h"
0010 
0011 // Qt
0012 #include <QApplication>
0013 #include <QCommandLineOption>
0014 #include <QCommandLineParser>
0015 #include <QDBusConnection>
0016 #include <QDBusMessage>
0017 #include <QDebug>
0018 #include <QDialogButtonBox>
0019 #include <QMimeDatabase>
0020 #include <QPushButton>
0021 #include <QVBoxLayout>
0022 
0023 // KDE
0024 #include <KAboutData>
0025 #include <KBuildSycocaProgressDialog>
0026 #include <KLocalizedString>
0027 #include <KSycoca>
0028 #include <KWindowSystem>
0029 
0030 // Local
0031 #include "filetypedetails.h"
0032 #include "typeslistitem.h"
0033 
0034 FileTypeDialog::FileTypeDialog(MimeTypeData *mime)
0035     : QDialog(nullptr)
0036     , m_mimeTypeData(mime)
0037 {
0038     init();
0039 }
0040 
0041 FileTypeDialog::~FileTypeDialog()
0042 {
0043     delete m_details;
0044 }
0045 
0046 void FileTypeDialog::init()
0047 {
0048     m_details = new FileTypeDetails(this);
0049     m_details->setMimeTypeData(m_mimeTypeData);
0050     connect(m_details, &FileTypeDetails::changed, this, &FileTypeDialog::clientChanged);
0051 
0052     m_buttonBox = new QDialogButtonBox;
0053     m_buttonBox->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel);
0054     connect(m_buttonBox, SIGNAL(accepted()), SLOT(accept()));
0055     connect(m_buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, &FileTypeDialog::save);
0056     connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
0057 
0058     // This code is very similar to kcdialog.cpp
0059     QVBoxLayout *layout = new QVBoxLayout(this);
0060     layout->addWidget(m_details);
0061     layout->addWidget(m_buttonBox);
0062     // TODO setHelp()
0063 
0064     setApplyButtonEnabled(false);
0065 
0066     connect(KSycoca::self(), qOverload<>(&KSycoca::databaseChanged), this, &FileTypeDialog::slotDatabaseChanged);
0067 }
0068 
0069 void FileTypeDialog::setApplyButtonEnabled(bool enabled)
0070 {
0071     m_buttonBox->button(QDialogButtonBox::Apply)->setEnabled(enabled);
0072 }
0073 
0074 void FileTypeDialog::save()
0075 {
0076     if (m_mimeTypeData->isDirty()) {
0077         const bool servicesDirty = m_mimeTypeData->isServiceListDirty();
0078         if (m_mimeTypeData->sync()) {
0079             MimeTypeWriter::runUpdateMimeDatabase();
0080         }
0081         if (servicesDirty) {
0082             KBuildSycocaProgressDialog::rebuildKSycoca(this);
0083         }
0084         // Trigger reparseConfiguration of filetypesrc in konqueror
0085         QDBusMessage message =
0086             QDBusMessage::createSignal(QStringLiteral("/KonqMain"), QStringLiteral("org.kde.Konqueror.Main"), QStringLiteral("reparseConfiguration"));
0087         QDBusConnection::sessionBus().send(message);
0088     }
0089 }
0090 
0091 void FileTypeDialog::accept()
0092 {
0093     save();
0094     QDialog::accept();
0095 }
0096 
0097 void FileTypeDialog::clientChanged(bool state)
0098 {
0099     m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(state);
0100     m_buttonBox->button(QDialogButtonBox::Apply)->setEnabled(state);
0101 }
0102 
0103 void FileTypeDialog::slotDatabaseChanged()
0104 {
0105     m_details->refresh();
0106 }
0107 
0108 int main(int argc, char **argv)
0109 {
0110     QApplication app(argc, argv);
0111     QApplication::setWindowIcon(QIcon::fromTheme(QStringLiteral("preferences-desktop-filetype-association")));
0112 
0113     KAboutData aboutData(QStringLiteral("keditfiletype"),
0114                          i18n("File Type Editor"),
0115                          QLatin1String(PROJECT_VERSION),
0116                          i18n("KDE file type editor - simplified version for editing a single file type"),
0117                          KAboutLicense::GPL,
0118                          i18n("(c) 2000, KDE developers"));
0119     aboutData.addAuthor(i18n("Preston Brown"), QString(), QStringLiteral("pbrown@kde.org"));
0120     aboutData.addAuthor(i18n("David Faure"), QString(), QStringLiteral("faure@kde.org"));
0121     KAboutData::setApplicationData(aboutData);
0122 
0123     QCommandLineParser parser;
0124     aboutData.setupCommandLine(&parser);
0125     parser.addOption(QCommandLineOption(QStringList() << QStringLiteral("parent"),
0126                                         i18n("Makes the dialog transient for the window specified by winid"),
0127                                         QStringLiteral("winid")));
0128     parser.addPositionalArgument(QStringLiteral("mimetype"), i18n("File type to edit (e.g. text/html)"));
0129 
0130     parser.process(app);
0131     aboutData.processCommandLine(&parser);
0132 
0133     if (parser.positionalArguments().count() == 0) {
0134         parser.showHelp();
0135     }
0136 
0137     QMimeDatabase db;
0138     const QString arg = parser.positionalArguments().at(0);
0139     MimeTypeData *mimeTypeData = nullptr;
0140     const bool createType = arg.startsWith(QLatin1Char('*'));
0141     if (createType) {
0142         QString mimeString = QStringLiteral("application/x-kdeuser%1");
0143         QString mimeTypeName;
0144         int inc = 0;
0145         bool ok = false;
0146         do {
0147             ++inc;
0148             mimeTypeName = mimeString.arg(inc);
0149             ok = !db.mimeTypeForName(mimeTypeName).isValid();
0150         } while (!ok);
0151 
0152         QStringList patterns;
0153         if (arg.length() > 2) {
0154             patterns << arg.toLower() << arg.toUpper();
0155         }
0156         QString comment;
0157         if (arg.startsWith(QLatin1String("*.")) && arg.length() >= 3) {
0158             const QString type = arg.mid(3).prepend(arg[2].toUpper());
0159             comment = i18n("%1 File", type);
0160         }
0161 
0162         mimeTypeData = new MimeTypeData(mimeTypeName, true); // new mimetype
0163         mimeTypeData->setComment(comment);
0164         mimeTypeData->setPatterns(patterns);
0165     } else {
0166         const QString mimeTypeName = arg;
0167         QMimeType mime = db.mimeTypeForName(mimeTypeName);
0168         if (!mime.isValid()) {
0169             qCritical() << "Mimetype" << mimeTypeName << "not found";
0170             return 1;
0171         }
0172 
0173         mimeTypeData = new MimeTypeData(mime);
0174     }
0175 
0176     FileTypeDialog dlg(mimeTypeData);
0177     if (parser.isSet(QStringLiteral("parent"))) {
0178         dlg.setAttribute(Qt::WA_NativeWindow, true);
0179         KWindowSystem::setMainWindow(dlg.windowHandle(), parser.value(QStringLiteral("parent")));
0180     }
0181     if (!createType) {
0182         dlg.setWindowTitle(i18n("Edit File Type %1", mimeTypeData->name()));
0183     } else {
0184         dlg.setWindowTitle(i18n("Create New File Type %1", mimeTypeData->name()));
0185         dlg.setApplyButtonEnabled(true);
0186     }
0187 
0188     dlg.show(); // non-modal
0189 
0190     return app.exec();
0191 }
0192 
0193 #include "moc_keditfiletype.cpp"