package org.eclipse.uml2.diagram.common.sheet.chooser;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.common.core.util.StringStatics;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
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.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.uml2.diagram.common.Messages;
import org.eclipse.uml2.diagram.common.sheet.chooser.ElementChooserPage.Validator;
import org.eclipse.uml2.uml.ElementImport;
public class TabbedElementChooser {
private final AdapterFactory myItemProvidersAdapterFactory;
private final EObject mySourceObject;
private final EStructuralFeature myFeature;
private final IDialogSettings myDialogSettings;
private ElementChooserPage myCurrentPage;
private final String mySettingsKeyLastFocus = "ReferencedElementDialog.KeyLastFocus"; //$NON-NLS-1$
private TabFolder myTabFolder;
private CLabel myDetailLabel;
private LabelProviderWithContext myDetailLabelProvider;
private final Validator myValidator;
private ElementTreeChooser myTreeChooserTab;
private ElementFilteredListChooser myListChooserPage;
private final TransactionalEditingDomain myEditingDomain;
public TabbedElementChooser(IDialogSettings settings, AdapterFactory itemProvidersAdapterFactory, EObject sourceObject, EStructuralFeature feature, TransactionalEditingDomain editingDomain) {
myDialogSettings = settings;
myItemProvidersAdapterFactory = itemProvidersAdapterFactory;
mySourceObject = sourceObject;
myFeature = feature;
myEditingDomain = editingDomain;
myValidator = new FeatureValueValidator(feature);
myDetailLabelProvider = getDetailLabelProvider();
}
public Control createDialogArea(Composite composite) {
Composite plate = new Composite(composite, SWT.NONE);
GridLayout layout = new GridLayout();
plate.setLayout(layout);
createTabFolder(plate);
myTreeChooserTab = new ElementTreeChooser(myItemProvidersAdapterFactory, mySourceObject, myFeature, myEditingDomain);
addTabPage(Messages.TabbedElementChooser_tab_choose_from_a_tree, myTabFolder, myTreeChooserTab);
myListChooserPage = new ElementFilteredListChooser(myItemProvidersAdapterFactory, mySourceObject, myFeature, myValidator, myEditingDomain);
addTabPage(Messages.TabbedElementChooser_tab_choose_from_a_list, myTabFolder, myListChooserPage);
myCurrentPage = (ElementChooserPage) myTabFolder.getSelection()[0].getData();
myTabFolder.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
tabChanged((TabItem) e.item);
myDialogSettings.put(mySettingsKeyLastFocus, myTabFolder.getSelectionIndex());
}
});
createDetailLabel(plate);
// XXX set context
// myDetailLabelProvider.setContext(context);
return plate;
}
private void createTabFolder(Composite plate) {
myTabFolder = new TabFolder(plate, SWT.NONE);
myTabFolder.setFont(plate.getFont());
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.widthHint = 400;
layoutData.heightHint = 400;
myTabFolder.setLayoutData(layoutData);
}
protected LabelProviderWithContext getDetailLabelProvider() {
return new QualifiedNameLabelProvider(new AdapterFactoryLabelProvider(myItemProvidersAdapterFactory));
}
private void createDetailLabel(Composite parent) {
GridData layoutData = new GridData();
layoutData.grabExcessVerticalSpace = false;
layoutData.grabExcessHorizontalSpace = true;
layoutData.horizontalAlignment = GridData.FILL;
layoutData.verticalAlignment = GridData.BEGINNING;
Composite plate = new Composite(parent, SWT.BORDER | SWT.FLAT);
plate.setLayoutData(layoutData);
plate.setLayout(new FillLayout());
myDetailLabel = new CLabel(plate, SWT.NONE);
addSelectionListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
List<?> selection = getSelection();
if (selection.size() == 1) {
Object selected = selection.get(0);
String text = myDetailLabelProvider.getText(selected);
if (text == null) {
text = StringStatics.BLANK;
}
myDetailLabel.setText(text);
Image image = myDetailLabelProvider.getImage(selected);
myDetailLabel.setImage(image);
}
}
});
}
public Validator getValidator() {
return myValidator;
}
private static void addTabPage(String title, TabFolder myTabFolder, ElementChooserPage tabPage) {
final TabItem tabItem = new TabItem(myTabFolder, SWT.NONE);
// applyDialogFont(tabItem.getControl());
tabItem.setText(title);
tabItem.setData(tabPage);
tabItem.setControl(tabPage.createControl(myTabFolder));
}
private void tabChanged(TabItem tabItem) {
ElementChooserPage newPage = (ElementChooserPage) tabItem.getData();
tabItem.getControl().setFocus();
if (myCurrentPage != null) {
newPage.setSelection(myCurrentPage.getSelection());
}
myCurrentPage = newPage;
}
public void initSelection() {
int lastFocusNr = 0;
try {
lastFocusNr = myDialogSettings.getInt(mySettingsKeyLastFocus);
if (lastFocusNr < 0 || lastFocusNr > myTabFolder.getItemCount()) {
lastFocusNr = 0;
}
} catch (NumberFormatException x) {
lastFocusNr = 0;
}
myTabFolder.setSelection(lastFocusNr);
myCurrentPage = (ElementChooserPage) myTabFolder.getSelection()[0].getData();
myCurrentPage.setSelection(getInitialSelection());
}
protected List<?> getInitialSelection() {
Object featureValue = mySourceObject.eGet(myFeature);
if (myFeature.isMany()) {
@SuppressWarnings("unchecked")
Collection<Object> a = (Collection) featureValue;
return new ArrayList<Object>(a);
}
return Collections.singletonList(featureValue);
}
public List<?> getSelection() {
return myCurrentPage.getSelection();
}
public void setSelection(List<?> selection) {
myCurrentPage.setSelection(selection);
}
public void addDoubleClickListener(IDoubleClickListener listener) {
myListChooserPage.addDoubleClickListener(listener);
myTreeChooserTab.addDoubleClickListener(listener);
}
public void addSelectionListener(ISelectionChangedListener listener) {
myListChooserPage.addSelectionListener(listener);
myTreeChooserTab.addSelectionListener(listener);
}
public interface LabelProviderWithContext extends ILabelProvider {
void setContext(Object... context);
}
private static class FeatureValueValidator implements Validator {
private final EStructuralFeature myFeature;
public FeatureValueValidator(EStructuralFeature feature) {
myFeature = feature;
}
public EObject validate(Object object) {
if (false == object instanceof EObject) {
return null;
}
EObject eobject = (EObject) object;
if (eobject instanceof ElementImport) {
ElementImport _import = (ElementImport) eobject;
eobject = _import.getImportedElement();
}
if (eobject != null && myFeature.getEType().isInstance(eobject)) {
return eobject;
}
return null;
}
}
}