/*******************************************************************************
* 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.wsdltree.nodes;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IFault;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IOperation;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IParameter;
import org.eclipse.wst.sse.sieditor.ui.Activator;
import org.eclipse.wst.sse.sieditor.ui.i18n.Messages;
import org.eclipse.wst.sse.sieditor.ui.v2.UIUtils;
import org.eclipse.wst.sse.sieditor.ui.v2.factory.WSDLNodeFactory;
import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdl.controller.SIFormPageController;
public class OperationCategoryNode extends AbstractWsdlTreeNode {
private final IOperation operation;
public IOperation getOperation() {
return operation;
}
private final OperationCategory operationCategory;
private final SIFormPageController nodeMapperContainer;
public OperationCategoryNode(final ITreeNode parent, final OperationCategory operationCategory, final IOperation operation,
final SIFormPageController nodeMapperContainer) {
super(null, parent, nodeMapperContainer == null ? null : nodeMapperContainer.getTreeNodeMapper(), UIUtils
.getCorrespondingITreenodeCategory(operationCategory));
this.operationCategory = operationCategory;
this.nodeMapperContainer = nodeMapperContainer;
this.operation = operation;
}
/**
* Based on which type of Category node, parameter nodes are returned<br/>
* -For Input category node - Input parameter nodes<br/>
* -For Output category node - Output parameter nodes<br/>
* -For Fault category node - Fault nodes are returned
*/
@Override
public Object[] getChildren() {
final ArrayList<IParameter> parameters = new ArrayList<IParameter>();
final ArrayList<ParameterNode> parameterNodes = new ArrayList<ParameterNode>();
if (operationCategory.equals(OperationCategory.INPUT)) {
parameters.addAll(getOperation().getAllInputParameters());
} else if (operationCategory.equals(OperationCategory.OUTPUT)) {
parameters.addAll(getOperation().getAllOutputParameters());
} else {
final ArrayList<IFault> faults = new ArrayList<IFault>(getOperation().getAllFaults());
final ArrayList<FaultNode> faultNodes = new ArrayList<FaultNode>();
for (final IFault fault : faults) {
faultNodes.add(getFaultNode(fault));
}
return faultNodes.toArray();
}
if (parameters.size() > 0) {
for (final IParameter parameter : parameters) {
parameterNodes.add(getParameterNode(parameter));
}
}
return parameterNodes.toArray();
}
@Override
public Image getImage() {
return getImage(getParent().isReadOnly());
}
public Image getImage(final boolean isReadOnly) {
if (operationCategory.equals(OperationCategory.INPUT))
return isReadOnly ? getImageRegistry().get(Activator.NODE_OPER_INPUT_GRAY) : getImageRegistry().get(
Activator.NODE_OPER_INPUT);
else if (operationCategory.equals(OperationCategory.OUTPUT))
return isReadOnly ? getImageRegistry().get(Activator.NODE_OPER_OUTPUT_GRAY) : getImageRegistry().get(
Activator.NODE_OPER_OUTPUT);
else if (operationCategory.equals(OperationCategory.FAULT))
return isReadOnly ? getImageRegistry().get(Activator.NODE_OPER_FAULTS_GRAY) : getImageRegistry().get(
Activator.NODE_OPER_FAULTS);
return null;
}
@Override
public boolean hasChildren() {
switch (operationCategory) {
case INPUT:
return !getOperation().getAllInputParameters().isEmpty();
case OUTPUT:
return !getOperation().getAllOutputParameters().isEmpty();
case FAULT:
return !getOperation().getAllFaults().isEmpty();
default:
return true;
}
}
@Override
public IModelObject getModelObject() {
return null;
}
public OperationCategory getOperationCategory() {
return operationCategory;
}
private FaultNode getFaultNode(final IFault fault) {
FaultNode faultNode = (FaultNode) nodeMapperContainer.getTreeNodeMapper().getTreeNode(fault);
if (faultNode == null)
faultNode = WSDLNodeFactory.getInstance().createFaultNode(this, fault, nodeMapperContainer);
return faultNode;
}
private ParameterNode getParameterNode(final IParameter parameter) {
final List<ITreeNode> treeNodes = nodeMapperContainer.getTreeNodeMapper().getTreeNode(parameter, this);
ParameterNode parameterNode = null;
if (treeNodes.isEmpty()) {
parameterNode = WSDLNodeFactory.getInstance().createParameterNode(this, parameter, nodeMapperContainer);
} else {
parameterNode = (ParameterNode) treeNodes.get(0);
}
return parameterNode;
}
@Override
protected ImageRegistry getImageRegistry() {
return Activator.getDefault().getImageRegistry();
}
/**
* Returns a tooltip that should be shown for the element in the tree. If
* the categories (INPUT, OUTPUT, FAULTS) are shown in the tree then tooltip
* will be <code>null</code>. Otherwise a tooltip should be provided like
* "Input Parameter Bla bla"
*
* @param element
* Parameter or Fault node
* @return the tooltip to display in tree
*/
public String getTooltipTextFor(final ITreeNode element) {
String tooltip = null;
if (!nodeMapperContainer.isShowCategoryNodes()) {
switch (operationCategory) {
case INPUT:
tooltip = Messages.OperationCategoryNode_input_param_tooltip + element.getDisplayName();
break;
case OUTPUT:
tooltip = Messages.OperationCategoryNode_output_param_tooltip + element.getDisplayName();
break;
case FAULT:
tooltip = Messages.OperationCategoryNode_fault_tooltip + element.getDisplayName();
break;
}
}
return tooltip;
}
}