/*
* 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 org.eclipse.emf.ecore.resource.Resource;
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.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.resource.xmi.MtkXmiResourceImpl;
import org.teiid.designer.metamodels.core.AnnotationContainer;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.core.ModelType;
import org.teiid.designer.metamodels.diagram.DiagramContainer;
import org.teiid.designer.metamodels.transformation.TransformationContainer;
import org.teiid.designer.ui.PluginConstants;
import org.teiid.designer.ui.UiPlugin;
/**
* A viewer for displaying the System models in ModelerCore's external container.
*
* @since 8.0
*/
public class SystemModelTreeViewer extends TreeViewer {
/**
* @param parent
* @since 4.3
*/
public SystemModelTreeViewer( Composite parent ) {
this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
}
/**
* @param parent
* @param style
* @since 4.3
*/
public SystemModelTreeViewer( Composite parent,
int style ) {
super(parent, style);
setContentProvider(new SystemModelContentProvider());
setLabelProvider(new SystemModelLabelProvider());
addFilter(new SystemModelViewerFilter());
Resource[] models = ModelerCore.getSystemVdbResources();
// only display virtual models
ArrayList virtualModels = new ArrayList(models.length);
for (int i = 0; i < models.length; ++i) {
if (models[i] instanceof MtkXmiResourceImpl) {
// need to check if the model is virtual
ModelAnnotation annotation = ((MtkXmiResourceImpl)models[i]).getModelAnnotation();
if (annotation.getModelType() == (ModelType.PHYSICAL_LITERAL)) {
virtualModels.add(models[i]);
}
}
}
Resource[] result = new Resource[virtualModels.size()];
virtualModels.toArray(result);
super.setInput(result);
}
class SystemModelContentProvider implements ITreeContentProvider {
private ITreeContentProvider modelObjectProvider;
public SystemModelContentProvider() {
modelObjectProvider = ModelUtilities.getModelContentProvider();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren( Object parentElement ) {
return modelObjectProvider.getChildren(parentElement);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements( Object inputElement ) {
return (Object[])inputElement;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent( Object element ) {
return modelObjectProvider.getParent(element);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren( Object element ) {
return modelObjectProvider.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 ) {
}
}
class SystemModelLabelProvider implements ILabelProvider {
ILabelProvider delegate = ModelUtilities.getModelObjectLabelProvider();
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
* @since 4.3
*/
@Override
public void addListener( ILabelProviderListener listener ) {
delegate.addListener(listener);
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
* @since 4.3
*/
@Override
public void dispose() {
delegate.dispose();
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
* @since 4.3
*/
@Override
public boolean isLabelProperty( Object element,
String property ) {
return delegate.isLabelProperty(element, property);
}
/**
* @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
* @since 4.3
*/
@Override
public void removeListener( ILabelProviderListener listener ) {
delegate.removeListener(listener);
}
/**
* @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
* @since 4.3
*/
@Override
public Image getImage( Object element ) {
if (element instanceof MtkXmiResourceImpl) {
// need to check if the model is virtual
ModelAnnotation annotation = ((MtkXmiResourceImpl)element).getModelAnnotation();
if (annotation.getModelType() == (ModelType.PHYSICAL_LITERAL)) {
return UiPlugin.getDefault().getImage(PluginConstants.Images.MODEL);
}
}
return delegate.getImage(element);
}
/**
* @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
* @since 4.3
*/
@Override
public String getText( Object element ) {
if (element instanceof Resource) {
String filename = ((Resource)element).getURI().lastSegment();
return filename.substring(0, filename.indexOf('.'));
}
return delegate.getText(element);
}
}
class SystemModelViewerFilter extends ViewerFilter {
@Override
public boolean select( Viewer viewer,
Object parentElement,
Object element ) {
if (element instanceof ModelAnnotation) {
return false;
}
if (element instanceof TransformationContainer) {
return false;
}
if (element instanceof DiagramContainer) {
return false;
}
if (element instanceof AnnotationContainer) {
return false;
}
if (element instanceof MtkXmiResourceImpl) {
if (((MtkXmiResourceImpl)element).getModelAnnotation().getModelType() == ModelType.PHYSICAL_LITERAL) {
return true;
}
return false;
}
return true;
}
}
}