diff options
Diffstat (limited to 'src/Editor.cxx')
-rw-r--r-- | src/Editor.cxx | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index b0bd99e83..14906f523 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1663,7 +1663,7 @@ void Editor::LinesSplit(int pixelWidth) { unsigned int posLineStart = pdoc->LineStart(line); LayoutLine(line, surface, vs, ll, pixelWidth); for (int subLine = 1; subLine < ll->lines; subLine++) { - pdoc->InsertString(posLineStart + (subLine - 1) * strlen(eol) + + pdoc->InsertCString(posLineStart + (subLine - 1) * strlen(eol) + ll->LineStart(subLine), eol); targetEnd += static_cast<int>(strlen(eol)); } @@ -4115,7 +4115,7 @@ void Editor::Duplicate(bool forLine) { char *text = CopyRange(start, end); if (forLine) { const char *eol = StringFromEOLMode(pdoc->eolMode); - pdoc->InsertString(end, eol); + pdoc->InsertCString(end, eol); pdoc->InsertString(end + istrlen(eol), text, end - start); } else { pdoc->InsertString(end, text, end - start); @@ -4135,7 +4135,7 @@ void Editor::NewLine() { } else if (pdoc->eolMode == SC_EOL_CR) { eol = "\r"; } // else SC_EOL_LF -> "\n" already set - if (pdoc->InsertString(currentPos, eol)) { + if (pdoc->InsertCString(currentPos, eol)) { SetEmptySelection(currentPos + istrlen(eol)); while (*eol) { NotifyChar(*eol); @@ -4994,7 +4994,7 @@ void Editor::DropAt(int position, const char *value, bool moving, bool rectangul SetEmptySelection(position); } else { position = MovePositionOutsideChar(position, currentPos - position); - if (pdoc->InsertString(position, value)) { + if (pdoc->InsertCString(position, value)) { SetSelection(position + istrlen(value), position); } pdoc->EndUndoAction(); @@ -5700,6 +5700,26 @@ int Editor::WrapCount(int line) { } } +void Editor::AddStyledText(char *buffer, int appendLength) { + // The buffer consists of alternating character bytes and style bytes + size_t textLength = appendLength / 2; + char *text = new char[textLength]; + if (text) { + size_t i; + for (i=0;i<textLength;i++) { + text[i] = buffer[i*2]; + } + pdoc->InsertString(CurrentPosition(), text, textLength); + for (i=0;i<textLength;i++) { + text[i] = buffer[i*2+1]; + } + pdoc->StartStyling(CurrentPosition(), static_cast<char>(0xff)); + pdoc->SetStyles(textLength, text); + delete []text; + } + SetEmptySelection(currentPos + textLength); +} + static bool ValidMargin(unsigned long wParam) { return wParam < ViewStyle::margins; } @@ -5736,7 +5756,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { pdoc->BeginUndoAction(); pdoc->DeleteChars(0, pdoc->Length()); SetEmptySelection(0); - pdoc->InsertString(0, CharPtrFromSPtr(lParam)); + pdoc->InsertCString(0, CharPtrFromSPtr(lParam)); pdoc->EndUndoAction(); return 1; } @@ -5886,7 +5906,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { pdoc->BeginUndoAction(); ClearSelection(); char *replacement = CharPtrFromSPtr(lParam); - pdoc->InsertString(currentPos, replacement); + pdoc->InsertCString(currentPos, replacement); pdoc->EndUndoAction(); SetEmptySelection(currentPos + istrlen(replacement)); EnsureCaretVisible(); @@ -6042,13 +6062,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return 0; } - case SCI_ADDSTYLEDTEXT: { - if (lParam == 0) - return 0; - pdoc->InsertStyledString(CurrentPosition() * 2, CharPtrFromSPtr(lParam), wParam); - SetEmptySelection(currentPos + wParam / 2); - return 0; - } + case SCI_ADDSTYLEDTEXT: + if (lParam) + AddStyledText(CharPtrFromSPtr(lParam), wParam); + return 0; case SCI_INSERTTEXT: { if (lParam == 0) @@ -6058,7 +6075,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { insertPos = CurrentPosition(); int newCurrent = CurrentPosition(); char *sz = CharPtrFromSPtr(lParam); - pdoc->InsertString(insertPos, sz); + pdoc->InsertCString(insertPos, sz); if (newCurrent > insertPos) newCurrent += istrlen(sz); SetEmptySelection(newCurrent); |