aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Decoration.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/Decoration.cxx')
-rw-r--r--src/Decoration.cxx111
1 files changed, 104 insertions, 7 deletions
diff --git a/src/Decoration.cxx b/src/Decoration.cxx
index 0470f26f9..2fe2eb318 100644
--- a/src/Decoration.cxx
+++ b/src/Decoration.cxx
@@ -26,15 +26,97 @@
using namespace Scintilla;
-Decoration::Decoration(int indicator_) : indicator(indicator_) {
-}
+namespace {
-Decoration::~Decoration() {
-}
+class Decoration : public IDecoration {
+ int indicator;
+public:
+ RunStyles<Sci::Position, int> rs;
-bool Decoration::Empty() const {
- return (rs.Runs() == 1) && (rs.AllSameAs(0));
-}
+ explicit Decoration(int indicator_) : indicator(indicator_) {
+ }
+ ~Decoration() {
+ }
+
+ bool Empty() const override {
+ return (rs.Runs() == 1) && (rs.AllSameAs(0));
+ }
+ int Indicator() const override {
+ return indicator;
+ }
+ Sci::Position Length() const override {
+ return rs.Length();
+ }
+ int ValueAt(Sci::Position position) const override {
+ return rs.ValueAt(static_cast<Sci::Position>(position));
+ }
+ Sci::Position StartRun(Sci::Position position) const override {
+ return rs.StartRun(static_cast<Sci::Position>(position));
+ }
+ Sci::Position EndRun(Sci::Position position) const override {
+ return rs.EndRun(static_cast<Sci::Position>(position));
+ }
+ void SetValueAt(Sci::Position position, int value) override {
+ rs.SetValueAt(static_cast<Sci::Position>(position), value);
+ }
+ void InsertSpace(Sci::Position position, Sci::Position insertLength) override {
+ rs.InsertSpace(static_cast<Sci::Position>(position), static_cast<Sci::Position>(insertLength));
+ }
+ Sci::Position Runs() const override {
+ return rs.Runs();
+ }
+};
+
+class DecorationList : public IDecorationList {
+ int currentIndicator;
+ int currentValue;
+ Decoration *current; // Cached so FillRange doesn't have to search for each call.
+ Sci::Position lengthDocument;
+ // Ordered by indicator
+ std::vector<std::unique_ptr<Decoration>> decorationList;
+ std::vector<const IDecoration*> decorationView; // Read-only view of decorationList
+ bool clickNotified;
+
+ Decoration *DecorationFromIndicator(int indicator);
+ Decoration *Create(int indicator, Sci::Position length);
+ void Delete(int indicator);
+ void DeleteAnyEmpty();
+ void SetView();
+public:
+
+ DecorationList();
+ ~DecorationList();
+
+ const std::vector<const IDecoration*> &View() const override {
+ return decorationView;
+ }
+
+ void SetCurrentIndicator(int indicator) override;
+ int GetCurrentIndicator() const override { return currentIndicator; }
+
+ void SetCurrentValue(int value) override;
+ int GetCurrentValue() const override { return currentValue; }
+
+ // Returns changed=true if some values may have changed
+ FillResult<Sci::Position> FillRange(Sci::Position position, int value, Sci::Position fillLength) override;
+
+ void InsertSpace(Sci::Position position, Sci::Position insertLength) override;
+ void DeleteRange(Sci::Position position, Sci::Position deleteLength) override;
+
+ void DeleteLexerDecorations() override;
+
+ int AllOnFor(Sci::Position position) const override;
+ int ValueAt(int indicator, Sci::Position position) override;
+ Sci::Position Start(int indicator, Sci::Position position) override;
+ Sci::Position End(int indicator, Sci::Position position) override;
+
+ bool ClickNotified() const override {
+ return clickNotified;
+ }
+ void SetClickNotified(bool notified) override {
+ clickNotified = notified;
+ }
+};
DecorationList::DecorationList() : currentIndicator(0), currentValue(1), current(nullptr),
lengthDocument(0), clickNotified(false) {
@@ -190,3 +272,18 @@ Sci::Position DecorationList::End(int indicator, Sci::Position position) {
}
return 0;
}
+
+}
+
+namespace Scintilla {
+
+std::unique_ptr<IDecoration> DecorationCreate(int indicator) {
+ return std::make_unique<Decoration>(indicator);
+}
+
+std::unique_ptr<IDecorationList> DecorationListCreate() {
+ return std::make_unique<DecorationList>();
+}
+
+}
+