/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * 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: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.inspector.ui.views; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeNode; import org.eclipse.jface.viewers.TreeNodeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jubula.client.inspector.ui.model.InspectedComponent; import org.eclipse.jubula.client.inspector.ui.model.InspectorTreeNode; import org.eclipse.jubula.client.inspector.ui.provider.labelprovider.InspectorLabelProvider; import org.eclipse.jubula.client.ui.constants.ContextHelpIds; import org.eclipse.jubula.client.ui.views.NonSortedPropertySheetPage; import org.eclipse.jubula.tools.internal.objects.IComponentIdentifier; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.ui.views.properties.IPropertySheetPage; /** * Displays content describing a GEF component. * * @author BREDEX GmbH * @created Jun 10, 2009 */ public class InspectorView extends ViewPart { /** the ID of this view */ public static final String VIEW_ID = "org.eclipse.jubula.client.inspector.views.inspectorView"; //$NON-NLS-1$ /** the tree viewer showing information collected from the Inspector */ private TreeViewer m_treeViewer; /** informs the part when the inspected component has changed */ private PropertyChangeListener m_propChangeListener = new PropertyChangeListener() { @SuppressWarnings("synthetic-access") public void propertyChange(PropertyChangeEvent evt) { final TreeNode[] input = convertToViewerModel( InspectedComponent.getInstance().getCompId()); Display display = PlatformUI.getWorkbench().getDisplay(); display.syncExec(new Runnable() { public void run() { m_treeViewer.setInput(input); m_treeViewer.expandAll(); } }); if (input != null) { display.syncExec(new Runnable() { public void run() { TreeNode element = input[0]; while (element != null && element.hasChildren()) { element = element.getChildren()[0]; } if (element != null) { m_treeViewer.setSelection( new StructuredSelection(element)); } } }); } } }; /** * * {@inheritDoc} */ public void createPartControl(Composite parent) { m_treeViewer = new TreeViewer(parent); m_treeViewer.setContentProvider(new TreeNodeContentProvider()); m_treeViewer.setLabelProvider(new InspectorLabelProvider()); getViewSite().setSelectionProvider(m_treeViewer); m_treeViewer.setInput(convertToViewerModel( InspectedComponent.getInstance().getCompId())); m_treeViewer.expandAll(); InspectedComponent.getInstance().addPropertyChangeListener( m_propChangeListener); // Create menu manager and menu MenuManager menuMgr = new MenuManager(); Menu menu = menuMgr.createContextMenu(m_treeViewer.getTree()); m_treeViewer.getTree().setMenu(menu); // Register menu for extension. getViewSite().registerContextMenu(VIEW_ID, menuMgr, m_treeViewer); PlatformUI.getWorkbench().getHelpSystem().setHelp( m_treeViewer.getControl(), ContextHelpIds.INSPECTOR_VIEW); } /** * * {@inheritDoc} */ public void setFocus() { m_treeViewer.getTree().setFocus(); } /** {@inheritDoc} */ public Object getAdapter(Class key) { if (key.equals(IPropertySheetPage.class)) { return new NonSortedPropertySheetPage(); } return super.getAdapter(key); } /** * {@inheritDoc} */ public void dispose() { InspectedComponent.getInstance().removePropertyChangeListener( m_propChangeListener); super.dispose(); } /** * Creates and returns an Inspector viewer model corresponding to the * given component identifier. * * @param compId The component identifier for which to generate a * viewer model. * @return the top-level elements of the converted viewer model. */ private InspectorTreeNode[] convertToViewerModel( IComponentIdentifier compId) { if (compId == null) { return null; } List<String> hierarchyList = compId.getHierarchyNames(); if (hierarchyList == null || hierarchyList.isEmpty()) { return null; } String [] hierarchy = hierarchyList.toArray(new String[hierarchyList.size()]); InspectorTreeNode rootNode = new InspectorTreeNode(hierarchy); TreeNode node = rootNode; // Start iteration at index 1 because we already have the first element for (int i = 1; i < hierarchy.length; i++) { String [] childData = new String [hierarchy.length - i]; System.arraycopy(hierarchy, i, childData, 0, childData.length); TreeNode child = new InspectorTreeNode(childData); TreeNode [] nodeChildren = node.getChildren(); if (nodeChildren == null) { nodeChildren = new TreeNode[0]; } TreeNode [] newNodeChildren = new TreeNode [nodeChildren.length + 1]; System.arraycopy(nodeChildren, 0, newNodeChildren, 0, nodeChildren.length); newNodeChildren[newNodeChildren.length - 1] = child; node.setChildren(newNodeChildren); child.setParent(node); node = child; } return new InspectorTreeNode [] {rootNode}; } }