00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "languagepropertiespage.h"
00015
00016 #include "languagesettings.h"
00017
00018 #include <kinputdialog.h>
00019 #include <kmessagebox.h>
00020
00021 #include "practiceold/testentrymanager.h"
00022 #include <keduvocdocument.h>
00023 #include <keduvoclesson.h>
00024
00025 #include <KLocale>
00026 #include <KStandardDirs>
00027 #include <KLineEdit>
00028 #include <QCheckBox>
00029 #include <QLabel>
00030 #include <QtDBus>
00031 #include <parleydocument.h>
00032
00033 #define TENSE_TAG ". "
00034
00035 LanguagePropertiesPage::LanguagePropertiesPage(ParleyDocument *doc, int identifierIndex, QWidget *parent)
00036 :QWidget(parent), m_parleyDocument(doc), m_identifierIndex(identifierIndex)
00037 {
00038 m_doc = m_parleyDocument->document();
00039
00040 setupUi(this);
00041
00042 connect(localeComboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(localeChanged(const QString&)));
00043 connect(iconComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(iconChanged(int)));
00044 connect(identifierNameLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(languageNameChanged(const QString&)));
00045 connect(downloadGrammarButton, SIGNAL(clicked()), this, SLOT(downloadGrammar()));
00046
00047 QStringList languageCodes = KGlobal::locale()->allLanguagesList();
00048
00049
00050 QMap<QString, QString> languageCodeMap;
00051 foreach (const QString &code, languageCodes){
00052 languageCodeMap[KGlobal::locale()->languageCodeToName(code)] = code;
00053 }
00054
00055 foreach ( const QString &language, languageCodeMap.keys() ) {
00056 localeComboBox->addItem( language, languageCodeMap.value(language) );
00057 }
00058
00059 QString currentIcon;
00060
00061 if (m_identifierIndex < m_doc->identifierCount()) {
00062 localeComboBox->setCurrentIndex(localeComboBox->findData(
00063 m_doc->identifier(m_identifierIndex).locale()));
00064
00065 identifierNameLineEdit->setText(m_doc->identifier(m_identifierIndex).name());
00066
00067
00068 LanguageSettings currentSettings(m_doc->identifier(m_identifierIndex).locale());
00069 currentSettings.readConfig();
00070 currentIcon = currentSettings.icon();
00071 }
00072
00073 QStringList countrylist = KGlobal::locale()->allCountriesList();
00074 foreach(const QString &code, countrylist) {
00075 QString country = KGlobal::dirs()->findResource("locale",
00076 QString("l10n/%1/entry.desktop").arg(code));
00077 KConfig entry(country, KConfig::SimpleConfig);
00078 KConfigGroup group = entry.group("KCM Locale");
00079 QString name = group.readEntry("Name", i18n("without name"));
00080
00081 QString pixmap = country;
00082 pixmap.truncate(pixmap.lastIndexOf('/'));
00083 pixmap += "/flag.png";
00084
00085 iconComboBox->addItem(QIcon(pixmap), name, pixmap);
00086 }
00087
00088 iconComboBox->model()->sort(0);
00089
00090 iconComboBox->insertItem(0, i18n("No icon"));
00091 int currentIconPosition = iconComboBox->findData(currentIcon);
00092 if (currentIconPosition >= 0) {
00093 iconComboBox->setCurrentIndex(currentIconPosition);
00094 } else {
00095 iconComboBox->setCurrentIndex(0);
00096 }
00097
00098
00099
00100 QDBusInterface kxbk("org.kde.kxkb", "/kxkb", "org.kde.KXKB");
00101 QDBusReply<QStringList> reply = kxbk.call("getLayoutsList");
00102 if (reply.isValid()) {
00103 QStringList layouts = reply;
00104 layouts.prepend(QString());
00105 keyboardLayoutComboBox->clear();
00106 keyboardLayoutComboBox->addItems(layouts);
00107 keyboardLayoutComboBox->setEnabled(true);
00108
00109 QDBusReply<QString> currentLayout = kxbk.call("getCurrentLayout");
00110 keyboardLayoutComboBox->setCurrentIndex(keyboardLayoutComboBox->findText(currentLayout));
00111 if (m_identifierIndex < m_doc->identifierCount()) {
00112 LanguageSettings settings(m_doc->identifier(m_identifierIndex).locale());
00113 settings.readConfig();
00114 if (!settings.keyboardLayout().isEmpty()) {
00115 keyboardLayoutComboBox->setCurrentIndex(keyboardLayoutComboBox->findText(settings.keyboardLayout()));
00116 }
00117 }
00118 } else {
00119 kDebug() << "kxkb dbus error";
00120 keyboardLayoutComboBox->setEnabled(false);
00121 }
00122
00123 loadGrammarFromDocument();
00124 }
00125
00126 void LanguagePropertiesPage::setLanguageIdentifierIndex(int newIndex)
00127 {
00128 m_identifierIndex = newIndex;
00129 }
00130
00131 void LanguagePropertiesPage::downloadGrammar()
00132 {
00133 m_parleyDocument->fetchGrammar(m_identifierIndex);
00134 loadGrammarFromDocument();
00135 }
00136
00137 void LanguagePropertiesPage::loadGrammarFromDocument()
00138 {
00139 if (m_identifierIndex < m_doc->identifierCount()) {
00140
00141 KEduVocArticle articles = m_doc->identifier(m_identifierIndex).article();
00142
00143 def_male->setText(articles.article( KEduVocWordFlag::Singular | KEduVocWordFlag::Definite | KEduVocWordFlag::Masculine ));
00144 indef_male->setText(articles.article( KEduVocWordFlag::Singular | KEduVocWordFlag::Indefinite | KEduVocWordFlag::Masculine ));
00145
00146 def_female->setText(articles.article( KEduVocWordFlag::Singular | KEduVocWordFlag::Definite | KEduVocWordFlag::Feminine ));
00147 indef_female->setText(articles.article( KEduVocWordFlag::Singular | KEduVocWordFlag::Indefinite | KEduVocWordFlag::Feminine ));
00148
00149 def_natural->setText(articles.article( KEduVocWordFlag::Singular | KEduVocWordFlag::Definite | KEduVocWordFlag::Neuter ));
00150 indef_natural->setText(articles.article( KEduVocWordFlag::Singular | KEduVocWordFlag::Indefinite | KEduVocWordFlag::Neuter ));
00151
00152
00153 def_male_plural->setText(articles.article( KEduVocWordFlag::Plural | KEduVocWordFlag::Definite | KEduVocWordFlag::Masculine ));
00154 indef_male_plural->setText(articles.article( KEduVocWordFlag::Plural | KEduVocWordFlag::Indefinite | KEduVocWordFlag::Masculine ));
00155
00156 def_female_plural->setText(articles.article( KEduVocWordFlag::Plural | KEduVocWordFlag::Definite | KEduVocWordFlag::Feminine ));
00157 indef_female_plural->setText(articles.article( KEduVocWordFlag::Plural | KEduVocWordFlag::Indefinite | KEduVocWordFlag::Feminine ));
00158
00159 def_natural_plural->setText(articles.article( KEduVocWordFlag::Plural | KEduVocWordFlag::Definite | KEduVocWordFlag::Neuter ));
00160 indef_natural_plural->setText(articles.article( KEduVocWordFlag::Plural | KEduVocWordFlag::Indefinite | KEduVocWordFlag::Neuter ));
00161
00162
00163 const KEduVocWordFlags numS = KEduVocWordFlag::Singular;
00164 const KEduVocWordFlags numD = KEduVocWordFlag::Dual;
00165 const KEduVocWordFlags numP = KEduVocWordFlag::Plural;
00166
00167 KEduVocPersonalPronoun pronoun = m_doc->identifier(m_identifierIndex).personalPronouns();
00168
00169 first_singular->setText(pronoun.personalPronoun(KEduVocWordFlag::First | numS));
00170 second_singular->setText(pronoun.personalPronoun(KEduVocWordFlag::Second | numS));
00171 thirdM_singular->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | numS));
00172 thirdF_singular->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | numS));
00173 thirdN_singular->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | numS));
00174
00175 dualFirstLineEdit->setText(pronoun.personalPronoun(KEduVocWordFlag::First | numD));
00176 dualSecondLineEdit->setText(pronoun.personalPronoun(KEduVocWordFlag::Second | numD));
00177 dualThirdMaleLineEdit->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | numD));
00178 dualThirdFemaleLineEdit->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | numD));
00179 dualThirdNeutralLineEdit->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | numD));
00180
00181 first_plural->setText(pronoun.personalPronoun(KEduVocWordFlag::First | numP));
00182 second_plural->setText(pronoun.personalPronoun(KEduVocWordFlag::Second | numP));
00183 thirdM_plural->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | numP));
00184 thirdF_plural->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | numP));
00185 thirdN_plural->setText(pronoun.personalPronoun(KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | numP));
00186
00187 maleFemaleDifferCheckBox->setChecked(pronoun.maleFemaleDifferent());
00188 neutralCheckBox->setChecked(pronoun.neutralExists());
00189 dualCheckBox->setChecked(pronoun.dualExists());
00190 }
00191
00192
00193 updateCheckBoxes();
00194
00195 connect(maleFemaleDifferCheckBox, SIGNAL(toggled(bool)), SLOT(updateCheckBoxes()));
00196 connect(neutralCheckBox, SIGNAL(toggled(bool)), SLOT(updateCheckBoxes()));
00197 connect(dualCheckBox, SIGNAL(toggled(bool)), SLOT(updateCheckBoxes()));
00198
00199
00200 connect(tenseList, SIGNAL(currentRowChanged(int)), this, SLOT(slotTenseChosen(int)));
00201 connect(deleteButton, SIGNAL(clicked()), this, SLOT(slotDeleteTense()));
00202 connect(modifyButton, SIGNAL(clicked()), this, SLOT(slotModifyTense()));
00203 connect(newButton, SIGNAL(clicked()), this, SLOT(slotNewTense()));
00204
00205 if (m_identifierIndex < m_doc->identifierCount()) {
00206 int i = 1;
00207 foreach(const QString &tenseName, m_doc->identifier(m_identifierIndex).tenseList()) {
00208 tenseList->addItem(QString("%1").arg(i++, 2).append(TENSE_TAG).append(tenseName));
00209 tenseIndex.append(i);
00210 }
00211 }
00212
00213 m_currentTense = 0;
00214 if (tenseList->count() > 0) {
00215 tenseList->setCurrentRow(m_currentTense);
00216 }
00217
00218 modifyButton->setEnabled(tenseList->count() > 0);
00219 deleteButton->setEnabled(tenseList->count() > 0);
00220 tenseList->setFocus();
00221 }
00222
00223 void LanguagePropertiesPage::accept()
00224 {
00225 if (!isEnabled()) {
00226
00227 return;
00228 }
00229
00230
00231 QString locale = localeComboBox->itemData(localeComboBox->currentIndex()).toString();
00232
00233
00234 if (locale.isEmpty()) {
00235 locale = identifierNameLineEdit->text();
00236 }
00237 m_doc->identifier(m_identifierIndex).setLocale( locale );
00238 m_doc->identifier(m_identifierIndex).setName( identifierNameLineEdit->text() );
00239
00240 QString icon = iconComboBox->itemData(iconComboBox->currentIndex()).toString();
00241
00242 LanguageSettings settings(locale);
00243 settings.setIcon(icon);
00244 if ( keyboardLayoutComboBox->isEnabled() ) {
00245 settings.setKeyboardLayout( keyboardLayoutComboBox->currentText() );
00246 }
00247 settings.writeConfig();
00248
00249
00250 const KEduVocWordFlag::Flags artSing = KEduVocWordFlag::Singular;
00251 const KEduVocWordFlag::Flags artDual = KEduVocWordFlag::Dual;
00252 const KEduVocWordFlag::Flags artPlur = KEduVocWordFlag::Plural;
00253
00254 const KEduVocWordFlag::Flags artDef = KEduVocWordFlag::Definite;
00255 const KEduVocWordFlag::Flags artIndef = KEduVocWordFlag::Indefinite;
00256
00257 KEduVocArticle article;
00258
00259 article.setArticle( def_male->text(), artSing | artDef | KEduVocWordFlag::Masculine );
00260 article.setArticle( indef_male->text(), artSing | artIndef | KEduVocWordFlag::Masculine );
00261 article.setArticle( def_female->text(), artSing | artDef | KEduVocWordFlag::Feminine );
00262 article.setArticle( indef_female->text(), artSing | artIndef | KEduVocWordFlag::Feminine );
00263 article.setArticle( def_natural->text(), artSing | artDef | KEduVocWordFlag::Neuter );
00264 article.setArticle( indef_natural->text(), artSing | artIndef | KEduVocWordFlag::Neuter );
00265
00266
00267 article.setArticle( def_male_plural->text(), artPlur | artDef | KEduVocWordFlag::Masculine );
00268 article.setArticle( indef_male_plural->text(), artPlur | artIndef | KEduVocWordFlag::Masculine );
00269 article.setArticle( def_female_plural->text(), artPlur | artDef | KEduVocWordFlag::Feminine );
00270 article.setArticle( indef_female_plural->text(), artPlur | artIndef | KEduVocWordFlag::Feminine );
00271 article.setArticle( def_natural_plural->text(), artPlur | artDef | KEduVocWordFlag::Neuter );
00272 article.setArticle( indef_natural_plural->text(), artPlur | artIndef | KEduVocWordFlag::Neuter );
00273
00274 m_doc->identifier(m_identifierIndex).setArticle( article );
00275
00276
00277 KEduVocPersonalPronoun pronoun;
00278 const KEduVocWordFlags numS = KEduVocWordFlag::Singular;
00279 const KEduVocWordFlags numD = KEduVocWordFlag::Dual;
00280 const KEduVocWordFlags numP = KEduVocWordFlag::Plural;
00281
00282 pronoun.setPersonalPronoun(first_singular->text(), KEduVocWordFlag::First | numS);
00283 pronoun.setPersonalPronoun(second_singular->text(), KEduVocWordFlag::Second| numS);
00284 pronoun.setPersonalPronoun(thirdM_singular->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | numS);
00285 pronoun.setPersonalPronoun(thirdF_singular->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | numS);
00286 pronoun.setPersonalPronoun(thirdN_singular->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | numS);
00287
00288 pronoun.setPersonalPronoun(dualFirstLineEdit->text(), KEduVocWordFlag::First | numD);
00289 pronoun.setPersonalPronoun(dualSecondLineEdit->text(), KEduVocWordFlag::Second | numD);
00290 pronoun.setPersonalPronoun(dualThirdMaleLineEdit->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | numD);
00291 pronoun.setPersonalPronoun(dualThirdFemaleLineEdit->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | numD);
00292 pronoun.setPersonalPronoun(dualThirdNeutralLineEdit->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Neuter| numD);
00293
00294 pronoun.setPersonalPronoun(first_plural->text(), KEduVocWordFlag::First | numP);
00295 pronoun.setPersonalPronoun(second_plural->text(), KEduVocWordFlag::Second | numP);
00296 pronoun.setPersonalPronoun(thirdM_plural->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Masculine | numP);
00297 pronoun.setPersonalPronoun(thirdF_plural->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Feminine | numP);
00298 pronoun.setPersonalPronoun(thirdN_plural->text(), KEduVocWordFlag::Third | KEduVocWordFlag::Neuter | numP);
00299
00300 pronoun.setMaleFemaleDifferent(maleFemaleDifferCheckBox->isChecked());
00301 pronoun.setNeutralExists(neutralCheckBox->isChecked());
00302 pronoun.setDualExists(dualCheckBox->isChecked());
00303
00304 m_doc->identifier(m_identifierIndex).setPersonalPronouns( pronoun );
00305
00306
00307
00308 QList<int> tenseIndex;
00309 QStringList tenses;
00310
00311 QString str;
00312 for (int i = 0; i < (int) tenseList->count(); i++) {
00313 str = tenseList->item(i)->text();
00314 tenses.append(str.mid(str.indexOf(TENSE_TAG) + QString(TENSE_TAG).length()));
00315 }
00316
00317 m_doc->identifier(m_identifierIndex).setTenseList(tenses);
00318 }
00319
00320
00321 void LanguagePropertiesPage::updateCheckBoxes()
00322 {
00323 bool maleFemale = maleFemaleDifferCheckBox->isChecked();
00324 bool neutral = neutralCheckBox->isChecked();
00325 bool dual = dualCheckBox->isChecked();
00326
00327 neutralCheckBox->setVisible(maleFemale);
00328 male_c_label->setVisible(maleFemale);
00329 female_c_label->setVisible(maleFemale);
00330 thirdM_singular->setVisible(maleFemale);
00331 thirdF_singular->setVisible(maleFemale);
00332 thirdM_plural->setVisible(maleFemale);
00333 thirdF_plural->setVisible(maleFemale);
00334
00335 dualLabel->setVisible(dual);
00336 dualFirstLineEdit->setVisible(dual);
00337 dualSecondLineEdit->setVisible(dual);
00338
00339 dualThirdMaleLineEdit->setVisible(dual && maleFemale);
00340 dualThirdFemaleLineEdit->setVisible(dual && maleFemale);
00341
00342 if ( !maleFemale ) {
00343 natural_c_label->setVisible(false);
00344 thirdN_singular->setVisible(true);
00345 thirdN_plural->setVisible(true);
00346 dualThirdNeutralLineEdit->setVisible(dual);
00347 } else {
00348 natural_c_label->setVisible(neutral);
00349 thirdN_singular->setVisible(neutral);
00350 thirdN_plural->setVisible(neutral);
00351 dualThirdNeutralLineEdit->setVisible(dual && neutral);
00352 }
00353 }
00354
00355
00356 void LanguagePropertiesPage::iconChanged(int iconIndex)
00357 {
00358 emit iconSelected( iconComboBox->itemData(iconIndex).toString() );
00359 }
00360
00361 void LanguagePropertiesPage::localeChanged(const QString & locale)
00362 {
00363 identifierNameLineEdit->setText( locale );
00364 }
00365
00366
00367
00368
00369 void LanguagePropertiesPage::slotTenseChosen(int index)
00370 {
00371 m_currentTense = index;
00372 }
00373
00374 void LanguagePropertiesPage::slotNewTense()
00375 {
00376 bool ok;
00377 QString getTense = KInputDialog::getText(i18n("Tense Name"), i18n("Enter name of tense:"), QString(), &ok, this);
00378 if (!ok)
00379 return;
00380
00381 QString str;
00382 int i = tenseList->count() + 1;
00383 tenseList->addItem(QString("%1").arg(i, 2).append(TENSE_TAG).append(getTense.simplified()));
00384 tenseIndex.append(-(i - 1));
00385
00386 m_currentTense = tenseList->count();
00387 tenseList->setCurrentRow(i - 1);
00388 modifyButton->setEnabled(true);
00389 deleteButton->setEnabled(true);
00390 }
00391
00392 void LanguagePropertiesPage::slotModifyTense()
00393 {
00394 if (tenseList->count() != 0 && (int) tenseList->count() > m_currentTense) {
00395 QString str = tenseList->item(m_currentTense)->text();
00396 str = str.mid(str.indexOf(TENSE_TAG) + QString(TENSE_TAG).length());
00397
00398 bool ok;
00399 QString getTense = KInputDialog::getText(i18n("Tense Name"), i18n("Enter name of tense:"), str, &ok, this);
00400 if (!ok)
00401 return;
00402
00403 int i = m_currentTense + 1;
00404 tenseList->item(m_currentTense)->setText(QString("%1").arg(i, 2).append(TENSE_TAG).append(getTense.simplified()));
00405 }
00406 }
00407
00408 void LanguagePropertiesPage::updateListBox(int start)
00409 {
00410 QString str;
00411 for (int i = start; i < (int) tenseList->count(); i++) {
00412 str = tenseList->item(i)->text();
00413 str = str.mid(str.indexOf(TENSE_TAG) + QString(TENSE_TAG).length());
00414 tenseList->item(i)->setText(QString("%1").arg(i + 1, 2).append(TENSE_TAG).append(str));
00415 }
00416 }
00417
00418 void LanguagePropertiesPage::slotDeleteTense()
00419 {
00420 int act = m_currentTense;
00421 if (tenseList->count() > 0 && (int) tenseList->count() > act) {
00422
00423 QString t = tenseList->item(act)->text();
00424
00425 foreach (KEduVocExpression *exp, m_doc->lesson()->entries(KEduVocLesson::Recursive)) {
00426 for (int lang = 0; lang < m_doc->identifierCount(); lang++) {
00427 if ( exp->translation(lang)->conjugationTenses().contains(t)) {
00428 KMessageBox::information(this, i18n("The selected user defined tense could not be deleted\nbecause it is in use."), i18n("Deleting Tense Description"));
00429 return;
00430 }
00431 }
00432 }
00433
00434 delete tenseList->takeItem(act);
00435 tenseIndex.erase(tenseIndex.begin() + act);
00436
00437 if ((int) tenseList->count() <= act)
00438 act = tenseList->count() - 1;
00439 else
00440 updateListBox(act);
00441
00442 if (act >= 0)
00443 tenseList->setCurrentRow(act);
00444 }
00445 modifyButton->setEnabled(tenseList->count() > 0);
00446 deleteButton->setEnabled(tenseList->count() > 0);
00447 }
00448
00449 #include "languagepropertiespage.moc"