diff options
| author | Neil <nyamatongwe@gmail.com> | 2018-03-27 13:51:21 +1100 | 
|---|---|---|
| committer | Neil <nyamatongwe@gmail.com> | 2018-03-27 13:51:21 +1100 | 
| commit | fb9f493960b075b034b18d61036d36f384f2e3f8 (patch) | |
| tree | d30067e494888c0fc76f78b7d3f7bb78c9ffc15a /src | |
| parent | ccfaed3e4d322b1aebedbe5e42f315434af94459 (diff) | |
| download | scintilla-mirror-fb9f493960b075b034b18d61036d36f384f2e3f8.tar.gz | |
Use an interface for ContractionState so that there can be different
implementations of that interface.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ContractionState.cxx | 150 | ||||
| -rw-r--r-- | src/ContractionState.h | 74 | ||||
| -rw-r--r-- | src/EditModel.cxx | 1 | ||||
| -rw-r--r-- | src/EditModel.h | 2 | ||||
| -rw-r--r-- | src/EditView.cxx | 30 | ||||
| -rw-r--r-- | src/Editor.cxx | 159 | ||||
| -rw-r--r-- | src/MarginView.cxx | 28 | 
7 files changed, 248 insertions, 196 deletions
| diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx index 52a03a0d3..a349fc23d 100644 --- a/src/ContractionState.cxx +++ b/src/ContractionState.cxx @@ -26,7 +26,69 @@  using namespace Scintilla; -ContractionState::ContractionState() : linesInDocument(1) { +namespace { + +class ContractionState final : public IContractionState { +	// These contain 1 element for every document line. +	std::unique_ptr<RunStyles<Sci::Line, char>> visible; +	std::unique_ptr<RunStyles<Sci::Line, char>> expanded; +	std::unique_ptr<RunStyles<Sci::Line, int>> heights; +	std::unique_ptr<SparseVector<UniqueString>> foldDisplayTexts; +	std::unique_ptr<Partitioning<Sci::Line>> displayLines; +	Sci::Line linesInDocument; + +	void EnsureData(); + +	bool OneToOne() const noexcept { +		// True when each document line is exactly one display line so need for +		// complex data structures. +		return visible == nullptr; +	} + +	void InsertLine(Sci::Line lineDoc); +	void DeleteLine(Sci::Line lineDoc); + +public: +	ContractionState() noexcept; +	// Deleted so ContractionState objects can not be copied. +	ContractionState(const ContractionState &) = delete; +	void operator=(const ContractionState &) = delete; +	ContractionState(ContractionState &&) = delete; +	void operator=(ContractionState &&) = delete; +	~ContractionState(); + +	void Clear() noexcept override; + +	Sci::Line LinesInDoc() const override; +	Sci::Line LinesDisplayed() const override; +	Sci::Line DisplayFromDoc(Sci::Line lineDoc) const override; +	Sci::Line DisplayLastFromDoc(Sci::Line lineDoc) const override; +	Sci::Line DocFromDisplay(Sci::Line lineDisplay) const override; + +	void InsertLines(Sci::Line lineDoc, Sci::Line lineCount) override; +	void DeleteLines(Sci::Line lineDoc, Sci::Line lineCount) override; + +	bool GetVisible(Sci::Line lineDoc) const override; +	bool SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd, bool isVisible) override; +	bool HiddenLines() const override; + +	const char *GetFoldDisplayText(Sci::Line lineDoc) const override; +	bool GetFoldDisplayTextShown(Sci::Line lineDoc) const override; +	bool SetFoldDisplayText(Sci::Line lineDoc, const char *text) override; + +	bool GetExpanded(Sci::Line lineDoc) const override; +	bool SetExpanded(Sci::Line lineDoc, bool isExpanded) override; +	Sci::Line ContractedNext(Sci::Line lineDocStart) const override; + +	int GetHeight(Sci::Line lineDoc) const override; +	bool SetHeight(Sci::Line lineDoc, int height) override; + +	void ShowAll() override; + +	void Check() const; +}; + +ContractionState::ContractionState() noexcept : linesInDocument(1) {  }  ContractionState::~ContractionState() { @@ -44,7 +106,40 @@ void ContractionState::EnsureData() {  	}  } -void ContractionState::Clear() { +void ContractionState::InsertLine(Sci::Line lineDoc) { +	if (OneToOne()) { +		linesInDocument++; +	} else { +		visible->InsertSpace(lineDoc, 1); +		visible->SetValueAt(lineDoc, 1); +		expanded->InsertSpace(lineDoc, 1); +		expanded->SetValueAt(lineDoc, 1); +		heights->InsertSpace(lineDoc, 1); +		heights->SetValueAt(lineDoc, 1); +		foldDisplayTexts->InsertSpace(lineDoc, 1); +		foldDisplayTexts->SetValueAt(lineDoc, nullptr); +		const Sci::Line lineDisplay = DisplayFromDoc(lineDoc); +		displayLines->InsertPartition(lineDoc, lineDisplay); +		displayLines->InsertText(lineDoc, 1); +	} +} + +void ContractionState::DeleteLine(Sci::Line lineDoc) { +	if (OneToOne()) { +		linesInDocument--; +	} else { +		if (GetVisible(lineDoc)) { +			displayLines->InsertText(lineDoc, -heights->ValueAt(lineDoc)); +		} +		displayLines->RemovePartition(lineDoc); +		visible->DeleteRange(lineDoc, 1); +		expanded->DeleteRange(lineDoc, 1); +		heights->DeleteRange(lineDoc, 1); +		foldDisplayTexts->DeletePosition(lineDoc); +	} +} + +void ContractionState::Clear() noexcept {  	visible.reset();  	expanded.reset();  	heights.reset(); @@ -99,24 +194,6 @@ Sci::Line ContractionState::DocFromDisplay(Sci::Line lineDisplay) const {  	}  } -void ContractionState::InsertLine(Sci::Line lineDoc) { -	if (OneToOne()) { -		linesInDocument++; -	} else { -		visible->InsertSpace(lineDoc, 1); -		visible->SetValueAt(lineDoc, 1); -		expanded->InsertSpace(lineDoc, 1); -		expanded->SetValueAt(lineDoc, 1); -		heights->InsertSpace(lineDoc, 1); -		heights->SetValueAt(lineDoc, 1); -		foldDisplayTexts->InsertSpace(lineDoc, 1); -		foldDisplayTexts->SetValueAt(lineDoc, nullptr); -		const Sci::Line lineDisplay = DisplayFromDoc(lineDoc); -		displayLines->InsertPartition(lineDoc, lineDisplay); -		displayLines->InsertText(lineDoc, 1); -	} -} -  void ContractionState::InsertLines(Sci::Line lineDoc, Sci::Line lineCount) {  	for (int l = 0; l < lineCount; l++) {  		InsertLine(lineDoc + l); @@ -124,21 +201,6 @@ void ContractionState::InsertLines(Sci::Line lineDoc, Sci::Line lineCount) {  	Check();  } -void ContractionState::DeleteLine(Sci::Line lineDoc) { -	if (OneToOne()) { -		linesInDocument--; -	} else { -		if (GetVisible(lineDoc)) { -			displayLines->InsertText(lineDoc, -heights->ValueAt(lineDoc)); -		} -		displayLines->RemovePartition(lineDoc); -		visible->DeleteRange(lineDoc, 1); -		expanded->DeleteRange(lineDoc, 1); -		heights->DeleteRange(lineDoc, 1); -		foldDisplayTexts->DeletePosition(lineDoc); -	} -} -  void ContractionState::DeleteLines(Sci::Line lineDoc, Sci::Line lineCount) {  	for (Sci::Line l = 0; l < lineCount; l++) {  		DeleteLine(lineDoc); @@ -193,6 +255,10 @@ const char *ContractionState::GetFoldDisplayText(Sci::Line lineDoc) const {  	return foldDisplayTexts->ValueAt(lineDoc).get();  } +bool ContractionState::GetFoldDisplayTextShown(Sci::Line lineDoc) const { +	return !GetExpanded(lineDoc) && GetFoldDisplayText(lineDoc); +} +  bool ContractionState::SetFoldDisplayText(Sci::Line lineDoc, const char *text) {  	EnsureData();  	const char *foldText = foldDisplayTexts->ValueAt(lineDoc).get(); @@ -231,10 +297,6 @@ bool ContractionState::SetExpanded(Sci::Line lineDoc, bool isExpanded) {  	}  } -bool ContractionState::GetFoldDisplayTextShown(Sci::Line lineDoc) const { -	return !GetExpanded(lineDoc) && GetFoldDisplayText(lineDoc); -} -  Sci::Line ContractionState::ContractedNext(Sci::Line lineDocStart) const {  	if (OneToOne()) {  		return -1; @@ -310,3 +372,13 @@ void ContractionState::Check() const {  	}  #endif  } + +} + +namespace Scintilla { + +std::unique_ptr<IContractionState> ContractionStateCreate() { +	return std::make_unique<ContractionState>(); +} + +} diff --git a/src/ContractionState.h b/src/ContractionState.h index eb141ea33..a951e0a0c 100644 --- a/src/ContractionState.h +++ b/src/ContractionState.h @@ -10,67 +10,43 @@  namespace Scintilla { -template<class T> -class SparseVector; -  /** - */ -class ContractionState { -	// These contain 1 element for every document line. -	std::unique_ptr<RunStyles<Sci::Line, char>> visible; -	std::unique_ptr<RunStyles<Sci::Line, char>> expanded; -	std::unique_ptr<RunStyles<Sci::Line, int>> heights; -	std::unique_ptr<SparseVector<UniqueString>> foldDisplayTexts; -	std::unique_ptr<Partitioning<Sci::Line>> displayLines; -	Sci::Line linesInDocument; - -	void EnsureData(); - -	bool OneToOne() const { -		// True when each document line is exactly one display line so need for -		// complex data structures. -		return visible == nullptr; -	} - +*/ +class IContractionState {  public: -	ContractionState(); -	// Deleted so ContractionState objects can not be copied. -	ContractionState(const ContractionState &) = delete; -	void operator=(const ContractionState &) = delete; -	virtual ~ContractionState(); +	virtual ~IContractionState() {}; -	void Clear(); +	virtual void Clear()=0; -	Sci::Line LinesInDoc() const; -	Sci::Line LinesDisplayed() const; -	Sci::Line DisplayFromDoc(Sci::Line lineDoc) const; -	Sci::Line DisplayLastFromDoc(Sci::Line lineDoc) const; -	Sci::Line DocFromDisplay(Sci::Line lineDisplay) const; +	virtual Sci::Line LinesInDoc() const=0; +	virtual Sci::Line LinesDisplayed() const=0; +	virtual Sci::Line DisplayFromDoc(Sci::Line lineDoc) const=0; +	virtual Sci::Line DisplayLastFromDoc(Sci::Line lineDoc) const=0; +	virtual Sci::Line DocFromDisplay(Sci::Line lineDisplay) const=0; -	void InsertLine(Sci::Line lineDoc); -	void InsertLines(Sci::Line lineDoc, Sci::Line lineCount); -	void DeleteLine(Sci::Line lineDoc); -	void DeleteLines(Sci::Line lineDoc, Sci::Line lineCount); +	virtual void InsertLines(Sci::Line lineDoc, Sci::Line lineCount)=0; +	virtual void DeleteLines(Sci::Line lineDoc, Sci::Line lineCount)=0; -	bool GetVisible(Sci::Line lineDoc) const; -	bool SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd, bool isVisible); -	bool HiddenLines() const; +	virtual bool GetVisible(Sci::Line lineDoc) const=0; +	virtual bool SetVisible(Sci::Line lineDocStart, Sci::Line lineDocEnd, bool isVisible)=0; +	virtual bool HiddenLines() const=0; -	const char *GetFoldDisplayText(Sci::Line lineDoc) const; -	bool SetFoldDisplayText(Sci::Line lineDoc, const char *text); +	virtual const char *GetFoldDisplayText(Sci::Line lineDoc) const=0; +	virtual bool GetFoldDisplayTextShown(Sci::Line lineDoc) const=0; +	virtual bool SetFoldDisplayText(Sci::Line lineDoc, const char *text)=0; -	bool GetExpanded(Sci::Line lineDoc) const; -	bool SetExpanded(Sci::Line lineDoc, bool isExpanded); -	bool GetFoldDisplayTextShown(Sci::Line lineDoc) const; -	Sci::Line ContractedNext(Sci::Line lineDocStart) const; +	virtual bool GetExpanded(Sci::Line lineDoc) const=0; +	virtual bool SetExpanded(Sci::Line lineDoc, bool isExpanded)=0; +	virtual Sci::Line ContractedNext(Sci::Line lineDocStart) const=0; -	int GetHeight(Sci::Line lineDoc) const; -	bool SetHeight(Sci::Line lineDoc, int height); +	virtual int GetHeight(Sci::Line lineDoc) const=0; +	virtual bool SetHeight(Sci::Line lineDoc, int height)=0; -	void ShowAll(); -	void Check() const; +	virtual void ShowAll()=0;  }; +std::unique_ptr<IContractionState> ContractionStateCreate(); +  }  #endif diff --git a/src/EditModel.cxx b/src/EditModel.cxx index 2f4a6a6af..7782f583e 100644 --- a/src/EditModel.cxx +++ b/src/EditModel.cxx @@ -70,6 +70,7 @@ EditModel::EditModel() {  	wrapWidth = LineLayout::wrapWidthInfinite;  	pdoc = new Document(SC_DOCUMENTOPTION_DEFAULT);  	pdoc->AddRef(); +	pcs = ContractionStateCreate();  }  EditModel::~EditModel() { diff --git a/src/EditModel.h b/src/EditModel.h index 6e4919bd5..eae18cacf 100644 --- a/src/EditModel.h +++ b/src/EditModel.h @@ -42,7 +42,7 @@ public:  	int foldFlags;  	int foldDisplayTextStyle; -	ContractionState cs; +	std::unique_ptr<IContractionState> pcs;  	// Hotspot support  	Range hotspot;  	Sci::Position hoverIndicatorPos; diff --git a/src/EditView.cxx b/src/EditView.cxx index 35d1ee777..2bafa43dd 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -600,7 +600,7 @@ Point EditView::LocationFromPosition(Surface *surface, const EditModel &model, S  		lineDoc--;  		posLineStart = static_cast<Sci::Position>(model.pdoc->LineStart(lineDoc));  	} -	const Sci::Line lineVisible = model.cs.DisplayFromDoc(lineDoc); +	const Sci::Line lineVisible = model.pcs->DisplayFromDoc(lineDoc);  	AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model));  	if (surface && ll) {  		LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); @@ -618,12 +618,12 @@ Range EditView::RangeDisplayLine(Surface *surface, const EditModel &model, Sci::  	if (lineVisible < 0) {  		return rangeSubLine;  	} -	const Sci::Line lineDoc = model.cs.DocFromDisplay(lineVisible); +	const Sci::Line lineDoc = model.pcs->DocFromDisplay(lineVisible);  	const Sci::Position positionLineStart = static_cast<Sci::Position>(model.pdoc->LineStart(lineDoc));  	AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model));  	if (surface && ll) {  		LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); -		const Sci::Line lineStartSet = model.cs.DisplayFromDoc(lineDoc); +		const Sci::Line lineStartSet = model.pcs->DisplayFromDoc(lineDoc);  		const int subLine = static_cast<int>(lineVisible - lineStartSet);  		if (subLine < ll->lines) {  			rangeSubLine = ll->SubLineRange(subLine); @@ -643,7 +643,7 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo  	Sci::Line visibleLine = static_cast<int>(floor(pt.y / vs.lineHeight));  	if (!canReturnInvalid && (visibleLine < 0))  		visibleLine = 0; -	const Sci::Line lineDoc = model.cs.DocFromDisplay(visibleLine); +	const Sci::Line lineDoc = model.pcs->DocFromDisplay(visibleLine);  	if (canReturnInvalid && (lineDoc < 0))  		return SelectionPosition(INVALID_POSITION);  	if (lineDoc >= model.pdoc->LinesTotal()) @@ -653,7 +653,7 @@ SelectionPosition EditView::SPositionFromLocation(Surface *surface, const EditMo  	AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model));  	if (surface && ll) {  		LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); -		const Sci::Line lineStartSet = model.cs.DisplayFromDoc(lineDoc); +		const Sci::Line lineStartSet = model.pcs->DisplayFromDoc(lineDoc);  		const int subLine = static_cast<int>(visibleLine - lineStartSet);  		if (subLine < ll->lines) {  			const Range rangeSubLine = ll->SubLineRange(subLine); @@ -710,7 +710,7 @@ SelectionPosition EditView::SPositionFromLineX(Surface *surface, const EditModel  Sci::Line EditView::DisplayFromPosition(Surface *surface, const EditModel &model, Sci::Position pos, const ViewStyle &vs) {  	const Sci::Line lineDoc = static_cast<Sci::Line>(model.pdoc->LineFromPosition(pos)); -	Sci::Line lineDisplay = model.cs.DisplayFromDoc(lineDoc); +	Sci::Line lineDisplay = model.pcs->DisplayFromDoc(lineDoc);  	AutoLineLayout ll(llc, RetrieveLineLayout(lineDoc, model));  	if (surface && ll) {  		LayoutLine(model, lineDoc, surface, vs, ll, model.wrapWidth); @@ -976,7 +976,7 @@ void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle  		rcSegment.left = rcLine.left;  	rcSegment.right = rcLine.right; -	const bool fillRemainder = !lastSubLine || model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN || !model.cs.GetFoldDisplayTextShown(line); +	const bool fillRemainder = !lastSubLine || model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN || !model.pcs->GetFoldDisplayTextShown(line);  	if (fillRemainder) {  		// Fill the remainder of the line  		FillLineRemainder(surface, model, vsDraw, ll, line, rcSegment, subLine); @@ -1096,11 +1096,11 @@ void EditView::DrawFoldDisplayText(Surface *surface, const EditModel &model, con  	if (!lastSubLine)  		return; -	if ((model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN) || !model.cs.GetFoldDisplayTextShown(line)) +	if ((model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN) || !model.pcs->GetFoldDisplayTextShown(line))  		return;  	PRectangle rcSegment = rcLine; -	const char *foldDisplayText = model.cs.GetFoldDisplayText(line); +	const char *foldDisplayText = model.pcs->GetFoldDisplayText(line);  	const int lengthFoldDisplayText = static_cast<int>(strlen(foldDisplayText));  	FontAlias fontText = vsDraw.styles[STYLE_FOLDDISPLAYTEXT].font;  	const int widthFoldDisplayText = static_cast<int>(surface->WidthText(fontText, foldDisplayText, lengthFoldDisplayText)); @@ -1941,7 +1941,7 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  }  static void DrawFoldLines(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, Sci::Line line, PRectangle rcLine) { -	const bool expanded = model.cs.GetExpanded(line); +	const bool expanded = model.pcs->GetExpanded(line);  	const int level = model.pdoc->GetLevel(line);  	const int levelNext = model.pdoc->GetLevel(line + 1);  	if ((level & SC_FOLDLEVELHEADERFLAG) && @@ -2033,12 +2033,12 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan  				ypos += screenLinePaintFirst * vsDraw.lineHeight;  			int yposScreen = screenLinePaintFirst * vsDraw.lineHeight;  			Sci::Line visibleLine = model.TopLineOfMain() + screenLinePaintFirst; -			while (visibleLine < model.cs.LinesDisplayed() && yposScreen < rcArea.bottom) { +			while (visibleLine < model.pcs->LinesDisplayed() && yposScreen < rcArea.bottom) { -				const Sci::Line lineDoc = model.cs.DocFromDisplay(visibleLine); +				const Sci::Line lineDoc = model.pcs->DocFromDisplay(visibleLine);  				// Only visible lines should be handled by the code within the loop -				PLATFORM_ASSERT(model.cs.GetVisible(lineDoc)); -				const Sci::Line lineStartSet = model.cs.DisplayFromDoc(lineDoc); +				PLATFORM_ASSERT(model.pcs->GetVisible(lineDoc)); +				const Sci::Line lineStartSet = model.pcs->DisplayFromDoc(lineDoc);  				const int subLine = static_cast<int>(visibleLine - lineStartSet);  				// Copy this line and its styles from the document into local arrays @@ -2118,7 +2118,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan  		PRectangle rcBeyondEOF = (vsDraw.marginInside) ? rcClient : rcArea;  		rcBeyondEOF.left = static_cast<XYPOSITION>(vsDraw.textStart);  		rcBeyondEOF.right = rcBeyondEOF.right - ((vsDraw.marginInside) ? vsDraw.rightMarginWidth : 0); -		rcBeyondEOF.top = static_cast<XYPOSITION>((model.cs.LinesDisplayed() - model.TopLineOfMain()) * vsDraw.lineHeight); +		rcBeyondEOF.top = static_cast<XYPOSITION>((model.pcs->LinesDisplayed() - model.TopLineOfMain()) * vsDraw.lineHeight);  		if (rcBeyondEOF.top < rcBeyondEOF.bottom) {  			surfaceWindow->FillRectangle(rcBeyondEOF, vsDraw.styles[STYLE_DEFAULT].back);  			if (vsDraw.edgeState == EDGE_LINE) { diff --git a/src/Editor.cxx b/src/Editor.cxx index 277a53c19..d00d2cb98 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -338,7 +338,7 @@ Sci::Line Editor::LinesToScroll() const {  Sci::Line Editor::MaxScrollPos() const {  	//Platform::DebugPrintf("Lines %d screen = %d maxScroll = %d\n",  	//LinesTotal(), LinesOnScreen(), LinesTotal() - LinesOnScreen() + 1); -	Sci::Line retVal = cs.LinesDisplayed(); +	Sci::Line retVal = pcs->LinesDisplayed();  	if (endAtLastLine) {  		retVal -= LinesOnScreen();  	} else { @@ -427,7 +427,7 @@ Sci::Position Editor::PositionFromLineX(Sci::Line lineDoc, int x) {  }  Sci::Line Editor::LineFromLocation(Point pt) const { -	return cs.DocFromDisplay(static_cast<int>(pt.y) / vs.lineHeight + topLine); +	return pcs->DocFromDisplay(static_cast<int>(pt.y) / vs.lineHeight + topLine);  }  void Editor::SetTopLine(Sci::Line topLineNew) { @@ -435,7 +435,7 @@ void Editor::SetTopLine(Sci::Line topLineNew) {  		topLine = topLineNew;  		ContainerNeedsUpdate(SC_UPDATE_V_SCROLL);  	} -	posTopLine = static_cast<Sci::Position>(pdoc->LineStart(cs.DocFromDisplay(topLine))); +	posTopLine = static_cast<Sci::Position>(pdoc->LineStart(pcs->DocFromDisplay(topLine)));  }  /** @@ -527,9 +527,9 @@ void Editor::RedrawSelMargin(Sci::Line line, bool allAfter) {  }  PRectangle Editor::RectangleFromRange(Range r, int overlap) { -	const Sci::Line minLine = cs.DisplayFromDoc( +	const Sci::Line minLine = pcs->DisplayFromDoc(  		static_cast<Sci::Line>(pdoc->LineFromPosition(r.First()))); -	const Sci::Line maxLine = cs.DisplayLastFromDoc( +	const Sci::Line maxLine = pcs->DisplayLastFromDoc(  		static_cast<Sci::Line>(pdoc->LineFromPosition(r.Last())));  	const PRectangle rcClientDrawing = GetClientDrawingRectangle();  	PRectangle rc; @@ -900,19 +900,19 @@ SelectionPosition Editor::MovePositionSoVisible(SelectionPosition pos, int moveD  	pos = ClampPositionIntoDocument(pos);  	pos = MovePositionOutsideChar(pos, moveDir);  	const Sci::Line lineDoc = static_cast<Sci::Line>(pdoc->LineFromPosition(pos.Position())); -	if (cs.GetVisible(lineDoc)) { +	if (pcs->GetVisible(lineDoc)) {  		return pos;  	} else { -		Sci::Line lineDisplay = cs.DisplayFromDoc(lineDoc); +		Sci::Line lineDisplay = pcs->DisplayFromDoc(lineDoc);  		if (moveDir > 0) {  			// lineDisplay is already line before fold as lines in fold use display line of line after fold -			lineDisplay = std::clamp(lineDisplay, static_cast<Sci::Line>(0), cs.LinesDisplayed()); +			lineDisplay = std::clamp(lineDisplay, static_cast<Sci::Line>(0), pcs->LinesDisplayed());  			return SelectionPosition(static_cast<Sci::Position>( -				pdoc->LineStart(cs.DocFromDisplay(lineDisplay)))); +				pdoc->LineStart(pcs->DocFromDisplay(lineDisplay))));  		} else { -			lineDisplay = std::clamp(lineDisplay - 1, static_cast<Sci::Line>(0), cs.LinesDisplayed()); +			lineDisplay = std::clamp(lineDisplay - 1, static_cast<Sci::Line>(0), pcs->LinesDisplayed());  			return SelectionPosition(static_cast<Sci::Position>( -				pdoc->LineEnd(cs.DocFromDisplay(lineDisplay)))); +				pdoc->LineEnd(pcs->DocFromDisplay(lineDisplay))));  		}  	}  } @@ -984,7 +984,7 @@ void Editor::HorizontalScrollTo(int xPos) {  void Editor::VerticalCentreCaret() {  	const Sci::Line lineDoc = static_cast<Sci::Line>(  		pdoc->LineFromPosition(sel.IsRectangular() ? sel.Rectangular().caret.Position() : sel.MainCaret())); -	const Sci::Line lineDisplay = cs.DisplayFromDoc(lineDoc); +	const Sci::Line lineDisplay = pcs->DisplayFromDoc(lineDoc);  	const Sci::Line newTop = lineDisplay - (LinesOnScreen() / 2);  	if (topLine != newTop) {  		SetTopLine(newTop > 0 ? newTop : 0); @@ -1481,7 +1481,7 @@ bool Editor::WrapOneLine(Surface *surface, Sci::Line lineToWrap) {  		view.LayoutLine(*this, lineToWrap, surface, vs, ll, wrapWidth);  		linesWrapped = ll->lines;  	} -	return cs.SetHeight(lineToWrap, linesWrapped + +	return pcs->SetHeight(lineToWrap, linesWrapped +  		(vs.annotationVisible ? pdoc->AnnotationLines(lineToWrap) : 0));  } @@ -1497,7 +1497,7 @@ bool Editor::WrapLines(WrapScope ws) {  		if (wrapWidth != LineLayout::wrapWidthInfinite) {  			wrapWidth = LineLayout::wrapWidthInfinite;  			for (Sci::Line lineDoc = 0; lineDoc < pdoc->LinesTotal(); lineDoc++) { -				cs.SetHeight(lineDoc, 1 + +				pcs->SetHeight(lineDoc, 1 +  					(vs.annotationVisible ? pdoc->AnnotationLines(lineDoc) : 0));  			}  			wrapOccurred = true; @@ -1513,8 +1513,8 @@ bool Editor::WrapLines(WrapScope ws) {  		// Decide where to start wrapping  		Sci::Line lineToWrap = wrapPending.start;  		Sci::Line lineToWrapEnd = std::min(wrapPending.end, pdoc->LinesTotal()); -		const Sci::Line lineDocTop = cs.DocFromDisplay(topLine); -		const int subLineTop = static_cast<int>(topLine - cs.DisplayFromDoc(lineDocTop)); +		const Sci::Line lineDocTop = pcs->DocFromDisplay(topLine); +		const int subLineTop = static_cast<int>(topLine - pcs->DisplayFromDoc(lineDocTop));  		if (ws == WrapScope::wsVisible) {  			lineToWrap = std::clamp(lineDocTop-5, wrapPending.start, pdoc->LinesTotal());  			// Priority wrap to just after visible area. @@ -1522,8 +1522,8 @@ bool Editor::WrapLines(WrapScope ws) {  			// as taking only one display line.  			lineToWrapEnd = lineDocTop;  			Sci::Line lines = LinesOnScreen() + 1; -			while ((lineToWrapEnd < cs.LinesInDoc()) && (lines>0)) { -				if (cs.GetVisible(lineToWrapEnd)) +			while ((lineToWrapEnd < pcs->LinesInDoc()) && (lines>0)) { +				if (pcs->GetVisible(lineToWrapEnd))  					lines--;  				lineToWrapEnd++;  			} @@ -1560,7 +1560,7 @@ bool Editor::WrapLines(WrapScope ws) {  					lineToWrap++;  				} -				goodTopLine = cs.DisplayFromDoc(lineDocTop) + std::min(subLineTop, cs.GetHeight(lineDocTop)-1); +				goodTopLine = pcs->DisplayFromDoc(lineDocTop) + std::min(subLineTop, pcs->GetHeight(lineDocTop)-1);  			}  		} @@ -1764,7 +1764,7 @@ void Editor::Paint(Surface *surfaceWindow, PRectangle rcArea) {  			if (paintAbandonedByStyling) {  				// Styling has spilled over a line end, such as occurs by starting a multiline  				// comment. The width of subsequent text may have changed, so rewrap. -				NeedWrapping(cs.DocFromDisplay(topLine)); +				NeedWrapping(pcs->DocFromDisplay(topLine));  			}  		}  		return; @@ -2094,7 +2094,7 @@ void Editor::ClearAll() {  			pdoc->DeleteChars(0, static_cast<Sci::Position>(pdoc->Length()));  		}  		if (!pdoc->IsReadOnly()) { -			cs.Clear(); +			pcs->Clear();  			pdoc->AnnotationClearAll();  			pdoc->MarginClearAll();  		} @@ -2112,7 +2112,7 @@ void Editor::ClearDocumentStyle() {  	pdoc->decorations.DeleteLexerDecorations();  	pdoc->StartStyling(0);  	pdoc->SetStyleFor(pdoc->Length(), 0); -	cs.ShowAll(); +	pcs->ShowAll();  	SetAnnotationHeights(0, pdoc->LinesTotal());  	pdoc->ClearLevels();  } @@ -2582,7 +2582,7 @@ void Editor::NotifyModified(Document *, DocModification mh, void *) {  			braces[0] = MovePositionForDeletion(braces[0], mh.position, mh.length);  			braces[1] = MovePositionForDeletion(braces[1], mh.position, mh.length);  		} -		if ((mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) && cs.HiddenLines()) { +		if ((mh.modificationType & (SC_MOD_BEFOREINSERT | SC_MOD_BEFOREDELETE)) && pcs->HiddenLines()) {  			// Some lines are hidden so may need shown.  			const Sci::Line lineOfPos = static_cast<Sci::Line>(pdoc->LineFromPosition(mh.position));  			Sci::Position endNeedShown = mh.position; @@ -2610,16 +2610,16 @@ void Editor::NotifyModified(Document *, DocModification mh, void *) {  			if (mh.position > pdoc->LineStart(lineOfPos))  				lineOfPos++;	// Affecting subsequent lines  			if (mh.linesAdded > 0) { -				cs.InsertLines(lineOfPos, mh.linesAdded); +				pcs->InsertLines(lineOfPos, mh.linesAdded);  			} else { -				cs.DeleteLines(lineOfPos, -mh.linesAdded); +				pcs->DeleteLines(lineOfPos, -mh.linesAdded);  			}  			view.LinesAddedOrRemoved(lineOfPos, mh.linesAdded);  		}  		if (mh.modificationType & SC_MOD_CHANGEANNOTATION) {  			const Sci::Line lineDoc = static_cast<Sci::Line>(pdoc->LineFromPosition(mh.position));  			if (vs.annotationVisible) { -				if (cs.SetHeight(lineDoc, static_cast<int>(cs.GetHeight(lineDoc) + mh.annotationLinesAdded))) { +				if (pcs->SetHeight(lineDoc, static_cast<int>(pcs->GetHeight(lineDoc) + mh.annotationLinesAdded))) {  					SetScrollBars();  				}  				Redraw(); @@ -3087,11 +3087,11 @@ SelectionPosition Editor::PositionUpOrDown(SelectionPosition spStart, int direct  		const int subLine = static_cast<int>(pt.y - ptStartLine.y) / vs.lineHeight;  		if (direction < 0 && subLine == 0) { -			const Sci::Line lineDisplay = cs.DisplayFromDoc(lineDoc); +			const Sci::Line lineDisplay = pcs->DisplayFromDoc(lineDoc);  			if (lineDisplay > 0) { -				skipLines = pdoc->AnnotationLines(cs.DocFromDisplay(lineDisplay - 1)); +				skipLines = pdoc->AnnotationLines(pcs->DocFromDisplay(lineDisplay - 1));  			} -		} else if (direction > 0 && subLine >= (cs.GetHeight(lineDoc) - 1 - pdoc->AnnotationLines(lineDoc))) { +		} else if (direction > 0 && subLine >= (pcs->GetHeight(lineDoc) - 1 - pdoc->AnnotationLines(lineDoc))) {  			skipLines = pdoc->AnnotationLines(lineDoc);  		}  	} @@ -3180,14 +3180,14 @@ void Editor::ParaUpOrDown(int direction, Selection::selTypes selt) {  		MovePositionTo(SelectionPosition(direction > 0 ? pdoc->ParaDown(sel.MainCaret()) : pdoc->ParaUp(sel.MainCaret())), selt);  		lineDoc = static_cast<Sci::Line>(pdoc->LineFromPosition(sel.MainCaret()));  		if (direction > 0) { -			if (sel.MainCaret() >= pdoc->Length() && !cs.GetVisible(lineDoc)) { +			if (sel.MainCaret() >= pdoc->Length() && !pcs->GetVisible(lineDoc)) {  				if (selt == Selection::noSel) {  					MovePositionTo(SelectionPosition(pdoc->LineEndPosition(savedPos)));  				}  				break;  			}  		} -	} while (!cs.GetVisible(lineDoc)); +	} while (!pcs->GetVisible(lineDoc));  }  Range Editor::RangeDisplayLine(Sci::Line lineVisible) { @@ -5021,8 +5021,8 @@ Sci::Position Editor::PositionAfterArea(PRectangle rcArea) const {  	// This often means that the line after a modification is restyled which helps  	// detect multiline comment additions and heals single line comments  	const Sci::Line lineAfter = TopLineOfMain() + static_cast<Sci::Line>(rcArea.bottom - 1) / vs.lineHeight + 1; -	if (lineAfter < cs.LinesDisplayed()) -		return static_cast<Sci::Position>(pdoc->LineStart(cs.DocFromDisplay(lineAfter) + 1)); +	if (lineAfter < pcs->LinesDisplayed()) +		return static_cast<Sci::Position>(pdoc->LineStart(pcs->DocFromDisplay(lineAfter) + 1));  	else  		return static_cast<Sci::Position>(pdoc->Length());  } @@ -5192,7 +5192,7 @@ void Editor::SetAnnotationHeights(Sci::Line start, Sci::Line end) {  					linesWrapped = ll->lines;  				}  			} -			if (cs.SetHeight(line, pdoc->AnnotationLines(line) + linesWrapped)) +			if (pcs->SetHeight(line, pdoc->AnnotationLines(line) + linesWrapped))  				changedHeight = true;  		}  		if (changedHeight) { @@ -5211,6 +5211,7 @@ void Editor::SetDocPointer(Document *document) {  		pdoc = document;  	}  	pdoc->AddRef(); +	pcs = ContractionStateCreate();  	// Ensure all positions within document  	sel.Clear(); @@ -5225,8 +5226,8 @@ void Editor::SetDocPointer(Document *document) {  	SetRepresentations();  	// Reset the contraction state to fully shown. -	cs.Clear(); -	cs.InsertLines(0, pdoc->LinesTotal() - 1); +	pcs->Clear(); +	pcs->InsertLines(0, pdoc->LinesTotal() - 1);  	SetAnnotationHeights(0, pdoc->LinesTotal());  	view.llc.Deallocate();  	NeedWrapping(); @@ -5250,7 +5251,7 @@ void Editor::SetAnnotationVisible(int visible) {  			for (Sci::Line line=0; line<pdoc->LinesTotal(); line++) {  				const int annotationLines = pdoc->AnnotationLines(line);  				if (annotationLines > 0) { -					cs.SetHeight(line, cs.GetHeight(line) + annotationLines * dir); +					pcs->SetHeight(line, pcs->GetHeight(line) + annotationLines * dir);  				}  			}  			SetScrollBars(); @@ -5266,10 +5267,10 @@ Sci::Line Editor::ExpandLine(Sci::Line line) {  	const Sci::Line lineMaxSubord = pdoc->GetLastChild(line);  	line++;  	while (line <= lineMaxSubord) { -		cs.SetVisible(line, line, true); +		pcs->SetVisible(line, line, true);  		const int level = pdoc->GetLevel(line);  		if (level & SC_FOLDLEVELHEADERFLAG) { -			if (cs.GetExpanded(line)) { +			if (pcs->GetExpanded(line)) {  				line = ExpandLine(line);  			} else {  				line = pdoc->GetLastChild(line); @@ -5281,7 +5282,7 @@ Sci::Line Editor::ExpandLine(Sci::Line line) {  }  void Editor::SetFoldExpanded(Sci::Line lineDoc, bool expanded) { -	if (cs.SetExpanded(lineDoc, expanded)) { +	if (pcs->SetExpanded(lineDoc, expanded)) {  		RedrawSelMargin();  	}  } @@ -5294,14 +5295,14 @@ void Editor::FoldLine(Sci::Line line, int action) {  				if (line < 0)  					return;  			} -			action = (cs.GetExpanded(line)) ? SC_FOLDACTION_CONTRACT : SC_FOLDACTION_EXPAND; +			action = (pcs->GetExpanded(line)) ? SC_FOLDACTION_CONTRACT : SC_FOLDACTION_EXPAND;  		}  		if (action == SC_FOLDACTION_CONTRACT) {  			const Sci::Line lineMaxSubord = pdoc->GetLastChild(line);  			if (lineMaxSubord > line) { -				cs.SetExpanded(line, false); -				cs.SetVisible(line + 1, lineMaxSubord, false); +				pcs->SetExpanded(line, false); +				pcs->SetVisible(line + 1, lineMaxSubord, false);  				const Sci::Line lineCurrent = static_cast<Sci::Line>(  					pdoc->LineFromPosition(sel.MainCaret())); @@ -5312,11 +5313,11 @@ void Editor::FoldLine(Sci::Line line, int action) {  			}  		} else { -			if (!(cs.GetVisible(line))) { +			if (!(pcs->GetVisible(line))) {  				EnsureLineVisible(line, false);  				GoToLine(line);  			} -			cs.SetExpanded(line, true); +			pcs->SetExpanded(line, true);  			ExpandLine(line);  		} @@ -5328,18 +5329,18 @@ void Editor::FoldLine(Sci::Line line, int action) {  void Editor::FoldExpand(Sci::Line line, int action, int level) {  	bool expanding = action == SC_FOLDACTION_EXPAND;  	if (action == SC_FOLDACTION_TOGGLE) { -		expanding = !cs.GetExpanded(line); +		expanding = !pcs->GetExpanded(line);  	}  	// Ensure child lines lexed and fold information extracted before  	// flipping the state.  	pdoc->GetLastChild(line, LevelNumber(level));  	SetFoldExpanded(line, expanding); -	if (expanding && (cs.HiddenLines() == 0)) +	if (expanding && (pcs->HiddenLines() == 0))  		// Nothing to do  		return;  	const Sci::Line lineMaxSubord = pdoc->GetLastChild(line, LevelNumber(level));  	line++; -	cs.SetVisible(line, lineMaxSubord, expanding); +	pcs->SetVisible(line, lineMaxSubord, expanding);  	while (line <= lineMaxSubord) {  		const int levelLine = pdoc->GetLevel(line);  		if (levelLine & SC_FOLDLEVELHEADERFLAG) { @@ -5353,9 +5354,9 @@ void Editor::FoldExpand(Sci::Line line, int action, int level) {  Sci::Line Editor::ContractedFoldNext(Sci::Line lineStart) const {  	for (Sci::Line line = lineStart; line<pdoc->LinesTotal();) { -		if (!cs.GetExpanded(line) && (pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG)) +		if (!pcs->GetExpanded(line) && (pdoc->GetLevel(line) & SC_FOLDLEVELHEADERFLAG))  			return line; -		line = cs.ContractedNext(line+1); +		line = pcs->ContractedNext(line+1);  		if (line < 0)  			return -1;  	} @@ -5376,7 +5377,7 @@ void Editor::EnsureLineVisible(Sci::Line lineDoc, bool enforcePolicy) {  		}  	} -	if (!cs.GetVisible(lineDoc)) { +	if (!pcs->GetVisible(lineDoc)) {  		// Back up to find a non-blank line  		Sci::Line lookLine = lineDoc;  		int lookLineLevel = pdoc->GetLevel(lookLine); @@ -5391,8 +5392,8 @@ void Editor::EnsureLineVisible(Sci::Line lineDoc, bool enforcePolicy) {  		if (lineParent >= 0) {  			if (lineDoc != lineParent)  				EnsureLineVisible(lineParent, enforcePolicy); -			if (!cs.GetExpanded(lineParent)) { -				cs.SetExpanded(lineParent, true); +			if (!pcs->GetExpanded(lineParent)) { +				pcs->SetExpanded(lineParent, true);  				ExpandLine(lineParent);  			}  		} @@ -5400,7 +5401,7 @@ void Editor::EnsureLineVisible(Sci::Line lineDoc, bool enforcePolicy) {  		Redraw();  	}  	if (enforcePolicy) { -		const Sci::Line lineDisplay = cs.DisplayFromDoc(lineDoc); +		const Sci::Line lineDisplay = pcs->DisplayFromDoc(lineDoc);  		if (visiblePolicy & VISIBLE_SLOP) {  			if ((topLine > lineDisplay) || ((visiblePolicy & VISIBLE_STRICT) && (topLine + visibleSlop > lineDisplay))) {  				SetTopLine(std::clamp(lineDisplay - visibleSlop, static_cast<Sci::Line>(0), MaxScrollPos())); @@ -5430,13 +5431,13 @@ void Editor::FoldAll(int action) {  		// Discover current state  		for (int lineSeek = 0; lineSeek < maxLine; lineSeek++) {  			if (pdoc->GetLevel(lineSeek) & SC_FOLDLEVELHEADERFLAG) { -				expanding = !cs.GetExpanded(lineSeek); +				expanding = !pcs->GetExpanded(lineSeek);  				break;  			}  		}  	}  	if (expanding) { -		cs.SetVisible(0, maxLine-1, true); +		pcs->SetVisible(0, maxLine-1, true);  		for (int line = 0; line < maxLine; line++) {  			const int levelLine = pdoc->GetLevel(line);  			if (levelLine & SC_FOLDLEVELHEADERFLAG) { @@ -5451,7 +5452,7 @@ void Editor::FoldAll(int action) {  				SetFoldExpanded(line, false);  				const Sci::Line lineMaxSubord = pdoc->GetLastChild(line, -1);  				if (lineMaxSubord > line) { -					cs.SetVisible(line + 1, lineMaxSubord, false); +					pcs->SetVisible(line + 1, lineMaxSubord, false);  				}  			}  		} @@ -5464,7 +5465,7 @@ void Editor::FoldChanged(Sci::Line line, int levelNow, int levelPrev) {  	if (levelNow & SC_FOLDLEVELHEADERFLAG) {  		if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) {  			// Adding a fold point. -			if (cs.SetExpanded(line, true)) { +			if (pcs->SetExpanded(line, true)) {  				RedrawSelMargin();  			}  			FoldExpand(line, SC_FOLDACTION_EXPAND, levelPrev); @@ -5474,13 +5475,13 @@ void Editor::FoldChanged(Sci::Line line, int levelNow, int levelPrev) {  		const int prevLineLevel = pdoc->GetLevel(prevLine);  		// Combining two blocks where the first block is collapsed (e.g. by deleting the line(s) which separate(s) the two blocks) -		if ((LevelNumber(prevLineLevel) == LevelNumber(levelNow)) && !cs.GetVisible(prevLine)) +		if ((LevelNumber(prevLineLevel) == LevelNumber(levelNow)) && !pcs->GetVisible(prevLine))  			FoldLine(pdoc->GetFoldParent(prevLine), SC_FOLDACTION_EXPAND); -		if (!cs.GetExpanded(line)) { +		if (!pcs->GetExpanded(line)) {  			// Removing the fold from one that has been contracted so should expand  			// otherwise lines are left invisible with no way to make them visible -			if (cs.SetExpanded(line, true)) { +			if (pcs->SetExpanded(line, true)) {  				RedrawSelMargin();  			}  			// Combining two blocks where the second one is collapsed (e.g. by adding characters in the line which separates the two blocks) @@ -5489,11 +5490,11 @@ void Editor::FoldChanged(Sci::Line line, int levelNow, int levelPrev) {  	}  	if (!(levelNow & SC_FOLDLEVELWHITEFLAG) &&  	        (LevelNumber(levelPrev) > LevelNumber(levelNow))) { -		if (cs.HiddenLines()) { +		if (pcs->HiddenLines()) {  			// See if should still be hidden  			const Sci::Line parentLine = pdoc->GetFoldParent(line); -			if ((parentLine < 0) || (cs.GetExpanded(parentLine) && cs.GetVisible(parentLine))) { -				cs.SetVisible(line, line, true); +			if ((parentLine < 0) || (pcs->GetExpanded(parentLine) && pcs->GetVisible(parentLine))) { +				pcs->SetVisible(line, line, true);  				SetScrollBars();  				Redraw();  			} @@ -5502,9 +5503,9 @@ void Editor::FoldChanged(Sci::Line line, int levelNow, int levelPrev) {  	// Combining two blocks where the first one is collapsed (e.g. by adding characters in the line which separates the two blocks)  	if (!(levelNow & SC_FOLDLEVELWHITEFLAG) && (LevelNumber(levelPrev) < LevelNumber(levelNow))) { -		if (cs.HiddenLines()) { +		if (pcs->HiddenLines()) {  			const Sci::Line parentLine = pdoc->GetFoldParent(line); -			if (!cs.GetExpanded(parentLine) && cs.GetVisible(line)) +			if (!pcs->GetExpanded(parentLine) && pcs->GetVisible(line))  				FoldLine(parentLine, SC_FOLDACTION_EXPAND);  		}  	} @@ -6420,8 +6421,8 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_SETLINEENDTYPESALLOWED:  		if (pdoc->SetLineEndTypesAllowed(static_cast<int>(wParam))) { -			cs.Clear(); -			cs.InsertLines(0, pdoc->LinesTotal() - 1); +			pcs->Clear(); +			pcs->InsertLines(0, pdoc->LinesTotal() - 1);  			SetAnnotationHeights(0, pdoc->LinesTotal());  			InvalidateStyleRedraw();  		} @@ -6761,8 +6762,8 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  	case SCI_SETCODEPAGE:  		if (ValidCodePage(static_cast<int>(wParam))) {  			if (pdoc->SetDBCSCodePage(static_cast<int>(wParam))) { -				cs.Clear(); -				cs.InsertLines(0, pdoc->LinesTotal() - 1); +				pcs->Clear(); +				pcs->InsertLines(0, pdoc->LinesTotal() - 1);  				SetAnnotationHeights(0, pdoc->LinesTotal());  				InvalidateStyleRedraw();  				SetRepresentations(); @@ -7077,10 +7078,10 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  		// Folding messages  	case SCI_VISIBLEFROMDOCLINE: -		return cs.DisplayFromDoc(static_cast<int>(wParam)); +		return pcs->DisplayFromDoc(static_cast<int>(wParam));  	case SCI_DOCLINEFROMVISIBLE: -		return cs.DocFromDisplay(static_cast<int>(wParam)); +		return pcs->DocFromDisplay(static_cast<int>(wParam));  	case SCI_WRAPCOUNT:  		return WrapCount(static_cast<int>(wParam)); @@ -7102,30 +7103,30 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  		return pdoc->GetFoldParent(static_cast<int>(wParam));  	case SCI_SHOWLINES: -		cs.SetVisible(static_cast<int>(wParam), static_cast<int>(lParam), true); +		pcs->SetVisible(static_cast<int>(wParam), static_cast<int>(lParam), true);  		SetScrollBars();  		Redraw();  		break;  	case SCI_HIDELINES:  		if (wParam > 0) -			cs.SetVisible(static_cast<int>(wParam), static_cast<int>(lParam), false); +			pcs->SetVisible(static_cast<int>(wParam), static_cast<int>(lParam), false);  		SetScrollBars();  		Redraw();  		break;  	case SCI_GETLINEVISIBLE: -		return cs.GetVisible(static_cast<int>(wParam)); +		return pcs->GetVisible(static_cast<int>(wParam));  	case SCI_GETALLLINESVISIBLE: -		return cs.HiddenLines() ? 0 : 1; +		return pcs->HiddenLines() ? 0 : 1;  	case SCI_SETFOLDEXPANDED:  		SetFoldExpanded(static_cast<int>(wParam), lParam != 0);  		break;  	case SCI_GETFOLDEXPANDED: -		return cs.GetExpanded(static_cast<int>(wParam)); +		return pcs->GetExpanded(static_cast<int>(wParam));  	case SCI_SETAUTOMATICFOLD:  		foldAutomatic = static_cast<int>(wParam); @@ -7140,7 +7141,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  		break;  	case SCI_TOGGLEFOLDSHOWTEXT: -		cs.SetFoldDisplayText(static_cast<int>(wParam), CharPtrFromSPtr(lParam)); +		pcs->SetFoldDisplayText(static_cast<int>(wParam), CharPtrFromSPtr(lParam));  		FoldLine(static_cast<int>(wParam), SC_FOLDACTION_TOGGLE);  		break; @@ -7601,6 +7602,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  			Document *doc = new Document(static_cast<int>(lParam));  			doc->AddRef();  			doc->Allocate(static_cast<int>(wParam)); +			pcs = ContractionStateCreate();  			return reinterpret_cast<sptr_t>(doc);  		} @@ -7617,6 +7619,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {  			doc->AddRef();  			doc->Allocate(static_cast<int>(wParam));  			doc->SetUndoCollection(false); +			pcs = ContractionStateCreate();  			return reinterpret_cast<sptr_t>(static_cast<ILoader *>(doc));  		} diff --git a/src/MarginView.cxx b/src/MarginView.cxx index 5a56b28ad..a7f9a9a2d 100644 --- a/src/MarginView.cxx +++ b/src/MarginView.cxx @@ -229,9 +229,9 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,  			// be displayed until the last of a sequence of whitespace.  			bool needWhiteClosure = false;  			if (vs.ms[margin].mask & SC_MASK_FOLDERS) { -				const int level = model.pdoc->GetLevel(model.cs.DocFromDisplay(visibleLine)); +				const int level = model.pdoc->GetLevel(model.pcs->DocFromDisplay(visibleLine));  				if (level & SC_FOLDLEVELWHITEFLAG) { -					Sci::Line lineBack = model.cs.DocFromDisplay(visibleLine); +					Sci::Line lineBack = model.pcs->DocFromDisplay(visibleLine);  					int levelPrev = level;  					while ((lineBack > 0) && (levelPrev & SC_FOLDLEVELWHITEFLAG)) {  						lineBack--; @@ -243,7 +243,7 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,  					}  				}  				if (highlightDelimiter.isEnabled) { -					const Sci::Line lastLine = model.cs.DocFromDisplay(topLine + model.LinesOnScreen()) + 1; +					const Sci::Line lastLine = model.pcs->DocFromDisplay(topLine + model.LinesOnScreen()) + 1;  					model.pdoc->GetHighlightDelimiters(highlightDelimiter,  						static_cast<Sci::Line>(model.pdoc->LineFromPosition(model.sel.MainCaret())), lastLine);  				} @@ -255,13 +255,13 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,  			const int folderEnd = SubstituteMarkerIfEmpty(SC_MARKNUM_FOLDEREND,  				SC_MARKNUM_FOLDER, vs); -			while ((visibleLine < model.cs.LinesDisplayed()) && yposScreen < rc.bottom) { +			while ((visibleLine < model.pcs->LinesDisplayed()) && yposScreen < rc.bottom) { -				PLATFORM_ASSERT(visibleLine < model.cs.LinesDisplayed()); -				const Sci::Line lineDoc = model.cs.DocFromDisplay(visibleLine); -				PLATFORM_ASSERT(model.cs.GetVisible(lineDoc)); -				const Sci::Line firstVisibleLine = model.cs.DisplayFromDoc(lineDoc); -				const Sci::Line lastVisibleLine = model.cs.DisplayLastFromDoc(lineDoc); +				PLATFORM_ASSERT(visibleLine < model.pcs->LinesDisplayed()); +				const Sci::Line lineDoc = model.pcs->DocFromDisplay(visibleLine); +				PLATFORM_ASSERT(model.pcs->GetVisible(lineDoc)); +				const Sci::Line firstVisibleLine = model.pcs->DisplayFromDoc(lineDoc); +				const Sci::Line lastVisibleLine = model.pcs->DisplayLastFromDoc(lineDoc);  				const bool firstSubLine = visibleLine == firstVisibleLine;  				const bool lastSubLine = visibleLine == lastVisibleLine; @@ -280,7 +280,7 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,  					if (level & SC_FOLDLEVELHEADERFLAG) {  						if (firstSubLine) {  							if (levelNum < levelNextNum) { -								if (model.cs.GetExpanded(lineDoc)) { +								if (model.pcs->GetExpanded(lineDoc)) {  									if (levelNum == SC_FOLDLEVELBASE)  										marks |= 1 << SC_MARKNUM_FOLDEROPEN;  									else @@ -296,7 +296,7 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,  							}  						} else {  							if (levelNum < levelNextNum) { -								if (model.cs.GetExpanded(lineDoc)) { +								if (model.pcs->GetExpanded(lineDoc)) {  									marks |= 1 << SC_MARKNUM_FOLDERSUB;  								} else if (levelNum > SC_FOLDLEVELBASE) {  									marks |= 1 << SC_MARKNUM_FOLDERSUB; @@ -306,10 +306,10 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,  							}  						}  						needWhiteClosure = false; -						const Sci::Line firstFollowupLine = model.cs.DocFromDisplay(model.cs.DisplayFromDoc(lineDoc + 1)); +						const Sci::Line firstFollowupLine = model.pcs->DocFromDisplay(model.pcs->DisplayFromDoc(lineDoc + 1));  						const int firstFollowupLineLevel = model.pdoc->GetLevel(firstFollowupLine);  						const int secondFollowupLineLevelNum = LevelNumber(model.pdoc->GetLevel(firstFollowupLine + 1)); -						if (!model.cs.GetExpanded(lineDoc)) { +						if (!model.pcs->GetExpanded(lineDoc)) {  							if ((firstFollowupLineLevel & SC_FOLDLEVELWHITEFLAG) &&  								(levelNum > secondFollowupLineLevelNum))  								needWhiteClosure = true; @@ -434,7 +434,7 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,  									if (firstSubLine) {  										tFold = headWithTail ? LineMarker::headWithTail : LineMarker::head;  									} else { -										if (model.cs.GetExpanded(lineDoc) || headWithTail) { +										if (model.pcs->GetExpanded(lineDoc) || headWithTail) {  											tFold = LineMarker::body;  										} else {  											tFold = LineMarker::undefined; | 
