Add hide/show ability of Control Characters (C0 & C1) and Unicode EOL

Fix #8111, close #13324
pull/13513/head
ozone10 2 years ago committed by Don Ho
parent 81802e7d77
commit 0cad36d636

@ -296,6 +296,7 @@ The comments are here for explanation, it's not necessary to translate them.
<Item id="44114" name="Apply Color 4"/>
<Item id="44115" name="Apply Color 5"/>
<Item id="44130" name="Show Non-Printing Characters"/>
<Item id="44131" name="Show Control Characters &amp; Unicode EOL"/>
<Item id="44032" name="Toggle Full Screen Mode"/>
<Item id="44033" name="Restore Default Zoom"/>
<Item id="44034" name="Always on Top"/>
@ -956,6 +957,7 @@ The comments are here for explanation, it's not necessary to translate them.
<Item id="6254" name="Abbreviation"/>
<Item id="6255" name="Codepoint"/>
<Item id="6256" name="Custom Color"/>
<Item id="6258" name="Apply to C0, C1 &amp; Unicode EOL"/>
</Scintillas>
<DarkMode title="Dark Mode">
@ -1683,8 +1685,6 @@ NOTE:
<npcNote-tip value="Representation of selected &quot;non-ASCII&quot; whitespace and non-printing (control) characters.
NOTE:
Some characters might already have some representation and are thus visible. Line separator and paragraph separator are already represented by abbreviation by default.
Using representation will disable character effects on text.
For the full list of selected whitespace and non-printing characters check User Manual.
@ -1707,6 +1707,7 @@ Click on &quot;?&quot; button on right to open website with User Manual." />
<!-- Don't translate "(&quot;Non-printing characters custom color&quot;)" -->
<npcCustomColor-tip value="Go to Style Configurator to change the default custom color for selected whitespace and non-printing characters (&quot;Non-printing characters custom color&quot;)." />
<npcIncludeCcUniEol-tip value="Apply non-printing characters appearance settings to C0, C1 control and Unicode EOL (next line, line separator and paragraph separator) characters." />
</MiscStrings>
</Native-Langue>
</NotepadPlus>

@ -296,6 +296,7 @@ The comments are here for explanation, it's not necessary to translate them.
<Item id="44114" name="Apply Color 4"/>
<Item id="44115" name="Apply Color 5"/>
<Item id="44130" name="Show Non-Printing Characters"/>
<Item id="44131" name="Show Control Characters &amp; Unicode EOL"/>
<Item id="44032" name="Toggle Full Screen Mode"/>
<Item id="44033" name="Restore Default Zoom"/>
<Item id="44034" name="Always on Top"/>
@ -951,6 +952,7 @@ The comments are here for explanation, it's not necessary to translate them.
<Item id="6254" name="Abbreviation"/>
<Item id="6255" name="Codepoint"/>
<Item id="6256" name="Custom Color"/>
<Item id="6258" name="Apply to C0, C1 &amp; Unicode EOL"/>
</Scintillas>
<DarkMode title="Dark Mode">
@ -1672,8 +1674,6 @@ NOTE:
<npcNote-tip value="Representation of selected &quot;non-ASCII&quot; whitespace and non-printing (control) characters.
NOTE:
Some characters might already have some representation and are thus visible. Line separator and paragraph separator are already represented by abbreviation by default.
Using representation will disable character effects on text.
For the full list of selected whitespace and non-printing characters check User Manual.
@ -1696,6 +1696,7 @@ Click on &quot;?&quot; button on right to open website with User Manual." />
<!-- Don't translate "(&quot;Non-printing characters custom color&quot;)" -->
<npcCustomColor-tip value="Go to Style Configurator to change the default custom color for selected whitespace and non-printing characters (&quot;Non-printing characters custom color&quot;)." />
<npcIncludeCcUniEol-tip value="Apply non-printing characters appearance settings to C0, C1 control and Unicode EOL (next line, line separator and paragraph separator) characters." />
</MiscStrings>
</Native-Langue>
</NotepadPlus>

@ -4738,12 +4738,14 @@ void Notepad_plus::staticCheckMenuAndTB() const
const bool wsTabShow = _pEditView->isShownSpaceAndTab();
const bool eolShow = _pEditView->isShownEol();
const bool npcShow = _pEditView->isShownNpc();
const bool ccUniEolShow = _pEditView->isShownCcUniEol();
const bool allShow = wsTabShow && eolShow && npcShow;
const bool allShow = wsTabShow && eolShow && npcShow && ccUniEolShow;
checkMenuItem(IDM_VIEW_TAB_SPACE, wsTabShow);
checkMenuItem(IDM_VIEW_EOL, eolShow);
checkMenuItem(IDM_VIEW_NPC, npcShow);
checkMenuItem(IDM_VIEW_NPC_CCUNIEOL, ccUniEolShow);
checkMenuItem(IDM_VIEW_ALL_CHARACTERS, allShow);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, allShow);
@ -6340,6 +6342,12 @@ void Notepad_plus::notifyBufferChanged(Buffer * buffer, int mask)
setDisplayFormat(buffer->getEolFormat());
enableConvertMenuItems(buffer->getEolFormat());
}
if (mask & (BufferChangeUnicode))
{
_mainEditView.maintainStateForNpc();
_subEditView.maintainStateForNpc();
}
}
void Notepad_plus::notifyBufferActivated(BufferID bufid, int view)

@ -668,13 +668,14 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Show Symbol"
BEGIN
MENUITEM "Show Space and Tab", IDM_VIEW_TAB_SPACE
MENUITEM "Show End of Line", IDM_VIEW_EOL
MENUITEM "Show Non-Printing Characters", IDM_VIEW_NPC
MENUITEM "Show All Characters", IDM_VIEW_ALL_CHARACTERS
MENUITEM "Show Space and Tab", IDM_VIEW_TAB_SPACE
MENUITEM "Show End of Line", IDM_VIEW_EOL
MENUITEM "Show Non-Printing Characters", IDM_VIEW_NPC
MENUITEM "Show Control Characters && Unicode EOL", IDM_VIEW_NPC_CCUNIEOL
MENUITEM "Show All Characters", IDM_VIEW_ALL_CHARACTERS
MENUITEM SEPARATOR
MENUITEM "Show Indent Guide", IDM_VIEW_INDENT_GUIDE
MENUITEM "Show Wrap Symbol", IDM_VIEW_WRAP_SYMBOL
MENUITEM "Show Indent Guide", IDM_VIEW_INDENT_GUIDE
MENUITEM "Show Wrap Symbol", IDM_VIEW_WRAP_SYMBOL
END
POPUP "Zoom"
BEGIN

