1 /***************************************************************************
2 wordcompletionwidget.cpp - description
4 begin : Tue Apr 29 2003
5 copyright : (C) 2002 by Gunnar Schmi Dt
6 email : kmouth@schmi-dt.de
7 ***************************************************************************/
9 /***************************************************************************
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
16 ***************************************************************************/
21 #include <QRadioButton>
27 #include <QTextStream>
28 #include <QGridLayout>
30 #include <k3listview.h>
31 #include <klineedit.h>
32 #include <kurlrequester.h>
34 #include <kcombobox.h>
36 #include <kapplication.h>
37 #include <kstandarddirs.h>
38 #include <kprogressbar.h>
40 #include <kprogressdialog.h>
41 #include "dictionarycreationwizard.h"
42 #include "klanguagebutton.h"
43 #include "klanguagebuttonhelper.h"
46 DictionaryCreationWizard::DictionaryCreationWizard (QWidget
*parent
, const char *name
,
47 QStringList dictionaryNames
, QStringList dictionaryFiles
,
48 QStringList dictionaryLanguages
)
49 : K3Wizard (parent
, name
)
53 creationSource
= new CreationSourceWidget(this, "source page");
54 addPage (creationSource
, i18n("Source of New Dictionary (1)"));
55 setHelpEnabled (creationSource
, false);
56 setFinishEnabled (creationSource
, false);
58 fileWidget
= new CreationSourceDetailsWidget (this, "file source page");
59 addPage (fileWidget
, i18n("Source of New Dictionary (2)"));
60 buildCodecCombo (fileWidget
->encodingCombo
);
62 dirWidget
= new CreationSourceDetailsWidget (this, "directory source page");
63 addPage (dirWidget
, i18n("Source of New Dictionary (2)"));
64 dirWidget
->urlLabel
->setText (i18n("&Directory:"));
65 dirWidget
->urlLabel
->setWhatsThis( i18n("With this input field you specify which directory you want to load for creating the new dictionary."));
66 dirWidget
->url
->setMode(KFile::Directory
);
67 dirWidget
->url
->setWhatsThis( i18n("With this input field you specify which directory you want to load for creating the new dictionary."));
68 buildCodecCombo (dirWidget
->encodingCombo
);
70 kdeDocWidget
= new KDEDocSourceWidget (this, "KDE documentation source page");
71 addPage (kdeDocWidget
, i18n("Source of New Dictionary (2)"));
72 loadLanguageList(kdeDocWidget
->languageButton
);
74 mergeWidget
= new MergeWidget (this, "merge source page", dictionaryNames
, dictionaryFiles
, dictionaryLanguages
);
75 addPage (mergeWidget
, i18n("Source of New Dictionary (2)"));
77 connect (creationSource
->fileButton
, SIGNAL (toggled(bool)), this, SLOT(calculateAppropriate(bool)) );
78 connect (creationSource
->directoryButton
,SIGNAL(toggled(bool)), this, SLOT(calculateAppropriate(bool)) );
79 connect (creationSource
->kdeDocButton
, SIGNAL (toggled(bool)), this, SLOT(calculateAppropriate(bool)) );
80 connect (creationSource
->mergeButton
, SIGNAL (toggled(bool)), this, SLOT(calculateAppropriate(bool)) );
81 connect (creationSource
->emptyButton
, SIGNAL (toggled(bool)), this, SLOT(calculateAppropriate(bool)) );
83 calculateAppropriate (true);
86 DictionaryCreationWizard::~DictionaryCreationWizard () {
88 removePage (fileWidget
); delete fileWidget
;
89 removePage (dirWidget
); delete dirWidget
;
90 removePage (kdeDocWidget
); delete kdeDocWidget
;
91 removePage (mergeWidget
); delete mergeWidget
;
94 void DictionaryCreationWizard::buildCodecList () {
95 codecList
= new QList
<QTextCodec
*>;
96 QList
<QByteArray
> availableCodecs
= QTextCodec::availableCodecs();
97 for (int i
= 0; i
< availableCodecs
.count(); ++i
) {
98 QTextCodec
*codec
= QTextCodec::codecForName(availableCodecs
[i
]);
99 codecList
->append (codec
);
103 void DictionaryCreationWizard::buildCodecCombo (QComboBox
*combo
) {
104 QString local
= i18n("Local")+" (";
105 local
+= QTextCodec::codecForLocale()->name();
107 combo
->addItem (local
, 0);
108 combo
->addItem (i18n("Latin1"), 1);
109 combo
->addItem (i18n("Unicode"), 2);
110 for (int i
= 0; i
< codecList
->count(); i
++ )
111 combo
->addItem (codecList
->at(i
)->name(), i
+3);
114 void DictionaryCreationWizard::calculateAppropriate (bool) {
115 if (creationSource
->mergeButton
->isChecked()) {
116 setFinishEnabled (creationSource
, false);
117 removePage (fileWidget
);
118 removePage (dirWidget
);
119 removePage (kdeDocWidget
);
120 addPage (mergeWidget
, i18n("Source of New Dictionary (2)"));
121 setHelpEnabled (mergeWidget
, false);
122 setFinishEnabled (mergeWidget
, true);
124 else if (creationSource
->emptyButton
->isChecked()) {
125 removePage (fileWidget
);
126 removePage (dirWidget
);
127 removePage (kdeDocWidget
);
128 removePage (mergeWidget
);
129 setFinishEnabled (creationSource
, true);
131 else if (creationSource
->fileButton
->isChecked()) {
132 setFinishEnabled (creationSource
, false);
133 removePage (dirWidget
);
134 removePage (kdeDocWidget
);
135 removePage (mergeWidget
);
136 addPage (fileWidget
, i18n("Source of New Dictionary (2)"));
137 setHelpEnabled (fileWidget
, false);
138 setFinishEnabled (fileWidget
, true);
140 else if (creationSource
->directoryButton
->isChecked()) {
141 setFinishEnabled (creationSource
, false);
142 removePage (fileWidget
);
143 removePage (kdeDocWidget
);
144 removePage (mergeWidget
);
145 addPage (dirWidget
, i18n("Source of New Dictionary (2)"));
146 setHelpEnabled (dirWidget
, false);
147 setFinishEnabled (dirWidget
, true);
149 else { // creationSource->kdeDocButton must be checked
150 setFinishEnabled (creationSource
, false);
151 removePage (fileWidget
);
152 removePage (dirWidget
);
153 removePage (mergeWidget
);
154 addPage (kdeDocWidget
, i18n("Source of New Dictionary (2)"));
155 setHelpEnabled (kdeDocWidget
, false);
156 setFinishEnabled (kdeDocWidget
, true);
160 QString
DictionaryCreationWizard::createDictionary() {
161 WordList::WordMap map
;
162 QString dicFile
= "";
163 KProgressDialog
*pdlg
= WordList::progressDialog();
165 if (creationSource
->mergeButton
->isChecked()) {
166 map
= WordList::mergeFiles (mergeWidget
->mergeParameters(), pdlg
);
169 else if (creationSource
->emptyButton
->isChecked()) {
172 else if (creationSource
->fileButton
->isChecked()) {
173 QString filename
= fileWidget
->url
->url().path();
174 int encoding
= fileWidget
->encodingCombo
->currentIndex();
175 if (fileWidget
->spellCheckBox
->isChecked())
176 dicFile
= fileWidget
->ooDictURL
->url().path();
179 map
= WordList::parseFile (filename
, QTextStream::Locale
, 0, pdlg
);
182 map
= WordList::parseFile (filename
, QTextStream::Latin1
, 0, pdlg
);
185 map
= WordList::parseFile (filename
, QTextStream::Unicode
, 0, pdlg
);
188 map
= WordList::parseFile (filename
, (QTextStream::Encoding
)0, codecList
->at(encoding
-3), pdlg
);
191 else if (creationSource
->directoryButton
->isChecked()) {
192 QString directory
= dirWidget
->url
->url().path();
193 int encoding
= dirWidget
->encodingCombo
->currentIndex();
194 if (dirWidget
->spellCheckBox
->isChecked())
195 dicFile
= dirWidget
->ooDictURL
->url().path();
198 map
= WordList::parseDir (directory
, QTextStream::Locale
, 0, pdlg
);
201 map
= WordList::parseDir (directory
, QTextStream::Latin1
, 0, pdlg
);
204 map
= WordList::parseDir (directory
, QTextStream::Unicode
, 0, pdlg
);
207 map
= WordList::parseDir (directory
, (QTextStream::Encoding
)0, codecList
->at(encoding
-3), pdlg
);
210 else { // creationSource->kdeDocButton must be checked
211 QString language
= kdeDocWidget
->languageButton
->current();
212 if (kdeDocWidget
->spellCheckBox
->isChecked())
213 dicFile
= kdeDocWidget
->ooDictURL
->url().path();
214 map
= WordList::parseKDEDoc (language
, pdlg
);
217 if (!dicFile
.isEmpty() && !dicFile
.isNull())
218 map
= WordList::spellCheck (map
, dicFile
, pdlg
);
224 QString dictionaryFile
;
227 filename
= QString("wordcompletion%1.dict").arg(dictnumber
);
228 dictionaryFile
= KApplication::kApplication()->dirs()->findResource("appdata", filename
);
230 while (KStandardDirs::exists(dictionaryFile
));
232 dictionaryFile
= KApplication::kApplication()->dirs()->saveLocation ("appdata", "/") + filename
;
233 if (WordList::saveWordList (map
, dictionaryFile
))
239 QString
DictionaryCreationWizard::name() {
240 if (creationSource
->mergeButton
->isChecked()) {
241 return i18n("Merge result");
243 else if (creationSource
->emptyButton
->isChecked()) {
244 return i18nc("In the sense of a blank word list", "Empty list");
246 else if (creationSource
->fileButton
->isChecked()) {
247 return fileWidget
->url
->url().path();
249 else if (creationSource
->directoryButton
->isChecked()) {
250 return dirWidget
->url
->url().path();
252 else { // creationSource->kdeDocButton must be checked
253 return i18n("KDE Documentation");
257 QString
DictionaryCreationWizard::language() {
258 if (creationSource
->mergeButton
->isChecked()) {
259 return mergeWidget
->language();
261 else if (creationSource
->emptyButton
->isChecked()) {
262 if (KGlobal::locale())
263 return KGlobal::locale()->language();
265 return KLocale::defaultLanguage();
267 else if (creationSource
->fileButton
->isChecked()) {
268 return fileWidget
->languageButton
->current();
270 else if (creationSource
->directoryButton
->isChecked()) {
271 return dirWidget
->languageButton
->current();
273 else { // creationSource->kdeDocButton must be checked
274 return kdeDocWidget
->languageButton
->current();
278 /***************************************************************************/
280 MergeWidget::MergeWidget(K3Wizard
*parent
, const char *name
,
281 QStringList dictionaryNames
, QStringList dictionaryFiles
,
282 QStringList dictionaryLanguages
)
283 : Q3ScrollView (parent
, name
) {
284 dictionaries
.setAutoDelete (false);
285 weights
.setAutoDelete (false);
287 QWidget
*contents
= new QWidget(viewport());
289 QGridLayout
*layout
= new QGridLayout (contents
);
290 setResizePolicy (Q3ScrollView::AutoOneFit
);
291 layout
->setColumnStretch (0, 0);
292 layout
->setColumnStretch (1, 1);
295 QStringList::Iterator nIt
= dictionaryNames
.begin();
296 QStringList::Iterator fIt
= dictionaryFiles
.begin();
297 QStringList::Iterator lIt
= dictionaryLanguages
.begin();
298 for (; nIt
!= dictionaryNames
.end(); ++nIt
, ++fIt
, ++lIt
) {
299 QCheckBox
*checkbox
= new QCheckBox(*nIt
, contents
);
300 KIntNumInput
*numInput
= new KIntNumInput(contents
);
301 layout
->addWidget (checkbox
, row
, 0);
302 layout
->addWidget (numInput
, row
, 1);
304 checkbox
->setChecked (true);
305 numInput
->setRange (1, 100, 10, true);
306 numInput
->setValue (100);
307 connect (checkbox
, SIGNAL (toggled(bool)), numInput
, SLOT(setEnabled(bool)));
309 dictionaries
.insert(*fIt
, checkbox
);
310 weights
.insert(*fIt
, numInput
);
311 languages
[*fIt
] = *lIt
;
316 MergeWidget::~MergeWidget() {
319 QMap
<QString
, int> MergeWidget::mergeParameters () {
320 QMap
<QString
, int> files
;
321 Q3DictIterator
<QCheckBox
> it(dictionaries
);
322 for (; it
.current(); ++it
) {
323 if (it
.current()->isChecked()) {
324 QString name
= it
.currentKey();
325 QString dictionaryFile
= KApplication::kApplication()->dirs()->findResource("appdata", name
);
326 files
[dictionaryFile
] = weights
[name
]->value();
333 QString
MergeWidget::language () {
334 Q3DictIterator
<QCheckBox
> it(dictionaries
);
335 for (; it
.current(); ++it
) {
336 if (it
.current()->isChecked()) {
337 return languages
[it
.currentKey()];
344 /***************************************************************************/
346 CompletionWizardWidget::CompletionWizardWidget (K3Wizard
*parent
, const char *name
)
352 CompletionWizardWidget::~CompletionWizardWidget() {
355 void CompletionWizardWidget::ok (KConfig
*config
) {
356 WordList::WordMap map
;
357 KProgressDialog
*pdlg
= WordList::progressDialog();
359 QString language
= languageButton
->current();
360 map
= WordList::parseKDEDoc (language
, pdlg
);
362 if (spellCheckBox
->isChecked())
363 map
= WordList::spellCheck (map
, ooDictURL
->url().path(), pdlg
);
369 QString dictionaryFile
;
371 dictionaryFile
= KApplication::kApplication()->dirs()->saveLocation ("appdata", "/") + "wordcompletion1.dict";
372 if (WordList::saveWordList (map
, dictionaryFile
)) {
373 config
->setGroup("Dictionary 0");
374 config
->writeEntry ("Filename", "wordcompletion1.dict");
375 config
->writeEntry ("Name", i18n("Default"));
376 config
->writeEntry ("Language", language
);
381 #include "dictionarycreationwizard.moc"