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

lokalize

  • sources
  • kde-4.14
  • 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  int pos=ui_queryOptions->dbName->findText(Project::instance()->projectID());
472  if (pos>=0)
473  ui_queryOptions->dbName->setCurrentIndex(pos);
474  connect(ui_queryOptions->dbName, SIGNAL(activated(QString)), m_model, SLOT(setDB(QString)));
475  //connect(ui_queryOptions->dbName, SIGNAL(activated(QString)), this, SLOT(performQuery()));
476 
477 //BEGIN resizeColumnToContents
478  static const int maxInitialWidths[4]={QApplication::desktop()->availableGeometry().width()/3,QApplication::desktop()->availableGeometry().width()/3, 50, 200};
479  int column=sizeof(maxInitialWidths)/sizeof(int);
480  while (--column>=0)
481  view->setColumnWidth(column, maxInitialWidths[column]);
482 
483 //END resizeColumnToContents
484 
485  int i=6;
486  while (--i>ID_STATUS_PROGRESS)
487  statusBarItems.insert(i,QString());
488 
489  setXMLFile("translationmemoryrui.rc",true);
490  dbusObjectPath();
491 
492 
493  KAction *action;
494  KActionCollection* ac=actionCollection();
495  KActionCategory* tm=new KActionCategory(i18nc("@title actions category","Translation Memory"), ac);
496 
497  action = tm->addAction("tools_tm_manage",Project::instance(),SLOT(showTMManager()));
498  action->setText(i18nc("@action:inmenu","Manage translation memories"));
499 
500  m_qaView = new QaView(this);
501  m_qaView->hide();
502  addDockWidget(Qt::RightDockWidgetArea, m_qaView);
503  tm->addAction( QLatin1String("showqa_action"), m_qaView->toggleViewAction() );
504 
505  connect(m_qaView, SIGNAL(rulesChanged()), this, SLOT(setQAMode()));
506  connect(m_qaView->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(setQAMode(bool)));
507 
508 
509  KConfig config;
510  KConfigGroup cg(&config,"MainWindow");
511  view->header()->restoreState(QByteArray::fromBase64( cg.readEntry("TMSearchResultsHeaderState", QByteArray()) ));
512 }
513 
514 TMTab::~TMTab()
515 {
516  KConfig config;
517  KConfigGroup cg(&config,"MainWindow");
518  cg.writeEntry("TMSearchResultsHeaderState",ui_queryOptions->treeView->header()->saveState().toBase64());
519 
520  delete ui_queryOptions;
521  ids.removeAll(m_dbusId);
522 }
523 
524 void TMTab::updateTM()
525 {
526  QList<QUrl> urls;
527  urls.append(Project::instance()->poDir());
528  scanRecursive(urls,Project::instance()->projectID());
529 }
530 
531 void TMTab::performQuery()
532 {
533  m_model->setFilter(ui_queryOptions->querySource->text(), ui_queryOptions->queryTarget->text(),
534  ui_queryOptions->invertSource->isChecked(), ui_queryOptions->invertTarget->isChecked(),
535  ui_queryOptions->filemask->text()
536  );
537  QApplication::setOverrideCursor(Qt::BusyCursor);
538 }
539 
540 void TMTab::handleResults()
541 {
542  QApplication::restoreOverrideCursor();
543  QString filemask=ui_queryOptions->filemask->text();
544  //ui_queryOptions->regexSource->text(),ui_queryOptions->regexTarget->text()
545  int rowCount=m_model->rowCount();
546  if (rowCount==0)
547  {
548  kDebug()<<"m_model->rowCount()==0";
549  //try harder
550  if(m_partToAlsoTryLater!=DocPosition::UndefPart)
551  {
552  if (m_partToAlsoTryLater==DocPosition::Comment)
553  {
554  QString text=ui_queryOptions->queryTarget->text();
555  if (text.isEmpty())
556  text=ui_queryOptions->querySource->text();
557  if (text.isEmpty())
558  m_partToAlsoTryLater=DocPosition::UndefPart;
559  else
560  findGuiText(text);
561  return;
562  }
563  KLineEdit* const source_target_query[]={ui_queryOptions->queryTarget,ui_queryOptions->querySource};
564  source_target_query[m_partToAlsoTryLater==DocPosition::Source]->setText(source_target_query[m_partToAlsoTryLater!=DocPosition::Source]->text());
565  source_target_query[m_partToAlsoTryLater!=DocPosition::Source]->clear();
566  m_partToAlsoTryLater=ui_queryOptions->filemask->text().isEmpty()?
567  DocPosition::UndefPart:
568  DocPosition::Comment; //leave a note that we should also try w/o package if the current one doesn't succeed
569  return performQuery();
570  }
571  if(!filemask.isEmpty() && !filemask.contains('*'))
572  {
573  ui_queryOptions->filemask->setText('*'+filemask+'*');
574  return performQuery();
575  }
576  }
577  kDebug()<<"=DocPosition::UndefPart";
578  m_partToAlsoTryLater=DocPosition::UndefPart;
579 
580  ui_queryOptions->treeView->setFocus();
581 }
582 
583 void TMTab::displayTotalResultCount()
584 {
585  int total=m_model->totalResultCount();
586  int filtered=m_proxyModel->rowCount();
587  if (filtered==m_model->rowCount())
588  statusBarItems.insert(1,i18nc("@info:status message entries","Total: %1",total));
589  else
590  statusBarItems.insert(1,i18nc("@info:status message entries","Total: %1 (%2)",filtered,total));
591 }
592 
593 static void copy(Ui_QueryOptions* ui_queryOptions, int column)
594 {
595  QApplication::clipboard()->setText( ui_queryOptions->treeView->currentIndex().sibling(ui_queryOptions->treeView->currentIndex().row(),column).data().toString());
596 }
597 
598 void TMTab::copySource()
599 {
600  copy(ui_queryOptions, TMDBModel::Source);
601 }
602 
603 void TMTab::copyTarget()
604 {
605  copy(ui_queryOptions, TMDBModel::Target);
606 }
607 
608 void TMTab::openFile()
609 {
610  QModelIndex item=ui_queryOptions->treeView->currentIndex();
611  emit fileOpenRequested(item.sibling(item.row(),TMDBModel::Filepath).data(Qt::UserRole).toString(),
612  item.sibling(item.row(),TMDBModel::Source).data().toString(),
613  item.sibling(item.row(),TMDBModel::Context).data().toString());
614 }
615 
616 
617 
618 void TMTab::setQAMode(bool enable)
619 {
620  static_cast<FastSizeHintItemDelegate*>(ui_queryOptions->treeView->itemDelegate())->reset();
621 
622  if (!enable)
623  {
624  m_proxyModel->setRules(QVector<Rule>());
625  return;
626  }
627 
628  m_proxyModel->setRules(m_qaView->rules());
629 
630  /*QDomElement docElem = m_categories.at(0).toElement();
631 
632  QDomNode n = docElem.firstChildElement();
633  while(!n.isNull())
634  {
635  QDomElement e = n.toElement();
636  qDebug() << e.tagName();
637  n = n.nextSiblingElement();
638  }*/
639 
640  performQuery();
641 }
642 
643 
644 //END TMWindow
645 
646 
647 
648 #if 0
649 bool QueryResultDelegate::editorEvent(QEvent* event,
650  QAbstractItemModel* model,
651  const QStyleOptionViewItem& /*option*/,
652  const QModelIndex& index)
653 {
654  kWarning()<<"QEvent"<<event;
655  if (event->type()==QEvent::Shortcut)
656  {
657  kWarning()<<"QEvent::Shortcut"<<index.data().canConvert(QVariant::String);
658  if (static_cast<QShortcutEvent*>(event)->key().matches(QKeySequence::Copy)
659  && index.data().canConvert(QVariant::String))
660  {
661  QApplication::clipboard()->setText(index.data().toString());
662  kWarning()<<"index.data().toString()";
663  }
664  }
665  else if (event->type()==QEvent::MouseButtonRelease)
666  {
667  QMouseEvent* mEvent=static_cast<QMouseEvent*>(event);
668  if (mEvent->button()==Qt::MidButton)
669  {
670  }
671  }
672  else if (event->type()==QEvent::KeyPress)
673  {
674  QKeyEvent* kEvent=static_cast<QKeyEvent*>(event);
675  if (kEvent->key()==Qt::Key_Return)
676  {
677  if (kEvent->modifiers()==Qt::NoModifier)
678  {
679  }
680  }
681  }
682  else
683  return false;
684 
685  event->accept();
686  return true;
687 
688 }
689 
690 #endif
691 
692 
693 
694 
695 void TMTab::dragEnterEvent(QDragEnterEvent* event)
696 {
697  if(dragIsAcceptable(event->mimeData()->urls()))
698  event->acceptProposedAction();
699 }
700 
701 void TMTab::dropEvent(QDropEvent *event)
702 {
703  if (scanRecursive(event->mimeData()->urls(),Project::instance()->projectID()))
704  event->acceptProposedAction();
705 }
706 
707 #include "translationmemoryadaptor.h"
708 
709 //BEGIN DBus interface
710 QList<int> TMTab::ids;
711 
712 QString TMTab::dbusObjectPath()
713 {
714  if ( m_dbusId==-1 )
715  {
716  new TranslationMemoryAdaptor(this);
717 
718  int i=0;
719  while(i<ids.size()&&i==ids.at(i))
720  ++i;
721  ids.insert(i,i);
722  m_dbusId=i;
723  QDBusConnection::sessionBus().registerObject("/ThisIsWhatYouWant/TranslationMemory/" + QString::number(m_dbusId), this);
724  }
725 
726  return "/ThisIsWhatYouWant/TranslationMemory/" + QString::number(m_dbusId);
727 }
728 
729 
730 void TMTab::lookup(QString source, QString target)
731 {
732  source.remove(Project::instance()->accel());
733  target.remove(Project::instance()->accel());
734  ui_queryOptions->querySource->setText(source);
735  ui_queryOptions->queryTarget->setText(target);
736  ui_queryOptions->invertSource->setChecked(false);
737  ui_queryOptions->invertTarget->setChecked(false);
738  ui_queryOptions->queryStyle->setCurrentIndex(TMDBModel::SubStr);
739  performQuery();
740 }
741 
742 // void TMTab::lookup(DocPosition::Part part, QString text)
743 // {
744 // lookup(part==DocPosition::Source?text:QString(),part==DocPosition::Target?text:QString());
745 // }
746 
747 bool TMTab::findGuiTextPackage(QString text, QString package)
748 {
749  //std::cout<<package.toLatin1().constData()<<text.toLatin1().constData()<<std::endl;
750  kWarning()<<package<<text;
751  KLineEdit* const source_target_query[]={ui_queryOptions->queryTarget,ui_queryOptions->querySource};
752  static const DocPosition::Part source_target[]={DocPosition::Target,DocPosition::Source};
753  QTextCodec* latin1=QTextCodec::codecForMib(4);
754  DocPosition::Part tryNowPart=source_target[latin1->canEncode(text)];
755  m_partToAlsoTryLater=source_target[tryNowPart==DocPosition::Target];
756 
757  text.remove(Project::instance()->accel());
758  ui_queryOptions->querySource->clear();
759  ui_queryOptions->queryTarget->clear();
760  source_target_query[tryNowPart==DocPosition::Source]->setText(text);
761  ui_queryOptions->invertSource->setChecked(false);
762  ui_queryOptions->invertTarget->setChecked(false);
763  if (!package.isEmpty()) package='*'+package+'*';
764  ui_queryOptions->filemask->setText(package);
765  ui_queryOptions->queryStyle->setCurrentIndex(TMDBModel::Glob);
766  performQuery();
767 
768  return true;
769 }
770 
771 //END DBus interface
772 
773 #include "tmtab.moc"
TM::TMDBModel::TransationStatus
Definition: tmtab.h:124
QVariant::canConvert
bool canConvert(Type t) const
QVariant::toLongLong
qlonglong toLongLong(bool *ok) const
QSortFilterProxyModel::lessThan
virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const
TM::TMTab::updateTM
void updateTM()
Definition: tmtab.cpp:524
QaView::rules
QVector< Rule > rules() const
Definition: qaview.cpp:81
QModelIndex
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
QEvent
TM::scanRecursive
int scanRecursive(const QList< QUrl > &urls, const QString &dbName)
wrapper. returns gross number of jobs started
Definition: tmscanapi.cpp:92
project.h
QWidget
QKeyEvent::modifiers
Qt::KeyboardModifiers modifiers() const
QRegExp::cap
QString cap(int nth) const
QAction::setShortcutContext
void setShortcutContext(Qt::ShortcutContext context)
QEvent::type
Type type() const
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
QDropEvent::mimeData
const QMimeData * mimeData() const
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
QByteArray
DocPosition::Target
Definition: pos.h:44
ExecQueryJob
Definition: jobs.h:356
QWidget::addAction
void addAction(QAction *action)
DocPosition::Part
Part
Definition: pos.h:40
QSqlRecord::value
QVariant value(int index) const
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
TM::TMDBModel::TransStateRole
Definition: tmtab.h:138
TM::TMDBModel::totalResultCount
int totalResultCount() const
Definition: tmtab.h:147
QSqlQueryModel::record
QSqlRecord record() const
QHeaderView::restoreState
bool restoreState(const QByteArray &state)
QFont
tmtab.h
QList::at
const T & at(int i) const
QMap< int, int >
Project::instance
static Project * instance()
Definition: project.cpp:67
QString::size
int size() const
QDBusConnection::registerObject
bool registerObject(const QString &path, QObject *object, QFlags< QDBusConnection::RegisterOption > options)
TM::TMTab::openFile
void openFile()
Definition: tmtab.cpp:608
QDBusConnection::sessionBus
QDBusConnection sessionBus()
TM::TMDBModel::data
QVariant data(const QModelIndex &item, int role=Qt::DisplayRole) const
Definition: tmtab.cpp:186
QMouseEvent
QStringList::join
QString join(const QString &separator) const
QTreeView::sortByColumn
void sortByColumn(int column, Qt::SortOrder order)
QString::remove
QString & remove(int position, int n)
dbfilesmodel.h
fastsizehintitemdelegate.h
TM::TMDBModel::finalResultCountFetched
void finalResultCountFetched(int)
QList::size
int size() const
TM::TMDBModel::resultsFetched
void resultsFetched()
TM::TMTab::setQAMode
void setQAMode(bool enabled=true)
Definition: tmtab.cpp:618
QRegExp::matchedLength
int matchedLength() const
DocPosition
This struct represents a position in a catalog.
Definition: pos.h:38
QRegExp::indexIn
int indexIn(const QString &str, int offset, CaretMode caretMode) const
copy
static void copy(Ui_QueryOptions *ui_queryOptions, int column)
Definition: tmtab.cpp:593
QRegExp
QVector::clear
void clear()
TM::TMDBModel::WordOrder
Definition: tmtab.h:131
QTreeView::setColumnWidth
void setColumnWidth(int column, int width)
QApplication::font
QFont font()
QString::number
QString number(int n, int base)
QSqlQueryModel::setHeaderData
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role)
QList::append
void append(const T &value)
QString::insert
QString & insert(int position, QChar ch)
QStringListModel::data
virtual QVariant data(const QModelIndex &index, int role) const
QVariant::toInt
int toInt(bool *ok) const
QApplication::clipboard
QClipboard * clipboard()
QSqlQueryModel
QSqlQuery::value
QVariant value(int index) const
QSqlQuery::lastQuery
QString lastQuery() const
QStyleOptionViewItem
TM::TMDBModel::setQueryType
void setQueryType(int)
Definition: tmtab.cpp:80
QObject
TM::TMDBModel::setDB
void setDB(const QString &)
Definition: tmtab.cpp:75
QMouseEvent::button
Qt::MouseButton button() const
TM::TMDBModel::Glob
Definition: tmtab.h:132
QDropEvent
QList::isEmpty
bool isEmpty() const
QString::isEmpty
bool isEmpty() const
QList::removeAll
int removeAll(const T &value)
QAbstractItemView::setItemDelegate
void setItemDelegate(QAbstractItemDelegate *delegate)
QModelIndex::row
int row() const
TM::TMDBModel::_Bits
Definition: tmtab.h:123
QString::startsWith
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
QSqlQuery::next
bool next()
QApplication::setOverrideCursor
void setOverrideCursor(const QCursor &cursor)
QAbstractItemView::itemDelegate
QAbstractItemDelegate * itemDelegate() const
TM::TMDBModel::slotQueryExecuted
void slotQueryExecuted(ThreadWeaver::Job *)
Definition: tmtab.cpp:157
TM::TMDBModel::QueryType
QueryType
Definition: tmtab.h:128
QApplication::restoreOverrideCursor
void restoreOverrideCursor()
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:712
QObject::deleteLater
void deleteLater()
QShortcut
QString
QList
QWidget::hide
void hide()
TM::TMDBModel::Target
Definition: tmtab.h:118
TM::TMDBModel
Definition: tmtab.h:110
QTextCodec
FastSizeHintItemDelegate
remember to connect appropriate signals to reset slot for delegate to have actual cache ...
Definition: fastsizehintitemdelegate.h:42
QStringListModel
QStringList
TM::TMTab::handleResults
void handleResults()
Definition: tmtab.cpp:540
TM::TMDBModel::_TargetAccel
Definition: tmtab.h:122
TM::TMDBModel::Source
Definition: tmtab.h:117
TM::TMDBModel::Context
Definition: tmtab.h:119
QKeyEvent::key
int key() const
QTreeView::setColumnHidden
void setColumnHidden(int column, bool hide)
QEvent::accept
void accept()
QString::contains
bool contains(QChar ch, Qt::CaseSensitivity cs) const
QSqlQueryModel::data
virtual QVariant data(const QModelIndex &item, int role) const
QSortFilterProxyModel
QWidget::setContextMenuPolicy
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
QAction::setShortcut
void setShortcut(const QKeySequence &shortcut)
QFont::setItalic
void setItalic(bool enable)
findMatchingRule
int findMatchingRule(const QVector< Rule > &rules, const QString &source, const QString &target, QVector< StartLen > &positions)
Definition: qaview.cpp:100
QString::replace
QString & replace(int position, int n, QChar after)
QKeyEvent
TM::TMDBModel::Filepath
Definition: tmtab.h:120
QTreeView::setSortingEnabled
void setSortingEnabled(bool enable)
QRect::width
int width() const
QDockWidget::toggleViewAction
QAction * toggleViewAction() const
TM::TMTab::copyTarget
void copyTarget()
Definition: tmtab.cpp:603
QVector< Rule >
QDragEnterEvent
LokalizeSubwindowBase::statusBarItems
StatusBarProxy statusBarItems
Definition: lokalizesubwindowbase.h:63
QModelIndex::data
QVariant data(int role) const
TM::TMTab::lookup
Q_SCRIPTABLE void lookup(QString source, QString target)
Definition: tmtab.cpp:730
QLatin1String
ProjectBase::projectID
QString projectID() const
Get ProjectID.
Definition: projectbase.h:31
QTreeView
QKeySequence
QApplication::desktop
QDesktopWidget * desktop()
QMimeData::urls
QList< QUrl > urls() const
TM::TMTab::findGuiText
Q_SCRIPTABLE bool findGuiText(QString text)
Definition: tmtab.h:74
QByteArray::fromBase64
QByteArray fromBase64(const QByteArray &base64)
QSortFilterProxyModel::fetchMore
virtual void fetchMore(const QModelIndex &parent)
QList::insert
void insert(int i, const T &value)
TM::TMTab::~TMTab
~TMTab()
Definition: tmtab.cpp:514
convertToHtml
QString convertToHtml(QString str, bool italics)
Definition: fastsizehintitemdelegate.cpp:119
QModelIndex::sibling
QModelIndex sibling(int row, int column) const
TM::TMTab::copySource
void copySource()
Definition: tmtab.cpp:598
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
QTreeView::setModel
virtual void setModel(QAbstractItemModel *model)
qaview.h
QAction
QaView
Definition: qaview.h:36
QTextCodec::codecForMib
QTextCodec * codecForMib(int mib)
QModelIndex::column
int column() const
QTextCodec::canEncode
bool canEncode(QChar ch) const
QAbstractItemModel
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
QVariant::isValid
bool isValid() const
TM::TMTab::displayTotalResultCount
void displayTotalResultCount()
Definition: tmtab.cpp:583
QDesktopWidget::availableGeometry
const QRect availableGeometry(int screen) const
TM::TMDBModel::ColumnCount
Definition: tmtab.h:125
QClipboard::setText
void setText(const QString &text, Mode mode)
QTreeView::header
QHeaderView * header() const
shorterFilePath
QString shorterFilePath(const QString path)
Definition: tmscanapi.cpp:169
FastSizeHintItemDelegate::HtmlDisplayRole
Definition: fastsizehintitemdelegate.h:49
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QSqlQueryModel::rowCount
virtual int rowCount(const QModelIndex &parent) const
LokalizeSubwindowBase2
C++ casting workaround.
Definition: lokalizesubwindowbase.h:70
DocPosition::UndefPart
Definition: pos.h:42
QString::data
QChar * data()
QVariant::toString
QString toString() const
TM::TMTab::findGuiTextPackage
Q_SCRIPTABLE bool findGuiTextPackage(QString text, QString package)
Definition: tmtab.cpp:747
TM::TMTab::performQuery
void performQuery()
Definition: tmtab.cpp:531
QSqlQueryModel::setQuery
void setQuery(const QSqlQuery &query)
QSortFilterProxyModel::data
virtual QVariant data(const QModelIndex &index, int role) const
TM::DBFilesModel::instance
static DBFilesModel * instance()
Definition: dbfilesmodel.cpp:46
DocPosition::Comment
Definition: pos.h:45
QVariant
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:40:07 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
  • 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