• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdesdk API Reference
  • KDE Home
  • Contact Us
 

lokalize

  • sources
  • kde-4.12
  • kdesdk
  • lokalize
  • src
  • tm
tmtab.cpp
Go to the documentation of this file.
1 /* ****************************************************************************
2  This file is part of Lokalize
3 
4  Copyright (C) 2007-2011 by Nick Shaforostoff <shafff@ukr.net>
5 
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public License as
8  published by the Free Software Foundation; either version 2 of
9  the License or (at your option) version 3 or any later version
10  accepted by the membership of KDE e.V. (or its successor approved
11  by the membership of KDE e.V.), which shall act as a proxy
12  defined in Section 14 of version 3 of the license.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see <http://www.gnu.org/licenses/>.
21 
22 **************************************************************************** */
23 
24 #include "tmtab.h"
25 #include "ui_queryoptions.h"
26 #include "project.h"
27 #include "dbfilesmodel.h"
28 #include "tmscanapi.h"
29 #include "qaview.h"
30 
31 #include <QApplication>
32 #include <QDesktopWidget>
33 #include <QTreeView>
34 #include <QSqlQueryModel>
35 #include <QSqlQuery>
36 #include <QSqlRecord>
37 #include <QButtonGroup>
38 #include <QClipboard>
39 #include <QShortcut>
40 #include <QDragEnterEvent>
41 #include <QSortFilterProxyModel>
42 #include <QStyledItemDelegate>
43 #include <QStringBuilder>
44 #include <QTextDocument>
45 
46 #include <KColorScheme>
47 #include <kactioncategory.h>
48 #include <kaction.h>
49 #include <klocale.h>
50 #include <kstandarddirs.h>
51 #include <kxmlguifactory.h>
52 #include <threadweaver/ThreadWeaver.h>
53 #include <fastsizehintitemdelegate.h>
54 #include <QStringListModel>
55 
56 
57 using namespace TM;
58 //static int BIG_COUNTER=0;
59 
60 //TODO do things for case when user explicitly wants to find & accel mark
61 
62 //BEGIN TMDBModel
63 TMDBModel::TMDBModel(QObject* parent)
64  : QSqlQueryModel(parent)
65  , m_queryType(WordOrder)
66  , m_totalResultCount(0)
67 {
68  setHeaderData(TMDBModel::Source, Qt::Horizontal, i18nc("@title:column Original text","Source"));
69  setHeaderData(TMDBModel::Target, Qt::Horizontal, i18nc("@title:column Text in target language","Target"));
70  setHeaderData(TMDBModel::Context, Qt::Horizontal, i18nc("@title:column","Context"));
71  setHeaderData(TMDBModel::Filepath, Qt::Horizontal, i18nc("@title:column","File"));
72  setHeaderData(TMDBModel::TransationStatus, Qt::Horizontal, i18nc("@title:column","Translation Status"));
73 }
74 
75 void TMDBModel::setDB(const QString& str)
76 {
77  m_dbName=str;
78 }
79 
80 void TMDBModel::setQueryType(int type)
81 {
82  m_queryType=(QueryType)type;
83 }
84 
85 void TMDBModel::setFilter(const QString& source, const QString& target,
86  bool invertSource, bool invertTarget,
87  const QString& filemask
88  )
89 {
90  QString escapedSource(source);escapedSource.replace('\'',"''");
91  QString escapedTarget(target);escapedTarget.replace('\'',"''");
92  QString invertSourceStr; if (invertSource) invertSourceStr="NOT ";
93  QString invertTargetStr; if (invertTarget) invertTargetStr="NOT ";
94  QString escapedFilemask(filemask);escapedFilemask.replace('\'',"''");
95  QString sourceQuery;
96  QString targetQuery;
97  QString fileQuery;
98 
99  if (m_queryType==SubStr)
100  {
101  escapedSource.replace('%',"\b%");escapedSource.replace('_',"\b_");
102  escapedTarget.replace('%',"\b%");escapedTarget.replace('_',"\b_");
103  if (!escapedSource.isEmpty())
104  sourceQuery="AND source_strings.source "%invertSourceStr%"LIKE '%"+escapedSource+"%' ESCAPE '\b' ";
105  if (!escapedTarget.isEmpty())
106  targetQuery="AND target_strings.target "%invertTargetStr%"LIKE '%"+escapedTarget+"%' ESCAPE '\b' ";
107  }
108  else if (m_queryType==WordOrder)
109  {
110  /*escapedSource.replace('%',"\b%");escapedSource.replace('_',"\b_");
111  escapedTarget.replace('%',"\b%");escapedTarget.replace('_',"\b_");*/
112  QStringList sourceList=escapedSource.split(QRegExp("\\W"),QString::SkipEmptyParts);
113  QStringList targetList=escapedTarget.split(QRegExp("\\W"),QString::SkipEmptyParts);
114 
115  if (!sourceList.isEmpty())
116  sourceQuery="AND source_strings.source "+invertSourceStr+"LIKE '%"+sourceList.join("%' AND source_strings.source "+invertSourceStr+"LIKE '%")+"%' ";
117  if (!targetList.isEmpty())
118  targetQuery="AND target_strings.target "+invertTargetStr+"LIKE '%"+targetList.join("%' AND target_strings.target "+invertTargetStr+"LIKE '%")+"%' ";
119  }
120  else
121  {
122  if (!escapedSource.isEmpty())
123  sourceQuery="AND source_strings.source "%invertSourceStr%"GLOB '"%escapedSource%"' ";
124  if (!escapedTarget.isEmpty())
125  targetQuery="AND target_strings.target "%invertTargetStr%"GLOB '"%escapedTarget%"' ";
126 
127  }
128  if (!filemask.isEmpty())
129  fileQuery="AND files.path GLOB '"%escapedFilemask%"' ";
130 
131  QString fromPart="FROM main JOIN source_strings ON (source_strings.id=main.source) "
132  "JOIN target_strings ON (target_strings.id=main.target), files "
133  "WHERE files.id=main.file "
134  +sourceQuery
135  +targetQuery
136  +fileQuery;
137 
138  ExecQueryJob* job=new ExecQueryJob(
139  "SELECT source_strings.source, target_strings.target, "
140  "main.ctxt, files.path, "
141  "source_strings.source_accel, target_strings.target_accel, main.bits "
142  +fromPart,m_dbName);
143 
144  connect(job,SIGNAL(done(ThreadWeaver::Job*)),job,SLOT(deleteLater()));
145  connect(job,SIGNAL(done(ThreadWeaver::Job*)),this,SLOT(slotQueryExecuted(ThreadWeaver::Job*)));
146  ThreadWeaver::Weaver::instance()->enqueue(job);
147 
148 
149  job=new ExecQueryJob("SELECT count(*) "+fromPart,m_dbName);
150  connect(job,SIGNAL(done(ThreadWeaver::Job*)),job,SLOT(deleteLater()));
151  connect(job,SIGNAL(done(ThreadWeaver::Job*)),this,SLOT(slotQueryExecuted(ThreadWeaver::Job*)));
152  ThreadWeaver::Weaver::instance()->enqueue(job);
153 
154  m_totalResultCount=0;
155 }
156 
157 void TMDBModel::slotQueryExecuted(ThreadWeaver::Job* j)
158 {
159  ExecQueryJob* job=static_cast<ExecQueryJob*>(j);
160  if (job->query->lastQuery().startsWith("SELECT count(*) "))
161  {
162  job->query->next();
163  m_totalResultCount=job->query->value(0).toInt();
164  emit finalResultCountFetched(m_totalResultCount);
165  return;
166  }
167  setQuery(*(job->query));
168  emit resultsFetched();
169 }
170 
171 bool TMDBModel::rowIsApproved(int row) const
172 {
173  bool ok;
174  qlonglong bits=record(row).value(TMDBModel::_Bits).toLongLong(&ok);
175  return !(ok && bits&4);
176 }
177 
178 int TMDBModel::translationStatus(const QModelIndex& item) const
179 {
180  if (QSqlQueryModel::data(item.sibling(item.row(),Target), Qt::DisplayRole).toString().isEmpty())
181  return 2;
182  return int(!rowIsApproved(item.row()));
183 }
184 
185 #define TM_DELIMITER '\v'
186 QVariant TMDBModel::data(const QModelIndex& item, int role) const
187 {
188  bool doHtml=(role==FastSizeHintItemDelegate::HtmlDisplayRole);
189  if (doHtml)
190  role=Qt::DisplayRole;
191  else if (role==Qt::FontRole && item.column()==TMDBModel::Target) //TODO Qt::ForegroundRole -- brush for orphaned entries
192  {
193  QFont font=QApplication::font();
194  font.setItalic(!rowIsApproved(item.row()));
195  return font;
196  }
197  else if (role==FullPathRole && item.column()==TMDBModel::Filepath)
198  return QSqlQueryModel::data(item, Qt::DisplayRole);
199  else if (role==TransStateRole)
200  return translationStatus(item);
201 
202  QVariant result=QSqlQueryModel::data(item, role);
203 /* if (role==Qt::SizeHintRole && !result.isValid())
204  BIG_COUNTER++;*/
205  if (role!=Qt::DisplayRole)
206  return result;
207 
208  if (item.column()==TMDBModel::Context)//context
209  {
210  QString r=result.toString();
211  int pos=r.indexOf(TM_DELIMITER);
212  if (pos!=-1)
213  result=r.remove(pos, r.size());
214  }
215  else if (item.column()<TMDBModel::Context && !record(item.row()).isNull(TMDBModel::_SourceAccel+item.column()) )//source, target
216  {
217  const QVariant& posVar=record(item.row()).value(TMDBModel::_SourceAccel+item.column());
218  int pos=-1;
219  bool ok;
220  if (posVar.isValid())
221  pos=posVar.toInt(&ok);
222  if (ok && pos!=-1)
223  {
224  QString r=result.toString();
225  r.insert(pos,Project::instance()->accel());
226  result=r;
227  }
228  }
229  else if (item.column()==TMDBModel::Filepath)
230  {
231  return shorterFilePath(result.toString());
232  }
233  else if (item.column()==TMDBModel::TransationStatus)
234  {
235  static QString statuses[]={i18nc("@info:status 'non-fuzzy' in gettext terminology","Ready"),
236  i18nc("@info:status 'fuzzy' in gettext terminology","Needs review"),
237  i18nc("@info:status","Untranslated")};
238  return statuses[translationStatus(item)];
239  }
240  if (doHtml && item.column()<TMDBModel::Context)
241  return convertToHtml(result.toString(), item.column()==TMDBModel::Target && !rowIsApproved(item.row()));
242  else
243  return result;
244 }
245 
246 //END TMDBModel
247 
248 //BEGIN TMResultsSortFilterProxyModel
249 class TMResultsSortFilterProxyModel: public QSortFilterProxyModel
250 {
251 public:
252  TMResultsSortFilterProxyModel(QObject *parent)
253  : QSortFilterProxyModel(parent)
254  {}
255  void setRules(const QVector<Rule>& rules);
256  void fetchMore(const QModelIndex& parent);
257  QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
258 
259 protected:
260  bool lessThan(const QModelIndex& left, const QModelIndex& right) const;
261  bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
262 
263 private:
264  QVector<Rule> m_rules;
265  mutable QMap<int,int> m_matchingRulesForSourceRow;
266  //mutable QMap<int, QVector<StartLen> > m_highlightDataForSourceRow;
267 };
268 
269 bool TMResultsSortFilterProxyModel::lessThan(const QModelIndex& left, const QModelIndex& right) const
270 {
271  if (left.column()==TMDBModel::TransationStatus)
272  {
273  int l=left.data(TMDBModel::TransStateRole).toInt();
274  int r=right.data(TMDBModel::TransStateRole).toInt();
275  return l<r;
276  }
277  return QSortFilterProxyModel::lessThan(left, right);
278 }
279 
280 void TMResultsSortFilterProxyModel::fetchMore(const QModelIndex& parent)
281 {
282  int oldSourceRowCount=sourceModel()->rowCount();
283  int oldRowCount=rowCount();
284  QSortFilterProxyModel::fetchMore(parent);
285 
286  if (m_rules.isEmpty())
287  return;
288 
289  while (oldRowCount==rowCount())
290  {
291  QSortFilterProxyModel::fetchMore(parent);
292  if (sourceModel()->rowCount()==oldSourceRowCount)
293  break;
294  oldSourceRowCount=sourceModel()->rowCount();
295  }
296  qDebug()<<"row count"<<sourceModel()->rowCount()<<" filtered:"<<rowCount();
297  emit layoutChanged();
298 }
299 
300 void TMResultsSortFilterProxyModel::setRules(const QVector<Rule>& rules)
301 {
302  m_rules=rules;
303  m_matchingRulesForSourceRow.clear();
304  invalidateFilter();
305 }
306 
307 QVariant TMResultsSortFilterProxyModel::data(const QModelIndex& index, int role) const
308 {
309  QVariant result=QSortFilterProxyModel::data(index, role);
310 
311  if (m_rules.isEmpty() || role!=FastSizeHintItemDelegate::HtmlDisplayRole)
312  return result;
313 
314  if (index.column()!=TMDBModel::Source && index.column()!=TMDBModel::Target)
315  return result;
316 
317  int source_row=mapToSource(index).row();
318  QString string=result.toString();
319 
320  QVector<QRegExp> regExps;
321  if (index.column()==TMDBModel::Source)
322  regExps=m_rules[m_matchingRulesForSourceRow[source_row]].sources;
323  else
324  regExps=m_rules[m_matchingRulesForSourceRow[source_row]].falseFriends;
325 
326  foreach(const QRegExp& re, regExps)
327  {
328  int pos=re.indexIn(string);
329  if (pos!=-1)
330  return string.replace(pos, re.matchedLength(), "<b>" % re.cap(0) % "</b>");
331  }
332 
333  //StartLen sl=m_highlightDataForSourceRow.value(source_row).at(index.column());
334 
335  return result;
336 }
337 
338 bool TMResultsSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
339 {
340  if (m_rules.isEmpty())
341  return true;
342 
343  QString source=sourceModel()->index(source_row, TMDBModel::Source, source_parent).data().toString();
344  QString target=sourceModel()->index(source_row, TMDBModel::Target, source_parent).data().toString();
345 
346  static QVector<StartLen> dummy_positions;
347  int i=findMatchingRule(m_rules, source, target, dummy_positions);
348  bool accept=(i!=-1);
349  if (accept)
350  m_matchingRulesForSourceRow[source_row]=i;
351 
352  return accept;
353 }
354 //END TMResultsSortFilterProxyModel
355 
356 class QueryStylesModel: public QStringListModel
357 {
358 public:
359  explicit QueryStylesModel(QObject* parent = 0);
360  QVariant data(const QModelIndex& item, int role) const;
361 };
362 
363 QueryStylesModel::QueryStylesModel(QObject* parent): QStringListModel(parent)
364 {
365  setStringList(QStringList(i18n("Substring"))<<i18n("Google-like")<<i18n("Wildcard"));
366 }
367 
368 QVariant QueryStylesModel::data(const QModelIndex& item, int role) const
369 {
370  if (role==Qt::ToolTipRole)
371  {
372  static QString tooltips[]={i18n("Case insensitive"),
373  i18n("Space is AND operator. Case insensitive."),
374  i18n("Shell globs (* and ?). Case sensitive.")};
375  return tooltips[item.row()];
376  }
377  return QStringListModel::data(item, role);
378 }
379 
380 
381 //BEGIN TMWindow
382 TMTab::TMTab(QWidget *parent)
383  : LokalizeSubwindowBase2(parent)
384  , m_proxyModel(new TMResultsSortFilterProxyModel(this))
385  , m_partToAlsoTryLater(DocPosition::UndefPart)
386  , m_dbusId(-1)
387 {
388  //setCaption(i18nc("@title:window","Translation Memory"),false);
389  setWindowTitle(i18nc("@title:window","Translation Memory"));
390  setAcceptDrops(true);
391 
392  ui_queryOptions=new Ui_QueryOptions;
393  QWidget* w=new QWidget(this);
394  ui_queryOptions->setupUi(w);
395  setCentralWidget(w);
396  ui_queryOptions->queryLayout->setStretchFactor(ui_queryOptions->mainQueryLayout,42);
397 
398  connect(ui_queryOptions->querySource,SIGNAL(returnPressed()),this,SLOT(performQuery()));
399  connect(ui_queryOptions->queryTarget,SIGNAL(returnPressed()),this,SLOT(performQuery()));
400  connect(ui_queryOptions->filemask,SIGNAL(returnPressed()), this,SLOT(performQuery()));
401  connect(ui_queryOptions->doFind,SIGNAL(clicked()), this,SLOT(performQuery()));
402  connect(ui_queryOptions->doUpdateTM,SIGNAL(clicked()), this,SLOT(updateTM()));
403 
404  QShortcut* sh=new QShortcut(Qt::CTRL+Qt::Key_L, this);
405  connect(sh,SIGNAL(activated()),ui_queryOptions->querySource,SLOT(setFocus()));
406  setFocusProxy(ui_queryOptions->querySource);
407 
408  QTreeView* view=ui_queryOptions->treeView;
409  view->setContextMenuPolicy(Qt::ActionsContextMenu);
410 
411  QAction* a=new QAction(i18n("Copy source to clipboard"),view);
412  a->setShortcut(Qt::CTRL + Qt::Key_S);
413  a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
414  connect(a,SIGNAL(activated()), this, SLOT(copySource()));
415  view->addAction(a);
416 
417  a=new QAction(i18n("Copy target to clipboard"),view);
418  a->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Return));
419  a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
420  connect(a,SIGNAL(activated()), this, SLOT(copyTarget()));
421  view->addAction(a);
422 
423  a=new QAction(i18n("Open file"),view);
424  a->setShortcut(QKeySequence(Qt::Key_Return));
425  a->setShortcutContext(Qt::WidgetWithChildrenShortcut);
426  connect(a,SIGNAL(activated()), this, SLOT(openFile()));
427  connect(view,SIGNAL(activated(QModelIndex)), this, SLOT(openFile()));
428  view->addAction(a);
429 
430  //view->addAction(KStandardAction::copy(this),this,SLOT(),this);
431  //QKeySequence::Copy?
432  //QShortcut* shortcut = new QShortcut(Qt::CTRL + Qt::Key_P,view,0,0,Qt::WidgetWithChildrenShortcut);
433  //connect(shortcut,SIGNAL(activated()), this, SLOT(copyText()));
434 
435  m_model = new TMDBModel(this);
436  m_model->setDB(Project::instance()->projectID());
437 
438  m_proxyModel->setDynamicSortFilter(true);
439  m_proxyModel->setSourceModel(m_model);
440  view->setModel(m_proxyModel);
441  view->sortByColumn(TMDBModel::Filepath,Qt::AscendingOrder);
442  view->setSortingEnabled(true);
443  view->setColumnHidden(TMDBModel::_SourceAccel,true);
444  view->setColumnHidden(TMDBModel::_TargetAccel,true);
445  view->setColumnHidden(TMDBModel::_Bits,true);
446 
447  QVector<bool> singleLineColumns(TMDBModel::ColumnCount, false);
448  singleLineColumns[TMDBModel::Filepath]=true;
449  singleLineColumns[TMDBModel::TransationStatus]=true;
450  singleLineColumns[TMDBModel::Context]=true;
451 
452  QVector<bool> richTextColumns(TMDBModel::ColumnCount, false);
453  richTextColumns[TMDBModel::Source]=true;
454  richTextColumns[TMDBModel::Target]=true;
455  view->setItemDelegate(new FastSizeHintItemDelegate(this,singleLineColumns,richTextColumns));
456  connect(m_model,SIGNAL(resultsFetched()),view->itemDelegate(),SLOT(reset()));
457  connect(m_model,SIGNAL(modelReset()),view->itemDelegate(),SLOT(reset()));
458  //connect(m_model,SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),view->itemDelegate(),SLOT(reset()));
459  connect(m_proxyModel,SIGNAL(layoutChanged()),view->itemDelegate(),SLOT(reset()));
460  connect(m_proxyModel,SIGNAL(layoutChanged()),this,SLOT(displayTotalResultCount()));
461 
462 
463  connect(m_model,SIGNAL(resultsFetched()),this,SLOT(handleResults()));
464  connect(m_model,SIGNAL(finalResultCountFetched(int)),this,SLOT(displayTotalResultCount()));
465 
466  ui_queryOptions->queryStyle->setModel(new QueryStylesModel(this));
467  connect(ui_queryOptions->queryStyle,SIGNAL(currentIndexChanged(int)),m_model,SLOT(setQueryType(int)));
468 
469  ui_queryOptions->dbName->setModel(DBFilesModel::instance());
470  ui_queryOptions->dbName->setRootModelIndex(DBFilesModel::instance()->rootIndex());
471  QPersistentModelIndex* pi=DBFilesModel::instance()->projectDBIndex();
472  if (pi)
473  {
474  ui_queryOptions->dbName->setCurrentIndex(pi->row());
475  ui_queryOptions->dbName->view()->setCurrentIndex(*pi);
476  }
477  connect(ui_queryOptions->dbName, SIGNAL(activated(QString)), m_model, SLOT(setDB(QString)));
478  //connect(ui_queryOptions->dbName, SIGNAL(activated(QString)), this, SLOT(performQuery()));
479 
480 //BEGIN resizeColumnToContents
481  static const int maxInitialWidths[4]={QApplication::desktop()->availableGeometry().width()/3,QApplication::desktop()->availableGeometry().width()/3, 50, 200};
482  int column=sizeof(maxInitialWidths)/sizeof(int);
483  while (--column>=0)
484  view->setColumnWidth(column, maxInitialWidths[column]);
485 
486 //END resizeColumnToContents
487 
488  int i=6;
489  while (--i>ID_STATUS_PROGRESS)
490  statusBarItems.insert(i,QString());
491 
492  setXMLFile("translationmemoryrui.rc",true);
493  dbusObjectPath();
494 
495 
496  KAction *action;
497  KActionCollection* ac=actionCollection();
498  KActionCategory* tm=new KActionCategory(i18nc("@title actions category","Translation Memory"), ac);
499 
500  action = tm->addAction("tools_tm_manage",Project::instance(),SLOT(showTMManager()));
501  action->setText(i18nc("@action:inmenu","Manage translation memories"));
502 
503  m_qaView = new QaView(this);
504  m_qaView->hide();
505  addDockWidget(Qt::RightDockWidgetArea, m_qaView);
506  tm->addAction( QLatin1String("showqa_action"), m_qaView->toggleViewAction() );
507 
508  connect(m_qaView, SIGNAL(rulesChanged()), this, SLOT(setQAMode()));
509  connect(m_qaView->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setQAMode(bool)));
510 
511 
512  KConfig config;
513  KConfigGroup cg(&config,"MainWindow");
514  view->header()->restoreState(QByteArray::fromBase64( cg.readEntry("TMSearchResultsHeaderState", QByteArray()) ));
515 }
516 
517 TMTab::~TMTab()
518 {
519  KConfig config;
520  KConfigGroup cg(&config,"MainWindow");
521  cg.writeEntry("TMSearchResultsHeaderState",ui_queryOptions->treeView->header()->saveState().toBase64());
522 
523  delete ui_queryOptions;
524  ids.removeAll(m_dbusId);
525 }
526 
527 void TMTab::updateTM()
528 {
529  QList<QUrl> urls;
530  urls.append(Project::instance()->poDir());
531  scanRecursive(urls,Project::instance()->projectID());
532 }
533 
534 void TMTab::performQuery()
535 {
536  m_model->setFilter(ui_queryOptions->querySource->text(), ui_queryOptions->queryTarget->text(),
537  ui_queryOptions->invertSource->isChecked(), ui_queryOptions->invertTarget->isChecked(),
538  ui_queryOptions->filemask->text()
539  );
540  QApplication::setOverrideCursor(Qt::BusyCursor);
541 }
542 
543 void TMTab::handleResults()
544 {
545  QApplication::restoreOverrideCursor();
546  QString filemask=ui_queryOptions->filemask->text();
547  //ui_queryOptions->regexSource->text(),ui_queryOptions->regexTarget->text()
548  int rowCount=m_model->rowCount();
549  if (rowCount==0)
550  {
551  kDebug()<<"m_model->rowCount()==0";
552  //try harder
553  if(m_partToAlsoTryLater!=DocPosition::UndefPart)
554  {
555  if (m_partToAlsoTryLater==DocPosition::Comment)
556  {
557  QString text=ui_queryOptions->queryTarget->text();
558  if (text.isEmpty())
559  text=ui_queryOptions->querySource->text();
560  if (text.isEmpty())
561  m_partToAlsoTryLater=DocPosition::UndefPart;
562  else
563  findGuiText(text);
564  return;
565  }
566  KLineEdit* const source_target_query[]={ui_queryOptions->queryTarget,ui_queryOptions->querySource};
567  source_target_query[m_partToAlsoTryLater==DocPosition::Source]->setText(source_target_query[m_partToAlsoTryLater!=DocPosition::Source]->text());
568  source_target_query[m_partToAlsoTryLater!=DocPosition::Source]->clear();
569  m_partToAlsoTryLater=ui_queryOptions->filemask->text().isEmpty()?
570  DocPosition::UndefPart:
571  DocPosition::Comment; //leave a note that we should also try w/o package if the current one doesn't succeed
572  return performQuery();
573  }
574  if(!filemask.isEmpty() && !filemask.contains('*'))
575  {
576  ui_queryOptions->filemask->setText('*'+filemask+'*');
577  return performQuery();
578  }
579  }
580  kDebug()<<"=DocPosition::UndefPart";
581  m_partToAlsoTryLater=DocPosition::UndefPart;
582 
583  ui_queryOptions->treeView->setFocus();
584 }
585 
586 void TMTab::displayTotalResultCount()
587 {
588  int total=m_model->totalResultCount();
589  int filtered=m_proxyModel->rowCount();
590  if (filtered==m_model->rowCount())
591  statusBarItems.insert(1,i18nc("@info:status message entries","Total: %1",total));
592  else
593  statusBarItems.insert(1,i18nc("@info:status message entries","Total: %1 (%2)",filtered,total));
594 }
595 
596 static void copy(Ui_QueryOptions* ui_queryOptions, int column)
597 {
598  QApplication::clipboard()->setText( ui_queryOptions->treeView->currentIndex().sibling(ui_queryOptions->treeView->currentIndex().row(),column).data().toString());
599 }
600 
601 void TMTab::copySource()
602 {
603  copy(ui_queryOptions, TMDBModel::Source);
604 }
605 
606 void TMTab::copyTarget()
607 {
608  copy(ui_queryOptions, TMDBModel::Target);
609 }
610 
611 void TMTab::openFile()
612 {
613  QModelIndex item=ui_queryOptions->treeView->currentIndex();
614  emit fileOpenRequested(item.sibling(item.row(),TMDBModel::Filepath).data(Qt::UserRole).toString(),
615  item.sibling(item.row(),TMDBModel::Source).data().toString(),
616  item.sibling(item.row(),TMDBModel::Context).data().toString());
617 }
618 
619 
620 
621 void TMTab::setQAMode(bool enable)
622 {
623  static_cast<FastSizeHintItemDelegate*>(ui_queryOptions->treeView->itemDelegate())->reset();
624 
625  if (!enable)
626  {
627  m_proxyModel->setRules(QVector<Rule>());
628  return;
629  }
630 
631  m_proxyModel->setRules(m_qaView->rules());
632 
633  /*QDomElement docElem = m_categories.at(0).toElement();
634 
635  QDomNode n = docElem.firstChildElement();
636  while(!n.isNull())
637  {
638  QDomElement e = n.toElement();
639  qDebug() << e.tagName();
640  n = n.nextSiblingElement();
641  }*/
642 
643  performQuery();
644 }
645 
646 
647 //END TMWindow
648 
649 
650 
651 #if 0
652 bool QueryResultDelegate::editorEvent(QEvent* event,
653  QAbstractItemModel* model,
654  const QStyleOptionViewItem& /*option*/,
655  const QModelIndex& index)
656 {
657  kWarning()<<"QEvent"<<event;
658  if (event->type()==QEvent::Shortcut)
659  {
660  kWarning()<<"QEvent::Shortcut"<<index.data().canConvert(QVariant::String);
661  if (static_cast<QShortcutEvent*>(event)->key().matches(QKeySequence::Copy)
662  && index.data().canConvert(QVariant::String))
663  {
664  QApplication::clipboard()->setText(index.data().toString());
665  kWarning()<<"index.data().toString()";
666  }
667  }
668  else if (event->type()==QEvent::MouseButtonRelease)
669  {
670  QMouseEvent* mEvent=static_cast<QMouseEvent*>(event);
671  if (mEvent->button()==Qt::MidButton)
672  {
673  }
674  }
675  else if (event->type()==QEvent::KeyPress)
676  {
677  QKeyEvent* kEvent=static_cast<QKeyEvent*>(event);
678  if (kEvent->key()==Qt::Key_Return)
679  {
680  if (kEvent->modifiers()==Qt::NoModifier)
681  {
682  }
683  }
684  }
685  else
686  return false;
687 
688  event->accept();
689  return true;
690 
691 }
692 
693 #endif
694 
695 
696 
697 
698 void TMTab::dragEnterEvent(QDragEnterEvent* event)
699 {
700  if(dragIsAcceptable(event->mimeData()->urls()))
701  event->acceptProposedAction();
702 }
703 
704 void TMTab::dropEvent(QDropEvent *event)
705 {
706  if (scanRecursive(event->mimeData()->urls(),Project::instance()->projectID()))
707  event->acceptProposedAction();
708 }
709 
710 #include "translationmemoryadaptor.h"
711 
712 //BEGIN DBus interface
713 QList<int> TMTab::ids;
714 
715 QString TMTab::dbusObjectPath()
716 {
717  if ( m_dbusId==-1 )
718  {
719  new TranslationMemoryAdaptor(this);
720 
721  int i=0;
722  while(i<ids.size()&&i==ids.at(i))
723  ++i;
724  ids.insert(i,i);
725  m_dbusId=i;
726  QDBusConnection::sessionBus().registerObject("/ThisIsWhatYouWant/TranslationMemory/" + QString::number(m_dbusId), this);
727  }
728 
729  return "/ThisIsWhatYouWant/TranslationMemory/" + QString::number(m_dbusId);
730 }
731 
732 
733 void TMTab::lookup(QString source, QString target)
734 {
735  source.remove(Project::instance()->accel());
736  target.remove(Project::instance()->accel());
737  ui_queryOptions->querySource->setText(source);
738  ui_queryOptions->queryTarget->setText(target);
739  ui_queryOptions->invertSource->setChecked(false);
740  ui_queryOptions->invertTarget->setChecked(false);
741  ui_queryOptions->queryStyle->setCurrentIndex(TMDBModel::SubStr);
742  performQuery();
743 }
744 
745 // void TMTab::lookup(DocPosition::Part part, QString text)
746 // {
747 // lookup(part==DocPosition::Source?text:QString(),part==DocPosition::Target?text:QString());
748 // }
749 
750 bool TMTab::findGuiTextPackage(QString text, QString package)
751 {
752  //std::cout<<package.toLatin1().constData()<<text.toLatin1().constData()<<std::endl;
753  kWarning()<<package<<text;
754  KLineEdit* const source_target_query[]={ui_queryOptions->queryTarget,ui_queryOptions->querySource};
755  static const DocPosition::Part source_target[]={DocPosition::Target,DocPosition::Source};
756  QTextCodec* latin1=QTextCodec::codecForMib(4);
757  DocPosition::Part tryNowPart=source_target[latin1->canEncode(text)];
758  m_partToAlsoTryLater=source_target[tryNowPart==DocPosition::Target];
759 
760  text.remove(Project::instance()->accel());
761  ui_queryOptions->querySource->clear();
762  ui_queryOptions->queryTarget->clear();
763  source_target_query[tryNowPart==DocPosition::Source]->setText(text);
764  ui_queryOptions->invertSource->setChecked(false);
765  ui_queryOptions->invertTarget->setChecked(false);
766  if (!package.isEmpty()) package='*'+package+'*';
767  ui_queryOptions->filemask->setText(package);
768  ui_queryOptions->queryStyle->setCurrentIndex(TMDBModel::Glob);
769  performQuery();
770 
771  return true;
772 }
773 
774 //END DBus interface
775 
776 #include "tmtab.moc"
TM::TMDBModel::TransationStatus
Definition: tmtab.h:124
TM::TMTab::updateTM
void updateTM()
Definition: tmtab.cpp:527
QaView::rules
QVector< Rule > rules() const
Definition: qaview.cpp:81
TM::scanRecursive
int scanRecursive(const QList< QUrl > &urls, const QString &dbName)
wrapper. returns gross number of jobs started
Definition: tmscanapi.cpp:92
project.h
dragIsAcceptable
bool dragIsAcceptable(const QList< QUrl > &urls)
Definition: tmscanapi.cpp:151
TM::TMTab::TMTab
TMTab(QWidget *parent)
Definition: tmtab.cpp:382
ExecQueryJob::query
QSqlQuery * query
Definition: jobs.h:366
TM::TMDBModel::_SourceAccel
Definition: tmtab.h:121
TM::TMDBModel::TMDBModel
TMDBModel(QObject *parent)
Definition: tmtab.cpp:63
StatusBarProxy::insert
void insert(int, const QString &)
Definition: actionproxy.cpp:97
DocPosition::Target
Definition: pos.h:44
ExecQueryJob
Definition: jobs.h:356
DocPosition::Part
Part
Definition: pos.h:40
TM::TMDBModel::TransStateRole
Definition: tmtab.h:138
TM::TMDBModel::totalResultCount
int totalResultCount() const
Definition: tmtab.h:147
tmtab.h
Project::instance
static Project * instance()
Definition: project.cpp:67
QWidget
TM::TMTab::openFile
void openFile()
Definition: tmtab.cpp:611
TM::TMDBModel::data
QVariant data(const QModelIndex &item, int role=Qt::DisplayRole) const
Definition: tmtab.cpp:186
dbfilesmodel.h
fastsizehintitemdelegate.h
QStringListModel
TM::TMDBModel::finalResultCountFetched
void finalResultCountFetched(int)
QObject
TM::TMDBModel::resultsFetched
void resultsFetched()
TM::TMTab::setQAMode
void setQAMode(bool enabled=true)
Definition: tmtab.cpp:621
DocPosition
This struct represents a position in a catalog.
Definition: pos.h:38
copy
static void copy(Ui_QueryOptions *ui_queryOptions, int column)
Definition: tmtab.cpp:596
TM::TMDBModel::WordOrder
Definition: tmtab.h:131
QSqlQueryModel
TM::TMDBModel::setQueryType
void setQueryType(int)
Definition: tmtab.cpp:80
QTreeView
TM::TMDBModel::setDB
void setDB(const QString &)
Definition: tmtab.cpp:75
TM::TMDBModel::Glob
Definition: tmtab.h:132
TM::TMDBModel::_Bits
Definition: tmtab.h:123
TM::TMDBModel::slotQueryExecuted
void slotQueryExecuted(ThreadWeaver::Job *)
Definition: tmtab.cpp:157
TM::TMDBModel::QueryType
QueryType
Definition: tmtab.h:128
TM_DELIMITER
#define TM_DELIMITER
Definition: tmtab.cpp:185
TM::TMTab::fileOpenRequested
void fileOpenRequested(const KUrl &url, const QString &source, const QString &ctxt)
TM::TMTab::dbusObjectPath
QString dbusObjectPath()
Definition: tmtab.cpp:715
TM::DBFilesModel::projectDBIndex
QPersistentModelIndex * projectDBIndex() const
Definition: dbfilesmodel.h:73
TM::TMDBModel::Target
Definition: tmtab.h:118
TM::TMDBModel
Definition: tmtab.h:110
FastSizeHintItemDelegate
remember to connect appropriate signals to reset slot for delegate to have actual cache ...
Definition: fastsizehintitemdelegate.h:42
QAbstractItemModel
TM::TMTab::handleResults
void handleResults()
Definition: tmtab.cpp:543
TM::TMDBModel::_TargetAccel
Definition: tmtab.h:122
TM::TMDBModel::Source
Definition: tmtab.h:117
TM::TMDBModel::Context
Definition: tmtab.h:119
QSortFilterProxyModel
findMatchingRule
int findMatchingRule(const QVector< Rule > &rules, const QString &source, const QString &target, QVector< StartLen > &positions)
Definition: qaview.cpp:100
TM::TMDBModel::Filepath
Definition: tmtab.h:120
TM::TMTab::copyTarget
void copyTarget()
Definition: tmtab.cpp:606
LokalizeSubwindowBase::statusBarItems
StatusBarProxy statusBarItems
Definition: lokalizesubwindowbase.h:63
TM::TMTab::lookup
Q_SCRIPTABLE void lookup(QString source, QString target)
Definition: tmtab.cpp:733
ProjectBase::projectID
QString projectID() const
Get ProjectID.
Definition: projectbase.h:31
TM::TMTab::findGuiText
Q_SCRIPTABLE bool findGuiText(QString text)
Definition: tmtab.h:74
TM::TMTab::~TMTab
~TMTab()
Definition: tmtab.cpp:517
convertToHtml
QString convertToHtml(QString str, bool italics)
Definition: fastsizehintitemdelegate.cpp:119
TM::TMTab::copySource
void copySource()
Definition: tmtab.cpp:601
DocPosition::Source
Definition: pos.h:43
TM::TMDBModel::setFilter
void setFilter(const QString &source, const QString &target, bool invertSource, bool invertTarget, const QString &filemask)
Definition: tmtab.cpp:85
tmscanapi.h
qaview.h
QaView
Definition: qaview.h:36
ID_STATUS_PROGRESS
#define ID_STATUS_PROGRESS
Definition: actionproxy.h:92
TM::TMDBModel::SubStr
Definition: tmtab.h:130
TM::TMDBModel::FullPathRole
Definition: tmtab.h:137
TM::TMTab::displayTotalResultCount
void displayTotalResultCount()
Definition: tmtab.cpp:586
TM::TMDBModel::ColumnCount
Definition: tmtab.h:125
shorterFilePath
QString shorterFilePath(const QString path)
Definition: tmscanapi.cpp:169
FastSizeHintItemDelegate::HtmlDisplayRole
Definition: fastsizehintitemdelegate.h:49
LokalizeSubwindowBase2
C++ casting workaround.
Definition: lokalizesubwindowbase.h:70
DocPosition::UndefPart
Definition: pos.h:42
TM::TMTab::findGuiTextPackage
Q_SCRIPTABLE bool findGuiTextPackage(QString text, QString package)
Definition: tmtab.cpp:750
TM::TMTab::performQuery
void performQuery()
Definition: tmtab.cpp:534
TM::DBFilesModel::instance
static DBFilesModel * instance()
Definition: dbfilesmodel.cpp:46
DocPosition::Comment
Definition: pos.h:45
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:03:45 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

lokalize

Skip menu "lokalize"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • okteta
  • umbrello
  •   umbrello

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal