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