diff --git a/src/qtgui/rclmain.ui b/src/qtgui/rclmain.ui
index 664e5df5..9b89c68c 100644
--- a/src/qtgui/rclmain.ui
+++ b/src/qtgui/rclmain.ui
@@ -136,6 +136,7 @@
+
@@ -204,6 +205,14 @@
fileEraseDocHistoryAction
+
+
+ &Erase search history
+
+
+ fileEraseSearchHistoryAction
+
+
&Show missing helpers
diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp
index 2c2a91a6..a2002c18 100644
--- a/src/qtgui/rclmain_w.cpp
+++ b/src/qtgui/rclmain_w.cpp
@@ -91,7 +91,7 @@ void RclMain::init()
QT_TR_NOOP("spreadsheet"), QT_TR_NOOP("text"),
QT_TR_NOOP("sorted"), QT_TR_NOOP("filtered")
};
- DocSource::set_translations((const char *)tr("sorted").toUtf8(),
+ DocSequence::set_translations((const char *)tr("sorted").toUtf8(),
(const char *)tr("filtered").toUtf8());
curPreview = 0;
asearchform = 0;
@@ -225,6 +225,8 @@ void RclMain::init()
this, SLOT(toggleIndexing()));
connect(fileEraseDocHistoryAction, SIGNAL(activated()),
this, SLOT(eraseDocHistory()));
+ connect(fileEraseSearchHistoryAction, SIGNAL(activated()),
+ this, SLOT(eraseSearchHistory()));
connect(helpAbout_RecollAction, SIGNAL(activated()),
this, SLOT(showAboutDialog()));
connect(showMissingHelpers_Action, SIGNAL(activated()),
@@ -262,7 +264,7 @@ void RclMain::init()
connect(this, SIGNAL(sortDataChanged(DocSeqSortSpec)),
restable, SLOT(onSortDataChanged(DocSeqSortSpec)));
- connect(restable->getModel(), SIGNAL(sortDataChanged(DocSeqSortSpec)),
+ connect(restable->getModel(), SIGNAL(sortColumnChanged(DocSeqSortSpec)),
this, SLOT(onResTableSortBy(DocSeqSortSpec)));
connect(restable, SIGNAL(docEditClicked(Rcl::Doc)),
this, SLOT(startNativeViewer(Rcl::Doc)));
@@ -605,6 +607,9 @@ void RclMain::startSearch(RefCntr sdata)
src->setAbstractParams(prefs.queryBuildAbstract,
prefs.queryReplaceAbstract);
m_source = RefCntr(src);
+ m_source->setSortSpec(m_sortspec);
+ m_source->setFiltSpec(m_filtspec);
+
emit docSourceChanged(m_source);
emit sortDataChanged(m_sortspec);
emit filtDataChanged(m_filtspec);
@@ -881,6 +886,7 @@ void RclMain::onSortCtlChanged()
prefs.sortActive = prefs.sortDesc = false;
}
LOGDEB(("RclMain::onCtlDataChanged(): emitting change signals\n"));
+ m_source->setSortSpec(m_sortspec);
emit sortDataChanged(m_sortspec);
emit applyFiltSortData();
}
@@ -904,13 +910,8 @@ void RclMain::on_actionShowResultsAsTable_toggled(bool on)
{
LOGDEB(("RclMain::on_actionShowResultsAsTable_toggled(%d)\n", int(on)));
prefs.showResultsAsTable = on;
- if (on) {
- restable->show();
- reslist->hide();
- } else {
- restable->hide();
- reslist->show();
- }
+ restable->setVisible(on);
+ reslist->setVisible(!on);
}
void RclMain::on_actionSortByDateAsc_toggled(bool on)
@@ -1259,6 +1260,8 @@ void RclMain::showDocHistory()
string(tr("Document history").toUtf8()));
src->setDescription((const char *)tr("History data").toUtf8());
m_source = RefCntr(src);
+ m_source->setSortSpec(m_sortspec);
+ m_source->setFiltSpec(m_filtspec);
emit docSourceChanged(m_source);
emit sortDataChanged(m_sortspec);
emit filtDataChanged(m_filtspec);
@@ -1277,6 +1280,13 @@ void RclMain::eraseDocHistory()
}
}
+
+void RclMain::eraseSearchHistory()
+{
+ prefs.ssearchHistory.clear();
+ sSearch->queryText->clear();
+}
+
// Called when the uiprefs dialog is ok'd
void RclMain::setUIPrefs()
{
@@ -1338,6 +1348,7 @@ void RclMain::catgFilter(int id)
it != tps.end(); it++)
m_filtspec.orCrit(DocSeqFiltSpec::DSFS_MIMETYPE, *it);
}
+ m_source->setFiltSpec(m_filtspec);
emit filtDataChanged(m_filtspec);
emit applyFiltSortData();
}
diff --git a/src/qtgui/rclmain_w.h b/src/qtgui/rclmain_w.h
index e925d6bd..252aca5b 100644
--- a/src/qtgui/rclmain_w.h
+++ b/src/qtgui/rclmain_w.h
@@ -87,6 +87,7 @@ public slots:
virtual void previewExposed(Preview *, int sid, int docnum);
virtual void resetSearch();
virtual void eraseDocHistory();
+ virtual void eraseSearchHistory();
virtual void setStemLang(QAction *id);
virtual void adjustPrefsMenu();
virtual void catgFilter(int);
diff --git a/src/qtgui/reslist.cpp b/src/qtgui/reslist.cpp
index 9e2f7cbc..7c0581f0 100644
--- a/src/qtgui/reslist.cpp
+++ b/src/qtgui/reslist.cpp
@@ -268,16 +268,17 @@ extern "C" int XFlush(void *);
void ResList::setDocSource(RefCntr nsource)
{
+ LOGDEB(("ResList::setDocSource()\n"));
m_source = RefCntr(new DocSource(nsource));
}
// Reapply parameters. Sort params probably changed
void ResList::readDocSource()
{
- LOGDEB(("ResList::readDocSource\n"));
+ LOGDEB(("ResList::readDocSource()\n"));
+ resetView();
if (m_source.isNull())
return;
- resetList();
m_listId = newListId();
// Reset the page size in case the preference was changed
@@ -287,19 +288,24 @@ void ResList::readDocSource()
emit hasResults(m_source->getResCnt());
}
-void ResList::setSortParams(DocSeqSortSpec spec)
+void ResList::setSortParams(DocSeqSortSpec)
{
- LOGDEB(("ResList::setSortParams\n"));
- m_source->setSortSpec(spec);
+ LOGDEB2(("ResList::setSortParams\n"));
}
-void ResList::setFilterParams(const DocSeqFiltSpec& spec)
+void ResList::setFilterParams(const DocSeqFiltSpec&)
{
- LOGDEB(("ResList::setFilterParams\n"));
- m_source->setFiltSpec(spec);
+ LOGDEB2(("ResList::setFilterParams\n"));
}
void ResList::resetList()
+{
+ LOGDEB(("ResList::resetList()\n"));
+ setDocSource(RefCntr());
+ resetView();
+}
+
+void ResList::resetView()
{
m_curPvDoc = -1;
// There should be a progress bar for long searches but there isn't
diff --git a/src/qtgui/reslist.h b/src/qtgui/reslist.h
index 2f4d5be6..cbb2d67b 100644
--- a/src/qtgui/reslist.h
+++ b/src/qtgui/reslist.h
@@ -123,6 +123,7 @@ class ResList : public QTextBrowser
emit linkClicked(s, m_lstClckMod);
};
static int newListId();
+ void resetView();
};
diff --git a/src/qtgui/restable.cpp b/src/qtgui/restable.cpp
index 2d07a1e1..7c2e8889 100644
--- a/src/qtgui/restable.cpp
+++ b/src/qtgui/restable.cpp
@@ -252,8 +252,8 @@ QVariant RecollModel::headerData(int idx, Qt::Orientation orientation,
QVariant RecollModel::data(const QModelIndex& index, int role) const
{
- LOGDEB2(("RecollModel::data: row %d col %d\n", index.row(),
- index.column()));
+ LOGDEB1(("RecollModel::data: row %d col %d\n", index.row(),
+ index.column()));
if (m_source.isNull() || role != Qt::DisplayRole || !index.isValid() ||
index.column() >= int(m_fields.size())) {
return QVariant();
@@ -285,7 +285,7 @@ void RecollModel::sort(int column, Qt::SortOrder order)
spec.desc = order == Qt::AscendingOrder ? false : true;
m_source->setSortSpec(spec);
readDocSource();
- emit sortDataChanged(spec);
+ emit sortColumnChanged(spec);
}
}
@@ -444,6 +444,7 @@ void ResTable::onSortDataChanged(DocSeqSortSpec)
void ResTable::readDocSource(bool resetPos)
{
+ LOGDEB(("ResTable::readDocSource(%d)\n", int(resetPos)));
if (resetPos)
tableView->verticalScrollBar()->setSliderPosition(0);
diff --git a/src/qtgui/restable.h b/src/qtgui/restable.h
index 82b7cf2f..ccb1aed5 100644
--- a/src/qtgui/restable.h
+++ b/src/qtgui/restable.h
@@ -57,7 +57,7 @@ public:
virtual void addColumn(int, const string&);
signals:
- void sortDataChanged(DocSeqSortSpec);
+ void sortColumnChanged(DocSeqSortSpec);
private:
mutable RefCntr m_source;
diff --git a/src/qtgui/ssearch_w.cpp b/src/qtgui/ssearch_w.cpp
index 5fe8aaf5..1e12c7ea 100644
--- a/src/qtgui/ssearch_w.cpp
+++ b/src/qtgui/ssearch_w.cpp
@@ -45,6 +45,10 @@ void SSearch::init()
searchTypCMB->addItem(tr("File name"));
searchTypCMB->addItem(tr("Query language"));
+ // We'd like to use QComboBox::InsertAtTop but it doesn't do lru
+ // (existing item stays at its place instead of jumping at top)
+ queryText->setInsertPolicy(QComboBox::NoInsert);
+
queryText->addItems(prefs.ssearchHistory);
queryText->setEditText("");
connect(queryText->lineEdit(), SIGNAL(returnPressed()),
@@ -191,13 +195,11 @@ void SSearch::startSimpleSearch()
// So do it by hand.
QString txt = queryText->currentText();
int index = queryText->findText(txt);
- if (index > 0)
+ if (index >= 0)
queryText->removeItem(index);
- // The combobox is set for no insertion, insert here:
queryText->insertItem(0, txt);
queryText->setCurrentIndex(0);
-
// Save the current state of the listbox list to the prefs (will
// go to disk)
prefs.ssearchHistory.clear();
diff --git a/src/query/docseq.cpp b/src/query/docseq.cpp
index bc313820..d4155b73 100644
--- a/src/query/docseq.cpp
+++ b/src/query/docseq.cpp
@@ -22,6 +22,9 @@ static char rcsid[] = "@(#$Id: docseq.cpp,v 1.11 2008-09-29 08:59:20 dockes Exp
#include "sortseq.h"
#include "debuglog.h"
+string DocSequence::o_sort_trans;
+string DocSequence::o_filt_trans;
+
int DocSequence::getSeqSlice(int offs, int cnt, vector& result)
{
int ret = 0;
@@ -78,11 +81,10 @@ bool DocSource::buildStack()
return true;
}
-string DocSource::o_sort_trans;
-string DocSource::o_filt_trans;
-
string DocSource::title()
{
+ if (m_seq.isNull())
+ return "";
string qual;
if (m_fspec.isNotNull() && !m_sspec.isNotNull())
qual = string(" (") + o_filt_trans + string(")");
diff --git a/src/query/docseq.h b/src/query/docseq.h
index 7584221b..38aedd88 100644
--- a/src/query/docseq.h
+++ b/src/query/docseq.h
@@ -131,6 +131,14 @@ class DocSequence {
virtual bool setSortSpec(const DocSeqSortSpec &) {return false;}
virtual RefCntr getSourceSeq() {return RefCntr();}
+ static void set_translations(const string& sort, const string& filt)
+ {
+ o_sort_trans = sort;
+ o_filt_trans = filt;
+ }
+protected:
+ static string o_sort_trans;
+ static string o_filt_trans;
private:
string m_title;
};
@@ -147,20 +155,28 @@ public:
virtual string getAbstract(Rcl::Doc& doc)
{
+ if (m_seq.isNull())
+ return "";
return m_seq->getAbstract(doc);
}
virtual string getDescription()
{
+ if (m_seq.isNull())
+ return "";
return m_seq->getDescription();
}
virtual bool getTerms(vector& terms,
vector >& groups,
vector& gslks)
{
+ if (m_seq.isNull())
+ return false;
return m_seq->getTerms(terms, groups, gslks);
}
virtual void getUTerms(vector& terms)
{
+ if (m_seq.isNull())
+ return;
m_seq->getUTerms(terms);
}
virtual string title() {return m_seq->title();}
@@ -183,25 +199,22 @@ public:
virtual bool setSortSpec(const DocSeqSortSpec &);
virtual bool getDoc(int num, Rcl::Doc &doc, string *sh = 0)
{
+ if (m_seq.isNull())
+ return false;
return m_seq->getDoc(num, doc, sh);
}
virtual int getResCnt()
{
+ if (m_seq.isNull())
+ return 0;
return m_seq->getResCnt();
}
- static void set_translations(const string& sort, const string& filt)
- {
- o_sort_trans = sort;
- o_filt_trans = filt;
- }
virtual string title();
private:
bool buildStack();
void stripStack();
DocSeqFiltSpec m_fspec;
DocSeqSortSpec m_sspec;
- static string o_sort_trans;
- static string o_filt_trans;
};
#endif /* _DOCSEQ_H_INCLUDED_ */
diff --git a/src/query/docseqdb.cpp b/src/query/docseqdb.cpp
index 563fb310..3a3b80a1 100644
--- a/src/query/docseqdb.cpp
+++ b/src/query/docseqdb.cpp
@@ -30,7 +30,10 @@ DocSequenceDb::DocSequenceDb(RefCntr q, const string &t,
: DocSequence(t), m_q(q), m_sdata(sdata), m_fsdata(sdata),
m_rescnt(-1),
m_queryBuildAbstract(true),
- m_queryReplaceAbstract(false)
+ m_queryReplaceAbstract(false),
+ m_isFiltered(false),
+ m_isSorted(false),
+ m_needSetQuery(false)
{
}
@@ -57,12 +60,14 @@ string DocSequenceDb::getDescription()
bool DocSequenceDb::getDoc(int num, Rcl::Doc &doc, string *sh)
{
+ setQuery();
if (sh) sh->erase();
return m_q->getDoc(num, doc);
}
int DocSequenceDb::getResCnt()
{
+ setQuery();
if (m_rescnt < 0) {
m_rescnt= m_q->getResCnt();
}
@@ -71,6 +76,7 @@ int DocSequenceDb::getResCnt()
string DocSequenceDb::getAbstract(Rcl::Doc &doc)
{
+ setQuery();
if (!m_q->whatDb())
return doc.meta[Rcl::Doc::keyabs];
string abstract;
@@ -86,6 +92,7 @@ string DocSequenceDb::getAbstract(Rcl::Doc &doc)
bool DocSequenceDb::getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc)
{
+ setQuery();
string udi;
if (!FileInterner::getEnclosing(doc.url, doc.ipath, pdoc.url, pdoc.ipath,
udi))
@@ -95,9 +102,22 @@ bool DocSequenceDb::getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc)
list DocSequenceDb::expand(Rcl::Doc &doc)
{
+ setQuery();
return m_q->expand(doc);
}
+string DocSequenceDb::title()
+{
+ string qual;
+ if (m_isFiltered && !m_isSorted)
+ qual = string(" (") + o_filt_trans + string(")");
+ else if (!m_isFiltered && m_isSorted)
+ qual = string(" (") + o_sort_trans + string(")");
+ else if (m_isFiltered && m_isSorted)
+ qual = string(" (") + o_sort_trans + string(",") + o_filt_trans + string(")");
+ return DocSequence::title() + qual;
+}
+
bool DocSequenceDb::setFiltSpec(const DocSeqFiltSpec &fs)
{
LOGDEB(("DocSequenceDb::setFiltSpec\n"));
@@ -114,10 +134,13 @@ bool DocSequenceDb::setFiltSpec(const DocSeqFiltSpec &fs)
m_fsdata->addFiletype(fs.values[i]);
}
}
+ m_isFiltered = true;
} else {
m_fsdata = m_sdata;
+ m_isFiltered = false;
}
- return m_q->setQuery(m_fsdata);
+ m_needSetQuery = true;
+ return true;
}
bool DocSequenceDb::setSortSpec(const DocSeqSortSpec &spec)
@@ -126,13 +149,20 @@ bool DocSequenceDb::setSortSpec(const DocSeqSortSpec &spec)
spec.field.c_str(), spec.desc ? "desc" : "asc"));
if (spec.isNotNull()) {
m_q->setSortBy(spec.field, !spec.desc);
+ m_isSorted = true;
} else {
m_q->setSortBy(string(), true);
+ m_isSorted = false;
}
- return m_q->setQuery(m_fsdata);
+ m_needSetQuery = true;
+ return true;
}
bool DocSequenceDb::setQuery()
{
- return m_q->setQuery(m_fsdata);
+ if (!m_needSetQuery)
+ return true;
+ m_rescnt = -1;
+ m_needSetQuery = !m_q->setQuery(m_fsdata);
+ return !m_needSetQuery;
}
diff --git a/src/query/docseqdb.h b/src/query/docseqdb.h
index 0008a758..50faa712 100644
--- a/src/query/docseqdb.h
+++ b/src/query/docseqdb.h
@@ -23,8 +23,7 @@
#include "searchdata.h"
#include "rclquery.h"
-/** A DocSequence from a Db query (there should be one active for this
- to make sense) */
+/** A DocSequence from a Db query */
class DocSequenceDb : public DocSequence {
public:
DocSequenceDb(RefCntr q, const string &t,
@@ -44,12 +43,12 @@ class DocSequenceDb : public DocSequence {
virtual bool setFiltSpec(const DocSeqFiltSpec &filtspec);
virtual bool canSort() {return true;}
virtual bool setSortSpec(const DocSeqSortSpec &sortspec);
- virtual bool setQuery();
virtual void setAbstractParams(bool qba, bool qra)
{
m_queryBuildAbstract = qba;
m_queryReplaceAbstract = qra;
}
+ virtual string title();
private:
RefCntr m_q;
@@ -58,6 +57,10 @@ class DocSequenceDb : public DocSequence {
int m_rescnt;
bool m_queryBuildAbstract;
bool m_queryReplaceAbstract;
+ bool m_isFiltered;
+ bool m_isSorted;
+ bool m_needSetQuery; // search data changed, need to reapply before fetch
+ bool setQuery();
};
#endif /* _DOCSEQDB_H_INCLUDED_ */