MessageItem *MessageModel::messageItem(const QModelIndex &indx) const { if (indx.isValid()) { ContextItem *c = static_cast<ContextItem *>(indx.internalPointer()); if (c) return c->messageItem(indx.row()); } return 0; }
ContextItem *DataModel::findContext(const QString &context) const { for (int c = 0; c < m_contextList.count(); ++c) { ContextItem *ctx = contextItem(c); if (ctx->context() == context) return ctx; } return 0; }
static int calcMergeScore(const DataModel *one, const DataModel *two) { int inBoth = 0; for (int i = 0; i < two->contextCount(); ++i) { ContextItem *oc = two->contextItem(i); if (ContextItem *c = one->findContext(oc->context())) { for (int j = 0; j < oc->messageCount(); ++j) { MessageItem *m = oc->messageItem(j); if (c->findMessage(m->text(), m->comment())) ++inBoth; } } } return inBoth * 100 / two->messageCount(); }
QModelIndex MessageModel::index(int row, int column, const QModelIndex &parent /*= QModelIndex()*/) const { if (row < 0 || column < 0) return QModelIndex(); if (!parent.isValid()) { // The context items if (row >= rowCount() || column >= columnCount()) { return QModelIndex(); } return createIndex(row, column, 0); //internalpointer points to the 'owner' object } else { // The message items if (parent.internalPointer()) return QModelIndex(); int toprow = parent.row(); ContextItem *c = cntxtList.at(toprow); if (row > c->messageItemsInList()) return QModelIndex(); return createIndex(row, column, c); } }
MessageItem *MessageModel::findMessage(const char *context, const char *sourcetext, const char *comment /*= 0*/) const { for (int c = 0; c < cntxtList.count(); ++c) { ContextItem *ctx = cntxtList.at(c); if (ctx->context() == QLatin1String(context)) { QList<MessageItem*> items = ctx->messageItemList(); for (int i = 0; i < items.count(); ++i) { MessageItem *mi = items.at(i); if (mi->sourceText() == QLatin1String(sourcetext)) { if (comment) { if (mi->comment() != QLatin1String(comment)) continue; } return mi; } } break; } } return 0; }
bool MessageModel::load(const QString &fileName) { MetaTranslator tor; bool ok = tor.load(fileName); if (ok) { if(tor.codecForTr()) m_codecForTr = tor.codecForTr()->name(); int messageCount = 0; clearContextList(); m_numFinished = 0; m_numNonobsolete = 0; TML all = tor.messages(); QHash<QString, ContextItem*> contexts; m_srcWords = 0; m_srcChars = 0; m_srcCharsSpc = 0; foreach(MetaTranslatorMessage mtm, all) { QCoreApplication::processEvents(); ContextItem *c; if (contexts.contains(QLatin1String(mtm.context()))) { c = contexts.value( QLatin1String(mtm.context())); } else { c = createContextItem(tor.toUnicode(mtm.context(), mtm.utf8()));; appendContextItem(c); contexts.insert(QLatin1String(mtm.context()), c); } if (QByteArray(mtm.sourceText()) == ContextComment) { c->appendToComment(tor.toUnicode(mtm.comment(), mtm.utf8())); } else { MessageItem *tmp = new MessageItem(mtm, tor.toUnicode(mtm.sourceText(), mtm.utf8()), tor.toUnicode(mtm.comment(), mtm.utf8()), c); if (mtm.type() != MetaTranslatorMessage::Obsolete) { m_numNonobsolete++; //if (mtm.type() == MetaTranslatorMessage::Finished) //tmp->setFinished(true); //++m_numFinished; doCharCounting(tmp->sourceText(), m_srcWords, m_srcChars, m_srcCharsSpc); } else { c->incrementObsoleteCount(); } c->appendMessageItem(tmp); ++messageCount; } } // Try to detect the correct language in the following order // 1. Look for the language attribute in the ts // if that fails // 2. Guestimate the language from the filename (expecting the qt_{en,de}.ts convention) // if that fails // 3. Retrieve the locale from the system. QString lang = tor.languageCode(); if (lang.isEmpty()) { int pos_sep = fileName.indexOf(QLatin1Char('_')); if (pos_sep != -1 && pos_sep + 3 <= fileName.length()) { lang = fileName.mid(pos_sep + 1, 2); } } QLocale::Language l; QLocale::Country c; MetaTranslator::languageAndCountry(lang, &l, &c); if (l == QLocale::C) { QLocale sys; l = sys.language(); c = sys.country(); } setLanguage(l); setCountry(c); m_numMessages = messageCount; updateAll(); setModified(false); }
bool MessageModel::findMessage(int *contextNo, int *itemNo, const QString &findText, int findWhere, bool matchSubstring, Qt::CaseSensitivity cs) { bool found = false; if (contextsInList() <= 0) return false; int pass = 0; int scopeNum = *contextNo; int itemNum = *itemNo; MessageItem *m = 0; // We want to search the scope we started from *again*, since we did not necessarily search that *completely* when we started. // (Problaby we started somewhere in the middle of it.) // Therefore, "pass <=" and not "pass < " while (!found && pass <= contextsInList()) { ContextItem *c = contextList().at(scopeNum); for (int mit = itemNum; mit < c->messageItemsInList() ; ++mit) { m = c->messageItem(mit); QString searchText; switch (findWhere) { case SourceText: searchText = m->sourceText(); break; case Translations: searchText = m->translation(); break; case Comments: searchText = m->comment(); break; } if (matchSubstring) { if (searchText.indexOf(findText,0, cs) >= 0) { found = true; break; } } else { if (cs == Qt::CaseInsensitive) { if (findText.toLower() == searchText.toLower()) { found = true; break; } } else { if ( findText == searchText ) { found = true; break; } } } } itemNum = 0; ++pass; ++scopeNum; if (scopeNum >= contextsInList()) { scopeNum = 0; //delayedMsg = tr("Search wrapped."); } } if (found) { *itemNo = itemNum; *contextNo = scopeNum; } return found; }
MessageItem *MessageModel::messageItem(int context, int message) const { ContextItem *c = contextItem(context); if (c && message >= 0 && message < c->messageItemsInList()) return c->messageItem(message); return 0; }
QVariant MessageModel::data(const QModelIndex &index, int role) const { int row = index.row(); int column = index.column(); ContextItem *cntxtItem = static_cast<ContextItem *>(index.internalPointer()); if (cntxtItem) { if (row >= cntxtItem->messageItemsInList() || !index.isValid()) return QVariant(); MessageItem *msgItem = cntxtItem->messageItem(row); if (role == Qt::DisplayRole) { switch(column) { case 0: // done return QVariant(); case 1: // source text return msgItem->sourceText().simplified(); case 2: // translation return msgItem->translation().simplified(); } } else if ((role == Qt::DecorationRole) && (column == 0)) { if (msgItem->message().type() == MetaTranslatorMessage::Unfinished && msgItem->translation().isEmpty()) return qVariantFromValue(*TrWindow::pxEmpty); else if (msgItem->message().type() == MetaTranslatorMessage::Unfinished && msgItem->danger()) return qVariantFromValue(*TrWindow::pxDanger); else if (msgItem->message().type() == MetaTranslatorMessage::Finished && msgItem->danger()) return qVariantFromValue(*TrWindow::pxWarning); else if (msgItem->message().type() == MetaTranslatorMessage::Finished) return qVariantFromValue(*TrWindow::pxOn); else if (msgItem->message().type() == MetaTranslatorMessage::Unfinished) return qVariantFromValue(*TrWindow::pxOff); else if (msgItem->message().type() == MetaTranslatorMessage::Obsolete) return qVariantFromValue(*TrWindow::pxObsolete); } } else { if (row >= cntxtList.count() || !index.isValid()) return QVariant(); ContextItem *cntxtItem = cntxtList.at(row); if (role == Qt::DisplayRole) { switch(column) { case 0: // done return QVariant(); case 1: // context return cntxtItem->context().simplified(); case 2: // items QString s; int itemCount = cntxtItem->messageItemsInList(); int obsoleteCount = cntxtItem->obsolete(); int finishedCount = cntxtItem->finishedCount(); s.sprintf("%d/%d", finishedCount, itemCount - obsoleteCount); return s; } } else if ((role == Qt::DecorationRole) && (column == 0)) { if (cntxtItem->isContextObsolete()) return qVariantFromValue(*TrWindow::pxObsolete); else if (cntxtItem->isFinished()) return qVariantFromValue(*TrWindow::pxOn); else return qVariantFromValue(*TrWindow::pxOff); } } return QVariant(); }