// Copyright (c) 2009-2010 by the projectusus.org contributors // This software is released under the terms and conditions // of the Eclipse Public License (EPL) 1.0. // See http://www.eclipse.org/legal/epl-v10.html for details. package org.projectusus.ui.internal.hotspots.pages; import static java.util.Arrays.asList; import org.eclipse.core.commands.NotHandledException; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.part.Page; import org.eclipse.ui.services.IServiceLocator; import org.projectusus.core.util.Defect; import org.projectusus.ui.internal.AnalysisDisplayEntry; import org.projectusus.ui.internal.DisplayHotspot; import org.projectusus.ui.internal.hotspots.commands.AbstractOpenHotspotHandler; import org.projectusus.ui.viewer.UsusTreeViewer; public class HotspotsPage extends Page implements IHotspotsPage { private final IServiceLocator serviceLocator; private final AnalysisDisplayEntry entry; private UsusTreeViewer<DisplayHotspot<?>> viewer; private ViewerComparator comparator; public HotspotsPage( IServiceLocator serviceLocator, AnalysisDisplayEntry entry ) { super(); this.serviceLocator = serviceLocator; this.entry = entry; } public boolean isInitialized() { return viewer != null; } protected IStructuredContentProvider createContentProvider() { return new HotspotsCP(); } private void createViewer( Composite parent ) { HotspotsColumnDesc[] columnDescs = HotspotsColumnDesc.getColumnDescs( entry.getLocationType() ); viewer = new UsusTreeViewer<DisplayHotspot<?>>( parent, columnDescs ); viewer.setLabelProvider( new HotspotsLP( asList( columnDescs ) ) ); viewer.setContentProvider( createContentProvider() ); comparator = new ViewerComparator() { @Override public int compare( @SuppressWarnings( "unused" ) Viewer viewer1, Object e1, Object e2 ) { return ((DisplayHotspot<?>)e1).compareTo( (DisplayHotspot<?>)e2 ); } }; viewer.setComparator( comparator ); } protected void initOpenListener() { viewer.addOpenListener( new IOpenListener() { public void open( @SuppressWarnings( "unused" ) OpenEvent event ) { IHandlerService handlerService = (IHandlerService)serviceLocator.getService( IHandlerService.class ); try { handlerService.executeCommand( AbstractOpenHotspotHandler.COMMAND_ID, null ); } catch( NotHandledException ignore ) { // to be ignored } catch( Exception exception ) { throw new Defect( exception ); } } } ); } public void setInput( AnalysisDisplayEntry entry ) { TreeSelection selection = (TreeSelection)viewer.getSelection(); viewer.setInput( entry ); if( !selection.isEmpty() ) { Object selectedDisplayHotspot = selection.getFirstElement(); if( selectedDisplayHotspot instanceof DisplayHotspot<?> ) { selectCodeProportionInTree( (DisplayHotspot<?>)selectedDisplayHotspot ); } } } @Override public void createControl( Composite parent ) { createViewer( parent ); initOpenListener(); } @Override public Control getControl() { return viewer.getControl(); } @Override public void setFocus() { if( viewer != null && !viewer.getControl().isDisposed() ) { viewer.getControl().setFocus(); } } public void refresh() { setInput( entry ); } public boolean matches( AnalysisDisplayEntry otherEntry ) { return entry.isSameKindAs( otherEntry ); } public void resetSort() { viewer.setComparator( comparator ); viewer.resetColumnSorting(); } public ISelectionProvider getSelectionProvider() { return viewer; } public String getDescription() { return entry.getDescription(); } private void selectCodeProportionInTree( DisplayHotspot<?> hotspot ) { for( DisplayHotspot<?> currrent : entry.getHotspots() ) { if( currrent.getCurrentOrOldHotspot().equals( hotspot.getCurrentOrOldHotspot() ) ) { viewer.setSelection( createTreeSelection( currrent ) ); return; } } } private TreeSelection createTreeSelection( Object... elements ) { return new TreeSelection( new TreePath( elements ) ); } }