Changeset View
Changeset View
Standalone View
Standalone View
addons/search/plugin_search.cpp
Context not available. | |||||
68 | const QString &before, const QString &after, const QString &desc, | 68 | const QString &before, const QString &after, const QString &desc, | ||
---|---|---|---|---|---|
69 | QString menuBefore = QString(), QString menuAfter = QString()); | 69 | QString menuBefore = QString(), QString menuAfter = QString()); | ||
70 | 70 | | |||
71 | /** | ||||
72 | * When the action is triggered the cursor will be placed between @p before and @p after. | ||||
73 | */ | ||||
71 | static QAction *menuEntry(QMenu *menu, | 74 | static QAction *menuEntry(QMenu *menu, | ||
72 | const QString &before, const QString &after, const QString &desc, | 75 | const QString &before, const QString &after, const QString &desc, | ||
73 | QString menuBefore, QString menuAfter) | 76 | QString menuBefore, QString menuAfter) | ||
Context not available. | |||||
82 | return action; | 85 | return action; | ||
83 | } | 86 | } | ||
84 | 87 | | |||
88 | /** | ||||
89 | * adds items and separators for special chars in "replace" field | ||||
90 | */ | ||||
91 | static void addSpecialCharsHelperActionsForReplace(QSet<QAction*>* actionList, QMenu* menu) | ||||
92 | { | ||||
93 | QSet<QAction*>& actionPointers = *actionList; | ||||
94 | QString emptyQSTring; | ||||
95 | | ||||
96 | actionPointers << menuEntry(menu, QStringLiteral("\\n"),emptyQSTring, i18n("Line break")); | ||||
97 | actionPointers << menuEntry(menu, QStringLiteral("\\t"),emptyQSTring, i18n("Tab")); | ||||
98 | } | ||||
99 | | ||||
100 | /** | ||||
101 | * adds items and separators for regex in "search" field | ||||
102 | */ | ||||
103 | static void addRegexHelperActionsForSearch(QSet<QAction*>* actionList, QMenu* menu) | ||||
104 | { | ||||
105 | QSet<QAction*>& actionPointers = *actionList; | ||||
106 | QString emptyQSTring; | ||||
107 | | ||||
108 | actionPointers << menuEntry(menu, QStringLiteral("^"),emptyQSTring, i18n("Beginning of line")); | ||||
109 | actionPointers << menuEntry(menu, QStringLiteral("$"),emptyQSTring, i18n("End of line")); | ||||
110 | menu->addSeparator(); | ||||
111 | actionPointers << menuEntry(menu, QStringLiteral("."),emptyQSTring, i18n("Any single character (excluding line breaks)")); | ||||
112 | actionPointers << menuEntry(menu, QStringLiteral("[.]"),emptyQSTring, i18n("Literal dot")); | ||||
113 | menu->addSeparator(); | ||||
114 | actionPointers << menuEntry(menu, QStringLiteral("+"),emptyQSTring, i18n("One or more occurrences")); | ||||
115 | actionPointers << menuEntry(menu, QStringLiteral("*"),emptyQSTring, i18n("Zero or more occurrences")); | ||||
116 | actionPointers << menuEntry(menu, QStringLiteral("?"),emptyQSTring, i18n("Zero or one occurrences")); | ||||
117 | actionPointers << menuEntry(menu, QStringLiteral("{"), QStringLiteral(",}"), i18n("<a> through <b> occurrences"), QStringLiteral("{a"), QStringLiteral(",b}")); | ||||
118 | menu->addSeparator(); | ||||
119 | actionPointers << menuEntry(menu, QStringLiteral("("), QStringLiteral(")"), i18n("Group, capturing")); | ||||
120 | actionPointers << menuEntry(menu, QStringLiteral("|"),emptyQSTring, i18n("Or")); | ||||
121 | actionPointers << menuEntry(menu, QStringLiteral("["), QStringLiteral("]"), i18n("Set of characters")); | ||||
122 | actionPointers << menuEntry(menu, QStringLiteral("[^"), QStringLiteral("]"), i18n("Negative set of characters")); | ||||
123 | actionPointers << menuEntry(menu, QStringLiteral("(?:"), QStringLiteral(")"), i18n("Group, non-capturing"), QStringLiteral("(?:E")); | ||||
124 | actionPointers << menuEntry(menu, QStringLiteral("(?="), QStringLiteral(")"), i18n("Lookahead"), QStringLiteral("(?=E")); | ||||
125 | actionPointers << menuEntry(menu, QStringLiteral("(?!"), QStringLiteral(")"), i18n("Negative lookahead"), QStringLiteral("(?!E")); | ||||
126 | | ||||
127 | menu->addSeparator(); | ||||
128 | actionPointers << menuEntry(menu, QStringLiteral("\\n"),emptyQSTring, i18n("Line break")); | ||||
129 | actionPointers << menuEntry(menu, QStringLiteral("\\t"),emptyQSTring, i18n("Tab")); | ||||
130 | actionPointers << menuEntry(menu, QStringLiteral("\\b"),emptyQSTring, i18n("Word boundary")); | ||||
131 | actionPointers << menuEntry(menu, QStringLiteral("\\B"),emptyQSTring, i18n("Not word boundary")); | ||||
132 | actionPointers << menuEntry(menu, QStringLiteral("\\d"),emptyQSTring, i18n("Digit")); | ||||
133 | actionPointers << menuEntry(menu, QStringLiteral("\\D"),emptyQSTring, i18n("Non-digit")); | ||||
134 | actionPointers << menuEntry(menu, QStringLiteral("\\s"),emptyQSTring, i18n("Whitespace (excluding line breaks)")); | ||||
135 | actionPointers << menuEntry(menu, QStringLiteral("\\S"),emptyQSTring, i18n("Non-whitespace (excluding line breaks)")); | ||||
136 | actionPointers << menuEntry(menu, QStringLiteral("\\w"),emptyQSTring, i18n("Word character (alphanumerics plus '_')")); | ||||
137 | actionPointers << menuEntry(menu, QStringLiteral("\\W"),emptyQSTring, i18n("Non-word character")); | ||||
138 | } | ||||
139 | | ||||
140 | /** | ||||
141 | * adds items and separators for regex in "replace" field | ||||
142 | */ | ||||
143 | static void addRegexHelperActionsForReplace(QSet<QAction*>* actionList, QMenu* menu) | ||||
144 | { | ||||
145 | QSet<QAction*>& actionPointers = *actionList; | ||||
146 | QString emptyQSTring; | ||||
147 | | ||||
148 | menu->addSeparator(); | ||||
149 | actionPointers << menuEntry(menu, QStringLiteral("\\0"),emptyQSTring, i18n("Regular expression capture 0 (whole match)")); | ||||
150 | actionPointers << menuEntry(menu, QStringLiteral("\\"), emptyQSTring, i18n("Regular expression capture 1-9"), QStringLiteral("\\#")); | ||||
151 | actionPointers << menuEntry(menu, QStringLiteral("\\{"), QStringLiteral("}"), i18n("Regular expression capture 0-999"), QStringLiteral("\\{#")); | ||||
152 | menu->addSeparator(); | ||||
153 | actionPointers << menuEntry(menu, QStringLiteral("\\U\\"),emptyQSTring, i18n("Upper-cased capture 0-9"), QStringLiteral("\\U\\#")); | ||||
154 | actionPointers << menuEntry(menu, QStringLiteral("\\U\\{"), QStringLiteral("}"), i18n("Upper-cased capture 0-999"), QStringLiteral("\\U\\{###")); | ||||
155 | actionPointers << menuEntry(menu, QStringLiteral("\\L\\"),emptyQSTring, i18n("Lower-cased capture 0-9"), QStringLiteral("\\L\\#")); | ||||
156 | actionPointers << menuEntry(menu, QStringLiteral("\\L\\{"), QStringLiteral("}"), i18n("Lower-cased capture 0-999"), QStringLiteral("\\L\\{###")); | ||||
157 | } | ||||
158 | | ||||
159 | /** | ||||
160 | * inserts text and sets cursor position | ||||
161 | */ | ||||
162 | static void regexHelperActOnAction(QAction* resultAction, const QSet<QAction*>& actionList, QLineEdit* lineEdit) | ||||
163 | { | ||||
164 | if (resultAction && actionList.contains(resultAction)) { | ||||
165 | const int cursorPos = lineEdit->cursorPosition(); | ||||
166 | QStringList beforeAfter = resultAction->data().toString().split(QLatin1Char(' ')); | ||||
167 | if (beforeAfter.size() != 2) return; | ||||
168 | lineEdit->insert(beforeAfter[0] + beforeAfter[1]); | ||||
169 | lineEdit->setCursorPosition(cursorPos + beforeAfter[0].count()); | ||||
170 | lineEdit->setFocus(); | ||||
171 | } | ||||
172 | } | ||||
173 | | ||||
85 | class TreeWidgetItem : public QTreeWidgetItem { | 174 | class TreeWidgetItem : public QTreeWidgetItem { | ||
86 | public: | 175 | public: | ||
87 | TreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent){} | 176 | TreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent){} | ||
Context not available. | |||||
315 | res->matchCase = m_ui.matchCase->isChecked(); | 404 | res->matchCase = m_ui.matchCase->isChecked(); | ||
316 | } | 405 | } | ||
317 | }); | 406 | }); | ||
318 | connect(m_ui.useRegExp, &QToolButton::toggled, &m_changeTimer, static_cast<void (QTimer::*)()>(&QTimer::start)); | | |||
319 | connect(m_ui.useRegExp, &QToolButton::toggled, this, [=]{ | | |||
320 | Results *res = qobject_cast<Results *>(m_ui.resultTabWidget->currentWidget()); | | |||
321 | if (res) { | | |||
322 | res->useRegExp = m_ui.useRegExp->isChecked(); | | |||
323 | } | | |||
324 | }); | | |||
325 | m_changeTimer.setInterval(300); | | |||
326 | m_changeTimer.setSingleShot(true); | | |||
327 | connect(&m_changeTimer, &QTimer::timeout, this, &KatePluginSearchView::startSearchWhileTyping); | | |||
328 | 407 | | |||
329 | connect(m_ui.searchCombo->lineEdit(), &QLineEdit::returnPressed, this, &KatePluginSearchView::startSearch); | 408 | connect(m_ui.searchCombo->lineEdit(), &QLineEdit::returnPressed, this, &KatePluginSearchView::startSearch); | ||
330 | // connecting to returnPressed() of the folderRequester doesn't work, I haven't found out why yet. But connecting to the linedit works: | 409 | // connecting to returnPressed() of the folderRequester doesn't work, I haven't found out why yet. But connecting to the linedit works: | ||
Context not available. | |||||
352 | connect(m_ui.replaceCheckedBtn, &QPushButton::clicked, this, &KatePluginSearchView::replaceChecked); | 431 | connect(m_ui.replaceCheckedBtn, &QPushButton::clicked, this, &KatePluginSearchView::replaceChecked); | ||
353 | connect(m_ui.replaceCombo->lineEdit(), &QLineEdit::returnPressed, this, &KatePluginSearchView::replaceChecked); | 432 | connect(m_ui.replaceCombo->lineEdit(), &QLineEdit::returnPressed, this, &KatePluginSearchView::replaceChecked); | ||
354 | 433 | | |||
355 | | ||||
356 | | ||||
357 | m_ui.displayOptions->setChecked(true); | 434 | m_ui.displayOptions->setChecked(true); | ||
358 | 435 | | |||
359 | connect(&m_searchOpenFiles, &SearchOpenFiles::matchFound, this, &KatePluginSearchView::matchFound); | 436 | connect(&m_searchOpenFiles, &SearchOpenFiles::matchFound, this, &KatePluginSearchView::matchFound); | ||
Context not available. | |||||
383 | m_ui.searchCombo->setInsertPolicy(QComboBox::NoInsert); | 460 | m_ui.searchCombo->setInsertPolicy(QComboBox::NoInsert); | ||
384 | m_ui.searchCombo->lineEdit()->setClearButtonEnabled(true); | 461 | m_ui.searchCombo->lineEdit()->setClearButtonEnabled(true); | ||
385 | m_ui.searchCombo->setMaxCount(25); | 462 | m_ui.searchCombo->setMaxCount(25); | ||
463 | QAction* searchComboActionForInsertRegexButton = m_ui.searchCombo->lineEdit()->addAction(QIcon::fromTheme(QStringLiteral("code-context"), QIcon::fromTheme(QStringLiteral("edit-find-replace"))), QLineEdit::TrailingPosition); | ||||
464 | connect(searchComboActionForInsertRegexButton, &QAction::triggered, this, [this]() { | ||||
465 | QMenu menu; | ||||
466 | QSet<QAction*> actionList; | ||||
467 | addRegexHelperActionsForSearch(&actionList, &menu); | ||||
468 | auto&& action = menu.exec(QCursor::pos()); | ||||
469 | regexHelperActOnAction(action, actionList, m_ui.searchCombo->lineEdit()); | ||||
470 | }); | ||||
386 | 471 | | |||
387 | m_ui.replaceCombo->setContextMenuPolicy(Qt::CustomContextMenu); | 472 | m_ui.replaceCombo->setContextMenuPolicy(Qt::CustomContextMenu); | ||
388 | connect(m_ui.replaceCombo, &QComboBox::customContextMenuRequested, this, &KatePluginSearchView::replaceContextMenu); | 473 | connect(m_ui.replaceCombo, &QComboBox::customContextMenuRequested, this, &KatePluginSearchView::replaceContextMenu); | ||
Context not available. | |||||
391 | m_ui.replaceCombo->setInsertPolicy(QComboBox::NoInsert); | 476 | m_ui.replaceCombo->setInsertPolicy(QComboBox::NoInsert); | ||
392 | m_ui.replaceCombo->lineEdit()->setClearButtonEnabled(true); | 477 | m_ui.replaceCombo->lineEdit()->setClearButtonEnabled(true); | ||
393 | m_ui.replaceCombo->setMaxCount(25); | 478 | m_ui.replaceCombo->setMaxCount(25); | ||
479 | QAction* replaceComboActionForInsertRegexButton = m_ui.replaceCombo->lineEdit()->addAction(QIcon::fromTheme(QStringLiteral("code-context")), QLineEdit::TrailingPosition); | ||||
480 | connect(replaceComboActionForInsertRegexButton, &QAction::triggered, this, [this]() { | ||||
481 | QMenu menu; | ||||
482 | QSet<QAction*> actionList; | ||||
483 | addRegexHelperActionsForReplace(&actionList, &menu); | ||||
484 | auto&& action = menu.exec(QCursor::pos()); | ||||
485 | regexHelperActOnAction(action, actionList, m_ui.replaceCombo->lineEdit()); | ||||
486 | }); | ||||
487 | QAction* replaceComboActionForInsertSpecialButton = m_ui.replaceCombo->lineEdit()->addAction(QIcon::fromTheme(QStringLiteral("insert-text")), QLineEdit::TrailingPosition); | ||||
488 | connect(replaceComboActionForInsertSpecialButton, &QAction::triggered, this, [this]() { | ||||
489 | QMenu menu; | ||||
490 | QSet<QAction*> actionList; | ||||
491 | addSpecialCharsHelperActionsForReplace(&actionList, &menu); | ||||
492 | auto&& action = menu.exec(QCursor::pos()); | ||||
493 | regexHelperActOnAction(action, actionList, m_ui.replaceCombo->lineEdit()); | ||||
494 | }); | ||||
495 | | ||||
496 | | ||||
497 | connect(m_ui.useRegExp, &QToolButton::toggled, &m_changeTimer, static_cast<void (QTimer::*)()>(&QTimer::start)); | ||||
498 | auto onRegexToggleChanged = [=]{ | ||||
499 | Results *res = qobject_cast<Results *>(m_ui.resultTabWidget->currentWidget()); | ||||
500 | if (res) { | ||||
501 | bool useRegExp = m_ui.useRegExp->isChecked(); | ||||
502 | res->useRegExp = useRegExp; | ||||
503 | searchComboActionForInsertRegexButton->setVisible(useRegExp); | ||||
504 | replaceComboActionForInsertRegexButton->setVisible(useRegExp); | ||||
505 | } | ||||
506 | }; | ||||
507 | connect(m_ui.useRegExp, &QToolButton::toggled, this, onRegexToggleChanged); | ||||
508 | onRegexToggleChanged(); // invoke initially | ||||
509 | m_changeTimer.setInterval(300); | ||||
510 | m_changeTimer.setSingleShot(true); | ||||
511 | connect(&m_changeTimer, &QTimer::timeout, this, &KatePluginSearchView::startSearchWhileTyping); | ||||
394 | 512 | | |||
395 | m_toolView->setMinimumHeight(container->sizeHint().height()); | 513 | m_toolView->setMinimumHeight(container->sizeHint().height()); | ||
396 | 514 | | |||
Context not available. | |||||
1998 | 2116 | | |||
1999 | if(!m_isLeftRight && vertical) { | 2117 | if(!m_isLeftRight && vertical) { | ||
2000 | m_isLeftRight = true; | 2118 | m_isLeftRight = true; | ||
2001 | 2119 | | |||
2002 | m_ui.gridLayout->addWidget(m_ui.searchCombo, 0, 1, 1, 8); | 2120 | m_ui.gridLayout->addWidget(m_ui.searchCombo, 0, 1, 1, 8); | ||
2003 | m_ui.gridLayout->addWidget(m_ui.findLabel, 0, 0); | 2121 | m_ui.gridLayout->addWidget(m_ui.findLabel, 0, 0); | ||
2004 | m_ui.gridLayout->addWidget(m_ui.searchButton, 1, 0, 1, 2); | 2122 | m_ui.gridLayout->addWidget(m_ui.searchButton, 1, 0, 1, 2); | ||
Context not available. | |||||
2007 | m_ui.gridLayout->addWidget(m_ui.displayOptions, 1, 6); | 2125 | m_ui.gridLayout->addWidget(m_ui.displayOptions, 1, 6); | ||
2008 | m_ui.gridLayout->addWidget(m_ui.matchCase, 1, 7); | 2126 | m_ui.gridLayout->addWidget(m_ui.matchCase, 1, 7); | ||
2009 | m_ui.gridLayout->addWidget(m_ui.useRegExp, 1, 8); | 2127 | m_ui.gridLayout->addWidget(m_ui.useRegExp, 1, 8); | ||
2010 | 2128 | | |||
2011 | m_ui.gridLayout->addWidget(m_ui.replaceCombo, 2, 1, 1, 8); | 2129 | m_ui.gridLayout->addWidget(m_ui.replaceCombo, 2, 1, 1, 8); | ||
2012 | m_ui.gridLayout->addWidget(m_ui.replaceLabel, 2, 0); | 2130 | m_ui.gridLayout->addWidget(m_ui.replaceLabel, 2, 0); | ||
2013 | m_ui.gridLayout->addWidget(m_ui.replaceButton, 3, 0, 1, 2); | 2131 | m_ui.gridLayout->addWidget(m_ui.replaceButton, 3, 0, 1, 2); | ||
2014 | m_ui.gridLayout->addWidget(m_ui.replaceCheckedBtn, 3, 2); | 2132 | m_ui.gridLayout->addWidget(m_ui.replaceCheckedBtn, 3, 2); | ||
2015 | m_ui.gridLayout->addWidget(m_ui.expandResults, 3, 7); | 2133 | m_ui.gridLayout->addWidget(m_ui.expandResults, 3, 7); | ||
2016 | m_ui.gridLayout->addWidget(m_ui.newTabButton, 3, 8); | 2134 | m_ui.gridLayout->addWidget(m_ui.newTabButton, 3, 8); | ||
2017 | 2135 | | |||
2018 | m_ui.gridLayout->setColumnStretch(4, 2); | 2136 | m_ui.gridLayout->setColumnStretch(4, 2); | ||
2019 | m_ui.gridLayout->setColumnStretch(2, 0); | 2137 | m_ui.gridLayout->setColumnStretch(2, 0); | ||
2020 | } | 2138 | } | ||
Context not available. | |||||
2027 | m_ui.gridLayout->addWidget(m_ui.searchPlaceCombo, 0, 5, 1, 4); | 2145 | m_ui.gridLayout->addWidget(m_ui.searchPlaceCombo, 0, 5, 1, 4); | ||
2028 | m_ui.gridLayout->addWidget(m_ui.matchCase, 1, 5); | 2146 | m_ui.gridLayout->addWidget(m_ui.matchCase, 1, 5); | ||
2029 | m_ui.gridLayout->addWidget(m_ui.useRegExp, 1, 6); | 2147 | m_ui.gridLayout->addWidget(m_ui.useRegExp, 1, 6); | ||
2030 | 2148 | | |||
2031 | m_ui.gridLayout->addWidget(m_ui.replaceCombo, 1, 2); | 2149 | m_ui.gridLayout->addWidget(m_ui.replaceCombo, 1, 2); | ||
2032 | m_ui.gridLayout->addWidget(m_ui.replaceLabel, 1, 1); | 2150 | m_ui.gridLayout->addWidget(m_ui.replaceLabel, 1, 1); | ||
2033 | m_ui.gridLayout->addWidget(m_ui.replaceButton, 1, 3); | 2151 | m_ui.gridLayout->addWidget(m_ui.replaceButton, 1, 3); | ||
Context not available. | |||||
2035 | m_ui.gridLayout->addWidget(m_ui.expandResults, 1, 8); | 2153 | m_ui.gridLayout->addWidget(m_ui.expandResults, 1, 8); | ||
2036 | m_ui.gridLayout->addWidget(m_ui.newTabButton, 0, 0); | 2154 | m_ui.gridLayout->addWidget(m_ui.newTabButton, 0, 0); | ||
2037 | m_ui.gridLayout->addWidget(m_ui.displayOptions, 1, 0); | 2155 | m_ui.gridLayout->addWidget(m_ui.displayOptions, 1, 0); | ||
2038 | 2156 | | |||
2039 | m_ui.gridLayout->setColumnStretch(4, 0); | 2157 | m_ui.gridLayout->setColumnStretch(4, 0); | ||
2040 | m_ui.gridLayout->setColumnStretch(2, 2); | 2158 | m_ui.gridLayout->setColumnStretch(2, 2); | ||
2041 | 2159 | | |||
2042 | m_ui.findLabel->setAlignment(Qt::AlignRight); | 2160 | m_ui.findLabel->setAlignment(Qt::AlignRight); | ||
2043 | m_ui.replaceLabel->setAlignment(Qt::AlignRight); | 2161 | m_ui.replaceLabel->setAlignment(Qt::AlignRight); | ||
2044 | } | 2162 | } | ||
Context not available. | |||||
2090 | 2208 | | |||
2091 | menu->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); | 2209 | menu->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); | ||
2092 | 2210 | | |||
2093 | actionPointers << menuEntry(menu, QStringLiteral("^"), QStringLiteral(""), i18n("Beginning of line")); | 2211 | addRegexHelperActionsForSearch(&actionPointers, menu); | ||
2094 | actionPointers << menuEntry(menu, QStringLiteral("$"), QStringLiteral(""), i18n("End of line")); | | |||
2095 | menu->addSeparator(); | | |||
2096 | actionPointers << menuEntry(menu, QStringLiteral("."), QStringLiteral(""), i18n("Any single character (excluding line breaks)")); | | |||
2097 | menu->addSeparator(); | | |||
2098 | actionPointers << menuEntry(menu, QStringLiteral("+"), QStringLiteral(""), i18n("One or more occurrences")); | | |||
2099 | actionPointers << menuEntry(menu, QStringLiteral("*"), QStringLiteral(""), i18n("Zero or more occurrences")); | | |||
2100 | actionPointers << menuEntry(menu, QStringLiteral("?"), QStringLiteral(""), i18n("Zero or one occurrences")); | | |||
2101 | actionPointers << menuEntry(menu, QStringLiteral("{"), QStringLiteral(",}"), i18n("<a> through <b> occurrences"), QStringLiteral("{a"), QStringLiteral(",b}")); | | |||
2102 | menu->addSeparator(); | | |||
2103 | actionPointers << menuEntry(menu, QStringLiteral("("), QStringLiteral(")"), i18n("Group, capturing")); | | |||
2104 | actionPointers << menuEntry(menu, QStringLiteral("|"), QStringLiteral(""), i18n("Or")); | | |||
2105 | actionPointers << menuEntry(menu, QStringLiteral("["), QStringLiteral("]"), i18n("Set of characters")); | | |||
2106 | actionPointers << menuEntry(menu, QStringLiteral("[^"), QStringLiteral("]"), i18n("Negative set of characters")); | | |||
2107 | actionPointers << menuEntry(menu, QStringLiteral("(?:"), QStringLiteral(")"), i18n("Group, non-capturing"), QStringLiteral("(?:E")); | | |||
2108 | actionPointers << menuEntry(menu, QStringLiteral("(?="), QStringLiteral(")"), i18n("Lookahead"), QStringLiteral("(?=E")); | | |||
2109 | actionPointers << menuEntry(menu, QStringLiteral("(?!"), QStringLiteral(")"), i18n("Negative lookahead"), QStringLiteral("(?!E")); | | |||
2110 | | ||||
2111 | menu->addSeparator(); | | |||
2112 | actionPointers << menuEntry(menu, QStringLiteral("\\n"), QStringLiteral(""), i18n("Line break")); | | |||
2113 | actionPointers << menuEntry(menu, QStringLiteral("\\t"), QStringLiteral(""), i18n("Tab")); | | |||
2114 | actionPointers << menuEntry(menu, QStringLiteral("\\b"), QStringLiteral(""), i18n("Word boundary")); | | |||
2115 | actionPointers << menuEntry(menu, QStringLiteral("\\B"), QStringLiteral(""), i18n("Not word boundary")); | | |||
2116 | actionPointers << menuEntry(menu, QStringLiteral("\\d"), QStringLiteral(""), i18n("Digit")); | | |||
2117 | actionPointers << menuEntry(menu, QStringLiteral("\\D"), QStringLiteral(""), i18n("Non-digit")); | | |||
2118 | actionPointers << menuEntry(menu, QStringLiteral("\\s"), QStringLiteral(""), i18n("Whitespace (excluding line breaks)")); | | |||
2119 | actionPointers << menuEntry(menu, QStringLiteral("\\S"), QStringLiteral(""), i18n("Non-whitespace (excluding line breaks)")); | | |||
2120 | actionPointers << menuEntry(menu, QStringLiteral("\\w"), QStringLiteral(""), i18n("Word character (alphanumerics plus '_')")); | | |||
2121 | actionPointers << menuEntry(menu, QStringLiteral("\\W"), QStringLiteral(""), i18n("Non-word character")); | | |||
2122 | } | | |||
2123 | // Show menu | | |||
2124 | QAction * const result = contextMenu->exec(m_ui.searchCombo->mapToGlobal(pos)); | | |||
2125 | | ||||
2126 | // Act on action | | |||
2127 | if (result && actionPointers.contains(result)) { | | |||
2128 | QLineEdit * lineEdit = m_ui.searchCombo->lineEdit(); | | |||
2129 | const int cursorPos = lineEdit->cursorPosition(); | | |||
2130 | QStringList beforeAfter = result->data().toString().split(QLatin1Char(' ')); | | |||
2131 | if (beforeAfter.size() != 2) return; | | |||
2132 | lineEdit->insert(beforeAfter[0] + beforeAfter[1]); | | |||
2133 | lineEdit->setCursorPosition(cursorPos + beforeAfter[0].count()); | | |||
2134 | lineEdit->setFocus(); | | |||
2135 | } | 2212 | } | ||
2213 | | ||||
2214 | // Show menu and act | ||||
2215 | QAction * const result = contextMenu->exec(m_ui.searchCombo->mapToGlobal(pos)); | ||||
2216 | regexHelperActOnAction(result, actionPointers, m_ui.searchCombo->lineEdit()); | ||||
2136 | } | 2217 | } | ||
2137 | 2218 | | |||
2138 | void KatePluginSearchView::replaceContextMenu(const QPoint& pos) | 2219 | void KatePluginSearchView::replaceContextMenu(const QPoint& pos) | ||
Context not available. | |||||
2145 | menu->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); | 2226 | menu->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); | ||
2146 | 2227 | | |||
2147 | QSet<QAction *> actionPointers; | 2228 | QSet<QAction *> actionPointers; | ||
2148 | actionPointers << menuEntry(menu, QStringLiteral("\\n"), QStringLiteral(""), i18n("Line break")); | 2229 | addSpecialCharsHelperActionsForReplace(&actionPointers, menu); | ||
2149 | actionPointers << menuEntry(menu, QStringLiteral("\\t"), QStringLiteral(""), i18n("Tab")); | | |||
2150 | | ||||
2151 | 2230 | | |||
2152 | if (m_ui.useRegExp->isChecked()) { | 2231 | if (m_ui.useRegExp->isChecked()) { | ||
2153 | menu->addSeparator(); | 2232 | addRegexHelperActionsForReplace(&actionPointers, menu); | ||
2154 | actionPointers << menuEntry(menu, QStringLiteral("\\0"), QStringLiteral(""), i18n("Regular expression capture 0 (whole match)")); | | |||
2155 | actionPointers << menuEntry(menu, QStringLiteral("\\"), QStringLiteral(""), i18n("Regular expression capture 1-9"), QStringLiteral("\\#")); | | |||
2156 | actionPointers << menuEntry(menu, QStringLiteral("\\{"), QStringLiteral("}"), i18n("Regular expression capture 0-999"), QStringLiteral("\\{#")); | | |||
2157 | menu->addSeparator(); | | |||
2158 | actionPointers << menuEntry(menu, QStringLiteral("\\U\\"), QStringLiteral(""), i18n("Upper-cased capture 0-9"), QStringLiteral("\\U\\#")); | | |||
2159 | actionPointers << menuEntry(menu, QStringLiteral("\\U\\{"), QStringLiteral("}"), i18n("Upper-cased capture 0-999"), QStringLiteral("\\U\\{###")); | | |||
2160 | actionPointers << menuEntry(menu, QStringLiteral("\\L\\"), QStringLiteral(""), i18n("Lower-cased capture 0-9"), QStringLiteral("\\L\\#")); | | |||
2161 | actionPointers << menuEntry(menu, QStringLiteral("\\L\\{"), QStringLiteral("}"), i18n("Lower-cased capture 0-999"), QStringLiteral("\\L\\{###")); | | |||
2162 | } | | |||
2163 | // Show menu | | |||
2164 | QAction * const result = contextMenu->exec(m_ui.replaceCombo->mapToGlobal(pos)); | | |||
2165 | | ||||
2166 | // Act on action | | |||
2167 | if (result && actionPointers.contains(result)) { | | |||
2168 | QLineEdit * lineEdit = m_ui.replaceCombo->lineEdit(); | | |||
2169 | const int cursorPos = lineEdit->cursorPosition(); | | |||
2170 | QStringList beforeAfter = result->data().toString().split(QLatin1Char(' ')); | | |||
2171 | if (beforeAfter.size() != 2) return; | | |||
2172 | lineEdit->insert(beforeAfter[0] + beforeAfter[1]); | | |||
2173 | lineEdit->setCursorPosition(cursorPos + beforeAfter[0].count()); | | |||
2174 | lineEdit->setFocus(); | | |||
2175 | } | 2233 | } | ||
2234 | | ||||
2235 | // Show menu and act | ||||
2236 | QAction * const result = contextMenu->exec(m_ui.replaceCombo->mapToGlobal(pos)); | ||||
2237 | regexHelperActOnAction(result, actionPointers, m_ui.replaceCombo->lineEdit()); | ||||
2176 | } | 2238 | } | ||
2177 | 2239 | | |||
2178 | void KatePluginSearchView::slotPluginViewCreated(const QString &name, QObject *pluginView) | 2240 | void KatePluginSearchView::slotPluginViewCreated(const QString &name, QObject *pluginView) | ||
Context not available. |