diff options
Diffstat (limited to 'src/Document.cxx')
-rw-r--r-- | src/Document.cxx | 164 |
1 files changed, 157 insertions, 7 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index e5913ad98..2c9ac34a9 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -17,6 +17,7 @@ #include "Partitioning.h" #include "RunStyles.h" #include "CellBuffer.h" +#include "PerLine.h" #include "CharClassify.h" #include "Decoration.h" #include "Document.h" @@ -74,6 +75,14 @@ Document::Document() { matchesValid = false; regex = 0; + + perLineData[ldMarkers] = new LineMarkers(); + perLineData[ldLevels] = new LineLevels(); + perLineData[ldState] = new LineState(); + perLineData[ldMargin] = new LineAnnotation(); + perLineData[ldAnnotation] = new LineAnnotation(); + + cb.SetPerLine(this); } Document::~Document() { @@ -81,12 +90,30 @@ Document::~Document() { watchers[i].watcher->NotifyDeleted(this, watchers[i].userData); } delete []watchers; + for (int j=0; j<ldSize; j++) { + delete perLineData[j]; + perLineData[j] = 0; + } watchers = 0; lenWatchers = 0; delete regex; regex = 0; } +void Document::InsertLine(int line) { + for (int j=0; j<ldSize; j++) { + if (perLineData[j]) + perLineData[j]->InsertLine(line); + } +} + +void Document::RemoveLine(int line) { + for (int j=0; j<ldSize; j++) { + if (perLineData[j]) + perLineData[j]->RemoveLine(line); + } +} + // Increase reference count and return its previous value. int Document::AddRef() { return refCount++; @@ -106,8 +133,13 @@ void Document::SetSavePoint() { NotifySavePoint(true); } +int Document::GetMark(int line) { + return static_cast<LineMarkers*>(perLineData[ldMarkers])->MarkValue(line); +} + int Document::AddMark(int line, int markerNum) { - int prev = cb.AddMark(line, markerNum); + int prev = static_cast<LineMarkers*>(perLineData[ldMarkers])-> + AddMark(line, markerNum, LinesTotal()); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); return prev; @@ -117,31 +149,38 @@ void Document::AddMarkSet(int line, int valueSet) { unsigned int m = valueSet; for (int i = 0; m; i++, m >>= 1) if (m & 1) - cb.AddMark(line, i); + static_cast<LineMarkers*>(perLineData[ldMarkers])-> + AddMark(line, i, LinesTotal()); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::DeleteMark(int line, int markerNum) { - cb.DeleteMark(line, markerNum); + static_cast<LineMarkers*>(perLineData[ldMarkers])->DeleteMark(line, markerNum, false); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::DeleteMarkFromHandle(int markerHandle) { - cb.DeleteMarkFromHandle(markerHandle); + static_cast<LineMarkers*>(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle); DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); mh.line = -1; NotifyModified(mh); } void Document::DeleteAllMarks(int markerNum) { - cb.DeleteAllMarks(markerNum); + for (int line = 0; line < LinesTotal(); line++) { + static_cast<LineMarkers*>(perLineData[ldMarkers])->DeleteMark(line, markerNum, true); + } DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); mh.line = -1; NotifyModified(mh); } +int Document::LineFromHandle(int markerHandle) { + return static_cast<LineMarkers*>(perLineData[ldMarkers])->LineFromHandle(markerHandle); +} + int Document::LineStart(int line) const { return cb.LineStart(line); } @@ -181,7 +220,7 @@ int Document::VCHomePosition(int position) { } int Document::SetLevel(int line, int level) { - int prev = cb.SetLevel(line, level); + int prev = static_cast<LineLevels*>(perLineData[ldLevels])->SetLevel(line, level, LinesTotal()); if (prev != level) { DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); @@ -192,6 +231,14 @@ int Document::SetLevel(int line, int level) { return prev; } +int Document::GetLevel(int line) { + return static_cast<LineLevels*>(perLineData[ldLevels])->GetLevel(line); +} + +void Document::ClearLevels() { + static_cast<LineLevels*>(perLineData[ldLevels])->ClearLevels(); +} + static bool IsSubordinate(int levelStart, int levelTry) { if (levelTry & SC_FOLDLEVELWHITEFLAG) return true; @@ -1206,7 +1253,7 @@ void Document::EnsureStyledTo(int pos) { } int Document::SetLineState(int line, int state) { - int statePrevious = cb.SetLineState(line, state); + int statePrevious = static_cast<LineState*>(perLineData[ldState])->SetLineState(line, state); if (state != statePrevious) { DocModification mh(SC_MOD_CHANGELINESTATE, 0, 0, 0, 0, line); NotifyModified(mh); @@ -1214,6 +1261,109 @@ int Document::SetLineState(int line, int state) { return statePrevious; } +int Document::GetLineState(int line) { + return static_cast<LineState*>(perLineData[ldState])->GetLineState(line); +} + +int Document::GetMaxLineState() { + return static_cast<LineState*>(perLineData[ldState])->GetMaxLineState(); +} + +bool Document::MarginMultipleStyles(int line) { + return static_cast<LineAnnotation*>(perLineData[ldMargin])->MultipleStyles(line); +} + +const char *Document::MarginText(int line) { + return static_cast<LineAnnotation*>(perLineData[ldMargin])->Text(line); +} + +int Document::MarginStyle(int line) { + return static_cast<LineAnnotation*>(perLineData[ldMargin])->Style(line); +} + +const char *Document::MarginStyles(int line) { + return static_cast<LineAnnotation*>(perLineData[ldMargin])->Styles(line); +} + +void Document::MarginSetText(int line, const char *text) { + static_cast<LineAnnotation*>(perLineData[ldMargin])->SetText(line, text); + DocModification mh(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line); + NotifyModified(mh); +} + +void Document::MarginSetStyle(int line, int style) { + static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyle(line, style); +} + +void Document::MarginSetStyles(int line, const char *styles) { + static_cast<LineAnnotation*>(perLineData[ldMargin])->SetStyles(line, styles); +} + +int Document::MarginLength(int line) const { + return static_cast<LineAnnotation*>(perLineData[ldMargin])->Length(line); +} + +void Document::MarginClearAll() { + int maxEditorLine = LinesTotal(); + for (int l=0;l<maxEditorLine;l++) + MarginSetText(l, 0); + // Free remaining data + static_cast<LineAnnotation*>(perLineData[ldMargin])->ClearAll(); +} + +bool Document::AnnotationAny() const { + return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->AnySet(); +} + +bool Document::AnnotationMultipleStyles(int line) { + return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->MultipleStyles(line); +} + +const char *Document::AnnotationText(int line) { + return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Text(line); +} + +int Document::AnnotationStyle(int line) { + return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Style(line); +} + +const char *Document::AnnotationStyles(int line) { + return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Styles(line); +} + +void Document::AnnotationSetText(int line, const char *text) { + const int linesBefore = AnnotationLines(line); + static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetText(line, text); + const int linesAfter = AnnotationLines(line); + DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line); + mh.annotationLinesAdded = linesAfter - linesBefore; + NotifyModified(mh); +} + +void Document::AnnotationSetStyle(int line, int style) { + static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyle(line, style); +} + +void Document::AnnotationSetStyles(int line, const char *styles) { + static_cast<LineAnnotation*>(perLineData[ldAnnotation])->SetStyles(line, styles); +} + +int Document::AnnotationLength(int line) const { + return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Length(line); +} + +int Document::AnnotationLines(int line) const { + return static_cast<LineAnnotation*>(perLineData[ldAnnotation])->Lines(line); +} + +void Document::AnnotationClearAll() { + int maxEditorLine = LinesTotal(); + for (int l=0;l<maxEditorLine;l++) + AnnotationSetText(l, 0); + // Free remaining data + static_cast<LineAnnotation*>(perLineData[ldAnnotation])->ClearAll(); +} + void Document::IncrementStyleClock() { styleClock = (styleClock + 1) % 0x100000; } |