• Skip to content
  • Skip to link menu
KDE 4.5 API Reference
  • KDE API Reference
  • kdeedu
  • Sitemap
  • Contact Us
 

parley

languagepropertiespage.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002     Copyright 2008 Frederik Gladhorn <gladhorn@kde.org>
00003  ***************************************************************************/
00004 
00005 /***************************************************************************
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
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     // qmap automatically sorts by keys
00050     QMap<QString, QString> languageCodeMap;
00051     foreach (const QString &code, languageCodes){
00052         languageCodeMap[KGlobal::locale()->languageCodeToName(code)] = code;
00053     }
00054     // add the language, but also it's code as data
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         // icons
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     // sort the list by country name
00088     iconComboBox->model()->sort(0);
00089     // prepend no icon
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     // keyboard layout
00099     // try to talk to kxbk - get a list of keyboard layouts
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         // articles
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         // personal pronouns
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     // update shown labels etc...
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     // tenses
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         // disabled pages are deleted languages
00227         return;
00228     }
00229 
00230     // general
00231     QString locale = localeComboBox->itemData(localeComboBox->currentIndex()).toString();
00232 
00233     // if no locales are found (kdebase not installed?) at least fall back to using the language name as locale.
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     // articles
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     // personal pronouns
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     // tenses
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 // ************** TENSES *********************
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); // update items after current
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"

parley

Skip menu "parley"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdeedu

Skip menu "kdeedu"
  •     lib
  • kalzium
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  •   stepcore
Generated for kdeedu by doxygen 1.5.9-20090814
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal