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 <[email protected]> 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()53Caret::Caret() noexcept : 54 active(false), on(false), period(500) {} 55 EditModel()56EditModel::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()78EditModel::~EditModel() { 79 pdoc->Release(); 80 pdoc = nullptr; 81 } 82 BidirectionalEnabled() const83bool EditModel::BidirectionalEnabled() const noexcept { 84 return (bidirectional != Bidirectional::bidiDisabled) && 85 (SC_CP_UTF8 == pdoc->dbcsCodePage); 86 } 87 BidirectionalR2L() const88bool EditModel::BidirectionalR2L() const noexcept { 89 return bidirectional == Bidirectional::bidiR2L; 90 } 91 SetDefaultFoldDisplayText(const char * text)92void EditModel::SetDefaultFoldDisplayText(const char *text) { 93 defaultFoldDisplayText = IsNullOrEmpty(text) ? UniqueString() : UniqueStringCopy(text); 94 } 95 GetDefaultFoldDisplayText() const96const char *EditModel::GetDefaultFoldDisplayText() const noexcept { 97 return defaultFoldDisplayText.get(); 98 } 99 GetFoldDisplayText(Sci::Line lineDoc) const100const 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