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;  }  | 
