/* * 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.XSDComplexTypeDefinition; 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 ResponseSchemaContentsGroup { TreeViewer schemaTreeViewer; Action createColumnAction, setRootPathAction; ColumnsInfoPanel columnsInfoPanel; // TYPE either BODY or SOAP int type; final OperationsDetailsPage detailsPage; public ResponseSchemaContentsGroup(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 org.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( ImportWsdlSchemaHandler.shouldCreateResponseColumn(element) ) { columnMenuManager.add(createColumnAction); } else if (element instanceof XSDElementDeclarationImpl ) { Object type = ((XSDElementDeclarationImpl) element).getTypeDefinition(); if( type instanceof XSDComplexTypeDefinition) { columnMenuManager.add(setRootPathAction); } } else if (element instanceof XSDParticleImpl ) { columnMenuManager.add(setRootPathAction); } } else { if( canAddAllSelected()) { columnMenuManager.add(createColumnAction); } } } }); 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.shouldCreateResponseColumn(element) ) { createResponseColumn(); } } } }); this.createColumnAction = new Action(Messages.AddAsNewElement) { @Override public void run() { createResponseColumn(); } }; this.setRootPathAction = new Action(Messages.SetAsRootPath) { @Override public void run() { setRootPath(); } }; } private void setRootPath() { IStructuredSelection selection = (IStructuredSelection) schemaTreeViewer.getSelection(); Object obj = selection.getFirstElement(); String pathValue = ((SchemaNode)obj).getChildren().iterator().next().getFullPath(); if( pathValue.endsWith("/")) { //$NON-NLS-1$ pathValue = pathValue.substring(0, pathValue.length()-1); } this.columnsInfoPanel.getRootPathText().setText(pathValue); getResponseInfo().setRootPath(pathValue); this.columnsInfoPanel.refresh(); } 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( element instanceof XSDElementDeclarationImpl ) { result = false; } else { if( !ImportWsdlSchemaHandler.shouldCreateResponseColumn(element) ) { result = false; } } } } } return result; } public void setColumnsInfoPanel(ColumnsInfoPanel panel) { this.columnsInfoPanel = panel; } public String[] createResponseColumn() { 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().createResponseColumn(this.type, sel, getResponseInfo()); 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 columnsInfoPanel.disableButtons(); } private ProcedureInfo getResponseInfo() { return this.detailsPage.getProcedureGenerator().getResponseInfo(); } public void setEnabled(boolean enable) { this.schemaTreeViewer.getTree().setEnabled(enable); this.columnsInfoPanel.setEnabled(enable); } }