blob: 5d13f12092353e45b570c7908709d0b11beaa6d4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hisashi MIYASHITA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.ai.navigator.views;
import org.eclipse.actf.ai.fennec.treemanager.ITreeItem;
import org.eclipse.actf.ai.navigator.IManipulator;
import org.eclipse.actf.ai.navigator.Messages;
import org.eclipse.actf.ai.navigator.NavigatorPlugin;
import org.eclipse.actf.ai.navigator.ui.ModeContribution;
import org.eclipse.actf.util.vocab.Vocabulary;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
public class NavigatorTreeView extends ViewPart {
private TreeViewer treeViewer;
private TableViewer tableViewer;
private boolean disposed;
static class ITreeItemLabelProvider extends LabelProvider {
@Override
public Image getImage(Object element) {
// TODO
return null;
}
@Override
public String getText(Object element) {
ITreeItem item = (ITreeItem) element;
String r = item.getUIString();
if (r.length() > 0)
return r;
r = item.getNodeString();
if (r == null)
return ""; //$NON-NLS-1$
return r;
}
}
static class ITreeItemContentProvider extends ArrayContentProvider implements ITreeContentProvider {
public Object[] getChildren(Object parentElement) {
ITreeItem item = (ITreeItem) parentElement;
return item.getChildItems();
}
public Object getParent(Object element) {
ITreeItem item = (ITreeItem) element;
return item.getParent();
}
public boolean hasChildren(Object element) {
ITreeItem item = (ITreeItem) element;
ITreeItem[] childItems = item.getChildItems();
if ((childItems != null) && (childItems.length > 0))
return true;
return false;
}
@Override
public Object[] getElements(Object input) {
return getChildren(input);
}
}
static class TreeItemDetailsContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
private String calcPath(ITreeItem item) {
StringBuffer ret = new StringBuffer();
Object o = item.getBaseNode();
if (!(o instanceof Node))
return "#none"; //$NON-NLS-1$
for (Node n = (Node) o; n != null; n = n.getParentNode()) {
if (n instanceof Document)
break;
ret.insert(0, n.getNodeName());
ret.insert(0, "/"); //$NON-NLS-1$
}
return ret.toString();
}
private String calcID(ITreeItem item) {
Object o = item.getBaseNode();
if (!(o instanceof Element))
return ""; //$NON-NLS-1$
Element e = (Element) o;
return e.getAttribute("id"); //$NON-NLS-1$
}
private String formatStringInHex(String str) {
StringBuffer ret = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
ret.append(Integer.toHexString(c));
ret.append(" "); //$NON-NLS-1$
}
return ret.toString();
}
public Object[] getElements(Object obj) {
ITreeItem item = (ITreeItem) obj;
String[] uiStrings = { "UIString", item.getUIString() }; //$NON-NLS-1$
String[] uiStringsInHex = { "UIString (HEX)", formatStringInHex(item.getUIString()) }; //$NON-NLS-1$
String[] nodeStrings = { "Node", item.getNodeString() }; //$NON-NLS-1$
String[] path = { "Path", calcPath(item) }; //$NON-NLS-1$
String[] id = { "ID", calcID(item) }; //$NON-NLS-1$
String[] hasContent = { "hasContent", "" + Vocabulary.hasContent().eval(item)}; //$NON-NLS-1$ //$NON-NLS-2$
String[] heading = { "Heading", "" + item.getHeadingLevel() }; //$NON-NLS-1$ //$NON-NLS-2$
String[] nodeObject = { "NodeObject", "" + item.getBaseNode() }; //$NON-NLS-1$ //$NON-NLS-2$
String[] isInputable = { "isInputable", "" + item.isInputable() }; //$NON-NLS-1$ //$NON-NLS-2$
String[] isConnectable = { "isConnectable", "" + Vocabulary.isConnectable().eval(item) }; //$NON-NLS-1$ //$NON-NLS-2$
return new Object[] { uiStrings, uiStringsInHex, nodeStrings, path, id, hasContent, heading, nodeObject,
isInputable, isConnectable };
}
}
static class TreeItemDetailsLabelProvider extends LabelProvider implements ITableLabelProvider {
public String getColumnText(Object obj, int index) {
String[] prop = (String[]) obj;
if (index >= prop.length)
return null;
return prop[index];
}
public Image getColumnImage(Object obj, int index) {
return getImage(obj);
}
@Override
public Image getImage(Object obj) {
// TODO
return null;
}
}
class TreeItemViewerDoubleClickListener implements IDoubleClickListener {
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
Object obj = sel.getFirstElement();
tableViewer.setInput(obj);
}
}
@Override
public void dispose() {
super.dispose();
disposed = true;
}
void initView(Composite parent) {
Layout layout = new FillLayout(SWT.VERTICAL);
parent.setLayout(layout);
SashForm sash = new SashForm(parent, SWT.VERTICAL);
treeViewer = new TreeViewer(sash);
treeViewer.setLabelProvider(new ITreeItemLabelProvider());
treeViewer.setContentProvider(new ITreeItemContentProvider());
treeViewer.addDoubleClickListener(new TreeItemViewerDoubleClickListener());
// treeViewer.setAutoExpandLevel(0);
tableViewer = new TableViewer(sash, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableColumn tableColumnProperty = new TableColumn(table, SWT.LEFT);
tableColumnProperty.setText(Messages.getString("NavigatorTreeView.property")); //$NON-NLS-1$
tableColumnProperty.setWidth(70);
TableColumn tableColumnValue = new TableColumn(table, SWT.LEFT);
tableColumnValue.setText(Messages.getString("NavigatorTreeView.value")); //$NON-NLS-1$
tableColumnValue.setWidth(100);
tableViewer.setLabelProvider(new TreeItemDetailsLabelProvider());
tableViewer.setContentProvider(new TreeItemDetailsContentProvider());
sash.setWeights(new int[]{90, 10});
}
public NavigatorTreeView() {
super();
}
@Override
public void createPartControl(Composite parent) {
initView(parent);
NavigatorPlugin.getDefault().setNavigatorTreeView(this);
}
@Override
public void setFocus() {
}
private ITreeItem getRoot(ITreeItem item) {
for (ITreeItem parent = item.getParent(); parent != null; parent = item.getParent()) {
item = parent;
}
return item;
}
public void showItem(ITreeItem item) {
if (disposed) return;
if (treeViewer.getControl().isDisposed()) return;
treeViewer.setInput(getRoot(item));
treeViewer.reveal(item);
ISelection is = new StructuredSelection(item);
treeViewer.setSelection(is, true);
}
public void clearItem() {
if (disposed) return;
treeViewer.setInput(null);
}
public boolean isShown() {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IViewPart part = page.findView(NavigatorPlugin.NAVIGATOR_TREE_VIEW_ID);
return part != null;
}
public boolean toggleViewShowing() {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IViewPart part = page.findView(NavigatorPlugin.NAVIGATOR_TREE_VIEW_ID);
if (part != null) {
page.hideView(part);
return false;
} else {
try {
page.showView(NavigatorPlugin.NAVIGATOR_TREE_VIEW_ID);
return true;
} catch (PartInitException e) {
e.printStackTrace();
}
}
return false;
}
private ModeContribution getModeContribution(String id) {
IViewSite viewSite = getViewSite();
IActionBars actionBars = viewSite.getActionBars();
IStatusLineManager manager = actionBars.getStatusLineManager();
return (ModeContribution) manager.find(id);
}
private void update(){
IViewSite viewSite = getViewSite();
IActionBars actionBars = viewSite.getActionBars();
IStatusLineManager manager = actionBars.getStatusLineManager();
manager.update(true);
}
public void setMode(IManipulator.Mode mode) {
ModeContribution mc = getModeContribution(ModeContribution.MODE_CONTRIBUTION_ID);
if (mc != null) {
mc.setMode(mode.name);
update();
}
}
public void showFennecName(String name) {
ModeContribution mc = getModeContribution(ModeContribution.MODE_CONTRIBUTION_ID);
if (mc != null) {
mc.showFennecName(name);
update();
}
}
}