aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/PerLine.cxx
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2014-08-08 10:01:55 +1000
committerNeil <nyamatongwe@gmail.com>2014-08-08 10:01:55 +1000
commita2940fd23daf6f8d82c9c821de5c40077ce0da84 (patch)
treec90f4a2d63322446821db40a6df3a0106b751035 /src/PerLine.cxx
parent0f69f3794f88db0630d7264c26c557558ed44b60 (diff)
downloadscintilla-mirror-a2940fd23daf6f8d82c9c821de5c40077ce0da84.tar.gz
Implement explicit tab stops per line.
From Nick Gravgaard.
Diffstat (limited to 'src/PerLine.cxx')
-rw-r--r--src/PerLine.cxx70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/PerLine.cxx b/src/PerLine.cxx
index 8b0dbc44b..8fd96cbed 100644
--- a/src/PerLine.cxx
+++ b/src/PerLine.cxx
@@ -7,6 +7,7 @@
#include <string.h>
+#include <vector>
#include <algorithm>
#include "Platform.h"
@@ -484,3 +485,72 @@ int LineAnnotation::Lines(int line) const {
else
return 0;
}
+
+LineTabstops::~LineTabstops() {
+ Init();
+}
+
+void LineTabstops::Init() {
+ for (int line = 0; line < tabstops.Length(); line++) {
+ delete tabstops[line];
+ }
+ tabstops.DeleteAll();
+}
+
+void LineTabstops::InsertLine(int line) {
+ if (tabstops.Length()) {
+ tabstops.EnsureLength(line);
+ tabstops.Insert(line, 0);
+ }
+}
+
+void LineTabstops::RemoveLine(int line) {
+ if (tabstops.Length() > line) {
+ delete tabstops[line];
+ tabstops.Delete(line);
+ }
+}
+
+bool LineTabstops::ClearTabstops(int line) {
+ if (line < tabstops.Length()) {
+ TabstopList *tl = tabstops[line];
+ if (tl) {
+ tl->clear();
+ return true;
+ }
+ }
+ return false;
+}
+
+bool LineTabstops::AddTabstop(int line, int x) {
+ tabstops.EnsureLength(line + 1);
+ if (!tabstops[line]) {
+ tabstops[line] = new TabstopList();
+ }
+
+ TabstopList *tl = tabstops[line];
+ if (tl) {
+ // tabstop positions are kept in order - insert in the right place
+ std::vector<int>::iterator it = std::lower_bound(tl->begin(), tl->end(), x);
+ // don't insert duplicates
+ if (it == tl->end() || *it != x) {
+ tl->insert(it, x);
+ return true;
+ }
+ }
+ return false;
+}
+
+int LineTabstops::GetNextTabstop(int line, int x) const {
+ if (line < tabstops.Length()) {
+ TabstopList *tl = tabstops[line];
+ if (tl) {
+ for (size_t i = 0; i < tl->size(); i++) {
+ if ((*tl)[i] > x) {
+ return (*tl)[i];
+ }
+ }
+ }
+ }
+ return 0;
+}