libkdeedu/keduvocdocument
keduvocdeclension.cpp
Go to the documentation of this file.00001 /*************************************************************************** 00002 00003 C++ Implementation: keduvocdeclension 00004 00005 ----------------------------------------------------------------------- 00006 00007 begin : Do Sep 20 2007 00008 00009 copyright : (C) 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net> 00010 00011 ----------------------------------------------------------------------- 00012 00013 ***************************************************************************/ 00014 00015 /*************************************************************************** 00016 * * 00017 * This program is free software; you can redistribute it and/or modify * 00018 * it under the terms of the GNU General Public License as published by * 00019 * the Free Software Foundation; either version 2 of the License, or * 00020 * (at your option) any later version. * 00021 * * 00022 ***************************************************************************/ 00023 00024 #include "keduvocdeclension.h" 00025 00026 #include "kvtml2defs.h" 00027 #include "keduvockvtml2writer.h" 00028 #include <QtXml/QDomDocument> 00029 00030 #include <QtCore/QMap> 00031 00032 class KEduVocDeclension::Private 00033 { 00034 public: 00035 QMap<KEduVocWordFlags, KEduVocText> m_declensions; 00036 }; 00037 00038 KEduVocDeclension::KEduVocDeclension() 00039 :d (new Private) 00040 { 00041 } 00042 00043 KEduVocDeclension::KEduVocDeclension(const KEduVocDeclension & other) 00044 :d (new Private) 00045 { 00046 d->m_declensions = other.d->m_declensions; 00047 } 00048 00049 KEduVocDeclension & KEduVocDeclension::operator =(const KEduVocDeclension & other) 00050 { 00051 d->m_declensions = other.d->m_declensions; 00052 return *this; 00053 } 00054 00055 KEduVocDeclension::~KEduVocDeclension() 00056 { 00057 delete d; 00058 } 00059 00060 KEduVocText& KEduVocDeclension::declension(KEduVocWordFlags flags) 00061 { 00062 return d->m_declensions[flags]; 00063 } 00064 00065 void KEduVocDeclension::setDeclension(const KEduVocText & declension, KEduVocWordFlags flags) 00066 { 00067 d->m_declensions[flags] = declension; 00068 } 00069 00070 bool KEduVocDeclension::isEmpty() 00071 { 00072 return d->m_declensions.isEmpty(); 00073 } 00074 00075 void KEduVocDeclension::toKVTML2(QDomElement & parent) 00076 { 00077 if (isEmpty()) { 00078 return; 00079 } 00080 QDomDocument domDoc = parent.ownerDocument(); 00081 QDomElement declensionElement = domDoc.createElement( KVTML_DECLENSION ); 00082 00083 QMap<int, KEduVocWordFlags> numbers; 00084 numbers[0] = KEduVocWordFlag::Singular; 00085 numbers[1] = KEduVocWordFlag::Dual; 00086 numbers[2] = KEduVocWordFlag::Plural; 00087 00088 QMap<int, KEduVocWordFlags> cases; 00089 cases[0] = KEduVocWordFlag::Nominative; 00090 cases[1] = KEduVocWordFlag::Genitive; 00091 cases[2] = KEduVocWordFlag::Dative; 00092 cases[3] = KEduVocWordFlag::Accusative; 00093 cases[4] = KEduVocWordFlag::Ablative; 00094 cases[5] = KEduVocWordFlag::Locative; 00095 cases[6] = KEduVocWordFlag::Vocative; 00096 00097 00098 00099 for ( int num = 0; num <= 2; ++num) { 00100 QDomElement numberElement = domDoc.createElement( KVTML_GRAMMATICAL_NUMBER[num] ); 00101 for ( int dcase = 0; dcase <= 6; ++dcase ) { 00102 QDomElement caseElement = domDoc.createElement( KVTML_DECLENSION_CASE[dcase] ); 00103 declension(numbers[num] | cases[dcase]).toKVTML2(caseElement); 00104 00105 if (caseElement.hasChildNodes()) { 00106 numberElement.appendChild(caseElement); 00107 } 00108 } 00109 if (numberElement.hasChildNodes()) { 00110 declensionElement.appendChild(numberElement); 00111 } 00112 } 00113 if (declensionElement.hasChildNodes()) { 00114 parent.appendChild(declensionElement); 00115 } 00116 } 00117 00118 KEduVocDeclension* KEduVocDeclension::fromKVTML2(QDomElement & parent) 00119 { 00120 QDomElement declensionElement = parent.firstChildElement( KVTML_DECLENSION ); 00121 // we don't create empty objects, if necessary, create later on demand. 00122 if (declensionElement.isNull()) { 00123 return 0; 00124 } 00125 00126 00127 QMap<int, KEduVocWordFlags> numbers; 00128 numbers[0] = KEduVocWordFlag::Singular; 00129 numbers[1] = KEduVocWordFlag::Dual; 00130 numbers[2] = KEduVocWordFlag::Plural; 00131 00132 QMap<int, KEduVocWordFlags> cases; 00133 cases[0] = KEduVocWordFlag::Nominative; 00134 cases[1] = KEduVocWordFlag::Genitive; 00135 cases[2] = KEduVocWordFlag::Dative; 00136 cases[3] = KEduVocWordFlag::Accusative; 00137 cases[4] = KEduVocWordFlag::Ablative; 00138 cases[5] = KEduVocWordFlag::Locative; 00139 cases[6] = KEduVocWordFlag::Vocative; 00140 00141 KEduVocDeclension* declension = new KEduVocDeclension; 00142 00143 for ( int num = 0; num <= 2; ++num ) { 00144 QDomElement numberElement = declensionElement.firstChildElement( KVTML_GRAMMATICAL_NUMBER[num] ); 00145 if (!numberElement.isNull()) { 00146 for ( int dcase = 0; dcase <= 6; ++dcase) { 00147 QDomElement caseElement = numberElement.firstChildElement( KVTML_DECLENSION_CASE[dcase] ); 00148 if (!caseElement.isNull()) { 00149 KEduVocText text; 00150 text.fromKVTML2(caseElement); 00151 declension->setDeclension(text, numbers[num] | cases[dcase]); 00152 } 00153 } 00154 } 00155 } 00156 return declension; 00157 } 00158 00159 00160
KDE 4.2 API Reference