/*******************************************************************************
* Copyright (c) 2017 Obeo
* 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:
* - William Piers <william.piers@obeo.fr>
*******************************************************************************/
package org.occiware.clouddesigner.occi.examples.wizard;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.occiware.clouddesigner.occi.examples.Activator;
import org.occiware.clouddesigner.occi.examples.ExamplesRegistry;
import org.occiware.clouddesigner.occi.examples.IExample;
import org.occiware.clouddesigner.occi.examples.utils.ImageCanvas;
/**
* The examples wizard page.
*
* @author William Piers
* <a href="mailto:william.piers@obeo.fr">william.piers@obeo.fr</a>
*/
public class ExamplesWizardPage extends WizardPage {
private final class ExamplesContentProvider implements ITreeContentProvider {
@Override
public boolean hasChildren(Object element) {
return false;
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public Object[] getElements(Object inputElement) {
return ArrayContentProvider.getInstance().getElements(inputElement);
}
@Override
public Object[] getChildren(Object parentElement) {
return null;
}
}
private final class ExamplesLabelProvider extends LabelProvider {
private static final String EXAMPLE_IMAGE = "ModelingProject.gif"; //$NON-NLS-1$
@Override
public String getText(Object element) {
if (element instanceof IExample) {
return ((IExample) element).getName();
}
return super.getText(element);
}
@Override
public Image getImage(Object element) {
return Activator.getDefault().getImage(EXAMPLE_IMAGE);
}
}
private IExample chosenExample;
public ExamplesWizardPage(String pageName) {
super(pageName);
}
/**
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
setControl(composite);
composite.setLayout(new FillLayout());
final SashForm mainSashForm = new SashForm(composite, SWT.HORIZONTAL);
// Master
final TreeViewer viewer = new TreeViewer(mainSashForm);
viewer.setContentProvider(new ExamplesContentProvider());
viewer.setLabelProvider(new ExamplesLabelProvider());
viewer.setInput(ExamplesRegistry.getInstance().getRegisteredExamples());
// Details
Composite details = new Composite(mainSashForm, SWT.NULL);
final FillLayout detailsLayout = new FillLayout(SWT.VERTICAL);
detailsLayout.marginWidth = detailsLayout.spacing = 10;
details.setLayout(detailsLayout);
final SashForm detailsSashForm = new SashForm(details, SWT.VERTICAL);
final ImageCanvas screenshotLabel = new ImageCanvas(detailsSashForm, SWT.BORDER);
final Label descriptionLabel = new Label(detailsSashForm, SWT.NULL);
// Selection behaviour
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent arg0) {
chosenExample = (IExample) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
screenshotLabel.setImage(chosenExample.getScreenshot());
descriptionLabel.setText(chosenExample.getDescription());
setPageComplete(chosenExample != null && check(chosenExample));
}
});
// Sash weights
mainSashForm.setWeights(new int[] { 1, 3, });
detailsSashForm.setWeights(new int[] { 2, 1, });
}
public IExample getExample() {
return chosenExample;
}
/**
* (non-Javadoc)
*
* @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
*/
@Override
public boolean isPageComplete() {
return super.isPageComplete() && chosenExample != null && check(chosenExample);
}
private boolean check(IExample chosenExample) {
boolean valid = !ResourcesPlugin.getWorkspace().getRoot().getProject(chosenExample.getProjectName()).exists();
if (!valid) {
setErrorMessage(Messages.ExamplesWizard_error_already_exists_message + chosenExample.getProjectName());
} else {
setErrorMessage(null);
}
return valid;
}
}