/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* All rights reserved. This program and the accompanying materials
* are 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:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.ui.v2.dt;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.wst.sse.sieditor.model.api.IWsdlModelRoot;
import org.eclipse.wst.sse.sieditor.model.api.IXSDModelRoot;
import org.eclipse.wst.sse.sieditor.model.utils.EmfWsdlUtils;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IDescription;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
import org.eclipse.wst.sse.sieditor.ui.v2.UIConstants;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.IDataTypesTreeNode;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.impl.ImportedTypesNode;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.impl.ImportedXsdTypesNode;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.impl.NamespaceNode;
import org.eclipse.wst.sse.sieditor.ui.v2.factory.TreeNodeMapper;
import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
public class DataTypesContentProvider implements ITreeContentProvider {
private final IDataTypesFormPageController controller;
public DataTypesContentProvider(final IDataTypesFormPageController controller) {
this.controller = controller;
}
public Object[] getChildren(final Object parentElement) {
if (parentElement instanceof IDataTypesTreeNode) {
return ((IDataTypesTreeNode) parentElement).getChildren();
}
return UIConstants.EMPTY_ARRAY;
}
public Object getParent(final Object element) {
if (element instanceof IDataTypesTreeNode) {
return ((IDataTypesTreeNode) element).getParent();
}
return null;
}
public boolean hasChildren(final Object element) {
if (element instanceof IDataTypesTreeNode) {
return ((IDataTypesTreeNode) element).hasChildren();
}
return false;
}
public Object[] getElements(final Object inputElement) {
final List<Object> nodes = new ArrayList<Object>();
final TreeNodeMapper treeNodeMapper = getController().getTreeNodeMapper();
if (inputElement instanceof IWsdlModelRoot) {
final IWsdlModelRoot modelRoot = (IWsdlModelRoot) inputElement;
final IDescription description = modelRoot.getDescription();
final Collection<ISchema> schemas = description.getContainedSchemas();
if (schemas != null) {
for (final ISchema iSchema : schemas) {
final List<ITreeNode> treeNodes = treeNodeMapper.getTreeNode(iSchema, ITreeNode.CATEGORY_MAIN, null);
ITreeNode namespaceNode = treeNodes.isEmpty() ? null : treeNodes.get(0);
if (null == namespaceNode &&
// do not show namespace nodes for WS-I imports.
EmfWsdlUtils.getWsiImports(iSchema.getComponent()).isEmpty()) {
namespaceNode = new NamespaceNode(iSchema, treeNodeMapper);
treeNodeMapper.addToNodeMap(iSchema, namespaceNode);
}
if (namespaceNode != null) {
nodes.add(namespaceNode);
}
}
}
final List<ITreeNode> treeNodes = treeNodeMapper.getTreeNode(description, ITreeNode.CATEGORY_STATIC_ROOT, null);
ITreeNode importedTypesNode = treeNodes.isEmpty() ? null : treeNodes.get(0);
if (importedTypesNode == null) {
importedTypesNode = new ImportedTypesNode(description, treeNodeMapper);
treeNodeMapper.addToNodeMap(description, importedTypesNode);
}
if (importedTypesNode.hasChildren()) {
nodes.add(importedTypesNode);
}
} else if (inputElement instanceof IXSDModelRoot) {
final IXSDModelRoot modelRoot = (IXSDModelRoot) inputElement;
final ISchema schema = modelRoot.getSchema();
List<ITreeNode> treeNodes = treeNodeMapper.getTreeNode(schema, ITreeNode.CATEGORY_MAIN, null);
ITreeNode namespaceNode = treeNodes.isEmpty() ? null : treeNodes.get(0);
if (namespaceNode == null) {
// do not add the namespace node itself but its children
// directly
namespaceNode = new NamespaceNode(schema, treeNodeMapper);
treeNodeMapper.addToNodeMap(schema, namespaceNode);
}
nodes.addAll(Arrays.asList(namespaceNode.getChildren()));
treeNodes = treeNodeMapper.getTreeNode(schema, ITreeNode.CATEGORY_IMPORTED, null);
final ITreeNode treeNode = treeNodes.isEmpty() ? null : treeNodes.get(0);
ImportedXsdTypesNode importedTypesNode;
if (treeNode instanceof ImportedXsdTypesNode) {
importedTypesNode = (ImportedXsdTypesNode) treeNode;
} else {
importedTypesNode = new ImportedXsdTypesNode(schema, treeNodeMapper);
}
if (importedTypesNode.hasChildren()) {
nodes.add(importedTypesNode);
treeNodeMapper.addToNodeMap(schema, importedTypesNode);
}
}
return nodes.toArray();
}
public void dispose() {
}
public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {
}
public IDataTypesFormPageController getController() {
return controller;
}
}