1 // Scintilla source code edit control
2 /** @file EditModel.cxx
3 ** Defines the editor state that must be visible to EditorView.
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.
17 #include <string_view>
25 #include "ScintillaTypes.h"
29 #include "Debugging.h"
33 #include "CharacterCategoryMap.h"
36 #include "UniqueString.h"
37 #include "SplitVector.h"
38 #include "Partitioning.h"
39 #include "RunStyles.h"
40 #include "ContractionState.h"
41 #include "CellBuffer.h"
42 #include "Indicator.h"
43 #include "LineMarker.h"
45 #include "ViewStyle.h"
46 #include "CharClassify.h"
47 #include "Decoration.h"
48 #include "CaseFolder.h"
50 #include "UniConversion.h"
51 #include "Selection.h"
52 #include "PositionCache.h"
53 #include "EditModel.h"
55 using namespace Scintilla
;
56 using namespace Scintilla::Internal
;
58 Caret::Caret() noexcept
:
59 active(false), on(false), period(500) {}
61 EditModel::EditModel() : braces
{} {
64 trackLineWidth
= false;
65 posDrag
= SelectionPosition(Sci::invalidPosition
);
66 braces
[0] = Sci::invalidPosition
;
67 braces
[1] = Sci::invalidPosition
;
68 bracesMatchStyle
= StyleBraceBad
;
69 highlightGuideColumn
= 0;
71 primarySelection
= true;
72 imeInteraction
= IMEInteraction::Windowed
;
73 bidirectional
= Bidirectional::Disabled
;
74 foldFlags
= FoldFlag::None
;
75 foldDisplayTextStyle
= FoldDisplayTextStyle::Hidden
;
76 hotspot
= Range(Sci::invalidPosition
);
77 hotspotSingleLine
= true;
78 hoverIndicatorPos
= Sci::invalidPosition
;
79 wrapWidth
= LineLayout::wrapWidthInfinite
;
80 pdoc
= new Document(DocumentOption::Default
);
82 pcs
= ContractionStateCreate(pdoc
->IsLarge());
85 EditModel::~EditModel() {
87 // This never throws but isn't marked noexcept for compatibility
90 // Ignore any exception
95 bool EditModel::BidirectionalEnabled() const noexcept
{
96 return (bidirectional
!= Bidirectional::Disabled
) &&
97 (CpUtf8
== pdoc
->dbcsCodePage
);
100 bool EditModel::BidirectionalR2L() const noexcept
{
101 return bidirectional
== Bidirectional::R2L
;
104 SurfaceMode
EditModel::CurrentSurfaceMode() const noexcept
{
105 return SurfaceMode(pdoc
->dbcsCodePage
, BidirectionalR2L());
108 void EditModel::SetDefaultFoldDisplayText(const char *text
) {
109 defaultFoldDisplayText
= IsNullOrEmpty(text
) ? UniqueString() : UniqueStringCopy(text
);
112 const char *EditModel::GetDefaultFoldDisplayText() const noexcept
{
113 return defaultFoldDisplayText
.get();
116 const char *EditModel::GetFoldDisplayText(Sci::Line lineDoc
) const noexcept
{
117 if (foldDisplayTextStyle
== FoldDisplayTextStyle::Hidden
|| pcs
->GetExpanded(lineDoc
)) {
121 const char *text
= pcs
->GetFoldDisplayText(lineDoc
);
122 return text
? text
: defaultFoldDisplayText
.get();
125 InSelection
EditModel::LineEndInSelection(Sci::Line lineDoc
) const {
126 const Sci::Position posAfterLineEnd
= pdoc
->LineStart(lineDoc
+ 1);
127 return sel
.InSelectionForEOL(posAfterLineEnd
);
130 int EditModel::GetMark(Sci::Line line
) const {
131 return pdoc
->GetMark(line
, FlagSet(changeHistoryOption
, ChangeHistoryOption::Markers
));