plugins/org.symbian.tools.tmw.debug/src/org/symbian/tools/tmw/debug/internal/model/SymbianDebugModelPresentation.java
changeset 471 06589bf52fa7
child 484 f5df819c1852
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.debug/src/org/symbian/tools/tmw/debug/internal/model/SymbianDebugModelPresentation.java	Mon Aug 23 09:55:57 2010 -0700
@@ -0,0 +1,172 @@
+package org.symbian.tools.tmw.debug.internal.model;
+
+import java.util.Collection;
+
+import org.chromium.debug.core.model.Value;
+import org.chromium.sdk.JsValue;
+import org.chromium.sdk.JsVariable;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.ILineBreakpoint;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.debug.ui.IValueDetailListener;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.ide.FileStoreEditorInput;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.wst.jsdt.core.JavaScriptCore;
+import org.eclipse.wst.jsdt.internal.ui.javaeditor.JarEntryEditorInput;
+import org.eclipse.wst.jsdt.ui.JavaScriptUI;
+
+@SuppressWarnings("restriction")
+public class SymbianDebugModelPresentation extends LabelProvider implements
+		IDebugModelPresentation {
+    private static final int DETAILS_DEPTH = 2;
+
+	public void setAttribute(String attribute, Object value) {
+	}
+
+	@Override
+	public Image getImage(Object element) {
+		// use default image
+		return null;
+	}
+
+	@Override
+	public String getText(Object element) {
+		// use default label text
+		return null;
+	}
+
+    public void computeDetail(IValue value, IValueDetailListener listener) {
+        String detail = ""; //$NON-NLS-1$
+        if (value instanceof Value) {
+            // Avoid quoting string JavaScript values by getting the value
+            // string
+            // from the underlying JsValue.
+            final JsValue jsValue = ((Value) value).getJsValue();
+            detail = printJSON(jsValue, 0);
+        }
+
+        listener.detailComputed(value, detail);
+    }
+
+    private String printJSON(final JsValue value, int depth) {
+        if (depth < DETAILS_DEPTH) {
+            switch (value.getType()) {
+            case TYPE_OBJECT:
+                return printObject(value, depth);
+            case TYPE_ARRAY:
+                return printArray(value, depth);
+            }
+        }
+        if (depth > 0) {
+            if (value.getType() == JsValue.Type.TYPE_STRING) {
+                return "\"" + value.getValueString() + "\"";
+            }
+        }
+        return value.getValueString();
+    }
+
+    private String printArray(JsValue value, int depth) {
+        final StringBuilder builder = new StringBuilder("{ ");
+        String sep = "";
+
+        Collection<? extends JsVariable> properties = value.asObject().asArray().toSparseArray().values();
+
+        for (JsVariable jsVariable : properties) {
+            builder.append(sep).append(printJSON(jsVariable.getValue(), depth + 1));
+            sep = ", ";
+        }
+
+        builder.append(" }");
+        return builder.toString();
+    }
+
+    private String printObject(final JsValue value, final int depth) {
+        final StringBuilder builder = new StringBuilder("{ ");
+
+        String sep = "";
+
+        Collection<? extends JsVariable> properties = value.asObject().getProperties();
+        for (JsVariable jsVariable : properties) {
+            builder.append(sep).append(jsVariable.getName()).append(" : ");
+            builder.append(printJSON(jsVariable.getValue(), depth + 1));
+            sep = ", ";
+        }
+
+        builder.append(" }");
+        return builder.toString();
+    }
+
+    public IEditorInput getEditorInput(Object element) {
+		return toEditorInput(element);
+	}
+
+    public static IEditorInput toEditorInput(Object element) {
+		if (element instanceof IFile) {
+			return new FileEditorInput((IFile) element);
+		}
+		if (element instanceof IFileStore) {
+			return new FileStoreEditorInput((IFileStore) element);
+		}
+        if (element instanceof IStorage) {
+            return new JarEntryEditorInput((IStorage) element);
+        }
+
+		if (element instanceof ILineBreakpoint) {
+			return new FileEditorInput((IFile) ((ILineBreakpoint) element)
+					.getMarker().getResource());
+		}
+
+		return null;
+	}
+
+	public String getEditorId(IEditorInput input, Object element) {
+		if (input instanceof IFileEditorInput) {
+			IFile file;
+			if (element instanceof IFile) {
+				file = (IFile) element;
+			} else if (element instanceof IBreakpoint) {
+				IBreakpoint breakpoint = (IBreakpoint) element;
+				IResource resource = breakpoint.getMarker().getResource();
+				// Can the breakpoint resource be folder or project? Better
+				// check for it.
+				if (resource instanceof IFile == false) {
+					return null;
+				}
+				file = (IFile) resource;
+			} else {
+				return null;
+			}
+
+			// Pick the editor based on the file extension, taking user
+			// preferences into account.
+			try {
+				return IDE.getEditorDescriptor(file).getId();
+			} catch (PartInitException e) {
+				// TODO(peter.rybin): should it really be the default case?
+				// There might be no virtual project.
+				return null;
+			}
+		} else {
+            if (element instanceof IStorage) {
+                IStorage store = (IStorage) element;
+                if (JavaScriptCore.isJavaScriptLikeFileName(store.getName())) {
+                    return JavaScriptUI.ID_CU_EDITOR;
+				} else {
+					return "org.eclipse.wst.html.core.htmlsource.source";
+				}
+			}
+		}
+		return null;
+	}
+}