| /******************************************************************************* |
| * 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(); |
| } |
| } |
| } |