3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * \author Angus Leeming
10 * Full author contact details are available in file CREDITS.
15 #include "GuiSearch.h"
18 #include "qt_helpers.h"
19 #include "FuncRequest.h"
21 #include "BufferView.h"
24 #include "FuncRequest.h"
26 #include "GuiKeySymbol.h"
29 #include "support/debug.h"
30 #include "support/gettext.h"
31 #include "frontends/alert.h"
36 #include "QSizePolicy"
45 static void uniqueInsert(QComboBox * box, QString const & text)
47 for (int i = box->count(); --i >= 0; )
48 if (box->itemText(i) == text)
51 box->insertItem(0, text);
55 GuiSearchWidget::GuiSearchWidget(QWidget * parent)
60 // fix height to minimum
61 setFixedHeight(sizeHint().height());
63 // align items in grid on top
64 gridLayout->setAlignment(Qt::AlignTop);
66 connect(findPB, SIGNAL(clicked()), this, SLOT(findClicked()));
67 connect(findPrevPB, SIGNAL(clicked()), this, SLOT(findPrevClicked()));
68 connect(minimizePB, SIGNAL(clicked()), this, SLOT(minimizeClicked()));
69 connect(replacePB, SIGNAL(clicked()), this, SLOT(replaceClicked()));
70 connect(replacePrevPB, SIGNAL(clicked()), this, SLOT(replacePrevClicked()));
71 connect(replaceallPB, SIGNAL(clicked()), this, SLOT(replaceallClicked()));
72 connect(findCO, SIGNAL(editTextChanged(QString)),
73 this, SLOT(findChanged()));
75 setFocusProxy(findCO);
77 findCO->setCompleter(nullptr);
78 replaceCO->setCompleter(nullptr);
80 replacePB->setEnabled(false);
81 replacePrevPB->setEnabled(false);
82 replaceallPB->setEnabled(false);
86 void GuiSearchWidget::keyPressEvent(QKeyEvent * ev)
89 setKeySymbol(&sym, ev);
91 // catch Return and Shift-Return
92 if (ev->key() == Qt::Key_Return) {
93 findClicked(ev->modifiers() == Qt::ShiftModifier);
97 // we catch the key sequences for forward and backwards search
99 KeyModifier mod = lyx::q_key_state(ev->modifiers());
100 KeySequence keyseq(&theTopLevelKeymap(), &theTopLevelKeymap());
101 FuncRequest fr = keyseq.addkey(sym, mod);
102 if (fr == FuncRequest(LFUN_WORD_FIND_FORWARD) || fr == FuncRequest(LFUN_WORD_FIND)) {
106 if (fr == FuncRequest(LFUN_WORD_FIND_BACKWARD)) {
110 if (fr == FuncRequest(LFUN_DIALOG_TOGGLE, "findreplace")) {
115 QWidget::keyPressEvent(ev);
119 void GuiSearchWidget::minimizeClicked(bool const toggle)
122 minimized_ = !minimized_;
124 replaceLA->setHidden(minimized_);
125 replaceCO->setHidden(minimized_);
126 replacePB->setHidden(minimized_);
127 replacePrevPB->setHidden(minimized_);
128 replaceallPB->setHidden(minimized_);
129 CBFrame->setHidden(minimized_);
131 minimizePB->setText(qt_("Ex&pand"));
132 minimizePB->setToolTip("Show replace and option widgets");
134 minimizePB->setText(qt_("&Minimize"));
135 minimizePB->setToolTip("Hide replace and option widgets");
138 Q_EMIT needSizeUpdate();
139 Q_EMIT needTitleBarUpdate();
143 void GuiSearchWidget::showEvent(QShowEvent * e)
147 findCO->lineEdit()->selectAll();
148 QWidget::showEvent(e);
152 void GuiSearchWidget::findChanged()
154 findPB->setEnabled(!findCO->currentText().isEmpty());
155 findPrevPB->setEnabled(!findCO->currentText().isEmpty());
156 bool const replace = !findCO->currentText().isEmpty()
157 && bv_ && !bv_->buffer().isReadonly();
158 replacePB->setEnabled(replace);
159 replacePrevPB->setEnabled(replace);
160 replaceallPB->setEnabled(replace);
161 replaceLA->setEnabled(replace);
162 replaceCO->setEnabled(replace);
166 void GuiSearchWidget::findClicked(bool const backwards)
168 docstring const needle = qstring_to_ucs4(findCO->currentText());
169 find(needle, caseCB->isChecked(), wordsCB->isChecked(), !backwards);
170 uniqueInsert(findCO, findCO->currentText());
171 findCO->lineEdit()->selectAll();
175 void GuiSearchWidget::findPrevClicked()
181 void GuiSearchWidget::replaceClicked(bool const backwards)
183 docstring const needle = qstring_to_ucs4(findCO->currentText());
184 docstring const repl = qstring_to_ucs4(replaceCO->currentText());
185 replace(needle, repl, caseCB->isChecked(), wordsCB->isChecked(),
187 uniqueInsert(findCO, findCO->currentText());
188 uniqueInsert(replaceCO, replaceCO->currentText());
192 void GuiSearchWidget::replacePrevClicked()
194 replaceClicked(true);
198 void GuiSearchWidget::replaceallClicked()
200 replace(qstring_to_ucs4(findCO->currentText()),
201 qstring_to_ucs4(replaceCO->currentText()),
202 caseCB->isChecked(), wordsCB->isChecked(), true, true);
203 uniqueInsert(findCO, findCO->currentText());
204 uniqueInsert(replaceCO, replaceCO->currentText());
208 void GuiSearchWidget::find(docstring const & search, bool casesensitive,
209 bool matchword, bool forward)
211 docstring const sdata =
212 find2string(search, casesensitive, matchword, forward);
213 dispatch(FuncRequest(LFUN_WORD_FIND, sdata));
217 void GuiSearchWidget::replace(docstring const & search, docstring const & replace,
218 bool casesensitive, bool matchword,
219 bool forward, bool all)
221 docstring const sdata =
222 replace2string(replace, search, casesensitive,
223 matchword, all, forward);
224 dispatch(FuncRequest(LFUN_WORD_REPLACE, sdata));
227 void GuiSearchWidget::saveSession(QSettings & settings, QString const & session_key) const
229 settings.setValue(session_key + "/casesensitive", caseCB->isChecked());
230 settings.setValue(session_key + "/words", wordsCB->isChecked());
231 settings.setValue(session_key + "/minimized", minimized_);
235 void GuiSearchWidget::restoreSession(QString const & session_key)
238 caseCB->setChecked(settings.value(session_key + "/casesensitive", false).toBool());
239 wordsCB->setChecked(settings.value(session_key + "/words", false).toBool());
240 minimized_ = settings.value(session_key + "/minimized", false).toBool();
241 // initialize hidings
242 minimizeClicked(false);
246 GuiSearch::GuiSearch(GuiView & parent, Qt::DockWidgetArea area, Qt::WindowFlags flags)
247 : DockView(parent, "findreplace", qt_("Search and Replace"), area, flags),
248 widget_(new GuiSearchWidget(this))
251 widget_->setBufferView(bufferview());
252 setFocusProxy(widget_->findCO);
254 connect(widget_, SIGNAL(needTitleBarUpdate()), this, SLOT(updateTitle()));
255 connect(widget_, SIGNAL(needSizeUpdate()), this, SLOT(updateSize()));
258 void GuiSearch::onBufferViewChanged()
260 widget_->setEnabled((bool)bufferview());
261 widget_->setBufferView(bufferview());
265 void GuiSearch::updateView()
272 void GuiSearch::saveSession(QSettings & settings) const
274 Dialog::saveSession(settings);
275 widget_->saveSession(settings, sessionKey());
279 void GuiSearch::restoreSession()
281 DockView::restoreSession();
282 widget_->restoreSession(sessionKey());
286 void GuiSearch::updateTitle()
288 if (widget_->isMinimized()) {
290 setTitleBarWidget(new QWidget());
291 titleBarWidget()->hide();
294 setTitleBarWidget(nullptr);
298 void GuiSearch::updateSize()
300 widget_->setFixedHeight(widget_->sizeHint().height());
301 if (widget_->isMinimized())
302 setFixedHeight(widget_->sizeHint().height());
304 // undo setFixedHeight
305 setMaximumHeight(QWIDGETSIZE_MAX);
312 } // namespace frontend
316 #include "moc_GuiSearch.cpp"