Skip to content

Commit a8e891a

Browse files
authored
Add hidden option always_suggest_capitilized_word (#335)
1 parent fd44c9a commit a8e891a

File tree

6 files changed

+42
-26
lines changed

6 files changed

+42
-26
lines changed

src/plugin/Plugin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ void show_spell_check_menu_at_cursor() {
172172
context_menu_handler->update_word_under_cursor_data();
173173
if (context_menu_handler->is_word_under_cursor_correct())
174174
return;
175-
MenuItem::append_to_menu(menu, context_menu_handler->get_suggestion_menu_items());
175+
MenuItem::append_to_menu(menu, context_menu_handler->select_word_and_get_suggestion_menu_items());
176176

177177
tagTPMPARAMS tpm_params;
178178
tpm_params.cbSize = sizeof(tagTPMPARAMS);

src/plugin/Settings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,4 +291,5 @@ void Settings::process(IniWorker &worker) {
291291
worker.process(L"Write_Debug_Log", data.write_debug_log, false);
292292
worker.process(L"FTP_use_passive_mode", data.ftp_use_passive_mode, true);
293293
worker.process(L"select_word_on_context_menu_click", data.select_word_on_context_menu_click, true);
294+
worker.process(L"always_suggest_capitilized_word", data.always_suggest_capitalized_word, false);
294295
}

src/plugin/Settings.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ class Settings {
200200
bool write_debug_log = false;
201201
LanguageNameStyle language_name_style = LanguageNameStyle::english;
202202
bool select_word_on_context_menu_click = false;
203+
bool always_suggest_capitalized_word = false;
203204

204205
// Derivatives:
205206
private:

src/ui/ContextMenuHandler.cpp

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -104,18 +104,18 @@ void ContextMenuHandler::do_plugin_menu_inclusion(bool invalidate) {
104104

105105
void ContextMenuHandler::process_ignore_all() {
106106
auto mut = m_speller_container.modify();
107-
mut->ignore_word(m_selected_word.str);
107+
mut->ignore_word(m_last_selected_word.str);
108108
m_word_under_cursor_length =
109-
static_cast<TextPosition>(m_selected_word.str.length());
109+
static_cast<TextPosition>(m_last_selected_word.str.length());
110110
m_editor.set_cursor_pos(m_word_under_cursor_pos +
111111
m_word_under_cursor_length);
112112
}
113113

114114
void ContextMenuHandler::process_add_to_dictionary() {
115115
auto mut = m_speller_container.modify();
116-
mut->add_to_dictionary(m_selected_word.str);
116+
mut->add_to_dictionary(m_last_selected_word.str);
117117
m_word_under_cursor_length =
118-
static_cast<TextPosition>(m_selected_word.str.length());
118+
static_cast<TextPosition>(m_last_selected_word.str.length());
119119
m_editor.set_cursor_pos(m_word_under_cursor_pos +
120120
m_word_under_cursor_length);
121121
}
@@ -243,7 +243,7 @@ void ContextMenuHandler::precalculate_menu() {
243243
m_settings.data.suggestions_mode == SuggestionMode::context_menu) {
244244
update_word_under_cursor_data();
245245
if (!m_word_under_cursor_is_correct) {
246-
suggestion_menu_items = get_suggestion_menu_items();
246+
suggestion_menu_items = select_word_and_get_suggestion_menu_items();
247247
suggestion_menu_items.emplace_back(MenuItem::Separator{});
248248
}
249249
}
@@ -309,44 +309,57 @@ void ContextMenuHandler::init_suggestions_box(
309309
suggestion_button.display(true, false);
310310
}
311311

312-
std::vector<MenuItem>
313-
ContextMenuHandler::get_suggestion_menu_items() {
314-
if (!m_speller_container.active_speller().is_working())
315-
return {}; // Word is already off-screen
316-
312+
bool ContextMenuHandler::select_word_under_cursor() {
317313
auto pos = m_word_under_cursor_pos;
318314
ACTIVE_VIEW_BLOCK(m_editor);
319315
if (m_settings.data.select_word_on_context_menu_click)
320316
m_editor.set_selection(pos, pos + m_word_under_cursor_length);
321-
std::vector<MenuItem> suggestion_menu_items;
322-
m_selected_word = m_editor.get_mapped_wstring_range(m_word_under_cursor_pos, m_word_under_cursor_pos + static_cast<TextPosition>(m_word_under_cursor_length));
323-
SpellCheckerHelpers::apply_word_conversions(m_settings, m_selected_word.str);
317+
m_last_selected_word =
318+
m_editor.get_mapped_wstring_range(m_word_under_cursor_pos, m_word_under_cursor_pos + static_cast<TextPosition>(m_word_under_cursor_length));
319+
SpellCheckerHelpers::apply_word_conversions(m_settings, m_last_selected_word.str);
320+
return true;
321+
}
324322

325-
m_last_suggestions = m_speller_container.active_speller().get_suggestions(
326-
m_selected_word.str.c_str());
323+
std::vector<MenuItem> ContextMenuHandler::select_word_and_get_suggestion_menu_items() {
324+
if (!m_speller_container.active_speller().is_working())
325+
return {}; // Word is already off-screen
327326

328-
for (int i = 0; i < static_cast<int>(m_last_suggestions.size()); i++) {
329-
if (i >= m_settings.data.suggestion_count)
330-
break;
327+
select_word_under_cursor();
328+
std::vector<MenuItem> suggestion_menu_items;
329+
m_last_suggestions = m_speller_container.active_speller().get_suggestions(
330+
m_last_selected_word.str.c_str());
331+
m_last_suggestions.resize(std::min(static_cast<int>(m_last_suggestions.size()), m_settings.data.suggestion_count));
331332

333+
int i = 0;
334+
for (; i < static_cast<int>(m_last_suggestions.size()); ++i) {
332335
auto item = m_last_suggestions[i].c_str();
333336
suggestion_menu_items.emplace_back(item, static_cast<BYTE>(i + 1));
334337
}
335338

339+
if (m_settings.data.always_suggest_capitalized_word && !m_last_selected_word.str.empty() && std::ranges::all_of(m_last_selected_word.str, &is_lower)) {
340+
auto copy = m_last_selected_word.str;
341+
copy.front() = make_upper(copy.front());
342+
if (std::ranges::find(m_last_suggestions, copy) == m_last_suggestions.end()) {
343+
auto &last = m_last_suggestions.emplace_back(std::move(copy));
344+
++i;
345+
suggestion_menu_items.emplace_back(last.c_str(), static_cast<BYTE>(i + 1));
346+
}
347+
}
348+
336349
if (!m_last_suggestions.empty()) {
337-
MenuItem replace_all_item(wstring_printf(rc_str(IDS_REPLACE_ALL_PS).c_str(), m_selected_word.str.c_str()).c_str(), -1);
350+
MenuItem replace_all_item(wstring_printf(rc_str(IDS_REPLACE_ALL_PS).c_str(), m_last_selected_word.str.c_str()).c_str(), -1);
338351
replace_all_item.children = suggestion_menu_items;
339352
suggestion_menu_items.emplace_back(MenuItem::Separator{});
340353
std::for_each(replace_all_item.children.begin(), replace_all_item.children.end(), [](auto &item) { item.id += menu_id::replace_all_start; });
341354
suggestion_menu_items.push_back(std::move(replace_all_item));
342355
}
343356

344-
SpellCheckerHelpers::apply_word_conversions(m_settings, m_selected_word.str);
357+
SpellCheckerHelpers::apply_word_conversions(m_settings, m_last_selected_word.str);
345358
auto menu_string = wstring_printf(rc_str(IDS_IGNORE_PS_FOR_CURRENT_SESSION).c_str(),
346-
m_selected_word.str.c_str());
359+
m_last_selected_word.str.c_str());
347360
suggestion_menu_items.emplace_back(menu_string.c_str(), menu_id::ignore_all);
348361
menu_string =
349-
wstring_printf(rc_str(IDS_ADD_PS_TO_DICTIONARY).c_str(), m_selected_word.str.c_str());;
362+
wstring_printf(rc_str(IDS_ADD_PS_TO_DICTIONARY).c_str(), m_last_selected_word.str.c_str());;
350363
suggestion_menu_items.emplace_back(menu_string.c_str(),
351364
menu_id::add_to_dictionary);
352365

src/ui/ContextMenuHandler.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,15 @@ class ContextMenuHandler {
2828
const SpellerContainer &speller_container,
2929
EditorInterface &editor,
3030
const SpellChecker &spell_checker);
31-
[[nodiscard]] std::vector<MenuItem> get_suggestion_menu_items();
31+
[[nodiscard]] std::vector<MenuItem> select_word_and_get_suggestion_menu_items();
3232
void process_menu_result(WPARAM menu_id);
3333
void update_word_under_cursor_data();
3434
void precalculate_menu();
3535
void init_suggestions_box(SuggestionMenuButton &suggestion_button);
3636
bool is_word_under_cursor_correct() const { return m_word_under_cursor_is_correct; }
3737

3838
private:
39+
bool select_word_under_cursor();
3940
void do_plugin_menu_inclusion(bool invalidate = false);
4041
void process_ignore_all();
4142
void process_add_to_dictionary();
@@ -48,7 +49,7 @@ class ContextMenuHandler {
4849
const Settings &m_settings;
4950
const SpellerContainer &m_speller_container;
5051
EditorInterface &m_editor;
51-
MappedWstring m_selected_word;
52+
MappedWstring m_last_selected_word;
5253
TextPosition m_word_under_cursor_length = 0;
5354
TextPosition m_word_under_cursor_pos = 0;
5455
std::vector<std::wstring> m_last_suggestions;

src/ui/SuggestionMenuButton.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ INT_PTR SuggestionMenuButton::run_dlg_proc(UINT message, WPARAM w_param,
177177
ClientToScreen(_hSelf, &p);
178178
m_state_menu = true;
179179
HMENU popup_menu = CreatePopupMenu();
180-
MenuItem::append_to_menu(popup_menu, m_context_menu_handler.get_suggestion_menu_items());
180+
MenuItem::append_to_menu(popup_menu, m_context_menu_handler.select_word_and_get_suggestion_menu_items());
181181
SetForegroundWindow(m_npp.get_editor_hwnd());
182182
TrackPopupMenuEx(popup_menu, TPM_HORIZONTAL | TPM_RIGHTALIGN, p.x,
183183
p.y, _hSelf, &tpm_params);

0 commit comments

Comments
 (0)