JUnitStatusContributionItem.java

package com.codeaffine.extras.jdt.internal.junitstatus;

import org.eclipse.jdt.junit.JUnitCore;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.menus.WorkbenchWindowControlContribution;


public class JUnitStatusContributionItem extends WorkbenchWindowControlContribution {

  private ResourceManager resourceManager;
  private JUnitTestRunListener testRunListener;
  private JUnitProgressBar progressBar;

  @Override
  protected Control createControl( Composite parent ) {
    resourceManager = new LocalResourceManager( JFaceResources.getResources( parent.getDisplay() ) );
    Composite result = createControls( parent );
    layoutControls( result );
    attachContextMenu();
    JUnitCore.addTestRunListener( testRunListener );
    return result;
  }

  @Override
  public void dispose() {
    detachTestRunListener();
    disposeResourceManager();
    super.dispose();
  }

  private Composite createControls( Composite parent ) {
    Composite result = new StatusComposite( parent, SWT.NONE );
    progressBar = new JUnitProgressBar( result );
    testRunListener = new JUnitTestRunListener( resourceManager, new JUnitProgressUI( progressBar ) );
    return result;
  }

  private void layoutControls( Composite composite ) {
    composite.setLayout( GridLayoutFactory.fillDefaults().margins( 3, 0 ).create() );
    progressBar.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
  }

  private void attachContextMenu() {
    attachContextMenu( progressBar );
  }

  private void attachContextMenu( Control control ) {
    MenuManager menuManager = new MenuManager();
    menuManager.add( new ActivateJUnitViewOnFailureAction() );
    menuManager.add( new Separator() );
    menuManager.add( new CloseJUnitStatusAction( getWorkbenchWindow().getWorkbench() ) );
    Menu contextMenu = menuManager.createContextMenu( control );
    control.setMenu( contextMenu );
  }

  private void detachTestRunListener() {
    if( testRunListener != null ) {
      JUnitCore.removeTestRunListener( testRunListener );
      testRunListener.dispose();
      testRunListener = null;
    }
  }

  private void disposeResourceManager() {
    if( resourceManager != null ) {
      resourceManager.dispose();
      resourceManager = null;
    }
  }
}