diff options
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r-- | src/Editor.cxx | 97 |
1 files changed, 59 insertions, 38 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index e852723b2..6c5ba7330 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -40,6 +40,7 @@ Editor::Editor() { printMagnification = 0; printColourMode = SC_PRINT_NORMAL; cursorMode = SC_CURSORNORMAL; + controlCharSymbol = 0; /* Draw the control characters */ hasFocus = false; hideSelection = false; @@ -87,7 +88,7 @@ Editor::Editor() { pixmapSelPattern = Surface::Allocate(); pixmapIndentGuide = Surface::Allocate(); pixmapIndentGuideHighlight = Surface::Allocate(); - + currentPos = 0; anchor = 0; @@ -284,7 +285,7 @@ int Editor::PositionFromLocation(Point pt) { surface->Init(); surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage); unsigned int posLineStart = pdoc->LineStart(line); - + LineLayout ll; LayoutLine(line, surface, vs, ll); for (int i = 0; i < ll.numCharsInLine; i++) { @@ -324,7 +325,7 @@ int Editor::PositionFromLocationClose(Point pt) { surface->Init(); surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage); unsigned int posLineStart = pdoc->LineStart(line); - + LineLayout ll; LayoutLine(line, surface, vs, ll); for (int i = 0; i < ll.numCharsInLine; i++) { @@ -350,7 +351,7 @@ int Editor::PositionFromLineX(int line, int x) { surface->Init(); surface->SetUnicodeMode(SC_CP_UTF8 == pdoc->dbcsCodePage); unsigned int posLineStart = pdoc->LineStart(line); - + LineLayout ll; LayoutLine(line, surface, vs, ll); for (int i = 0; i < ll.numCharsInLine; i++) { @@ -360,7 +361,7 @@ int Editor::PositionFromLineX(int line, int x) { return i + posLineStart; } } - + delete surface; return ll.numCharsInLine + posLineStart; } @@ -648,7 +649,7 @@ void Editor::EnsureCaretVisible(bool useMargin, bool vert, bool horiz) { // If we scroll the display, we use a minimum amount of xMargin. int offsetLeft = rcClient.left + xMargin; int offsetRight = rcClient.right - xMargin; - // If we are in XJUMPS mode, then when the margin is reached, the + // If we are in XJUMPS mode, then when the margin is reached, the // offset jumps so that it won't need to move agin for a while. if (!(caretPolicy & CARET_XJUMPS)) { rcClient.left = offsetLeft; @@ -779,10 +780,10 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { int line = cs.DocFromDisplay(visibleLine); int yposScreen = 0; - // Work out whether the top line is whitespace located after a + // Work out whether the top line is whitespace located after a // lessening of fold level which implies a 'fold tail' but which should not // be displayed until the last of a sequence of whitespace. - bool needWhiteClosure = false; + bool needWhiteClosure = false; int level = pdoc->GetLevel(line); if (level & SC_FOLDLEVELWHITEFLAG) { int lineBack = line; @@ -796,13 +797,13 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { needWhiteClosure = true; } } - + // Old code does not know about new markers needed to distinguish all cases - int folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID, + int folderOpenMid = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEROPENMID, SC_MARKNUM_FOLDEROPEN); - int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND, + int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND, SC_MARKNUM_FOLDER); - + while ((visibleLine < cs.LinesDisplayed()) && yposScreen < rcMargin.bottom) { // Decide which fold indicator should be displayed @@ -815,7 +816,7 @@ void Editor::PaintSelMargin(Surface *surfWindow, PRectangle &rc) { if (cs.GetExpanded(line)) { if (levelNum == SC_FOLDLEVELBASE) marks |= 1 << SC_MARKNUM_FOLDEROPEN; - else + else marks |= 1 << folderOpenMid; } else { if (levelNum == SC_FOLDLEVELBASE) @@ -977,10 +978,14 @@ void Editor::LayoutLine(int line, Surface *surface, ViewStyle &vstyle, LineLayou if (ll.chars[charInLine] == '\t') { ll.positions[charInLine + 1] = ((((startsegx + 2) / tabWidth) + 1) * tabWidth) - startsegx; - } else { + } else if (controlCharSymbol < 32) { const char *ctrlChar = ControlCharacterString(ll.chars[charInLine]); // +3 For a blank on front and rounded edge each side: ll.positions[charInLine + 1] = surface->WidthText(ctrlCharsFont, ctrlChar, strlen(ctrlChar)) + 3; + } else { + char cc[2] = { controlCharSymbol, '\0' }; + surface->MeasureWidths(ctrlCharsFont, cc, 1, + ll.positions + startseg + 1); } lastSegItalics = false; } else { // Regular character @@ -1129,24 +1134,32 @@ void Editor::DrawLine(Surface *surface, ViewStyle &vsDraw, int line, int lineVis } else if (IsControlCharacter(ll.chars[i])) { // Manage control character display inIndentation = false; - const char *ctrlChar = ControlCharacterString(ll.chars[i]); - surface->FillRectangle(rcSegment, textBack); - int normalCharHeight = surface->Ascent(ctrlCharsFont) - - surface->InternalLeading(ctrlCharsFont); - PRectangle rcCChar = rcSegment; - rcCChar.left = rcCChar.left + 1; - rcCChar.top = rcSegment.top + vsDraw.maxAscent - normalCharHeight; - rcCChar.bottom = rcSegment.top + vsDraw.maxAscent + 1; - PRectangle rcCentral = rcCChar; - rcCentral.top++; - rcCentral.bottom--; - surface->FillRectangle(rcCentral, textFore); - PRectangle rcChar = rcCChar; - rcChar.left++; - rcChar.right--; - surface->DrawTextClipped(rcChar, ctrlCharsFont, - rcSegment.top + vsDraw.maxAscent, ctrlChar, strlen(ctrlChar), - textBack, textFore); + if (controlCharSymbol < 32) { + // Draw the character + const char *ctrlChar = ControlCharacterString(ll.chars[i]); + surface->FillRectangle(rcSegment, textBack); + int normalCharHeight = surface->Ascent(ctrlCharsFont) - + surface->InternalLeading(ctrlCharsFont); + PRectangle rcCChar = rcSegment; + rcCChar.left = rcCChar.left + 1; + rcCChar.top = rcSegment.top + vsDraw.maxAscent - normalCharHeight; + rcCChar.bottom = rcSegment.top + vsDraw.maxAscent + 1; + PRectangle rcCentral = rcCChar; + rcCentral.top++; + rcCentral.bottom--; + surface->FillRectangle(rcCentral, textFore); + PRectangle rcChar = rcCChar; + rcChar.left++; + rcChar.right--; + surface->DrawTextClipped(rcChar, ctrlCharsFont, + rcSegment.top + vsDraw.maxAscent, ctrlChar, strlen(ctrlChar), + textBack, textFore); + } else { + char cc[2] = { controlCharSymbol, '\0' }; + surface->DrawTextNoClip(rcSegment, ctrlCharsFont, + rcSegment.top + vsDraw.maxAscent, + cc, 1, textBack, textFore); + } } else { // Manage normal display surface->DrawTextNoClip(rcSegment, textFont, @@ -1736,8 +1749,8 @@ void Editor::AddCharUTF(char *s, unsigned int len) { int byte = static_cast<unsigned char>(s[0]); if ((byte < 0xC0) || (1 == len)) { - // Handles UTF-8 characters between 0x01 and 0x7F and single byte - // characters when not in UTF-8 mode. + // Handles UTF-8 characters between 0x01 and 0x7F and single byte + // characters when not in UTF-8 mode. // Also treats \0 and naked trail bytes 0x80 to 0xBF as valid // characters representing themselves. } else { @@ -3277,7 +3290,7 @@ void Editor::Tick() { InvalidateCaret(); } } - if ((dwellDelay < SC_TIME_FOREVER) && + if ((dwellDelay < SC_TIME_FOREVER) && (ticksToDwell > 0) && (!HaveMouseCapture())) { ticksToDwell -= timer.tickSize; @@ -4110,16 +4123,16 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { dwellDelay = wParam; ticksToDwell = dwellDelay; break; - + case SCI_GETMOUSEDWELLTIME: return dwellDelay; - + case SCI_WORDSTARTPOSITION: return pdoc->ExtendWordSelect(wParam, -1); case SCI_WORDENDPOSITION: return pdoc->ExtendWordSelect(wParam, 1); - + case SCI_GETCOLUMN: return pdoc->GetColumn(wParam); @@ -4710,6 +4723,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_GETCURSOR: return cursorMode; + case SCI_SETCONTROLCHARSYMBOL: + controlCharSymbol = wParam; + break; + + case SCI_GETCONTROLCHARSYMBOL: + return controlCharSymbol; + break; + case SCI_STARTRECORD: recordingMacro = true; return 0; |