aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorIain Clarke <unknown>2020-04-08 09:27:43 +1000
committerIain Clarke <unknown>2020-04-08 09:27:43 +1000
commitb8369870e15d4b061ec5d67d0cfbfe04d3a6459f (patch)
tree41276956ec5d67485a560a1218bfa0a9325e11e7
parent4a1cfeae9b35bbb3639c3f48d3bf5ec17a6aa77f (diff)
downloadscintilla-mirror-b8369870e15d4b061ec5d67d0cfbfe04d3a6459f.tar.gz
Feature [feature-requests:1344]. Add methods for iterating through the marker
handles and marker numbers on a line.
-rw-r--r--doc/ScintillaDoc.html8
-rw-r--r--doc/ScintillaHistory.html5
-rw-r--r--include/Scintilla.h2
-rw-r--r--include/Scintilla.iface8
-rw-r--r--src/Document.cxx8
-rw-r--r--src/Document.h2
-rw-r--r--src/Editor.cxx6
-rw-r--r--src/PerLine.cxx25
-rw-r--r--src/PerLine.h3
-rw-r--r--test/simpleTests.py39
10 files changed, 103 insertions, 3 deletions
diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html
index 8afdbbe98..1bd27d469 100644
--- a/doc/ScintillaDoc.html
+++ b/doc/ScintillaDoc.html
@@ -4147,6 +4147,8 @@ struct Sci_TextToFind {
<a class="message" href="#SCI_MARKERPREVIOUS">SCI_MARKERPREVIOUS(line lineStart, int markerMask) &rarr; line</a><br />
<a class="message" href="#SCI_MARKERLINEFROMHANDLE">SCI_MARKERLINEFROMHANDLE(int markerHandle) &rarr; line</a><br />
<a class="message" href="#SCI_MARKERDELETEHANDLE">SCI_MARKERDELETEHANDLE(int markerHandle)</a><br />
+ <a class="message" href="#SCI_MARKERHANDLEFROMLINE">SCI_MARKERHANDLEFROMLINE(line line, int which) &rarr; int</a><br />
+ <a class="message" href="#SCI_MARKERNUMBERFROMLINE">SCI_MARKERNUMBERFROMLINE(line line, int which) &rarr; int</a><br />
</code>
<p><b id="SCI_MARKERDEFINE">SCI_MARKERDEFINE(int markerNumber, int markerSymbol)</b><br />
@@ -4414,6 +4416,12 @@ struct Sci_TextToFind {
class="message" href="#SCI_MARKERADD"><code>SCI_MARKERADD</code></a>. This function searches
the document for the marker with this handle and deletes the marker if it is found.</p>
+ <p><b id="SCI_MARKERHANDLEFROMLINE">SCI_MARKERHANDLEFROMLINE(line line, int which) &rarr; int</b><br />
+ <b id="SCI_MARKERNUMBERFROMLINE">SCI_MARKERNUMBERFROMLINE(line line, int which) &rarr; int</b><br />
+ These messages returns the Nth marker handle or marker number in a given <code class="parameter">line</code>.
+ Handles are returned by <a class="message" href="#SCI_MARKERADD"><code>SCI_MARKERADD</code></a>.
+ If <code class="parameter">which</code> is greater or equal to the number of markers on a line, this returns -1;</p>
+
<h2 id="Indicators">Indicators</h2>
<p>Indicators are used to display additional information over the top of styling.
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html
index 201b2213a..49a0ca0e0 100644
--- a/doc/ScintillaHistory.html
+++ b/doc/ScintillaHistory.html
@@ -573,6 +573,11 @@
Added Visual Studio project files for Lexilla and Scintilla with no lexers.
</li>
<li>
+ Add methods for iterating through the marker handles and marker numbers on a line:
+ SCI_MARKERHANDLEFROMLINE and SCI_MARKERNUMBERFROMLINE.
+ <a href="https://sourceforge.net/p/scintilla/feature-requests/1344/">Feature #1344</a>.
+ </li>
+ <li>
Fix brace styling in Batch lexer so that brace matching works.
<a href="https://sourceforge.net/p/scintilla/bugs/1624/">Bug #1624</a>,
<a href="https://sourceforge.net/p/scintilla/bugs/1906/">Bug #1906</a>,
diff --git a/include/Scintilla.h b/include/Scintilla.h
index 226d7c0ca..4f5be6427 100644
--- a/include/Scintilla.h
+++ b/include/Scintilla.h
@@ -63,6 +63,8 @@ typedef sptr_t (*SciFnDirect)(sptr_t ptr, unsigned int iMessage, uptr_t wParam,
#define SCI_CANREDO 2016
#define SCI_MARKERLINEFROMHANDLE 2017
#define SCI_MARKERDELETEHANDLE 2018
+#define SCI_MARKERHANDLEFROMLINE 2732
+#define SCI_MARKERNUMBERFROMLINE 2733
#define SCI_GETUNDOCOLLECTION 2019
#define SCWS_INVISIBLE 0
#define SCWS_VISIBLEALWAYS 1
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index 8e52f40f7..6e229bf37 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -156,6 +156,12 @@ fun line MarkerLineFromHandle=2017(int markerHandle,)
# Delete a marker.
fun void MarkerDeleteHandle=2018(int markerHandle,)
+# Retrieve marker handles of a line
+fun int MarkerHandleFromLine=2732(line line, int which)
+
+# Retrieve marker number of a marker handle
+fun int MarkerNumberFromLine=2733(line line, int which)
+
# Is undo history being collected?
get bool GetUndoCollection=2019(,)
@@ -1242,6 +1248,8 @@ set void SetTargetEndVirtualSpace=2730(position space,)
# Get the virtual space of the target end
get position GetTargetEndVirtualSpace=2731(,)
+
+
# Sets both the start and end of the target in one call.
fun void SetTargetRange=2686(position start, position end)
diff --git a/src/Document.cxx b/src/Document.cxx
index 6b93a30af..263e83d7a 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -369,6 +369,14 @@ Sci::Line Document::LineFromHandle(int markerHandle) const {
return Markers()->LineFromHandle(markerHandle);
}
+int Document::MarkerNumberFromLine(Sci::Line line, int which) const {
+ return Markers()->NumberFromLine(line, which);
+}
+
+int Document::MarkerHandleFromLine(Sci::Line line, int which) const {
+ return Markers()->HandleFromLine(line, which);
+}
+
Sci_Position SCI_METHOD Document::LineStart(Sci_Position line) const {
return cb.LineStart(line);
}
diff --git a/src/Document.h b/src/Document.h
index c96fe9ee7..1f03dda1d 100644
--- a/src/Document.h
+++ b/src/Document.h
@@ -403,6 +403,8 @@ public:
void DeleteMarkFromHandle(int markerHandle);
void DeleteAllMarks(int markerNum);
Sci::Line LineFromHandle(int markerHandle) const;
+ int MarkerNumberFromLine(Sci::Line line, int which) const;
+ int MarkerHandleFromLine(Sci::Line line, int which) const;
Sci_Position SCI_METHOD LineStart(Sci_Position line) const override;
bool IsLineStartPosition(Sci::Position position) const;
Sci_Position SCI_METHOD LineEnd(Sci_Position line) const override;
diff --git a/src/Editor.cxx b/src/Editor.cxx
index efb360331..b7636adb2 100644
--- a/src/Editor.cxx
+++ b/src/Editor.cxx
@@ -6412,6 +6412,12 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) {
pdoc->DeleteMarkFromHandle(static_cast<int>(wParam));
break;
+ case SCI_MARKERHANDLEFROMLINE:
+ return pdoc->MarkerHandleFromLine(static_cast<Sci::Line>(wParam), static_cast<int>(lParam));
+
+ case SCI_MARKERNUMBERFROMLINE:
+ return pdoc->MarkerNumberFromLine(static_cast<Sci::Line>(wParam), static_cast<int>(lParam));
+
case SCI_GETVIEWWS:
return vs.viewWhitespace;
diff --git a/src/PerLine.cxx b/src/PerLine.cxx
index 017eb77b8..31da695ad 100644
--- a/src/PerLine.cxx
+++ b/src/PerLine.cxx
@@ -55,6 +55,15 @@ bool MarkerHandleSet::Contains(int handle) const noexcept {
return false;
}
+MarkerHandleNumber const *MarkerHandleSet::GetMarkerHandleNumber(int which) const noexcept {
+ for (const MarkerHandleNumber &mhn : mhList) {
+ if (which == 0)
+ return &mhn;
+ which--;
+ }
+ return nullptr;
+}
+
bool MarkerHandleSet::InsertHandle(int handle, int markerNum) {
mhList.push_front(MarkerHandleNumber(handle, markerNum));
return true;
@@ -116,6 +125,22 @@ Sci::Line LineMarkers::LineFromHandle(int markerHandle) {
return -1;
}
+int LineMarkers::HandleFromLine(Sci::Line line, int which) const {
+ if (markers.Length() && (line >= 0) && (line < markers.Length()) && markers[line]) {
+ MarkerHandleNumber const *pnmh = markers[line]->GetMarkerHandleNumber(which);
+ return pnmh ? pnmh->handle : -1;
+ }
+ return -1;
+}
+
+int LineMarkers::NumberFromLine(Sci::Line line, int which) const {
+ if (markers.Length() && (line >= 0) && (line < markers.Length()) && markers[line]) {
+ MarkerHandleNumber const *pnmh = markers[line]->GetMarkerHandleNumber(which);
+ return pnmh ? pnmh->number : -1;
+ }
+ return -1;
+}
+
void LineMarkers::MergeMarkers(Sci::Line line) {
if (markers[line + 1]) {
if (!markers[line])
diff --git a/src/PerLine.h b/src/PerLine.h
index 94dc17a20..3da02b5e5 100644
--- a/src/PerLine.h
+++ b/src/PerLine.h
@@ -41,6 +41,7 @@ public:
void RemoveHandle(int handle);
bool RemoveNumber(int markerNum, bool all);
void CombineWith(MarkerHandleSet *other);
+ MarkerHandleNumber const *GetMarkerHandleNumber(int which) const noexcept;
};
class LineMarkers : public PerLine {
@@ -67,6 +68,8 @@ public:
bool DeleteMark(Sci::Line line, int markerNum, bool all);
void DeleteMarkFromHandle(int markerHandle);
Sci::Line LineFromHandle(int markerHandle);
+ int HandleFromLine(Sci::Line line, int which) const;
+ int NumberFromLine(Sci::Line line, int which) const;
};
class LineLevels : public PerLine {
diff --git a/test/simpleTests.py b/test/simpleTests.py
index 1ede72da3..7b4bfcaf2 100644
--- a/test/simpleTests.py
+++ b/test/simpleTests.py
@@ -1000,6 +1000,39 @@ class TestMarkers(unittest.TestCase):
self.ed.MarkerDefine(1,3)
self.assertEquals(self.ed.MarkerSymbolDefined(1), 3)
+ def markerFromLineIndex(self, line, index):
+ """ Helper that returns (handle, number) """
+ return (self.ed.MarkerHandleFromLine(line, index), self.ed.MarkerNumberFromLine(line, index))
+
+ def markerSetFromLine(self, line):
+ """ Helper that returns set of (handle, number) """
+ markerSet = set()
+ index = 0
+ while 1:
+ marker = self.markerFromLineIndex(line, index)
+ if marker[0] == -1:
+ return markerSet
+ markerSet.add(marker)
+ index += 1
+
+ def testMarkerFromLine(self):
+ self.assertEquals(self.ed.MarkerHandleFromLine(1, 0), -1)
+ self.assertEquals(self.ed.MarkerNumberFromLine(1, 0), -1)
+ self.assertEquals(self.markerFromLineIndex(1, 0), (-1, -1))
+ self.assertEquals(self.markerSetFromLine(1), set())
+
+ handle = self.ed.MarkerAdd(1,10)
+ self.assertEquals(self.markerFromLineIndex(1, 0), (handle, 10))
+ self.assertEquals(self.markerFromLineIndex(1, 1), (-1, -1))
+ self.assertEquals(self.markerSetFromLine(1), {(handle, 10)})
+
+ handle2 = self.ed.MarkerAdd(1,11)
+ # Don't want to depend on ordering so check as sets
+ self.assertEquals(self.markerSetFromLine(1), {(handle, 10), (handle2, 11)})
+
+ self.ed.MarkerDeleteHandle(handle2)
+ self.assertEquals(self.markerSetFromLine(1), {(handle, 10)})
+
class TestIndicators(unittest.TestCase):
def setUp(self):
@@ -1053,7 +1086,7 @@ class TestIndicators(unittest.TestCase):
def testIndicatorMovement(self):
# Create a two character indicator over "BC" in "aBCd" and ensure that it doesn't
- # leak onto surrounding characters when insertions made at either end but
+ # leak onto surrounding characters when insertions made at either end but
# insertion inside indicator does extend length
self.ed.InsertText(0, b"aBCd")
self.ed.IndicatorCurrent = 3
@@ -1398,7 +1431,7 @@ class TestMultiSelection(unittest.TestCase):
# 3 lines of 3 characters
t = b"xxx\nxxx\nxxx"
self.ed.AddText(len(t), t)
-
+
def textOfSelection(self, n):
self.ed.TargetStart = self.ed.GetSelectionNStart(n)
self.ed.TargetEnd = self.ed.GetSelectionNEnd(n)
@@ -1605,7 +1638,7 @@ class TestMultiSelection(unittest.TestCase):
self.assertEquals(self.ed.Selections, 2)
self.assertEquals(self.textOfSelection(0), texts[1])
self.assertEquals(self.textOfSelection(1), texts[0])
-
+
def selectionRepresentation(self, n):
anchor = (self.ed.GetSelectionNAnchor(0), self.ed.GetSelectionNAnchorVirtualSpace(0))
caret = (self.ed.GetSelectionNCaret(0), self.ed.GetSelectionNCaretVirtualSpace(0))