@ -1759,10 +1759,23 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case NPPM_INTERNAL_SETNPC:
{
const bool isShown = nppParam.getSVP()._npcShow;
_mainEditView.showNpc(isShown);
_subEditView.showNpc(isShown);
_findReplaceDlg.updateFinderScintillaForNpc();
const auto& svp = nppParam.getSVP();
const bool isFromIncCcUniEolCtrl = wParam == IDC_CHECK_NPC_INCLUDECCUNIEOL;
if (isFromIncCcUniEolCtrl || svp._npcIncludeCcUniEol)
{
const bool isShown = svp._ccUniEolShow;
_mainEditView.showCcUniEol(isShown);
_subEditView.showCcUniEol(isShown);
}
if (!isFromIncCcUniEolCtrl)
{
const bool isShown = svp._npcShow;
_mainEditView.showNpc(isShown);
_subEditView.showNpc(isShown);
_findReplaceDlg.updateFinderScintillaForNpc();
}
return TRUE;
}
@ -2945,14 +2958,15 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
case NPPM_INTERNAL_NPCFORMCHANGED:
{
NppParameters& nppParam = NppParameters::getInstance();
const bool isShown = nppParam.getSVP()._npcShow;
if (isShown)
_mainEditView.setNpcAndCcUniEOL();
_subEditView.setNpcAndCcUniEOL();
const auto& svp = NppParameters::getInstance().getSVP();
if (svp._npcShow)
{
_mainEditView.setNPC();
_subEditView.setNPC();
_findReplaceDlg.updateFinderScintillaForNpc(true);
}
return TRUE;
}

