19#include <forward_list>
61PrintParameters::PrintParameters() noexcept {
70 if (st.multipleStyles) {
71 for (
size_t iStyle = 0; iStyle<st.length; iStyle++) {
72 if (!vs.ValidStyle(styleOffset + st.styles[iStyle]))
76 if (!vs.ValidStyle(styleOffset + st.style))
83 const char *
text,
const unsigned char *styles,
size_t len) {
87 const unsigned char style = styles[start];
88 size_t endSegment = start;
89 while ((endSegment + 1 < len) && (styles[endSegment + 1] == style))
92 width +=
static_cast<int>(surface->
WidthText(fontText,
text + start,
93 static_cast<int>(endSegment - start + 1)));
94 start = endSegment + 1;
102 while (start < st.
length) {
109 widthSubLine =
static_cast<int>(surface->
WidthText(fontText,
110 st.
text + start,
static_cast<int>(lenLine)));
112 if (widthSubLine > widthMax)
113 widthMax = widthSubLine;
114 start += lenLine + 1;
120 const char *s,
int len,
DrawPhase phase) {
139 int x =
static_cast<int>(rcText.
left);
143 size_t style = st.
styles[i + start];
144 while (end < length - 1 && st.
styles[start + end + 1] == style)
146 style += styleOffset;
148 const int width =
static_cast<int>(surface->
WidthText(fontText,
149 st.
text + start + i,
static_cast<int>(end - i + 1)));
155 static_cast<int>(end - i + 1), phase);
160 const size_t style = st.
style + styleOffset;
163 static_cast<int>(length), phase);
190 const PhasesDraw phasesDrawNew = twoPhaseDraw ? phasesTwo : phasesOne;
191 const bool redraw = phasesDraw != phasesDrawNew;
192 phasesDraw = phasesDrawNew;
198 const bool redraw = phasesDraw != phasesDrawNew;
199 phasesDraw = phasesDrawNew;
212 const int next = GetNextTabstop(
line,
static_cast<int>(x + tabWidthMinimumPixels));
215 return (
static_cast<int>((x + tabWidthMinimumPixels) / tabWidth) + 1) * tabWidth;
219 return ldTabstops && ldTabstops->ClearTabstops(
line);
224 ldTabstops = Sci::make_unique<LineTabstops>();
231 return ldTabstops->GetNextTabstop(
line, x);
239 if (linesAdded > 0) {
276 const char *
const reps[] = {
277 "NUL",
"SOH",
"STX",
"ETX",
"EOT",
"ENQ",
"ACK",
"BEL",
278 "BS",
"HT",
"LF",
"VT",
"FF",
"CR",
"SO",
"SI",
279 "DLE",
"DC1",
"DC2",
"DC3",
"DC4",
"NAK",
"SYN",
"ETB",
280 "CAN",
"EM",
"SUB",
"ESC",
"FS",
"GS",
"RS",
"US"
282 if (ch < Sci::size(reps)) {
291 if ((rcTab.
left + 2) < (rcTab.
right - 1))
299 int ydiff = (ircTab.
bottom - ircTab.
top) / 2;
300 int xhead = ircTab.
right - 1 - ydiff;
301 if (xhead <= rcTab.
left) {
302 ydiff -= ircTab.
left - xhead - 1;
303 xhead = ircTab.
left - 1;
305 surface->
LineTo(xhead, ymid - ydiff);
307 surface->
LineTo(xhead, ymid + ydiff);
319 for (
int stripe = 1; stripe < vsDraw.
lineHeight + 1; stripe += 2) {
365constexpr bool IsControlCharacter(
int ch)
noexcept {
368 return (ch >= 0 && ch <
' ') || (ch == 127);
403 for (
Sci::Position numCharsInLine = 0; numCharsInLine < lineLength; numCharsInLine++) {
404 const Sci::Position charInDoc = numCharsInLine + posLineStart;
405 const char chDoc = model.
pdoc->
CharAt(charInDoc);
408 (ll->
styles[numCharsInLine] == styleByte);
410 (ll->
chars[numCharsInLine] == CaseForce(vstyle.
styles[styleByte].caseForce, chDoc, chPrevious));
413 const int styleByteLast = (posLineEnd > posLineStart) ? model.
pdoc->
StyleIndexAt(posLineEnd - 1) : 0;
414 allSame = allSame && (ll->
styles[lineLength] == styleByteLast);
429 if (edgePosition >= posLineStart) {
430 edgePosition -= posLineStart;
432 ll->
edgeColumn =
static_cast<int>(edgePosition);
438 const int lineLength =
static_cast<int>(posLineEnd - posLineStart);
441 const int numCharsBeforeEOL =
static_cast<int>(model.
pdoc->
LineEnd(
line) - posLineStart);
442 const int numCharsInLine = (vstyle.
viewEOL) ? lineLength : numCharsBeforeEOL;
443 const unsigned char styleByteLast = (lineLength > 0) ? ll->
styles[lineLength - 1] : 0;
446 for (
int charInLine = 0; charInLine<lineLength; charInLine++) {
447 const char chDoc = ll->
chars[charInLine];
448 ll->
chars[charInLine] = CaseForce(vstyle.
styles[ll->
styles[charInLine]].caseForce, chDoc, chPrevious);
454 ll->
chars[numCharsInLine] = 0;
455 ll->
styles[numCharsInLine] = styleByteLast;
460 bool lastSegItalics =
false;
463 while (bfLayout.
More()) {
476 if (representationWidth <= 0.0) {
483 for (
int ii = 0; ii < ts.
length; ii++)
503 if (lastSegItalics) {
554 while (p < ll->numCharsInLine) {
555 if ((ll->
positions[p + 1] - startOffset) >= width) {
556 if (lastGoodBreak == lastLineStart) {
562 if (lastGoodBreak == lastLineStart) {
568 lastLineStart = lastGoodBreak;
571 startOffset = ll->
positions[lastGoodBreak];
574 p = lastGoodBreak + 1;
604 if ((pe &
peLineEnd) && (lineDoc > 0) && (
pos.Position() == posLineStart)) {
609 const Sci::Line lineVisible = model.
pcs->DisplayFromDoc(lineDoc);
613 const int posInLine =
static_cast<int>(
pos.Position() - posLineStart);
624 if (lineVisible < 0) {
627 const Sci::Line lineDoc = model.
pcs->DocFromDisplay(lineVisible);
632 const Sci::Line lineStartSet = model.
pcs->DisplayFromDoc(lineDoc);
633 const int subLine =
static_cast<int>(lineVisible - lineStartSet);
634 if (subLine < ll->
lines) {
636 if (subLine == ll->
lines-1) {
642 rangeSubLine.
start += positionLineStart;
643 rangeSubLine.
end += positionLineStart;
650 if (!canReturnInvalid && (visibleLine < 0))
652 const Sci::Line lineDoc = model.
pcs->DocFromDisplay(visibleLine);
653 if (canReturnInvalid && (lineDoc < 0))
662 const Sci::Line lineStartSet = model.
pcs->DisplayFromDoc(lineDoc);
663 const int subLine =
static_cast<int>(visibleLine - lineStartSet);
664 if (subLine < ll->
lines) {
670 rangeSubLine, charPosition);
671 if (positionInLine < rangeSubLine.
end) {
676 const int spaceOffset =
static_cast<int>(
677 (pt.
x + subLineStart - ll->
positions[rangeSubLine.
end] + spaceWidth / 2) / spaceWidth);
679 }
else if (canReturnInvalid) {
680 if (pt.
x < (ll->
positions[rangeSubLine.
end] - subLineStart)) {
687 if (!canReturnInvalid)
706 if (positionInLine < rangeSubLine.
end) {
710 const int spaceOffset =
static_cast<int>(
711 (x + subLineStart - ll->
positions[rangeSubLine.
end] + spaceWidth / 2) / spaceWidth);
719 Sci::Line lineDisplay = model.
pcs->DisplayFromDoc(lineDoc);
726 for (
int subLine = 0; subLine < ll->
lines; subLine++) {
727 if (posInLine >= ll->
LineStart(subLine)) {
743 if (posInLine <= ll->maxLineLength) {
744 for (
int subLine = 0; subLine < ll->
lines; subLine++) {
745 if ((posInLine >= ll->
LineStart(subLine)) &&
746 (posInLine <= ll->
LineStart(subLine + 1)) &&
747 (posInLine <= ll->numCharsBeforeEOL)) {
749 posRet = ll->
LineStart(subLine) + posLineStart;
751 if (subLine == ll->
lines - 1)
754 posRet = ll->
LineStart(subLine + 1) + posLineStart - 1;
765 (primarySelection ? vsDraw.selColours.back : vsDraw.selBackground2) :
766 vsDraw.selAdditionalBackground;
771 if (inSelection == 1) {
772 if (vsDraw.selColours.back.isSet && (vsDraw.selAlpha ==
SC_ALPHA_NOALPHA)) {
775 }
else if (inSelection == 2) {
776 if (vsDraw.selColours.back.isSet && (vsDraw.selAdditionalAlpha ==
SC_ALPHA_NOALPHA)) {
781 (i >= ll->edgeColumn) &&
782 (i < ll->numCharsBeforeEOL))
783 return vsDraw.theEdge.colour;
784 if (inHotspot && vsDraw.hotspotColours.back.isSet)
785 return vsDraw.hotspotColours.back;
790 return vsDraw.styles[styleMain].back;
797 start + 2, rcSegment.
bottom);
798 surface->
Copy(rcCopyArea, from,
810 if (rcSegment.
Empty())
812 if (fillBackground) {
829 rcSegment.
top + vsDraw.
maxAscent, s,
static_cast<int>(s ? strlen(s) : 0),
835 surface->
AlphaRectangle(rcFrame, 0, colour, alpha, colour, alpha, 0);
857 if (subLine == ll->
lines - 1) {
871 const bool lastSubLine = subLine == (ll->
lines - 1);
880 if (virtualSpace > 0.0f) {
881 rcSegment.
left = xEol + xStart;
882 rcSegment.
right = xEol + xStart + virtualSpace;
888 for (
size_t r = 0; r<model.
sel.
Count(); r++) {
892 if (!portion.
Empty()) {
907 int eolInSelection = 0;
921 blobsWidth += rcSegment.
Width();
923 const char *ctrlChar;
924 const unsigned char chEOL = ll->
chars[eolPos];
925 const int styleMain = ll->
styles[eolPos];
935 sprintf(hexits,
"x%2X", chEOL);
943 if (eolInSelection && vsDraw.
selColours.
back.
isSet && (line < model.pdoc->LinesTotal() - 1)) {
960 rcSegment.
left = xEol + xStart + virtualSpace + blobsWidth;
966 if (background.
isSet) {
968 }
else if (line < model.pdoc->LinesTotal() - 1) {
986 const bool fillRemainder = (!lastSubLine || (!model.
GetFoldDisplayText(
line) && !drawEOLAnnotationStyledText));
992 bool drawWrapMarkEnd =
false;
994 if (subLine + 1 < ll->
lines) {
996 drawWrapMarkEnd = ll->
LineStart(subLine + 1) != 0;
1006 if (drawWrapMarkEnd) {
1010 rcPlace.
left = xEol + xStart + virtualSpace;
1029 ll->
positions[startPos] + xStart - subLineStart,
1031 ll->
positions[endPos] + xStart - subLineStart,
1036 if (secondCharacter >= 0) {
1037 rcFirstCharacter.
right = ll->
positions[secondCharacter] + xStart - subLineStart;
1040 rcFirstCharacter.
right = rcFirstCharacter.
left;
1042 vsDraw.
indicators[indicNum].Draw(surface, rcIndic, rcLine, rcFirstCharacter, state, value);
1053 if (under == vsDraw.
indicators[deco->Indicator()].under) {
1055 if (!deco->ValueAt(startPos)) {
1056 startPos = deco->EndRun(startPos);
1058 while ((startPos < posLineEnd) && (deco->ValueAt(startPos))) {
1059 const Range rangeRun(deco->StartRun(startPos), deco->EndRun(startPos));
1061 const bool hover = vsDraw.
indicators[deco->Indicator()].IsDynamic() &&
1063 const int value = deco->ValueAt(startPos);
1066 DrawIndicator(deco->Indicator(), startPos - posLineStart, endPos - posLineStart,
1067 surface, vsDraw, ll, xStart, rcLine, posSecond - posLineStart, subLine, state, value);
1069 if (!deco->ValueAt(startPos)) {
1070 startPos = deco->EndRun(startPos);
1080 if (under == vsDraw.
indicators[braceIndicator].under) {
1081 const Range rangeLine(posLineStart + lineStart, posLineEnd);
1084 if (braceOffset < ll->numCharsInLine) {
1086 DrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, ll, xStart, rcLine, secondOffset, subLine,
Indicator::State::normal, 1);
1091 if (braceOffset < ll->numCharsInLine) {
1093 DrawIndicator(braceIndicator, braceOffset, braceOffset + 1, surface, vsDraw, ll, xStart, rcLine, secondOffset, subLine,
Indicator::State::normal, 1);
1102 const bool lastSubLine = subLine == (ll->
lines - 1);
1111 const char *foldDisplayText =
text;
1112 const int lengthFoldDisplayText =
static_cast<int>(strlen(foldDisplayText));
1114 const int widthFoldDisplayText =
static_cast<int>(surface->
WidthText(fontText, foldDisplayText, lengthFoldDisplayText));
1116 int eolInSelection = 0;
1151 if (rcRemainder.
left < rcLine.
left)
1161 lengthFoldDisplayText, textFore);
1165 lengthFoldDisplayText, textFore, textBack);
1173 rcBox.
left = Sci::round(rcSegment.
left);
1196 const bool lastSubLine = subLine == (ll->
lines - 1);
1211 const int widthEOLAnnotationText =
static_cast<int>(surface->
WidthText(fontText, stEOLAnnotation.
text, stEOLAnnotation.
length));
1216 rcSegment.
left = xStart +
1221 if (textFoldDisplay) {
1222 rcSegment.
left += (
static_cast<int>(surface->
WidthText(fontText, textFoldDisplay,
static_cast<int>(strlen(textFoldDisplay)))) + vsDraw.
aveCharWidth);
1229 false,
static_cast<int>(style), -1);
1244 if (rcRemainder.
left < rcLine.
left)
1258 textFore, textBack);
1266 rcBox.
left = Sci::round(rcSegment.
left);
1289 const int annotationLine = subLine - ll->
lines;
1300 widthAnnotation +=
static_cast<int>(vsDraw.
spaceWidth * 2);
1302 rcSegment.
right = rcSegment.
left + widthAnnotation;
1309 size_t lengthAnnotation = stAnnotation.
LineLength(start);
1310 int lineInAnnotation = 0;
1311 while ((lineInAnnotation < annotationLine) && (start < stAnnotation.
length)) {
1312 start += lengthAnnotation + 1;
1313 lengthAnnotation = stAnnotation.
LineLength(start);
1323 stAnnotation, start, lengthAnnotation, phase);
1331 if (subLine == ll->
lines) {
1335 if (subLine == ll->
lines + annotationLines - 1) {
1355 Sci::Position offsetLastChar = offset + (posAfter - posCaret);
1356 while ((posBefore > 0) && ((offsetLastChar - numCharsToDraw) >= lineStart)) {
1357 if ((ll->
positions[offsetLastChar] - ll->
positions[offsetLastChar - numCharsToDraw]) > 0) {
1364 numCharsToDraw = posAfter - posBefore;
1365 offsetFirstChar = offset - (posCaret - posBefore);
1370 if (offsetFirstChar < 0)
1371 offsetFirstChar = 0;
1372 numCharsToDraw = offsetLastChar - offsetFirstChar;
1373 while ((offsetLastChar < ll->
LineStart(subLine + 1)) && (offsetLastChar <= ll->numCharsInLine)) {
1377 posBefore = posAfter;
1379 offsetLastChar = offset + (posAfter - posCaret);
1380 if ((ll->
positions[offsetLastChar] - ll->
positions[offsetLastChar - (posAfter - posBefore)]) > 0) {
1385 numCharsToDraw = offsetLastChar - offsetFirstChar;
1393 if ((ll->
wrapIndent != 0) && (lineStart != 0)) {
1395 rcCaret.
left += wordWrapCharWidth;
1396 rcCaret.
right += wordWrapCharWidth;
1401 const int styleMain = ll->
styles[offsetFirstChar];
1405 static_cast<int>(numCharsToDraw), vsDraw.
styles[styleMain].back,
1417 for (
size_t r = 0; (r<model.
sel.
Count()) || drawDrag; r++) {
1418 const bool mainCaret = r == model.
sel.
Main();
1428 const int offset =
static_cast<int>(posCaret.
Position() - posLineStart);
1441 (drawDrag || (caretBlinkState && caretVisibleState))) {
1442 bool canDrawBlockCaret =
true;
1443 bool drawBlockCaret =
false;
1449 canDrawBlockCaret =
false;
1452 canDrawBlockCaret =
false;
1458 if (widthOverstrikeCaret < 3)
1459 widthOverstrikeCaret = 3;
1462 caretWidthOffset = 0.51f;
1463 xposCaret += xStart;
1467 rcCaret.
left = Sci::round(xposCaret - caretWidthOffset);
1472 rcCaret.
left = xposCaret + 1;
1473 rcCaret.
right = rcCaret.
left + widthOverstrikeCaret - 1;
1476 rcCaret.
left = xposCaret;
1477 if (canDrawBlockCaret && !(IsControlCharacter(ll->
chars[offset]))) {
1478 drawBlockCaret =
true;
1479 rcCaret.
right = xposCaret + widthOverstrikeCaret;
1485 rcCaret.
left = Sci::round(xposCaret - caretWidthOffset);
1489 if (drawBlockCaret) {
1490 DrawBlockCaret(surface, model, vsDraw, ll, subLine, xStart, offset, posCaret.
Position(), rcCaret, caretColour);
1528 if (!customDrawWrapMarker) {
1531 customDrawWrapMarker(surface, rcPlace,
false, vsDraw.
WrapColour());
1541 bool inIndentation = subLine == 0;
1544 const int xStartVisible =
static_cast<int>(subLineStart)-xStart;
1546 BreakFinder bfBack(ll, &model.
sel, lineRange, posLineStart, xStartVisible, selBackDrawn, model.
pdoc, &model.
reprs,
nullptr);
1551 while (bfBack.
More()) {
1572 inHotspot, ll->
styles[i], i);
1574 if (ll->
chars[i] ==
'\t') {
1580 inIndentation =
false;
1587 for (
int cpos = 0; cpos <= i - ts.
start; cpos++) {
1598 inIndentation =
false;
1603 }
else if (rcSegment.
left > rcLine.
right) {
1610 Range lineRange,
int xStart) {
1620 for (
size_t edge = 0; edge < vsDraw.
theMultiEdge.size(); edge++) {
1638 for (
int markBit = 0; (markBit < 32) && marks; markBit++) {
1642 rcUnderline.
top = rcUnderline.
bottom - 2;
1656 if (subLine == (ll->
lines - 1)) {
1662 for (
size_t r = 0; r < model.
sel.
Count(); r++) {
1666 if (!portion.
Empty()) {
1700 for (
int markBit = 0; (markBit < 32) && marksDrawnInText; markBit++) {
1701 if (marksDrawnInText & 1) {
1706 rcUnderline.
top = rcUnderline.
bottom - 2;
1710 marksDrawnInText >>= 1;
1712 int marksDrawnInLine = marksOfLine & vsDraw.
maskInLine;
1713 for (
int markBit = 0; (markBit < 32) && marksDrawnInLine; markBit++) {
1714 if (marksDrawnInLine & 1) {
1717 marksDrawnInLine >>= 1;
1727 bool inIndentation = subLine == 0;
1733 const int xStartVisible =
static_cast<int>(subLineStart)-xStart;
1736 BreakFinder bfFore(ll, &model.
sel, lineRange, posLineStart, xStartVisible,
1739 while (bfFore.
More()) {
1751 const int styleMain = ll->
styles[i];
1763 const int indicatorValue = deco->ValueAt(ts.
start + posLineStart);
1764 if (indicatorValue) {
1769 const Range rangeRun(deco->StartRun(startPos), deco->EndRun(startPos));
1793 if (ll->
chars[i] ==
'\t') {
1801 for (
int indentCount =
static_cast<int>((ll->
positions[i] + epsilon) / indentWidth);
1802 indentCount <= (ll->
positions[i + 1] - epsilon) / indentWidth;
1804 if (indentCount > 0) {
1805 const XYPOSITION xIndent = std::floor(indentCount * indentWidth);
1818 const int segmentTop =
static_cast<int>(rcSegment.
top + vsDraw.
lineHeight / 2);
1826 inIndentation =
false;
1835 cc, 1, textBack, textFore);
1843 if (vsDraw.
styles[styleMain].visible) {
1847 static_cast<int>(i - ts.
start + 1), textFore);
1851 static_cast<int>(i - ts.
start + 1), textFore, textBack);
1856 for (
int cpos = 0; cpos <= i - ts.
start; cpos++) {
1881 for (
int indentCount =
static_cast<int>((ll->
positions[cpos + ts.
start] + epsilon) / indentWidth);
1882 indentCount <= (ll->
positions[cpos + ts.
start + 1] - epsilon) / indentWidth;
1884 if (indentCount > 0) {
1885 const XYPOSITION xIndent = std::floor(indentCount * indentWidth);
1892 inIndentation =
false;
1905 }
else if (vsDraw.
styles[styleMain].underline) {
1911 }
else if (rcSegment.
left > rcLine.
right) {
1920 && (subLine == 0)) {
1931 if (lineLastWithText <
line) {
1932 xStartText = 100000;
1943 indentSpace =
std::max(indentSpace, indentLastWithText);
1946 indentSpace =
std::max(indentSpace, indentLastWithText);
1954 if (lineNextWithText >
line) {
1955 xStartText = 100000;
1957 indentSpace =
std::max(indentSpace,
1961 for (
int indentPos = model.
pdoc->
IndentSize(); indentPos < indentSpace; indentPos += model.pdoc->IndentSize()) {
1963 if (xIndent < xStartText) {
1974 if (subLine >= ll->
lines) {
1988 if ((ll->
wrapIndent != 0) && (subLine > 0)) {
1997 DrawBackground(surface, model, vsDraw, ll, rcLine, lineRange, posLineStart, xStart,
1998 subLine, background);
2001 phase =
static_cast<DrawPhase>(phase & ~drawBack);
2003 xStart, subLine, subLineStart, background);
2009 DrawIndicators(surface, model, vsDraw, ll,
line, xStart, rcLine, subLine, lineRangeIncludingEnd.
end,
true, model.
hoverIndicatorPos);
2010 DrawEdgeLine(surface, vsDraw, ll, rcLine, lineRange, xStart);
2016 DrawForeground(surface, model, vsDraw, ll, lineVisible, rcLine, lineRange, posLineStart, xStart,
2017 subLine, background);
2025 DrawIndicators(surface, model, vsDraw, ll,
line, xStart, rcLine, subLine, lineRangeIncludingEnd.
end,
false, model.
hoverIndicatorPos);
2033 xStart, subLine, subLineStart, background);
2036 DrawEdgeLine(surface, vsDraw, ll, rcLine, lineRange, xStart);
2050 const bool expanded = model.
pcs->GetExpanded(
line);
2083 Surface *surface = surfaceWindow;
2093 const int screenLinePaintFirst =
static_cast<int>(rcArea.
top) / vsDraw.
lineHeight;
2094 const int xStart = vsDraw.
textStart - model.
xOffset +
static_cast<int>(ptOrigin.
x);
2106 rcTextArea = rcArea;
2113 rcClipText.
left -= leftTextOverlap;
2114 surfaceWindow->
SetClip(rcClipText);
2118#if defined(TIME_PAINTING)
2119 double durLayout = 0.0;
2120 double durPaint = 0.0;
2121 double durCopy = 0.0;
2129 std::vector<DrawPhase> phases;
2131 for (
DrawPhase phase =
drawBack; phase <= drawCarets; phase = static_cast<DrawPhase>(phase * 2)) {
2132 phases.push_back(phase);
2140 ypos += screenLinePaintFirst * vsDraw.
lineHeight;
2141 int yposScreen = screenLinePaintFirst * vsDraw.
lineHeight;
2143 while (visibleLine < model.pcs->LinesDisplayed() && yposScreen < rcArea.
bottom) {
2145 const Sci::Line lineDoc = model.
pcs->DocFromDisplay(visibleLine);
2148 const Sci::Line lineStartSet = model.
pcs->DisplayFromDoc(lineDoc);
2149 const int subLine =
static_cast<int>(visibleLine - lineStartSet);
2153#if defined(TIME_PAINTING)
2156 if (lineDoc != lineDocPrevious) {
2160 lineDocPrevious = lineDoc;
2162#if defined(TIME_PAINTING)
2188 DrawLine(surface, model, vsDraw, ll, lineDoc, visibleLine, xStart, rcLine, subLine, phase);
2189#if defined(TIME_PAINTING)
2200 DrawCarets(surface, model, vsDraw, ll, lineDoc, xStart, rcLine, subLine);
2213#if defined(TIME_PAINTING)
2227#if defined(TIME_PAINTING)
2228 if (durPaint < 0.00000001)
2229 durPaint = 0.00000001;
2236 if (rcBeyondEOF.
top < rcBeyondEOF.
bottom) {
2241 rcBeyondEOF.
right = rcBeyondEOF.
left + 1;
2244 for (
size_t edge = 0; edge < vsDraw.
theMultiEdge.size(); edge++) {
2248 rcBeyondEOF.
right = rcBeyondEOF.
left + 1;
2255#if defined(TIME_PAINTING)
2257 "Layout:%9.6g Paint:%9.6g Ratio:%9.6g Copy:%9.6g Total:%9.6g\n",
2258 durLayout, durPaint, durLayout / durPaint, durCopy, epWhole.
Duration());
2265 int eolInSelection = 0;
2278 if (background.
isSet) {
2292#define lineNumberPrintSpace " "
2295 unsigned int r = orig.
GetRed();
2296 unsigned int g = orig.GetGreen();
2297 unsigned int b = orig.GetBlue();
2298 const unsigned int l = (r + g + b) / 3;
2299 const unsigned int il = 0xff - l;
2305 return ColourDesired(std::min(r, 0xffu), std::min(g, 0xffu), std::min(b, 0xffu));
2318 int lineNumberIndex = -1;
2319 for (
size_t margin = 0; margin < vs.
ms.size(); margin++) {
2321 lineNumberIndex =
static_cast<int>(margin);
2323 vsPrint.
ms[margin].width = 0;
2345 for (
size_t sty = 0; sty < vsPrint.
styles.size(); sty++) {
2370 int lineNumberWidth = 0;
2371 if (lineNumberIndex >= 0) {
2374 vsPrint.
ms[lineNumberIndex].width = lineNumberWidth;
2380 if (linePrintLast < linePrintStart)
2381 linePrintLast = linePrintStart;
2383 if (linePrintLast > linePrintMax)
2384 linePrintLast = linePrintMax;
2389 if (linePrintLast < model.pdoc->LinesTotal())
2396 int ypos = pfr->
rc.
top;
2401 int visibleLine = 0;
2406 while (lineDoc <= linePrintLast && ypos < pfr->rc.bottom) {
2417 LayoutLine(model, lineDoc, surfaceMeasure, vsPrint, &ll, widthPrint);
2430 if (visibleLine == 0) {
2433 for (
int iwl = 0; iwl < ll.
lines - 1; iwl++) {
2434 if (ll.
LineStart(iwl) <= startWithinLine && ll.
LineStart(iwl + 1) >= startWithinLine) {
2440 visibleLine = -(ll.
lines - 1);
2444 if (draw && lineNumberWidth &&
2446 (visibleLine >= 0)) {
2449 rcNumber.
right = rcNumber.
left + lineNumberWidth;
2455 static_cast<XYPOSITION>(ypos + vsPrint.
maxAscent), number.c_str(),
static_cast<int>(number.length()),
2463 for (
int iwl = 0; iwl < ll.
lines; iwl++) {
2465 if (visibleLine >= 0) {
2469 DrawLine(surface, model, vsPrint, &ll, lineDoc, visibleLine, xStart, rcLine, iwl,
drawAll);
2474 if (iwl == ll.
lines - 1)
Classes for case folding.
Manages the text of the document.
Character classifications used by Document and RESearch.
Returns the Unicode general category of a character.
Encapsulates a set of characters.
Manages visibility of lines for folding and wrapping.
Visual elements added over text.
Text document that handles notifications, DBCS, styling, words and end of line.
Defines the editor state that must be visible to EditorView.
static void DrawBlockCaret(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, int subLine, int xStart, Sci::Position offset, Sci::Position posCaret, PRectangle rcCaret, ColourDesired caretColour)
static void DrawCaretLineFramed(Surface *surface, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine, int subLine)
static ColourDesired InvertedLight(ColourDesired orig) noexcept
static void DrawTextBlob(Surface *surface, const ViewStyle &vsDraw, PRectangle rcSegment, const char *s, ColourDesired textBack, ColourDesired textFore, bool fillBackground)
static void DrawEdgeLine(Surface *surface, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine, Range lineRange, int xStart)
static void DrawMarkUnderline(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, Sci::Line line, PRectangle rcLine)
static const char * ControlCharacterString(unsigned char ch) noexcept
static void DrawIndicators(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, int xStart, PRectangle rcLine, int subLine, Sci::Position lineEnd, bool under, Sci::Position hoverIndicatorPos)
static void DrawIndicator(int indicNum, Sci::Position startPos, Sci::Position endPos, Surface *surface, const ViewStyle &vsDraw, const LineLayout *ll, int xStart, PRectangle rcLine, Sci::Position secondCharacter, int subLine, Indicator::State state, int value)
static void DrawTabArrow(Surface *surface, PRectangle rcTab, int ymid, const ViewStyle &vsDraw)
static ColourDesired TextBackground(const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, ColourOptional background, int inSelection, bool inHotspot, int styleMain, Sci::Position i) noexcept
static ColourDesired SelectionBackground(const ViewStyle &vsDraw, bool main, bool primarySelection) noexcept
static void DrawTranslucentLineState(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, PRectangle rcLine, int subLine)
static void DrawFrame(Surface *surface, ColourDesired colour, int alpha, PRectangle rcFrame)
#define lineNumberPrintSpace
static constexpr bool AnnotationBoxedOrIndented(int annotationVisible) noexcept
static void SimpleAlphaRectangle(Surface *surface, PRectangle rc, ColourDesired fill, int alpha)
static void DrawWrapIndentAndMarker(Surface *surface, const ViewStyle &vsDraw, const LineLayout *ll, int xStart, PRectangle rcLine, ColourOptional background, DrawWrapMarkerFn customDrawWrapMarker, bool caretActive)
static void DrawFoldLines(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, Sci::Line line, PRectangle rcLine)
static void DrawTranslucentSelection(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, PRectangle rcLine, int subLine, Range lineRange, int xStart)
Defines the appearance of the main text area of the editor window.
Encapsulate C++ <chrono> to simplify use.
Interface between Scintilla and lexers.
Interface for loading into a Scintilla document from a background thread.
Defines the style of indicators which are text decorations such as underlining.
A rectangle with integer coordinates.
Defines a mapping between keystrokes and commands.
static Sci_Position LineStart(Sci_Position line, Accessor &styler)
Defines the look of a line marker in the margin .
Defines the appearance of the editor margin.
Data structure used to partition an interval.
Manages data associated with each line of the document.
Classes for caching layout information.
Defines global type name Position in the Sci internal namespace.
Data structure used to store sparse styles.
Interface to the edit control.
#define SC_PRINT_COLOURONWHITE
#define SC_MARK_UNDERLINE
#define SC_WRAPVISUALFLAGLOC_START_BY_TEXT
#define ANNOTATION_INDENTED
#define STYLE_FOLDDISPLAYTEXT
#define SC_FOLDDISPLAYTEXT_BOXED
#define SC_INDICFLAG_VALUEFORE
#define SC_TECHNOLOGY_DEFAULT
#define STYLE_CONTROLCHAR
#define SC_WRAPVISUALFLAG_START
#define EOLANNOTATION_BOXED
#define SC_FOLDFLAG_LINEBEFORE_EXPANDED
#define SC_FOLDFLAG_LINEAFTER_CONTRACTED
#define SC_WRAPVISUALFLAG_END
#define SC_WRAPINDENT_DEEPINDENT
#define SC_FOLDFLAG_LINEBEFORE_CONTRACTED
#define SC_MARK_BACKGROUND
#define SC_WRAPVISUALFLAGLOC_END_BY_TEXT
#define SC_PRINT_BLACKONWHITE
#define SC_INDICVALUEMASK
#define SC_PRINT_SCREENCOLOURS
#define SC_FOLDFLAG_LINEAFTER_EXPANDED
#define SC_PRINT_COLOURONWHITEDEFAULTBG
#define SC_FOLDLEVELHEADERFLAG
#define EOLANNOTATION_HIDDEN
#define STYLE_INDENTGUIDE
#define SC_WRAPINDENT_INDENT
#define SC_PRINT_INVERTLIGHT
#define SC_WRAPINDENT_FIXED
Classes maintaining the selection.
Main data structure for holding arrays that handle insertions and deletions efficiently.
Defines the font and colour style for a class of text.
Functions to handle UTF-8 and UTF-16 strings.
Define UniqueString, a unique_ptr based string type for storage in containers and an allocator for Un...
Store information on how the document is to be viewed.
Convenience class to ensure LineLayout objects are always disposed.
void Set(LineLayout *ll_) noexcept
bool More() const noexcept
constexpr unsigned char GetRed() const noexcept
Sci::Line SciLineFromPosition(Sci::Position pos) const noexcept
int GetStyleClock() const noexcept
void EnsureStyledTo(Sci::Position pos)
Sci::Position FindColumn(Sci::Line line, Sci::Position column)
Sci_Position SCI_METHOD Length() const override
Sci::Position MovePositionOutsideChar(Sci::Position pos, Sci::Position moveDir, bool checkLineEnd=true) const noexcept
int dbcsCodePage
Can also be SC_CP_UTF8 to enable UTF-8 mode.
char CharAt(Sci::Position position) const noexcept
void GetStyleRange(unsigned char *buffer, Sci::Position position, Sci::Position lengthRetrieve) const
int StyleIndexAt(Sci_Position position) const noexcept
bool IsWhiteLine(Sci::Line line) const
Sci_Position SCI_METHOD LineEnd(Sci_Position line) const override
int LenChar(Sci::Position pos) const noexcept
std::unique_ptr< IDecorationList > decorations
int AnnotationLines(Sci::Line line) const noexcept
int SCI_METHOD GetLevel(Sci_Position line) const override
int GetMark(Sci::Line line) const noexcept
StyledText AnnotationStyledText(Sci::Line line) const noexcept
int IndentSize() const noexcept
Sci::Line LinesTotal() const noexcept
void SCI_METHOD GetCharRange(char *buffer, Sci_Position position, Sci_Position lengthRetrieve) const override
Sci::Position GetLineIndentPosition(Sci::Line line) const
StyledText EOLAnnotationStyledText(Sci::Line line) const noexcept
int SCI_METHOD GetLineIndentation(Sci_Position line) override
Sci_Position SCI_METHOD LineStart(Sci_Position line) const override
virtual Sci::Line TopLineOfMain() const =0
SpecialRepresentations reprs
const char * GetFoldDisplayText(Sci::Line lineDoc) const noexcept
int xOffset
Horizontal scrolled amount in pixels.
virtual Sci::Line LinesOnScreen() const =0
Sci::Position hoverIndicatorPos
std::unique_ptr< IContractionState > pcs
virtual Range GetHotSpotRange() const noexcept=0
virtual Point GetVisibleOriginInMain() const =0
SelectionPosition posDrag
void ClearAllTabstops() noexcept
void RefreshPixMaps(Surface *surfaceWindow, WindowID wid, const ViewStyle &vsDraw)
void DrawLine(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, Sci::Line lineVisible, int xStart, PRectangle rcLine, int subLine, DrawPhase phase)
void FillLineRemainder(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, PRectangle rcArea, int subLine) const
void DrawBackground(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine, Range lineRange, Sci::Position posLineStart, int xStart, int subLine, ColourOptional background) const
void DropGraphics(bool freeObjects)
Sci::Position FormatRange(bool draw, const Sci_RangeToFormat *pfr, Surface *surface, Surface *surfaceMeasure, const EditModel &model, const ViewStyle &vs)
void PaintText(Surface *surfaceWindow, const EditModel &model, PRectangle rcArea, PRectangle rcClient, const ViewStyle &vsDraw)
void AllocateGraphics(const ViewStyle &vsDraw)
PrintParameters printParameters
std::unique_ptr< Surface > pixmapIndentGuide
void DrawAnnotation(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, int xStart, PRectangle rcLine, int subLine, DrawPhase phase)
void LinesAddedOrRemoved(Sci::Line lineOfPos, Sci::Line linesAdded)
void DrawIndentGuide(Surface *surface, Sci::Line lineVisible, int lineHeight, XYPOSITION start, PRectangle rcSegment, bool highlight)
Sci::Position StartEndDisplayLine(Surface *surface, const EditModel &model, Sci::Position pos, bool start, const ViewStyle &vs)
XYPOSITION NextTabstopPos(Sci::Line line, XYPOSITION x, XYPOSITION tabWidth) const noexcept
Point LocationFromPosition(Surface *surface, const EditModel &model, SelectionPosition pos, Sci::Line topLine, const ViewStyle &vs, PointEnd pe)
PhasesDraw
In phasesTwo mode, drawing is performed in two phases, first the background and then the foreground.
Sci::Line DisplayFromPosition(Surface *surface, const EditModel &model, Sci::Position pos, const ViewStyle &vs)
void DrawForeground(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line lineVisible, PRectangle rcLine, Range lineRange, Sci::Position posLineStart, int xStart, int subLine, ColourOptional background)
bool ClearTabstops(Sci::Line line) noexcept
bool bufferedDraw
In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to the screen.
void DrawEOL(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine, Sci::Line line, Sci::Position lineEnd, int xStart, int subLine, XYACCUMULATOR subLineStart, ColourOptional background)
LineLayout * RetrieveLineLayout(Sci::Line lineNumber, const EditModel &model)
bool SetTwoPhaseDraw(bool twoPhaseDraw) noexcept
bool AddTabstop(Sci::Line line, int x)
void LayoutLine(const EditModel &model, Sci::Line line, Surface *surface, const ViewStyle &vstyle, LineLayout *ll, int width=LineLayout::wrapWidthInfinite)
Fill in the LineLayout data for the given line.
std::unique_ptr< LineTabstops > ldTabstops
bool SetPhasesDraw(int phases) noexcept
Range RangeDisplayLine(Surface *surface, const EditModel &model, Sci::Line lineVisible, const ViewStyle &vs)
bool imeCaretBlockOverride
std::unique_ptr< Surface > pixmapLine
int GetNextTabstop(Sci::Line line, int x) const noexcept
int tabWidthMinimumPixels
void DrawFoldDisplayText(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, int xStart, PRectangle rcLine, int subLine, XYACCUMULATOR subLineStart, DrawPhase phase)
void DrawEOLAnnotationText(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, int xStart, PRectangle rcLine, int subLine, XYACCUMULATOR subLineStart, DrawPhase phase)
SelectionPosition SPositionFromLineX(Surface *surface, const EditModel &model, Sci::Line lineDoc, int x, const ViewStyle &vs)
Find the document position corresponding to an x coordinate on a particular document line.
std::unique_ptr< Surface > pixmapIndentGuideHighlight
bool additionalCaretsVisible
void DrawCarets(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line lineDoc, int xStart, PRectangle rcLine, int subLine) const
bool additionalCaretsBlink
SelectionPosition SPositionFromLocation(Surface *surface, const EditModel &model, PointDocument pt, bool canReturnInvalid, bool charPosition, bool virtualSpace, const ViewStyle &vs)
DrawTabArrowFn customDrawTabArrow
Some platforms, notably PLAT_CURSES, do not support Scintilla's native DrawTabArrow function for draw...
bool LinesOverlap() const noexcept
void DrawIndentGuidesOverEmpty(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, Sci::Line line, Sci::Line lineVisible, PRectangle rcLine, int xStart, int subLine)
DrawWrapMarkerFn customDrawWrapMarker
double Duration(bool reset=false) noexcept
Return duration as floating point seconds.
bool IsDynamic() const noexcept
int Flags() const noexcept
LineLayout * Retrieve(Sci::Line lineNumber, Sci::Line lineCaret, int maxChars, int styleClock_, Sci::Line linesOnScreen, Sci::Line linesInDoc)
void SetLevel(int level_) noexcept
int FindPositionFromX(XYPOSITION x, Range range, bool charPosition) const noexcept
int LineStart(int line) const noexcept
Range SubLineRange(int subLine, Scope scope) const noexcept
std::unique_ptr< char[]> chars
void SetBracesHighlight(Range rangeLine, const Sci::Position braces[], char bracesMatchStyle, int xHighlight, bool ignoreStyle)
enum Scintilla::LineLayout::ValidLevel validity
std::unique_ptr< XYPOSITION[]> positions
int EndLineStyle() const noexcept
std::unique_ptr< unsigned char[]> styles
bool InLine(int offset, int line) const noexcept
void SetLineStart(int line, int start)
Point PointFromPosition(int posInLine, int lineHeight, PointEnd pe) const noexcept
void RestoreBracesHighlight(Range rangeLine, const Sci::Position braces[], bool ignoreStyle)
A geometric rectangle class.
static constexpr PRectangle FromInts(int left_, int top_, int right_, int bottom_) noexcept
constexpr bool Intersects(PRectangle other) const noexcept
constexpr bool Empty() const noexcept
constexpr XYPOSITION Width() const noexcept
A point in document space.
static constexpr Point FromInts(int x_, int y_) noexcept
void MeasureWidths(Surface *surface, const ViewStyle &vstyle, unsigned int styleNumber, const char *s, unsigned int len, XYPOSITION *positions, const Document *pdoc)
void SetSize(size_t size_)
The range class represents a range of text in a document.
bool Valid() const noexcept
bool ContainsCharacter(Sci::Position pos) const noexcept
Sci::Position First() const noexcept
Sci::Position Position() const noexcept
bool IsValid() const noexcept
Sci::Position VirtualSpace() const noexcept
void SetPosition(Sci::Position position_) noexcept
void SetVirtualSpace(Sci::Position virtualSpace_) noexcept
int CharacterInSelection(Sci::Position posCharacter) const noexcept
SelectionRange & RangeMain() noexcept
int InSelectionForEOL(Sci::Position pos) const noexcept
Sci::Position VirtualSpaceFor(Sci::Position pos) const noexcept
size_t Main() const noexcept
size_t Count() const noexcept
SelectionRange & Range(size_t r) noexcept
Sci::Position MainCaret() const noexcept
const Representation * RepresentationFromCharacter(const char *charBytes, size_t len) const
A surface abstracts a place to draw.
virtual void SetClip(PRectangle rc)=0
static Surface * Allocate(int technology)
virtual void PenColour(ColourDesired fore)=0
virtual void DrawTextTransparent(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore)=0
virtual void DrawTextNoClip(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back)=0
virtual void MoveTo(int x_, int y_)=0
virtual void SetDBCSMode(int codePage)=0
virtual void LineTo(int x_, int y_)=0
virtual void DrawTextClipped(PRectangle rc, Font &font_, XYPOSITION ybase, const char *s, int len, ColourDesired fore, ColourDesired back)=0
virtual void FillRectangle(PRectangle rc, ColourDesired back)=0
virtual void FlushCachedState()=0
virtual void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill, ColourDesired outline, int alphaOutline, int flags)=0
virtual XYPOSITION WidthText(Font &font_, const char *s, int len)=0
virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0
virtual void SetUnicodeMode(bool unicodeMode_)=0
int maskDrawInText
Mask for markers that always draw in text.
ColourDesired WrapColour() const noexcept
std::vector< Style > styles
ForeBackColours hotspotColours
bool showCaretLineBackground
int annotationStyleOffset
std::vector< LineMarker > markers
int maskInLine
Mask for markers to be put into text because there is nowhere for them to go in margin.
bool DrawCaretInsideSelection(bool inOverstrike, bool imeCaretBlockOverride) const noexcept
std::vector< EdgeProperties > theMultiEdge
int GetFrameWidth() const noexcept
bool alwaysShowCaretLineBackground
int fixedColumnWidth
Total width of margins.
ColourDesired caretLineBackground
int wrapVisualFlagsLocation
int braceBadLightIndicator
bool SelectionBackgroundDrawn() const noexcept
std::vector< Indicator > indicators
ForeBackColours selColours
int leftMarginWidth
Margins are ordered: Line Numbers, Selection Margin, Spacing Margin.
bool braceBadLightIndicatorSet
void Refresh(Surface &surface, int tabInChars)
int rightMarginWidth
Spacing margin on right of text.
bool WhiteSpaceVisible(bool inIndent) const noexcept
ColourOptional Background(int marksOfLine, bool caretActive, bool lineContainsCaret) const noexcept
int eolAnnotationStyleOffset
bool IsLineFrameOpaque(bool caretActive, bool lineContainsCaret) const noexcept
bool marginInside
true: margin included in text view, false: separate views
ForeBackColours whitespaceColours
XYPOSITION controlCharWidth
CaretShape CaretShapeForMode(bool inOverstrike) const noexcept
bool braceHighlightIndicatorSet
ColourDesired selAdditionalForeground
ColourDesired caretcolour
int braceHighlightIndicator
ColourDesired additionalCaretColour
std::vector< MarginStyle > ms
bool IsCaretVisible() const noexcept
bool WhitespaceBackgroundDrawn() const noexcept
int wrapVisualStartIndent
IndentView viewIndentationGuides
int textStart
Starting x position of text within the view.
WhiteSpaceVisibility viewWhitespace
#define fill(Order, Group, Idx, Charset, Name)
unsigned long int lineNumber
Styling buffer using one element for each run rather than using a filled buffer.
static int WidthStyledText(Surface *surface, const ViewStyle &vs, int styleOffset, const char *text, const unsigned char *styles, size_t len)
T MakeUpperCase(T ch) noexcept
void DrawTextNoClipPhase(Surface *surface, PRectangle rc, const Style &style, XYPOSITION ybase, const char *s, int len, DrawPhase phase)
bool ValidStyledText(const ViewStyle &vs, size_t styleOffset, const StyledText &st) noexcept
constexpr bool UTF8IsAscii(int ch) noexcept
constexpr bool IsSpaceOrTab(int ch) noexcept
void DrawStyledText(Surface *surface, const ViewStyle &vs, int styleOffset, PRectangle rcText, const StyledText &st, size_t start, size_t length, DrawPhase phase)
void(* DrawWrapMarkerFn)(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourDesired wrapColour)
DrawPhase
The view may be drawn in separate phases.
@ drawSelectionTranslucent
constexpr bool IsUpperOrLowerCase(int ch) noexcept
int WidestLineWidth(Surface *surface, const ViewStyle &vs, int styleOffset, const StyledText &st)
void DrawWrapMarker(Surface *surface, PRectangle rcPlace, bool isEndMarker, ColourDesired wrapColour)
constexpr int LevelNumber(int level) noexcept
T MakeLowerCase(T ch) noexcept
if(!stash_group_load_from_file(group, filename)) g_warning(_("Could not load keyfile %s!")
SelectionSegment Intersect(SelectionSegment check) const noexcept
bool ContainsCharacter(Sci::Position posCharacter) const noexcept
bool Empty() const noexcept
size_t StyleAt(size_t i) const noexcept
size_t LineLength(size_t start) const noexcept
const unsigned char * styles
const Representation * representation