From: <su...@us...> - 2009-01-12 14:32:54
|
Revision: 3143 http://tora.svn.sourceforge.net/tora/?rev=3143&view=rev Author: subik Date: 2009-01-12 14:32:41 +0000 (Mon, 12 Jan 2009) Log Message: ----------- 1st part of Search/Replace redesign: new dialog (with history etc.); editors are using QScintilla functions for text handling; all toEditWidget based stuff should be searchable (pure virtual methods)... Modified Paths: -------------- trunk/tora/src/toeditwidget.cpp trunk/tora/src/toeditwidget.h trunk/tora/src/tomain.cpp trunk/tora/src/tomain.h trunk/tora/src/tomarkedtext.cpp trunk/tora/src/tomarkedtext.h trunk/tora/src/toresulttableview.cpp trunk/tora/src/toresulttableview.h trunk/tora/src/toresultview.cpp trunk/tora/src/toresultview.h trunk/tora/src/tosearchreplace.cpp trunk/tora/src/tosearchreplace.h trunk/tora/src/tosearchreplaceui.ui trunk/tora/src/totextview.cpp trunk/tora/src/totextview.h Modified: trunk/tora/src/toeditwidget.cpp =================================================================== --- trunk/tora/src/toeditwidget.cpp 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/toeditwidget.cpp 2009-01-12 14:32:41 UTC (rev 3143) @@ -168,16 +168,3 @@ { return true; } - -bool toEditWidget::searchNext(toSearchReplace *) -{ - return false; -} - -void toEditWidget::searchReplace(const QString &) -{} - -bool toEditWidget::searchCanReplace(bool) -{ - return false; -} Modified: trunk/tora/src/toeditwidget.h =================================================================== --- trunk/tora/src/toeditwidget.h 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/toeditwidget.h 2009-01-12 14:32:41 UTC (rev 3143) @@ -297,21 +297,31 @@ return ReadAll; } - /** Move to top of data - */ - virtual void searchTop(void) - { } - /** Search for next entry - * @return True if found, should select the found text. - */ - virtual bool searchNext(toSearchReplace *search); - /** Replace entry with new data - */ - virtual void searchReplace(const QString &newData); - /** Check if data can be modified by search + /*! \brief Search for next occrence of text + This is pure virtual as it has to be implemented in all + separated children of toEditWidget. + */ + virtual bool searchNext(const QString & text) = 0; + /*! \brief Search for previous occrence of text + This is pure virtual as it has to be implemented in all + separated children of toEditWidget. + */ + virtual bool searchPrevious(const QString & text) = 0; + /*! \brief Replace current entry with new data + This is pure virtual as it has to be implemented in all + separated children of toEditWidget. + */ + virtual void searchReplace(const QString &newData) = 0; + /*! \brief Replace all entries with new data + This is pure virtual as it has to be implemented in all + separated children of toEditWidget. + */ + virtual void searchReplaceAll(const QString &newData) = 0; + + /*! \brief Check if data can be modified by search * @param all If true can replace all, otherwise can replace right now. */ - virtual bool searchCanReplace(bool all); + virtual bool searchCanReplace(bool all) = 0; /** Call this when this widget has received the focus. Must be called by the implementor. */ Modified: trunk/tora/src/tomain.cpp =================================================================== --- trunk/tora/src/tomain.cpp 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/tomain.cpp 2009-01-12 14:32:41 UTC (rev 3143) @@ -1037,7 +1037,7 @@ { if (!Search) Search = new toSearchReplace(this); - Search->show(); + Search->isVisible() ? Search->hide() : Search->show(); } else if (action == searchNextAct) { @@ -1100,11 +1100,6 @@ ConnectionSelection->setFocus(); else if (action == quitAct) close(); - else if (action == searchReplaceAct) - { - if (Search) - Search->searchNext(); - } else if (action == cascadeAct) workspace()->cascadeSubWindows(); else if (action == tileAct) Modified: trunk/tora/src/tomain.h =================================================================== --- trunk/tora/src/tomain.h 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/tomain.h 2009-01-12 14:32:41 UTC (rev 3143) @@ -293,6 +293,11 @@ return Workspace; } + toSearchReplace * searchDialog() + { + return Search; + } + /** * The last active sub window in workspace. MDI area is buggy as * hell and currentSubWindow will not tell you the correct window Modified: trunk/tora/src/tomarkedtext.cpp =================================================================== --- trunk/tora/src/tomarkedtext.cpp 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/tomarkedtext.cpp 2009-01-12 14:32:41 UTC (rev 3143) @@ -80,7 +80,9 @@ toMarkedText::toMarkedText(QWidget *parent, const char *name) - : QsciScintilla(parent), toEditWidget() + : QsciScintilla(parent), toEditWidget(), + m_searchDirection(Search::SearchUndefined), + m_searchText("") { if (name) setObjectName(name); @@ -565,7 +567,7 @@ if (data[prefix + ":Edited"].isEmpty()) setModified(false); } - +/* static int FindIndex(const QString &str, int line, int col) { int pos = 0; @@ -577,7 +579,7 @@ pos++; } return pos + col; -} +}*/ void toMarkedText::findPosition(int index, int &line, int &col) { @@ -598,36 +600,70 @@ return ; } -bool toMarkedText::searchNext(toSearchReplace *search) +bool toMarkedText::searchNext(const QString & text) { - QString text = toMarkedText::text(); + return findText(Search::SearchForward); +} - int col; - int line; - getCursorPosition(&line, &col); - int pos = FindIndex(text, line, col) + 1; +bool toMarkedText::searchPrevious(const QString & text) +{ + return findText(Search::SearchBackward); +} - int endPos; - if (search->findString(text, pos, endPos)) +bool toMarkedText::findText(Search::SearchDirection direction) +{ + bool r; + int line, index; + Search::SearchDirection state = m_searchDirection; + + getCursorPosition(&line, &index); + + if (m_searchText != toMainWidget()->searchDialog()->currentSearchText()) { - int endCol; - int endLine; - findPosition(pos, line, col); - findPosition(endPos, endLine, endCol); - setSelection(line, col, endLine, endCol); - ensureCursorVisible(); - return true; + m_searchText = toMainWidget()->searchDialog()->currentSearchText(); + state = Search::SearchUndefined; // to reset the findFirst() condition } - return false; + if (m_searchDirection != direction) + m_searchDirection = direction; + + if (m_searchDirection != state) + { + r = findFirst(m_searchText, + toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp, + toMainWidget()->searchDialog()->caseSensitive(), + toMainWidget()->searchDialog()->wholeWords(), + true, //bool wrap, + (m_searchDirection == Search::SearchForward), + line, + index, + true //bool show = true + ); + } + else + findNext(); + + return r; } void toMarkedText::searchReplace(const QString &newData) { - if (!isReadOnly()) - insert(newData); + if (searchCanReplace(false)) +// insert(newData); + replace(newData); } +void toMarkedText::searchReplaceAll(const QString & newData) +{ + if (!searchCanReplace(true)) + return; + + QsciScintilla::beginUndoAction(); + while (findNext()) + replace(newData); + QsciScintilla::endUndoAction(); +} + bool toMarkedText::searchCanReplace(bool all) { if (isReadOnly()) Modified: trunk/tora/src/tomarkedtext.h =================================================================== --- trunk/tora/src/tomarkedtext.h 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/tomarkedtext.h 2009-01-12 14:32:41 UTC (rev 3143) @@ -62,6 +62,8 @@ #include <QKeyEvent> #include <QPoint> +#include "tosearchreplace.h" + class QMenu; class QsciPrinter; @@ -90,6 +92,11 @@ QPoint DragStart; + Search::SearchDirection m_searchDirection; + QString m_searchText; + + bool findText(Search::SearchDirection direction); + void searchFound(int line, int col); void incrementalSearch(bool forward, bool next); protected: @@ -205,19 +212,13 @@ */ virtual bool editSave(bool askfile); - /** Move to top of data - */ - virtual void searchTop(void) - { - setCursorPosition(0, 0); - } - /** Search for next entry - * @return True if found, should select the found text. - */ - virtual bool searchNext(toSearchReplace *search); + virtual bool searchNext(const QString & text); + virtual bool searchPrevious(const QString & text); + /** Replace entry with new data */ virtual void searchReplace(const QString &newData); + virtual void searchReplaceAll(const QString &newData); /** Check if data can be modified by search * @param all If true can replace all, otherwise can replace right now. */ Modified: trunk/tora/src/toresulttableview.cpp =================================================================== --- trunk/tora/src/toresulttableview.cpp 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/toresulttableview.cpp 2009-01-12 14:32:41 UTC (rev 3143) @@ -54,6 +54,7 @@ #include "tolistviewformatterfactory.h" #include "tolistviewformatteridentifier.h" #include "toworkingwidget.h" +#include "tosearchreplace.h" #include <QClipboard> #include <QFont> @@ -520,7 +521,94 @@ return Model->canFetchMore(index); } +bool toResultTableView::searchNext(const QString & text) +{ + QModelIndex index = currentIndex(); + int row = currentIndex().row(); + int col = currentIndex().column() + 1; + bool cs = toMainWidget()->searchDialog()->caseSensitive(); + bool ww = toMainWidget()->searchDialog()->wholeWords(); + bool rx = toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp; + + QString currentText; + QString realSearch(text); + + if (!cs) + realSearch = realSearch.toUpper(); + + bool stop = false; + while (row < Model->rowCount()) + { + while (col < Model->columnCount()) + { + currentText = Model->data(Model->index(row, col)).toString().trimmed(); + if (!cs) + currentText = currentText.toUpper(); + + if (rx && currentText.contains(QRegExp(text))) + stop = true; + else if ((ww && currentText == realSearch) || (!ww && currentText.contains(realSearch))) + stop = true; + + if (stop) + { + setCurrentIndex(Model->index(row, col)); + return true; + } + ++col; + } + ++row; + col = 0; + } + + return false; +} + +bool toResultTableView::searchPrevious(const QString & text) +{ + QModelIndex index = currentIndex(); + int row = currentIndex().row(); + int col = currentIndex().column() - 1; + + bool cs = toMainWidget()->searchDialog()->caseSensitive(); + bool ww = toMainWidget()->searchDialog()->wholeWords(); + bool rx = toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp; + + QString currentText; + QString realSearch(text); + + if (!cs) + realSearch = realSearch.toUpper(); + + bool stop = false; + while (row >= 0) + { + while (col >= 0) + { + currentText = Model->data(Model->index(row, col)).toString().trimmed(); + if (!cs) + currentText = currentText.toUpper(); + + if (rx && currentText.contains(QRegExp(text))) + stop = true; + else if ((ww && currentText == realSearch) || (!ww && currentText.contains(realSearch))) + stop = true; + + if (stop) + { + setCurrentIndex(Model->index(row, col)); + return true; + } + --col; + } + --row; + col = Model->columnCount(); + } + + return false; +} + void toResultTableView::setFilter(toViewFilter *filter) { if(Filter) Modified: trunk/tora/src/toresulttableview.h =================================================================== --- trunk/tora/src/toresulttableview.h 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/toresulttableview.h 2009-01-12 14:32:41 UTC (rev 3143) @@ -244,6 +244,11 @@ toResultTableView(QWidget * parent = 0); virtual ~toResultTableView(void); + virtual bool searchNext(const QString & text); + virtual bool searchPrevious(const QString & text); + virtual void searchReplace(const QString & text) {}; + virtual void searchReplaceAll(const QString & text) {}; + virtual bool searchCanReplace(bool all) { return false; }; /** * Reimplemented to create query and new model. @@ -282,7 +287,6 @@ return Model; } - /** * True if query is running. * Modified: trunk/tora/src/toresultview.cpp =================================================================== --- trunk/tora/src/toresultview.cpp 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/toresultview.cpp 2009-01-12 14:32:41 UTC (rev 3143) @@ -49,10 +49,10 @@ #include "tomemoeditor.h" #include "toparamget.h" #include "toresultview.h" -#include "tosearchreplace.h" #include "tosql.h" #include "totool.h" #include "toresultlistformat.h" +#include "tosearchreplace.h" #include <qapplication.h> #include <qclipboard.h> @@ -467,7 +467,6 @@ false, false, false, true, true, false) { - FirstSearch = false; setTreeStepSize(15); setSelectionMode(Extended); setAllColumnsShowFocus(true); @@ -916,14 +915,21 @@ toTreeWidget::focusInEvent(e); } -bool toListView::searchNext(toSearchReplace *search) +bool toListView::searchNext(const QString & text) { toTreeWidgetItem *item = currentItem(); - bool first = FirstSearch; - FirstSearch = false; + bool first = true; - for (toTreeWidgetItem *next = NULL;item;item = next) + bool cs = toMainWidget()->searchDialog()->caseSensitive(); + bool ww = toMainWidget()->searchDialog()->wholeWords(); + bool rx = toMainWidget()->searchDialog()->searchMode() == Search::SearchRegexp; + + QString realSearch(text); + if (!cs) + realSearch = realSearch.toUpper(); + + for (toTreeWidgetItem *next = NULL; item; item = next) { if (!first) first = true; @@ -931,9 +937,6 @@ { for (int i = 0;i < columns();i++) { - int pos = 0; - int endPos = 0; - toResultViewItem *resItem = dynamic_cast<toResultViewItem *>(item); toResultViewCheck *chkItem = dynamic_cast<toResultViewCheck *>(item); QString txt; @@ -944,11 +947,19 @@ else if (item) txt = item->text(i); - if (search->findString(item->text(0), pos, endPos)) + if (!cs) + txt = txt.toUpper(); + + if (rx && txt.contains(QRegExp(text))) { setCurrentItem(item); return true; } + else if ((ww && txt == realSearch) || (!ww && txt.contains(realSearch))) + { + setCurrentItem(item); + return true; + } } } @@ -971,6 +982,12 @@ return false; } +bool toListView::searchPrevious(const QString & text) +{ + // TODO/FIXME: real backward searching + return searchNext(text); +} + toListView *toListView::copyTransposed(void) { QMdiSubWindow * w = new QMdiSubWindow(toMainWidget()->workspace()); @@ -1070,11 +1087,6 @@ void toListView::addMenues(QMenu *) {} -bool toListView::searchCanReplace(bool) -{ - return false; -} - int toListView::exportType(QString &separator, QString &delimiter) { toResultListFormat format(this, NULL); Modified: trunk/tora/src/toresultview.h =================================================================== --- trunk/tora/src/toresultview.h 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/toresultview.h 2009-01-12 14:32:41 UTC (rev 3143) @@ -509,8 +509,6 @@ { Q_OBJECT; - bool FirstSearch; - /** * Name of this list, used primarily when printing. Also used to * be able to edit @@ -712,22 +710,14 @@ selectAll(true); } - /** Move to top of data - */ - virtual void searchTop(void) - { - if (firstChild()) - setCurrentItem(firstChild()); - FirstSearch = true; - } /** Search for next entry * @return True if found, should select the found text. */ - virtual bool searchNext(toSearchReplace *search); - /** Check if data can be modified by search - * @param all If true can replace all, otherwise can replace right now. - */ - virtual bool searchCanReplace(bool all); + virtual bool searchNext(const QString & text); + virtual bool searchPrevious(const QString & text); + virtual void searchReplace(const QString & text) {}; + virtual void searchReplaceAll(const QString & text) {}; + virtual bool searchCanReplace(bool all) { return false; }; /** Export data to a map. * @param data A map that can be used to recreate the data of a chart. Modified: trunk/tora/src/tosearchreplace.cpp =================================================================== --- trunk/tora/src/tosearchreplace.cpp 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/tosearchreplace.cpp 2009-01-12 14:32:41 UTC (rev 3143) @@ -46,6 +46,8 @@ #include "tomarkedtext.h" #include "tosearchreplace.h" +#include "icons/close.xpm" + #include <qcheckbox.h> #include <qpushbutton.h> #include <qradiobutton.h> @@ -55,9 +57,11 @@ toSearchReplace::toSearchReplace(QWidget *parent) - : QDialog(parent), toHelpContext(QString::fromLatin1("searchreplace.html")) + : QDialog(parent), + toHelpContext(QString::fromLatin1("searchreplace.html")) { setupUi(this); + hideButton->setIcon(QPixmap(const_cast<const char**>(close_xpm))); QAction *action = new QAction(this); action->setShortcut(QKeySequence::HelpContents); @@ -69,6 +73,15 @@ toEditWidget::addHandler(this); receivedFocus(toMainWidget()->editWidget()); + searchChanged(""); + + connect(SearchNext, SIGNAL(clicked()), this, SLOT(searchNext())); + connect(SearchPrevious, SIGNAL(clicked()), this, SLOT(searchPrevious())); + connect(Replace, SIGNAL(clicked()), this, SLOT(replace())); + connect(ReplaceAll, SIGNAL(clicked()), this, SLOT(replaceAll())); + connect(hideButton, SIGNAL(clicked()), this, SLOT(close())); + connect(SearchText, SIGNAL(editTextChanged(const QString &)), + this, SLOT(searchChanged(const QString &))); } void toSearchReplace::displayHelp(void) @@ -76,125 +89,92 @@ toHelp::displayHelp(); } +QString toSearchReplace::currentSearchText() +{ + return SearchText->currentText(); +} + +Search::SearchMode toSearchReplace::searchMode() +{ + if (SearchMode->currentIndex() == 0) + return Search::SearchPlaintext; + else + return Search::SearchRegexp; +} + +bool toSearchReplace::wholeWords() +{ + return WholeWords->isChecked(); +} + +bool toSearchReplace::caseSensitive() +{ + return MatchCase->isChecked(); +} + void toSearchReplace::receivedFocus(toEditWidget *widget) { Target = widget; bool anySearch = Target && Target->searchEnabled(); - Search->setEnabled(anySearch); + SearchPrevious->setEnabled(anySearch); SearchNext->setEnabled(anySearch); Replace->setEnabled(Target && Target->searchCanReplace(false)); ReplaceAll->setEnabled(Target && Target->searchCanReplace(true)); } -void toSearchReplace::search(void) +void toSearchReplace::searchNext(void) { + QString t(SearchText->currentText()); if (Target) { - Target->searchTop(); - searchNext(); + Target->searchNext(t); + Replace->setEnabled(Target->searchCanReplace(false)); + ReplaceAll->setEnabled(Target->searchCanReplace(true)); } + if (t.length() > 0 && SearchText->findText(t) == -1) + SearchText->addItem(t); } -void toSearchReplace::searchNext(void) +void toSearchReplace::searchPrevious(void) { + QString t(SearchText->currentText()); if (Target) { - if (Target->searchNext(this)) - { - Replace->setEnabled(Target->searchCanReplace(false)); - ReplaceAll->setEnabled(Target->searchCanReplace(true)); - } - else - { - toStatusMessage(tr("No more matches found"), false, false); - Replace->setEnabled(false); - ReplaceAll->setEnabled(false); - } + Target->searchPrevious(t); + Replace->setEnabled(Target->searchCanReplace(false)); + ReplaceAll->setEnabled(Target->searchCanReplace(true)); } + if (t.length() > 0 && SearchText->findText(t) == -1) + SearchText->addItem(t); } void toSearchReplace::replace(void) { - if (Target && Target->searchCanReplace(false)) - { - Target->searchReplace(ReplaceText->toPlainText()); - searchNext(); - } + QString t(ReplaceText->currentText()); + if (Target) + Target->searchReplace(t); + if (t.length() > 0 && ReplaceText->findText(t) == -1) + ReplaceText->addItem(t); } void toSearchReplace::replaceAll(void) { - if (Target && Target->searchCanReplace(true)) - { - while (Target->searchCanReplace(false)) - { - Target->searchReplace(ReplaceText->toPlainText()); - searchNext(); - } - } + QString t(ReplaceText->currentText()); + if (Target) + Target->searchReplaceAll(t); + if (t.length() > 0 && ReplaceText->findText(t) == -1) + ReplaceText->addItem(t); } void toSearchReplace::show() { SearchText->setFocus(); - SearchText->selectAll(); QDialog::show(); } - -bool toSearchReplace::findString(const QString &text, int &pos, int &endPos) +void toSearchReplace::searchChanged(const QString & text) { - bool ok; - int found; - int foundLen; - QString searchText = SearchText->toPlainText(); - do - { - ok = true; - if (Exact->isChecked()) - { - found = text.indexOf(searchText, pos, IgnoreCase->isChecked() ? - Qt::CaseInsensitive : - Qt::CaseSensitive); - foundLen = searchText.length(); - } - else - { - QRegExp re(searchText, - IgnoreCase->isChecked() ? - Qt::CaseInsensitive : - Qt::CaseSensitive); - found = re.indexIn(text, pos); - foundLen = re.matchedLength(); - } - if (found == -1) - { - return false; - } - if (WholeWord->isChecked()) - { - if (found != 0 && !text[found].isSpace()) - ok = false; - if (found + foundLen != int(text.length()) && !text[found + foundLen].isSpace()) - ok = false; - pos = found + 1; - } - } - while (!ok); - - pos = found; - endPos = found + foundLen; - return true; -} - -void toSearchReplace::searchChanged(void) -{ - bool ena = SearchText->toPlainText().length() > 0; + bool ena = text > 0; SearchNext->setEnabled(ena); - Search->setEnabled(ena); + SearchPrevious->setEnabled(ena); } - -bool toSearchReplace::searchNextAvailable(void) -{ - return SearchNext->isEnabled(); -} Modified: trunk/tora/src/tosearchreplace.h =================================================================== --- trunk/tora/src/tosearchreplace.h 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/tosearchreplace.h 2009-01-12 14:32:41 UTC (rev 3143) @@ -51,35 +51,58 @@ class toMarkedText; class toResultContentEditor; + +//! \brief A helper namespace for Search related tools +namespace Search +{ + enum SearchMode { + SearchPlaintext = 0, + SearchRegexp + }; + + enum SearchDirection { + SearchUndefined = -1, + SearchForward = 0, + SearchBackward = 1 + }; +}; // namespace Search + + class toSearchReplace : public QDialog, public Ui::toSearchReplaceUI, public toHelpContext, public toEditWidget::editHandler { Q_OBJECT toEditWidget *Target; + public: toSearchReplace(QWidget *parent); ~toSearchReplace() { toEditWidget::delHandler(this); - } + }; - virtual void show(); - bool findString(const QString &text, int &pos, int &endPos); + void show(); + + QString currentSearchText(); + Search::SearchMode searchMode(); + bool wholeWords(); + bool caseSensitive(); + virtual void receivedFocus(toEditWidget *widget); virtual void lostFocus(toEditWidget *) { receivedFocus(NULL); } - bool searchNextAvailable(void); + public slots: - virtual void searchNext(); + void searchNext(); + void searchPrevious(); private slots: - virtual void replaceAll(); - virtual void replace(); - virtual void search(); - virtual void searchChanged(); - virtual void displayHelp(); + void replaceAll(); + void replace(); + void searchChanged(const QString & text); + void displayHelp(); }; #endif Modified: trunk/tora/src/tosearchreplaceui.ui =================================================================== --- trunk/tora/src/tosearchreplaceui.ui 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/tosearchreplaceui.ui 2009-01-12 14:32:41 UTC (rev 3143) @@ -1,396 +1,266 @@ <ui version="4.0" > + <author>Sebastian Pipping</author> <class>toSearchReplaceUI</class> - <widget class="QDialog" name="toSearchReplaceUI" > + <widget class="QWidget" name="toSearchReplaceUI" > <property name="geometry" > <rect> <x>0</x> <y>0</y> - <width>570</width> - <height>228</height> + <width>698</width> + <height>122</height> </rect> </property> - <property name="windowTitle" > - <string>Search & Replace</string> + <property name="sizePolicy" > + <sizepolicy vsizetype="Minimum" hsizetype="Preferred" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>11</number> - </property> - <property name="topMargin" > - <number>11</number> - </property> - <property name="rightMargin" > - <number>11</number> - </property> - <property name="bottomMargin" > - <number>11</number> - </property> - <property name="horizontalSpacing" > - <number>6</number> - </property> - <property name="verticalSpacing" > - <number>6</number> - </property> - <item row="0" column="2" > - <widget class="QPushButton" name="Search" > - <property name="enabled" > - <bool>false</bool> + <layout class="QHBoxLayout" name="horizontalLayout_2" > + <item> + <layout class="QGridLayout" name="gridLayout" > + <property name="horizontalSpacing" > + <number>6</number> </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>&Search Top</string> - </property> - </widget> - </item> - <item row="5" column="2" > - <spacer> - <property name="orientation" > - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType" > - <enum>QSizePolicy::Expanding</enum> - </property> - <property name="sizeHint" > - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item row="1" column="2" > - <widget class="QPushButton" name="SearchNext" > - <property name="enabled" > - <bool>false</bool> - </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Search &Next</string> - </property> - </widget> - </item> - <item row="2" column="2" > - <widget class="QPushButton" name="Replace" > - <property name="enabled" > - <bool>false</bool> - </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>&Replace</string> - </property> - </widget> - </item> - <item row="3" column="2" > - <widget class="QPushButton" name="ReplaceAll" > - <property name="enabled" > - <bool>false</bool> - </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Replace &All</string> - </property> - </widget> - </item> - <item row="4" column="2" > - <widget class="QPushButton" name="Close" > - <property name="enabled" > - <bool>true</bool> - </property> - <property name="sizePolicy" > - <sizepolicy vsizetype="Fixed" hsizetype="Minimum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text" > - <string>Close</string> - </property> - </widget> - </item> - <item rowspan="6" row="0" column="1" > - <widget class="Line" name="Line1" > - <property name="frameShape" > - <enum>QFrame::VLine</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Sunken</enum> - </property> - </widget> - </item> - <item rowspan="6" row="0" column="0" > - <widget class="QFrame" name="Frame3" > - <property name="frameShape" > - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow" > - <enum>QFrame::Plain</enum> - </property> - <layout class="QGridLayout" > - <item row="0" column="0" > - <widget class="QWidget" native="1" name="ButtonGroup1" > - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>11</number> + <item row="0" column="0" > + <widget class="QLabel" name="label" > + <property name="text" > + <string>F&ind:</string> + </property> + <property name="alignment" > + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="buddy" > + <cstring>SearchText</cstring> + </property> + </widget> + </item> + <item row="0" column="1" > + <widget class="QComboBox" name="SearchText" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Expanding" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="focusPolicy" > + <enum>Qt::StrongFocus</enum> + </property> + <property name="toolTip" > + <string>Text to search for</string> + </property> + <property name="editable" > + <bool>true</bool> + </property> + <property name="maxCount" > + <number>30</number> + </property> + <property name="insertPolicy" > + <enum>QComboBox::InsertAtTop</enum> + </property> + </widget> + </item> + <item row="0" column="2" > + <widget class="QPushButton" name="SearchNext" > + <property name="toolTip" > + <string>Jump to next match</string> + </property> + <property name="text" > + <string>&Next</string> + </property> + </widget> + </item> + <item row="0" column="3" > + <widget class="QPushButton" name="SearchPrevious" > + <property name="toolTip" > + <string>Jump to previous match</string> + </property> + <property name="text" > + <string>&Previous</string> + </property> + <property name="icon" > + <iconset> + <normaloff>../../../</normaloff>../../../</iconset> + </property> + </widget> + </item> + <item row="1" column="0" > + <widget class="QLabel" name="label_3" > + <property name="text" > + <string>Rep&lace:</string> + </property> + <property name="alignment" > + <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + </property> + <property name="buddy" > + <cstring>ReplaceText</cstring> + </property> + </widget> + </item> + <item row="1" column="1" > + <widget class="QComboBox" name="ReplaceText" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Fixed" hsizetype="Expanding" > + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="toolTip" > + <string>Text to replace with</string> + </property> + <property name="editable" > + <bool>true</bool> + </property> + </widget> + </item> + <item row="1" column="2" > + <widget class="QPushButton" name="Replace" > + <property name="toolTip" > + <string>Replace next match</string> + </property> + <property name="text" > + <string>&Replace</string> + </property> + </widget> + </item> + <item row="1" column="3" > + <widget class="QPushButton" name="ReplaceAll" > + <property name="toolTip" > + <string>Replace all matches</string> + </property> + <property name="text" > + <string>Replace &All</string> + </property> + </widget> + </item> + <item row="2" column="0" colspan="4" > + <widget class="Line" name="line_2" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item row="4" column="1" colspan="2" > + <layout class="QHBoxLayout" name="horizontalLayout" > + <property name="spacing" > + <number>0</number> + </property> + <property name="rightMargin" > + <number>6</number> + </property> + <item> + <spacer name="horizontalSpacer" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> </property> - <property name="topMargin" > - <number>11</number> + <property name="sizeHint" stdset="0" > + <size> + <width>0</width> + <height>20</height> + </size> </property> - <property name="rightMargin" > - <number>11</number> + </spacer> + </item> + <item> + <widget class="QComboBox" name="SearchMode" > + <property name="toolTip" > + <string>Search mode</string> </property> - <property name="bottomMargin" > - <number>11</number> + <property name="maxVisibleItems" > + <number>4</number> </property> - <property name="horizontalSpacing" > - <number>6</number> + <property name="frame" > + <bool>true</bool> </property> - <property name="verticalSpacing" > - <number>6</number> - </property> - <item row="0" column="0" colspan="3" > - <widget class="QTextEdit" name="SearchText" /> + <item> + <property name="text" > + <string>Plain Text</string> + </property> </item> - <item row="1" column="0" > - <widget class="QRadioButton" name="Exact" > - <property name="toolTip" > - <string>Match text exactly as written</string> - </property> - <property name="text" > - <string>Exact</string> - </property> - <property name="checked" > - <bool>true</bool> - </property> - </widget> + <item> + <property name="text" > + <string>Regular Expression</string> + </property> </item> - <item row="2" column="0" > - <widget class="QCheckBox" name="WholeWord" > - <property name="toolTip" > - <string>Only match whole words</string> - </property> - <property name="text" > - <string>Match Word</string> - </property> - </widget> - </item> - <item row="2" column="1" > - <widget class="QCheckBox" name="IgnoreCase" > - <property name="toolTip" > - <string>Only match whole words</string> - </property> - <property name="text" > - <string>Ignore Case</string> - </property> - </widget> - </item> - <item row="1" column="1" > - <widget class="QRadioButton" name="RegExp" > - <property name="toolTip" > - <string>Use RegExp semantics for matching (See Qt documentation)</string> - </property> - <property name="text" > - <string>RegExp</string> - </property> - </widget> - </item> - <item row="1" column="2" > - <spacer> - <property name="orientation" > - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType" > - <enum>QSizePolicy::Expanding</enum> - </property> - <property name="sizeHint" > - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item row="1" column="0" > - <widget class="QGroupBox" name="GroupBox1" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Preferred" hsizetype="Preferred" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title" > - <string>Replace</string> - </property> - <layout class="QGridLayout" > - <property name="leftMargin" > - <number>11</number> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> </property> - <property name="topMargin" > - <number>11</number> + <property name="sizeType" > + <enum>QSizePolicy::Fixed</enum> </property> - <property name="rightMargin" > - <number>11</number> + <property name="sizeHint" stdset="0" > + <size> + <width>6</width> + <height>20</height> + </size> </property> - <property name="bottomMargin" > - <number>11</number> + </spacer> + </item> + <item> + <widget class="QCheckBox" name="MatchCase" > + <property name="toolTip" > + <string>Case-sensitive searching</string> </property> - <property name="horizontalSpacing" > - <number>6</number> + <property name="text" > + <string>&Match case</string> </property> - <property name="verticalSpacing" > - <number>6</number> + </widget> + </item> + <item> + <widget class="QCheckBox" name="WholeWords" > + <property name="text" > + <string>Whole words</string> </property> - <item row="0" column="0" > - <widget class="QTextEdit" name="ReplaceText" > - <property name="html" > - <string><html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> + </widget> + </item> + </layout> + </item> + </layout> </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_2" > + <item> + <widget class="QToolButton" name="hideButton" > + <property name="text" > + <string/> + </property> + <property name="autoRaise" > + <bool>true</bool> + </property> + </widget> + </item> + <item> + <spacer> + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> </layout> </widget> - <layoutdefault spacing="6" margin="11" /> <tabstops> <tabstop>SearchText</tabstop> - <tabstop>Exact</tabstop> - <tabstop>RegExp</tabstop> - <tabstop>WholeWord</tabstop> - <tabstop>IgnoreCase</tabstop> - <tabstop>ReplaceText</tabstop> - <tabstop>Search</tabstop> <tabstop>SearchNext</tabstop> + <tabstop>SearchPrevious</tabstop> + <tabstop>ReplaceText</tabstop> <tabstop>Replace</tabstop> <tabstop>ReplaceAll</tabstop> - <tabstop>Close</tabstop> + <tabstop>SearchMode</tabstop> + <tabstop>MatchCase</tabstop> + <tabstop>hideButton</tabstop> </tabstops> <resources/> - <connections> - <connection> - <sender>Close</sender> - <signal>clicked()</signal> - <receiver>toSearchReplaceUI</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel" > - <x>20</x> - <y>20</y> - </hint> - <hint type="destinationlabel" > - <x>20</x> - <y>20</y> - </hint> - </hints> - </connection> - <connection> - <sender>Search</sender> - <signal>clicked()</signal> - <receiver>toSearchReplaceUI</receiver> - <slot>search()</slot> - <hints> - <hint type="sourcelabel" > - <x>20</x> - <y>20</y> - </hint> - <hint type="destinationlabel" > - <x>20</x> - <y>20</y> - </hint> - </hints> - </connection> - <connection> - <sender>SearchNext</sender> - <signal>clicked()</signal> - <receiver>toSearchReplaceUI</receiver> - <slot>searchNext()</slot> - <hints> - <hint type="sourcelabel" > - <x>20</x> - <y>20</y> - </hint> - <hint type="destinationlabel" > - <x>20</x> - <y>20</y> - </hint> - </hints> - </connection> - <connection> - <sender>ReplaceAll</sender> - <signal>clicked()</signal> - <receiver>toSearchReplaceUI</receiver> - <slot>replaceAll()</slot> - <hints> - <hint type="sourcelabel" > - <x>20</x> - <y>20</y> - </hint> - <hint type="destinationlabel" > - <x>20</x> - <y>20</y> - </hint> - </hints> - </connection> - <connection> - <sender>SearchText</sender> - <signal>textChanged()</signal> - <receiver>toSearchReplaceUI</receiver> - <slot>searchChanged()</slot> - <hints> - <hint type="sourcelabel" > - <x>20</x> - <y>20</y> - </hint> - <hint type="destinationlabel" > - <x>20</x> - <y>20</y> - </hint> - </hints> - </connection> - <connection> - <sender>Replace</sender> - <signal>clicked()</signal> - <receiver>toSearchReplaceUI</receiver> - <slot>replace()</slot> - <hints> - <hint type="sourcelabel" > - <x>20</x> - <y>20</y> - </hint> - <hint type="destinationlabel" > - <x>20</x> - <y>20</y> - </hint> - </hints> - </connection> - </connections> + <connections/> </ui> Modified: trunk/tora/src/totextview.cpp =================================================================== --- trunk/tora/src/totextview.cpp 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/totextview.cpp 2009-01-12 14:32:41 UTC (rev 3143) @@ -72,3 +72,13 @@ receivedFocus(); QTextBrowser::focusInEvent(e); } + +bool toTextView::searchNext(const QString & text) +{ + return find(text); +} + +bool toTextView::searchPrevious(const QString & text) +{ + return find(text, QTextDocument::FindBackward); +} Modified: trunk/tora/src/totextview.h =================================================================== --- trunk/tora/src/totextview.h 2009-01-08 10:33:51 UTC (rev 3142) +++ trunk/tora/src/totextview.h 2009-01-12 14:32:41 UTC (rev 3143) @@ -62,7 +62,7 @@ , toEditWidget(false, true, false, false, false, false, true, false, - false, true, false) + true, true, false) { } /** See @ref QTextView */ @@ -86,6 +86,12 @@ /** Reimplemented for internal reasons. */ virtual void focusInEvent (QFocusEvent *e); + + virtual bool searchNext(const QString & text); + virtual bool searchPrevious(const QString & text); + virtual void searchReplace(const QString &newData) {}; + virtual void searchReplaceAll(const QString &newData) {}; + virtual bool searchCanReplace(bool all) { return false; }; }; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |