aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2019-04-05 08:32:58 +1100
committerNeil <nyamatongwe@gmail.com>2019-04-05 08:32:58 +1100
commitcb81cd27cd1b162c381db4106cb29c4c397146a8 (patch)
treeac40f63a508d517d630cb266124b9bcebf914495 /src
parent966c872120ea94941f2672f15cdcc9018a5a5dd0 (diff)
downloadscintilla-mirror-cb81cd27cd1b162c381db4106cb29c4c397146a8.tar.gz
Backport: Feature [feature-requests:#1272]. Add API to set default fold display text.
Backport of changeset 7400:9fcb52fdb307.
Diffstat (limited to 'src')
-rw-r--r--src/ContractionState.cxx8
-rw-r--r--src/ContractionState.h1
-rw-r--r--src/EditModel.cxx18
-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, 39 insertions, 11 deletions
diff --git a/src/ContractionState.cxx b/src/ContractionState.cxx
index c5e352180..47f345ada 100644
--- a/src/ContractionState.cxx
+++ b/src/ContractionState.cxx
@@ -74,7 +74,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;
@@ -277,16 +276,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 6288fd1b6..99520f3cb 100644
--- a/src/EditModel.cxx
+++ b/src/EditModel.cxx
@@ -77,3 +77,21 @@ EditModel::~EditModel() {
pdoc->Release();
pdoc = nullptr;
}
+
+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 5cc9d51d1..ab5c23cdb 100644
--- a/src/EditModel.h
+++ b/src/EditModel.h
@@ -40,6 +40,7 @@ public:
int foldFlags;
int foldDisplayTextStyle;
+ UniqueString defaultFoldDisplayText;
std::unique_ptr<IContractionState> pcs;
// Hotspot support
Range hotspot;
@@ -61,6 +62,9 @@ public:
virtual Point GetVisibleOriginInMain() const = 0;
virtual Sci::Line LinesOnScreen() const = 0;
virtual Range GetHotSpotRange() const noexcept = 0;
+ 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 e82f09ee2..fa01a0385 100644
--- a/src/EditView.cxx
+++ b/src/EditView.cxx
@@ -985,7 +985,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);
@@ -1105,11 +1105,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 char *foldDisplayText = model.pcs->GetFoldDisplayText(line);
+ const char *foldDisplayText = text;
const int lengthFoldDisplayText = static_cast<int>(strlen(foldDisplayText));
FontAlias fontText = vsDraw.styles[STYLE_FOLDDISPLAYTEXT].font;
const int widthFoldDisplayText = static_cast<int>(surface->WidthText(fontText, foldDisplayText, lengthFoldDisplayText));
diff --git a/src/Editor.cxx b/src/Editor.cxx
index 08a4ac76c..d67f97df7 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -7191,6 +7191,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