@ -2317,12 +2317,8 @@ void Notepad_plus::command(int id)
case IDM_VIEW_TAB_SPACE:
{
auto setCheckMenuItem = [this](int id, bool check) -> DWORD {
return ::CheckMenuItem(_mainMenuHandle, id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED));
};
const bool isChecked = !(::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED);
setCheckMenuItem(id, isChecked);
checkMenuItem(id, isChecked);
_mainEditView.showWSAndTab(isChecked);
_subEditView.showWSAndTab(isChecked);
@ -2330,9 +2326,9 @@ void Notepad_plus::command(int id)
auto& svp1 = const_cast<ScintillaViewParams&>(NppParameters::getInstance().getSVP());
svp1._whiteSpaceShow = isChecked;
const bool allChecked = svp1._whiteSpaceShow && svp1._eolShow && svp1._npcShow;
const bool allChecked = svp1._whiteSpaceShow && svp1._eolShow && svp1._npcShow && svp1._ccUniEolShow;
setCheckMenuItem(IDM_VIEW_ALL_CHARACTERS, allChecked);
checkMenuItem(IDM_VIEW_ALL_CHARACTERS, allChecked);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, allChecked);
break;
@ -2340,12 +2336,8 @@ void Notepad_plus::command(int id)
case IDM_VIEW_EOL:
{
auto setCheckMenuItem = [this](int id, bool check) -> DWORD {
return ::CheckMenuItem(_mainMenuHandle, id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED));
};
const bool isChecked = !(::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED);
setCheckMenuItem(id, isChecked);
checkMenuItem(id, isChecked);
_mainEditView.showEOL(isChecked);
_subEditView.showEOL(isChecked);
@ -2353,9 +2345,9 @@ void Notepad_plus::command(int id)
auto& svp1 = const_cast<ScintillaViewParams&>(NppParameters::getInstance().getSVP());
svp1._eolShow = isChecked;
const bool allChecked = svp1._whiteSpaceShow && svp1._eolShow && svp1._npcShow;
const bool allChecked = svp1._whiteSpaceShow && svp1._eolShow && svp1._npcShow && svp1._ccUniEolShow;
setCheckMenuItem(IDM_VIEW_ALL_CHARACTERS, allChecked);
checkMenuItem(IDM_VIEW_ALL_CHARACTERS, allChecked);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, allChecked);
break;
@ -2363,22 +2355,19 @@ void Notepad_plus::command(int id)
case IDM_VIEW_NPC:
{
auto setCheckMenuItem = [this](int id, bool check) -> DWORD {
return ::CheckMenuItem(_mainMenuHandle, id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED));
};
const bool isChecked = !(::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED);
setCheckMenuItem(id, isChecked);
_mainEditView.showNpc(isChecked);
_subEditView.showNpc(isChecked);
checkMenuItem(id, isChecked);
auto& svp1 = const_cast<ScintillaViewParams&>(NppParameters::getInstance().getSVP());
svp1._npcShow = isChecked;
const bool allChecked = svp1._whiteSpaceShow && svp1._eolShow && svp1._npcShow;
// setNpcAndCcUniEOL() in showNpc() uses svp1._npcShow
_mainEditView.showNpc(isChecked);
_subEditView.showNpc(isChecked);
const bool allChecked = svp1._whiteSpaceShow && svp1._eolShow && svp1._npcShow && svp1._ccUniEolShow;
setCheckMenuItem(IDM_VIEW_ALL_CHARACTERS, allChecked);
checkMenuItem(IDM_VIEW_ALL_CHARACTERS, allChecked);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, allChecked);
_findReplaceDlg.updateFinderScintillaForNpc();
@ -2386,27 +2375,45 @@ void Notepad_plus::command(int id)
break;
}
case IDM_VIEW_ALL_CHARACTERS:
case IDM_VIEW_NPC_CCUNIEOL:
{
auto setCheckMenuItem = [this](int id, bool check) -> DWORD {
return ::CheckMenuItem(_mainMenuHandle, id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED));
};
const bool isChecked = !(::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED);
checkMenuItem(id, isChecked);
auto& svp1 = const_cast<ScintillaViewParams&>(NppParameters::getInstance().getSVP());
svp1._ccUniEolShow = isChecked;
// setNpcAndCcUniEOL() in showCcUniEol() uses svp1._ccUniEolShow
_mainEditView.showCcUniEol(isChecked);
_subEditView.showCcUniEol(isChecked);
const bool allChecked = svp1._whiteSpaceShow && svp1._eolShow && svp1._npcShow && svp1._ccUniEolShow;
checkMenuItem(IDM_VIEW_ALL_CHARACTERS, allChecked);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, allChecked);
break;
}
case IDM_VIEW_ALL_CHARACTERS:
{
const bool isChecked = !(::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED);
setCheckMenuItem(id, isChecked);
setCheckMenuItem(IDM_VIEW_TAB_SPACE, isChecked);
setCheckMenuItem(IDM_VIEW_EOL, isChecked);
setCheckMenuItem(IDM_VIEW_NPC, isChecked);
checkMenuItem(id, isChecked);
checkMenuItem(IDM_VIEW_TAB_SPACE, isChecked);
checkMenuItem(IDM_VIEW_EOL, isChecked);
checkMenuItem(IDM_VIEW_NPC, isChecked);
checkMenuItem(IDM_VIEW_NPC_CCUNIEOL, isChecked);
_toolBar.setCheck(id, isChecked);
_mainEditView.showInvisibleChars(isChecked);
_subEditView.showInvisibleChars(isChecked);
auto& svp1 = const_cast<ScintillaViewParams&>(NppParameters::getInstance().getSVP());
svp1._whiteSpaceShow = isChecked;
svp1._eolShow = isChecked;
svp1._npcShow = isChecked;
svp1._ccUniEolShow = isChecked;
_mainEditView.showInvisibleChars(isChecked);
_subEditView.showInvisibleChars(isChecked);
_findReplaceDlg.updateFinderScintillaForNpc();

@ -261,6 +261,7 @@ static const WinMenuKeyDefinition winKeyDefs[] =
{ VK_NULL, IDM_VIEW_EOL, false, false, false, nullptr },
{ VK_NULL, IDM_VIEW_ALL_CHARACTERS, false, false, false, nullptr },
{ VK_NULL, IDM_VIEW_NPC, false, false, false, nullptr },
{ VK_NULL, IDM_VIEW_NPC_CCUNIEOL, false, false, false, nullptr },
{ VK_NULL, IDM_VIEW_INDENT_GUIDE, false, false, false, nullptr },
{ VK_NULL, IDM_VIEW_WRAP_SYMBOL, false, false, false, nullptr },
// { VK_NULL, IDM_VIEW_ZOOMIN, false, false, false, nullptr },
@ -5923,18 +5924,6 @@ void NppParameters::feedGUIParameters(TiXmlNode *node)
}
else if (!lstrcmp(nm, TEXT("DarkMode")))
{
auto parseYesNoBoolAttribute = [&element](const TCHAR* name, bool defaultValue = false)->bool {
const TCHAR* val = element->Attribute(name);
if (val)
{
if (!lstrcmp(val, TEXT("yes")))
return true;
else if (!lstrcmp(val, TEXT("no")))
return false;
}
return defaultValue;
};
_nppGUI._darkmode._isEnabled = parseYesNoBoolAttribute(TEXT("enable"));
//_nppGUI._darkmode._isEnabledPlugin = parseYesNoBoolAttribute(TEXT("enablePlugin", true));
@ -6359,7 +6348,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node)
_svp._eolMode = static_cast<ScintillaViewParams::crlfMode>(val);
}
// Unicode non-printable characters visibility State
// Unicode control and ws characters visibility state
_svp._npcShow = parseShowHideBoolAttribute(TEXT("npcShow"), true);
nm = element->Attribute(TEXT("npcMode"), &val);
@ -6370,6 +6359,10 @@ void NppParameters::feedScintillaParam(TiXmlNode *node)
}
_svp._npcCustomColor = parseYesNoBoolAttribute(TEXT("npcCustomColor"));
_svp._npcIncludeCcUniEol = parseYesNoBoolAttribute(TEXT("npcIncludeCcUniEOL"));
// C0, C1 control and Unicode EOL visibility state
_svp._ccUniEolShow = parseYesNoBoolAttribute(TEXT("ccShow"), true);
nm = element->Attribute(TEXT("borderWidth"), &val);
if (nm)
@ -6676,6 +6669,8 @@ bool NppParameters::writeScintillaParams()
setShowHideBoolAttribute(TEXT("npcShow"), _svp._npcShow);
(scintNode->ToElement())->SetAttribute(TEXT("npcMode"), static_cast<int>(_svp._npcMode));
setYesNoBoolAttribute(TEXT("npcCustomColor"), _svp._npcCustomColor);
setYesNoBoolAttribute(TEXT("npcIncludeCcUniEOL"), _svp._npcIncludeCcUniEol);
setYesNoBoolAttribute(TEXT("ccShow"), _svp._ccUniEolShow);
(scintNode->ToElement())->SetAttribute(TEXT("borderWidth"), _svp._borderWidth);
(scintNode->ToElement())->SetAttribute(TEXT("smoothFont"), _svp._doSmoothFont ? TEXT("yes") : TEXT("no"));
(scintNode->ToElement())->SetAttribute(TEXT("paddingLeft"), _svp._paddingLeft);

@ -953,6 +953,8 @@ struct ScintillaViewParams
enum npcMode { identity = 0, abbreviation = 1, codepoint = 2 };
npcMode _npcMode = abbreviation;
bool _npcCustomColor = false;
bool _npcIncludeCcUniEol = false;
bool _ccUniEolShow = true;
int _borderWidth = 2;
bool _virtualSpace = false;

@ -4958,7 +4958,7 @@ void Finder::setFinderStyleForNpc(bool onlyColor)
}
else if (isShown)
{
_scintView.setNPC();
_scintView.setNpcAndCcUniEOL();
}
}

