From 0af74116cefe1ef66820f434dd057d2345c382fd Mon Sep 17 00:00:00 2001 From: Neil Date: Fri, 26 Apr 2019 07:53:21 +1000 Subject: Backport: Feature [feature-requests:#1238]. Simplify camel case forcing by checking only for upper and lower case characters instead of current word characters. This changes behaviour for words like "_word" -> "_Word" instead of remaining "_word" but that doesn't matter for this feature's intended use which is to allow display of ASCII-only keywords in the user's preferred casing (else/ELSE/Else) for languages with case-insensitive keywords. Backport of changeset 7475:cdb7af706ba1. --- doc/ScintillaHistory.html | 6 ++++++ lexlib/CharacterSet.h | 4 ++++ src/Document.cxx | 8 -------- src/Document.h | 1 - src/EditView.cxx | 8 ++++---- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 07f4b01be..c99caa2e4 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -552,6 +552,12 @@
  • Fix bug where changing identifier sets in lexers preserved previous identifiers.
  • +
  • + Changed behaviour of SCI_STYLESETCASE(*,SC_CASE_CAMEL) so that it only treats 'a-zA-Z' + as word characters because this covers the feature's intended use (viewing case-insensitive ASCII-only + keywords in a specified casing style) and simplifies the behaviour and code. + Feature #1238. +
  • Release 3.10.5 diff --git a/lexlib/CharacterSet.h b/lexlib/CharacterSet.h index 358f6bed3..0470e446c 100644 --- a/lexlib/CharacterSet.h +++ b/lexlib/CharacterSet.h @@ -135,6 +135,10 @@ inline bool IsUpperCase(int ch) { return (ch >= 'A') && (ch <= 'Z'); } +inline bool IsUpperOrLowerCase(int ch) { + return IsUpperCase(ch) || IsLowerCase(ch); +} + inline bool IsAlphaNumeric(int ch) { return ((ch >= '0') && (ch <= '9')) || diff --git a/src/Document.cxx b/src/Document.cxx index dd11ae42d..9b30b44aa 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -1698,14 +1698,6 @@ Sci::Position Document::ParaDown(Sci::Position pos) const { return LineEnd(line-1); } -bool Document::IsASCIIWordByte(unsigned char ch) const { - if (IsASCII(ch)) { - return charClass.GetClass(ch) == CharClassify::ccWord; - } else { - return false; - } -} - CharClassify::cc Document::WordCharacterClass(unsigned int ch) const { if (dbcsCodePage && (!UTF8IsAscii(ch))) { if (SC_CP_UTF8 == dbcsCodePage) { diff --git a/src/Document.h b/src/Document.h index adbdc3413..f662dc993 100644 --- a/src/Document.h +++ b/src/Document.h @@ -482,7 +482,6 @@ public: bool AddWatcher(DocWatcher *watcher, void *userData); bool RemoveWatcher(DocWatcher *watcher, void *userData); - bool IsASCIIWordByte(unsigned char ch) const; CharClassify::cc WordCharacterClass(unsigned int ch) const; bool IsWordPartSeparator(unsigned int ch) const; Sci::Position WordPartLeft(Sci::Position pos) const; diff --git a/src/EditView.cxx b/src/EditView.cxx index 7b585c553..727efbcdd 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -388,8 +388,8 @@ void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surfa allSame = allSame && (ll->chars[numCharsInLine] == MakeUpperCase(chDoc)); else { // Style::caseCamel - if ((model.pdoc->IsASCIIWordByte(ll->chars[numCharsInLine])) && - ((numCharsInLine == 0) || (!model.pdoc->IsASCIIWordByte(ll->chars[numCharsInLine - 1])))) { + if ((IsUpperOrLowerCase(ll->chars[numCharsInLine])) && + ((numCharsInLine == 0) || (!IsUpperOrLowerCase(ll->chars[numCharsInLine - 1])))) { allSame = allSame && (ll->chars[numCharsInLine] == MakeUpperCase(chDoc)); } else { allSame = allSame && (ll->chars[numCharsInLine] == MakeLowerCase(chDoc)); @@ -435,8 +435,8 @@ void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surfa else if (vstyle.styles[ll->styles[charInLine]].caseForce == Style::caseLower) ll->chars[charInLine] = MakeLowerCase(chDoc); else if (vstyle.styles[ll->styles[charInLine]].caseForce == Style::caseCamel) { - if ((model.pdoc->IsASCIIWordByte(ll->chars[charInLine])) && - ((charInLine == 0) || (!model.pdoc->IsASCIIWordByte(ll->chars[charInLine - 1])))) { + if ((IsUpperOrLowerCase(ll->chars[charInLine])) && + ((charInLine == 0) || (!IsUpperOrLowerCase(ll->chars[charInLine - 1])))) { ll->chars[charInLine] = MakeUpperCase(chDoc); } else { ll->chars[charInLine] = MakeLowerCase(chDoc); -- cgit v1.2.3