blob: fa455f9126690ca8266af40a382d52dc26f478a2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2009 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 java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.IWizardNode;
import org.eclipse.jface.wizard.IWizardPage;
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.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.activities.ITriggerPoint;
import org.eclipse.ui.activities.WorkbenchActivityHelper;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.decorators.ContributingPluginDecorator;
import org.eclipse.ui.model.AdaptableList;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.wizards.IWizardCategory;
import org.eclipse.ui.wizards.IWizardDescriptor;
/**
* Abstract wizard page class from which an import or export wizard can be chosen.
*
* @since 3.2
*
*/
public abstract class ImportExportPage extends WorkbenchWizardSelectionPage{
protected static final String DIALOG_SETTING_SECTION_NAME = "ImportExportPage."; //$NON-NLS-1$
// tree viewer of wizard selections
private TreeViewer treeViewer;
/*
* Class to create a control that shows a categorized tree of wizard types.
*/
protected class CategorizedWizardSelectionTree {
private final static int SIZING_LISTS_HEIGHT = 200;
private IWizardCategory wizardCategories;
private String message;
private TreeViewer viewer;
/**
* Constructor for CategorizedWizardSelectionTree
*
* @param categories root wizard category for the wizard type
* @param msg message describing what the user should choose from the tree.
*/
protected CategorizedWizardSelectionTree(IWizardCategory categories, String msg){
this.wizardCategories = categories;
this.message = msg;
}
/**
* Create the tree viewer and a message describing what the user should choose
* from the tree.
*
* @param parent Composite on which the tree viewer is to be created
* @return Comoposite with all widgets
*/
protected Composite 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.FILL_BOTH));
outerContainer.setFont(font);
Label messageLabel = new Label(outerContainer, SWT.NONE);
if (message != null) {
messageLabel.setText(message);
}
messageLabel.setFont(font);
createFilteredTree(outerContainer);
layoutTopControl(viewer.getControl());
return outerContainer;
}
/**
* Create the categorized tree viewer.
*
* @param parent
*/
private void createFilteredTree(Composite parent){
// Create a FilteredTree for the categories and wizards
FilteredTree filteredTree = new FilteredTree(parent, SWT.SINGLE | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER, new WizardPatternFilter(), true);
viewer = filteredTree.getViewer();
filteredTree.setFont(parent.getFont());
viewer.setContentProvider(new WizardContentProvider());
viewer.setLabelProvider(new DelegatingLabelProviderWithTooltip(
new WorkbenchLabelProvider(), PlatformUI.getWorkbench()
.getDecoratorManager().getLabelDecorator(ContributingPluginDecorator.ID)) {
protected Object unwrapElement(Object element) {
if (element instanceof WorkbenchWizardElement) {
element = ((WorkbenchWizardElement) element)
.getConfigurationElement();
}
if (element instanceof WizardCollectionElement) {
element = ((WizardCollectionElement) element)
.getConfigurationElement();
}
return element;
}
});
viewer.setComparator(DataTransferWizardCollectionComparator.INSTANCE);
ArrayList inputArray = new ArrayList();
boolean expandTop = false;
if (wizardCategories != null) {
if (wizardCategories.getParent() == null) {
IWizardCategory [] children = wizardCategories.getCategories();
for (int i = 0; i < children.length; i++) {
inputArray.add(children[i]);
}
} else {
expandTop = true;
inputArray.add(wizardCategories);
}
}
// ensure the category is expanded. If there is a remembered expansion it will be set later.
if (expandTop) {
viewer.setAutoExpandLevel(2);
}
AdaptableList input = new AdaptableList(inputArray);
// filter wizard list according to capabilities that are enabled
viewer.addFilter(new WizardActivityFilter());
viewer.setInput(input);
}
/**
*
* @return the categorized tree viewer
*/
protected TreeViewer getViewer(){
return viewer;
}
/**
* Layout for the given control.
*
* @param control
*/
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);
}
}
/**
* Constructor for import/export wizard page.
*
* @param aWorkbench current workbench
* @param currentSelection current selection
*/
protected ImportExportPage(IWorkbench aWorkbench, IStructuredSelection currentSelection){
super("importExportPage", aWorkbench, currentSelection, null, null); //$NON-NLS-1$
setTitle(WorkbenchMessages.Select);
}
/*
* (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.FILL_BOTH));
outerContainer.setFont(font);
Composite comp = createTreeViewer(outerContainer);
Dialog.applyDialogFont(comp);
restoreWidgetValues();
setControl(outerContainer);
initialize();
}
/**
* Create the tree viewer from which a wizard is selected.
*/
protected abstract Composite createTreeViewer(Composite parent);
/**
* Method to call when an item in one of the lists is double-clicked.
* Shows the first page of the selected wizard or expands a collapsed
* tree.
* @param event
*/
protected void treeDoubleClicked(DoubleClickEvent event){
ISelection selection = event.getViewer().getSelection();
IStructuredSelection ss = (IStructuredSelection) selection;
listSelectionChanged(ss);
Object element = ss.getFirstElement();
TreeViewer v = (TreeViewer)event.getViewer();
if (v.isExpandable(element)) {
v.setExpandedState(element, !v.getExpandedState(element));
} else if (element instanceof WorkbenchWizardElement) {
if (canFlipToNextPage()) {
getContainer().showPage(getNextPage());
return;
}
}
getContainer().showPage(getNextPage());
}
/*
* Update the wizard's message based on the given (selected) wizard element.
*/
private void updateSelectedNode(WorkbenchWizardElement wizardElement){
setErrorMessage(null);
if (wizardElement == null) {
updateMessage();
setSelectedNode(null);
return;
}
setSelectedNode(createWizardNode(wizardElement));
setMessage(wizardElement.getDescription());
}
/*
* Update the wizard's message based on the currently selected tab
* and the selected wizard on that tab.
*/
protected void updateMessage(){
TreeViewer viewer = getTreeViewer();
if (viewer != null){
ISelection selection = viewer.getSelection();
IStructuredSelection ss = (IStructuredSelection) selection;
Object sel = ss.getFirstElement();
if (sel instanceof WorkbenchWizardElement){
updateSelectedNode((WorkbenchWizardElement)sel);
}
else{
setSelectedNode(null);
}
} else {
setMessage(null);
}
}
/*
* Method to call whenever the selection in one of the lists has changed.
* Updates the wizard's message to relect the description of the currently
* selected wizard.
*/
protected void listSelectionChanged(ISelection selection){
setErrorMessage(null);
IStructuredSelection ss = (IStructuredSelection) selection;
Object sel = ss.getFirstElement();
if (sel instanceof WorkbenchWizardElement){
WorkbenchWizardElement currentWizardSelection = (WorkbenchWizardElement) sel;
updateSelectedNode(currentWizardSelection);
} else {
updateSelectedNode(null);
}
}
/*
* Create a wizard node given a wizard's descriptor.
*/
private IWizardNode createWizardNode(IWizardDescriptor element) {
return new WorkbenchWizardNode(this, element) {
public IWorkbenchWizard createWizard() throws CoreException {
return wizardElement.createWizard();
}
};
}
/**
* Uses the dialog store to restore widget values to the values that they
* held last time this wizard was used to completion.
*/
protected void restoreWidgetValues() {
updateMessage();
}
/**
* Expands the wizard categories in this page's category viewer that were
* expanded last time this page was used. If a category that was previously
* expanded no longer exists then it is ignored.
*/
protected void expandPreviouslyExpandedCategories(String setting, IWizardCategory wizardCategories, TreeViewer viewer) {
String[] expandedCategoryPaths = getDialogSettings()
.getArray(setting);
if (expandedCategoryPaths == null || expandedCategoryPaths.length == 0) {
return;
}
List categoriesToExpand = new ArrayList(expandedCategoryPaths.length);
if (wizardCategories != null) {
for (int i = 0; i < expandedCategoryPaths.length; i++) {
IWizardCategory category = wizardCategories
.findCategory(new Path(expandedCategoryPaths[i]));
if (category != null) {
categoriesToExpand.add(category);
}
}
}
if (!categoriesToExpand.isEmpty()) {
viewer.setExpandedElements(categoriesToExpand.toArray());
}
}
/**
* Selects the wizard category and wizard in this page that were selected
* last time this page was used. If a category or wizard that was
* previously selected no longer exists then it is ignored.
*/
protected void selectPreviouslySelected(String setting, IWizardCategory wizardCategories, final TreeViewer viewer) {
String selectedId = getDialogSettings().get(setting);
if (selectedId == null) {
return;
}
if (wizardCategories == null) {
return;
}
Object selected = wizardCategories.findCategory(new Path(
selectedId));
if (selected == null) {
selected = wizardCategories.findWizard(selectedId);
if (selected == null) {
// if we cant find either a category or a wizard, abort.
return;
}
}
viewer.setSelection(new StructuredSelection(selected), true);
}
/**
* Stores the collection of currently-expanded categories in this page's
* dialog store, in order to recreate this page's state in the next
* instance of this page.
*/
protected void storeExpandedCategories(String setting, TreeViewer viewer) {
Object[] expandedElements = viewer.getExpandedElements();
List expandedElementPaths = new ArrayList(expandedElements.length);
for (int i = 0; i < expandedElements.length; ++i) {
if (expandedElements[i] instanceof IWizardCategory) {
expandedElementPaths
.add(((IWizardCategory) expandedElements[i])
.getPath().toString());
}
}
getDialogSettings().put(setting,
(String[]) expandedElementPaths
.toArray(new String[expandedElementPaths.size()]));
}
/**
* Stores the currently-selected element in this page's dialog store, in
* order to recreate this page's state in the next instance of this page.
*/
protected void storeSelectedCategoryAndWizard(String setting, TreeViewer viewer) {
Object selected = ((IStructuredSelection) viewer
.getSelection()).getFirstElement();
if (selected != null) {
if (selected instanceof IWizardCategory) {
getDialogSettings().put(setting,
((IWizardCategory) selected).getPath()
.toString());
} else {
// else its a wizard
getDialogSettings().put(setting,
((IWizardDescriptor) selected).getId());
}
}
}
/**
* When Finish is pressed, write widget values to the dialog store so
* that they will persist into the next invocation of the wizard page.
*
*/
public void saveWidgetValues(){
// do nothing by default - subclasses should override
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.IWizardPage#getNextPage()
*/
public IWizardPage getNextPage() {
ITriggerPoint triggerPoint = getTriggerPoint();
if (triggerPoint == null || WorkbenchActivityHelper.allowUseOf(triggerPoint, getSelectedNode())) {
return super.getNextPage();
}
return null;
}
/**
* Get the trigger point for the wizard type, if one exists.
*
* @return the wizard's trigger point
*/
protected ITriggerPoint getTriggerPoint(){
return null; // default implementation
}
/**
* Set the tree viewer that is used for this wizard selection page.
*
* @param viewer
*/
protected void setTreeViewer(TreeViewer viewer){
treeViewer = viewer;
}
/**
* Get the tree viewer that is used for this wizard selection page.
*
* @return tree viewer used for this wizard's selection page
*/
protected TreeViewer getTreeViewer(){
return treeViewer;
}
/**
* Perform any initialization of the wizard page that needs to be done
* after widgets are created and main control is set.
*/
protected void initialize(){
// do nothing by default
}
}