@ -1424,7 +1424,7 @@ void ScintillaEditView::setCRLF(long color)
redraw();
}
void ScintillaEditView::setNPC(long color)
void ScintillaEditView::setNpcAndCcUniEOL(long color)
{
NppParameters& nppParams = NppParameters::getInstance();
const ScintillaViewParams& svp = nppParams.getSVP();
@ -1448,10 +1448,22 @@ void ScintillaEditView::setNPC(long color)
const long appearance = svp._npcCustomColor ? SC_REPRESENTATION_BLOB | SC_REPRESENTATION_COLOUR : SC_REPRESENTATION_BLOB;
const long alphaNpcCustomColor = npcCustomColor | 0xFF000000; // add alpha color to make DirectWrite mode work
for (const auto& invChar : g_nonPrintingChars)
if (svp._npcShow)
{
execute(SCI_SETREPRESENTATIONCOLOUR, reinterpret_cast<WPARAM>(invChar.at(0)), alphaNpcCustomColor);
execute(SCI_SETREPRESENTATIONAPPEARANCE, reinterpret_cast<WPARAM>(invChar.at(0)), appearance);
for (const auto& invChar : g_nonPrintingChars)
{
execute(SCI_SETREPRESENTATIONCOLOUR, reinterpret_cast<WPARAM>(invChar.at(0)), alphaNpcCustomColor);
execute(SCI_SETREPRESENTATIONAPPEARANCE, reinterpret_cast<WPARAM>(invChar.at(0)), appearance);
}
}
if (svp._ccUniEolShow && svp._npcIncludeCcUniEol)
{
for (const auto& invChar : g_ccUniEolChars)
{
execute(SCI_SETREPRESENTATIONCOLOUR, reinterpret_cast<WPARAM>(invChar.at(0)), alphaNpcCustomColor);
execute(SCI_SETREPRESENTATIONAPPEARANCE, reinterpret_cast<WPARAM>(invChar.at(0)), appearance);
}
}
redraw();
@ -2047,6 +2059,8 @@ void ScintillaEditView::activateBuffer(BufferID buffer, bool force)
restyleBuffer();
}
maintainStateForNpc();
// Everything should be updated, but the language
bufferUpdated(_currentBuffer, (BufferChangeMask & ~BufferChangeLanguage));
@ -2058,13 +2072,7 @@ void ScintillaEditView::activateBuffer(BufferID buffer, bool force)
runMarkers(true, 0, true, false);
if (isShownNpc())
{
showNpc();
}
setCRLF();
setNPC();
NppParameters& nppParam = NppParameters::getInstance();
const ScintillaViewParams& svp = nppParam.getSVP();
@ -2845,7 +2853,86 @@ void ScintillaEditView::performGlobalStyles()
{
npcCustomColor = pStyle->_fgColor;
}
setNPC(npcCustomColor);
setNpcAndCcUniEOL(npcCustomColor);
}
void ScintillaEditView::showNpc(bool willBeShowed, bool isSearchResult)
{
auto& svp = NppParameters::getInstance().getSVP();
if (willBeShowed)
{
const auto& mode = static_cast<size_t>(svp._npcMode);
for (const auto& invChar : g_nonPrintingChars)
{
execute(SCI_SETREPRESENTATION, reinterpret_cast<WPARAM>(invChar.at(0)), reinterpret_cast<LPARAM>(invChar.at(mode)));
}
if (svp._npcCustomColor)
{
setNpcAndCcUniEOL();
}
}
else
{
execute(SCI_CLEARALLREPRESENTATIONS);
// SCI_CLEARALLREPRESENTATIONS will also reset CRLF and CcUniEOL
if (!isSearchResult && svp._eolMode != svp.roundedRectangleText)
{
setCRLF();
}
showCcUniEol(svp._ccUniEolShow);
}
// in some case npc representation is not redrawn correctly on first line
// therefore use of showEOL(isShownEol()) instead of redraw()
showEOL(isShownEol());
}
void ScintillaEditView::showCcUniEol(bool willBeShowed, bool isSearchResult)
{
auto& svp = NppParameters::getInstance().getSVP();
if (willBeShowed)
{
const auto& mode = static_cast<size_t>(svp._npcIncludeCcUniEol ? svp._npcMode : ScintillaViewParams::npcMode::abbreviation);
for (const auto& invChar : g_ccUniEolChars)
{
execute(SCI_SETREPRESENTATION, reinterpret_cast<WPARAM>(invChar.at(0)), reinterpret_cast<LPARAM>(invChar.at(mode)));
}
if (svp._npcIncludeCcUniEol && svp._npcCustomColor)
{
setNpcAndCcUniEOL();
}
}
else
{
execute(SCI_CLEARALLREPRESENTATIONS);
for (const auto& invChar : g_ccUniEolChars)
{
execute(SCI_SETREPRESENTATION, reinterpret_cast<WPARAM>(invChar.at(0)), reinterpret_cast<LPARAM>(g_ZWSP));
execute(SCI_SETREPRESENTATIONAPPEARANCE, reinterpret_cast<WPARAM>(invChar.at(0)), SC_REPRESENTATION_PLAIN);
}
// SCI_CLEARALLREPRESENTATIONS will also reset CRLF and NPC
if (!isSearchResult && svp._eolMode != svp.roundedRectangleText)
{
setCRLF();
}
if (svp._npcShow)
{
showNpc();
}
}
// in some case C0, C1 and Unicode EOL representations are not redrawn correctly on first line
// therefore use of showEOL(isShownEol()) instead of redraw()
showEOL(isShownEol());
}
void ScintillaEditView::showIndentGuideLine(bool willBeShowed)

