From 3ee6618da1282970ebb386f622c9c5b89ae0ab0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=A1clav=20Kadl=C4=8D=C3=ADk?= Date: Fri, 2 Jun 2017 10:24:02 +0200 Subject: [PATCH] Bug 517358 - RFE: method to read TextCanvas content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../textcanvas/AbstractTextCanvasModel.java | 54 +++++++++++++++---- .../terminal/textcanvas/ITextCanvasModel.java | 11 ++++ .../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 799101486e8..f57b8277b8d 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$ + // + int i = text.length() - 1; + while (i >= 0 && text.charAt(i) == '\000') { + i--; + } + text = text.substring(0, i + 1); + // + // 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$ - // - int i = text.length() - 1; - while (i >= 0 && text.charAt(i) == '\000') { - i--; - } - text = text.substring(0, i + 1); - // - // 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 1891c6079f3..2ecb84a30f7 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. + * + *

Individual lines of the returned text are separated by '\n'. + * + *

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 a8b950820c1..02c60640634 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. + * + *

Individual lines of the returned text are separated by '\n'. + * + *

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; }