diff options
Diffstat (limited to 'src/Document.cxx')
-rw-r--r-- | src/Document.cxx | 101 |
1 files changed, 58 insertions, 43 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index 22987edfb..0e315bdb9 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -120,11 +120,11 @@ Document::Document() { UTF8BytesOfLeadInitialise(); - perLineData[ldMarkers] = new LineMarkers(); - perLineData[ldLevels] = new LineLevels(); - perLineData[ldState] = new LineState(); - perLineData[ldMargin] = new LineAnnotation(); - perLineData[ldAnnotation] = new LineAnnotation(); + perLineData[ldMarkers].reset(new LineMarkers()); + perLineData[ldLevels].reset(new LineLevels()); + perLineData[ldState].reset(new LineState()); + perLineData[ldMargin].reset(new LineAnnotation()); + perLineData[ldAnnotation].reset(new LineAnnotation()); cb.SetPerLine(this); } @@ -133,19 +133,35 @@ Document::~Document() { for (const WatcherWithUserData &watcher : watchers) { watcher.watcher->NotifyDeleted(this, watcher.userData); } - for (PerLine *&pl : perLineData) { - delete pl; - pl = nullptr; - } } void Document::Init() { - for (PerLine *pl : perLineData) { + for (const std::unique_ptr<PerLine> &pl : perLineData) { if (pl) pl->Init(); } } +LineMarkers *Document::Markers() const { + return static_cast<LineMarkers *>(perLineData[ldMarkers].get()); +} + +LineLevels *Document::Levels() const { + return static_cast<LineLevels *>(perLineData[ldLevels].get()); +} + +LineState *Document::States() const { + return static_cast<LineState *>(perLineData[ldState].get()); +} + +LineAnnotation *Document::Margins() const { + return static_cast<LineAnnotation *>(perLineData[ldMargin].get()); +} + +LineAnnotation *Document::Annotations() const { + return static_cast<LineAnnotation *>(perLineData[ldAnnotation].get()); +} + int Document::LineEndTypesSupported() const { if ((SC_CP_UTF8 == dbcsCodePage) && pli) return pli->LineEndTypesSupported(); @@ -181,14 +197,14 @@ bool Document::SetLineEndTypesAllowed(int lineEndBitSet_) { } void Document::InsertLine(Sci::Line line) { - for (PerLine *pl : perLineData) { + for (const std::unique_ptr<PerLine> &pl : perLineData) { if (pl) pl->InsertLine(line); } } void Document::RemoveLine(Sci::Line line) { - for (PerLine *pl : perLineData) { + for (const std::unique_ptr<PerLine> &pl : perLineData) { if (pl) pl->RemoveLine(line); } @@ -274,18 +290,17 @@ void Document::TentativeUndo() { } } -int Document::GetMark(Sci::Line line) { - return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkValue(line); +int Document::GetMark(Sci::Line line) const { + return Markers()->MarkValue(line); } Sci::Line Document::MarkerNext(Sci::Line lineStart, int mask) const { - return static_cast<LineMarkers *>(perLineData[ldMarkers])->MarkerNext(lineStart, mask); + return Markers()->MarkerNext(lineStart, mask); } int Document::AddMark(Sci::Line line, int markerNum) { if (line >= 0 && line <= LinesTotal()) { - const int prev = static_cast<LineMarkers *>(perLineData[ldMarkers])-> - AddMark(line, markerNum, LinesTotal()); + const int prev = Markers()->AddMark(line, markerNum, LinesTotal()); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); return prev; @@ -299,22 +314,22 @@ void Document::AddMarkSet(Sci::Line line, int valueSet) { return; } unsigned int m = valueSet; - for (int i = 0; m; i++, m >>= 1) + for (int i = 0; m; i++, m >>= 1) { if (m & 1) - static_cast<LineMarkers *>(perLineData[ldMarkers])-> - AddMark(line, i, LinesTotal()); + Markers()->AddMark(line, i, LinesTotal()); + } DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::DeleteMark(Sci::Line line, int markerNum) { - static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, false); + Markers()->DeleteMark(line, markerNum, false); DocModification mh(SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::DeleteMarkFromHandle(int markerHandle) { - static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMarkFromHandle(markerHandle); + Markers()->DeleteMarkFromHandle(markerHandle); DocModification mh(SC_MOD_CHANGEMARKER, 0, 0, 0, 0); mh.line = -1; NotifyModified(mh); @@ -323,7 +338,7 @@ void Document::DeleteMarkFromHandle(int markerHandle) { void Document::DeleteAllMarks(int markerNum) { bool someChanges = false; for (Sci::Line line = 0; line < LinesTotal(); line++) { - if (static_cast<LineMarkers *>(perLineData[ldMarkers])->DeleteMark(line, markerNum, true)) + if (Markers()->DeleteMark(line, markerNum, true)) someChanges = true; } if (someChanges) { @@ -333,8 +348,8 @@ void Document::DeleteAllMarks(int markerNum) { } } -Sci::Line Document::LineFromHandle(int markerHandle) { - return static_cast<LineMarkers *>(perLineData[ldMarkers])->LineFromHandle(markerHandle); +Sci::Line Document::LineFromHandle(int markerHandle) const { + return Markers()->LineFromHandle(markerHandle); } Sci_Position SCI_METHOD Document::LineStart(Sci_Position line) const { @@ -409,7 +424,7 @@ Sci::Position Document::VCHomePosition(Sci::Position position) const { } int SCI_METHOD Document::SetLevel(Sci_Position line, int level) { - const int prev = static_cast<LineLevels *>(perLineData[ldLevels])->SetLevel(line, level, LinesTotal()); + const int prev = Levels()->SetLevel(line, level, LinesTotal()); if (prev != level) { DocModification mh(SC_MOD_CHANGEFOLD | SC_MOD_CHANGEMARKER, LineStart(line), 0, 0, 0, line); @@ -421,11 +436,11 @@ int SCI_METHOD Document::SetLevel(Sci_Position line, int level) { } int SCI_METHOD Document::GetLevel(Sci_Position line) const { - return static_cast<LineLevels *>(perLineData[ldLevels])->GetLevel(line); + return Levels()->GetLevel(line); } void Document::ClearLevels() { - static_cast<LineLevels *>(perLineData[ldLevels])->ClearLevels(); + Levels()->ClearLevels(); } static bool IsSubordinate(int levelStart, int levelTry) { @@ -2123,7 +2138,7 @@ void Document::SetLexInterface(LexInterface *pLexInterface) { } int SCI_METHOD Document::SetLineState(Sci_Position line, int state) { - const int statePrevious = static_cast<LineState *>(perLineData[ldState])->SetLineState(line, state); + const int statePrevious = States()->SetLineState(line, state); if (state != statePrevious) { DocModification mh(SC_MOD_CHANGELINESTATE, LineStart(line), 0, 0, 0, line); NotifyModified(mh); @@ -2132,11 +2147,11 @@ int SCI_METHOD Document::SetLineState(Sci_Position line, int state) { } int SCI_METHOD Document::GetLineState(Sci_Position line) const { - return static_cast<LineState *>(perLineData[ldState])->GetLineState(line); + return States()->GetLineState(line); } -Sci::Line Document::GetMaxLineState() { - return static_cast<LineState *>(perLineData[ldState])->GetMaxLineState(); +Sci::Line Document::GetMaxLineState() const { + return States()->GetMaxLineState(); } void SCI_METHOD Document::ChangeLexerState(Sci_Position start, Sci_Position end) { @@ -2145,24 +2160,24 @@ void SCI_METHOD Document::ChangeLexerState(Sci_Position start, Sci_Position end) } StyledText Document::MarginStyledText(Sci::Line line) const { - const LineAnnotation *pla = static_cast<LineAnnotation *>(perLineData[ldMargin]); + const LineAnnotation *pla = Margins(); return StyledText(pla->Length(line), pla->Text(line), pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); } void Document::MarginSetText(Sci::Line line, const char *text) { - static_cast<LineAnnotation *>(perLineData[ldMargin])->SetText(line, text); + Margins()->SetText(line, text); DocModification mh(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::MarginSetStyle(Sci::Line line, int style) { - static_cast<LineAnnotation *>(perLineData[ldMargin])->SetStyle(line, style); + Margins()->SetStyle(line, style); NotifyModified(DocModification(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line)); } void Document::MarginSetStyles(Sci::Line line, const unsigned char *styles) { - static_cast<LineAnnotation *>(perLineData[ldMargin])->SetStyles(line, styles); + Margins()->SetStyles(line, styles); NotifyModified(DocModification(SC_MOD_CHANGEMARGIN, LineStart(line), 0, 0, 0, line)); } @@ -2171,11 +2186,11 @@ void Document::MarginClearAll() { for (Sci::Line l=0; l<maxEditorLine; l++) MarginSetText(l, 0); // Free remaining data - static_cast<LineAnnotation *>(perLineData[ldMargin])->ClearAll(); + Margins()->ClearAll(); } StyledText Document::AnnotationStyledText(Sci::Line line) const { - const LineAnnotation *pla = static_cast<LineAnnotation *>(perLineData[ldAnnotation]); + const LineAnnotation *pla = Annotations(); return StyledText(pla->Length(line), pla->Text(line), pla->MultipleStyles(line), pla->Style(line), pla->Styles(line)); } @@ -2183,7 +2198,7 @@ StyledText Document::AnnotationStyledText(Sci::Line line) const { void Document::AnnotationSetText(Sci::Line line, const char *text) { if (line >= 0 && line < LinesTotal()) { const Sci::Line linesBefore = AnnotationLines(line); - static_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetText(line, text); + Annotations()->SetText(line, text); const int linesAfter = AnnotationLines(line); DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line); mh.annotationLinesAdded = linesAfter - linesBefore; @@ -2192,19 +2207,19 @@ void Document::AnnotationSetText(Sci::Line line, const char *text) { } void Document::AnnotationSetStyle(Sci::Line line, int style) { - static_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetStyle(line, style); + Annotations()->SetStyle(line, style); DocModification mh(SC_MOD_CHANGEANNOTATION, LineStart(line), 0, 0, 0, line); NotifyModified(mh); } void Document::AnnotationSetStyles(Sci::Line line, const unsigned char *styles) { if (line >= 0 && line < LinesTotal()) { - static_cast<LineAnnotation *>(perLineData[ldAnnotation])->SetStyles(line, styles); + Annotations()->SetStyles(line, styles); } } int Document::AnnotationLines(Sci::Line line) const { - return static_cast<LineAnnotation *>(perLineData[ldAnnotation])->Lines(line); + return Annotations()->Lines(line); } void Document::AnnotationClearAll() { @@ -2212,7 +2227,7 @@ void Document::AnnotationClearAll() { for (Sci::Line l=0; l<maxEditorLine; l++) AnnotationSetText(l, 0); // Free remaining data - static_cast<LineAnnotation *>(perLineData[ldAnnotation])->ClearAll(); + Annotations()->ClearAll(); } void Document::IncrementStyleClock() { |