blob: f145fbee1273d277b7ef6e8d286e103976f508a7 [file] [log] [blame]
package org.eclipse.debug.internal.ui;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.text.MessageFormat;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.*;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.IWizardContainer;
import org.eclipse.jface.wizard.WizardSelectionPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.help.WorkbenchHelp;
public class LaunchWizardSelectionPage extends WizardSelectionPage {
private static final String PREFIX= "launch_wizard_page.";
private static final String LAUNCHER= PREFIX + "launcher";
private static final String UNKNOWN= PREFIX + "unknown";
private static final String DEFAULT_LAUNCHER= PREFIX + "default_launcher";
private static final String SELECT_ERROR_LAUNCHER= PREFIX + "select_error_launcher";
/**
* Viewer for the launchers
*/
protected TableViewer fLaunchersList;
/**
* List of launchers
*/
protected Object[] fLaunchers;
/**
* Check box for setting default launcher
*/
protected Button fSetAsDefaultLauncher;
/**
* The mode of the launch.
* @see ExecutionAction#getMode()
*/
protected String fMode;
/**
* Indicates whether the project context of the launch has
* changed since the creation of this wizard.
* If the context has changed, the list of launchables
* needs updating.
*/
protected boolean fLaunchablesUpdateNeeded;
/**
* The selected launcher or <code>null</code> if none.
*/
protected ILauncher fLauncher;
/**
* The current project context
*/
protected IProject fProject= null;
/**
* A content provider for the elements list
*/
class ElementsContentProvider implements IStructuredContentProvider {
/**
* @see IContentProvider#inputChanged
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object parent) {
return fLaunchers;
}
}
class SimpleSorter extends ViewerSorter {
/**
* @seeViewerSorter#isSorterProperty(Object, Object)
*/
public boolean isSorterProperty(Object element, Object property) {
return true;
}
}
public LaunchWizardSelectionPage(Object[] allLaunchers, String mode, ILauncher initialLauncher) {
super(DebugUIUtils.getResourceString(PREFIX + "title"));
fLaunchers= allLaunchers;
fMode= mode;
fLauncher = initialLauncher;
}
public void createControl(Composite ancestor) {
Composite root= new Composite(ancestor, SWT.NONE);
GridLayout l= new GridLayout();
l.numColumns= 1;
root.setLayout(l);
createLaunchersGroup(root);
setTitle(DebugUIUtils.getResourceString(PREFIX + "title"));
if (fMode.equals(ILaunchManager.DEBUG_MODE)) {
setImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_WIZBAN_DEBUG));
} else {
setImageDescriptor(DebugUITools.getImageDescriptor(IDebugUIConstants.IMG_WIZBAN_RUN));
}
setControl(root);
WorkbenchHelp.setHelp(
ancestor,
new Object[] { IDebugHelpContextIds.LAUNCHER_SELECTION_WIZARD_PAGE });
}
public void createLaunchersGroup(Composite root) {
fSetAsDefaultLauncher= new Button(root, SWT.CHECK);
Label launchersLabel= new Label(root, SWT.NONE);
launchersLabel.setText(DebugUIUtils.getResourceString(LAUNCHER));
fLaunchersList= new TableViewer(new Table(root, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER)) {
protected void handleDoubleSelect(SelectionEvent event) {
updateSelection(getSelection());
((LaunchWizard)getWizard()).updateDefaultLauncher();
getContainer().showPage(getNextPage());
}
};
Table list= fLaunchersList.getTable();
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
gd.heightHint= 200;
gd.grabExcessVerticalSpace= true;
gd.grabExcessHorizontalSpace= true;
list.setLayoutData(gd);
fLaunchersList.setContentProvider(new ElementsContentProvider());
fLaunchersList.setLabelProvider(new DelegatingModelPresentation());
fLaunchersList.setSorter(new SimpleSorter());
fLaunchersList.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent e) {
if (e.getSelection() instanceof IStructuredSelection) {
IStructuredSelection ss= (IStructuredSelection) e.getSelection();
if (ss.isEmpty()) {
launcherSelected(null);
} else {
launcherSelected((ILauncher)ss.getFirstElement());
}
}
}
});
fLaunchersList.setInput(fLaunchersList);
if (fLauncher != null) {
fLaunchersList.setSelection(new StructuredSelection(fLauncher));
}
}
/**
* Updates the elements list for the given launcher
*/
protected void launcherSelected(ILauncher launcher) {
fLauncher = launcher;
setMessage(null);
if (launcher != null) {
LaunchWizardNode node= new LaunchWizardNode(this, launcher, fMode);
setSelectedNode(node);
setDescription(node.getDescription());
}
updateDefaultLauncherButton(launcher);
}
/**
* Convenience method to set the error line
*/
public void setErrorMessage(String message) {
super.setMessage(null);
super.setErrorMessage(message);
}
/**
* Convenience method to set the message line
*/
public void setMessage(String message) {
super.setErrorMessage(null);
super.setMessage(message);
}
/**
* Initialize the settings:<ul>
* <li>If there is only one launcher, select it
* </ul>
*/
protected void initializeSettings() {
if (fLaunchers.length == 0) {
setErrorMessage(DebugUIUtils.getResourceString(SELECT_ERROR_LAUNCHER));
} else {
IStructuredSelection selection= (IStructuredSelection)fLaunchersList.getSelection();
if (selection.isEmpty()) {
fLaunchersList.setSelection(new StructuredSelection(fLaunchers[0]));
} else if (fLaunchablesUpdateNeeded) {
//update the list of launchables if the project has changed
fLaunchersList.setSelection(selection);
fLaunchablesUpdateNeeded= false;
}
}
}
protected void updateDefaultLauncherButton(ILauncher launcher) {
IProject project= ((LaunchWizard)getWizard()).getProject();
if (project == null) {
// disable the control, we cannot set it without a project context
fSetAsDefaultLauncher.setSelection(false);
fSetAsDefaultLauncher.setEnabled(false);
} else {
// if the launcher is not the default launcher, enable the control
try {
ILauncher defaultLauncher= DebugPlugin.getDefault().getLaunchManager().getDefaultLauncher(project);
if (defaultLauncher != null && defaultLauncher.equals(launcher)) {
// disable the setting, but show that it is set
fSetAsDefaultLauncher.setSelection(true);
fSetAsDefaultLauncher.setEnabled(false);
} else {
// allow to set as default - in fact, set as default
fSetAsDefaultLauncher.setSelection(true);
fSetAsDefaultLauncher.setEnabled(true);
}
} catch (CoreException e) {
// disable default launcher
fSetAsDefaultLauncher.setSelection(false);
fSetAsDefaultLauncher.setEnabled(false);
}
}
}
protected ILauncher getLauncher() {
return fLauncher;
}
/**
* Implemented here to provide package access
*/
protected IWizardContainer getContainer() {
return super.getContainer();
}
protected void updateDefaultProject() {
IProject project= ((LaunchWizard)getWizard()).getProject();
String projectName= "";
if (project != null) {
if (!project.equals(fProject)) {
fLaunchablesUpdateNeeded= true;
fProject= project;
}
projectName= project.getName();
} else {
projectName= DebugUIUtils.getResourceString(UNKNOWN);
}
fSetAsDefaultLauncher.setText(MessageFormat.format(DebugUIUtils.getResourceString(DEFAULT_LAUNCHER), new String[] {projectName}));
fSetAsDefaultLauncher.pack();
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
updateDefaultProject();
initializeSettings();
} else {
fLaunchablesUpdateNeeded= false;
}
}
}