Blob Blame History Raw
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