3 Copyright (c) 2012 Jakob Leben & Tim Blechmann
4 http://www.audiosynth.com
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "find_replace_tool.hpp"
22 #include "code_editor/editor.hpp"
24 #include <QApplication>
28 TextFindReplacePanel::TextFindReplacePanel( QWidget
* parent
):
30 mMode((Mode
) 0), // a hack so that first setMode() works
34 mFindField
= new QLineEdit
;
35 mReplaceField
= new QLineEdit
;
37 mNextBtn
= new QPushButton(tr("Next"));
38 mPrevBtn
= new QPushButton(tr("Previous"));
39 mFindAllBtn
= new QPushButton(tr("Find All"));
40 mReplaceBtn
= new QPushButton(tr("Replace"));
41 mReplaceAllBtn
= new QPushButton(tr("Replace All"));
43 mOptionsBtn
= new QPushButton(tr("Options"));
44 QMenu
*optMenu
= new QMenu(this);
45 mMatchCaseAction
= optMenu
->addAction(tr("Match Case"));
46 mMatchCaseAction
->setCheckable(true);
47 mRegExpAction
= optMenu
->addAction(tr("Regular Expression"));
48 mRegExpAction
->setCheckable(true);
49 mWholeWordAction
= optMenu
->addAction(tr("Whole Words"));
50 mWholeWordAction
->setCheckable(true);
51 mOptionsBtn
->setMenu(optMenu
);
53 mFindLabel
= new QLabel(tr("Find:"));
54 mFindLabel
->setAlignment(Qt::AlignRight
| Qt::AlignVCenter
);
55 mReplaceLabel
= new QLabel(tr("Replace:"));
56 mReplaceLabel
->setAlignment(Qt::AlignRight
| Qt::AlignVCenter
);
58 mGrid
= new QGridLayout();
59 mGrid
->setContentsMargins(2,2,2,2);
60 mGrid
->addWidget(mFindLabel
, 0, 0);
61 mGrid
->addWidget(mFindField
, 0, 1);
62 mGrid
->addWidget(mNextBtn
, 0, 2);
63 mGrid
->addWidget(mPrevBtn
, 0, 3);
64 mGrid
->addWidget(mFindAllBtn
, 0, 4);
65 mGrid
->addWidget(mOptionsBtn
, 0, 5);
66 mGrid
->addWidget(mReplaceLabel
, 1, 0);
67 mGrid
->addWidget(mReplaceField
, 1, 1);
68 mGrid
->addWidget(mReplaceBtn
, 1, 2);
69 mGrid
->addWidget(mReplaceAllBtn
, 1, 3);
74 setFocusProxy(mFindField
);
75 QWidget::setTabOrder(mFindField
, mReplaceField
);
76 mFindField
->installEventFilter(this);
78 connect(mNextBtn
, SIGNAL(clicked()), this, SLOT(findNext()));
79 connect(mPrevBtn
, SIGNAL(clicked()), this, SLOT(findPrevious()));
80 connect(mFindAllBtn
, SIGNAL(clicked()), this, SLOT(findAll()));
81 connect(mReplaceBtn
, SIGNAL(clicked()), this, SLOT(replace()));
82 connect(mReplaceAllBtn
, SIGNAL(clicked()), this, SLOT(replaceAll()));
83 connect(mFindField
, SIGNAL(returnPressed()), this, SLOT(onFindFieldReturn()));
84 connect(mFindField
, SIGNAL(textChanged(QString
)), this, SLOT(onFindFieldTextChanged()));
85 connect(mReplaceField
, SIGNAL(returnPressed()), this, SLOT(replace()));
88 void TextFindReplacePanel::setMode( Mode mode
)
90 if (mode
== mMode
) return;
94 bool visible
= mMode
== Replace
;
95 mReplaceLabel
->setVisible(visible
);
96 mReplaceField
->setVisible(visible
);
97 mReplaceBtn
->setVisible(visible
);
98 mReplaceAllBtn
->setVisible(visible
);
101 void TextFindReplacePanel::initiate()
103 mSearchPosition
= -1;
107 QTextCursor
c( mEditor
->textCursor() );
108 if(c
.hasSelection() &&
109 c
.document()->findBlock(c
.selectionStart()) ==
110 c
.document()->findBlock(c
.selectionEnd()))
112 mFindField
->setText(c
.selectedText());
113 mReplaceField
->clear();
117 mFindField
->selectAll();
121 QRegExp
TextFindReplacePanel::regexp()
123 QRegExp
expr(findString());
124 expr
.setPatternSyntax(asRegExp() ? QRegExp::RegExp
: QRegExp::FixedString
);
125 expr
.setCaseSensitivity(matchCase() ? Qt::CaseSensitive
: Qt::CaseInsensitive
);
129 QTextDocument::FindFlags
TextFindReplacePanel::flags()
131 QTextDocument::FindFlags f
;
133 f
|= QTextDocument::FindWholeWords
;
137 void TextFindReplacePanel::findNext()
142 void TextFindReplacePanel::findPrevious()
147 void TextFindReplacePanel::onFindFieldReturn()
149 find (QApplication::keyboardModifiers() & Qt::ShiftModifier
);
152 void TextFindReplacePanel::onFindFieldTextChanged()
154 // Incremental search
156 if (!mEditor
) return;
158 QRegExp
expr(regexp());
159 QTextDocument::FindFlags
flagz(flags());
161 if (mSearchPosition
== -1)
162 mSearchPosition
= mEditor
->textCursor().selectionStart();
164 int count
= mEditor
->findAll(expr
, flagz
);
166 QTextCursor
searchCursor(mEditor
->textDocument());
167 searchCursor
.setPosition(mSearchPosition
);
169 if (expr
.isEmpty()) {
170 mEditor
->setTextCursor(searchCursor
);
172 mEditor
->setTextCursor(searchCursor
);
173 mEditor
->find(expr
, flagz
);
177 bool TextFindReplacePanel::eventFilter (QObject
*obj
, QEvent
*ev
)
179 if (obj
== mFindField
&& ev
->type() == QEvent::FocusOut
)
180 mSearchPosition
= -1;
182 return QWidget::eventFilter(obj
,ev
);
185 void TextFindReplacePanel::find (bool backwards
)
187 // Non incremental search!
189 if (!mEditor
) return;
191 QRegExp expr
= regexp();
192 if (expr
.isEmpty()) return;
194 QTextDocument::FindFlags opt
= flags();
196 opt
|= QTextDocument::FindBackward
;
198 mEditor
->find(expr
, opt
);
200 // This was not incremental search, so reset search position
201 mSearchPosition
= -1;
204 void TextFindReplacePanel::findAll()
206 if (!mEditor
) return;
208 // NOTE: empty expression removes any search highlighting
209 mEditor
->findAll(regexp(), flags());
212 void TextFindReplacePanel::replace()
214 if (!mEditor
) return;
216 QRegExp expr
= regexp();
217 if (expr
.isEmpty()) return;
219 mEditor
->replace(expr
, replaceString(), flags());
221 mSearchPosition
= -1;
224 void TextFindReplacePanel::replaceAll()
226 if (!mEditor
) return;
228 QRegExp expr
= regexp();
229 if (expr
.isEmpty()) return;
231 mEditor
->replaceAll(expr
, replaceString(), flags());
233 mSearchPosition
= -1;