/*******************************************************************************
* Copyright (c) 2011 Nils Hartmann
* 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:
* Nils Hartmann - initial API and implementation
******************************************************************************/
package org.bundlemaker.core.ui.projecteditor.newwizard;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.bundlemaker.core.project.IProjectDescriptionAwareBundleMakerProject;
import org.bundlemaker.core.ui.projecteditor.provider.INewProjectContentProviderWizardContribution;
import org.bundlemaker.core.ui.projecteditor.provider.internal.ProjectEditorContributionRegistry;
import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
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.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.wizard.IWizardNode;
import org.eclipse.jface.wizard.WizardSelectionPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
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.Text;
/**
* A Wizard page displaying all available {@link INewProjectContentProviderWizardContribution
* NewProjectContentProviderWizards}
*
* @author Nils Hartmann (nils@nilshartmann.net)
*
*/
public class ChooseContentProviderSelectionPage extends WizardSelectionPage {
private final IProjectDescriptionAwareBundleMakerProject _bundleMakerProject;
private final ProjectEditorContributionRegistry _newProjectContentProviderWizardRegistry;
private Text _description;
protected ChooseContentProviderSelectionPage(IProjectDescriptionAwareBundleMakerProject bundleMakerProject,
ProjectEditorContributionRegistry registry) {
super("SelectionPage"); //$NON-NLS-1$
// set current project
_bundleMakerProject = bundleMakerProject;
//
_newProjectContentProviderWizardRegistry = registry;
// set title and message
setTitle("Choose content provider");
setMessage("Select a provder of project content");
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(1, false));
comp.setFont(parent.getFont());
GridData gd = new GridData(GridData.FILL_BOTH);
gd.grabExcessHorizontalSpace = true;
comp.setLayoutData(gd);
SashForm sashForm = new SashForm(comp, SWT.VERTICAL);
gd = new GridData(GridData.FILL_BOTH);
// limit the width of the sash form to avoid the wizard opening very wide.
gd.widthHint = 300;
sashForm.setLayoutData(gd);
sashForm.setFont(comp.getFont());
TableViewer wizardSelectionViewer = new TableViewer(sashForm, SWT.BORDER);
wizardSelectionViewer.setContentProvider(new ArrayContentProvider());
wizardSelectionViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof ChooseContentProviderWizardNode) {
return ((ChooseContentProviderWizardNode) element).getLabel();
}
return super.getText(element);
}
@Override
public Image getImage(Object element) {
if (element instanceof ChooseContentProviderWizardNode) {
return ((ChooseContentProviderWizardNode) element).getImage();
}
return super.getImage(element);
}
});
wizardSelectionViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if (!selection.isEmpty()) {
setSelectedNode((IWizardNode) selection.getFirstElement());
getContainer().showPage(getNextPage());
}
}
});
wizardSelectionViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if (!selection.isEmpty()) {
_description.setText(((ChooseContentProviderWizardNode) selection.getFirstElement()).getDescription());
setSelectedNode(((ChooseContentProviderWizardNode) selection.getFirstElement()));
}
}
});
wizardSelectionViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
wizardSelectionViewer.getTable().setFont(sashForm.getFont());
_description = SWTFactory.createText(sashForm, SWT.READ_ONLY | SWT.BORDER | SWT.MULTI | SWT.WRAP, 1);
sashForm.setWeights(new int[] { 70, 30 });
initViewerContents(wizardSelectionViewer);
setControl(comp);
}
/**
* Creates the IWizardNode instances that provide choices for the user to select
*
* @param wizardSelectionViewer
*/
private void initViewerContents(TableViewer wizardSelectionViewer) {
Set<INewProjectContentProviderWizardContribution> registeredWizardContributionss = _newProjectContentProviderWizardRegistry
.getNewProjectContentProviderWizardContributions();
List<ChooseContentProviderWizardNode> nodes = new LinkedList<ChooseContentProviderWizardNode>();
for (INewProjectContentProviderWizardContribution wizardContribution : registeredWizardContributionss) {
// Create node for contribution
ChooseContentProviderWizardNode node = new ChooseContentProviderWizardNode(_bundleMakerProject,
wizardContribution);
// add to result set
nodes.add(node);
}
Collections.sort(nodes, new Comparator<ChooseContentProviderWizardNode>() {
@Override
public int compare(ChooseContentProviderWizardNode o1, ChooseContentProviderWizardNode o2) {
return o1.getLabel().compareTo(o2.getLabel());
}
});
wizardSelectionViewer.setInput(nodes);
// List<AbstractProjectContentProviderNode> choices = new ArrayList<AbstractProjectContentProviderNode>();
// choices.add(new FileBasedProjectContentProviderNode(_projectDescription));
// choices.add(new JdtProjectContentProviderNode(_projectDescription));
// wizardSelectionViewer.setInput(choices.toArray(new IWizardNode[choices.size()]));
}
}