[bt-devel] Strong's utilities patch

Lee Carpenter elc at carpie.net
Mon Jan 16 22:15:03 MST 2006


Thanks Jim!

Joachim, Martin, if one of you guys wants to check this in to the 
existing tree, I will take on the task of merging my GUI changes with 
it.  I hope to be finished with those changes in a couple of more days...

Thanks,

Lee C.

jdc wrote:
> The following are attached:
>    1) a diff of the bibletime/frontend/searchdialog directory.
>    2) the three modified files
>          a. csearchdialog.cpp
>          b. csearchdialogpages.cpp
>          c. csearchdialogpages.h
> 
> The modifications include:
>    1) Highlighting Strong's text for a Strong's number search.
>    2) A fix for a bug in the setSearchText() function.
>    3) An implementation for showing a Strong's number search with text 
> count. (reference previous e-mails).
>       I believe this is technically called an "Englishman's Search".
>    4) There are some changes to the search dialog which are not 
> necessary because the search dialog will be rewritten.
>       Basically, I just put the dialog back to the original.
> 
> Thanks
> Jim
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> diff -U 3 -H -d -r -N -- bibletime-new/bibletime/frontend/searchdialog/csearchdialog.cpp bibletime-cvs/bibletime/frontend/searchdialog/csearchdialog.cpp
> --- bibletime-new/bibletime/frontend/searchdialog/csearchdialog.cpp	2006-01-16 20:34:36.000000000 -0700
> +++ bibletime-cvs/bibletime/frontend/searchdialog/csearchdialog.cpp	2006-01-02 10:26:07.000000000 -0700
> @@ -56,11 +56,6 @@
>  	}
>  
>  	m_staticDialog->raise();
> -
> -   // this is needed to make the dialog box adjust properly.
> -   // without it the search and close buttons are hidden.
> -   m_staticDialog->adjustSize();
> -
>  	if (modules.count() && !searchText.isEmpty()) {
>  		m_staticDialog->startSearch();
>  	}
> @@ -99,14 +94,9 @@
>  		int result = QMessageBox::question(this, i18n("Missing indices"),
>  			i18n("One or more modules need indexing before they can be searched.\n"
>  			"This could take a long time. Proceed with indexing?"),
> -      	QMessageBox::Yes | QMessageBox::Default,
> -         QMessageBox::No | QMessageBox::Escape);
> -      // The result is 0 for Yes/Ok and 1 for No/Cancel.
> -      // It does not seem to matter what the two button constants are.
> -      // I have tried Yes/No, Ok/Cancel and they both show a Yes/No dialog with
> -      // Yes on the left and No on the right.  When Yes is clicked the result is 0,
> -      // when No is clicked the result is 1.
> -		if (result == 0) {
> +			QMessageBox::Yes | QMessageBox::Default,
> +			QMessageBox::No | QMessageBox::Escape);
> +		if (result == QMessageBox::Yes) {
>  			// FIXME - add a proper progress dialog for indexing
>  			m_searcher.indexModules( modules() );
>  		}
> @@ -186,19 +176,14 @@
>  void CSearchDialog::initView() {
>  	setButtonTip(User1, CResMgr::searchdialog::searchButton::tooltip);
>  
> -   // this is to get the search results page to have a sane default size.
> -   // there might be a better fix but I don't know of one.
> -   setInitialSize(QSize(575, 200));
> -
> -	QVBoxLayout* box = new QVBoxLayout (plainPage());
> + 	QVBoxLayout* box = new QVBoxLayout ( plainPage() );
>  	box->setSpacing(3);
>  
>  	m_searchOptionsPage = new CSearchOptionsPage(plainPage());
> -	box->addWidget( m_searchOptionsPage );
> + 	box->addWidget( m_searchOptionsPage );
>  
>  	m_searchResultPage = new CSearchResultPage(plainPage());
>  	box->addWidget( m_searchResultPage );
> -
>  }
>  
>  void CSearchDialog::searchFinished() {
> diff -U 3 -H -d -r -N -- bibletime-new/bibletime/frontend/searchdialog/csearchdialogpages.cpp bibletime-cvs/bibletime/frontend/searchdialog/csearchdialogpages.cpp
> --- bibletime-new/bibletime/frontend/searchdialog/csearchdialogpages.cpp	2006-01-16 20:29:21.000000000 -0700
> +++ bibletime-cvs/bibletime/frontend/searchdialog/csearchdialogpages.cpp	2006-01-03 15:08:42.000000000 -0700
> @@ -52,97 +52,6 @@
>  #include <kiconloader.h>
>  #include <kmessagebox.h>
>  
> -
> -/********************************************
> -************  StrongsResultList *************
> -********************************************/
> -void StrongsResultClass::initStrongsResults(void)
> -   {
> -   using namespace Rendering;
> -   CDisplayRendering render;
> -   ListCSwordModuleInfo modules;
> -   CTextRendering::KeyTreeItem::Settings settings;
> -   QString rText, lText, key;
> -   bool found;
> -   int sIndex;
> -   int count;
> -   int index;
> -   QString text;
> -
> -   modules.append(srModule);
> -   sword::ListKey& result = srModule->searchResult();
> -
> -   count = result.Count();
> -   if (!count)
> -      return;
> -
> -   srList.clear();
> -
> -   for (index = 0; index < count; index++)
> -      {
> -      key = QString::fromUtf8(result.GetElement(index)->getText());
> -      text = render.renderSingleKey(key, modules, settings);
> -      sIndex = 0;
> -      while ((rText = getStrongsNumberText(text, &sIndex)) != "")
> -         {
> -         StrongsResultList::iterator it;
> -         found = FALSE;
> -         for ( it = srList.begin(); it != srList.end(); ++it )
> -            {
> -            lText = (*it).keyText();
> -            if (lText == rText)
> -               {
> -               found = TRUE;
> -               (*it).addKeyName(key);
> -               break;
> -               }
> -            }
> -         if (found == FALSE)
> -            srList.append( StrongsResult(rText, key) );
> -         }
> -      }
> -   //qHeapSort(srList);
> -   }
> -
> -QString StrongsResultClass::getStrongsNumberText(const QString& verseContent, int *startIndex)
> -   {
> -   // get the strongs text
> -   int idx1, idx2, index;
> -   QString sNumber, strongsText;
> -   const bool cs = CSwordModuleSearch::caseSensitive;
> -
> -   if (*startIndex == 0)
> -      index = verseContent.find("<body", 0);
> -   else
> -      index = *startIndex;
> -   // find all the "lemma=" inside the the content
> -   while((index = verseContent.find("lemma=", index, cs)) != -1)
> -      {
> -      // get the strongs number after the lemma and compare it with the
> -      // strongs number we are looking for
> -      idx1 = verseContent.find("\"", index) + 1;
> -      idx2 = verseContent.find("\"", idx1 + 1);
> -      sNumber = verseContent.mid(idx1, idx2 - idx1);
> -      if (sNumber.find(lemmaText) >= 0)
> -         {
> -         // strongs number is found now we need to get the text of this node
> -         // search right until the ">" is found.  Get the text from here to
> -         // the next "<".
> -         index = verseContent.find(">", index, cs) + 1;
> -         idx2  = verseContent.find("<", index, cs);
> -         strongsText = verseContent.mid(index, idx2 - index);
> -         index = idx2;
> -         *startIndex = index;
> -         return(strongsText);
> -         }
> -      else
> -         {
> -         index += 6; // 6 is the length of "lemma="
> -         }
> -      }
> -   return("");
> -   }
> -
>  /********************************************
>  ************  ModuleResultList **************
>  ********************************************/
> @@ -226,36 +135,6 @@
>  	executed(currentItem());
>  }
>  
> -void CSearchResultView::setupStrongsTree(CSwordModuleInfo* m, QStringList* vList)
> -{
> -   clear();
> -   if (!m) {
> -      return;
> -   }
> -
> -   m_module = m;
> -
> -   if (vList->count() <= 0)
> -      return;
> -
> -   setUpdatesEnabled(false);
> -
> -   KListViewItem* oldItem = 0;
> -   KListViewItem* item = 0;
> -
> -   for ( QStringList::Iterator it = vList->begin(); it != vList->end(); ++it )
> -      {
> -      item = new KListViewItem(this, oldItem);
> -      item->setText(0, (*it));
> -      oldItem = item;
> -      }
> -
> -   setUpdatesEnabled(true);
> -
> -   setSelected(firstChild(), true);
> -   executed(currentItem());
> -}
> -
>  /** Is connected to the signal executed, which is emitted when a mew item was chosen. */
>  void CSearchResultView::executed(QListViewItem* item) {
>  	//  Q_ASSERT(item);
> @@ -384,7 +263,6 @@
>  CModuleResultView::CModuleResultView(QWidget* parent) : KListView(parent) {
>  	initView();
>  	initConnections();
> -   strongsResults = NULL;
>  };
>  
>  CModuleResultView::~CModuleResultView() {}
> @@ -436,16 +314,12 @@
>  }
>  
>  /** Setups the tree using the given list of modules. */
> -void CModuleResultView::setupTree( ListCSwordModuleInfo modules, const QString& searchedText ) {
> +void CModuleResultView::setupTree( ListCSwordModuleInfo modules ) {
>  	clear();
>  	QListViewItem* item = 0;
>  	QListViewItem* oldItem = 0;
>  	sword::ListKey result;
>  
> -   if (strongsResults) {
> -      delete(strongsResults);
> -      strongsResults = NULL;
> -      }
>  	ListCSwordModuleInfo::iterator end_it = modules.end();
>  	for (ListCSwordModuleInfo::iterator it(modules.begin()); it != end_it; ++it) {
>  		//   for (modules.first(); modules.current(); modules.next()) {
> @@ -454,78 +328,27 @@
>  		item = new KListViewItem(this, (*it)->name(), QString::number(result.Count()) );
>  		item->setPixmap(0,CToolClass::getIconForModule(*it) );
>  		oldItem = item;
> -      if (searchedText.find("strong:", 0) == 0) {
> -         QString sNumber;
> -         sNumber = searchedText.right(searchedText.length() - 7);
> -         setupStrongsResults((*it), item, sNumber);
> -         item->setOpen(TRUE);
> -      }
>  	};
>  
>  	setSelected(currentItem(), true);
>  	executed(currentItem());
>  }
>  
> -void CModuleResultView::setupStrongsResults(CSwordModuleInfo* module, QListViewItem* parent,
> -                                            const QString& sNumber)
> -   {
> -   QString lText;
> -   KListViewItem* item = 0;
> -
> -   strongsResults = new StrongsResultClass(module, sNumber);
> -
> -   for (int cnt = 0; cnt < strongsResults->Count(); cnt++)
> -      {
> -      lText = strongsResults->keyText(cnt);
> -      item = new KListViewItem(parent, lText, QString::number(strongsResults->keyCount(cnt)));
> -      item->setText(0, lText);
> -      }
> -   }
> -
>  
>  /** Is executed when an item was selected in the list. */
>  void CModuleResultView::executed( QListViewItem* i ) {
> -   QString itemText, lText;
> -
>  	if (CSwordModuleInfo* m = CPointers::backend()->findModuleByName(i->text(0))) {
>  		emit moduleChanged();
>  		emit moduleSelected(m);
> -      return;
>  	}
> -   if (!strongsResults)
> -      return;
> -
> -   itemText = i->text(0);
> -   for (int cnt = 0; cnt < strongsResults->Count(); cnt++)
> -      {
> -      lText = strongsResults->keyText(cnt);
> -      if (lText == itemText)
> -         {
> -         //clear the verses list
> -         emit moduleChanged();
> -         emit strongsSelected(activeModule(), strongsResults->getKeyList(cnt));
> -         return;
> -         }
> -      }
>  }
>  
>  /** Returns the currently active module. */
>  CSwordModuleInfo* const CModuleResultView::activeModule() {
>  	Q_ASSERT(currentItem());
> -   QListViewItem* item = currentItem();
> -
> -   if (item == NULL)
> -      return 0;
> -
> -   // we need to find the parent most node because that is the node
> -   // that is the module name.
> -   while (item->parent())
> -      item = item->parent();
> -
> -   if (item)
> -      return CPointers::backend()->findModuleByName(item->text(0));
> -
> -   return 0;
> +	if (currentItem())
> +		return CPointers::backend()->findModuleByName(currentItem()->text(0));
> +	return 0;
>  }
>  
>  /** No descriptions */
> @@ -595,41 +418,36 @@
>  void CSearchResultPage::initView() {
>  
>  	QWidget* insideFrame = new QWidget( this );
> +	QGridLayout* gridLayout = new QGridLayout(insideFrame, 3, 2);
> +	gridLayout->setSpacing( 3 );
> +	gridLayout->setRowStretch( 1, 5);
> +	gridLayout->setColStretch( 1, 5);
>  
> -   QVBoxLayout* mainLayout = new QVBoxLayout(insideFrame);
> -
> -   QSplitter* splitter = new QSplitter(Vertical, insideFrame);
> -   mainLayout->addWidget(splitter);
> -
> -   QSplitter* hSplitter = new QSplitter(Horizontal, splitter);
> -
> -   m_moduleListBox = new CModuleResultView(hSplitter);
> -
> -   m_resultListBox = new CSearchResultView(hSplitter);
> -
> -   hSplitter->setResizeMode(m_moduleListBox, QSplitter::FollowSizeHint);
> -   hSplitter->setResizeMode(m_resultListBox, QSplitter::Stretch);
> +	m_moduleListBox = new CModuleResultView(insideFrame);
> +	m_moduleListBox->setFixedHeight( 100 );
> +	gridLayout->addWidget(m_moduleListBox, 0, 0);
>  
> -   m_previewDisplay = CDisplay::createReadInstance(0, splitter);
> +	m_resultListBox = new CSearchResultView(insideFrame);
> +	gridLayout->addWidget(m_resultListBox, 1, 0);
>  
> -   m_moduleListBox->resize(m_moduleListBox->sizeHint());
> -   splitter->setResizeMode(hSplitter, QSplitter::KeepSize);
> -   splitter->setResizeMode(m_previewDisplay->view(), QSplitter::Stretch);
> +	m_analyseButton = new QPushButton(i18n("Analyze search"), insideFrame);
> +	connect(m_analyseButton, SIGNAL(clicked()), SLOT(showAnalysis()));
> +	gridLayout->addWidget(m_analyseButton, 2, 0);
>  
> -   m_analyseButton = new QPushButton(i18n("Show search analysis"), this);
> -   connect(m_analyseButton, SIGNAL(clicked()), SLOT(showAnalysis()));
> -   mainLayout->addSpacing(5);
> -   mainLayout->addWidget(m_analyseButton);
> +	m_previewDisplay = CDisplay::createReadInstance(0, insideFrame);
> +	gridLayout->addMultiCellWidget(m_previewDisplay->view(), 0, 2, 1, 1);
>  }
>  
>  /** Sets the modules which contain the result of each. */
>  void CSearchResultPage::setSearchResult(ListCSwordModuleInfo modules) {
> -   const QString searchedText = CSearchDialog::getSearchDialog()->searchText();
>  	reset(); //clear current modules
>  
> -
>  	m_modules = modules;
> -	m_moduleListBox->setupTree(modules, searchedText);
> +	m_moduleListBox->setupTree(modules);
> +	m_moduleListBox->setMinimumWidth(m_moduleListBox->sizeHint().width());
> +	m_moduleListBox->adjustSize();
> +	//  m_moduleListBox->parentWidget()->adjustSize();
> +
>  
>  	//have a Bible or commentary in the modules?
>  	bool enable = false;
> @@ -716,33 +534,8 @@
>  	const QString rep2("</span>");
>  	const unsigned int repLength = rep1.length() + rep1.length();
>  
> -   if (searchedText.find("strong:", 0) == 0)
> -      {
> -      int idx1, idx2;
> -      QString sNumber, lemmaText;
> -      const QString rep3("style=\"background-color:#FFFF66;\" ");
> -      const unsigned int rep3Length = rep3.length();
> -      // get the strongs number from the search text
> -      sNumber = searchedText.right(searchedText.length() - 7);
> -      // find all the "lemma=" inside the the content
> -      while((index = ret.find("lemma=", index, cs)) != -1)
> -         {
> -         // get the strongs number after the lemma and compare it with the
> -         // strongs number we are looking for
> -         idx1 = ret.find("\"", index) + 1;
> -         idx2 = ret.find("\"", idx1 + 1);
> -         lemmaText = ret.mid(idx1, idx2 - idx1);
> -         if (lemmaText.find(sNumber) >= 0)
> -            {
> -            // strongs number is found now we need to highlight it
> -            // I believe the easiest way is to insert rep3 just before "lemma="
> -            ret = ret.insert(index, rep3);
> -            index += rep3Length;
> -            }
> -         index += 6; // 6 is the length of "lemma="
> -         }
> -      }
> -	else if (searchFlags & CSwordModuleSearch::exactPhrase) { //exact phrase matching
> +
> +	if (searchFlags & CSwordModuleSearch::exactPhrase) { //exact phrase matching
>  		while ( (index = ret.find(searchedText, index, cs)) != -1 ) {
>  			if (!CToolClass::inHTMLTag(index, ret)) {
>  				ret = ret.insert( index+length, rep2 );
> @@ -797,9 +590,6 @@
>  			m_resultListBox, SLOT(setupTree(CSwordModuleInfo*)));
>  	connect(m_moduleListBox, SIGNAL(moduleChanged()),
>  			m_previewDisplay->connectionsProxy(), SLOT(clear()));
> -   // connect the strongs list
> -   connect(m_moduleListBox, SIGNAL(strongsSelected(CSwordModuleInfo*, QStringList*)),
> -         m_resultListBox, SLOT(setupStrongsTree(CSwordModuleInfo*, QStringList*)));
>  }
>  
>  /** Shows a dialog with the search analysis of the current search. */
> @@ -834,9 +624,7 @@
>  			found = true;
>  		}
>  	}
> -   // This is needed because in the for loop i is incremented before the comparison (++i)
> -   // As a result the index i is actually one greater than expected.
> -   i--;
> +
>  	if (!found) {
>  		i = 0;
>  		m_searchTextCombo->insertItem( text,0 );
> @@ -850,8 +638,7 @@
>  /** Initializes this page. */
>  void CSearchOptionsPage::initView() {
>  
> -   // I commented this out because the Search Option page looks better when it resizes.
> -	//this->setSizePolicy( QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed) );
> +	this->setSizePolicy( QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed) );
>  
>  	QWidget* insideFrame = new QWidget( this );
>  	QBoxLayout* vLayout = new QBoxLayout( insideFrame, QBoxLayout::Down);
> diff -U 3 -H -d -r -N -- bibletime-new/bibletime/frontend/searchdialog/csearchdialogpages.h bibletime-cvs/bibletime/frontend/searchdialog/csearchdialogpages.h
> --- bibletime-new/bibletime/frontend/searchdialog/csearchdialogpages.h	2006-01-15 18:36:58.000000000 -0700
> +++ bibletime-cvs/bibletime/frontend/searchdialog/csearchdialogpages.h	2006-01-02 10:26:07.000000000 -0700
> @@ -30,86 +30,6 @@
>  
>  class CReadDisplay;
>  
> -/**
> -* This class is used to keep track of the text strongs results.
> -* It only keeps track of one instance of a strongs text result.
> -*
> -*    The functions of the class are:
> -*       - Store an instance of a strongs text result.
> -*       - Each strongs text result will contain a list of verses (keyNames).
> -*       - The number of verses (keyNames) is returned by keyCount().
> -*       - The text for the strongs text result is returned by keyText().
> -*       - The list of verses (keyNames) is returned by getKeyList() [as QStringList].
> -*
> -*   To add a new verse to a strongs text result use addKeyName.
> -*/
> -class StrongsResult
> -   {
> -   public:
> -      StrongsResult() : text("") { keyNameList.clear(); }
> -      StrongsResult(const QString& text, const QString &keyName)
> -         : text(text)
> -         { keyNameList.clear(); keyNameList.append(keyName); }
> -
> -      QString keyText() const { return text; }
> -      int keyCount() const { return keyNameList.count(); }
> -      void addKeyName(const QString& keyName) { keyNameList.append(keyName); }
> -      QStringList* getKeyList() { return &keyNameList; }
> -
> -      /* ????
> -      bool operator==(const StrongsResult &l, const StrongsResult &r)
> -         { return (l.keyText() == r.keyText()); }
> -
> -      bool operator<(const StrongsResult &l, const StrongsResult &r)
> -         { return (l->keyText() < r->keyText()); }
> -
> -      bool operator>(const StrongsResult &l, const StrongsResult &r)
> -         { return (l->keyText() > r->keyText()); }
> -      */
> -   private:
> -      QString text;
> -      QStringList keyNameList;
> -   };
> -
> -typedef QValueList<StrongsResult> StrongsResultList;
> -
> -/**
> -* This class is used to keep track of the text strongs results.
> -* It keeps track of all instances of all strongs text results.
> -* This class makes use of the above class StrongsResult.
> -*
> -*    The functions of the class are:
> -*       - Store an instance of a strongs text result.
> -*       - Each strongs text result will contain a list of verses (keyNames).
> -*       - The number of verses (keyNames) is returned by keyCount().
> -*       - The text for the strongs text result is returned by keyText().
> -*       - The list of verses (keyNames) is returned by getKeyList() [as QStringList].
> -*
> -*   To add a new verse to a strongs text result use addKeyName.
> -*/
> -class StrongsResultClass
> -   {
> -   public:
> -      StrongsResultClass(CSwordModuleInfo* module, const QString& strongsNumber)
> -         : srModule(module), lemmaText(strongsNumber)
> -         { initStrongsResults(); }
> -
> -      QString keyText(int index) const { return srList[index].keyText(); }
> -      int keyCount(int index) const { return srList[index].keyCount(); }
> -      QStringList* getKeyList(int index) { return srList[index].getKeyList(); }
> -      int Count() const { return srList.count(); }
> -
> -   private:
> -      void initStrongsResults(void);
> -      QString getStrongsNumberText(const QString& verseContent, int *startIndex);
> -
> -      StrongsResultList srList;
> -      CSwordModuleInfo* srModule;
> -      QString lemmaText;
> -   };
> -
> -
> -
>  class CModuleResultView : public KListView {
>  	Q_OBJECT
>  public:
> @@ -118,7 +38,7 @@
>  	/**
>  	* Setups the tree using the given list of modules.
>  	*/
> -	void setupTree( ListCSwordModuleInfo modules, const QString& searchedText );
> +	void setupTree( ListCSwordModuleInfo modules );
>  	/**
>  	* Returns the currently active module.
>  	*/
> @@ -134,8 +54,6 @@
>  	*/
>  	void initConnections();
>  
> -   void setupStrongsResults(CSwordModuleInfo* module, QListViewItem* parent, const QString& searchedText);
> -
>  protected slots: // Protected slots
>  	/**
>  	* Is executed when an item was selected in the list.
> @@ -169,7 +87,6 @@
>  signals:
>  	void moduleSelected(CSwordModuleInfo*);
>  	void moduleChanged();
> -   void strongsSelected(CSwordModuleInfo*, QStringList*);
>  
>  private:
>  	struct {
> @@ -196,7 +113,6 @@
>  	}
>  	m_actions;
>  	KPopupMenu* m_popup;
> -   StrongsResultClass* strongsResults;
>  };
>  
>  class CSearchResultView  : public KListView {
> @@ -221,7 +137,6 @@
>  	* Setups the list with the given module.
>  	*/
>  	void setupTree(CSwordModuleInfo*);
> -   void setupStrongsTree(CSwordModuleInfo*, QStringList*);
>  	void copyItemsWithText();
>  	void copyItems();
>  	void saveItemsWithText();
> 
> 
> ------------------------------------------------------------------------
> 
> /********* Read the file LICENSE for license details. *********/
> 
> #include "csearchdialog.h"
> #include "csearchanalysis.h"
> #include "backend/cswordmodulesearch.h"
> 
> 
> #include "backend/cswordkey.h"
> #include "backend/cswordversekey.h"
> 
> #include "frontend/cbtconfig.h"
> 
> #include "util/cresmgr.h"
> #include "util/ctoolclass.h"
> 
> //Qt includes
> #include <qhbox.h>
> #include <qvbox.h>
> #include <qptrlist.h>
> #include <qpainter.h>
> #include <qlayout.h>
> #include <qmap.h>
> #include <qlineedit.h>
> #include <qtextedit.h>
> #include <qlabel.h>
> #include <qsizepolicy.h>
> #include <qpushbutton.h>
> #include <qheader.h>
> #include <qregexp.h>
> #include <qmessagebox.h>
> 
> //KDE includes
> #include <kapplication.h>
> #include <kfiledialog.h>
> #include <klocale.h>
> #include <kiconloader.h>
> 
> static CSearchDialog* m_staticDialog = 0;
> 
> void CSearchDialog::openDialog(const ListCSwordModuleInfo modules, const QString& searchText, QWidget* parentDialog) {
> 	if (!m_staticDialog) {
> 		m_staticDialog = new CSearchDialog(parentDialog);
> 	};
> 	m_staticDialog->reset();
> 
> 	if (modules.count()) {
> 		m_staticDialog->setModules(modules);
> 	}
> 	else {
> 		m_staticDialog->showModulesSelector();
> 	}
> 
> 	m_staticDialog->setSearchText(searchText);
> 	if (m_staticDialog->isHidden()) {
> 		m_staticDialog->show();
> 	}
> 
> 	m_staticDialog->raise();
> 
>    // this is needed to make the dialog box adjust properly.
>    // without it the search and close buttons are hidden.
>    m_staticDialog->adjustSize();
> 
> 	if (modules.count() && !searchText.isEmpty()) {
> 		m_staticDialog->startSearch();
> 	}
> };
> 
> CSearchDialog* const CSearchDialog::getSearchDialog() {
> 	Q_ASSERT(m_staticDialog);
> 	return m_staticDialog;
> };
> 
> CSearchDialog::CSearchDialog(QWidget *parent)
> : KDialogBase(Plain, i18n("Search dialog"), Close | User1, User1, parent, "CSearchDialog", false, true, i18n("Search")) {
> 
> 	setWFlags( getWFlags() | Qt::WStyle_MinMax );
> 	setIcon(CResMgr::searchdialog::icon);
> 
> 	m_searcher.connectFinished( this, SLOT(searchFinished()));
> 
> 	initView();
> 	initConnections();
> }
> 
> // CSearchDialog::~CSearchDialog(){
> // }
> 
> /** Starts the search with the set modules and the set search text. */
> void CSearchDialog::startSearch() {
> 	QString searchText(m_searchOptionsPage->searchText());
> 
> 	if (searchText.isEmpty()) {
> 		return;
> 	}
> 
> 	// check that we have the indices we need for searching
> 	if (!m_searcher.modulesHaveIndices( modules() ) )	{
> 		int result = QMessageBox::question(this, i18n("Missing indices"),
> 			i18n("One or more modules need indexing before they can be searched.\n"
> 			"This could take a long time. Proceed with indexing?"),
>       	QMessageBox::Yes | QMessageBox::Default,
>          QMessageBox::No | QMessageBox::Escape);
>       // The result is 0 for Yes/Ok and 1 for No/Cancel.
>       // It does not seem to matter what the two button constants are.
>       // I have tried Yes/No, Ok/Cancel and they both show a Yes/No dialog with
>       // Yes on the left and No on the right.  When Yes is clicked the result is 0,
>       // when No is clicked the result is 1.
> 		if (result == 0) {
> 			// FIXME - add a proper progress dialog for indexing
> 			m_searcher.indexModules( modules() );
> 		}
> 		else {
> 			return;
> 		}
> 	}
> 
> 	m_searchResultPage->reset();
> 
> 	int searchFlags = m_searchOptionsPage->searchFlags();
> 
> 	const CSwordModuleSearch::scopeType scopeType = m_searchOptionsPage->scopeType();
> 	if (scopeType == CSwordModuleSearch::Scope_LastSearch) {
> 		searchFlags |= CSwordModuleSearch::useLastResult;
> 	}
> 	else if ( (scopeType == CSwordModuleSearch::Scope_Bounds)
> 			  && strlen(m_searchOptionsPage->searchScope().getRangeText())) {
> 		//we need the scope flag and a valid scope!
> 		searchFlags |= CSwordModuleSearch::useScope;
> 		m_searcher.setSearchScope( m_searchOptionsPage->searchScope() );
> 	}
> 
> 	m_searcher.setModules( modules() );
> 	m_searcher.setSearchedText(searchText);
> 	m_searcher.setSearchOptions(searchFlags);
> 
> 	m_searcher.startSearch();
> }
> 
> /** Starts the search with the given module list and given search text. */
> void CSearchDialog::startSearch( const ListCSwordModuleInfo modules, const QString& searchText) {
> 	m_searchResultPage->reset();
> 	m_searchOptionsPage->reset();
> 	setModules(modules);
> 	setSearchText(searchText);
> 
> 	startSearch();
> }
> 
> /** Returns the list of used modules. */
> const ListCSwordModuleInfo CSearchDialog::modules() {
> 	return m_searchOptionsPage->modules();
> }
> 
> /** Sets the list of modules for the search. */
> void CSearchDialog::setModules( const ListCSwordModuleInfo modules ) {
> 	m_searchOptionsPage->setModules(modules);
> 	resize( sizeHint() );
> }
> 
> /** Returns the search text which is set currently. */
> const QString CSearchDialog::searchText() {
> 	return m_searchOptionsPage->searchText();
> }
> 
> sword::ListKey CSearchDialog::searchScope() {
> 	return m_searchOptionsPage->searchScope();
> };
> 
> /** Returns true if the search used a scope, otherwise false. */
> const CSwordModuleSearch::scopeType CSearchDialog::searchScopeType() const {
> 	return m_searchOptionsPage->scopeType();
> }
> 
> /** Returns true if the search used a scope, otherwise false. */
> const int CSearchDialog::searchFlags() const {
> 	return m_searchOptionsPage->searchFlags();
> }
> 
> /** Returns the search text which is used for the search. */
> void CSearchDialog::setSearchText( const QString searchText ) {
> 	m_searchOptionsPage->setSearchText(searchText);
> }
> 
> /** Initializes this object. */
> void CSearchDialog::initView() {
> 	setButtonTip(User1, CResMgr::searchdialog::searchButton::tooltip);
> 
>    // this is to get the search results page to have a sane default size.
>    // there might be a better fix but I don't know of one.
>    setInitialSize(QSize(575, 200));
> 
> 	QVBoxLayout* box = new QVBoxLayout (plainPage());
> 	box->setSpacing(3);
> 
> 	m_searchOptionsPage = new CSearchOptionsPage(plainPage());
> 	box->addWidget( m_searchOptionsPage );
> 
> 	m_searchResultPage = new CSearchResultPage(plainPage());
> 	box->addWidget( m_searchResultPage );
> 
> }
> 
> void CSearchDialog::searchFinished() {
> // 	qWarning("CSearchDialog::searchFinished()");
> 	if ( m_searcher.foundItems() ) {
> 		m_searchResultPage->setSearchResult(modules());
> 	}
> 	else
> 		m_searchResultPage->reset();
> }
> 
> void CSearchDialog::showModulesSelector() {
> 	m_searchOptionsPage->chooseModules();
> }
> 
> /** Initializes the signal slot connections */
> void CSearchDialog::initConnections() {
> 	connect(this, SIGNAL(user1Clicked()), SLOT(startSearch()));
> 	connect(this, SIGNAL(closeClicked()), SLOT(slotDelayedDestruct()));
> }
> 
> /** Resets the parts to the default. */
> void CSearchDialog::reset() {
> 	m_searchOptionsPage->reset();
> 	m_searchResultPage->reset();
> }
> 
> /** Reimplementation. */
> void CSearchDialog::slotClose() {
> 	delayedDestruct();
> 	m_staticDialog = 0;
> }
> 
> 
> ------------------------------------------------------------------------
> 
> /********* Read the file LICENSE for license details. *********/
> 
> #include "csearchdialogpages.h"
> 
> #include "csearchdialog.h"
> #include "csearchanalysis.h"
> #include "crangechooser.h"
> 
> #include "backend/cswordversekey.h"
> #include "backend/cswordmoduleinfo.h"
> #include "backend/cdisplayrendering.h"
> 
> #include "frontend/cbtconfig.h"
> #include "frontend/cdragdropmgr.h"
> #include "frontend/cexportmanager.h"
> #include "frontend/display/cdisplay.h"
> #include "frontend/display/creaddisplay.h"
> 
> #include "util/cresmgr.h"
> #include "util/cpointers.h"
> #include "util/ctoolclass.h"
> 
> //Qt includes
> #include <qlayout.h>
> #include <qhbox.h>
> #include <qvbox.h>
> #include <qvgroupbox.h>
> #include <qlabel.h>
> #include <qlistview.h>
> #include <qpushbutton.h>
> #include <qradiobutton.h>
> #include <qsplitter.h>
> #include <qtooltip.h>
> #include <qbuttongroup.h>
> #include <qcheckbox.h>
> 
> #include <qheader.h>
> #include <qgroupbox.h>
> #include <qregexp.h>
> 
> //KDE includes
> #include <klocale.h>
> #include <kaction.h>
> #include <klistview.h>
> #include <kcombobox.h>
> #include <kprogress.h>
> #include <kpopupmenu.h>
> #include <ksqueezedtextlabel.h>
> #include <kparts/componentfactory.h> //KParts
> #include <kregexpeditorinterface.h>
> #include <ktextedit.h>
> #include <kiconloader.h>
> #include <kmessagebox.h>
> 
> 
> /********************************************
> ************  StrongsResultList *************
> ********************************************/
> void StrongsResultClass::initStrongsResults(void)
>    {
>    using namespace Rendering;
>    CDisplayRendering render;
>    ListCSwordModuleInfo modules;
>    CTextRendering::KeyTreeItem::Settings settings;
>    QString rText, lText, key;
>    bool found;
>    int sIndex;
>    int count;
>    int index;
>    QString text;
> 
>    modules.append(srModule);
>    sword::ListKey& result = srModule->searchResult();
> 
>    count = result.Count();
>    if (!count)
>       return;
> 
>    srList.clear();
> 
>    for (index = 0; index < count; index++)
>       {
>       key = QString::fromUtf8(result.GetElement(index)->getText());
>       text = render.renderSingleKey(key, modules, settings);
>       sIndex = 0;
>       while ((rText = getStrongsNumberText(text, &sIndex)) != "")
>          {
>          StrongsResultList::iterator it;
>          found = FALSE;
>          for ( it = srList.begin(); it != srList.end(); ++it )
>             {
>             lText = (*it).keyText();
>             if (lText == rText)
>                {
>                found = TRUE;
>                (*it).addKeyName(key);
>                break;
>                }
>             }
>          if (found == FALSE)
>             srList.append( StrongsResult(rText, key) );
>          }
>       }
>    //qHeapSort(srList);
>    }
> 
> QString StrongsResultClass::getStrongsNumberText(const QString& verseContent, int *startIndex)
>    {
>    // get the strongs text
>    int idx1, idx2, index;
>    QString sNumber, strongsText;
>    const bool cs = CSwordModuleSearch::caseSensitive;
> 
>    if (*startIndex == 0)
>       index = verseContent.find("<body", 0);
>    else
>       index = *startIndex;
>    // find all the "lemma=" inside the the content
>    while((index = verseContent.find("lemma=", index, cs)) != -1)
>       {
>       // get the strongs number after the lemma and compare it with the
>       // strongs number we are looking for
>       idx1 = verseContent.find("\"", index) + 1;
>       idx2 = verseContent.find("\"", idx1 + 1);
>       sNumber = verseContent.mid(idx1, idx2 - idx1);
>       if (sNumber.find(lemmaText) >= 0)
>          {
>          // strongs number is found now we need to get the text of this node
>          // search right until the ">" is found.  Get the text from here to
>          // the next "<".
>          index = verseContent.find(">", index, cs) + 1;
>          idx2  = verseContent.find("<", index, cs);
>          strongsText = verseContent.mid(index, idx2 - index);
>          index = idx2;
>          *startIndex = index;
>          return(strongsText);
>          }
>       else
>          {
>          index += 6; // 6 is the length of "lemma="
>          }
>       }
>    return("");
>    }
> 
> /********************************************
> ************  ModuleResultList **************
> ********************************************/
> 
> CSearchResultView::CSearchResultView(QWidget* parent) : KListView(parent), m_module(0) {
> 	initView();
> 	initConnections();
> };
> 
> CSearchResultView::~CSearchResultView() {}
> ;
> 
> /** Initializes the view of this widget. */
> void CSearchResultView::initView() {
> 	addColumn(i18n("Results"));
> 	setSorting(-1);
> 	setDragEnabled(true);
> 	setSelectionModeExt(KListView::Extended);
> 
> 	//setup the popup menu
> 	m_popup = new KPopupMenu(this);
> 
> 	m_actions.copyMenu = new KActionMenu(i18n("Copy..."), CResMgr::searchdialog::result::foundItems::copyMenu::icon, m_popup);
> 	m_actions.copy.result = new KAction(i18n("Reference only"), KShortcut(0), this, SLOT(copyItems()), this);
> 	m_actions.copyMenu->insert(m_actions.copy.result);
> 	m_actions.copy.resultWithText = new KAction(i18n("Reference with text"), KShortcut(0), this, SLOT(copyItemsWithText()), this);
> 	m_actions.copyMenu->insert(m_actions.copy.resultWithText);
> 	m_actions.copyMenu->plug(m_popup);
> 
> 	m_actions.saveMenu = new KActionMenu(i18n("Save..."),CResMgr::searchdialog::result::foundItems::saveMenu::icon, m_popup);
> 	m_actions.save.result = new KAction(i18n("Reference only"), KShortcut(0), this, SLOT(saveItems()), this);
> 	m_actions.saveMenu->insert(m_actions.save.result);
> 	m_actions.save.resultWithText = new KAction(i18n("Reference with text"), KShortcut(0), this, SLOT(saveItemsWithText()), this);
> 	m_actions.saveMenu->insert(m_actions.save.resultWithText);
> 	m_actions.saveMenu->plug(m_popup);
> 
> 	m_actions.printMenu = new KActionMenu(i18n("Print..."),CResMgr::searchdialog::result::foundItems::printMenu::icon, m_popup);
> 	m_actions.print.result = new KAction(i18n("Reference with text"), KShortcut(0), this, SLOT(printItems()), this);
> 	m_actions.printMenu->insert(m_actions.print.result);
> 	m_actions.printMenu->plug(m_popup);
> }
> 
> /** No descriptions */
> void CSearchResultView::initConnections() {
> 	//  connect(this, SIGNAL(executed(QListViewItem*)),
> 	//   this, SLOT(executed(QListViewItem*)));
> 	connect(this, SIGNAL(currentChanged(QListViewItem*)),
> 			this, SLOT(executed(QListViewItem*)));
> 
> 	connect(this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
> 			this, SLOT(showPopup(KListView*, QListViewItem*, const QPoint&)));
> }
> 
> /** Setups the list with the given module. */
> void CSearchResultView::setupTree(CSwordModuleInfo* m) {
> 	clear();
> 	if (!m) {
> 		return;
> 	}
> 
> 	m_module = m;
> 
> 	sword::ListKey& result = m->searchResult();
> 	const int count = result.Count();
> 	if (!count)
> 		return;
> 
> 	setUpdatesEnabled(false);
> 
> 	QListViewItem* oldItem = 0;
> 	KListViewItem* item = 0;
> 	for (int index = 0; index < count; index++) {
> 		item = new KListViewItem(this, oldItem);
> 		item->setText(0, QString::fromUtf8(result.GetElement(index)->getText()));
> 		oldItem = item;
> 	}
> 
> 	setUpdatesEnabled(true);
> 
> 	setSelected(firstChild(), true);
> 	executed(currentItem());
> }
> 
> void CSearchResultView::setupStrongsTree(CSwordModuleInfo* m, QStringList* vList)
> {
>    clear();
>    if (!m) {
>       return;
>    }
> 
>    m_module = m;
> 
>    if (vList->count() <= 0)
>       return;
> 
>    setUpdatesEnabled(false);
> 
>    KListViewItem* oldItem = 0;
>    KListViewItem* item = 0;
> 
>    for ( QStringList::Iterator it = vList->begin(); it != vList->end(); ++it )
>       {
>       item = new KListViewItem(this, oldItem);
>       item->setText(0, (*it));
>       oldItem = item;
>       }
> 
>    setUpdatesEnabled(true);
> 
>    setSelected(firstChild(), true);
>    executed(currentItem());
> }
> 
> /** Is connected to the signal executed, which is emitted when a mew item was chosen. */
> void CSearchResultView::executed(QListViewItem* item) {
> 	//  Q_ASSERT(item);
> 	//  qWarning("executed");
> 	emit keySelected(item->text(0));
> }
> 
> /** Reimplementation to show the popup menu. */
> void CSearchResultView::showPopup(KListView*, QListViewItem*, const QPoint& point) {
> 	m_popup->exec(point);
> }
> 
> /** No descriptions */
> void CSearchResultView::printItems() {
> 	QPtrList<QListViewItem> items = selectedItems();
> 	CExportManager mgr(i18n("Print search result..."), true, i18n("Printing search result"));
> 
> 	QStringList list;
> 	for (QListViewItem* k = items.first(); k; k = items.next()) {
> 		list.append( k->text(0) );
> 	};
> 	mgr.printKeyList( list, module() );
> }
> 
> /** No descriptions */
> void CSearchResultView::saveItems() {
> 	CExportManager mgr(i18n("Save search result..."), true, i18n("Saving search result"));
> 
> 	CSwordModuleInfo* m = module();
> 	CSwordKey* k = 0;
> 	QPtrList<QListViewItem> items = selectedItems();
> 	QPtrList<CSwordKey> keys;
> 	for (QListViewItem* i = items.first(); i; i = items.next()) {
> 		k = CSwordKey::createInstance( m );
> 		k->key(i->text(0));
> 		keys.append( k );
> 	};
> 	mgr.saveKeyList( keys, CExportManager::Text, false);
> 
> 	keys.setAutoDelete(true);
> 	keys.clear(); //delete all the keys we created
> }
> 
> /** No descriptions */
> void CSearchResultView::saveItemsWithText() {
> 	CExportManager mgr(i18n("Save search result..."), true, i18n("Saving search result"));
> 
> 	CSwordModuleInfo* m = module();
> 	CSwordKey* k = 0;
> 	QPtrList<QListViewItem> items = selectedItems();
> 	QPtrList<CSwordKey> keys;
> 	for (QListViewItem* i = items.first(); i; i = items.next()) {
> 		k = CSwordKey::createInstance( m );
> 		k->key(i->text(0));
> 		keys.append( k );
> 	};
> 	mgr.saveKeyList( keys, CExportManager::Text, true);
> 
> 	keys.setAutoDelete(true);
> 	keys.clear(); //delete all the keys we created
> }
> 
> /** No descriptions */
> void CSearchResultView::copyItems() {
> 	CExportManager mgr(i18n("Copy search result..."), true, i18n("Copying search result"));
> 
> 	CSwordModuleInfo* m = module();
> 	CSwordKey* k = 0;
> 	QPtrList<QListViewItem> items = selectedItems();
> 	QPtrList<CSwordKey> keys;
> 	for (QListViewItem* i = items.first(); i; i = items.next()) {
> 		k = CSwordKey::createInstance( m );
> 		k->key(i->text(0));
> 		keys.append( k );
> 	};
> 	mgr.copyKeyList( keys, CExportManager::Text, false);
> 
> 	keys.setAutoDelete(true);
> 	keys.clear(); //delete all the keys we created
> }
> 
> /** No descriptions */
> void CSearchResultView::copyItemsWithText() {
> 	CExportManager mgr(i18n("Copy search result..."), true, i18n("Copying search result"));
> 
> 	CSwordModuleInfo* m = module();
> 	CSwordKey* k = 0;
> 	QPtrList<QListViewItem> items = selectedItems();
> 	QPtrList<CSwordKey> keys;
> 	for (QListViewItem* i = items.first(); i; i = items.next()) {
> 		k = CSwordKey::createInstance( m );
> 		k->key(i->text(0));
> 		keys.append( k );
> 	};
> 	mgr.copyKeyList( keys, CExportManager::Text, true);
> 
> 	keys.setAutoDelete(true);
> 	keys.clear(); //delete all the keys we created
> }
> 
> /** Returns the module which is currently used. */
> CSwordModuleInfo* const CSearchResultView::module() {
> 	return m_module;
> }
> 
> QDragObject* CSearchResultView::dragObject() {
> 	//return a valid DragObject to make DnD possible!
> 
> 	/*
> 	* First get all selected items and fill with them the dndItems list. The return the QDragObject we got from CDRagDropMgr
> 	*/
> 	CDragDropMgr::ItemList dndItems;
> 
> 	QPtrList<QListViewItem> items = selectedItems();
> 	for (items.first(); items.current(); items.next()) {
> 		dndItems.append( CDragDropMgr::Item(m_module->name(), items.current()->text(0), QString::null) ); //no description
> 	};
> 
> 	return CDragDropMgr::dragObject(dndItems, viewport());
> };
> 
> /********************************************
> ************  ModuleResultList **************
> ********************************************/
> 
> CModuleResultView::CModuleResultView(QWidget* parent) : KListView(parent) {
> 	initView();
> 	initConnections();
>    strongsResults = NULL;
> };
> 
> CModuleResultView::~CModuleResultView() {}
> ;
> 
> /** Initializes this widget. */
> void CModuleResultView::initView() {
> 	addColumn(i18n("Work"));
> 	addColumn(i18n("Hits"));
> 
> 	//  setFullWidth(true);
> 	setSorting(0, true);
> 	setSorting(1, true);
> 	setAllColumnsShowFocus(true);
> 
> 
> 	//setup the popup menu
> 	m_popup = new KPopupMenu(this);
> 	// m_popup->insertTitle(i18n("Bible window"));
> 
> 	m_actions.copyMenu = new KActionMenu(i18n("Copy..."), CResMgr::searchdialog::result::moduleList::copyMenu::icon, m_popup);
> 	m_actions.copy.result = new KAction(i18n("Reference only"), KShortcut(0), this, SLOT(copyResult()), this);
> 	m_actions.copyMenu->insert(m_actions.copy.result);
> 	m_actions.copy.resultWithText = new KAction(i18n("Reference with text"), KShortcut(0), this, SLOT(copyResultWithText()), this);
> 	m_actions.copyMenu->insert(m_actions.copy.resultWithText);
> 	m_actions.copyMenu->plug(m_popup);
> 
> 	m_actions.saveMenu = new KActionMenu(i18n("Save..."), CResMgr::searchdialog::result::moduleList::saveMenu::icon, m_popup);
> 	m_actions.save.result = new KAction(i18n("Reference only"), KShortcut(0), this, SLOT(saveResult()), this);
> 	m_actions.saveMenu->insert(m_actions.save.result);
> 	m_actions.save.resultWithText = new KAction(i18n("Reference with text"), KShortcut(0), this, SLOT(saveResultWithText()), this);
> 	m_actions.saveMenu->insert(m_actions.save.resultWithText);
> 	m_actions.saveMenu->plug(m_popup);
> 
> 	m_actions.printMenu = new KActionMenu(i18n("Print..."), CResMgr::searchdialog::result::moduleList::printMenu::icon, m_popup);
> 	m_actions.print.result = new KAction(i18n("Reference with text"), KShortcut(0), this, SLOT(printResult()), this);
> 	m_actions.printMenu->insert(m_actions.print.result);
> 
> 
> 	m_actions.printMenu->plug(m_popup);
> }
> 
> /** Initializes the connections of this widget, */
> void CModuleResultView::initConnections() {
> 	connect(this, SIGNAL(executed(QListViewItem*)),
> 			SLOT(executed(QListViewItem*)));
> 	connect(this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
> 			this, SLOT(showPopup(KListView*, QListViewItem*, const QPoint&)));
> }
> 
> /** Setups the tree using the given list of modules. */
> void CModuleResultView::setupTree( ListCSwordModuleInfo modules, const QString& searchedText ) {
> 	clear();
> 	QListViewItem* item = 0;
> 	QListViewItem* oldItem = 0;
> 	sword::ListKey result;
> 
>    if (strongsResults) {
>       delete(strongsResults);
>       strongsResults = NULL;
>       }
> 	ListCSwordModuleInfo::iterator end_it = modules.end();
> 	for (ListCSwordModuleInfo::iterator it(modules.begin()); it != end_it; ++it) {
> 		//   for (modules.first(); modules.current(); modules.next()) {
> 		result = (*it)->searchResult();
> 
> 		item = new KListViewItem(this, (*it)->name(), QString::number(result.Count()) );
> 		item->setPixmap(0,CToolClass::getIconForModule(*it) );
> 		oldItem = item;
>       if (searchedText.find("strong:", 0) == 0) {
>          QString sNumber;
>          sNumber = searchedText.right(searchedText.length() - 7);
>          setupStrongsResults((*it), item, sNumber);
>          item->setOpen(TRUE);
>       }
> 	};
> 
> 	setSelected(currentItem(), true);
> 	executed(currentItem());
> }
> 
> void CModuleResultView::setupStrongsResults(CSwordModuleInfo* module, QListViewItem* parent,
>                                             const QString& sNumber)
>    {
>    QString lText;
>    KListViewItem* item = 0;
> 
>    strongsResults = new StrongsResultClass(module, sNumber);
> 
>    for (int cnt = 0; cnt < strongsResults->Count(); cnt++)
>       {
>       lText = strongsResults->keyText(cnt);
>       item = new KListViewItem(parent, lText, QString::number(strongsResults->keyCount(cnt)));
>       item->setText(0, lText);
>       }
>    }
> 
> 
> /** Is executed when an item was selected in the list. */
> void CModuleResultView::executed( QListViewItem* i ) {
>    QString itemText, lText;
> 
> 	if (CSwordModuleInfo* m = CPointers::backend()->findModuleByName(i->text(0))) {
> 		emit moduleChanged();
> 		emit moduleSelected(m);
>       return;
> 	}
>    if (!strongsResults)
>       return;
> 
>    itemText = i->text(0);
>    for (int cnt = 0; cnt < strongsResults->Count(); cnt++)
>       {
>       lText = strongsResults->keyText(cnt);
>       if (lText == itemText)
>          {
>          //clear the verses list
>          emit moduleChanged();
>          emit strongsSelected(activeModule(), strongsResults->getKeyList(cnt));
>          return;
>          }
>       }
> }
> 
> /** Returns the currently active module. */
> CSwordModuleInfo* const CModuleResultView::activeModule() {
> 	Q_ASSERT(currentItem());
>    QListViewItem* item = currentItem();
> 
>    if (item == NULL)
>       return 0;
> 
>    // we need to find the parent most node because that is the node
>    // that is the module name.
>    while (item->parent())
>       item = item->parent();
> 
>    if (item)
>       return CPointers::backend()->findModuleByName(item->text(0));
> 
>    return 0;
> }
> 
> /** No descriptions */
> void CModuleResultView::showPopup(KListView*, QListViewItem*, const QPoint& point) {
> 	//make sure that all entries have the correct status
> 	m_popup->exec(point);
> }
> 
> /** Copies the whole search result into the clipboard. */
> void CModuleResultView::copyResult() {
> 	if (CSwordModuleInfo* m = activeModule()) {
> 		sword::ListKey result = m->searchResult();
> 		CExportManager mgr(i18n("Copy search result..."), true, i18n("Copying search result"));
> 		mgr.copyKeyList(&result,m,CExportManager::Text,false);
> 	};
> }
> 
> /** Copies the whole search result with the text into the clipboard. */
> void CModuleResultView::copyResultWithText() {
> 	if (CSwordModuleInfo* m = activeModule()) {
> 		sword::ListKey result = m->searchResult();
> 		CExportManager mgr(i18n("Copy search result..."), true, i18n("Copying search result"));
> 		mgr.copyKeyList(&result,m,CExportManager::Text,true);
> 	};
> }
> 
> /** Saves the search result keys. */
> void CModuleResultView::saveResult() {
> 	if (CSwordModuleInfo* m = activeModule()) {
> 		sword::ListKey result = m->searchResult();
> 		CExportManager mgr(i18n("Save search result..."), true, i18n("Saving search result"));
> 		mgr.saveKeyList(&result,m,CExportManager::Text,false);
> 	};
> }
> 
> /** Saves the search result with it's text. */
> void CModuleResultView::saveResultWithText() {
> 	if (CSwordModuleInfo* m = activeModule()) {
> 		sword::ListKey result = m->searchResult();
> 		CExportManager mgr(i18n("Save search result..."), true, i18n("Saving search result"));
> 		mgr.saveKeyList(&result,m,CExportManager::Text,true);
> 	};
> }
> 
> /** Appends the whole search result to the printer queue. */
> void CModuleResultView::printResult() {
> 	if (CSwordModuleInfo* m = activeModule()) {
> 		sword::ListKey result = m->searchResult();
> 		CExportManager mgr(i18n("Print search result..."), true, i18n("Printing search result"));
> 		mgr.printKeyList(&result,m);
> 	};
> }
> 
> /********************************************
> **********  CSearchDialogResultPage *********
> ********************************************/
> 
> CSearchResultPage::CSearchResultPage(QWidget *parent, const char *name ) : 
> 		QVGroupBox(i18n("Search results"),parent,name) {
> 	initView();
> 	initConnections();
> }
> 
> CSearchResultPage::~CSearchResultPage() {}
> 
> /** Initializes the view of this widget. */
> void CSearchResultPage::initView() {
> 
> 	QWidget* insideFrame = new QWidget( this );
> 
>    QVBoxLayout* mainLayout = new QVBoxLayout(insideFrame);
> 
>    QSplitter* splitter = new QSplitter(Vertical, insideFrame);
>    mainLayout->addWidget(splitter);
> 
>    QSplitter* hSplitter = new QSplitter(Horizontal, splitter);
> 
>    m_moduleListBox = new CModuleResultView(hSplitter);
> 
>    m_resultListBox = new CSearchResultView(hSplitter);
> 
>    hSplitter->setResizeMode(m_moduleListBox, QSplitter::FollowSizeHint);
>    hSplitter->setResizeMode(m_resultListBox, QSplitter::Stretch);
> 
>    m_previewDisplay = CDisplay::createReadInstance(0, splitter);
> 
>    m_moduleListBox->resize(m_moduleListBox->sizeHint());
>    splitter->setResizeMode(hSplitter, QSplitter::KeepSize);
>    splitter->setResizeMode(m_previewDisplay->view(), QSplitter::Stretch);
> 
>    m_analyseButton = new QPushButton(i18n("Show search analysis"), this);
>    connect(m_analyseButton, SIGNAL(clicked()), SLOT(showAnalysis()));
>    mainLayout->addSpacing(5);
>    mainLayout->addWidget(m_analyseButton);
> }
> 
> /** Sets the modules which contain the result of each. */
> void CSearchResultPage::setSearchResult(ListCSwordModuleInfo modules) {
>    const QString searchedText = CSearchDialog::getSearchDialog()->searchText();
> 	reset(); //clear current modules
> 
> 
> 	m_modules = modules;
> 	m_moduleListBox->setupTree(modules, searchedText);
> 
> 	//have a Bible or commentary in the modules?
> 	bool enable = false;
> 	//   for (modules.first(); !enable && modules.current(); modules.next()) {
> 	ListCSwordModuleInfo::iterator end_it = modules.end();
> 	for (ListCSwordModuleInfo::iterator it(modules.begin()); it != end_it; ++it) {
> 		if ((*it)->type() == CSwordModuleInfo::Bible ) {
> 			enable = true;
> 			break;
> 		};
> 	};
> 
> 	m_analyseButton->setEnabled(enable);
> }
> 
> 
> /** Resets the current list of modules and the displayed list of found entries. */
> void CSearchResultPage::reset() {
> 	m_moduleListBox->clear();
> 	m_resultListBox->clear();
> 	m_previewDisplay->setText(QString::null);
> 	m_analyseButton->setEnabled(false);
> 	//   m_modules.setAutoDelete(false); //make sure we don't delete modules accidentally
> 	m_modules.clear();
> }
> 
> 
> /** Update the preview of the selected key. */
> void CSearchResultPage::updatePreview(const QString& key) {
> 	using namespace Rendering;
> 
> 	if ( CSwordModuleInfo* module = m_moduleListBox->activeModule() ) {
> 		const QString searchedText = CSearchDialog::getSearchDialog()->searchText();
> 		const int searchFlags = CSearchDialog::getSearchDialog()->searchFlags();
> 
> 		QString text;
> 		CDisplayRendering render;
> 		ListCSwordModuleInfo modules;
> 		modules.append(module);
> 
> 		CTextRendering::KeyTreeItem::Settings settings;
> 
> 		//for bibles only render 5 verses, for all other modules only one entry
> 		if (module->type() == CSwordModuleInfo::Bible) {
> 			CSwordVerseKey vk(module);
> 			vk.key(key);
> 
> 			//first go back and then go forward the keys to be in context
> 			vk.previous(CSwordVerseKey::UseVerse);
> 			vk.previous(CSwordVerseKey::UseVerse);
> 			const QString startKey = vk.key();
> 
> 			vk.key(key);
> 
> 			vk.next(CSwordVerseKey::UseVerse);
> 			vk.next(CSwordVerseKey::UseVerse);
> 			const QString endKey = vk.key();
> 
> 			//    qWarning("want to render from %s to %s", startKey.latin1(), endKey.latin1());
> 			//now render the range
> 			settings.keyRenderingFace = CTextRendering::KeyTreeItem::Settings::CompleteShort;
> 			text = render.renderKeyRange(startKey, endKey, modules, key, settings);
> 			//    qWarning(text.latin1());
> 		}
> 		else {
> 			text = render.renderSingleKey(key, modules, settings);
> 		}
> 
> 		m_previewDisplay->setText( highlightSearchedText(text, searchedText, searchFlags) );
> 		m_previewDisplay->moveToAnchor( CDisplayRendering::keyToHTMLAnchor(key) );
> 	}
> }
> 
> const QString CSearchResultPage::highlightSearchedText(const QString& content, const QString& searchedText, const int searchFlags) {
> 	QString ret = content;
> 
> 	const bool cs = (searchFlags & CSwordModuleSearch::caseSensitive);
> 
> 	//   int index = 0;
> 	int index = ret.find("<body", 0);
> 	int length = searchedText.length();
> 
> 	const QString rep1("<span style=\"background-color:#FFFF66;\">");
> 	const QString rep2("</span>");
> 	const unsigned int repLength = rep1.length() + rep1.length();
> 
>    if (searchedText.find("strong:", 0) == 0)
>       {
>       int idx1, idx2;
>       QString sNumber, lemmaText;
>       const QString rep3("style=\"background-color:#FFFF66;\" ");
>       const unsigned int rep3Length = rep3.length();
>       // get the strongs number from the search text
>       sNumber = searchedText.right(searchedText.length() - 7);
>       // find all the "lemma=" inside the the content
>       while((index = ret.find("lemma=", index, cs)) != -1)
>          {
>          // get the strongs number after the lemma and compare it with the
>          // strongs number we are looking for
>          idx1 = ret.find("\"", index) + 1;
>          idx2 = ret.find("\"", idx1 + 1);
>          lemmaText = ret.mid(idx1, idx2 - idx1);
>          if (lemmaText.find(sNumber) >= 0)
>             {
>             // strongs number is found now we need to highlight it
>             // I believe the easiest way is to insert rep3 just before "lemma="
>             ret = ret.insert(index, rep3);
>             index += rep3Length;
>             }
>          index += 6; // 6 is the length of "lemma="
>          }
>       }
> 	else if (searchFlags & CSwordModuleSearch::exactPhrase) { //exact phrase matching
> 		while ( (index = ret.find(searchedText, index, cs)) != -1 ) {
> 			if (!CToolClass::inHTMLTag(index, ret)) {
> 				ret = ret.insert( index+length, rep2 );
> 				ret = ret.insert( index, rep1 );
> 				index += repLength;
> 			}
> 			index += repLength;
> 		};
> 	}
> 	else if (searchFlags & CSwordModuleSearch::multipleWords) { //multiple words
> 		QStringList words = QStringList::split(" ", searchedText);
> 		for ( int wi = 0; (unsigned int)wi < words.count(); ++wi ) { //search for every word in the list
> 			QString word = words[ wi ];
> 			length = word.length();
> 			//       index = 0; //for every word start at the beginning
> 			index = ret.find("<body", 0);
> 			while ( (index = ret.find(word, index, cs)) != -1 ) { //while we found the word
> 				if (!CToolClass::inHTMLTag(index, ret)) {
> 					ret = ret.insert( index+length, rep2 );
> 					ret = ret.insert( index, rep1 );
> 					index += repLength;
> 				}
> 				index += length;
> 			}
> 		}
> 	}
> 	else { //multiple words or regular expression
> 		//use re as regular expression and replace any occurences
> 		QRegExp regExp( searchedText, cs );
> 		regExp.setMinimal( true );
> 
> 		while ( (index = regExp.search(ret, index)) != -1 ) {
> 			if (!CToolClass::inHTMLTag(index, ret)) {
> 				ret = ret.insert( index + regExp.matchedLength(), rep2 );
> 				ret = ret.insert( index, rep1 );
> 				index += regExp.matchedLength() + repLength;
> 			}
> 			index += length;
> 		}
> 	}
> 
> 	//   qWarning("\n\n\n%s", ret.latin1());
> 
> 	return ret; //not implemented yet
> };
> 
> /** Initializes the signal slot conections of the child widgets, */
> void CSearchResultPage::initConnections() {
> 	connect(m_resultListBox, SIGNAL(keySelected(const QString&)),
> 			this, SLOT(updatePreview(const QString&)));
> 	connect(m_moduleListBox, SIGNAL(moduleSelected(CSwordModuleInfo*)),
> 			m_resultListBox, SLOT(setupTree(CSwordModuleInfo*)));
> 	connect(m_moduleListBox, SIGNAL(moduleChanged()),
> 			m_previewDisplay->connectionsProxy(), SLOT(clear()));
>    // connect the strongs list
>    connect(m_moduleListBox, SIGNAL(strongsSelected(CSwordModuleInfo*, QStringList*)),
>          m_resultListBox, SLOT(setupStrongsTree(CSwordModuleInfo*, QStringList*)));
> }
> 
> /** Shows a dialog with the search analysis of the current search. */
> void CSearchResultPage::showAnalysis() {
> 	CSearchAnalysisDialog dlg(m_modules, this);
> 	dlg.exec();
> }
> 
> /*************************/
> 
> CSearchOptionsPage::CSearchOptionsPage(QWidget *parent, const char *name ) : 
> 		QVGroupBox(i18n("Search parameters"),parent,name) {
> 	initView();
> 	readSettings();
> }
> 
> CSearchOptionsPage::~CSearchOptionsPage() {
> 	saveSettings();
> }
> 
> /** Returns the search text set in this page. */
> const QString CSearchOptionsPage::searchText() {
> 	return m_searchTextCombo->currentText();
> }
> 
> /** Sets the search text used in the page. */
> void CSearchOptionsPage::setSearchText(const QString& text) {
> 	bool found = false;
> 	int i = 0;
> 	for (i = 0; !found && i < m_searchTextCombo->count(); ++i) {
> 		if (m_searchTextCombo->text(i) == text) {
> 			found = true;
> 		}
> 	}
>    // This is needed because in the for loop i is incremented before the comparison (++i)
>    // As a result the index i is actually one greater than expected.
>    i--;
> 	if (!found) {
> 		i = 0;
> 		m_searchTextCombo->insertItem( text,0 );
> 	}
> 
> 	m_searchTextCombo->setCurrentItem(i);
> 	m_searchTextCombo->reset();
> 	m_searchTextCombo->setFocus();
> }
> 
> /** Initializes this page. */
> void CSearchOptionsPage::initView() {
> 
>    // I commented this out because the Search Option page looks better when it resizes.
> 	//this->setSizePolicy( QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed) );
> 
> 	QWidget* insideFrame = new QWidget( this );
> 	QBoxLayout* vLayout = new QBoxLayout( insideFrame, QBoxLayout::Down);
> 	vLayout->setSpacing( 3 );
> 
> 	QHBoxLayout* hBox0 = new QHBoxLayout( vLayout );
> 
> 	QLabel* label = new QLabel(insideFrame);
> 	hBox0->addWidget(label);
> 	label->setText(i18n("Search for:"));
> 	
> 	m_searchTextCombo = new KHistoryCombo(insideFrame);
> 	hBox0->addWidget(m_searchTextCombo);
> 	hBox0->setStretchFactor(m_searchTextCombo, 10);
> 	label->setAutoResize(true);
> 	m_searchTextCombo->setInsertionPolicy( QComboBox::AtBottom );
> 	m_searchTextCombo->setMaxCount(25);
> 	m_searchTextCombo->setDuplicatesEnabled(false);
> 	m_searchTextCombo->setFocusPolicy(QWidget::WheelFocus);
> 	connect( m_searchTextCombo, SIGNAL(activated( const QString& )),
> 				m_searchTextCombo, SLOT( addToHistory( const QString& ))
> 			);
> 	connect( m_searchTextCombo, SIGNAL(returnPressed ( const QString& )),
> 				m_searchTextCombo, SLOT(addToHistory(const QString&))
> 			);
> 	QToolTip::add(m_searchTextCombo, CResMgr::searchdialog::options::searchedText::tooltip);
> 
> 	QPushButton* syntaxButton = new QPushButton(SmallIcon( "contexthelp"), "", insideFrame);
> 	hBox0->addWidget( syntaxButton );
> 	connect( syntaxButton, SIGNAL(clicked()), this, SLOT(syntaxHelp()));
> 
> 	QHBoxLayout* hBox1 = new QHBoxLayout(vLayout);
> 
> 	m_modulesLabel = new QLabel(insideFrame);
> 	hBox1->addWidget(m_modulesLabel);
> 	hBox1->setStretchFactor( m_modulesLabel, 5);
> 	hBox1->addStretch();
> 	m_modulesLabel->setTextFormat(Qt::RichText);
> 	m_modulesLabel->setAlignment( AlignLeft | WordBreak );
> 
> 	m_chooseModulesButton = new QPushButton(SmallIcon("wizard"), i18n("Choose"), insideFrame);
> 	hBox1->addWidget(m_chooseModulesButton);
> 	connect(m_chooseModulesButton, SIGNAL(clicked()),
> 			this, SLOT(chooseModules()));
> 	QToolTip::add
> 		(m_chooseModulesButton, CResMgr::searchdialog::options::moduleChooserButton::tooltip);
> 	
> 
> 	QHBoxLayout* hBox2 = new QHBoxLayout(vLayout);
> 
> 	QLabel* label2 = new QLabel(insideFrame);
> 	label2->setText(i18n("Search scope:"));
> 	hBox2->addWidget(label2);
> 	hBox2->addStretch();
> 	
> 	m_rangeChooserCombo = new KComboBox(insideFrame);
> 	hBox2->addWidget(m_rangeChooserCombo);
> 
> 	m_rangeChooserCombo->setMaximumWidth( 150 );
> 	QToolTip::add
> 		(m_rangeChooserCombo, CResMgr::searchdialog::options::chooseScope::tooltip);
> 	refreshRanges();
> 
> 	m_chooseRangeButton = new QPushButton(SmallIcon("configure"), i18n("Setup"), insideFrame);
> 	hBox2->addWidget(m_chooseRangeButton);
> 	connect(m_chooseRangeButton, SIGNAL(clicked()),
> 			this, SLOT(setupRanges()));
> 
> 	//set the initial focus
> 	m_searchTextCombo->setFocus();
> }
> 
> /** Sets the modules used by the search. */
> void CSearchOptionsPage::setModules( ListCSwordModuleInfo modules ) {
> 	QString t = i18n("Searching in: ");
> 
> 	m_modules.clear(); //remove old modules
> 	ListCSwordModuleInfo::iterator end_it = modules.end();
> 
> 	for (ListCSwordModuleInfo::iterator it(modules.begin()); it != end_it; ++it) {
> 		//ToDo:  Check for containsRef compat
> 		if (*it == 0) { //don't operate on null modules.
> 			continue;
> 		}
> 		
> 		if ( !m_modules.contains(*it) ) {
> 			m_modules.append( *it );
> 			t.append( (*it)->name() );
> 			if (*it != modules.last()) {
> 				t += QString::fromLatin1(", "); // so that it will become a readable list (WLC, LXX, GerLut...)
> 			}
> 		}
> 	};
> 	m_modulesLabel->setText(t);
> 	emit( sigSetSearchButtonStatus( (modules.count() != 0) ) );
> }
> 
> /** Opens the modules chooser dialog. */
> void CSearchOptionsPage::chooseModules() {
> 	CModuleChooserDialog* dlg = new CModuleChooserDialog(this, modules());
> 	connect(dlg, SIGNAL(modulesChanged(ListCSwordModuleInfo)),
> 			this, SLOT(setModules(ListCSwordModuleInfo)));
> 	dlg->exec();
> }
> 
> /** Returns the list of used modules. */
> const ListCSwordModuleInfo CSearchOptionsPage::modules() {
> 	return m_modules;
> }
> 
> /** Return the selected search type,. */
> const int CSearchOptionsPage::searchFlags() {
> 	// FIXME - remove this due to new index search
> 	int ret = CSwordModuleSearch::multipleWords; //"multiple words" is standard
> 	return ret;
> }
> 
> /** Sets all options back to the default. */
> void CSearchOptionsPage::reset() {
> 	m_rangeChooserCombo->setCurrentItem(0); //no scope
> 	m_searchTextCombo->clearEdit();
> }
> 
> /** Reads the settings for the searchdialog from disk. */
> void CSearchOptionsPage::saveSettings() {
> 	CBTConfig::set
> 		(CBTConfig::searchCompletionTexts, m_searchTextCombo->completionObject()->items());
> 	CBTConfig::set
> 		(CBTConfig::searchTexts, m_searchTextCombo->historyItems());
> }
> 
> /** Reads the settings of the last searchdialog session. */
> void CSearchOptionsPage::readSettings() {
> 	m_searchTextCombo->completionObject()->setItems( CBTConfig::get
> 				(CBTConfig::searchCompletionTexts) );
> 	m_searchTextCombo->setHistoryItems( CBTConfig::get
> 											(CBTConfig::searchTexts) );
> }
> 
> void CSearchOptionsPage::aboutToShow() {
> 	m_searchTextCombo->setFocus();
> }
> 
> /** No descriptions */
> void CSearchOptionsPage::setupRanges() {
> 	CRangeChooserDialog* chooser = new CRangeChooserDialog(this);
> 	chooser->exec();
> 
> 	refreshRanges();
> }
> 
> /** No descriptions */
> void CSearchOptionsPage::syntaxHelp() {
> 	QString syntax = i18n (
> 			"<p>Enter search terms separated by spaces.  By default the search "
> 			"function will return results that match any of the search terms. "
> 			"To search for all the terms separate the terms by AND.</p>"
> 			"<p>To search types other than the main text, enter the type followed "
> 			"by \":\", and then the search term.  For example, 'strong:H8077'.</p>"
> 			"<p>Types:<br><table>"
> 			"<tr><td>heading:</td><td>searches headings</td></tr>"
> 			"<tr><td>footnote:</td><td>searches footnotes</td></tr>"
> 			"<tr><td>strong:</td><td>searches Strong's Numbers</td></tr>"
> 			"<tr><td>morph:</td><td>searches Morphology entries</td></tr></table>"
> 			"For more help see: <a href=\"http://lucene.apache.org/java/docs/queryparsersyntax.html\">"
> 			"http://lucene.apache.org/java/docs/queryparsersyntax.html</a></p>");
> 
> 	KMessageBox::about( this, syntax, i18n("Basic Syntax Introduction"));
> }
> 
> 
> /** refreshes the listof ranges and the range combobox. */
> void CSearchOptionsPage::refreshRanges() {
> 	//the first two options are fixed, the others can be edited using the "Setup ranges" button.
> 	m_rangeChooserCombo->clear();
> 	m_rangeChooserCombo->insertItem(i18n("No search scope"));
> 	m_rangeChooserCombo->insertItem(i18n("Last search result"));
> 
> 	//insert the user-defined ranges
> 	CBTConfig::StringMap map = CBTConfig::get
> 								   (CBTConfig::searchScopes);
> 	CBTConfig::StringMap::Iterator it;
> 	for (it = map.begin(); it != map.end(); ++it) {
> 		m_rangeChooserCombo->insertItem(it.key());
> 	};
> }
> 
> /** Returns the selected search scope if a search scope was selected. */
> sword::ListKey CSearchOptionsPage::searchScope() {
> 	if (m_rangeChooserCombo->currentItem() > 1) { //neither "No Scope" nor "Last search result"
> 		CBTConfig::StringMap map = CBTConfig::get
> 									   (CBTConfig::searchScopes);
> 		QString scope = map[ m_rangeChooserCombo->currentText() ];
> 		if (!scope.isEmpty())
> 			return sword::VerseKey().ParseVerseList( (const char*)scope.utf8(), "Genesis 1:1", true);
> 	};
> 	return sword::ListKey();
> }
> 
> /** Returns the selected scope type. */
> const CSwordModuleSearch::scopeType CSearchOptionsPage::scopeType() {
> 	if (m_rangeChooserCombo->currentItem() == 0) {
> 		return CSwordModuleSearch::Scope_NoScope;
> 	}
> 	else if (m_rangeChooserCombo->currentItem() == 1) {
> 		return CSwordModuleSearch::Scope_LastSearch;
> 	}
> 	else {
> 		return CSwordModuleSearch::Scope_Bounds;
> 	};
> 
> 	return CSwordModuleSearch::Scope_NoScope;
> }
> 
> 
> ------------------------------------------------------------------------
> 
> /********* Read the file LICENSE for license details. *********/
> 
> #ifndef CSEARCHDIALOGPAGES_H
> #define CSEARCHDIALOGPAGES_H
> 
> //BibleTime includes
> #include "backend/cswordmoduleinfo.h"
> #include "backend/cswordbackend.h"
> #include "backend/cswordmodulesearch.h"
> 
> //Qt includes
> #include <qwidget.h>
> #include <qvgroupbox.h>
> 
> //KDE includes
> #include <klistview.h>
> 
> //forward declarations
> class QLabel;
> class QCheckBox;
> class QPushButton;
> class QRadioButton;
> 
> class KComboBox;
> class KActionMenu;
> class KAction;
> class KHistoryCombo;
> class KProgress;
> class KPopupMenu;
> 
> class CReadDisplay;
> 
> /**
> * This class is used to keep track of the text strongs results.
> * It only keeps track of one instance of a strongs text result.
> *
> *    The functions of the class are:
> *       - Store an instance of a strongs text result.
> *       - Each strongs text result will contain a list of verses (keyNames).
> *       - The number of verses (keyNames) is returned by keyCount().
> *       - The text for the strongs text result is returned by keyText().
> *       - The list of verses (keyNames) is returned by getKeyList() [as QStringList].
> *
> *   To add a new verse to a strongs text result use addKeyName.
> */
> class StrongsResult
>    {
>    public:
>       StrongsResult() : text("") { keyNameList.clear(); }
>       StrongsResult(const QString& text, const QString &keyName)
>          : text(text)
>          { keyNameList.clear(); keyNameList.append(keyName); }
> 
>       QString keyText() const { return text; }
>       int keyCount() const { return keyNameList.count(); }
>       void addKeyName(const QString& keyName) { keyNameList.append(keyName); }
>       QStringList* getKeyList() { return &keyNameList; }
> 
>       /* ????
>       bool operator==(const StrongsResult &l, const StrongsResult &r)
>          { return (l.keyText() == r.keyText()); }
> 
>       bool operator<(const StrongsResult &l, const StrongsResult &r)
>          { return (l->keyText() < r->keyText()); }
> 
>       bool operator>(const StrongsResult &l, const StrongsResult &r)
>          { return (l->keyText() > r->keyText()); }
>       */
>    private:
>       QString text;
>       QStringList keyNameList;
>    };
> 
> typedef QValueList<StrongsResult> StrongsResultList;
> 
> /**
> * This class is used to keep track of the text strongs results.
> * It keeps track of all instances of all strongs text results.
> * This class makes use of the above class StrongsResult.
> *
> *    The functions of the class are:
> *       - Store an instance of a strongs text result.
> *       - Each strongs text result will contain a list of verses (keyNames).
> *       - The number of verses (keyNames) is returned by keyCount().
> *       - The text for the strongs text result is returned by keyText().
> *       - The list of verses (keyNames) is returned by getKeyList() [as QStringList].
> *
> *   To add a new verse to a strongs text result use addKeyName.
> */
> class StrongsResultClass
>    {
>    public:
>       StrongsResultClass(CSwordModuleInfo* module, const QString& strongsNumber)
>          : srModule(module), lemmaText(strongsNumber)
>          { initStrongsResults(); }
> 
>       QString keyText(int index) const { return srList[index].keyText(); }
>       int keyCount(int index) const { return srList[index].keyCount(); }
>       QStringList* getKeyList(int index) { return srList[index].getKeyList(); }
>       int Count() const { return srList.count(); }
> 
>    private:
>       void initStrongsResults(void);
>       QString getStrongsNumberText(const QString& verseContent, int *startIndex);
> 
>       StrongsResultList srList;
>       CSwordModuleInfo* srModule;
>       QString lemmaText;
>    };
> 
> 
> 
> class CModuleResultView : public KListView {
> 	Q_OBJECT
> public:
> 	CModuleResultView(QWidget* parent);
> 	~CModuleResultView();
> 	/**
> 	* Setups the tree using the given list of modules.
> 	*/
> 	void setupTree( ListCSwordModuleInfo modules, const QString& searchedText );
> 	/**
> 	* Returns the currently active module.
> 	*/
> 	CSwordModuleInfo* const activeModule();
> 
> protected: // Protected methods
> 	/**
> 	* Initializes this widget.
> 	*/
> 	void initView();
> 	/**
> 	* Initializes the connections of this widget
> 	*/
> 	void initConnections();
> 
>    void setupStrongsResults(CSwordModuleInfo* module, QListViewItem* parent, const QString& searchedText);
> 
> protected slots: // Protected slots
> 	/**
> 	* Is executed when an item was selected in the list.
> 	*/
> 	void executed( QListViewItem* );
> 	/**
> 	* Copies the whole search result with the text into the clipboard.
> 	*/
> 	void copyResultWithText();
> 	/**
> 	* Copies the whole search result into the clipboard.
> 	*/
> 	void copyResult();
> 	/**
> 	* This slot opens the popup menu at the given position
> 	*/
> 	void showPopup(KListView*, QListViewItem*, const QPoint&);
> 	/**
> 	* Appends the whole search result to the printer queue.
> 	*/
> 	void printResult();
> 	/**
> 	* Saves the search result with it's text.
> 	*/
> 	void saveResultWithText();
> 	/**
> 	* Saves the search result keys.
> 	*/
> 	void saveResult();
> 
> signals:
> 	void moduleSelected(CSwordModuleInfo*);
> 	void moduleChanged();
>    void strongsSelected(CSwordModuleInfo*, QStringList*);
> 
> private:
> 	struct {
> 		KActionMenu* saveMenu;
> 		struct {
> 			KAction* result;
> 			KAction* resultWithText;
> 		}
> 		save;
> 
> 		KActionMenu* printMenu;
> 		struct {
> 			KAction* result;
> 		}
> 		print;
> 
> 		KActionMenu* copyMenu;
> 		struct {
> 			KAction* result;
> 			KAction* resultWithText;
> 		}
> 		copy;
> 
> 	}
> 	m_actions;
> 	KPopupMenu* m_popup;
>    StrongsResultClass* strongsResults;
> };
> 
> class CSearchResultView  : public KListView {
> 	Q_OBJECT
> public:
> 	CSearchResultView(QWidget* parent);
> 	virtual ~CSearchResultView();
> 	/** Returns the module which is currently used. */
> 	CSwordModuleInfo* const module();
> 
> protected: // Protected methods
> 	/**
> 	* Initializes the view of this widget.
> 	*/
> 	void initView();
> 	void initConnections();
> 	virtual QDragObject* dragObject();
> 
> public slots: // Public slots
> 	void saveItems();
> 	/**
> 	* Setups the list with the given module.
> 	*/
> 	void setupTree(CSwordModuleInfo*);
>    void setupStrongsTree(CSwordModuleInfo*, QStringList*);
> 	void copyItemsWithText();
> 	void copyItems();
> 	void saveItemsWithText();
> 	/**
> 	* Reimplementation to show the popup menu.
> 	*/
> 	virtual void showPopup(KListView*, QListViewItem* i, const QPoint& point);
> 
> protected slots: // Protected slots
> 	void printItems();
> 	/**
> 	* Is connected to the signal executed, which is emitted when a mew item was chosen.
> 	*/
> 	void executed(QListViewItem*);
> 
> private:
> 	struct {
> 		KActionMenu* saveMenu;
> 		struct {
> 			KAction* result;
> 			KAction* resultWithText;
> 		}
> 		save;
> 
> 		KActionMenu* printMenu;
> 		struct {
> 			KAction* result;
> 		}
> 		print;
> 
> 		KActionMenu* copyMenu;
> 		struct {
> 			KAction* result;
> 			KAction* resultWithText;
> 		}
> 		copy;
> 	}
> 	m_actions;
> 	KPopupMenu* m_popup;
> 	CSwordModuleInfo* m_module;
> 
> signals: // Signals
> 	void keySelected(const QString&);
> };
> 
> 
> /** The page of the search dialog which contains the search result part.
>   * @author The BibleTime team
>   */
> class CSearchResultPage : public QVGroupBox  {
> 	Q_OBJECT
> public:
> 	CSearchResultPage(QWidget *parent=0, const char *name=0);
> 	~CSearchResultPage();
> 	/**
> 	* Sets the modules which contain the result of each.
> 	*/
> 	void setSearchResult(ListCSwordModuleInfo modules);
> 
> public slots: // Public slots
> 	/**
> 	* Resets the current l�st of modules and the displayed list of found entries.
> 	*/
> 	void reset();
> 
> protected: // Protected methods
> 	/**
> 	* Initializes the view of this widget.
> 	*/
> 	void initView();
> 	/**
> 	* Initializes the signal slot conections of the child widgets
> 	*/
> 	void initConnections();
> 	/**
> 	* This function highlights the searched text in the content using the search type given by search flags
> 	*/
> 	const QString highlightSearchedText(const QString& content, const QString& searchedText, const int searchFlags);
> 
> private:
> 	CModuleResultView* m_moduleListBox;
> 	CSearchResultView* m_resultListBox;
> 	CReadDisplay* m_previewDisplay;
> 	ListCSwordModuleInfo m_modules;
> 	QPushButton* m_analyseButton;
> 
> protected slots: // Protected slots
> 	/**
> 	* Update the preview of the selected key.
> 	*/
> 	void updatePreview(const QString& key);
> 	/**
> 	* Shows a dialog with the search analysis of the current search.
> 	*/
> 	void showAnalysis();
> 
> };
> 
> class CSearchOptionsPage : public QVGroupBox  {
> 	Q_OBJECT
> public:
> 	CSearchOptionsPage(QWidget *parent=0, const char *name=0);
> 	~CSearchOptionsPage();
> 	/**
> 	* Sets the search text used in the page.
> 	*/
> 	void setSearchText(const QString& text);
> 	/**
> 	* Returns the search text set in this page.
> 	*/
> 	const QString searchText();
> 	/**
> 	* Returns the list of used modules.
> 	*/
> 	const ListCSwordModuleInfo modules();
> 	/**
> 	* Return the selected search type,.
> 	*/
> 	const int searchFlags();
> 	/**
> 	* Sets all options back to the default.
> 	*/
> 	void reset();
> 	/**
> 	* Returns the selected search scope if a search scope was selected.
> 	*/
> 	sword::ListKey searchScope();
> 	/**
> 	* Returns the selected scope type.
> 	*/
> 	const CSwordModuleSearch::scopeType scopeType();
> 
> private:
> 	QLabel* m_modulesLabel;
> 	KHistoryCombo* m_searchTextCombo;
> 	QPushButton* m_chooseModulesButton;
> 	ListCSwordModuleInfo m_modules;
> 
> 	KComboBox* m_rangeChooserCombo;
> 	QPushButton* m_chooseRangeButton;
> 	
> protected: // Protected methods
> 	/**
> 	* Initializes this page.
> 	*/
> 	void initView();
> 	/**
> 	* Reads the settings of the last searchdialog session.
> 	*/
> 	void readSettings();
> 	/**
> 	* Reads the settings for the searchdialog from disk.
> 	*/
> 	void saveSettings();
> 
> public slots: // Public slots
> 	/**
> 	* Sets the modules used by the search.
> 	*/
> 	void setModules( ListCSwordModuleInfo modules );
> 	/**
> 	* Reimplementation.
> 	*/
> 	void aboutToShow();
> 	/**
> 	* Refreshes the list of ranges and the range combobox. 
> 	*/
> 	void refreshRanges();
> 	/**
> 	 * Opens the modules chooser dialog.
> 	 */
> 	void chooseModules();
> 
> protected slots: // Protected slots
> 	void setupRanges();
> 	void syntaxHelp();
> 
> signals:
> 	void sigSetSearchButtonStatus(bool);
> };
> 
> #endif
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> bt-devel mailing list
> bt-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/bt-devel


More information about the bt-devel mailing list