@ -118,11 +118,86 @@ const int MARK_HIDELINESEND = 18;
// 20 - 18 reserved for Notepad++ internal used
// 17 - 0 are free to use for plugins
constexpr char g_ZWSP[] = "\xE2\x80\x8B";
const std::vector<std::vector<const char*>> g_ccUniEolChars =
{
// C0
{"\x00", "NUL", "U+0000"}, // U+0000 : Null
{"\x01", "SOH", "U+0001"}, // U+0001 : Start of Heading
{"\x02", "STX", "U+0002"}, // U+0002 : Start of Text
{"\x03", "ETX", "U+0003"}, // U+0003 : End of Text
{"\x04", "EOT", "U+0004"}, // U+0004 : End of Transmission
{"\x05", "ENQ", "U+0005"}, // U+0005 : Enquiry
{"\x06", "ACK", "U+0006"}, // U+0006 : Acknowledge
{"\a", "BEL", "U+0007"}, // U+0007 : Bell
{"\b", "BS", "U+0008"}, // U+0008 : Backspace
{"\v", "VT", "U+000B"}, // U+000B : Line Tabulation
{"\f", "FF", "U+000C"}, // U+000C : Form Feed
{"\x0E", "SO", "U+000E"}, // U+000E : Shift Out
{"\x0F", "SI", "U+000F"}, // U+000F : Shift In
{"\x10", "DLE", "U+0010"}, // U+0010 : Data Link Escape
{"\x11", "DC1", "U+0011"}, // U+0011 : Device Control One
{"\x12", "DC2", "U+0012"}, // U+0012 : Device Control Two
{"\x13", "DC3", "U+0013"}, // U+0013 : Device Control Three
{"\x14", "DC4", "U+0014"}, // U+0014 : Device Control Four
{"\x15", "NAK", "U+0015"}, // U+0015 : Negative Acknowledge
{"\x16", "SYN", "U+0016"}, // U+0016 : Synchronous Idle
{"\x17", "ETB", "U+0017"}, // U+0017 : End of Transmission Block
{"\x18", "CAN", "U+0018"}, // U+0018 : Cancel
{"\x19", "EM", "U+0019"}, // U+0019 : End of Medium
{"\x1A", "SUB", "U+001A"}, // U+001A : Substitute
{"\x1B", "ESC", "U+001B"}, // U+001B : Escape
{"\x1C", "FS", "U+001C"}, // U+001C : Information Separator Four
{"\x1D", "GS", "U+001D"}, // U+001D : Information Separator Three
{"\x1E", "RS", "U+001E"}, // U+001E : Information Separator Two
{"\x1F", "US", "U+001F"}, // U+001F : Information Separator One
{"\x7F", "DEL", "U+007F"}, // U+007F : Delete
// C1
{"\xC2\x80", "PAD", "U+0080"}, // U+0080 : Padding Character
{"\xC2\x81", "HOP", "U+0081"}, // U+0081 : High Octet Preset
{"\xC2\x82", "BPH", "U+0082"}, // U+0082 : Break Permitted Here
{"\xC2\x83", "NBH", "U+0083"}, // U+0083 : No Break Here
{"\xC2\x84", "IND", "U+0084"}, // U+0084 : Index
//{"\xC2\x85", "NEL", "U+0085"}, // U+0085 : Next Line
{"\xC2\x86", "SSA", "U+0086"}, // U+0086 : Start of Selected Area
{"\xC2\x87", "ESA", "U+0087"}, // U+0087 : End of Selected Area
{"\xC2\x88", "HTS", "U+0088"}, // U+0088 : Character (Horizontal) Tabulation Set
{"\xC2\x89", "HTJ", "U+0089"}, // U+0089 : Character (Horizontal) Tabulation With Justification
{"\xC2\x8A", "LTS", "U+008A"}, // U+008A : Line (Vertical) Tabulation Set
{"\xC2\x8B", "PLD", "U+008B"}, // U+008B : Partial Line Forward (Down)
{"\xC2\x8C", "PLU", "U+008C"}, // U+008C : Partial Line Backward (Up)
{"\xC2\x8D", "RI", "U+008D"}, // U+008D : Reverse Line Feed (Index)
{"\xC2\x8E", "SS2", "U+008E"}, // U+008E : Single-Shift Two
{"\xC2\x8F", "SS3", "U+008F"}, // U+008F : Single-Shift Three
{"\xC2\x90", "DCS", "U+0090"}, // U+0090 : Device Control String
{"\xC2\x91", "PU1", "U+0091"}, // U+0091 : Private Use One
{"\xC2\x92", "PU2", "U+0092"}, // U+0092 : Private Use Two
{"\xC2\x93", "STS", "U+0093"}, // U+0093 : Set Transmit State
{"\xC2\x94", "CCH", "U+0094"}, // U+0094 : Cancel Character
{"\xC2\x95", "MW", "U+0095"}, // U+0095 : Message Waiting
{"\xC2\x96", "SPA", "U+0096"}, // U+0096 : Start of Protected Area
{"\xC2\x97", "EPA", "U+0097"}, // U+0097 : End of Protected Area
{"\xC2\x98", "SOS", "U+0098"}, // U+0098 : Start of String
{"\xC2\x99", "SGCI", "U+0099"}, // U+0099 : Single Graphic Character Introducer
{"\xC2\x9A", "SCI", "U+009A"}, // U+009A : Single Character Introducer
{"\xC2\x9B", "CSI", "U+009B"}, // U+009B : Control Sequence Introducer
{"\xC2\x9C", "ST", "U+009C"}, // U+009C : String Terminator
{"\xC2\x9D", "OSC", "U+009D"}, // U+009D : Operating System Command
{"\xC2\x9E", "PM", "U+009E"}, // U+009E : Private Message
{"\xC2\x9F", "APC", "U+009F"}, // U+009F : Application Program Command
// Unicode EOL
{"\xC2\x85", "NEL", "U+0085"}, // U+0085 : Next Line
{"\xE2\x80\xA8", "LS", "U+2028"}, // U+2028 : Line Separator
{"\xE2\x80\xA9", "PS", "U+2029"} // U+2029 : Paragraph Separator
};
const std::vector<std::vector<const char*>> g_nonPrintingChars =
{
{"\xC2\x85", "NEL", "U+0085"}, // U+0085 : next line
{"\xC2\xA0", "NBSP", "U+00A0"}, // U+00A0 : no-break space
{"\xC2\xAD", "SHY", "U+00AD"}, // U+00AD : soft hyphen
{"\xD8\x9C", "ALM", "U+061C"}, // U+061C : arabic letter mark
{"\xDC\x8F", "SAM", "U+070F"}, // U+070F : syriac abbreviation mark
{"\xE1\x9A\x80", "OSPM", "U+1680"}, // U+1680 : ogham space mark
{"\xE1\xA0\x8E", "MVS", "U+180E"}, // U+180E : mongolian vowel separator
{"\xE2\x80\x80", "NQSP", "U+2000"}, // U+2000 : en quad
@ -141,8 +216,6 @@ const std::vector<std::vector<const char*>> g_nonPrintingChars =
{"\xE2\x80\x8D", "ZWJ", "U+200D"}, // U+200D : zero-width joiner
{"\xE2\x80\x8E", "LRM", "U+200E"}, // U+200E : left-to-right mark
{"\xE2\x80\x8F", "RLM", "U+200F"}, // U+200F : right-to-left mark
{"\xE2\x80\xA8", "LS", "U+2028"}, // U+2028 : line separator
{"\xE2\x80\xA9", "PS", "U+2029"}, // U+2029 : paragraph separator
{"\xE2\x80\xAA", "LRE", "U+202A"}, // U+202A : left-to-right embedding
{"\xE2\x80\xAB", "RLE", "U+202B"}, // U+202B : right-to-left embedding
{"\xE2\x80\xAC", "PDF", "U+202C"}, // U+202C : pop directional formatting
@ -151,6 +224,10 @@ const std::vector<std::vector<const char*>> g_nonPrintingChars =
{"\xE2\x80\xAF", "NNBSP", "U+202F"}, // U+202F : narrow no-break space
{"\xE2\x81\x9F", "MMSP", "U+205F"}, // U+205F : medium mathematical space
{"\xE2\x81\xA0", "WJ", "U+2060"}, // U+2060 : word joiner
{"\xE2\x81\xA1", "(FA)", "U+2061"}, // U+2061 : function application
{"\xE2\x81\xA2", "(IT)", "U+2062"}, // U+2062 : invisible times
{"\xE2\x81\xA3", "(IS)", "U+2063"}, // U+2063 : invisible separator
{"\xE2\x81\xA4", "(IP)", "U+2064"}, // U+2064 : invisible plus
{"\xE2\x81\xA6", "LRI", "U+2066"}, // U+2066 : left-to-right isolate
{"\xE2\x81\xA7", "RLI", "U+2067"}, // U+2067 : right-to-left isolate
{"\xE2\x81\xA8", "FSI", "U+2068"}, // U+2068 : first strong isolate
@ -162,7 +239,10 @@ const std::vector<std::vector<const char*>> g_nonPrintingChars =
{"\xE2\x81\xAE", "NADS", "U+206E"}, // U+206E : national digit shapes
{"\xE2\x81\xAF", "NODS", "U+206F"}, // U+206F : nominal digit shapes
{"\xE3\x80\x80", "IDSP", "U+3000"}, // U+3000 : ideographic space
{"\xEF\xBB\xBF", "ZWNBSP", "U+FEFF"} // U+FEFF : zero-width no-break space
{"\xEF\xBB\xBF", "ZWNBSP", "U+FEFF"}, // U+FEFF : zero-width no-break space
{"\xEF\xBF\xB9", "IAA", "U+FFF9"}, // U+FFF9 : interlinear annotation anchor
{"\xEF\xBF\xBA", "IAS", "U+FFFA"}, // U+FFFA : interlinear annotation separator
{"\xEF\xBF\xBB", "IAT", "U+FFFB"} // U+FFFB : interlinear annotation terminator
};
int getNbDigits(int aNum, int base);
@ -407,41 +487,37 @@ public:
return (execute(SCI_GETVIEWEOL) != 0);
};
void showNpc(bool willBeShowed = true, bool isSearchResult = false) {
void showNpc(bool willBeShowed = true, bool isSearchResult = false);
bool isShownNpc() {
auto& svp = NppParameters::getInstance().getSVP();
if (willBeShowed)
return svp._npcShow;
};
void maintainStateForNpc() {
const auto& svp = NppParameters::getInstance().getSVP();
const bool isShownNpc = svp._npcShow;
const bool isNpcIncCcUniEol = svp._npcIncludeCcUniEol;
const bool isShownCcUniEol = svp._ccUniEolShow;
if (isShownNpc || isNpcIncCcUniEol)
{
const auto& mode = static_cast<size_t>(svp._npcMode);
for (const auto& invChar : g_nonPrintingChars)
{
execute(SCI_SETREPRESENTATION, reinterpret_cast<WPARAM>(invChar.at(0)), reinterpret_cast<LPARAM>(invChar.at(mode)));
}
if (svp._npcCustomColor)
{
setNPC();
}
showNpc(isShownNpc);
}
else
{
execute(SCI_CLEARALLREPRESENTATIONS);
// SCI_CLEARALLREPRESENTATIONS will also reset CRLF
if (!isSearchResult && svp._eolMode != svp.roundedRectangleText)
{
setCRLF();
}
}
redraw();
};
showCcUniEol(isShownCcUniEol);
}
bool isShownNpc() {
void showCcUniEol(bool willBeShowed = true, bool isSearchResult = false);
bool isShownCcUniEol() {
auto& svp = NppParameters::getInstance().getSVP();
return svp._npcShow;
return svp._ccUniEolShow;
};
void showInvisibleChars(bool willBeShowed = true) {
showNpc(willBeShowed);
showCcUniEol(willBeShowed);
showWSAndTab(willBeShowed);
showEOL(willBeShowed);
};
@ -658,7 +734,7 @@ public:
void restoreDefaultWordChars();
void setWordChars();
void setCRLF(long color = -1);
void setNPC(long color = -1);
void setNpcAndCcUniEOL(long color = -1);
void mouseWheel(WPARAM wParam, LPARAM lParam) {
scintillaNew_Proc(_hSelf, WM_MOUSEWHEEL, wParam, lParam);

@ -70,20 +70,19 @@ IDD_PREFERENCE_SUB_EDITING DIALOGEX 115, 10, 460, 205
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
GROUPBOX "Non-Printing Characters",IDC_GB_STATIC_NPC,11,3,150,59,BS_CENTER
GROUPBOX "Non-Printing Characters",IDC_GB_STATIC_NPC,11,3,150,74,BS_CENTER
PUSHBUTTON "?",IDC_BUTTON_NPC_NOTE,141,14,16,14,NOT WS_TABSTOP
CONTROL "Abbreviation",IDC_RADIO_NPC_ABBREVIATION,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP,17,16,110,10
CONTROL "Codepoint",IDC_RADIO_NPC_CODEPOINT,"Button",BS_AUTORADIOBUTTON,17,31,110,10
CONTROL "Custom Color",IDC_CHECK_NPC_COLOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,47,110,10
PUSHBUTTON "...",IDC_BUTTON_NPC_LAUNCHSTYLECONF,141,44,16,14
CONTROL "Apply to C0, C1 && Unicode EOL",IDC_CHECK_NPC_INCLUDECCUNIEOL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,62,140,10
GROUPBOX "Current Line Indicator",IDC_CURRENTLINEMARK_STATIC,11,68,150,74,BS_CENTER
CONTROL "None",IDC_RADIO_CLM_NONE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,17,81,100,10
CONTROL "Highlight Background",IDC_RADIO_CLM_HILITE,"Button",BS_AUTORADIOBUTTON,17,96,100,10
CONTROL "Frame",IDC_RADIO_CLM_FRAME,"Button",BS_AUTORADIOBUTTON,17,111,100,10
RTEXT "Width :",IDC_CARETLINEFRAME_WIDTH_STATIC,30,125,37,8
CONTROL "",IDC_CARETLINEFRAME_WIDTH_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | TBS_TRANSPARENTBKGND | WS_TABSTOP,68,124,57,13
LTEXT "1",IDC_CARETLINEFRAME_WIDTH_DISPLAY,127,125,12,8
GROUPBOX "EOL (CRLF)",IDC_GB_STATIC_CRLF,11,83,150,59,BS_CENTER
CONTROL "Default",IDC_RADIO_ROUNDCORNER_CRLF,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP,17,96,100,10
CONTROL "Plain Text",IDC_RADIO_PLEINTEXT_CRLF,"Button",BS_AUTORADIOBUTTON,17,111,100,10
CONTROL "Custom Color",IDC_CHECK_WITHCUSTOMCOLOR_CRLF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,127,100,10
PUSHBUTTON "...",IDC_BUTTON_LAUNCHSTYLECONF_CRLF,141,124,16,14
GROUPBOX "Caret Settings",IDC_CARETSETTING_STATIC,11,148,150,47,BS_CENTER
RTEXT "Width :",IDC_WIDTH_STATIC,30,164,37,8
@ -93,24 +92,26 @@ BEGIN
LTEXT "S",IDC_CARETBLINKRATE_S_STATIC,140,179,12,8
RTEXT "F",IDC_CARETBLINKRATE_F_STATIC,68,179,12,8
GROUPBOX "EOL (CRLF)",IDC_GB_STATIC_CRLF,171,3,130,59,BS_CENTER
CONTROL "Default",IDC_RADIO_ROUNDCORNER_CRLF,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP,177,16,100,10
CONTROL "Plain Text",IDC_RADIO_PLEINTEXT_CRLF,"Button",BS_AUTORADIOBUTTON,177,31,100,10
CONTROL "Custom Color",IDC_CHECK_WITHCUSTOMCOLOR_CRLF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,177,47,100,10
PUSHBUTTON "...",IDC_BUTTON_LAUNCHSTYLECONF_CRLF,281,44,16,14
GROUPBOX "Line Wrap",IDC_LW_GB_STATIC,311,3,80,59,BS_CENTER
CONTROL "Default",IDC_RADIO_LWDEF,"Button",BS_AUTORADIOBUTTON | WS_GROUP,317,16,68,10
CONTROL "Aligned",IDC_RADIO_LWALIGN,"Button",BS_AUTORADIOBUTTON,317,31,68,10
CONTROL "Indent",IDC_RADIO_LWINDENT,"Button",BS_AUTORADIOBUTTON,317,46,68,10
CONTROL "Enable smooth font",IDC_CHECK_SMOOTHFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,81,270,10
CONTROL "Enable virtual space",IDC_CHECK_VIRTUALSPACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,96,270,10
CONTROL "Make current level folding/unfolding commands toggleable",IDC_CHECK_FOLDINGTOGGLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,111,270,10
CONTROL "Enable Multi-Editing (Ctrl+Mouse click/selection)",IDC_CHECK_MULTISELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,126,270,10
CONTROL "Enable scrolling beyond last line",IDC_CHECK_SCROLLBEYONDLASTLINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,141,270,10
CONTROL "Keep selection when right-click outside of selection",IDC_CHECK_RIGHTCLICKKEEPSSELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,156,270,10
CONTROL "Disable advanced scrolling feature due to touchpad issue",IDC_CHECK_DISABLEADVANCEDSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,171,270,10
GROUPBOX "Current Line Indicator",IDC_CURRENTLINEMARK_STATIC,171,3,150,74,BS_CENTER
CONTROL "None",IDC_RADIO_CLM_NONE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,177,16,100,10
CONTROL "Highlight Background",IDC_RADIO_CLM_HILITE,"Button",BS_AUTORADIOBUTTON,177,31,100,10
CONTROL "Frame",IDC_RADIO_CLM_FRAME,"Button",BS_AUTORADIOBUTTON,177,46,100,10
RTEXT "Width :",IDC_CARETLINEFRAME_WIDTH_STATIC,190,60,37,8
CONTROL "",IDC_CARETLINEFRAME_WIDTH_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | TBS_TRANSPARENTBKGND | WS_TABSTOP,228,59,57,13
LTEXT "1",IDC_CARETLINEFRAME_WIDTH_DISPLAY,287,60,12,8
GROUPBOX "Line Wrap",IDC_LW_GB_STATIC,331,3,80,59,BS_CENTER
CONTROL "Default",IDC_RADIO_LWDEF,"Button",BS_AUTORADIOBUTTON | WS_GROUP,337,16,68,10
CONTROL "Aligned",IDC_RADIO_LWALIGN,"Button",BS_AUTORADIOBUTTON,337,31,68,10
CONTROL "Indent",IDC_RADIO_LWINDENT,"Button",BS_AUTORADIOBUTTON,337,46,68,10
CONTROL "Enable smooth font",IDC_CHECK_SMOOTHFONT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,88,270,10
CONTROL "Enable virtual space",IDC_CHECK_VIRTUALSPACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,103,270,10
CONTROL "Make current level folding/unfolding commands toggleable",IDC_CHECK_FOLDINGTOGGLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,118,270,10
CONTROL "Enable Multi-Editing (Ctrl+Mouse click/selection)",IDC_CHECK_MULTISELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,133,270,10
CONTROL "Enable scrolling beyond last line",IDC_CHECK_SCROLLBEYONDLASTLINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,148,270,10
CONTROL "Keep selection when right-click outside of selection",IDC_CHECK_RIGHTCLICKKEEPSSELECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,163,270,10
CONTROL "Disable advanced scrolling feature due to touchpad issue",IDC_CHECK_DISABLEADVANCEDSCROLL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,173,178,270,10
END

@ -919,16 +919,15 @@ intptr_t CALLBACK EditingSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
_tip = CreateToolTip(IDC_BUTTON_LAUNCHSTYLECONF_CRLF, _hSelf, _hInst, const_cast<PTSTR>(tip2show.c_str()), pNativeSpeaker->isRTL());
const bool isNpcModeAbbrv = svp._npcMode == svp.abbreviation;
::SendDlgItemMessage(_hSelf, IDC_RADIO_NPC_ABBREVIATION, BM_SETCHECK, isNpcModeAbbrv, 0);
::SendDlgItemMessage(_hSelf, IDC_RADIO_NPC_CODEPOINT, BM_SETCHECK, !isNpcModeAbbrv, 0);
setChecked(IDC_RADIO_NPC_ABBREVIATION, isNpcModeAbbrv);
setChecked(IDC_RADIO_NPC_CODEPOINT, !isNpcModeAbbrv);
::SendDlgItemMessage(_hSelf, IDC_CHECK_NPC_COLOR, BM_SETCHECK, svp._npcCustomColor, 0);
setChecked(IDC_CHECK_NPC_COLOR, svp._npcCustomColor);
setChecked(IDC_CHECK_NPC_INCLUDECCUNIEOL, svp._npcIncludeCcUniEol);
generic_string tipNote2Show = pNativeSpeaker->getLocalizedStrFromID("npcNote-tip",
L"Representation of selected \"non-ASCII\" whitespace and non-printing (control) characters.\n\n"\
L"NOTE:\n"\
L"Some characters might already have some representation and are thus visible. "\
L"Line separator and paragraph separator are already represented by abbreviation by default.\n\n"\
L"Using representation will disable character effects on text.\n\n"\
L"For the full list of selected whitespace and non-printing characters check User Manual.\n\n"\
L"Click on this button to open website with User Manual.");
@ -952,15 +951,20 @@ intptr_t CALLBACK EditingSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
generic_string tipNpcCol2show = pNativeSpeaker->getLocalizedStrFromID("npcCustomColor-tip",
L"Go to Style Configurator to change the default custom color for selected whitespace and non-printing characters (\"Non-printing characters custom color\").");
generic_string tipNpcInc2show = pNativeSpeaker->getLocalizedStrFromID("npcIncludeCcUniEol-tip",
L"Apply non-printing characters appearance settings to C0, C1 control and Unicode EOL (next line, line separator and paragraph separator) characters.");
_tipNote = CreateToolTip(IDC_BUTTON_NPC_NOTE, _hSelf, _hInst, const_cast<PTSTR>(tipNote2Show.c_str()), pNativeSpeaker->isRTL());
_tipAbb = CreateToolTip(IDC_RADIO_NPC_ABBREVIATION, _hSelf, _hInst, const_cast<PTSTR>(tipAb2Show.c_str()), pNativeSpeaker->isRTL());
_tipCodepoint = CreateToolTip(IDC_RADIO_NPC_CODEPOINT, _hSelf, _hInst, const_cast<PTSTR>(tipCp2Show.c_str()), pNativeSpeaker->isRTL());
_tipNpcColor = CreateToolTip(IDC_BUTTON_NPC_LAUNCHSTYLECONF, _hSelf, _hInst, const_cast<PTSTR>(tipNpcCol2show.c_str()), pNativeSpeaker->isRTL());
_tipNpcInclude = CreateToolTip(IDC_CHECK_NPC_INCLUDECCUNIEOL, _hSelf, _hInst, const_cast<PTSTR>(tipNpcInc2show.c_str()), pNativeSpeaker->isRTL());
_tips.emplace_back(_tipNote);
_tips.emplace_back(_tipAbb);
_tips.emplace_back(_tipCodepoint);
_tips.emplace_back(_tipNpcColor);
_tips.push_back(_tipNote);
_tips.push_back(_tipAbb);
_tips.push_back(_tipCodepoint);
_tips.push_back(_tipNpcColor);
_tips.push_back(_tipNpcInclude);
for (auto& tip : _tips)
{
@ -1142,6 +1146,15 @@ intptr_t CALLBACK EditingSubDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM
return TRUE;
}
case IDC_CHECK_NPC_INCLUDECCUNIEOL:
{
svp._npcIncludeCcUniEol = isCheckedOrNot(IDC_CHECK_NPC_INCLUDECCUNIEOL);
const HWND grandParent = ::GetParent(_hParent);
::SendMessage(grandParent, NPPM_INTERNAL_SETNPC, IDC_CHECK_NPC_INCLUDECCUNIEOL, 0);
return TRUE;
}
case IDC_CHECK_VIRTUALSPACE:
svp._virtualSpace = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_VIRTUALSPACE, BM_GETCHECK, 0, 0));
::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_VIRTUALSPACE, 0, 0);

