| /******************************************************************************* |
| * 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; |
| } |
| } |