1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/***************************************************************************
Copyright 2007 Jeremy Whiting <jpwhiting@kde.org>
Copyright 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "keduvocwordtype.h"
#include "keduvocexpression.h"
#include <QtCore/QList>
#include <QtCore/QSet>
class KEduVocWordType::Private
{
public:
// bitvector of word type flags
KEduVocWordFlags m_flags;
QList<KEduVocExpression*> m_expressions;
// list of translations
QList<KEduVocTranslation*> m_translations;
};
KEduVocWordType::KEduVocWordType(const QString& name, KEduVocWordType *parent)
: KEduVocContainer(name, WordType, parent), d( new Private )
{}
KEduVocWordType::~KEduVocWordType()
{
foreach(KEduVocTranslation* translation, d->m_translations) {
translation->setWordType(0);
}
delete d;
}
QList<KEduVocExpression*> KEduVocWordType::entries(EnumEntriesRecursive recursive)
{
if (recursive == Recursive) {
return entriesRecursive();
}
return d->m_expressions;
}
int KEduVocWordType::entryCount(EnumEntriesRecursive recursive)
{
if (recursive == Recursive) {
return entriesRecursive().count();
}
return d->m_expressions.count();
}
void KEduVocWordType::addTranslation(KEduVocTranslation* translation)
{
// add to expression - if not already there because another translation of the same word is there.
bool found = false;
foreach(int i, translation->entry()->translationIndices()) {
if (translation->entry()->translation(i)->wordType() == this) {
found = true;
break;
}
}
if (!found) {
d->m_expressions.append(translation->entry());
}
d->m_translations.append( translation );
invalidateChildLessonEntries();
}
void KEduVocWordType::removeTranslation(KEduVocTranslation* translation)
{
d->m_translations.removeAt( d->m_translations.indexOf(translation) );
// no lesson found - this entry is being deleted. remove all its siblings.
if (!translation->entry()->lesson()) {
int index = d->m_expressions.indexOf(translation->entry());
if (index != -1) {
d->m_expressions.removeAt(index);
}
}
// remove from cache if none of the translations use this word type (other than the one we are removing that should not be taken into account)
bool found = false;
foreach(int i, translation->entry()->translationIndices()) {
if (translation->entry()->translation(i)->wordType() && translation->entry()->translation(i)->wordType() == this && translation->entry()->translation(i) != translation) {
found = true;
break;
}
}
if (!found) {
d->m_expressions.removeAt(d->m_expressions.indexOf(translation->entry()));
}
invalidateChildLessonEntries();
}
KEduVocTranslation * KEduVocWordType::translation(int row)
{
return d->m_translations.value(row);
}
KEduVocExpression * KEduVocWordType::entry(int row, EnumEntriesRecursive recursive)
{
if (recursive == Recursive) {
return entriesRecursive().value(row);
}
return entries().value(row);
}
KEduVocWordFlags KEduVocWordType::wordType() const
{
return d->m_flags;
}
void KEduVocWordType::setWordType(KEduVocWordFlags flags)
{
d->m_flags = flags;
}
KEduVocWordType* KEduVocWordType::childOfType(const KEduVocWordFlags& flags)
{
if(d->m_flags == flags) {
return this;
}
foreach(KEduVocContainer* child, childContainers()) {
KEduVocWordType* result = static_cast<KEduVocWordType*>(child)->childOfType(flags);
if(result) {
return result;
}
}
return 0;
}
|