--- a/src/qtgui/recollmain.ui.h
+++ b/src/qtgui/recollmain.ui.h
@@ -14,6 +14,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
+#include <sys/stat.h>
#include <utility>
using std::pair;
@@ -22,6 +23,8 @@
#include <qcstring.h>
#include <qtabwidget.h>
#include <qtimer.h>
+#include <qstatusbar.h>
+#include <qwindowdefs.h>
#include "rcldb.h"
#include "rclconfig.h"
@@ -35,6 +38,7 @@
#include "unacpp.h"
#include "advsearch.h"
+extern "C" int XFlush(void *);
#ifndef MIN
#define MIN(A,B) ((A) < (B) ? (A) : (B))
@@ -263,13 +267,21 @@
}
ncmd += " &";
- LOGDEB(("Executing: '%s'\n", ncmd.c_str()));
+ QStatusBar *stb = statusBar();
+ if (stb) {
+ string msg = string("Executing: [") + ncmd.c_str() + "]";
+ stb->message(msg.c_str(), 5000);
+ stb->repaint(false);
+ XFlush(qt_xdisplay());
+ }
system(ncmd.c_str());
}
// Display preview for the selected document, and highlight entry. The
// paragraph number is doc number in window + 1
+// We don't actually do anything but start a timer because we want to
+// check first if this might be a double click
void RecollMain::reslistTE_clicked(int par, int car)
{
if (reslistTE_waitingdbl)
@@ -285,13 +297,12 @@
reslistTE_waitingdbl = true;
reslistTE_dblclck = false;
// Wait to see if there's going to be a dblclck
- QTimer::singleShot(100, this, SLOT(reslistTE_delayedclick()) );
-
-}
-
-
-// User asked to start query. Run it and call listNextPB_clicked to display
-// first page of results
+ QTimer::singleShot(150, this, SLOT(reslistTE_delayedclick()) );
+}
+
+
+// User asked to start query. Send it to the db aand call
+// listNextPB_clicked to fetch and display the first page of results
void RecollMain::queryText_returnPressed()
{
LOGDEB(("RecollMain::queryText_returnPressed()\n"));
@@ -338,14 +349,16 @@
// Fill up result list window with next screen of hits
void RecollMain::listNextPB_clicked()
{
- fprintf(stderr, "listNextPB_clicked\n");
if (!rcldb)
return;
+
int percent;
Rcl::Doc doc;
+
+ // Need to fetch one document before we can get the result count
rcldb->getDoc(0, doc, &percent);
int resCnt = rcldb->getResCnt();
- fprintf(stderr, "listNextPB_clicked rescnt\n");
+
LOGDEB(("listNextPB_clicked: rescnt %d, winfirst %d\n", resCnt,
reslist_winfirst));
@@ -375,7 +388,8 @@
if (i == 0) {
reslistTE->append("<qt><head></head><body><p>");
char line[80];
- sprintf(line, "<p><b>Displaying results starting at index %d (maximum set size %d)</b><br>",
+ sprintf(line, "<p><b>Displaying results starting at index"
+ " %d (maximum set size %d)</b><br>",
reslist_winfirst+1, resCnt);
reslistTE->append(line);
}
@@ -458,7 +472,8 @@
}
}
-// Execute and advanced search query
+// Execute an advanced search query. The parameters normally come from
+// the advanced search dialog
void RecollMain::startAdvSearch(Rcl::AdvSearchData sdata)
{
LOGDEB(("RecollMain::startAdvSearch\n"));
@@ -495,7 +510,6 @@
int par = reslistTE_par;
- Rcl::Doc doc;
if (reslist_current != -1) {
QColor color("white");
reslistTE->setParagraphBackgroundColor(reslist_current+1, color);
@@ -508,16 +522,44 @@
return;
reslist_current = reldocnum;
-
- if (!rcldb->getDoc(reslist_winfirst + reldocnum, doc, 0)) {
+ startPreview(reslist_winfirst + reldocnum);
+}
+
+
+// Open a preview window for a given document
+// docnum is a db query index
+void RecollMain::startPreview(int docnum)
+{
+ Rcl::Doc doc;
+ if (!rcldb->getDoc(docnum, doc, 0)) {
QMessageBox::warning(0, "Recoll",
- QString("Can't retrieve document from database"));
+ QString("Cannot retrieve document info"
+ " from database"));
return;
}
// Go to the file system to retrieve / convert the document text
// for preview:
string fn = urltolocalpath(doc.url);
+ struct stat st;
+ if (stat(fn.c_str(), &st) < 0) {
+ QMessageBox::warning(0, "Recoll",
+ QString("Cannot access document file: ") +
+ fn.c_str());
+ return;
+ }
+
+ QStatusBar *stb = statusBar();
+ if (stb) {
+ char csz[20];
+ sprintf(csz, "%lu", (unsigned long)st.st_size);
+ string msg = string("Loading: ") + fn + " (size " + csz
+ + " bytes)";
+ stb->message(msg.c_str());
+ stb->repaint(false);
+ XFlush(qt_xdisplay());
+ }
+
Rcl::Doc fdoc;
FileInterner interner(fn, rclconfig, tmpdir);
if (interner.internfile(fdoc, doc.ipath) != FileInterner::FIDone) {
@@ -526,6 +568,10 @@
doc.mimetype.c_str());
return;
}
+
+ if (stb)
+ stb->clear();
+
list<string> terms;
rcldb->getQueryTerms(terms);
list<pair<int, int> > termoffsets;