/*
* 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.transformation.ui.builder.util;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.teiid.core.designer.util.CoreArgCheck;
import org.teiid.designer.query.sql.lang.ICompoundCriteria;
import org.teiid.designer.query.sql.lang.ICriteria;
import org.teiid.designer.query.sql.lang.IExpression;
import org.teiid.designer.query.sql.lang.ILanguageObject;
import org.teiid.designer.query.sql.lang.ILogicalCriteria;
import org.teiid.designer.query.sql.lang.INotCriteria;
import org.teiid.designer.query.sql.symbol.IFunction;
import org.teiid.designer.transformation.ui.UiConstants;
import org.teiid.designer.transformation.ui.builder.ILanguageObjectInputProvider;
import org.teiid.query.ui.builder.util.BuilderUtils;
/**
* LanguageObjectContentProvider
*
* @since 8.0
*/
public class LanguageObjectContentProvider implements ITreeContentProvider, UiConstants {
// /////////////////////////////////////////////////////////////////////////////////////////////
// CONSTANTS
// /////////////////////////////////////////////////////////////////////////////////////////////
/** Properties key prefix. */
// private static final String PREFIX = I18nUtil.getPropertyPrefix(LanguageObjectContentProvider.class);
// /////////////////////////////////////////////////////////////////////////////////////////////
// FIELDS
// /////////////////////////////////////////////////////////////////////////////////////////////
private ILanguageObject langObj;
private Object[] roots = new Object[0];
// private Viewer viewer;
// /////////////////////////////////////////////////////////////////////////////////////////////
// METHODS
// /////////////////////////////////////////////////////////////////////////////////////////////
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
}
public Object getChildAt( int theIndex,
Object theParent ) {
Object[] kids = getChildren(theParent);
return kids[theIndex];
}
public int getChildCount( Object theParent ) {
return getChildren(theParent).length;
}
public int getChildIndex( Object theChild ) {
int result = -1;
Object parent = getParent(theChild);
if (parent != null) {
Object[] kids = getChildren(parent);
for (int i = 0; i < kids.length; i++) {
if (kids[i] == theChild) {
result = i;
break;
}
}
}
return result;
}
private Object[] getChildren( ICriteria theCriteria ) {
Object[] result = null;
if (theCriteria instanceof INotCriteria) {
INotCriteria notCrit = (INotCriteria)theCriteria;
ICriteria criteria = notCrit.getCriteria();
if (criteria instanceof ILogicalCriteria) {
result = getChildren(criteria);
}
} else {
if (theCriteria instanceof ICompoundCriteria) {
ICompoundCriteria compoundCrit = (ICompoundCriteria)theCriteria;
int size = compoundCrit.getCriteriaCount();
result = new Object[size];
for (int i = 0; i < size; i++) {
ICriteria criteria = compoundCrit.getCriteria(i);
result[i] = (criteria == null) ? BuilderUtils.UNDEFINED : (Object)criteria;
}
}
}
return (result == null) ? new Object[0] : result;
}
private Object[] getChildren( IExpression theExpression ) {
Object[] result = null;
if (theExpression != null && theExpression instanceof IFunction) {
result = getChildren((IFunction)theExpression);
}
return (result == null) ? new Object[0] : result;
}
private Object[] getChildren( IFunction theFunction ) {
Object[] result = null;
if (theFunction.isImplicit()) {
// according to Alex, all implicit functions are conversions and
// the first argument is what is being converted (which could be a function or expression)
IExpression arg = theFunction.getArgs()[0];
result = (arg != null && arg instanceof IFunction) ? getChildren((IFunction)arg) : getChildren(arg);
} else {
IExpression[] args = theFunction.getArgs();
if ((args != null) && (args.length > 0)) {
result = new Object[args.length];
for (int i = 0; i < args.length; i++) {
// if arg is null need to return the undefined string
result[i] = (args[i] == null) ? BuilderUtils.UNDEFINED : (Object)args[i];
}
}
}
return (result == null) ? new Object[0] : result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public Object[] getChildren( Object theParent ) {
Object[] result = null;
if (theParent != null) {
if (theParent instanceof ICriteria) {
result = getChildren((ICriteria)theParent);
} else if (theParent instanceof IExpression) {
result = getChildren((IExpression)theParent);
}
}
return (result == null) ? new Object[0] : result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements( Object theInputElement ) {
return roots;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent( Object theElement ) {
return getParent(langObj, theElement);
}
public Object getParent( Object theRoot,
Object theChild ) {
Object result = null;
if (theRoot != theChild) {
Object[] kids = getChildren(theRoot);
for (int i = 0; i < kids.length; i++) {
if (theChild == kids[i]) {
result = theRoot;
break;
}
result = getParent(kids[i], theChild);
if (result != null) {
break;
}
}
}
return result;
}
/**
* Gets the root <code>LanguageObject</code> or a string representing an undefined element.
*
* @return the root element
*/
public Object getRoot() {
return (roots.length > 0) ? roots[0] : null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren( Object theElement ) {
return getChildren(theElement).length > 0;
}
/* (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 theViewer,
Object theOldInput,
Object theNewInput ) {
// theNewInput is null when disposing of the view
if (theNewInput != null) {
/*
* Note: See documentation for ILanguageObjectInputProvider for reason why input cannot be the LanguageObject
*/
CoreArgCheck.isInstanceOf(ILanguageObjectInputProvider.class,
theNewInput,
ILanguageObjectInputProvider.class.getName());
// viewer = theViewer;
langObj = ((ILanguageObjectInputProvider)theNewInput).getLanguageObject();
Object root = (langObj == null) ? BuilderUtils.UNDEFINED : (Object)langObj;
roots = new Object[] {root};
}
}
}