/*
* 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.modelgenerator.wsdl.ui.wizards.soap.panels;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.xsd.impl.XSDAttributeUseImpl;
import org.eclipse.xsd.impl.XSDElementDeclarationImpl;
import org.eclipse.xsd.impl.XSDParticleImpl;
import org.teiid.designer.modelgenerator.wsdl.ui.Messages;
import org.teiid.designer.modelgenerator.wsdl.ui.wizards.soap.ImportWsdlSchemaHandler;
import org.teiid.designer.modelgenerator.wsdl.ui.wizards.soap.OperationsDetailsPage;
import org.teiid.designer.modelgenerator.wsdl.ui.wizards.soap.ProcedureInfo;
import org.teiid.designer.modelgenerator.wsdl.ui.wizards.soap.SchemaTreeModel.SchemaNode;
import org.teiid.designer.ui.common.util.WidgetFactory;
/**
* @since 8.0
*/
public class RequestSchemaContentsGroup {
TreeViewer schemaTreeViewer;
Action createElementAction;
ElementsInfoPanel elementsInfoPanel;
// TYPE either BODY or SOAP
int type;
final OperationsDetailsPage detailsPage;
public RequestSchemaContentsGroup(Composite parent, int type, OperationsDetailsPage detailsPage) {
super();
this.type = type;
this.detailsPage = detailsPage;
createPanel(parent);
}
private void createPanel(Composite parent) {
Group schemaContentsGroup = WidgetFactory.createGroup(parent, Messages.SchemaContents, SWT.NONE, 1, 4);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 1;
gd.heightHint = 120;
schemaContentsGroup.setLayoutData(gd);
this.schemaTreeViewer = new TreeViewer(schemaContentsGroup, SWT.MULTI);
this.schemaTreeViewer.setContentProvider(this.detailsPage.getSchemaContentProvider());
this.schemaTreeViewer.setLabelProvider(this.detailsPage.getSchemaLabelProvider());
this.schemaTreeViewer.setAutoExpandLevel(3);
GridData data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 4;
this.schemaTreeViewer.getControl().setLayoutData(data);
this.schemaTreeViewer.setInput(null);
// Add a Context Menu
final MenuManager columnMenuManager = new MenuManager();
this.schemaTreeViewer.getControl().setMenu(columnMenuManager.createContextMenu(parent));
this.schemaTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
/**
* {@inheritDoc}
*
* @see oblafond@redhat.comrg.eclipse.jface.viewers.
* ISelectionChangedListener #selectionChanged(org.eclipse
* .jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(final SelectionChangedEvent event) {
columnMenuManager.removeAll();
IStructuredSelection selection = (IStructuredSelection) schemaTreeViewer.getSelection();
if( selection.size() == 1 && selection.getFirstElement() instanceof SchemaNode) {
Object element = ((SchemaNode)selection.getFirstElement()).getElement();
if (element instanceof XSDParticleImpl ||
element instanceof XSDElementDeclarationImpl ||
element instanceof XSDAttributeUseImpl ) {
columnMenuManager.add(createElementAction);
}
} else {
if( canAddAllSelected()) {
columnMenuManager.add(createElementAction);
}
}
}
});
this.schemaTreeViewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if (selection != null && !selection.isEmpty() && selection.getFirstElement() instanceof SchemaNode) {
Object element = ((SchemaNode)selection.getFirstElement()).getElement();
if( ImportWsdlSchemaHandler.shouldCreateRequestColumn(element) ) {
createRequestColumn();
}
}
}
});
this.createElementAction = new Action(Messages.AddAsNewElement) {
@Override
public void run() {
createRequestColumn();
}
};
}
public void setElementsInfoPanel(ElementsInfoPanel panel) {
this.elementsInfoPanel = panel;
}
private boolean canAddAllSelected() {
boolean result = true;
IStructuredSelection selection = (IStructuredSelection) schemaTreeViewer.getSelection();
if (selection.size() > 0 ) {
for( Object obj : selection.toArray() ) {
if( obj instanceof SchemaNode ) {
Object element = ((SchemaNode)selection.getFirstElement()).getElement();
if( !ImportWsdlSchemaHandler.shouldCreateRequestColumn(element) ) {
result = false;
}
}
}
}
return result;
}
public String[] createRequestColumn() {
List<String> results = new ArrayList<String>();
IStructuredSelection selection = (IStructuredSelection) schemaTreeViewer.getSelection();
for( Object obj : selection.toArray() ) {
IStructuredSelection sel = new StructuredSelection(obj);
String value = this.detailsPage.getSchemaHandler().createRequestColumn(this.type, sel, getRequestInfo());
if( value != null ) {
results.add(value);
}
}
return results.toArray(new String[results.size()]);
}
public void setInput(Object value) {
schemaTreeViewer.setInput(value);
// Update the columns view buttons
elementsInfoPanel.disableButtons();
}
private ProcedureInfo getRequestInfo() {
return this.detailsPage.getProcedureGenerator().getRequestInfo();
}
public void setEnabled(boolean enable) {
this.schemaTreeViewer.getTree().setEnabled(enable);
this.elementsInfoPanel.setEnabled(enable);
}
}