blob: 0260250b422a156d233f73c77453e4889ba75504 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.ui.internal.dialogs;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.IWizardNode;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.model.AdaptableList;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.model.WorkbenchViewerComparator;
/**
* Abstract implementation of a wizard selection page which simply displays a
* list of specified wizard elements and allows the user to select one to be
* launched. Subclasses just need to provide a method which creates an
* appropriate wizard node based upon a user selection.
*/
public abstract class WorkbenchWizardListSelectionPage extends
WorkbenchWizardSelectionPage implements ISelectionChangedListener,
IDoubleClickListener {
// id constants
private static final String DIALOG_SETTING_SECTION_NAME = "WizardListSelectionPage."; //$NON-NLS-1$
private final static int SIZING_LISTS_HEIGHT = 200;
private static final String STORE_SELECTED_WIZARD_ID = DIALOG_SETTING_SECTION_NAME
+ "STORE_SELECTED_WIZARD_ID"; //$NON-NLS-1$
private TableViewer viewer;
private String message;
/**
* Creates a <code>WorkbenchWizardListSelectionPage</code>.
*
* @param aWorkbench the current workbench
* @param currentSelection the workbench's current resource selection
* @param wizardElements the collection of <code>WorkbenchWizardElements</code>
* to display for selection
* @param message the message to display above the selection list
* @param triggerPointId the trigger point id
*/
protected WorkbenchWizardListSelectionPage(IWorkbench aWorkbench,
IStructuredSelection currentSelection,
AdaptableList wizardElements, String message, String triggerPointId) {
super(
"singleWizardSelectionPage", aWorkbench, currentSelection, wizardElements, triggerPointId); //$NON-NLS-1$
setDescription(WorkbenchMessages.WizardList_description);
this.message = message;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
Font font = parent.getFont();
// create composite for page.
Composite outerContainer = new Composite(parent, SWT.NONE);
outerContainer.setLayout(new GridLayout());
outerContainer.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL
| GridData.HORIZONTAL_ALIGN_FILL));
outerContainer.setFont(font);
Label messageLabel = new Label(outerContainer, SWT.NONE);
messageLabel.setText(message);
messageLabel.setFont(font);
createViewer(outerContainer);
layoutTopControl(viewer.getControl());
restoreWidgetValues();
setControl(outerContainer);
}
/**
* Create a new viewer in the parent.
*
* @param parent the parent <code>Composite</code>.
*/
private void createViewer(Composite parent) {
//Create a table for the list
Table table = new Table(parent, SWT.BORDER);
table.setFont(parent.getFont());
// the list viewer
viewer = new TableViewer(table);
viewer.setContentProvider(new WizardContentProvider());
viewer.setLabelProvider(new WorkbenchLabelProvider());
viewer.setComparator(new WorkbenchViewerComparator());
viewer.addSelectionChangedListener(this);
viewer.addDoubleClickListener(this);
viewer.setInput(wizardElements);
}
/**
* Returns an <code>IWizardNode</code> representing the specified
* workbench wizard which has been selected by the user. <b>Subclasses
* </b> must override this abstract implementation.
*
* @param element the wizard element that an <code>IWizardNode</code> is
* needed for
* @return org.eclipse.jface.wizards.IWizardNode
*/
protected abstract IWizardNode createWizardNode(
WorkbenchWizardElement element);
/**
* An item in a viewer has been double-clicked.
*/
public void doubleClick(DoubleClickEvent event) {
selectionChanged(new SelectionChangedEvent(event.getViewer(), event
.getViewer().getSelection()));
getContainer().showPage(getNextPage());
}
/**
* Layout the top control.
*
* @param control the control.
* @since 3.0
*/
private void layoutTopControl(Control control) {
GridData data = new GridData(GridData.FILL_BOTH);
int availableRows = DialogUtil.availableRows(control.getParent());
//Only give a height hint if the dialog is going to be too small
if (availableRows > 50) {
data.heightHint = SIZING_LISTS_HEIGHT;
} else {
data.heightHint = availableRows * 3;
}
control.setLayoutData(data);
}
/**
* Uses the dialog store to restore widget values to the values that they
* held last time this wizard was used to completion.
*/
private void restoreWidgetValues() {
IDialogSettings settings = getDialogSettings();
if (settings == null) {
return;
}
String wizardId = settings.get(STORE_SELECTED_WIZARD_ID);
WorkbenchWizardElement wizard = findWizard(wizardId);
if (wizard == null) {
return;
}
StructuredSelection selection = new StructuredSelection(wizard);
viewer.setSelection(selection);
}
/**
* Since Finish was pressed, write widget values to the dialog store so
* that they will persist into the next invocation of this wizard page
*/
public void saveWidgetValues() {
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
if (sel.size() > 0) {
WorkbenchWizardElement selectedWizard = (WorkbenchWizardElement) sel
.getFirstElement();
getDialogSettings().put(STORE_SELECTED_WIZARD_ID,
selectedWizard.getId());
}
}
/**
* Notes the newly-selected wizard element and updates the page
* accordingly.
*
* @param event the selection changed event
*/
public void selectionChanged(SelectionChangedEvent event) {
setErrorMessage(null);
IStructuredSelection selection = (IStructuredSelection) event
.getSelection();
WorkbenchWizardElement currentWizardSelection = (WorkbenchWizardElement) selection
.getFirstElement();
if (currentWizardSelection == null) {
setMessage(null);
setSelectedNode(null);
return;
}
setSelectedNode(createWizardNode(currentWizardSelection));
setMessage(currentWizardSelection.getDescription());
}
}