From 3ee6618da1282970ebb386f622c9c5b89ae0ab0b Mon Sep 17 00:00:00 2001
From: Václav Kadlčík
Date: Fri, 2 Jun 2017 10:24:02 +0200
Subject: Bug 517358 - RFE: method to read TextCanvas content
Teach TextCanvas to provide all the text contained: getAllText().
The actual change takes place on the level of ITextCanvasModel
(interface) and AbstractTextCanvasModel (implementation); TextCanvas
just redirects the request there.
One bit of the existing code has been refactored: part of
AbstractTextCanvasModel.extractSelectedText() has been extracted
into a separate method - scrubLine() - so it can be reused in the
new code.
The primary (and probably the only one) use case of this new
extension is test automation: SWTBot- or Red Deer-based tests can
read content of TextCanvas instances and verify that they contain
what's expected, e.g. output of Docker containers or gdb sessions.
Change-Id: I92092c0f9837639d13d6bc32ae5b47acd24c54c1
Signed-off-by: Václav Kadlčík <vkadlcik@redhat.com>
---
.../textcanvas/AbstractTextCanvasModel.java | 54 +++++++++++++++++-----
.../terminal/textcanvas/ITextCanvasModel.java | 11 +++++
.../internal/terminal/textcanvas/TextCanvas.java | 16 +++++++
3 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java b/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java
index 7991014..f57b827 100644
--- a/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java
+++ b/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/AbstractTextCanvasModel.java
@@ -277,6 +277,22 @@ abstract public class AbstractTextCanvasModel implements ITextCanvasModel {
public String getSelectedText() {
return fCurrentSelection;
}
+
+ // helper to sanitize text copied out of a snapshot
+ private static String scrubLine(String text) {
+ // get rid of the empty space at the end of the lines
+ // text=text.replaceAll("\000+$",""); //$NON-NLS-1$//$NON-NLS-2$
+ // <J2ME-CDC-1.1 version>
+ int i = text.length() - 1;
+ while (i >= 0 && text.charAt(i) == '\000') {
+ i--;
+ }
+ text = text.substring(0, i + 1);
+ // </J2ME-CDC-1.1 version>
+ // null means space
+ return text.replace('\000', ' ');
+ }
+
/**
* Calculates the currently selected text
* @return the currently selected text
@@ -294,17 +310,7 @@ abstract public class AbstractTextCanvasModel implements ITextCanvasModel {
text=text.substring(0, Math.min(fSelectionEndColumn+1,text.length()));
if(line==fSelectionStartLine)
text=text.substring(Math.min(fSelectionStartCoumn,text.length()));
- // get rid of the empty space at the end of the lines
- // text=text.replaceAll("\000+$",""); //$NON-NLS-1$//$NON-NLS-2$
- // <J2ME-CDC-1.1 version>
- int i = text.length() - 1;
- while (i >= 0 && text.charAt(i) == '\000') {
- i--;
- }
- text = text.substring(0, i + 1);
- // </J2ME-CDC-1.1 version>
- // null means space
- text=text.replace('\000', ' ');
+ text=scrubLine(text);
} else {
text=""; //$NON-NLS-1$
}
@@ -345,4 +351,30 @@ abstract public class AbstractTextCanvasModel implements ITextCanvasModel {
}
}
+ @Override
+ public String getAllText() {
+
+ // Make a snapshot of the whole text data
+ ITerminalTextDataSnapshot snapshot = fSnapshot.getTerminalTextData().makeSnapshot();
+ snapshot.updateSnapshot(true);
+ snapshot.detach();
+
+ // Extract the data
+ StringBuffer sb = new StringBuffer();
+ for (int line = 0; line < snapshot.getHeight(); line++) {
+ char[] chars = snapshot.getChars(line);
+ String text;
+ if (chars != null) {
+ text = scrubLine(new String(chars)); // take care of NULs
+ } else {
+ text = ""; //$NON-NLS-1$ null arrays represent empty lines
+ }
+ sb.append(text);
+ // terminate lines except (1) the last one and (2) wrapped lines
+ if ((line < snapshot.getHeight() - 1) && !snapshot.isWrappedLine(line)) {
+ sb.append('\n');
+ }
+ }
+ return sb.toString();
+ }
}
\ No newline at end of file
diff --git a/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java b/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java
index 1891c60..2ecb84a 100644
--- a/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java
+++ b/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/ITextCanvasModel.java
@@ -81,4 +81,15 @@ public interface ITextCanvasModel {
boolean hasLineSelection(int line);
String getSelectedText();
+
+ /**
+ * Collect and return all text present in the model.
+ *
+ * <p>Individual lines of the returned text are separated by '\n'.
+ *
+ * <p>The method is primarily designed for test automation.
+ *
+ * @since 4.3
+ */
+ String getAllText();
}
\ No newline at end of file
diff --git a/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java b/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
index a8b9508..02c6064 100644
--- a/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
+++ b/plugins/org.eclipse.tm.terminal.control/src/org/eclipse/tm/internal/terminal/textcanvas/TextCanvas.java
@@ -382,6 +382,22 @@ public class TextCanvas extends GridCanvas {
fCellCanvasModel.setSelection(-1,-1,-1,-1);
}
+ /**
+ * Collect and return all text present in the widget.
+ *
+ * <p>Individual lines of the returned text are separated by '\n'.
+ *
+ * <p>The method is primarily designed for test automation. Tests need
+ * to check what happens in a terminal (e.g. if and how a CDT Debugger
+ * Console reacts in a GDB session) and this method allows to read the
+ * text present in the terminal.
+ *
+ * @since 4.3
+ */
+ public String getAllText() {
+ return fCellCanvasModel.getAllText();
+ }
+
public boolean isEmpty() {
return false;
}
--
cgit v1.1