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 }