diff --git a/src/qtgui/advsearch.ui b/src/qtgui/advsearch.ui
index c3e0c0d2..30cdafd5 100644
--- a/src/qtgui/advsearch.ui
+++ b/src/qtgui/advsearch.ui
@@ -384,10 +384,10 @@
20
- AtTop
+ NoInsertion
- true
+ false
Enter top directory for search
diff --git a/src/qtgui/advsearch_w.cpp b/src/qtgui/advsearch_w.cpp
index 34411805..9976aab4 100644
--- a/src/qtgui/advsearch_w.cpp
+++ b/src/qtgui/advsearch_w.cpp
@@ -1,5 +1,5 @@
#ifndef lint
-static char rcsid[] = "@(#$Id: advsearch_w.cpp,v 1.2 2006-09-11 12:05:38 dockes Exp $ (C) 2005 J.F.Dockes";
+static char rcsid[] = "@(#$Id: advsearch_w.cpp,v 1.3 2006-09-12 10:11:36 dockes Exp $ (C) 2005 J.F.Dockes";
#endif
/*
* This program is free software; you can redistribute it and/or modify
@@ -188,9 +188,14 @@ void AdvSearch::searchPB_clicked()
if (!subtreeCMB->currentText().isEmpty()) {
mydata.topdir =
string((const char*)(subtreeCMB->currentText().utf8()));
- // If this was started by clicking, need to insert the new entry
- if (subtreeCMB->text(0) != subtreeCMB->currentText())
+ // The listbox is set for no insertion, do it. Have to check
+ // for dups as the internal feature seems to only work for
+ // user-inserted strings
+ if (!subtreeCMB->listBox()->findItem(subtreeCMB->currentText(),
+ Qt::CaseSensitive|Qt::ExactMatch))
subtreeCMB->insertItem(subtreeCMB->currentText(), 0);
+ // And keep it sorted
+ subtreeCMB->listBox()->sort();
prefs.asearchSubdirHist.clear();
for (int index = 0; index < subtreeCMB->count(); index++)
prefs.asearchSubdirHist.push_back(subtreeCMB->text(index));
diff --git a/src/qtgui/preview_w.cpp b/src/qtgui/preview_w.cpp
index 87713ac2..a7e04395 100644
--- a/src/qtgui/preview_w.cpp
+++ b/src/qtgui/preview_w.cpp
@@ -1,5 +1,5 @@
#ifndef lint
-static char rcsid[] = "@(#$Id: preview_w.cpp,v 1.1 2006-09-04 15:13:01 dockes Exp $ (C) 2005 J.F.Dockes";
+static char rcsid[] = "@(#$Id: preview_w.cpp,v 1.2 2006-09-12 10:11:36 dockes Exp $ (C) 2005 J.F.Dockes";
#endif
/*
* This program is free software; you can redistribute it and/or modify
@@ -55,17 +55,6 @@ using std::pair;
#define wasCanceled wasCancelled
#endif
-// We keep a list of data associated to each tab
-class TabData {
- public:
- string fn; // filename for this tab
- string ipath; // Internal doc path inside file
- QWidget *w; // widget for setCurrent
- TabData(QWidget *wi) : w(wi) {}
-};
-
-#define TABDATA ((list *)tabData)
-
void Preview::init()
{
// signals and slots connections
@@ -80,14 +69,12 @@ void Preview::init()
searchTextLine->installEventFilter(this);
dynSearchActive = false;
canBeep = true;
- tabData = new list;
- TABDATA->push_back(TabData(pvTab->currentPage()));
+ tabData.push_back(TabData(pvTab->currentPage()));
currentW = 0;
}
void Preview::destroy()
{
- delete TABDATA;
}
void Preview::closeEvent(QCloseEvent *e)
@@ -109,6 +96,20 @@ bool Preview::eventFilter(QObject *target, QEvent *event)
} else if (keyEvent->key() == Key_Escape) {
close();
return true;
+ } else if (keyEvent->key() == Qt::Key_Down &&
+ (keyEvent->state() & ShiftButton)) {
+ // LOGDEB(("Preview::eventFilter: got Shift-Up\n"));
+ TabData *d = tabDataForCurrent();
+ if (d)
+ emit(showNext(m_searchId, d->docnum));
+ return true;
+ } else if (keyEvent->key() == Qt::Key_Up &&
+ (keyEvent->state() & ShiftButton)) {
+ // LOGDEB(("Preview::eventFilter: got Shift-Down\n"));
+ TabData *d = tabDataForCurrent();
+ if (d)
+ emit(showPrev(m_searchId, d->docnum));
+ return true;
} else if (keyEvent->key() == Key_W &&
(keyEvent->state() & ControlButton)) {
// LOGDEB(("Preview::eventFilter: got ^W\n"));
@@ -154,7 +155,7 @@ void Preview::searchTextLine_textChanged(const QString & text)
}
}
-QTextEdit * Preview::getCurrentEditor()
+QTextEdit *Preview::getCurrentEditor()
{
QWidget *tw = pvTab->currentPage();
QTextEdit *edit = 0;
@@ -235,7 +236,7 @@ void Preview::prevPressed()
doSearch(searchTextLine->text(), true, true);
}
-
+// Called when user clicks on tab
void Preview::currentChanged(QWidget * tw)
{
QWidget *edit = (QWidget *)tw->child("pvEdit");
@@ -274,12 +275,10 @@ void Preview::closeCurrentTab()
return;
pvTab->removePage(tw);
// Have to remove from tab data list
- if (tabData == 0)
- return;
- for (list::iterator it = TABDATA->begin();
- it != TABDATA->end(); it++) {
+ for (list::iterator it = tabData.begin();
+ it != tabData.end(); it++) {
if (it->w == tw) {
- TABDATA->erase(it);
+ tabData.erase(it);
return;
}
}
@@ -299,12 +298,12 @@ QTextEdit *Preview::addEditorTab()
anonLayout->addWidget(editor);
pvTab->addTab(anon, "Tab");
pvTab->showPage(anon);
- if (tabData)
- TABDATA->push_back(TabData(anon));
+ tabData.push_back(TabData(anon));
return editor;
}
-void Preview::setCurTabProps(const string &fn, const Rcl::Doc &doc)
+void Preview::setCurTabProps(const string &fn, const Rcl::Doc &doc,
+ int docnum)
{
QString title = QString::fromUtf8(doc.title.c_str(),
doc.title.length());
@@ -328,21 +327,36 @@ void Preview::setCurTabProps(const string &fn, const Rcl::Doc &doc)
tiptxt += doc.title + "\n";
pvTab->setTabToolTip(w,QString::fromUtf8(tiptxt.c_str(), tiptxt.length()));
- for (list::iterator it = TABDATA->begin();
- it != TABDATA->end(); it++) {
+ for (list::iterator it = tabData.begin();
+ it != tabData.end(); it++) {
if (it->w == w) {
it->fn = fn;
it->ipath = doc.ipath;
+ it->docnum = docnum;
break;
}
}
}
+TabData *Preview::tabDataForCurrent()
+{
+ QWidget *w = pvTab->currentPage();
+ if (w == 0)
+ return 0;
+ for (list::iterator it = tabData.begin();
+ it != tabData.end(); it++) {
+ if (it->w == w) {
+ return &(*it);
+ }
+ }
+ return 0;
+}
+
bool Preview::makeDocCurrent(const string &fn, const Rcl::Doc &doc)
{
LOGDEB(("Preview::makeFileCurrent: %s\n", fn.c_str()));
- for (list::iterator it = TABDATA->begin();
- it != TABDATA->end(); it++) {
+ for (list::iterator it = tabData.begin();
+ it != tabData.end(); it++) {
LOGDEB2(("Preview::makeFileCurrent: compare to w %p, file %s\n",
it->w, it->fn.c_str()));
if (!it->fn.compare(fn) && !it->ipath.compare(doc.ipath)) {
@@ -457,7 +471,8 @@ class WaiterThread : public QThread {
#define MIN(A,B) ((A)<(B)?(A):(B))
#endif
-bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc)
+bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc,
+ int docnum)
{
Rcl::Doc doc = idoc;
bool cancel = false;
@@ -465,7 +480,7 @@ bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc)
if (doc.title.empty())
doc.title = path_getsimple(doc.url);
- setCurTabProps(fn, doc);
+ setCurTabProps(fn, doc, docnum);
char csz[20];
sprintf(csz, "%lu", (unsigned long)sz);
@@ -553,6 +568,7 @@ bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc)
// Load into editor
// Do it in several chunks
QTextEdit *editor = getCurrentEditor();
+ editor->setText("");
if (highlightTerms) {
QStyleSheetItem *item =
new QStyleSheetItem(editor->styleSheet(), "termtag" );
@@ -592,11 +608,16 @@ bool Preview::loadFileInCurrentTab(string fn, size_t sz, const Rcl::Doc &idoc)
}
}
- if (!firstTerm.empty()) {
- bool wasC = matchCheck->isChecked();
- matchCheck->setChecked(false);
- doSearch(QString::fromUtf8(terms.begin()->c_str()), true, false);
- matchCheck->setChecked(wasC);
+ if (searchTextLine->text().length() != 0) {
+ canBeep = true;
+ doSearch(searchTextLine->text(), true, false);
+ } else {
+ if (!firstTerm.empty()) {
+ bool wasC = matchCheck->isChecked();
+ matchCheck->setChecked(false);
+ doSearch(QString::fromUtf8(terms.begin()->c_str()), true, false);
+ matchCheck->setChecked(wasC);
+ }
}
return true;
}
diff --git a/src/qtgui/preview_w.h b/src/qtgui/preview_w.h
index ea00eab2..d6aa4dab 100644
--- a/src/qtgui/preview_w.h
+++ b/src/qtgui/preview_w.h
@@ -1,6 +1,6 @@
#ifndef _PREVIEW_W_H_INCLUDED_
#define _PREVIEW_W_H_INCLUDED_
-/* @(#$Id: preview_w.h,v 1.1 2006-09-04 15:13:01 dockes Exp $ (C) 2006 J.F.Dockes */
+/* @(#$Id: preview_w.h,v 1.2 2006-09-12 10:11:36 dockes Exp $ (C) 2006 J.F.Dockes */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,23 +23,36 @@
#include "rcldb.h"
#include "preview.h"
+// We keep a list of data associated to each tab
+class TabData {
+ public:
+ string fn; // filename for this tab
+ string ipath; // Internal doc path inside file
+ QWidget *w; // widget for setCurrent
+ int docnum; // Index of doc in db search results.
+
+
+ TabData(QWidget *wi) : w(wi) {}
+};
+
class Preview : public PreviewBase
{
Q_OBJECT
public:
- Preview( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ) :
+ Preview(QWidget* parent = 0, const char* name = 0, WFlags fl = 0) :
PreviewBase(parent,name,fl) {init();}
~Preview(){}
- virtual void closeEvent( QCloseEvent * e );
- virtual bool eventFilter( QObject * target, QEvent * event );
+ virtual void setSId(int sid) {m_searchId = sid;}
+ virtual void closeEvent( QCloseEvent *e );
+ virtual bool eventFilter( QObject *target, QEvent *event );
virtual bool makeDocCurrent( const string & fn, const Rcl::Doc & doc );
- virtual QTextEdit * getCurrentEditor();
- virtual QTextEdit * addEditorTab();
+ virtual QTextEdit *getCurrentEditor();
+ virtual QTextEdit *addEditorTab();
virtual bool loadFileInCurrentTab(string fn, size_t sz,
- const Rcl::Doc & idoc );
+ const Rcl::Doc& idoc, int dnm);
public slots:
virtual void searchTextLine_textChanged( const QString & text );
@@ -48,24 +61,31 @@ public slots:
virtual void prevPressed();
virtual void currentChanged( QWidget * tw );
virtual void closeCurrentTab();
- virtual void setCurTabProps( const string & fn, const Rcl::Doc & doc );
+ virtual void setCurTabProps(const string & fn, const Rcl::Doc & doc,
+ int docnum);
virtual void textDoubleClicked(int, int);
signals:
void previewClosed(QWidget *);
void wordSelect(QString);
+ void showNext(int sid, int docnum);
+ void showPrev(int sid, int docnum);
protected:
+ int m_searchId; // Identifier of search in main window. This is so that
+ // we make sense when requesting the next document when
+ // browsing successive search results in a tab.
int matchIndex;
int matchPara;
bool dynSearchActive;
bool canBeep;
- void *tabData;
+ list tabData;
QWidget *currentW;
private:
void init();
virtual void destroy();
+ TabData *tabDataForCurrent(); // Return auxiliary data pointer for cur tab
};
#endif /* _PREVIEW_W_H_INCLUDED_ */
diff --git a/src/qtgui/rclmain.cpp b/src/qtgui/rclmain.cpp
index d6d64771..d71c2562 100644
--- a/src/qtgui/rclmain.cpp
+++ b/src/qtgui/rclmain.cpp
@@ -1,5 +1,5 @@
#ifndef lint
-static char rcsid[] = "@(#$Id: rclmain.cpp,v 1.29 2006-09-11 09:08:44 dockes Exp $ (C) 2005 J.F.Dockes";
+static char rcsid[] = "@(#$Id: rclmain.cpp,v 1.30 2006-09-12 10:11:36 dockes Exp $ (C) 2005 J.F.Dockes";
#endif
/*
* This program is free software; you can redistribute it and/or modify
@@ -82,7 +82,7 @@ void RclMain::init()
asearchform = 0;
sortform = 0;
uiprefs = 0;
-
+ m_searchId = 0;
// Set the focus to the search terms entry:
sSearch->queryText->setFocus();
@@ -100,11 +100,20 @@ void RclMain::init()
connect(prevPageAction, SIGNAL(activated()),
resList, SLOT(resultPageBack()));
connect(nextPageAction, SIGNAL(activated()),
- resList, SLOT(showResultPage()));
+ resList, SLOT(resultPageNext()));
connect(resList, SIGNAL(docExpand(int)), this, SLOT(docExpand(int)));
connect(resList, SIGNAL(wordSelect(QString)),
this, SLOT(ssearchAddTerm(QString)));
+ connect(resList, SIGNAL(nextPageAvailable(bool)),
+ this, SLOT(enableNextPage(bool)));
+ connect(resList, SIGNAL(prevPageAvailable(bool)),
+ this, SLOT(enablePrevPage(bool)));
+ connect(resList, SIGNAL(docEditClicked(int)),
+ this, SLOT(startNativeViewer(int)));
+ connect(resList, SIGNAL(docPreviewClicked(int)),
+ this, SLOT(startPreview(int)));
+
connect(fileExitAction, SIGNAL(activated() ), this, SLOT(fileExit() ) );
connect(fileStart_IndexingAction, SIGNAL(activated()),
this, SLOT(startIndexing()));
@@ -119,14 +128,6 @@ void RclMain::init()
this, SLOT(showSortDialog()));
connect(preferencesQuery_PrefsAction, SIGNAL(activated()),
this, SLOT(showUIPrefs()));
- connect(resList, SIGNAL(nextPageAvailable(bool)),
- this, SLOT(enableNextPage(bool)));
- connect(resList, SIGNAL(prevPageAvailable(bool)),
- this, SLOT(enablePrevPage(bool)));
- connect(resList, SIGNAL(docEditClicked(int)),
- this, SLOT(startNativeViewer(int)));
- connect(resList, SIGNAL(docPreviewClicked(int)),
- this, SLOT(startPreview(int)));
nextPageAction->setIconSet(createIconSet("nextpage.png"));
prevPageAction->setIconSet(createIconSet("prevpage.png"));
@@ -340,6 +341,7 @@ void RclMain::startAdvSearch(Rcl::AdvSearchData sdata)
} else {
docsource = new DocSequenceDb(rcldb, string(tr("Query results").utf8()));
}
+ m_searchId++;
resList->setDocSource(docsource, sdata);
}
@@ -440,11 +442,16 @@ void RclMain::startPreview(int docnum)
QMessageBox::NoButton);
return;
}
+ curPreview->setSId(m_searchId);
curPreview->setCaption(resList->getDescription());
connect(curPreview, SIGNAL(previewClosed(QWidget *)),
this, SLOT(previewClosed(QWidget *)));
connect(curPreview, SIGNAL(wordSelect(QString)),
this, SLOT(ssearchAddTerm(QString)));
+ connect(curPreview, SIGNAL(showNext(int, int)),
+ this, SLOT(previewNextInTab(int, int)));
+ connect(curPreview, SIGNAL(showPrev(int, int)),
+ this, SLOT(previewPrevInTab(int, int)));
curPreview->show();
} else {
if (curPreview->makeDocCurrent(fn, doc)) {
@@ -453,8 +460,84 @@ void RclMain::startPreview(int docnum)
}
(void)curPreview->addEditorTab();
}
+ // Enter document in document history
g_dynconf->enterDoc(fn, doc.ipath);
- if (!curPreview->loadFileInCurrentTab(fn, st.st_size, doc))
+ if (!curPreview->loadFileInCurrentTab(fn, st.st_size, doc, docnum))
+ curPreview->closeCurrentTab();
+}
+
+// Show next document from result list in current preview tab
+void RclMain::previewNextInTab(int sid, int docnum)
+{
+ LOGDEB(("RclMain::previewNextInTab sid %d docnum %d, m_sid %d\n",
+ sid, docnum, m_searchId));
+
+ if (sid != m_searchId) {
+ QMessageBox::warning(0, "Recoll",
+ tr("This search is not active any more"));
+ return;
+ }
+
+ docnum++;
+ if (docnum >= resList->getResCnt()) {
+ QApplication::beep();
+ return;
+ }
+
+ Rcl::Doc doc;
+ if (!resList->getDoc(docnum, doc)) {
+ QMessageBox::warning(0, "Recoll",
+ tr("Cannot retrieve document info"
+ " from database"));
+ return;
+ }
+
+ // Check that file exists in file system
+ string fn = urltolocalpath(doc.url);
+ struct stat st;
+ if (stat(fn.c_str(), &st) < 0) {
+ QMessageBox::warning(0, "Recoll", tr("Cannot access document file: ") +
+ fn.c_str());
+ return;
+ }
+
+ if (!curPreview->loadFileInCurrentTab(fn, st.st_size, doc, docnum))
+ curPreview->closeCurrentTab();
+}
+
+// Show previous document from result list in current preview tab
+void RclMain::previewPrevInTab(int sid, int docnum)
+{
+ LOGDEB(("RclMain::previewPrevInTab sid %d docnum %d, m_sid %d\n",
+ sid, docnum, m_searchId));
+
+ if (sid != m_searchId) {
+ QMessageBox::warning(0, "Recoll",
+ tr("This search is not active any more"));
+ return;
+ }
+ if (docnum <= 0) {
+ QApplication::beep();
+ return;
+ }
+ docnum--;
+ Rcl::Doc doc;
+ if (!resList->getDoc(docnum, doc)) {
+ QMessageBox::warning(0, "Recoll",
+ tr("Cannot retrieve document info"
+ " from database"));
+ return;
+ }
+
+ // Check that the file exists in the file system
+ string fn = urltolocalpath(doc.url);
+ struct stat st;
+ if (stat(fn.c_str(), &st) < 0) {
+ QMessageBox::warning(0, "Recoll", tr("Cannot access document file: ") +
+ fn.c_str());
+ return;
+ }
+ if (!curPreview->loadFileInCurrentTab(fn, st.st_size, doc, docnum))
curPreview->closeCurrentTab();
}
@@ -560,6 +643,7 @@ void RclMain::startManual()
startHelpBrowser();
}
+// Search for document 'like' the selected one.
void RclMain::docExpand(int docnum)
{
Rcl::Doc doc;
@@ -606,6 +690,7 @@ void RclMain::showDocHistory()
}
Rcl::AdvSearchData sdata;
sdata.description = tr("History data").utf8();
+ m_searchId++;
resList->setDocSource(docsource, sdata);
}
diff --git a/src/qtgui/rclmain.h b/src/qtgui/rclmain.h
index db87e8bf..782d414f 100644
--- a/src/qtgui/rclmain.h
+++ b/src/qtgui/rclmain.h
@@ -64,6 +64,8 @@ public slots:
virtual void ssearchAddTerm(QString);
virtual void startPreview(int docnum);
virtual void startNativeViewer(int docnum);
+ virtual void previewNextInTab(int sid, int docnum);
+ virtual void previewPrevInTab(int sid, int docnum);
private:
Preview *curPreview;
@@ -71,6 +73,8 @@ private:
SortForm *sortform;
UIPrefsDialog *uiprefs;
RclSortSpec sortspecs;
+ int m_searchId; // Serial number of current search for this process.
+ // Used to match to preview windows
virtual void init();
};
diff --git a/src/qtgui/rclreslist.cpp b/src/qtgui/rclreslist.cpp
index c31a5132..c8f37183 100644
--- a/src/qtgui/rclreslist.cpp
+++ b/src/qtgui/rclreslist.cpp
@@ -1,5 +1,5 @@
#ifndef lint
-static char rcsid[] = "@(#$Id: rclreslist.cpp,v 1.17 2006-05-09 07:56:07 dockes Exp $ (C) 2005 J.F.Dockes";
+static char rcsid[] = "@(#$Id: rclreslist.cpp,v 1.18 2006-09-12 10:11:36 dockes Exp $ (C) 2005 J.F.Dockes";
#endif
#include
@@ -72,7 +72,7 @@ void RclResList::setDocSource(DocSequence *docsource, Rcl::AdvSearchData& sdt)
delete m_docsource;
m_docsource = docsource;
m_queryData = sdt;
- showResultPage();
+ resultPageNext();
}
// Get document number from paragraph number
@@ -90,14 +90,58 @@ int RclResList::docnumfromparnum(int par)
return dn;
}
+// Get paragraph number from document number
+int RclResList::parnumfromdocnum(int docnum)
+{
+ if (m_winfirst == -1 || docnum - m_winfirst < 0)
+ return -1;
+ docnum -= m_winfirst;
+ for (std::map::iterator it = m_pageParaToReldocnums.begin();
+ it != m_pageParaToReldocnums.end(); it++) {
+ if (docnum == it->second)
+ return it->first;
+ }
+ return -1;
+}
+
+// Return doc from current or adjacent result pages
bool RclResList::getDoc(int docnum, Rcl::Doc &doc)
{
- if (docnum >= 0 && docnum >= int(m_winfirst) &&
+ if (docnum < 0)
+ return false;
+ // Is docnum in current page ? Then all Ok
+ if (docnum >= int(m_winfirst) &&
docnum < int(m_winfirst + m_curDocs.size())) {
doc = m_curDocs[docnum - m_winfirst];
- return true;
+ goto found;
+ }
+
+ // Else we accept to page down or up but not further
+ if (docnum < int(m_winfirst) &&
+ docnum >= int(m_winfirst) - prefs.respagesize) {
+ resultPageBack();
+ } else if (docnum <
+ int(m_winfirst + m_curDocs.size()) + prefs.respagesize) {
+ resultPageNext();
+ }
+ if (docnum >= int(m_winfirst) &&
+ docnum < int(m_winfirst + m_curDocs.size())) {
+ doc = m_curDocs[docnum - m_winfirst];
+ goto found;
}
return false;
+
+ found:
+ if (docnum != m_docnum) {
+ int par = parnumfromdocnum(docnum);
+ if (par >= 0) {
+ setCursorPosition(par, 1);
+ ensureCursorVisible();
+ clicked(par, 1);
+ m_docnum = docnum;
+ }
+ }
+ return true;
}
void RclResList::keyPressEvent( QKeyEvent * e )
@@ -115,6 +159,14 @@ void RclResList::keyPressEvent( QKeyEvent * e )
QTextBrowser::keyPressEvent(e);
}
+// Return total result list count
+int RclResList::getResCnt()
+{
+ if (!m_docsource)
+ return -1;
+ return m_docsource->getResCnt();
+}
+
// Page Up/Down: we don't try to check if current paragraph is last or
// first. We just page up/down and check if viewport moved. If it did,
// fair enough, else we go to next/previous result page.
@@ -126,7 +178,6 @@ void RclResList::resPageUpOrBack()
resultPageBack();
}
-
void RclResList::resPageDownOrNext()
{
int vpos = contentsY();
@@ -134,7 +185,7 @@ void RclResList::resPageDownOrNext()
LOGDEB(("RclResList::resPageDownOrNext: vpos before %d, after %d\n",
vpos, contentsY()));
if (vpos == contentsY())
- showResultPage();
+ resultPageNext();
}
// Show previous page of results. We just set the current number back
@@ -144,7 +195,7 @@ void RclResList::resultPageBack()
if (m_winfirst <= 0)
return;
m_winfirst -= 2 * prefs.respagesize;
- showResultPage();
+ resultPageNext();
}
// Convert byte count into unit (KB/MB...) appropriate for display
@@ -165,7 +216,7 @@ static string displayableBytes(long size)
}
// Fill up result list window with next screen of hits
-void RclResList::showResultPage()
+void RclResList::resultPageNext()
{
if (!m_docsource)
return;
@@ -176,7 +227,7 @@ void RclResList::showResultPage()
int resCnt = m_docsource->getResCnt();
m_pageParaToReldocnums.clear();
- LOGDEB(("showResultPage: rescnt %d, winfirst %d\n", resCnt,
+ LOGDEB(("resultPageNext: rescnt %d, winfirst %d\n", resCnt,
m_winfirst));
// If we are already on the last page, nothing to do:
@@ -436,7 +487,7 @@ void RclResList::linkWasClicked(const QString &s)
emit docEditClicked(i);
break;
case 'n':
- showResultPage();
+ resultPageNext();
break;
case 'p':
resultPageBack();
diff --git a/src/qtgui/rclreslist.h b/src/qtgui/rclreslist.h
index 33e6ff7b..96c040b0 100644
--- a/src/qtgui/rclreslist.h
+++ b/src/qtgui/rclreslist.h
@@ -1,6 +1,6 @@
#ifndef _RCLRESLIST_H_INCLUDED_
#define _RCLRESLIST_H_INCLUDED_
-/* @(#$Id: rclreslist.h,v 1.8 2006-04-26 11:29:10 dockes Exp $ (C) 2005 J.F.Dockes */
+/* @(#$Id: rclreslist.h,v 1.9 2006-09-12 10:11:36 dockes Exp $ (C) 2005 J.F.Dockes */
#include
#include
@@ -16,20 +16,26 @@ class RclResList : public QTextBrowser
public:
RclResList(QWidget* parent = 0, const char* name = 0);
virtual ~RclResList();
+
+ // Return document for given docnum. We act as an intermediary to
+ // the docseq here. This has also the side-effect of making the
+ // entry current (visible and highlighted), and only work if the
+ // num is inside the current page or its immediate neighbours.
+ virtual bool getDoc(int docnum, Rcl::Doc &);
- virtual bool getDoc( int, Rcl::Doc & );
virtual void setDocSource(DocSequence *, Rcl::AdvSearchData& qdata);
virtual QPopupMenu *createPopupMenu(const QPoint& pos);
- virtual QString getDescription();
+ virtual QString getDescription(); // Printable actual query performed on db
+ virtual int getResCnt(); // Return total result list size
public slots:
virtual void resetSearch() {m_winfirst = -1;clear();}
virtual void clicked(int, int);
virtual void doubleClicked(int, int);
- virtual void resPageUpOrBack();
- virtual void resPageDownOrNext();
- virtual void resultPageBack();
- virtual void showResultPage();
+ virtual void resPageUpOrBack(); // Page up pressed
+ virtual void resPageDownOrNext(); // Page down pressed
+ virtual void resultPageBack(); // Display previous page of results
+ virtual void resultPageNext(); // Display next (or first) page of results
virtual void menuPreview();
virtual void menuEdit();
virtual void menuCopyFN();
@@ -59,9 +65,10 @@ class RclResList : public QTextBrowser
DocSequence *m_docsource;
std::vector m_curDocs;
int m_winfirst;
- int m_docnum; // Docnum matching the
+ int m_docnum; // Docnum matching the currently active para
virtual int docnumfromparnum(int);
+ virtual int parnumfromdocnum(int);
void emitLinkClicked(const QString &s) {
emit linkClicked(s);
};
diff --git a/src/qtgui/ssearch_w.cpp b/src/qtgui/ssearch_w.cpp
index aec973a3..4ce28a14 100644
--- a/src/qtgui/ssearch_w.cpp
+++ b/src/qtgui/ssearch_w.cpp
@@ -1,5 +1,5 @@
#ifndef lint
-static char rcsid[] = "@(#$Id: ssearch_w.cpp,v 1.3 2006-09-11 12:05:38 dockes Exp $ (C) 2006 J.F.Dockes";
+static char rcsid[] = "@(#$Id: ssearch_w.cpp,v 1.4 2006-09-12 10:11:36 dockes Exp $ (C) 2006 J.F.Dockes";
#endif
/*
* This program is free software; you can redistribute it and/or modify
@@ -92,16 +92,17 @@ void SSearch::startSimpleSearch()
bool changed;
do {
changed = false;
- for (int index = 1; index < queryText->count(); index++) {
- if (queryText->text(index) == queryText->currentText()) {
+ for (int index = 0; index < queryText->count(); index++) {
+ if (queryText->text(index).length() == 0 ||
+ queryText->text(index) == queryText->currentText()) {
queryText->removeItem(index);
changed = true;
break;
}
}
} while (changed);
- if (queryText->text(0) != queryText->currentText())
- queryText->insertItem(queryText->currentText(), 0);
+ // The combobox is set for no insertion, insert here:
+ queryText->insertItem(queryText->currentText(), 0);
// Save the current state of the listbox list to file
prefs.ssearchHistory.clear();
diff --git a/src/qtgui/ssearchb.ui b/src/qtgui/ssearchb.ui
index b5b35f92..6bbcfd70 100644
--- a/src/qtgui/ssearchb.ui
+++ b/src/qtgui/ssearchb.ui
@@ -94,13 +94,13 @@
true
- 20
+ 10
30
- AtTop
+ NoInsertion
false