diff options
Diffstat (limited to 'src/Decoration.cxx')
-rw-r--r-- | src/Decoration.cxx | 111 |
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>(); +} + +} + |