diff options
-rw-r--r-- | doc/ScintillaHistory.html | 7 | ||||
-rw-r--r-- | src/Editor.cxx | 40 | ||||
-rw-r--r-- | src/Editor.h | 3 | ||||
-rw-r--r-- | src/ScintillaBase.cxx | 2 |
4 files changed, 35 insertions, 17 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 67388952b..6a07b5ff5 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -496,6 +496,8 @@ <td>Tse Kit Yam</td> <td>Morten Brørup</td> <td>Alexey Denisov</td> + </tr><tr> + <td>jedailey</td> </tr> </table> <p> @@ -545,6 +547,11 @@ <a href="http://sourceforge.net/p/scintilla/bugs/1849/">Bug #1849</a>. </li> <li> + When inserting spaces for virtual space and the position is in indentation and tabs are enabled + for indentation then use tabs. + <a href="http://sourceforge.net/p/scintilla/bugs/1850/">Bug #1850</a>. + </li> + <li> Fix fold expand when some child text not styled. Caused by fixes for Bug #1799. <a href="http://sourceforge.net/p/scintilla/bugs/1842/">Bug #1842</a>. diff --git a/src/Editor.cxx b/src/Editor.cxx index bcba9bdf4..f9ac97b45 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1837,15 +1837,26 @@ void Editor::ChangeSize() { } } -int Editor::InsertSpace(int position, unsigned int spaces) { - if (spaces > 0) { - std::string spaceText(spaces, ' '); - const int lengthInserted = pdoc->InsertString(position, spaceText.c_str(), spaces); - position += lengthInserted; +int Editor::RealizeVirtualSpace(int position, unsigned int virtualSpace) { + if (virtualSpace > 0) { + const int line = pdoc->LineFromPosition(position); + const int indent = pdoc->GetLineIndentPosition(line); + if (indent == position) { + return pdoc->SetLineIndentation(line, pdoc->GetLineIndentation(line) + virtualSpace); + } else { + std::string spaceText(virtualSpace, ' '); + const int lengthInserted = pdoc->InsertString(position, spaceText.c_str(), virtualSpace); + position += lengthInserted; + } } return position; } +SelectionPosition Editor::RealizeVirtualSpace(const SelectionPosition &position) { + // Return the new position with no virtual space + return SelectionPosition(RealizeVirtualSpace(position.Position(), position.VirtualSpace())); +} + void Editor::AddChar(char ch) { char s[2]; s[0] = ch; @@ -1901,7 +1912,7 @@ void Editor::AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS) { } } } - positionInsert = InsertSpace(positionInsert, currentSel->caret.VirtualSpace()); + positionInsert = RealizeVirtualSpace(positionInsert, currentSel->caret.VirtualSpace()); const int lengthInserted = pdoc->InsertString(positionInsert, s, len); if (lengthInserted > 0) { currentSel->caret.SetPosition(positionInsert + lengthInserted); @@ -1975,7 +1986,7 @@ void Editor::ClearBeforeTentativeStart() { sel.Range(r).MinimizeVirtualSpace(); } } - InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); + RealizeVirtualSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); sel.Range(r).ClearVirtualSpace(); } } @@ -1984,7 +1995,7 @@ void Editor::ClearBeforeTentativeStart() { void Editor::InsertPaste(const char *text, int len) { if (multiPasteMode == SC_MULTIPASTE_ONCE) { SelectionPosition selStart = sel.Start(); - selStart = SelectionPosition(InsertSpace(selStart.Position(), selStart.VirtualSpace())); + selStart = RealizeVirtualSpace(selStart); const int lengthInserted = pdoc->InsertString(selStart.Position(), text, len); if (lengthInserted > 0) { SetEmptySelection(selStart.Position() + lengthInserted); @@ -2004,7 +2015,7 @@ void Editor::InsertPaste(const char *text, int len) { sel.Range(r).MinimizeVirtualSpace(); } } - positionInsert = InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); + positionInsert = RealizeVirtualSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); const int lengthInserted = pdoc->InsertString(positionInsert, text, len); if (lengthInserted > 0) { sel.Range(r).caret.SetPosition(positionInsert + lengthInserted); @@ -2126,8 +2137,7 @@ void Editor::PasteRectangular(SelectionPosition pos, const char *ptr, int len) { sel.RangeMain() = SelectionRange(pos); int line = pdoc->LineFromPosition(sel.MainCaret()); UndoGroup ug(pdoc); - sel.RangeMain().caret = SelectionPosition( - InsertSpace(sel.RangeMain().caret.Position(), sel.RangeMain().caret.VirtualSpace())); + sel.RangeMain().caret = RealizeVirtualSpace(sel.RangeMain().caret); int xInsert = XFromPosition(sel.RangeMain().caret); bool prevCr = false; while ((len > 0) && IsEOLChar(ptr[len-1])) @@ -2179,9 +2189,9 @@ void Editor::Clear() { if (!RangeContainsProtected(sel.Range(r).caret.Position(), sel.Range(r).caret.Position() + 1)) { if (sel.Range(r).Start().VirtualSpace()) { if (sel.Range(r).anchor < sel.Range(r).caret) - sel.Range(r) = SelectionRange(InsertSpace(sel.Range(r).anchor.Position(), sel.Range(r).anchor.VirtualSpace())); + sel.Range(r) = SelectionRange(RealizeVirtualSpace(sel.Range(r).anchor.Position(), sel.Range(r).anchor.VirtualSpace())); else - sel.Range(r) = SelectionRange(InsertSpace(sel.Range(r).caret.Position(), sel.Range(r).caret.VirtualSpace())); + sel.Range(r) = SelectionRange(RealizeVirtualSpace(sel.Range(r).caret.Position(), sel.Range(r).caret.VirtualSpace())); } if ((sel.Count() == 1) || !pdoc->IsPositionInLineEnd(sel.Range(r).caret.Position())) { pdoc->DelChar(sel.Range(r).caret.Position()); @@ -3504,7 +3514,7 @@ int Editor::DelWordOrLine(unsigned int iMessage) { } else { // Delete to the right so first realise the virtual space. sel.Range(r) = SelectionRange( - InsertSpace(sel.Range(r).caret.Position(), sel.Range(r).caret.VirtualSpace())); + RealizeVirtualSpace(sel.Range(r).caret)); } Range rangeDelete; @@ -4208,7 +4218,7 @@ void Editor::DropAt(SelectionPosition position, const char *value, size_t length SetEmptySelection(position); } else { position = MovePositionOutsideChar(position, sel.MainCaret() - position.Position()); - position = SelectionPosition(InsertSpace(position.Position(), position.VirtualSpace())); + position = RealizeVirtualSpace(position); const int lengthInserted = pdoc->InsertString( position.Position(), convertedText.c_str(), static_cast<int>(convertedText.length())); if (lengthInserted > 0) { diff --git a/src/Editor.h b/src/Editor.h index 93a86fa39..72d4719ed 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -390,7 +390,8 @@ protected: // ScintillaBase subclass needs access to much of Editor void ChangeSize(); void FilterSelections(); - int InsertSpace(int position, unsigned int spaces); + int RealizeVirtualSpace(int position, unsigned int virtualSpace); + SelectionPosition RealizeVirtualSpace(const SelectionPosition &position); void AddChar(char ch); virtual void AddCharUTF(const char *s, unsigned int len, bool treatAsDBCS=false); void ClearBeforeTentativeStart(); diff --git a/src/ScintillaBase.cxx b/src/ScintillaBase.cxx index b6e2fb333..92605d9b3 100644 --- a/src/ScintillaBase.cxx +++ b/src/ScintillaBase.cxx @@ -218,7 +218,7 @@ void ScintillaBase::AutoCompleteInsert(Position startPos, int removeLen, const c if (!RangeContainsProtected(sel.Range(r).Start().Position(), sel.Range(r).End().Position())) { int positionInsert = sel.Range(r).Start().Position(); - positionInsert = InsertSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); + positionInsert = RealizeVirtualSpace(positionInsert, sel.Range(r).caret.VirtualSpace()); if (positionInsert - removeLen >= 0) { positionInsert -= removeLen; pdoc->DeleteChars(positionInsert, removeLen); |