diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ContractionState.cxx | 8 | ||||
-rw-r--r-- | src/ContractionState.h | 1 | ||||
-rw-r--r-- | src/EditModel.cxx | 17 | ||||
-rw-r--r-- | src/EditModel.h | 4 | ||||
-rw-r--r-- | src/EditView.cxx | 7 | ||||
-rw-r--r-- | src/Editor.cxx | 8 | ||||
-rw-r--r-- | src/UniqueString.h | 4 |
7 files changed, 38 insertions, 11 deletions
diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx index 1dd25cc4d..565f9e141 100644 --- a/src/ContractionState.cxx +++ b/src/ContractionState.cxx @@ -75,7 +75,6 @@ public: 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; @@ -278,16 +277,11 @@ const char *ContractionState<LINE>::GetFoldDisplayText(Sci::Line lineDoc) const } template <typename LINE> -bool ContractionState<LINE>::GetFoldDisplayTextShown(Sci::Line lineDoc) const { - return !GetExpanded(lineDoc) && GetFoldDisplayText(lineDoc); -} - -template <typename LINE> bool ContractionState<LINE>::SetFoldDisplayText(Sci::Line lineDoc, const char *text) { EnsureData(); const char *foldText = foldDisplayTexts->ValueAt(lineDoc).get(); if (!foldText || !text || 0 != strcmp(text, foldText)) { - UniqueString uns = UniqueStringCopy(text); + UniqueString uns = IsNullOrEmpty(text) ? UniqueString() : UniqueStringCopy(text); foldDisplayTexts->SetValueAt(lineDoc, std::move(uns)); Check(); return true; diff --git a/src/ContractionState.h b/src/ContractionState.h index 90f5c0784..f9ec7b645 100644 --- a/src/ContractionState.h +++ b/src/ContractionState.h @@ -32,7 +32,6 @@ public: virtual bool HiddenLines() const=0; 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; virtual bool GetExpanded(Sci::Line lineDoc) const=0; diff --git a/src/EditModel.cxx b/src/EditModel.cxx index 83cade5ef..db8682efb 100644 --- a/src/EditModel.cxx +++ b/src/EditModel.cxx @@ -88,3 +88,20 @@ bool EditModel::BidirectionalEnabled() const { bool EditModel::BidirectionalR2L() const { return bidirectional == Bidirectional::bidiR2L; } + +void EditModel::SetDefaultFoldDisplayText(const char *text) { + defaultFoldDisplayText = IsNullOrEmpty(text) ? UniqueString() : UniqueStringCopy(text); +} + +const char *EditModel::GetDefaultFoldDisplayText() const noexcept { + return defaultFoldDisplayText.get(); +} + +const char *EditModel::GetFoldDisplayText(Sci::Line lineDoc) const { + if (foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN || pcs->GetExpanded(lineDoc)) { + return nullptr; + } + + const char *text = pcs->GetFoldDisplayText(lineDoc); + return text ? text : defaultFoldDisplayText.get(); +} diff --git a/src/EditModel.h b/src/EditModel.h index 5fb6a0f02..b63f2129f 100644 --- a/src/EditModel.h +++ b/src/EditModel.h @@ -42,6 +42,7 @@ public: int foldFlags; int foldDisplayTextStyle; + UniqueString defaultFoldDisplayText; std::unique_ptr<IContractionState> pcs; // Hotspot support Range hotspot; @@ -65,6 +66,9 @@ public: virtual Range GetHotSpotRange() const noexcept = 0; bool BidirectionalEnabled() const; bool BidirectionalR2L() const; + void SetDefaultFoldDisplayText(const char *text); + const char *GetDefaultFoldDisplayText() const noexcept; + const char *GetFoldDisplayText(Sci::Line lineDoc) const; }; } diff --git a/src/EditView.cxx b/src/EditView.cxx index 91d5da13d..a26412954 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -1048,7 +1048,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.pcs->GetFoldDisplayTextShown(line); + const bool fillRemainder = !lastSubLine || !model.GetFoldDisplayText(line); if (fillRemainder) { // Fill the remainder of the line FillLineRemainder(surface, model, vsDraw, ll, line, rcSegment, subLine); @@ -1196,11 +1196,12 @@ void EditView::DrawFoldDisplayText(Surface *surface, const EditModel &model, con if (!lastSubLine) return; - if ((model.foldDisplayTextStyle == SC_FOLDDISPLAYTEXT_HIDDEN) || !model.pcs->GetFoldDisplayTextShown(line)) + const char *text = model.GetFoldDisplayText(line); + if (!text) return; PRectangle rcSegment = rcLine; - const std::string_view foldDisplayText = model.pcs->GetFoldDisplayText(line); + const std::string_view foldDisplayText(text); FontAlias fontText = vsDraw.styles[STYLE_FOLDDISPLAYTEXT].font; const int widthFoldDisplayText = static_cast<int>(surface->WidthText(fontText, foldDisplayText)); diff --git a/src/Editor.cxx b/src/Editor.cxx index f269326a2..aa0b9723c 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -7204,6 +7204,14 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { case SCI_FOLDDISPLAYTEXTGETSTYLE: return foldDisplayTextStyle; + case SCI_SETDEFAULTFOLDDISPLAYTEXT: + SetDefaultFoldDisplayText(CharPtrFromSPtr(lParam)); + Redraw(); + break; + + case SCI_GETDEFAULTFOLDDISPLAYTEXT: + return StringResult(lParam, GetDefaultFoldDisplayText()); + case SCI_TOGGLEFOLD: FoldLine(static_cast<Sci::Line>(wParam), SC_FOLDACTION_TOGGLE); break; diff --git a/src/UniqueString.h b/src/UniqueString.h index 18c31283e..8d95cb1ab 100644 --- a/src/UniqueString.h +++ b/src/UniqueString.h @@ -11,6 +11,10 @@ namespace Scintilla { +constexpr bool IsNullOrEmpty(const char *text) noexcept { + return text == nullptr || *text == '\0'; +} + using UniqueString = std::unique_ptr<const char[]>; /// Equivalent to strdup but produces a std::unique_ptr<const char[]> allocation to go |