File indexing completed on 2024-04-28 03:40:31
0001 /*************************************************************************** 0002 * Copyright (C) 2002 by Gunnar Schmi Dt <kmouth@schmi-dt.de * 0003 * (C) 2015 by Jeremy Whiting <jpwhiting@kde.org> * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 * * 0010 * This program 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 * 0013 * GNU General Public License for more details. * 0014 * * 0015 * You should have received a copy of the GNU General Public License * 0016 * along with this program; if not, write to the * 0017 * Free Software Foundation, Inc., * 0018 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * 0019 ***************************************************************************/ 0020 0021 #include "dictionarycreationwizard.h" 0022 #include "wordlist.h" 0023 0024 #include <QCheckBox> 0025 #include <QGridLayout> 0026 #include <QLocale> 0027 #include <QProgressDialog> 0028 #include <QSpinBox> 0029 #include <QStandardPaths> 0030 #include <QStringConverter> 0031 0032 #include <QDebug> 0033 0034 #include <KConfigGroup> 0035 #include <KSharedConfig> 0036 0037 int CreationSourceWidget::nextId() const 0038 { 0039 int nextPage = -1; 0040 if (fileButton->isChecked()) { 0041 nextPage = DictionaryCreationWizard::FilePage; 0042 } else if (directoryButton->isChecked()) { 0043 nextPage = DictionaryCreationWizard::DirPage; 0044 } else if (kdeDocButton->isChecked()) { 0045 nextPage = DictionaryCreationWizard::KDEDocPage; 0046 } else if (mergeButton->isChecked()) { 0047 nextPage = DictionaryCreationWizard::MergePage; 0048 } 0049 return nextPage; 0050 } 0051 0052 void CreationSourceWidget::emptyToggled(bool checked) 0053 { 0054 setFinalPage(checked); 0055 } 0056 0057 DictionaryCreationWizard::DictionaryCreationWizard(QWidget *parent, 0058 const QStringList &dictionaryNames, 0059 const QStringList &dictionaryFiles, 0060 const QStringList &dictionaryLanguages) 0061 : QWizard(parent) 0062 { 0063 creationSource = new CreationSourceWidget(this, QStringLiteral("source page")); 0064 creationSource->setTitle(i18n("Source of New Dictionary (1)")); 0065 setPage(CreationSourcePage, creationSource); 0066 setOption(QWizard::HaveHelpButton, false); 0067 // setFinishEnabled (creationSource, false); 0068 0069 fileWidget = new CreationSourceDetailsWidget(this, QStringLiteral("file source page")); 0070 fileWidget->setTitle(i18n("Source of New Dictionary (2)")); 0071 fileWidget->setFinalPage(true); 0072 setPage(FilePage, fileWidget); 0073 buildCodecCombo(fileWidget->encodingCombo); 0074 0075 dirWidget = new CreationSourceDetailsWidget(this, QStringLiteral("directory source page")); 0076 dirWidget->setTitle(i18n("Source of New Dictionary (2)")); 0077 dirWidget->setFinalPage(true); 0078 setPage(DirPage, dirWidget); 0079 dirWidget->urlLabel->setText(i18nc("In which directory is the file located?", "&Directory:")); 0080 dirWidget->urlLabel->setWhatsThis(i18n("With this input field you specify which directory you want to load for creating the new dictionary.")); 0081 dirWidget->url->setMode(KFile::Directory); 0082 dirWidget->url->setWhatsThis(i18n("With this input field you specify which directory you want to load for creating the new dictionary.")); 0083 buildCodecCombo(dirWidget->encodingCombo); 0084 0085 kdeDocWidget = new KDEDocSourceWidget(this, "KDE documentation source page"); 0086 kdeDocWidget->setTitle(i18n("Source of New Dictionary (2)")); 0087 kdeDocWidget->setFinalPage(true); 0088 setPage(KDEDocPage, kdeDocWidget); 0089 kdeDocWidget->languageButton->showLanguageCodes(true); 0090 kdeDocWidget->languageButton->loadAllLanguages(); 0091 0092 mergeWidget = new MergeWidget(this, dictionaryNames, dictionaryFiles, dictionaryLanguages); 0093 mergeWidget->setTitle(i18n("Source of New Dictionary (2)")); 0094 mergeWidget->setFinalPage(true); 0095 setPage(MergePage, mergeWidget); 0096 } 0097 0098 DictionaryCreationWizard::~DictionaryCreationWizard() 0099 { 0100 } 0101 0102 void DictionaryCreationWizard::buildCodecCombo(KComboBox *combo) 0103 { 0104 for (int encoding = QStringConverter::System; encoding <= QStringConverter::System; ++encoding) { 0105 QString name = QLatin1String(QStringConverter::nameForEncoding(QStringConverter::Encoding(encoding))); 0106 combo->addItem(name, encoding); 0107 } 0108 } 0109 0110 QString DictionaryCreationWizard::createDictionary() 0111 { 0112 WordList::WordMap map; 0113 QString dicFile; 0114 QProgressDialog *pdlg = WordList::progressDialog(); 0115 0116 if (creationSource->mergeButton->isChecked()) { 0117 map = WordList::mergeFiles(mergeWidget->mergeParameters(), pdlg); 0118 dicFile.clear(); 0119 } else if (creationSource->emptyButton->isChecked()) { 0120 dicFile.clear(); 0121 } else if (creationSource->fileButton->isChecked()) { 0122 QString filename = fileWidget->url->url().path(); 0123 QStringConverter::Encoding encoding = QStringConverter::Encoding(fileWidget->encodingCombo->currentIndex()); 0124 if (fileWidget->spellCheckBox->isChecked()) 0125 dicFile = fileWidget->ooDictURL->url().path(); 0126 map = WordList::parseFile(filename, encoding, pdlg); 0127 } else if (creationSource->directoryButton->isChecked()) { 0128 QString directory = dirWidget->url->url().path(); 0129 QStringConverter::Encoding encoding = QStringConverter::Encoding(fileWidget->encodingCombo->currentIndex()); 0130 if (dirWidget->spellCheckBox->isChecked()) 0131 dicFile = dirWidget->ooDictURL->url().path(); 0132 map = WordList::parseDir(directory, encoding, pdlg); 0133 } else { // creationSource->kdeDocButton must be checked 0134 QString language = kdeDocWidget->languageButton->current(); 0135 if (kdeDocWidget->spellCheckBox->isChecked()) 0136 dicFile = kdeDocWidget->ooDictURL->url().path(); 0137 map = WordList::parseKDEDoc(language, pdlg); 0138 } 0139 0140 if (!dicFile.isEmpty() && !dicFile.isNull()) 0141 map = WordList::spellCheck(map, dicFile, pdlg); 0142 pdlg->close(); 0143 delete pdlg; 0144 0145 int dictnumber = 0; 0146 QString filename; 0147 QString dictionaryFile; 0148 do { 0149 dictnumber++; 0150 filename = QStringLiteral("wordcompletion%1.dict").arg(dictnumber); 0151 dictionaryFile = QStandardPaths::locate(QStandardPaths::AppDataLocation, filename); 0152 } while (QFile::exists(dictionaryFile)); 0153 0154 dictionaryFile = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QLatin1Char('/') + QStringLiteral("/") + filename; 0155 if (WordList::saveWordList(map, dictionaryFile)) 0156 return filename; 0157 else 0158 return QLatin1String(""); 0159 } 0160 0161 QString DictionaryCreationWizard::name() 0162 { 0163 if (creationSource->mergeButton->isChecked()) { 0164 return i18n("Merge result"); 0165 } else if (creationSource->emptyButton->isChecked()) { 0166 return i18nc("In the sense of a blank word list", "Empty list"); 0167 } else if (creationSource->fileButton->isChecked()) { 0168 return fileWidget->url->url().path(); 0169 } else if (creationSource->directoryButton->isChecked()) { 0170 return dirWidget->url->url().path(); 0171 } else { // creationSource->kdeDocButton must be checked 0172 return i18n("KDE Documentation"); 0173 } 0174 } 0175 0176 QString DictionaryCreationWizard::language() 0177 { 0178 if (creationSource->mergeButton->isChecked()) { 0179 return mergeWidget->language(); 0180 } else if (creationSource->emptyButton->isChecked()) { 0181 return QLocale::languageToString(QLocale::system().language()); 0182 } else if (creationSource->fileButton->isChecked()) { 0183 return fileWidget->languageButton->current(); 0184 } else if (creationSource->directoryButton->isChecked()) { 0185 return dirWidget->languageButton->current(); 0186 } else { // creationSource->kdeDocButton must be checked 0187 return kdeDocWidget->languageButton->current(); 0188 } 0189 } 0190 0191 /***************************************************************************/ 0192 0193 MergeWidget::MergeWidget(QWidget *parent, const QStringList &dictionaryNames, const QStringList &dictionaryFiles, const QStringList &dictionaryLanguages) 0194 : QWizardPage(parent) 0195 , scrollArea(nullptr) 0196 { 0197 QGridLayout *layout = new QGridLayout(this); 0198 layout->setColumnStretch(0, 0); 0199 layout->setColumnStretch(1, 1); 0200 0201 int row = 0; 0202 QStringList::ConstIterator nIt = dictionaryNames.begin(); 0203 QStringList::ConstIterator fIt = dictionaryFiles.begin(); 0204 QStringList::ConstIterator lIt = dictionaryLanguages.begin(); 0205 for (; nIt != dictionaryNames.end(); ++nIt, ++fIt, ++lIt) { 0206 QCheckBox *checkbox = new QCheckBox(*nIt, this); 0207 QSpinBox *spinBox = new QSpinBox(this); 0208 layout->addWidget(checkbox, row, 0); 0209 layout->addWidget(spinBox, row, 1); 0210 0211 checkbox->setChecked(true); 0212 spinBox->setRange(1, 100); 0213 spinBox->setSingleStep(10); 0214 spinBox->setValue(100); 0215 connect(checkbox, &QAbstractButton::toggled, spinBox, &QWidget::setEnabled); 0216 0217 dictionaries.insert(*fIt, checkbox); 0218 weights.insert(*fIt, spinBox); 0219 languages[*fIt] = *lIt; 0220 row++; 0221 } 0222 setLayout(layout); 0223 } 0224 0225 MergeWidget::~MergeWidget() 0226 { 0227 } 0228 0229 QMap<QString, int> MergeWidget::mergeParameters() 0230 { 0231 QMap<QString, int> files; 0232 QHashIterator<QString, QCheckBox *> it(dictionaries); 0233 while (it.hasNext()) { 0234 it.next(); 0235 if (it.value()->isChecked()) { 0236 QString name = it.key(); 0237 QString dictionaryFile = QStandardPaths::locate(QStandardPaths::AppDataLocation, name); 0238 files[dictionaryFile] = weights.value(name)->value(); 0239 } 0240 } 0241 0242 return files; 0243 } 0244 0245 QString MergeWidget::language() 0246 { 0247 QHashIterator<QString, QCheckBox *> it(dictionaries); 0248 while (it.hasNext()) { 0249 it.next(); 0250 if (it.value()->isChecked()) { 0251 return languages[it.key()]; 0252 } 0253 } 0254 0255 return QString(); 0256 } 0257 0258 /***************************************************************************/ 0259 0260 CompletionWizardWidget::CompletionWizardWidget(QWidget *parent, const char *name) 0261 : QWizardPage(parent) 0262 { 0263 setupUi(this); 0264 setObjectName(QLatin1String(name)); 0265 languageButton->showLanguageCodes(true); 0266 languageButton->loadAllLanguages(); 0267 } 0268 0269 CompletionWizardWidget::~CompletionWizardWidget() 0270 { 0271 } 0272 0273 void CompletionWizardWidget::ok() 0274 { 0275 WordList::WordMap map; 0276 QProgressDialog *pdlg = WordList::progressDialog(); 0277 0278 QString language = languageButton->current(); 0279 map = WordList::parseKDEDoc(language, pdlg); 0280 0281 if (spellCheckBox->isChecked()) 0282 map = WordList::spellCheck(map, ooDictURL->url().path(), pdlg); 0283 0284 pdlg->close(); 0285 delete pdlg; 0286 0287 QString dictionaryFile; 0288 0289 dictionaryFile = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QLatin1Char('/') + QStringLiteral("/"); 0290 qDebug() << "dictionaryFile is " << dictionaryFile; 0291 if (WordList::saveWordList(map, dictionaryFile)) { 0292 KConfigGroup cg(KSharedConfig::openConfig(), QStringLiteral("Dictionary 0")); 0293 cg.writeEntry("Filename", "wordcompletion1.dict"); 0294 cg.writeEntry("Name", i18nc("Default dictionary", "Default")); 0295 cg.writeEntry("Language", language); 0296 cg.sync(); 0297 } 0298 }