aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ContractionState.cxx8
-rw-r--r--src/ContractionState.h1
-rw-r--r--src/EditModel.cxx17
-rw-r--r--src/EditModel.h4
-rw-r--r--src/EditView.cxx7
-rw-r--r--src/Editor.cxx8
-rw-r--r--src/UniqueString.h4
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