Switch to side-by-side view

--- a/src/qtgui/advsearch_w.cpp
+++ b/src/qtgui/advsearch_w.cpp
@@ -27,18 +27,12 @@
 #include <qtooltip.h>
 #include <qwhatsthis.h>
 #include <qmessagebox.h>
-
-#include <list>
+#include <QShortcut>
+
 #include <string>
 #include <map>
 #include <algorithm>
-
-#ifndef NO_NAMESPACES
-using std::list;
-using std::string;
-using std::map;
-using std::unique;
-#endif /* NO_NAMESPACES */
+using namespace std;
 
 #include "recoll.h"
 #include "rclconfig.h"
@@ -51,7 +45,6 @@
 static const unsigned int iclausescnt = sizeof(initclausetypes) / sizeof(int);
 static map<QString,QString> cat_translations;
 static map<QString,QString> cat_rtranslations;
-
 
 void AdvSearch::init()
 {
@@ -83,6 +76,9 @@
     connect(addClausePB, SIGNAL(clicked()), this, SLOT(addClause()));
     connect(delClausePB, SIGNAL(clicked()), this, SLOT(delClause()));
 
+    new QShortcut(QKeySequence(Qt::Key_Up), this, SLOT(slotHistoryNext()));;
+    new QShortcut(QKeySequence(Qt::Key_Down), this, SLOT(slotHistoryPrev()));
+
     conjunctCMB->insertItem(1, tr("All clauses"));
     conjunctCMB->insertItem(2, tr("Any clause"));
 
@@ -92,7 +88,7 @@
     }
     // Tune initial state according to last saved
     {
-	std::list<SearchClauseW *>::iterator cit = m_clauseWins.begin();
+	vector<SearchClauseW *>::iterator cit = m_clauseWins.begin();
 	for (vector<int>::iterator it = prefs.advSearchClauses.begin(); 
 	     it != prefs.advSearchClauses.end(); it++) {
 	    if (cit != m_clauseWins.end()) {
@@ -109,6 +105,8 @@
     int minyear, maxyear;
     if (rcldb) {
 	rcldb->maxYearSpan(&minyear, &maxyear);
+	minDateDTE->setDisplayFormat("dd.MM.yyyy");
+	maxDateDTE->setDisplayFormat("dd.MM.yyyy");
 	minDateDTE->setDate(QDate(minyear, 1, 1));
 	maxDateDTE->setDate(QDate(maxyear, 12, 31));
     }
@@ -158,7 +156,7 @@
 {
     // Save my state
     prefs.advSearchClauses.clear(); 
-    for (std::list<SearchClauseW *>::iterator cit = m_clauseWins.begin();
+    for (vector<SearchClauseW *>::iterator cit = m_clauseWins.begin();
 	 cit != m_clauseWins.end(); cit++) {
 	prefs.advSearchClauses.push_back((*cit)->sTpCMB->currentIndex());
     }
@@ -168,12 +166,6 @@
 {
     saveCnf();
     return QWidget::close();
-}
-
-void AdvSearch::delAFiltypPB_clicked()
-{
-    yesFiltypsLB->selectAll();
-    delFiltypPB_clicked();
 }
 
 void AdvSearch::addClause()
@@ -206,6 +198,12 @@
     } else {
 	delClausePB->setEnabled(false);
     }
+}
+
+void AdvSearch::delAFiltypPB_clicked()
+{
+    yesFiltypsLB->selectAll();
+    delFiltypPB_clicked();
 }
 
 // Move selected file types from the searched to the ignored box
@@ -327,6 +325,12 @@
     prefs.asearchIgnFilTyps = m_ignTypes;
     prefs.fileTypesByCats = m_ignByCats;
     rwSettings(true);
+}
+
+void AdvSearch::browsePB_clicked()
+{
+    QString dir = myGetFileName(true);
+    subtreeCMB->setEditText(dir);
 }
 
 size_t AdvSearch::stringToSize(QString qsize)
@@ -361,7 +365,7 @@
 					     SCLT_AND : SCLT_OR, stemLang));
     bool hasclause = false;
 
