aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2019-04-26 08:10:28 +1000
committerNeil <nyamatongwe@gmail.com>2019-04-26 08:10:28 +1000
commit10ab65c62f00c16437ca8763d3c950e0a45193e0 (patch)
tree3d8fe04f8071b1f4bd1954b8e197dabae8a1acab /src
parent0af74116cefe1ef66820f434dd057d2345c382fd (diff)
downloadscintilla-mirror-10ab65c62f00c16437ca8763d3c950e0a45193e0.tar.gz
Backport: Feature [feature-requests:#1238]. Simplify case forcing with CaseForce function
that hoists the repeated logic out of the 2 loops that check or set the cached visual line text. Backport of changeset 7476:93d24d83d380.
Diffstat (limited to 'src')
-rw-r--r--src/EditView.cxx64
1 files changed, 35 insertions, 29 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx
index 727efbcdd..7ce152489 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -344,6 +344,34 @@ LineLayout *EditView::RetrieveLineLayout(Sci::Line lineNumber, const EditModel &
model.LinesOnScreen() + 1, model.pdoc->LinesTotal());
}
+namespace {
+
+/**
+* Return the chDoc argument with case transformed as indicated by the caseForce argument.
+* chPrevious is needed for camel casing.
+* This only affects ASCII characters and is provided for languages with case-insensitive
+* ASCII keywords where the user wishes to view keywords in a preferred case.
+*/
+inline char CaseForce(Style::ecaseForced caseForce, char chDoc, char chPrevious) {
+ switch (caseForce) {
+ case Style::caseMixed:
+ return chDoc;
+ case Style::caseLower:
+ return MakeLowerCase(chDoc);
+ case Style::caseUpper:
+ return MakeUpperCase(chDoc);
+ case Style::caseCamel:
+ default: // default should not occur, included to avoid warnings
+ if (IsUpperOrLowerCase(chDoc) && !IsUpperOrLowerCase(chPrevious)) {
+ return MakeUpperCase(chDoc);
+ } else {
+ return MakeLowerCase(chDoc);
+ }
+ }
+}
+
+}
+
/**
* Fill in the LineLayout data for the given line.
* Copy the given @a line and its styles from the document into local arrays.
@@ -372,29 +400,16 @@ void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surfa
// Check base line layout
int styleByte = 0;
int numCharsInLine = 0;
+ char chPrevious = 0;
while (numCharsInLine < lineLength) {
const Sci::Position charInDoc = numCharsInLine + posLineStart;
const char chDoc = model.pdoc->CharAt(charInDoc);
styleByte = model.pdoc->StyleIndexAt(charInDoc);
allSame = allSame &&
(ll->styles[numCharsInLine] == styleByte);
- if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseMixed)
- allSame = allSame &&
- (ll->chars[numCharsInLine] == chDoc);
- else if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseLower)
- allSame = allSame &&
- (ll->chars[numCharsInLine] == MakeLowerCase(chDoc));
- else if (vstyle.styles[ll->styles[numCharsInLine]].caseForce == Style::caseUpper)
- allSame = allSame &&
- (ll->chars[numCharsInLine] == MakeUpperCase(chDoc));
- else { // Style::caseCamel
- 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));
- }
- }
+ allSame = allSame &&
+ (ll->chars[numCharsInLine] == CaseForce(vstyle.styles[styleByte].caseForce, chDoc, chPrevious));
+ chPrevious = chDoc;
numCharsInLine++;
}
allSame = allSame && (ll->styles[numCharsInLine] == styleByte); // For eolFilled
@@ -428,20 +443,11 @@ void EditView::LayoutLine(const EditModel &model, Sci::Line line, Surface *surfa
const int numCharsInLine = (vstyle.viewEOL) ? lineLength : numCharsBeforeEOL;
const unsigned char styleByteLast = (lineLength > 0) ? ll->styles[lineLength - 1] : 0;
if (vstyle.someStylesForceCase) {
+ char chPrevious = 0;
for (int charInLine = 0; charInLine<lineLength; charInLine++) {
const char chDoc = ll->chars[charInLine];
- if (vstyle.styles[ll->styles[charInLine]].caseForce == Style::caseUpper)
- ll->chars[charInLine] = MakeUpperCase(chDoc);
- 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 ((IsUpperOrLowerCase(ll->chars[charInLine])) &&
- ((charInLine == 0) || (!IsUpperOrLowerCase(ll->chars[charInLine - 1])))) {
- ll->chars[charInLine] = MakeUpperCase(chDoc);
- } else {
- ll->chars[charInLine] = MakeLowerCase(chDoc);
- }
- }
+ ll->chars[charInLine] = CaseForce(vstyle.styles[ll->styles[charInLine]].caseForce, chDoc, chPrevious);
+ chPrevious = chDoc;
}
}
ll->xHighlightGuide = 0;