From 1c576a76e49940546243c7c0c30e4da77ec968c4 Mon Sep 17 00:00:00 2001 From: Rainer Kottenhoff Date: Mon, 23 Mar 2026 17:26:53 +0100 Subject: [PATCH] chg: add case conversions on rmb context menu --- language/common_res.h | 5 + language/np3_af_za/menu_af_za.rc | 12 +- language/np3_be_by/menu_be_by.rc | 12 +- language/np3_de_de/menu_de_de.rc | 12 +- language/np3_el_gr/menu_el_gr.rc | 12 +- language/np3_en_gb/menu_en_gb.rc | 12 +- language/np3_en_us/menu_en_us.rc | 10 ++ language/np3_es_es/menu_es_es.rc | 12 +- language/np3_fi_fi/menu_fi_fi.rc | 12 +- language/np3_fr_fr/menu_fr_fr.rc | 12 +- language/np3_hi_in/menu_hi_in.rc | 12 +- language/np3_hu_hu/menu_hu_hu.rc | 12 +- language/np3_id_id/menu_id_id.rc | 12 +- language/np3_it_it/menu_it_it.rc | 12 +- language/np3_ja_jp/menu_ja_jp.rc | 12 +- language/np3_ko_kr/menu_ko_kr.rc | 12 +- language/np3_nl_nl/menu_nl_nl.rc | 12 +- language/np3_pl_pl/menu_pl_pl.rc | 12 +- language/np3_pt_br/menu_pt_br.rc | 12 +- language/np3_pt_pt/menu_pt_pt.rc | 12 +- language/np3_ru_ru/menu_ru_ru.rc | 12 +- language/np3_sk_sk/menu_sk_sk.rc | 12 +- language/np3_sv_se/menu_sv_se.rc | 12 +- language/np3_tr_tr/menu_tr_tr.rc | 12 +- language/np3_vi_vn/menu_vi_vn.rc | 12 +- language/np3_zh_cn/menu_zh_cn.rc | 12 +- language/np3_zh_tw/menu_zh_tw.rc | 12 +- src/Edit.c | 263 +++++++++++++++++++------------ src/Notepad3.c | 59 +++++++ 29 files changed, 513 insertions(+), 124 deletions(-) diff --git a/language/common_res.h b/language/common_res.h index 9b901f9cf..bc338e62b 100644 --- a/language/common_res.h +++ b/language/common_res.h @@ -557,6 +557,11 @@ #define CMD_PARAGRAPH_UP 20063 #define CMD_PARAGRAPH_DOWN 20064 #define CMD_COPY_HYPERLINK 20065 +#define CMD_CTX_UPPERCASE 20066 +#define CMD_CTX_LOWERCASE 20067 +#define CMD_CTX_INVERTCASE 20068 +#define CMD_CTX_TITLECASE 20069 +#define CMD_CTX_SENTENCECASE 20070 #define IDS_MUI_MENU_LANGUAGE 34500 #define IDS_MUI_LANG_EN_US 34501 diff --git a/language/np3_af_za/menu_af_za.rc b/language/np3_af_za/menu_af_za.rc index b5733c9d4..54ca2d648 100644 --- a/language/np3_af_za/menu_af_za.rc +++ b/language/np3_af_za/menu_af_za.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Kies Alles", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Wissel Huidige Vou", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Web Sjabloon 1", CMD_WEBACTION1 diff --git a/language/np3_be_by/menu_be_by.rc b/language/np3_be_by/menu_be_by.rc index 44c032a40..76aa619a1 100644 --- a/language/np3_be_by/menu_be_by.rc +++ b/language/np3_be_by/menu_be_by.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Вылучыць усё", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Згарнуць/разгарнуць блок", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Адкрыць вэб-дзеянне 1", CMD_WEBACTION1 diff --git a/language/np3_de_de/menu_de_de.rc b/language/np3_de_de/menu_de_de.rc index 6099c386a..dd8a175a2 100644 --- a/language/np3_de_de/menu_de_de.rc +++ b/language/np3_de_de/menu_de_de.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Alle Auswählen", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Aktuelle Falte umschalten", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Öffne Web-Aktion 1", CMD_WEBACTION1 diff --git a/language/np3_el_gr/menu_el_gr.rc b/language/np3_el_gr/menu_el_gr.rc index d84b203e8..e1c0cffe4 100644 --- a/language/np3_el_gr/menu_el_gr.rc +++ b/language/np3_el_gr/menu_el_gr.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Επιλογή όλων", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Εναλλαγή τρέχουσας δίπλωσης", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Άνοιγμα ενέργειας Web 1", CMD_WEBACTION1 diff --git a/language/np3_en_gb/menu_en_gb.rc b/language/np3_en_gb/menu_en_gb.rc index 89e816de5..f3f5d0410 100644 --- a/language/np3_en_gb/menu_en_gb.rc +++ b/language/np3_en_gb/menu_en_gb.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Select All", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Toggle Current Fold", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Open Web Action 1", CMD_WEBACTION1 diff --git a/language/np3_en_us/menu_en_us.rc b/language/np3_en_us/menu_en_us.rc index 1857f2809..656e1a61d 100644 --- a/language/np3_en_us/menu_en_us.rc +++ b/language/np3_en_us/menu_en_us.rc @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Select All", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END + MENUITEM SEPARATOR MENUITEM "Toggle Current Fold", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Open Web Action 1", CMD_WEBACTION1 diff --git a/language/np3_es_es/menu_es_es.rc b/language/np3_es_es/menu_es_es.rc index 7defa3896..f0c569004 100644 --- a/language/np3_es_es/menu_es_es.rc +++ b/language/np3_es_es/menu_es_es.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Seleccionar todo", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Alternar el pliegue actual", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Abrir Web Acción 1", CMD_WEBACTION1 diff --git a/language/np3_fi_fi/menu_fi_fi.rc b/language/np3_fi_fi/menu_fi_fi.rc index c36b3686c..b2beb270c 100644 --- a/language/np3_fi_fi/menu_fi_fi.rc +++ b/language/np3_fi_fi/menu_fi_fi.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Valitse kaikki", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Vaihda nykyinen laskos", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Avaa verkkotoiminto 1", CMD_WEBACTION1 diff --git a/language/np3_fr_fr/menu_fr_fr.rc b/language/np3_fr_fr/menu_fr_fr.rc index 2a641c268..d28089fbe 100644 --- a/language/np3_fr_fr/menu_fr_fr.rc +++ b/language/np3_fr_fr/menu_fr_fr.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Sélectionner tout", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Commuter le pli actuel", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Ouvrir Action Web &1", CMD_WEBACTION1 diff --git a/language/np3_hi_in/menu_hi_in.rc b/language/np3_hi_in/menu_hi_in.rc index 81afe995c..7052281aa 100644 --- a/language/np3_hi_in/menu_hi_in.rc +++ b/language/np3_hi_in/menu_hi_in.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "सारा चुनें", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "चालू फोल्ड टॉगल करें", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "वेब प्रक्रिया 1 खोलें", CMD_WEBACTION1 diff --git a/language/np3_hu_hu/menu_hu_hu.rc b/language/np3_hu_hu/menu_hu_hu.rc index dbe64bb01..67124c2e9 100644 --- a/language/np3_hu_hu/menu_hu_hu.rc +++ b/language/np3_hu_hu/menu_hu_hu.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Mind kjelölése", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Aktuális becsukás váltása", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Webes művelet 1", CMD_WEBACTION1 diff --git a/language/np3_id_id/menu_id_id.rc b/language/np3_id_id/menu_id_id.rc index 697601aef..a9ff96fad 100644 --- a/language/np3_id_id/menu_id_id.rc +++ b/language/np3_id_id/menu_id_id.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Pilih Semua", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Alihkan Lipatan", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Buka Aksi Web 1", CMD_WEBACTION1 diff --git a/language/np3_it_it/menu_it_it.rc b/language/np3_it_it/menu_it_it.rc index bbb216796..981e9fe89 100644 --- a/language/np3_it_it/menu_it_it.rc +++ b/language/np3_it_it/menu_it_it.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Seleziona tutto", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Espandi/riduci raggruppamento", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Apri azione web 1", CMD_WEBACTION1 diff --git a/language/np3_ja_jp/menu_ja_jp.rc b/language/np3_ja_jp/menu_ja_jp.rc index 481c3ffa2..734801d92 100644 --- a/language/np3_ja_jp/menu_ja_jp.rc +++ b/language/np3_ja_jp/menu_ja_jp.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "すべて選択", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "ここの折りたたみを切替", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "ウェブ1で開く", CMD_WEBACTION1 diff --git a/language/np3_ko_kr/menu_ko_kr.rc b/language/np3_ko_kr/menu_ko_kr.rc index 32df4e6ad..34a59fe09 100644 --- a/language/np3_ko_kr/menu_ko_kr.rc +++ b/language/np3_ko_kr/menu_ko_kr.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "모두 선택", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "현재 접기 전환", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "웹 작업 1 열기", CMD_WEBACTION1 diff --git a/language/np3_nl_nl/menu_nl_nl.rc b/language/np3_nl_nl/menu_nl_nl.rc index 94057b3d4..ccdbe6c89 100644 --- a/language/np3_nl_nl/menu_nl_nl.rc +++ b/language/np3_nl_nl/menu_nl_nl.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Alles selecteren", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Huidige in/uitklappen wisselen", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Websjabloon 1 openen", CMD_WEBACTION1 diff --git a/language/np3_pl_pl/menu_pl_pl.rc b/language/np3_pl_pl/menu_pl_pl.rc index 53bbc206a..5ce24febf 100644 --- a/language/np3_pl_pl/menu_pl_pl.rc +++ b/language/np3_pl_pl/menu_pl_pl.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Zaznacz wszystko", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Przełącz Current Fold", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Otwórz Web Action 1", CMD_WEBACTION1 diff --git a/language/np3_pt_br/menu_pt_br.rc b/language/np3_pt_br/menu_pt_br.rc index 3986c4a73..15748a77e 100644 --- a/language/np3_pt_br/menu_pt_br.rc +++ b/language/np3_pt_br/menu_pt_br.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Selecionar Tudo", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Tocar Dobra Atual", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Abrir Ação Web 1", CMD_WEBACTION1 diff --git a/language/np3_pt_pt/menu_pt_pt.rc b/language/np3_pt_pt/menu_pt_pt.rc index 9b45f6935..d579770c7 100644 --- a/language/np3_pt_pt/menu_pt_pt.rc +++ b/language/np3_pt_pt/menu_pt_pt.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Seleccionar tudo", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Alternar dobragem actual", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Abrir acção Web 1", CMD_WEBACTION1 diff --git a/language/np3_ru_ru/menu_ru_ru.rc b/language/np3_ru_ru/menu_ru_ru.rc index 2a639833d..351fed9a1 100644 --- a/language/np3_ru_ru/menu_ru_ru.rc +++ b/language/np3_ru_ru/menu_ru_ru.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Выделить всё", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Свернуть/развернуть блок", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Открыть веб-действие 1", CMD_WEBACTION1 diff --git a/language/np3_sk_sk/menu_sk_sk.rc b/language/np3_sk_sk/menu_sk_sk.rc index 5c28362ce..65ee1f9e4 100644 --- a/language/np3_sk_sk/menu_sk_sk.rc +++ b/language/np3_sk_sk/menu_sk_sk.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Vybrať všetko", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Prepnúť aktuálny uzol", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Webová šablóna 1", CMD_WEBACTION1 diff --git a/language/np3_sv_se/menu_sv_se.rc b/language/np3_sv_se/menu_sv_se.rc index d19cb98d2..2761ebfc1 100644 --- a/language/np3_sv_se/menu_sv_se.rc +++ b/language/np3_sv_se/menu_sv_se.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Välj allt", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Växla ihopvikning", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Öppna webb 1", CMD_WEBACTION1 diff --git a/language/np3_tr_tr/menu_tr_tr.rc b/language/np3_tr_tr/menu_tr_tr.rc index 84f59b99f..7c73a588e 100644 --- a/language/np3_tr_tr/menu_tr_tr.rc +++ b/language/np3_tr_tr/menu_tr_tr.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Tümünü seç", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Geçerli daraltmayı aç/kapat", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "1. web işlemini aç", CMD_WEBACTION1 diff --git a/language/np3_vi_vn/menu_vi_vn.rc b/language/np3_vi_vn/menu_vi_vn.rc index 0764a7569..69b294c00 100644 --- a/language/np3_vi_vn/menu_vi_vn.rc +++ b/language/np3_vi_vn/menu_vi_vn.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Chọn tất cả", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "Chuyển đổi gấp hiện tại", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "Mở tác vụ web 1", CMD_WEBACTION1 diff --git a/language/np3_zh_cn/menu_zh_cn.rc b/language/np3_zh_cn/menu_zh_cn.rc index 6c3ecb33c..580410d11 100644 --- a/language/np3_zh_cn/menu_zh_cn.rc +++ b/language/np3_zh_cn/menu_zh_cn.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "全选", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "折叠/展开", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "用超链接模板 1 打开", CMD_WEBACTION1 diff --git a/language/np3_zh_tw/menu_zh_tw.rc b/language/np3_zh_tw/menu_zh_tw.rc index e1e524bb4..6e0631f7b 100644 --- a/language/np3_zh_tw/menu_zh_tw.rc +++ b/language/np3_zh_tw/menu_zh_tw.rc @@ -1,4 +1,4 @@ -// Microsoft Visual C++ generated resource script. +// Microsoft Visual C++ generated resource script. // encoding: UTF-8 #pragma code_page(65001) // UTF-8 #include "resource.h" @@ -572,6 +572,16 @@ BEGIN MENUITEM SEPARATOR MENUITEM "全選", IDM_EDIT_SELECTALL MENUITEM SEPARATOR + MENUITEM SEPARATOR + POPUP "Convert Case" + BEGIN + MENUITEM "Uppercase", CMD_CTX_UPPERCASE + MENUITEM "Lowercase", CMD_CTX_LOWERCASE + MENUITEM SEPARATOR + MENUITEM "Invert Case", CMD_CTX_INVERTCASE + MENUITEM "Title Case", CMD_CTX_TITLECASE + MENUITEM "Sentence Case", CMD_CTX_SENTENCECASE + END MENUITEM "摺疊/展開", IDM_VIEW_TOGGLE_CURRENT_FOLD MENUITEM SEPARATOR MENUITEM "用超連結模板 1 打開", CMD_WEBACTION1 diff --git a/src/Edit.c b/src/Edit.c index 578339651..d584d141c 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -1892,26 +1892,40 @@ observe: void EditInvertCase(HWND hwnd) { UNREFERENCED_PARAMETER(hwnd); - const DocPos iCurPos = SciCall_GetCurrentPos(); - const DocPos iAnchorPos = SciCall_GetAnchor(); - if (iCurPos != iAnchorPos) { - if (Sci_IsMultiOrRectangleSelection()) { - InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_SELRECTORMULTI); - return; + if (SciCall_IsSelectionEmpty()) { + return; + } + + UndoTransActionBegin(); + + bool const bIsRectSel = SciCall_IsSelectionRectangle(); + DocPos selAnchorMainPos = 0, selCaretMainPos = 0; + DocPos vSpcAnchorMainPos = 0, vSpcCaretMainPos = 0; + if (bIsRectSel) { + selAnchorMainPos = SciCall_GetRectangularSelectionAnchor(); + selCaretMainPos = SciCall_GetRectangularSelectionCaret(); + vSpcAnchorMainPos = SciCall_GetRectangularSelectionAnchorVirtualSpace(); + vSpcCaretMainPos = SciCall_GetRectangularSelectionCaretVirtualSpace(); + } + + DocPosU const selCount = SciCall_GetSelections(); + for (DocPosU s = 0; s < selCount; ++s) { + DocPos const selStart = SciCall_GetSelectionNStart(s); + DocPos const selEnd = SciCall_GetSelectionNEnd(s); + DocPos const selByteLen = selEnd - selStart; + if (selByteLen <= 0) { + continue; } - const DocPos iSelStart = SciCall_GetSelectionStart(); - const DocPos iSelEnd = SciCall_GetSelectionEnd(); - const DocPos iSelLen = SciCall_GetSelText(NULL); - - LPWSTR const pszTextW = AllocMem((iSelLen + 1) * sizeof(WCHAR), HEAP_ZERO_MEMORY); - if (pszTextW) { - - size_t const cchTextW = EditGetSelectedText(pszTextW, (iSelLen + 1)); + char* pszText = AllocMem(selByteLen + 1, HEAP_ZERO_MEMORY); + LPWSTR pszTextW = AllocMem((selByteLen + 1) * sizeof(WCHAR), HEAP_ZERO_MEMORY); + if (pszText && pszTextW) { + StringCchCopyNA(pszText, selByteLen + 1, SciCall_GetRangePointer(selStart, selByteLen), selByteLen); + int const cchTextW = MultiByteToWideChar(Encoding_SciCP, 0, pszText, (int)selByteLen, pszTextW, (int)(selByteLen + 1)); bool bChanged = false; - for (size_t i = 0; i < cchTextW; i++) { + for (int i = 0; i < cchTextW; i++) { if (IsCharUpperW(pszTextW[i])) { pszTextW[i] = LOWORD(CharLowerW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0))); bChanged = true; @@ -1922,18 +1936,27 @@ void EditInvertCase(HWND hwnd) } if (bChanged) { - char* const pszText = AllocMem((iSelLen + 1), HEAP_ZERO_MEMORY); - WideCharToMultiByte(Encoding_SciCP, 0, pszTextW, (int)cchTextW, pszText, (int)(iSelLen + 1), NULL, NULL); - UndoTransActionBegin(); - SciCall_Clear(); - SciCall_AddText((iSelEnd - iSelStart), pszText); - SciCall_SetSel(iAnchorPos, iCurPos); - EndUndoTransAction(); - FreeMem(pszText); + int const cbNew = WideCharToMultiByte(Encoding_SciCP, 0, pszTextW, cchTextW, pszText, (int)(selByteLen + 1), NULL, NULL); + SciCall_SetTargetRange(selStart, selEnd); + Sci_ReplaceTargetTestChgHist(cbNew, pszText); } - FreeMem(pszTextW); + } + FreeMem(pszText); + FreeMem(pszTextW); + } + + if (bIsRectSel) { + SciCall_SetRectangularSelectionAnchor(selAnchorMainPos); + if (vSpcAnchorMainPos > 0) { + SciCall_SetRectangularSelectionAnchorVirtualSpace(vSpcAnchorMainPos); + } + SciCall_SetRectangularSelectionCaret(selCaretMainPos); + if (vSpcCaretMainPos > 0) { + SciCall_SetRectangularSelectionCaretVirtualSpace(vSpcCaretMainPos); } } + + EndUndoTransAction(); } @@ -1944,51 +1967,72 @@ void EditInvertCase(HWND hwnd) void EditTitleCase(HWND hwnd) { UNREFERENCED_PARAMETER(hwnd); - const DocPos iCurPos = SciCall_GetCurrentPos(); - const DocPos iAnchorPos = SciCall_GetAnchor(); - if (iCurPos != iAnchorPos) { - if (Sci_IsMultiOrRectangleSelection()) { - InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_SELRECTORMULTI); - return; - } - const DocPos iSelStart = SciCall_GetSelectionStart(); - const DocPos iSelEnd = SciCall_GetSelectionEnd(); - const DocPos iSelLen = SciCall_GetSelText(NULL); + if (SciCall_IsSelectionEmpty()) { + return; + } - LPWSTR const pszTextW = AllocMem(((iSelLen + 1) * sizeof(WCHAR)), HEAP_ZERO_MEMORY); + UndoTransActionBegin(); - if (pszTextW == NULL) { - FreeMem(pszTextW); - return; + bool const bIsRectSel = SciCall_IsSelectionRectangle(); + DocPos selAnchorMainPos = 0, selCaretMainPos = 0; + DocPos vSpcAnchorMainPos = 0, vSpcCaretMainPos = 0; + if (bIsRectSel) { + selAnchorMainPos = SciCall_GetRectangularSelectionAnchor(); + selCaretMainPos = SciCall_GetRectangularSelectionCaret(); + vSpcAnchorMainPos = SciCall_GetRectangularSelectionAnchorVirtualSpace(); + vSpcCaretMainPos = SciCall_GetRectangularSelectionCaretVirtualSpace(); + } + + DocPosU const selCount = SciCall_GetSelections(); + for (DocPosU s = 0; s < selCount; ++s) { + DocPos const selStart = SciCall_GetSelectionNStart(s); + DocPos const selEnd = SciCall_GetSelectionNEnd(s); + DocPos const selByteLen = selEnd - selStart; + if (selByteLen <= 0) { + continue; } - size_t const cchTextW = EditGetSelectedText(pszTextW, (iSelLen + 1)); + char* pszText = AllocMem(selByteLen + 1, HEAP_ZERO_MEMORY); + LPWSTR pszTextW = AllocMem((selByteLen + 1) * sizeof(WCHAR), HEAP_ZERO_MEMORY); + if (pszText && pszTextW) { + StringCchCopyNA(pszText, selByteLen + 1, SciCall_GetRangePointer(selStart, selByteLen), selByteLen); + int const cchTextW = MultiByteToWideChar(Encoding_SciCP, 0, pszText, (int)selByteLen, pszTextW, (int)(selByteLen + 1)); - bool bChanged = false; - LPWSTR const pszMappedW = AllocMem(SizeOfMem(pszTextW), HEAP_ZERO_MEMORY); - if (pszMappedW) { - // first make lower case, before applying TitleCase - if (LCMapString(LOCALE_SYSTEM_DEFAULT, (LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE), pszTextW, (int)cchTextW, pszMappedW, (int)(iSelLen + 1))) { - if (LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TITLECASE, pszMappedW, (int)cchTextW, pszTextW, (int)(iSelLen + 1))) { - bChanged = true; + bool bChanged = false; + LPWSTR pszMappedW = AllocMem((selByteLen + 1) * sizeof(WCHAR), HEAP_ZERO_MEMORY); + if (pszMappedW) { + // first make lower case, before applying TitleCase + if (LCMapString(LOCALE_SYSTEM_DEFAULT, (LCMAP_LINGUISTIC_CASING | LCMAP_LOWERCASE), pszTextW, cchTextW, pszMappedW, (int)(selByteLen + 1))) { + if (LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TITLECASE, pszMappedW, cchTextW, pszTextW, (int)(selByteLen + 1))) { + bChanged = true; + } } + FreeMem(pszMappedW); } - FreeMem(pszMappedW); - } - if (bChanged) { - char* pszText = AllocMem((iSelLen + 1), HEAP_ZERO_MEMORY); - WideCharToMultiByteEx(Encoding_SciCP, 0, pszTextW, cchTextW, pszText, (iSelLen + 1), NULL, NULL); - UndoTransActionBegin(); - SciCall_Clear(); - SciCall_AddText((iSelEnd - iSelStart), pszText); - SciCall_SetSel(iAnchorPos, iCurPos); - EndUndoTransAction(); - FreeMem(pszText); + if (bChanged) { + int const cbNew = WideCharToMultiByte(Encoding_SciCP, 0, pszTextW, cchTextW, pszText, (int)(selByteLen + 1), NULL, NULL); + SciCall_SetTargetRange(selStart, selEnd); + Sci_ReplaceTargetTestChgHist(cbNew, pszText); + } } + FreeMem(pszText); FreeMem(pszTextW); } + + if (bIsRectSel) { + SciCall_SetRectangularSelectionAnchor(selAnchorMainPos); + if (vSpcAnchorMainPos > 0) { + SciCall_SetRectangularSelectionAnchorVirtualSpace(vSpcAnchorMainPos); + } + SciCall_SetRectangularSelectionCaret(selCaretMainPos); + if (vSpcCaretMainPos > 0) { + SciCall_SetRectangularSelectionCaretVirtualSpace(vSpcCaretMainPos); + } + } + + EndUndoTransAction(); } //============================================================================= @@ -1998,62 +2042,83 @@ void EditTitleCase(HWND hwnd) void EditSentenceCase(HWND hwnd) { UNREFERENCED_PARAMETER(hwnd); - const DocPos iCurPos = SciCall_GetCurrentPos(); - const DocPos iAnchorPos = SciCall_GetAnchor(); - if (iCurPos != iAnchorPos) { - if (Sci_IsMultiOrRectangleSelection()) { - InfoBoxLng(MB_ICONWARNING, NULL, IDS_MUI_SELRECTORMULTI); - return; - } - const DocPos iSelStart = SciCall_GetSelectionStart(); - const DocPos iSelEnd = SciCall_GetSelectionEnd(); - const DocPos iSelLen = SciCall_GetSelText(NULL); + if (SciCall_IsSelectionEmpty()) { + return; + } - LPWSTR const pszTextW = AllocMem(((iSelLen + 1) * sizeof(WCHAR)), HEAP_ZERO_MEMORY); + UndoTransActionBegin(); - if (pszTextW == NULL) { - FreeMem(pszTextW); - return; + bool const bIsRectSel = SciCall_IsSelectionRectangle(); + DocPos selAnchorMainPos = 0, selCaretMainPos = 0; + DocPos vSpcAnchorMainPos = 0, vSpcCaretMainPos = 0; + if (bIsRectSel) { + selAnchorMainPos = SciCall_GetRectangularSelectionAnchor(); + selCaretMainPos = SciCall_GetRectangularSelectionCaret(); + vSpcAnchorMainPos = SciCall_GetRectangularSelectionAnchorVirtualSpace(); + vSpcCaretMainPos = SciCall_GetRectangularSelectionCaretVirtualSpace(); + } + + DocPosU const selCount = SciCall_GetSelections(); + for (DocPosU s = 0; s < selCount; ++s) { + DocPos const selStart = SciCall_GetSelectionNStart(s); + DocPos const selEnd = SciCall_GetSelectionNEnd(s); + DocPos const selByteLen = selEnd - selStart; + if (selByteLen <= 0) { + continue; } - size_t const cchTextW = EditGetSelectedText(pszTextW, (iSelLen + 1)); + char* pszText = AllocMem(selByteLen + 1, HEAP_ZERO_MEMORY); + LPWSTR pszTextW = AllocMem((selByteLen + 1) * sizeof(WCHAR), HEAP_ZERO_MEMORY); + if (pszText && pszTextW) { + StringCchCopyNA(pszText, selByteLen + 1, SciCall_GetRangePointer(selStart, selByteLen), selByteLen); + int const cchTextW = MultiByteToWideChar(Encoding_SciCP, 0, pszText, (int)selByteLen, pszTextW, (int)(selByteLen + 1)); - bool bChanged = false; - bool bNewSentence = true; - for (size_t i = 0; i < cchTextW; i++) { - if (StrChr(L".;!?\r\n", pszTextW[i])) { - bNewSentence = true; - } else { - if (IsCharAlphaNumericW(pszTextW[i])) { - if (bNewSentence) { - if (IsCharLowerW(pszTextW[i])) { - pszTextW[i] = LOWORD(CharUpperW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0))); - bChanged = true; - } - bNewSentence = false; - } else { - if (IsCharUpperW(pszTextW[i])) { - pszTextW[i] = LOWORD(CharLowerW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0))); - bChanged = true; + bool bChanged = false; + bool bNewSentence = true; + for (int i = 0; i < cchTextW; i++) { + if (StrChr(L".;!?\r\n", pszTextW[i])) { + bNewSentence = true; + } else { + if (IsCharAlphaNumericW(pszTextW[i])) { + if (bNewSentence) { + if (IsCharLowerW(pszTextW[i])) { + pszTextW[i] = LOWORD(CharUpperW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0))); + bChanged = true; + } + bNewSentence = false; + } else { + if (IsCharUpperW(pszTextW[i])) { + pszTextW[i] = LOWORD(CharLowerW((LPWSTR)(LONG_PTR)MAKELONG(pszTextW[i], 0))); + bChanged = true; + } } } } } - } - if (bChanged) { - char* const pszText = AllocMem((iSelLen + 1), HEAP_ZERO_MEMORY); - WideCharToMultiByteEx(Encoding_SciCP, 0, pszTextW, cchTextW, pszText, (iSelLen + 1), NULL, NULL); - UndoTransActionBegin(); - SciCall_Clear(); - SciCall_AddText((iSelEnd - iSelStart), pszText); - SciCall_SetSel(iAnchorPos, iCurPos); - EndUndoTransAction(); - FreeMem(pszText); + if (bChanged) { + int const cbNew = WideCharToMultiByte(Encoding_SciCP, 0, pszTextW, cchTextW, pszText, (int)(selByteLen + 1), NULL, NULL); + SciCall_SetTargetRange(selStart, selEnd); + Sci_ReplaceTargetTestChgHist(cbNew, pszText); + } } + FreeMem(pszText); FreeMem(pszTextW); } + + if (bIsRectSel) { + SciCall_SetRectangularSelectionAnchor(selAnchorMainPos); + if (vSpcAnchorMainPos > 0) { + SciCall_SetRectangularSelectionAnchorVirtualSpace(vSpcAnchorMainPos); + } + SciCall_SetRectangularSelectionCaret(selCaretMainPos); + if (vSpcCaretMainPos > 0) { + SciCall_SetRectangularSelectionCaretVirtualSpace(vSpcCaretMainPos); + } + } + + EndUndoTransAction(); } diff --git a/src/Notepad3.c b/src/Notepad3.c index 3ba0b86ff..0e6419e68 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -4016,6 +4016,8 @@ LRESULT MsgCopyData(HWND hwnd, WPARAM wParam, LPARAM lParam) // // MsgContextMenu() - Handles WM_CONTEXTMENU and SCN_MARGINRIGHTCLICK // +static DocPos s_iCtxMenuClickPos = -1; + LRESULT MsgContextMenu(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) { bool const bMargin = (SCN_MARGINRIGHTCLICK == umsg); @@ -4083,6 +4085,22 @@ LRESULT MsgContextMenu(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) if (StrIsNotEmpty(Settings2.WebTmpl2MenuName)) { ModifyMenu(hStdCtxMenu, CMD_WEBACTION2, MF_BYCOMMAND | MF_STRING, CMD_WEBACTION2, Settings2.WebTmpl2MenuName); } + + // case conversion submenu: enable based on selection or word at click position + s_iCtxMenuClickPos = SciCall_CharPositionFromPointClose(pt.x, pt.y); + bool const ro = SciCall_GetReadOnly(); + bool const se = SciCall_IsSelectionEmpty(); + bool bHasTarget = !se; + if (se && (s_iCtxMenuClickPos >= 0)) { + DocPos const ws = SciCall_WordStartPosition(s_iCtxMenuClickPos, true); + DocPos const we = SciCall_WordEndPosition(s_iCtxMenuClickPos, true); + bHasTarget = (ws != we); + } + EnableCmd(hStdCtxMenu, CMD_CTX_UPPERCASE, bHasTarget && !ro); + EnableCmd(hStdCtxMenu, CMD_CTX_LOWERCASE, bHasTarget && !ro); + EnableCmd(hStdCtxMenu, CMD_CTX_INVERTCASE, bHasTarget && !ro); + EnableCmd(hStdCtxMenu, CMD_CTX_TITLECASE, bHasTarget && !ro); + EnableCmd(hStdCtxMenu, CMD_CTX_SENTENCECASE, bHasTarget && !ro); } // back to screen coordinates for menu display @@ -5622,6 +5640,47 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam) break; + case CMD_CTX_UPPERCASE: + if (SciCall_IsSelectionEmpty() && (s_iCtxMenuClickPos >= 0)) { + EditSelectWordAtPos(s_iCtxMenuClickPos, false); + } + SciCall_UpperCase(); + s_iCtxMenuClickPos = -1; + break; + + case CMD_CTX_LOWERCASE: + if (SciCall_IsSelectionEmpty() && (s_iCtxMenuClickPos >= 0)) { + EditSelectWordAtPos(s_iCtxMenuClickPos, false); + } + SciCall_LowerCase(); + s_iCtxMenuClickPos = -1; + break; + + case CMD_CTX_INVERTCASE: + if (SciCall_IsSelectionEmpty() && (s_iCtxMenuClickPos >= 0)) { + EditSelectWordAtPos(s_iCtxMenuClickPos, false); + } + EditInvertCase(Globals.hwndEdit); + s_iCtxMenuClickPos = -1; + break; + + case CMD_CTX_TITLECASE: + if (SciCall_IsSelectionEmpty() && (s_iCtxMenuClickPos >= 0)) { + EditSelectWordAtPos(s_iCtxMenuClickPos, false); + } + EditTitleCase(Globals.hwndEdit); + s_iCtxMenuClickPos = -1; + break; + + case CMD_CTX_SENTENCECASE: + if (SciCall_IsSelectionEmpty() && (s_iCtxMenuClickPos >= 0)) { + EditSelectWordAtPos(s_iCtxMenuClickPos, false); + } + EditSentenceCase(Globals.hwndEdit); + s_iCtxMenuClickPos = -1; + break; + + case IDM_EDIT_CONVERTTABS: EditTabsToSpaces(Globals.fvCurFile.iTabWidth, false); break;