/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.ui.viewsupport;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.teiid.core.designer.util.ArrayUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.MetamodelDescriptor;
import org.teiid.designer.ui.PluginConstants;
import org.teiid.designer.ui.UiConstants;
import org.teiid.designer.ui.UiPlugin;
import org.teiid.designer.ui.common.viewsupport.StatusInfo;
import org.teiid.designer.ui.product.IModelerProductContexts.Metamodel;
/**
* MetamodelTreeViewer
*
* @since 8.0
*/
public class MetamodelTreeViewer extends TreeViewer {
public static final EcoreAdapterFactory FACTORY = new EcoreItemProviderAdapterFactory();
public static SelectionDialog createSelectionDialog(final Shell parentShell,
final boolean primaryOnly) {
return createSelectionDialog(parentShell, primaryOnly, null);
}
public static SelectionDialog createSelectionDialog(final Shell parentShell,
final boolean primaryOnly,
final IContentFilter filter) {
ElementTreeSelectionDialog dialog =
new MetamodelSelectionDialog(
parentShell,
new MetamodelLabelProvider(FACTORY),
new MetamodelTreeContentProvider(FACTORY, filter));
dialog.setValidator(new ISelectionStatusValidator() {
@Override
public IStatus validate(Object[] selection) {
if ( selection.length == 1 && selection[0] instanceof EClass ) {
return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.OK, ""); //$NON-NLS-1$
}
String message = UiConstants.Util.getString("MetamodelClassDialog.mustSelectClass"); //$NON-NLS-1$
return new StatusInfo(UiConstants.PLUGIN_ID, IStatus.ERROR, message);
}
});
dialog.setComparator(new ViewerComparator() {});
dialog.setTitle(UiConstants.Util.getString("MetamodelClassDialog.selectClassTitle")); //$NON-NLS-1$
dialog.setMessage(UiConstants.Util.getString("MetamodelClassDialog.selectClassMessage")); //$NON-NLS-1$
Collection descriptors = Arrays.asList(ModelerCore.getMetamodelRegistry().getMetamodelDescriptors());
dialog.setInput(descriptors);
return dialog;
}
/**
* Construct an instance of MetamodelTreeViewer.
* @param parent
*/
public MetamodelTreeViewer(Composite parent) {
super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
setContentProvider(new MetamodelTreeContentProvider(FACTORY, null));
setLabelProvider(new MetamodelLabelProvider(FACTORY));
Collection descriptors = Arrays.asList(ModelerCore.getMetamodelRegistry().getMetamodelDescriptors());
super.setInput(descriptors);
// add an alphabetical sorter
this.setSorter(new ViewerSorter() { });
}
}
class MetamodelLabelProvider implements ILabelProvider, PluginConstants.Images {
private AdapterFactoryLabelProvider emfLabelProvider;
public MetamodelLabelProvider(AdapterFactory factory) {
emfLabelProvider = new AdapterFactoryLabelProvider(factory);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void addListener(ILabelProviderListener listener) {
emfLabelProvider.addListener(listener);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
*/
@Override
public void dispose() {
emfLabelProvider.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
if (element instanceof EObject) {
return emfLabelProvider.getImage(element);
} else if (element instanceof Resource) {
return UiPlugin.getDefault().getImage(METAMODEL);
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if (element instanceof EObject) {
return emfLabelProvider.getText(element);
} else if (element instanceof Resource) {
return ((Resource)element).getURI().toString();
}
return element.toString();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
*/
@Override
public boolean isLabelProperty(Object element, String property) {
if (element instanceof EObject) {
return emfLabelProvider.isLabelProperty(element, property);
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
*/
@Override
public void removeListener(ILabelProviderListener listener) {
emfLabelProvider.removeListener(listener);
}
}
class MetamodelTreeContentProvider implements ArrayUtil.Constants,
ITreeContentProvider {
private ITreeContentProvider emfContentProvider;
private IContentFilter filter;
public MetamodelTreeContentProvider(final AdapterFactory factory,
final IContentFilter filter) {
emfContentProvider = new AdapterFactoryContentProvider(factory);
this.filter = filter;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
emfContentProvider.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren(Object parentElement) {
Object[] elems;
if (parentElement instanceof Resource) {
EPackage ePackage = (EPackage) ((Resource)parentElement).getContents().get(0);
elems = ePackage.eContents().toArray();
} else {
elems = emfContentProvider.getChildren(parentElement);
}
if (this.filter == null) {
return elems;
}
return this.filter.filter(elems);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements(Object inputElement) {
Collection descriptorList = (Collection)inputElement;
Collection visibleResults = new ArrayList();
// Defect 21892 - Removing/hiding metamodels the user shouldn't see.
for (Iterator iter = descriptorList.iterator(); iter.hasNext();) {
String stringUri = ((MetamodelDescriptor)iter.next()).getNamespaceURI();
if( UiPlugin.getDefault().isProductContextValueSupported(Metamodel.USER_VISIBLE_URI, stringUri) ) {
URI uri = URI.createURI(stringUri);
visibleResults.add(ModelerCore.getMetamodelRegistry().getResource(uri));
}
}
if( !visibleResults.isEmpty() ) {
int index = 0;
Object[] result = new Object[visibleResults.size()];
for (Iterator iter = visibleResults.iterator(); iter.hasNext();) {
result[index++] = iter.next();
}
return result;
}
return new Object[0];
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent(Object element) {
return emfContentProvider.getParent(element);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren(Object element) {
if (element instanceof Resource) {
return true;
}
return emfContentProvider.hasChildren(element);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}