blob: b6537123d19c0632214466b716d3eb706f4e1548 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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
* Sebastian Davids <sdavids@gmx.de> - Fix for bug 19346 - Dialog font should be
* activated and used by other components.
*******************************************************************************/
package org.eclipse.ui.internal.ide.misc;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
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.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.dialogs.WizardStep;
import org.eclipse.ui.model.WorkbenchContentProvider;
/**
* A group of controls used to view the list of
* wizard steps to be done.
*/
public class WizardStepGroup {
private Image doneImage;
private Image currentImage;
private WizardStep currentStep;
private Composite parentComposite;
private TableViewer stepViewer;
private ISelectionChangedListener selectionListener;
/**
* Creates a new instance of the <code>WizardStepGroup</code>
*/
public WizardStepGroup() {
super();
}
/**
* Create the contents of this group. The basic layout is a table
* with a label above it.
*/
public Control createContents(Composite parent) {
Font font = parent.getFont();
parentComposite = parent;
// Create a composite to hold everything together
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.FILL_VERTICAL));
composite.setFont(font);
composite.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (doneImage != null) {
doneImage.dispose();
doneImage = null;
}
if (currentImage != null) {
currentImage.dispose();
currentImage = null;
}
}
});
// Add a label to identify the step list field
Label label = new Label(composite, SWT.LEFT);
label.setText(IDEWorkbenchMessages.WizardStepGroup_stepsLabel);
GridData data = new GridData();
data.verticalAlignment = SWT.TOP;
label.setLayoutData(data);
label.setFont(font);
// Table viewer of all the steps
stepViewer = new TableViewer(composite, SWT.SINGLE | SWT.V_SCROLL
| SWT.BORDER | SWT.FULL_SELECTION);
data = new GridData(GridData.FILL_BOTH);
stepViewer.getTable().setLayoutData(data);
stepViewer.getTable().setFont(font);
stepViewer.setContentProvider(getStepProvider());
stepViewer.setLabelProvider(new StepLabelProvider());
if (selectionListener != null)
stepViewer.addSelectionChangedListener(selectionListener);
return composite;
}
/**
* Creates an image descriptor.
*/
private Image createImage(String iconFileName) {
ImageDescriptor desc =
IDEWorkbenchPlugin.getIDEImageDescriptor(iconFileName);
return desc.createImage();
}
/**
* Return the image indicating a step is current
*/
private Image getCurrentImage() {
if (currentImage == null) {
currentImage = createImage("elcl16/step_current.gif"); //$NON-NLS-1$
}
return currentImage;
}
/**
* Return the image indicating a step is done
*/
private Image getDoneImage() {
if (doneImage == null) {
doneImage = createImage("elcl16/step_done.gif"); //$NON-NLS-1$
}
return doneImage;
}
/**
* Returns the content provider for the step viewer
*/
private IContentProvider getStepProvider() {
return new WorkbenchContentProvider() {
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof StepRoot)
return ((StepRoot) parentElement).getSteps();
else
return null;
}
};
}
/**
* Returns the steps.
*/
public WizardStep[] getSteps() {
if (stepViewer != null) {
StepRoot root = (StepRoot) stepViewer.getInput();
if (root != null)
return root.getSteps();
}
return new WizardStep[0];
}
/**
* Marks the current step as being done
*/
public void markStepAsDone() {
if (currentStep != null)
currentStep.markAsDone();
}
/**
* Sets the current step being worked on. Assumes
* the step provided exist in the steps within the
* group's viewer.
*
* @param step the wizard step being worked on
*/
public void setCurrentStep(WizardStep step) {
WizardStep oldStep = currentStep;
currentStep = step;
if (stepViewer != null) {
if (oldStep != null)
stepViewer.update(oldStep, null);
if (currentStep != null)
stepViewer.update(currentStep, null);
// Update the layout so that there is enough
// room for the icon now.
if (oldStep == null && currentStep != null)
parentComposite.layout(true);
}
}
/**
* Set the current listener interested when the selection
* state changes.
*
* @param listener The selection listener to set
*/
public void setSelectionListener(ISelectionChangedListener listener) {
if (selectionListener != null && stepViewer != null)
stepViewer.removeSelectionChangedListener(selectionListener);
selectionListener = listener;
if (selectionListener != null && stepViewer != null)
stepViewer.addSelectionChangedListener(selectionListener);
}
/**
* Sets the steps to be displayed. Ignored is the
* method createContents has not been called yet.
*
* @param steps the collection of steps
*/
public void setSteps(WizardStep[] steps) {
if (stepViewer != null) {
stepViewer.setInput(new StepRoot(steps));
parentComposite.layout(true);
}
}
/**
* Holder of all the steps within the viewer
*/
private class StepRoot {
private WizardStep[] steps;
public StepRoot(WizardStep[] steps) {
super();
this.steps = steps;
}
public WizardStep[] getSteps() {
if (steps == null)
return new WizardStep[0];
else
return steps;
}
}
/**
* Label provider for step table viewer
*/
private class StepLabelProvider extends LabelProvider {
public String getText(Object element) {
if (element instanceof WizardStep) {
WizardStep step = (WizardStep) element;
return String.valueOf(step.getNumber())
+ ". " + step.getLabel(); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
public Image getImage(Object element) {
if (element instanceof WizardStep) {
WizardStep step = (WizardStep) element;
if (step.isDone())
return getDoneImage();
if (step == currentStep)
return getCurrentImage();
}
return null;
}
}
}