@ -70,10 +70,11 @@ private :
HWND _tipAbb = nullptr;
HWND _tipCodepoint = nullptr;
HWND _tipNpcColor = nullptr;
HWND _tipNpcInclude = nullptr;
std::vector<HWND> _tips;
intptr_t CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
intptr_t CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) override;
void initScintParam();
void changeLineHiliteMode(bool enableSlider);
};

@ -163,6 +163,7 @@
#define IDC_RADIO_NPC_CODEPOINT (IDD_PREFERENCE_SUB_EDITING + 55)
#define IDC_CHECK_NPC_COLOR (IDD_PREFERENCE_SUB_EDITING + 56)
#define IDC_BUTTON_NPC_LAUNCHSTYLECONF (IDD_PREFERENCE_SUB_EDITING + 57)
#define IDC_CHECK_NPC_INCLUDECCUNIEOL (IDD_PREFERENCE_SUB_EDITING + 58)
#define IDD_PREFERENCE_SUB_DELIMITER 6250 //(IDD_PREFERENCE_BOX + 250)
#define IDC_DELIMITERSETTINGS_GB_STATIC (IDD_PREFERENCE_SUB_DELIMITER + 1)

@ -376,6 +376,7 @@
#define IDM_VIEW_TAB_COLOUR_5 (IDM_VIEW + 115)
#define IDM_VIEW_NPC (IDM_VIEW + 130)
#define IDM_VIEW_NPC_CCUNIEOL (IDM_VIEW + 131)
#define IDM_VIEW_GOTO_ANOTHER_VIEW 10001
#define IDM_VIEW_CLONE_TO_ANOTHER_VIEW 10002

Loading…
Cancel
Save