1 // Scintilla source code edit control
2 /** @file EditModel.cxx
3  ** Defines the editor state that must be visible to EditorView.
4  **/
5 // Copyright 1998-2014 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
7 
8 #include <cstddef>
9 #include <cstdlib>
10 #include <cassert>
11 #include <cstring>
12 #include <cmath>
13 
14 #include <stdexcept>
15 #include <string>
16 #include <string_view>
17 #include <vector>
18 #include <map>
19 #include <algorithm>
20 #include <memory>
21 
22 #include "Platform.h"
23 
24 #include "ILoader.h"
25 #include "ILexer.h"
26 #include "Scintilla.h"
27 
28 #include "CharacterCategory.h"
29 
30 #include "Position.h"
31 #include "UniqueString.h"
32 #include "SplitVector.h"
33 #include "Partitioning.h"
34 #include "RunStyles.h"
35 #include "ContractionState.h"
36 #include "CellBuffer.h"
37 #include "KeyMap.h"
38 #include "Indicator.h"
39 #include "LineMarker.h"
40 #include "Style.h"
41 #include "ViewStyle.h"
42 #include "CharClassify.h"
43 #include "Decoration.h"
44 #include "CaseFolder.h"
45 #include "Document.h"
46 #include "UniConversion.h"
47 #include "Selection.h"
48 #include "PositionCache.h"
49 #include "EditModel.h"
50 
51 using namespace Scintilla;
52 
Caret()53 Caret::Caret() noexcept :
54 	active(false), on(false), period(500) {}
55 
EditModel()56 EditModel::EditModel() : braces{} {
57 	inOverstrike = false;
58 	xOffset = 0;
59 	trackLineWidth = false;
60 	posDrag = SelectionPosition(Sci::invalidPosition);
61 	braces[0] = Sci::invalidPosition;
62 	braces[1] = Sci::invalidPosition;
63 	bracesMatchStyle = STYLE_BRACEBAD;
64 	highlightGuideColumn = 0;
65 	primarySelection = true;
66 	imeInteraction = imeWindowed;
67 	bidirectional = Bidirectional::bidiDisabled;
68 	foldFlags = 0;
69 	foldDisplayTextStyle = SC_FOLDDISPLAYTEXT_HIDDEN;
70 	hotspot = Range(Sci::invalidPosition);
71 	hoverIndicatorPos = Sci::invalidPosition;
72 	wrapWidth = LineLayout::wrapWidthInfinite;
73 	pdoc = new Document(SC_DOCUMENTOPTION_DEFAULT);
74 	pdoc->AddRef();
75 	pcs = ContractionStateCreate(pdoc->IsLarge());
76 }
77 
~EditModel()78 EditModel::~EditModel() {
79 	pdoc->Release();
80 	pdoc = nullptr;
81 }
82 
BidirectionalEnabled() const83 bool EditModel::BidirectionalEnabled() const noexcept {
84 	return (bidirectional != Bidirectional::bidiDisabled) &&
85 		(SC_CP_UTF8 == pdoc->dbcsCodePage);
86 }
87 
BidirectionalR2L() const88 bool EditModel::BidirectionalR2L() const noexcept {
89 	return bidirectional == Bidirectional::bidiR2L;
90 }
91 
SetDefaultFoldDisplayText(const char * text)92 void EditModel::SetDefaultFoldDisplayText(const char *text) {
93 	defaultFoldDisplayText = IsNullOrEmpty(text) ? UniqueString() : UniqueStringCopy(text);
94 }
95 
GetDefaultFoldDisplayText() const96 const char *EditModel::GetDefaultFoldDisplayText() const noexcept {
97 	return defaultFoldDisplayText.get();
98 }
99 
GetFoldDisplayText(Sci::Line lineDoc) const100 const char *EditModel::GetFoldDisplayText(Sci::Line lineDoc) const noexcept {
101 	if (foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN || pcs->GetExpanded(lineDoc)) {
102 		return nullptr;
103 	}
104 
105 	const char *text = pcs->GetFoldDisplayText(lineDoc);
106 	return text ? text : defaultFoldDisplayText.get();
107 }
108