// 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.proportions.cockpit;
import static org.projectusus.ui.internal.AnalysisDisplayModel.displayModel;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.part.ViewPart;
import org.projectusus.ui.internal.AnalysisDisplayModel;
import org.projectusus.ui.internal.IDisplayModelListener;
import org.projectusus.ui.internal.Snapshot;
import org.projectusus.ui.internal.proportions.actions.OpenHotspots;
import org.projectusus.ui.internal.proportions.actions.RefreshHotspots;
import org.projectusus.ui.internal.proportions.actions.ToggleAutoCompute;
import org.projectusus.ui.internal.selection.ExtractCodeProportion;
public class CockpitView extends ViewPart implements ISnapshotView {
private CockpitTreeViewer treeViewer;
private IDisplayModelListener listener;
private SnapshotInfoUpdater updater;
private final CockpitVisibilityListener visibilityListener = new CockpitVisibilityListener( this );
@Override
public void createPartControl( Composite parent ) {
createViewer( parent );
initOpenBehavior();
initActionBars();
initContextMenuBehavior();
initModelListener();
initSnapshotInfoUpdater();
getViewSite().setSelectionProvider( treeViewer );
getSite().getPage().addPartListener( visibilityListener );
}
private void initSnapshotInfoUpdater() {
updater = new SnapshotInfoUpdater( this );
updater.start();
}
public void updateSnapshotInfo( String info ) {
setContentDescription( info );
}
@Override
public void setFocus() {
if( treeViewer != null && !treeViewer.getControl().isDisposed() ) {
treeViewer.getControl().setFocus();
}
}
@Override
public void dispose() {
updater.stop();
displayModel().removeModelListener( listener );
getSite().getPage().removePartListener( visibilityListener );
super.dispose();
}
private void initOpenBehavior() {
treeViewer.addOpenListener( new IOpenListener() {
public void open( @SuppressWarnings( "unused" ) OpenEvent event ) {
new OpenHotspots( treeViewer.getSelection() ).run();
}
} );
}
private void initContextMenuBehavior() {
MenuManager menuManager = new MenuManager( "#PopupMenu" ); //$NON-NLS-1$
menuManager.addMenuListener( new IMenuListener() {
public void menuAboutToShow( IMenuManager manager ) {
manager.add( new OpenHotspots( treeViewer.getSelection() ) );
manager.add( new Separator() );
addContextActionsFor( manager, treeViewer.getSelection() );
}
} );
menuManager.setRemoveAllWhenShown( true );
Menu menu = menuManager.createContextMenu( treeViewer.getTree() );
treeViewer.getTree().setMenu( menu );
getSite().registerContextMenu( menuManager, treeViewer );
}
protected void addContextActionsFor( @SuppressWarnings( "unused" ) IMenuManager manager, ISelection selection ) {
new ExtractCodeProportion( selection ).compute();
}
private void initActionBars() {
IMenuManager menuManager = getViewSite().getActionBars().getMenuManager();
menuManager.add( new ToggleAutoCompute() );
menuManager.add( new Separator( IWorkbenchActionConstants.MB_ADDITIONS ) );
}
private void initModelListener() {
listener = new IDisplayModelListener() {
public void updateCategories( final AnalysisDisplayModel model ) {
Display.getDefault().asyncExec( new Runnable() {
public void run() {
handleDisplayModelChanged( model );
}
} );
}
public void snapshotCreated( final Snapshot snapshot ) {
Display.getDefault().asyncExec( new Runnable() {
public void run() {
updater.update( snapshot );
}
} );
}
};
displayModel().addModelListener( listener );
}
private void handleDisplayModelChanged( AnalysisDisplayModel model ) {
refresh( model );
}
private void refresh( AnalysisDisplayModel model ) {
if( treeViewer != null && !treeViewer.getControl().isDisposed() ) {
ISelection selection = treeViewer.getSelection();
treeViewer.setInput( model );
treeViewer.expandAll();
if( !selection.isEmpty() ) {
treeViewer.selectInTree( ((TreeSelection)selection).getFirstElement() );
new RefreshHotspots( model ).run();
}
}
}
private void createViewer( Composite parent ) {
parent.setLayout( new FillLayout() );
treeViewer = new CockpitTreeViewer( parent );
}
}