blob: 8dc449865a93f8cc3396af284e7ac3233845e00e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2012 Oracle Corporation and others.
* 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:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.dialogs;
import java.util.ArrayList;
import org.eclipse.bpel.model.Variable;
import org.eclipse.bpel.model.util.BPELUtils;
import org.eclipse.bpel.ui.details.providers.VariableTreeContentProvider;
import org.eclipse.bpel.ui.details.tree.BPELVariableTreeNode;
import org.eclipse.bpel.ui.details.tree.XSDAttributeDeclarationTreeNode;
import org.eclipse.bpel.ui.details.tree.XSDElementDeclarationTreeNode;
import org.eclipse.bpel.ui.details.tree.PartTreeNode;
import org.eclipse.bpel.ui.details.tree.ITreeNode;
import org.eclipse.bpel.ui.details.tree.TreeNode;
import org.eclipse.bpel.ui.expressions.XPathExpressionUtil;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.wst.wsdl.Part;
import org.eclipse.xsd.XSDAttributeDeclaration;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDParticle;
import org.eclipse.xsd.XSDTypeDefinition;
public class ElementTreePreviewSelectionDialog extends ElementTreeSelectionDialog {
protected Label previewLabel;
protected Text previewText;
protected Label filterLabel;
protected Text filterText;
private String thePreviewText;
private String theFilter = ""; //$NON-NLS-1$
public class TreeFilter extends ViewerFilter {
@Override
public Object[] filter(Viewer viewer, Object parent, Object[] elements) {
int size = elements.length;
ArrayList out = new ArrayList(size);
for (int i = 0; i < size; ++i) {
Object element = elements[i];
if (select(viewer, parent, element)) {
out.add(element);
}
}
return out.toArray();
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof BPELVariableTreeNode) {
Variable var = (Variable)((BPELVariableTreeNode)element).getModelObject();
if (var.getName().indexOf(theFilter) > -1)
return true;
}
else if (element instanceof XSDElementDeclarationTreeNode) {
XSDElementDeclaration xsdelem = ((XSDElementDeclarationTreeNode)element).getResolvedModelObject();
if (xsdelem.getName().indexOf(theFilter) > -1)
return true;
}
else if (element instanceof XSDAttributeDeclarationTreeNode) {
XSDAttributeDeclaration xsdattribute = ((XSDAttributeDeclarationTreeNode)element).getResolvedModelObject();
if (xsdattribute.getName().indexOf(theFilter) > -1)
return true;
}
else if (element instanceof PartTreeNode) {
Part part = (Part)((PartTreeNode)element).getModelObject();
if (part.getName().indexOf(theFilter) > -1)
return true;
}
// determine if node has child nodes and see if they would
// pass the filter test
if (((TreeNode)element).hasChildren()) {
Object[] children = ((TreeNode)element).getChildren();
for (int i=0; i<children.length; i++) {
if (select(viewer, element, children[i]))
return true;
}
}
return false;
}
}
public ElementTreePreviewSelectionDialog(Shell parent,
ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
super(parent, labelProvider, contentProvider);
addFilter(new TreeFilter());
}
protected void updatePreviewText(IStructuredSelection selection) {
if (previewText == null)
return;
VariableTreeContentProvider contentProvider = (VariableTreeContentProvider)super.getTreeViewer().getContentProvider();
Object[] path = contentProvider.getPathToRoot(selection.getFirstElement());
String preview = "$"; //$NON-NLS-1$
if (path != null) {
Variable var = null;
for (int i=path.length-1; i >=0 ; i--) {
String targetNamespace = null;
String namespacePrefix = null;
String segment = null;
Object modelObject = BPELUtil.resolveXSDObject(((ITreeNode)path[i]).getModelObject());;
if (modelObject instanceof Variable) {
var = (Variable)modelObject;
segment = var.getName();
} else if (modelObject instanceof XSDAttributeDeclaration) {
XSDAttributeDeclaration att = (XSDAttributeDeclaration) modelObject;
targetNamespace = att.getTargetNamespace();
if (targetNamespace != null) {
namespacePrefix = BPELUtils.getNamespacePrefix( var, targetNamespace );
Assert.isNotNull(namespacePrefix, XPathExpressionUtil.MSG_NS_PREFIX_NULL);
segment = "/@" + namespacePrefix + ":" + att.getName(); //$NON-NLS-1$ //$NON-NLS-2$
} else {
segment = "/@" + att.getName(); //$NON-NLS-1$
}
} else if (modelObject instanceof XSDElementDeclaration) {
XSDElementDeclaration elm = (XSDElementDeclaration) modelObject;
targetNamespace = elm.getTargetNamespace();
XSDTypeDefinition typeDef = elm.getType();
XSDParticle particle = typeDef.getComplexType();
boolean isArray = particle != null &&
(particle.getMaxOccurs() == XSDParticle.UNBOUNDED || particle.getMaxOccurs() > 1);
if (targetNamespace != null) {
namespacePrefix = BPELUtils.getNamespacePrefix( var, targetNamespace );
Assert.isNotNull(namespacePrefix, XPathExpressionUtil.MSG_NS_PREFIX_NULL);
segment = "/" + namespacePrefix + ":" + elm.getName(); //$NON-NLS-1$ //$NON-NLS-2$
} else {
segment = "/" + elm.getName() ; //$NON-NLS-1$
}
if (isArray) {
segment += "[1]"; //$NON-NLS-1$
}
}
else if (modelObject instanceof Part) {
Part part = (Part)modelObject;
segment = "." + part.getName(); //$NON-NLS-1$
}
if (segment != null)
preview += segment;
}
// store away value
previewText.setText(preview);
thePreviewText = preview;
}
}
@Override
protected Control createDialogArea(Composite parent) {
Composite filter = new Composite(parent, SWT.NONE);
GridData data1 = new GridData(GridData.FILL_BOTH);
filter.setLayoutData(data1);
GridLayout layout1 = new GridLayout();
layout1.numColumns = 1;
layout1.makeColumnsEqualWidth = false;
filter.setLayout(layout1);
filterLabel = new Label(filter, SWT.NONE);
filterLabel.setText(XPathExpressionUtil.LBL_FILTER_TEXT);
data1 = new GridData();
data1.widthHint = 80;
filterLabel.setLayoutData(data1);
filterText = new Text(filter, SWT.BORDER);
data1 = new GridData(GridData.FILL_HORIZONTAL);
//data.widthHint = 300;
filterText.setLayoutData(data1);
filterText.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
theFilter = filterText.getText();
if (theFilter.length() > 0) {
// try to filter all leaf nodes as well
getTreeViewer().refresh();
getTreeViewer().expandAll();
}
else {
getTreeViewer().refresh();
getTreeViewer().collapseAll();
}
}
});
Composite comp = (Composite)super.createDialogArea(parent);
Composite previewMain = new Composite(parent, SWT.NONE);
GridData data = new GridData(GridData.FILL_BOTH);
previewMain.setLayoutData(data);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.makeColumnsEqualWidth = false;
previewMain.setLayout(layout);
previewLabel = new Label(previewMain, SWT.NONE);
previewLabel.setText(XPathExpressionUtil.LBL_PREVIEW_TEXT);
data = new GridData();
data.widthHint = 80;
previewLabel.setLayoutData(data);
previewText = new Text(previewMain, SWT.BORDER);
data = new GridData(GridData.FILL_HORIZONTAL);
//data.widthHint = 300;
previewText.setLayoutData(data);
TreeViewer treeViewer = super.getTreeViewer();
treeViewer.addSelectionChangedListener((new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updatePreviewText((IStructuredSelection)event.getSelection());
}
}));
return comp;
}
public String getPreviewResult() {
return thePreviewText;
}
}