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"