/*******************************************************************************
* Copyright (c) 2008 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.smooks.configuration.editors;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
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.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.jboss.tools.smooks.configuration.editors.ChildrenSelectionWizard.PrivateWizardDialog;
/**
* @author Dart
*
*/
public class ChildrenSelectionWizardPage extends WizardPage {
private ILabelProvider customeLabelProvider = null;
private Collection<?> childrenDescriptor = new ArrayList<CommandParameter>();
private AdapterFactoryEditingDomain editingDomain = null;
protected Object child;
private PrivateWizardDialog dialog;
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
* .Composite)
*/
public void createControl(Composite parent) {
Composite mainComposite = new Composite(parent, SWT.NONE);
GridData gd = new GridData(GridData.FILL_BOTH);
mainComposite.setLayoutData(gd);
mainComposite.setLayout(new FillLayout());
final TableViewer tableViewer = new TableViewer(mainComposite, SWT.BORDER | SWT.FULL_SELECTION);
tableViewer.setContentProvider(new ChildrenDescriptorContentProvider());
tableViewer.setLabelProvider(new ChildrenDescriptorLabelProvider());
tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
child = null;
if (!((IStructuredSelection) tableViewer.getSelection()).isEmpty()) {
child = ((IStructuredSelection) tableViewer.getSelection()).getFirstElement();
updatePage();
}
}
});
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
dialog.close();
}
});
if (childrenDescriptor != null) {
tableViewer.setInput(childrenDescriptor);
}
updatePage();
setControl(mainComposite);
}
public Object getChild() {
return child;
}
/**
* @param customeLabelProvider the customeLabelProvider to set
*/
public void setCustomeLabelProvider(ILabelProvider customeLabelProvider) {
this.customeLabelProvider = customeLabelProvider;
}
protected void updatePage() {
String error = null;
if (child == null) {
error = Messages.ChildrenSelectionWizardPage_selectchilderror;
}
this.setErrorMessage(error);
this.setPageComplete(error == null);
}
public ChildrenSelectionWizardPage(Collection<?> childrenDescriptor, AdapterFactoryEditingDomain editingDomain,
String pageName, String title, ImageDescriptor titleImage) {
super(pageName, title, titleImage);
this.childrenDescriptor = childrenDescriptor;
this.editingDomain = editingDomain;
this.setTitle(Messages.ChildrenSelectionWizardPage_wizardtitle);
this.setDescription(Messages.ChildrenSelectionWizardPage_wizardtitle);
}
public ChildrenSelectionWizardPage(Collection<?> childrenDescriptor, AdapterFactoryEditingDomain editingDomain,
String pageName) {
super(pageName);
this.childrenDescriptor = childrenDescriptor;
this.editingDomain = editingDomain;
this.setTitle(Messages.ChildrenSelectionWizardPage_wizardtitle);
this.setDescription(Messages.ChildrenSelectionWizardPage_wizardtitle);
}
private Object getValue(Object element) {
if (element instanceof CommandParameter) {
Object v = ((CommandParameter) element).getValue();
v = AdapterFactoryEditingDomain.unwrap(v);
return v;
}
return element;
}
private class ChildrenDescriptorContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Collection<?>) {
return ((Collection<?>) inputElement).toArray();
}
return new Object[] {};
}
public void dispose() {
// TODO Auto-generated method stub
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
}
private class ChildrenDescriptorLabelProvider extends LabelProvider {
@Override
public Image getImage(Object element) {
Image image = null;
if(customeLabelProvider != null){
image = customeLabelProvider.getImage(element);
}
if(image != null){
return image;
}
element = getValue(element);
IItemLabelProvider provider = (IItemLabelProvider) editingDomain.getAdapterFactory().adapt(element,
IItemLabelProvider.class);
Object img = provider.getImage(element);
image = ExtendedImageRegistry.getInstance().getImage(img);
return image;
}
@Override
public String getText(Object element) {
String label = null;
if(customeLabelProvider != null){
label = customeLabelProvider.getText(element);
}
if(label != null){
return label;
}
element = getValue(element);
IItemLabelProvider provider = (IItemLabelProvider) editingDomain.getAdapterFactory().adapt(element,
IItemLabelProvider.class);
return provider.getText(element);
}
}
public void setWizardDialog(PrivateWizardDialog dialog) {
this.dialog = dialog;
}
}