add content display to debug view.

The debug view now additionally displays the content around the caret.

Change-Id: Ibee9d8f7622f59ceca8502110fe72da35a97e92f
Signed-off-by: Carsten Hiesserich <carsten.hie@gmail.com>
diff --git a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/views/DebugViewPage.java b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/views/DebugViewPage.java
index 7c70e0b..9cc9897 100644
--- a/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/views/DebugViewPage.java
+++ b/org.eclipse.vex.ui/src/org/eclipse/vex/ui/internal/views/DebugViewPage.java
@@ -14,6 +14,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
+import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.swt.SWT;
@@ -45,6 +46,8 @@
 import org.eclipse.vex.core.internal.widget.IBoxFilter;
 import org.eclipse.vex.core.internal.widget.IHostComponent;
 import org.eclipse.vex.core.internal.widget.swt.VexWidget;
+import org.eclipse.vex.core.provisional.dom.ContentRange;
+import org.eclipse.vex.core.provisional.dom.IDocument;
 import org.eclipse.vex.ui.internal.editor.VexEditor;
 
 /**
@@ -135,11 +138,14 @@
 
 	private Label loadingLabel;
 
+	private Composite content;
 	private Table table;
+	private Table textTable;
 	private TableItem documentItem;
 	private TableItem viewportItem;
 	private TableItem boxItem;
 	private TableItem caretOffsetItem;
+	private TableItem caretOffsetContentItem;
 	private TableItem caretAbsItem;
 	private TableItem caretRelItem;
 	private TableItem mouseAbsItem;
@@ -166,41 +172,43 @@
 		final GridLayout layout = new GridLayout();
 		layout.numColumns = 1;
 		composite.setLayout(layout);
-		GridData gd;
 
 		final ScrolledComposite sc = new ScrolledComposite(composite, SWT.V_SCROLL);
-		table = new Table(sc, SWT.NONE);
-		table.setHeaderVisible(true);
-		sc.setContent(table);
 		sc.setExpandHorizontal(true);
 		sc.setExpandVertical(true);
-		gd = new GridData();
-		gd.grabExcessHorizontalSpace = true;
-		gd.horizontalAlignment = GridData.FILL;
-		sc.setLayoutData(gd);
+
+		final GridDataFactory dataFactory = GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).hint(SWT.DEFAULT, 50).grab(true, true);
+		dataFactory.applyTo(sc);
+
+		content = new Composite(sc, SWT.NONE);
+		final GridLayout contentLayout = new GridLayout(1, false);
+		content.setLayout(contentLayout);
+
+		sc.setContent(content);
+
+		table = new Table(content, SWT.NO_SCROLL);
+		table.setHeaderVisible(true);
+		final GridData tableGrid = new GridData();
+		tableGrid.grabExcessHorizontalSpace = true;
+		tableGrid.horizontalAlignment = GridData.FILL;
+		table.setLayoutData(tableGrid);
 
 		TableColumn column;
 		column = new TableColumn(table, SWT.LEFT);
 		column.setText("Item");
-		column = new TableColumn(table, SWT.RIGHT);
+		column = new TableColumn(table, SWT.LEFT);
 		column.setText("X");
-		column = new TableColumn(table, SWT.RIGHT);
+		column = new TableColumn(table, SWT.LEFT);
 		column.setText("Y");
 		column = new TableColumn(table, SWT.RIGHT);
 		column.setText("Width");
 		column = new TableColumn(table, SWT.RIGHT);
 		column.setText("Height");
 
-		table.addControlListener(controlListener);
-
 		documentItem = new TableItem(table, SWT.NONE);
 		documentItem.setText(0, "Document");
 		viewportItem = new TableItem(table, SWT.NONE);
 		viewportItem.setText(0, "Viewport");
-		boxItem = new TableItem(table, SWT.NONE);
-		boxItem.setText(0, "Current Box");
-		caretOffsetItem = new TableItem(table, SWT.NONE);
-		caretOffsetItem.setText(0, "Caret Offset");
 		caretAbsItem = new TableItem(table, SWT.NONE);
 		caretAbsItem.setText(0, "Caret Abs.");
 		caretRelItem = new TableItem(table, SWT.NONE);
@@ -210,6 +218,31 @@
 		mouseRelItem = new TableItem(table, SWT.NONE);
 		mouseRelItem.setText(0, "Mouse Rel.");
 
+		textTable = new Table(content, SWT.NO_SCROLL);
+		textTable.setHeaderVisible(true);
+		final GridData textTableGrid = new GridData();
+		textTableGrid.grabExcessHorizontalSpace = true;
+		textTableGrid.horizontalAlignment = GridData.FILL;
+		textTable.setLayoutData(textTableGrid);
+		textTable.setSize(textTable.computeSize(SWT.DEFAULT, 300));
+
+		textTable.addControlListener(controlListener);
+
+		column = new TableColumn(textTable, SWT.LEFT);
+		column.setText("Item");
+		column = new TableColumn(textTable, SWT.LEFT);
+		column.setText("Value");
+
+		caretOffsetItem = new TableItem(textTable, SWT.NONE);
+		caretOffsetItem.setText(0, "Caret Offset");
+		boxItem = new TableItem(textTable, SWT.NONE);
+		boxItem.setText(0, "Current Box");
+		caretOffsetContentItem = new TableItem(textTable, SWT.NONE);
+		caretOffsetContentItem.setText(0, "Content at Caret");
+
+		content.setSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+		sc.setMinSize(content.computeSize(SWT.DEFAULT, SWT.DEFAULT));
+
 		final Button updateButton = new Button(composite, SWT.PUSH);
 		updateButton.setText("Refresh");
 		updateButton.addSelectionListener(new SelectionListener() {
@@ -226,7 +259,6 @@
 		vexWidget.addMouseMoveListener(mouseMoveListener);
 
 		repopulate();
-
 	}
 
 	private final ISelectionChangedListener selectionListener = new ISelectionChangedListener() {
@@ -243,16 +275,24 @@
 		}
 
 		public void controlResized(final ControlEvent e) {
-			final int width = table.getSize().x;
-			final int numWidth = Math.round(width * 0.125f);
-			table.getColumn(0).setWidth(width / 2);
-			table.getColumn(1).setWidth(numWidth);
-			table.getColumn(2).setWidth(numWidth);
-			table.getColumn(3).setWidth(numWidth);
-			table.getColumn(4).setWidth(numWidth);
+			resizeTables();
 		}
 	};
 
+	private void resizeTables() {
+		table.getColumn(0).pack();
+		int width = table.getSize().x - table.getColumn(0).getWidth();
+		final int numWidth = Math.round(width / 4);
+		table.getColumn(1).setWidth(numWidth);
+		table.getColumn(2).setWidth(numWidth);
+		table.getColumn(3).setWidth(numWidth);
+		table.getColumn(4).setWidth(numWidth);
+
+		textTable.getColumn(0).pack();
+		width = textTable.getSize().x - textTable.getColumn(0).getWidth();
+		textTable.getColumn(1).setWidth(width);
+	}
+
 	private final MouseMoveListener mouseMoveListener = new MouseMoveListener() {
 
 		public void mouseMove(final MouseEvent e) {
@@ -292,6 +332,7 @@
 		setFromInnermostBox(boxItem, getInnermostBox());
 		final Rectangle viewport = getViewport();
 		caretOffsetItem.setText(1, Integer.toString(impl.getCaretOffset()));
+		caretOffsetContentItem.setText(1, getContent());
 		setItemFromRect(viewportItem, viewport);
 		setItemFromRect(caretAbsItem, getCaretBounds());
 		setItemRel(caretRelItem, viewport, getCaretBounds());
@@ -318,6 +359,23 @@
 		}
 	}
 
+	private String getContent() {
+		final int offset = impl.getCaretOffset();
+		final IDocument doc = impl.getDocument();
+		final int len = 8;
+
+		final StringBuilder result = new StringBuilder();
+		final ContentRange range = new ContentRange(offset - len, offset + len).intersection(doc.getRange());
+		final String content = doc.getContent().getRawText(range);
+
+		final int caretIndex = offset - range.getStartOffset();
+
+		result.append(content.substring(0, caretIndex).replace("\0", "#"));
+		result.append("|");
+		result.append(content.substring(caretIndex, content.length()).replace("\0", "#"));
+		return result.toString();
+	}
+
 	private static void setItemFromRect(final TableItem item, final Rectangle rect) {
 		item.setText(X, Integer.toString(rect.getX()));
 		item.setText(Y, Integer.toString(rect.getY()));
@@ -331,4 +389,5 @@
 		item.setText(WIDTH, Integer.toString(rect.getWidth()));
 		item.setText(HEIGHT, Integer.toString(rect.getHeight()));
 	}
+
 }
\ No newline at end of file