blob: f20448b530a7f8bd0e8b30084e3daae5af157f85 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.examples.ui.midi.launcher;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.examples.core.midi.launcher.MidiLaunchDelegate;
import org.eclipse.debug.examples.ui.pda.DebugUIPlugin;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugModelPresentation;
import org.eclipse.debug.ui.ILaunchShortcut;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
/**
* Launch shortcut for a MIDI file.
*
* @since 1.0
*/
public class MidiLaunchShortcut implements ILaunchShortcut {
/* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.jface.viewers.ISelection, java.lang.String)
*/
public void launch(ISelection selection, String mode) {
if (selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
if (ss.size() == 1) {
Object element = ss.getFirstElement();
if (element instanceof IFile) {
IFile file = (IFile) element;
ILaunchConfiguration configuration = getConfiguration(file);
if (configuration != null) {
DebugUITools.launch(configuration, mode);
}
}
}
}
}
/**
* Returns a MIDI configuration to use for the given file or
* <code>null</code> to cancel. Creates a new configuration
* if required.
*
* @param file file
* @return associated launch configuration or <code>null</code>
*/
private ILaunchConfiguration getConfiguration(IFile file) {
List candiates = new ArrayList();
try {
ILaunchConfiguration[] configurations = getLaunchManager().getLaunchConfigurations(getLaunchType());
for (int i = 0; i < configurations.length; i++) {
ILaunchConfiguration configuration = configurations[i];
IResource[] resources = configuration.getMappedResources();
if (resources != null && resources.length == 1 &&
resources[0].equals(file)) {
candiates.add(configuration);
}
}
} catch (CoreException e) {
}
if (!candiates.isEmpty()) {
return chooseConfiguration(candiates);
}
return newConfiguration(file);
}
/**
* Returns the MIDI launch configuration type.
*
* @return the MIDI launch configuration type
*/
private ILaunchConfigurationType getLaunchType() {
ILaunchManager manager = getLaunchManager();
ILaunchConfigurationType type = manager.getLaunchConfigurationType(MidiLaunchDelegate.ID_MIDI_LAUNCH_CONFIGURATION_TYPE);
return type;
}
/**
* Returns the launch manager.
*
* @return launch manager
*/
private ILaunchManager getLaunchManager() {
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
return manager;
}
/**
* Returns a configuration from the given collection of configurations that should be launched,
* or <code>null</code> to cancel.
*
* @param configList list of configurations to choose from
* @return configuration to launch or <code>null</code> to cancel
*/
private ILaunchConfiguration chooseConfiguration(List configList) {
if (configList.size() == 1) {
return (ILaunchConfiguration) configList.get(0);
}
IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation();
ElementListSelectionDialog dialog= new ElementListSelectionDialog(DebugUIPlugin.getActiveWorkbenchShell(), labelProvider);
dialog.setElements(configList.toArray());
dialog.setTitle("Select Configuraiton");
dialog.setMessage("&Select an existing configuration:");
dialog.setMultipleSelection(false);
int result = dialog.open();
labelProvider.dispose();
if (result == Window.OK) {
return (ILaunchConfiguration) dialog.getFirstResult();
}
return null;
}
/**
* Creates and returns a new MIDI launch configuration for the
* given file.
*
* @param file MIDI file
* @return new launch configuration
*/
private ILaunchConfiguration newConfiguration(IFile file) {
ILaunchConfigurationType type = getLaunchType();
try {
ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, getLaunchManager().
generateUniqueLaunchConfigurationNameFrom(
"[" + file.getProject().getName() + "] " + file.getName()));
workingCopy.setAttribute(MidiLaunchDelegate.ATTR_MIDI_FILE, file.getFullPath().toString());
workingCopy.setMappedResources(new IResource[]{file});
return workingCopy.doSave();
} catch (CoreException e) {
e.printStackTrace();
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.ui.IEditorPart, java.lang.String)
*/
public void launch(IEditorPart editor, String mode) {
// nothing - currently no editor
}
}