-    for (list<SearchClauseW*>::iterator it = m_clauseWins.begin();
+    for (vector<SearchClauseW*>::iterator it = m_clauseWins.begin();
 	 it != m_clauseWins.end(); it++) {
 	SearchDataClause *cl;
 	if ((cl = (*it)->getClause())) {
@@ -441,12 +445,121 @@
 	    prefs.asearchSubdirHist.push_back(subtreeCMB->itemText(index));
     }
     saveCnf();
+    g_advshistory && g_advshistory->push(sdata);
+    emit startSearch(sdata);
+}
+
+
+// Set up fields from existing search data, which must be compatible
+// with what we can do...
+void AdvSearch::fromSearch(RefCntr<SearchData> sdata)
+{
+    if (sdata->m_tp == SCLT_OR)
+	conjunctCMB->setCurrentIndex(1);
+    else
+	conjunctCMB->setCurrentIndex(0);
+
+    while (sdata->m_query.size() > m_clauseWins.size()) {
+	addClause();
+    }
+
+    for (unsigned int i = 0; i < sdata->m_query.size(); i++) {
+	// Set fields from clause
+	if (sdata->m_query[i]->getTp() == SCLT_SUB) {
+	    LOGERR(("AdvSearch::fromSearch: SUB clause found !\n"));
+	    continue;
+	}
+	SearchDataClauseSimple *cs = 
+	    dynamic_cast<SearchDataClauseSimple*>(sdata->m_query[i]);
+	m_clauseWins[i]->setFromClause(cs);
+    }
+    for (unsigned int i = sdata->m_query.size(); i < m_clauseWins.size(); i++) {
+	m_clauseWins[i]->clear();
+    }
+
+    restrictCtCB->setChecked(0);
+    if (!sdata->m_filetypes.empty()) {
+	restrictFtCB_toggled(1);
+	delAFiltypPB_clicked();
+	for (unsigned int i = 0; i < sdata->m_filetypes.size(); i++) {
+	    QString ft = QString::fromUtf8(sdata->m_filetypes[i].c_str());
+	    QList<QListWidgetItem *> lst = 
+		noFiltypsLB->findItems(ft, Qt::MatchExactly);
+	    if (!lst.isEmpty()) {
+		int row = noFiltypsLB->row(lst[0]);
+		QListWidgetItem *item = noFiltypsLB->takeItem(row);
+		yesFiltypsLB->insertItem(0, item);
+	    }
+	}
+	yesFiltypsLB->sortItems();
+    } else {
+	addAFiltypPB_clicked();
+	restrictFtCB_toggled(0);
+    }
+
+    if (sdata->m_haveDates) {
+	filterDatesCB->setChecked(1);
+	DateInterval &di(sdata->m_dates);
+	QDate mindate(di.y1, di.m1, di.d1);
+	QDate maxdate(di.y2, di.m2, di.d2);
+        minDateDTE->setDate(mindate);
+        maxDateDTE->setDate(maxdate);
+    } else {
+	filterDatesCB->setChecked(0);
+	QDate date;
+	minDateDTE->setDate(date);
+	maxDateDTE->setDate(date);
+    }
+
+    if (sdata->m_maxSize != (size_t)-1 || sdata->m_minSize != (size_t)-1) {
+	filterSizesCB->setChecked(1);
+	QString sz;
+	if (sdata->m_minSize != (size_t)-1) {
+	    sz.setNum(sdata->m_minSize);
+	    minSizeLE->setText(sz);
+	} else {
+	    minSizeLE->setText("");
+	}
+	if (sdata->m_maxSize != (size_t)-1) {
+	    sz.setNum(sdata->m_maxSize);
+	    maxSizeLE->setText(sz);
+	} else {
+	    maxSizeLE->setText("");
+	}
+    } else {
+	filterSizesCB->setChecked(0);
+	minSizeLE->setText("");
+	maxSizeLE->setText("");
+    }
     
-    emit startSearch(sdata);
-}
-
-void AdvSearch::browsePB_clicked()
-{
-    QString dir = myGetFileName(true);
-    subtreeCMB->setEditText(dir);
-}
+    if (!sdata->m_dirspecs.empty()) {
+	// Can only use one entry
+	QString qdir = QString::fromLocal8Bit(sdata->m_dirspecs[0].dir.c_str());
+	subtreeCMB->setEditText(qdir);
+	direxclCB->setChecked(sdata->m_dirspecs[0].exclude);
+    } else {
+	subtreeCMB->setEditText("");
+	direxclCB->setChecked(0);
+    }
+}
+
+void AdvSearch::slotHistoryNext()
+{
+    if (g_advshistory == 0)
+	return;
+    RefCntr<Rcl::SearchData> sd = g_advshistory->getnewer();
+    if (sd.isNull())
+	return;
+    fromSearch(sd);
+}
+
+void AdvSearch::slotHistoryPrev()
+{
+    if (g_advshistory == 0)
+	return;
+    RefCntr<Rcl::SearchData> sd = g_advshistory->getolder();
+    if (sd.isNull())
+	return;
+    fromSearch(sd);
+}
+