LaunchModeDropDownAction.java

package com.codeaffine.extras.launch.internal.dialog;

import java.util.stream.Stream;

import org.eclipse.debug.core.ILaunchMode;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;

public class LaunchModeDropDownAction extends Action implements IMenuCreator {

  public static final String ID = LaunchModeDropDownAction.class.getName();

  private final LaunchModeSetting launchModeSetting;
  private final LaunchModeAction[] launchModeActions;
  private Menu menu;

  public LaunchModeDropDownAction( LaunchModeSetting launchModeSetting ) {
    super( "&Launch Mode", AS_DROP_DOWN_MENU );
    this.launchModeSetting = launchModeSetting;
    this.launchModeActions = createLaunchModeActions();
    setId( ID );
    setMenuCreator( this );
  }

  @Override
  public Menu getMenu( Menu parent ) {
    dispose();
    menu = new Menu( parent );
    for( LaunchModeAction launchModeAction : launchModeActions ) {
      new ActionContributionItem( launchModeAction ).fill( menu, -1 );
    }
    return menu;
  }

  @Override
  public Menu getMenu( Control parent ) {
    throw new UnsupportedOperationException();
  }

  @Override
  public void dispose() {
    if( menu != null ) {
      menu.dispose();
      menu = null;
    }
  }

  private LaunchModeAction[] createLaunchModeActions() {
    return Stream.of( launchModeSetting.getLaunchManager().getLaunchModes() )
      .map( launchMode -> createLaunchModeAction( launchMode ) )
      .sorted( new LaunchModeActionComparator() )
      .toArray( LaunchModeAction[]::new );
  }

  private LaunchModeAction createLaunchModeAction( ILaunchMode launchMode ) {
    LaunchModeAction result = new LaunchModeAction( launchModeSetting, launchMode );
    result.addPropertyChangeListener( this::launchModeActionPropertyChanged );
    return result;
  }

  private void launchModeActionPropertyChanged( PropertyChangeEvent event ) {
    if( IAction.CHECKED.equals( event.getProperty() ) ) {
      Stream.of( launchModeActions ).forEach( LaunchModeAction::update );
    }
    firePropertyChange( event );
  }

}