/* * 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.webservice.ui.editor; import java.io.StringReader; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import net.sf.saxon.om.DocumentInfo; import net.sf.saxon.om.NodeInfo; import net.sf.saxon.type.Type; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.xsd.XSDConcreteComponent; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDModelGroup; import org.eclipse.xsd.XSDParticle; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.core.designer.util.I18nUtil; import org.teiid.core.designer.xml.XPathHelper; import org.teiid.designer.metamodels.webservice.Input; import org.teiid.designer.metamodels.webservice.Operation; import org.teiid.designer.metamodels.xsd.XsdUtil; import org.teiid.designer.query.sql.ISQLConstants; import org.teiid.designer.query.sql.lang.ILanguageObject; import org.teiid.designer.query.sql.proc.IAssignmentStatement; import org.teiid.designer.query.sql.proc.IDeclareStatement; import org.teiid.designer.query.sql.proc.IStatement; import org.teiid.designer.transformation.ui.editors.sqleditor.SqlEditorPanel; import org.teiid.designer.ui.OverlayImageIcon; import org.teiid.designer.ui.common.graphics.GlobalUiColorManager; import org.teiid.designer.ui.common.tree.AbstractTreeContentProvider; import org.teiid.designer.ui.common.util.UiUtil; import org.teiid.designer.ui.common.util.WidgetFactory; import org.teiid.designer.ui.common.util.WidgetUtil; import org.teiid.designer.ui.common.widget.DefaultTreeViewerController; import org.teiid.designer.ui.common.widget.Dialog; import org.teiid.designer.ui.viewsupport.ModelUtilities; import org.teiid.designer.webservice.procedure.DocumentGenerator; import org.teiid.designer.webservice.procedure.XsdInstanceNode; import org.teiid.designer.webservice.ui.IInternalUiConstants; import org.teiid.designer.webservice.ui.WebServiceUiPlugin; import org.teiid.designer.webservice.ui.util.WebServiceUiUtil; import org.teiid.designer.webservice.util.WebServiceUtil; import org.teiid.query.ui.sqleditor.component.DisplayNode; import org.teiid.query.ui.sqleditor.component.DisplayNodeFactory; /** * @since 8.0 */ public class VariableEditorDialog extends Dialog implements IInternalUiConstants, IInternalUiConstants.Images, CoreStringUtil.Constants { private static final String I18N_PFX = I18nUtil.getPropertyPrefix(VariableEditorDialog.class); private static final WebServiceUiPlugin PLUGIN = WebServiceUiPlugin.getDefault(); private static final String NULL_ELEMENT_MSG = UTIL.getString(I18N_PFX + "nullElementMsg"); //$NON-NLS-1$ private static final String NULL_INPUT_MSG = UTIL.getString(I18N_PFX + "nullInputMsg"); //$NON-NLS-1$ private static final String REQUEST_DOC_DESC = UTIL.getString(I18N_PFX + "requestDocumentDescription"); //$NON-NLS-1$ private static final String REQUEST_DOC_TITLE = UTIL.getString(I18N_PFX + "requestDocumentTitle"); //$NON-NLS-1$ private static final String TITLE = UTIL.getString(I18N_PFX + "title"); //$NON-NLS-1$ private static final String VAR_XPATH_TITLE = I18N_PFX + "variableXpathTitle"; //$NON-NLS-1$ private static final String VARS_DESC = UTIL.getString(I18N_PFX + "variablesDescription"); //$NON-NLS-1$ private static final String XPATH_TITLE = UTIL.getString(I18N_PFX + "xpathTitle"); //$NON-NLS-1$ private static final String X_PREF = I18N_PFX + "x"; //$NON-NLS-1$ private static final String Y_PREF = I18N_PFX + "y"; //$NON-NLS-1$ private static final String WTH_PREF = I18N_PFX + "width"; //$NON-NLS-1$ private static final String HGT_PREF = I18N_PFX + "height"; //$NON-NLS-1$ private static final int DFLT_LEFT_H_WGT = 750; private static final int DFLT_RIGHT_H_WGT = 250; private static final int DFLT_TOP_V_WGT = 750; private static final int DFLT_BOTTOM_V_WGT = 250; private static final String LEFT_H_WGT_PREF = I18N_PFX + "leftHorizontalWeight"; //$NON-NLS-1$ private static final String RIGHT_H_WGT_PREF = I18N_PFX + "rightHorizontalWeight"; //$NON-NLS-1$ private static final String TOP_V_WGT_PREF = I18N_PFX + "leftVerticalWeight"; //$NON-NLS-1$ private static final String BOTTOM_V_WGT_PREF = I18N_PFX + "rightVerticalWeight"; //$NON-NLS-1$ private OperationObjectEditorPage editor; private Input input; private XsdInstanceNode rootNode; private Map nodesToDeclarations; private TreeViewer nodeViewer; private InputVariableSection varSection; private Section xpathSection; private StyledText xpathText; private Color normalBkgd, recursionBkgd; private Set highlightedRecursionItems = new HashSet(); // TreeItems private IStructuredSelection selection; private SashForm hSplitter, vSplitter; public VariableEditorDialog( Shell shell, IStructuredSelection selection, OperationObjectEditorPage editor ) { super(shell, TITLE); this.editor = editor; this.input = ((Operation)editor.getCurrentMappingRoot().getTarget()).getInput(); if (this.input != null) { XSDElementDeclaration element = this.input.getContentElement(); if (element != null) { this.rootNode = new XsdInstanceNode(element); } } this.nodesToDeclarations = new HashMap(editor.getDeclarationsToAssignments().size()); this.selection = selection; } private void addDisplayNode( IStatement statement ) { DisplayNode block = this.editor.findBlock(); DisplayNode newNode = DisplayNodeFactory.createDisplayNode(block, statement); if (newNode != null) { newNode.setVisible(true, true); // Add new statement's display nodes to block and its ancestors List newNodes = newNode.getDisplayNodeList(); for (DisplayNode ancestor = block; ancestor != null; ancestor = ancestor.getParent()) { List nodes = ancestor.getDisplayNodeList(); for (int ndx = 0; ndx < nodes.size(); ++ndx) { DisplayNode node = (DisplayNode)nodes.get(ndx); if (node.getParent() == block && ISQLConstants.BEGIN.equals(node.toString())) { nodes.addAll(ndx + 2, newNodes); break; } } // for } // for } SqlEditorPanel editorPanel = this.editor.getCurrentSqlEditor(); editorPanel.setText(editorPanel.getQueryDisplayComponent().getDisplayNode().toDisplayString()); editorPanel.setHasPendingChanges(); } /** * @see org.eclipse.jface.dialogs.Dialog#createContents(org.eclipse.swt.widgets.Composite) * @since 5.0.1 */ @Override protected Control createContents( Composite parent ) { Control ctrl = super.createContents(parent); Button button = getButton(Window.CANCEL); ((GridLayout)button.getParent().getLayout()).numColumns--; button.dispose(); // Restore the previously saved size or, if not present, set the default size IPreferenceStore store = WebServiceUiPlugin.getDefault().getPreferenceStore(); int wth = store.getInt(WTH_PREF); int hgt = store.getInt(HGT_PREF); if (wth == 0) { setSizeRelativeToScreen(60, 50); } else { getShell().setSize(wth, hgt); } // Restore the previously saved location or, if not present, center it int x = store.getInt(X_PREF); int y = store.getInt(Y_PREF); if (x == 0) { setCenterOnDisplay(true); } else { getShell().setLocation(x, y); } // Create listener to save dialog bounds to preferences as it changes getShell().addControlListener(new ControlAdapter() { @Override public void controlMoved( ControlEvent event ) { updateLocationPreferences(); } @Override public void controlResized( ControlEvent event ) { updateSizePreferences(); } }); return ctrl; } /** * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) * @since 5.0.1 */ @Override protected Control createDialogArea( Composite parent ) { parent = (Composite)super.createDialogArea(parent); if (this.input == null) { WidgetFactory.createStyledTextBox(parent, NULL_INPUT_MSG); return parent; } if (this.rootNode == null) { WidgetFactory.createStyledTextBox(parent, NULL_ELEMENT_MSG); return parent; } FillLayout fillLayout = new FillLayout(); parent.setLayout(fillLayout); FormToolkit toolkit = WebServiceUiPlugin.getDefault().getFormToolkit(parent.getDisplay()); Composite form = toolkit.createForm(parent).getBody(); form.setLayout(fillLayout); this.vSplitter = new SashForm(form, SWT.VERTICAL); this.hSplitter = WidgetFactory.createSplitter(this.vSplitter); Section section = toolkit.createSection(this.hSplitter, ExpandableComposite.TITLE_BAR | Section.DESCRIPTION); section.setText(REQUEST_DOC_TITLE); section.setDescription(REQUEST_DOC_DESC); toolkit.paintBordersFor(section); this.nodeViewer = WidgetFactory.createTreeViewer2(section, SWT.CHECK, new DefaultTreeViewerController() { @Override public void checkedStateToggled( TreeItem item ) { nodeCheckedStateToggled(item); } @Override public boolean isItemCheckable( TreeItem item ) { return isNodeCheckable(item); } @Override public void itemExpanded( TreeExpansionEvent event ) { nodeExpanded(event); } @Override public void itemSelected( SelectionChangedEvent event ) { nodeSelected(event); } @Override public void update( TreeItem item, boolean checked ) { nodeUpdated(item); } }); section.setClient(this.nodeViewer.getTree()); this.nodeViewer.setContentProvider(new AbstractTreeContentProvider() { @Override public Object[] getChildren( Object element ) { return getNodeChildren(element); } @Override public Object getParent( Object element ) { return getNodeParent(element); } @Override public boolean hasChildren( Object element ) { return getNodeHasChildren(element); } }); this.nodeViewer.setLabelProvider(new LabelProvider() { @Override public Image getImage( Object element ) { return getNodeImage(element); } @Override public String getText( Object element ) { return getNodeName(element); } }); this.varSection = new InputVariableSection(hSplitter, VARS_DESC, editor) { }; this.varSection.create(); this.varSection.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event ) { variableSelected(); } }); this.xpathSection = toolkit.createSection(vSplitter, ExpandableComposite.TITLE_BAR); this.xpathSection.setText(XPATH_TITLE); toolkit.paintBordersFor(this.xpathSection); this.xpathText = new StyledText(this.xpathSection, SWT.WRAP); this.xpathText.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); this.xpathSection.setClient(this.xpathText); this.xpathText.setEditable(false); // Restore splitter weights from preferences (or set default values if not present) IPreferenceStore store = WebServiceUiPlugin.getDefault().getPreferenceStore(); int leftHWgt = store.getInt(LEFT_H_WGT_PREF); int rightHWgt = store.getInt(RIGHT_H_WGT_PREF); this.hSplitter.setWeights(new int[] {(leftHWgt == 0 ? DFLT_LEFT_H_WGT : leftHWgt), (rightHWgt == 0 ? DFLT_RIGHT_H_WGT : rightHWgt)}); int topVWgt = store.getInt(TOP_V_WGT_PREF); int bottomVWgt = store.getInt(BOTTOM_V_WGT_PREF); this.vSplitter.setWeights(new int[] {(topVWgt == 0 ? DFLT_TOP_V_WGT : topVWgt), (bottomVWgt == 0 ? DFLT_BOTTOM_V_WGT : bottomVWgt)}); // Create listener to save splitter weights to preferences before splitters are disposed this.nodeViewer.getTree().getParent().addControlListener(new ControlAdapter() { @Override public void controlResized( ControlEvent event ) { updateWeightPreferences(); } }); // Initialize viewers this.nodeViewer.setInput(this); // Expand the tree to the first level this.nodeViewer.expandToLevel(2); // Save "normal" background color this.normalBkgd = this.nodeViewer.getTree().getItem(0).getBackground(); // Create checked background color this.recursionBkgd = GlobalUiColorManager.getColor(new RGB(204, 204, 255)); // Select nodes that are targets of existing variables updateNodesToDeclarations(); // Update root node checkboxes updateCheckBoxes(this.nodeViewer.getTree().getItems()); // Make initial selection if (this.selection != null && !this.selection.isEmpty()) { this.varSection.select((Entry)this.selection.getFirstElement()); } return parent; } private XsdInstanceNode getNode( NodeInfo node ) { if (node.getParent() instanceof DocumentInfo) { return this.rootNode; } XsdInstanceNode parent = getNode(node.getParent()); if (parent == null) { return null; } return getNode(node.getLocalPart(), node.getURI(), parent); } private XsdInstanceNode getNode( String name, String namespace, XsdInstanceNode node ) { XsdInstanceNode[] children = node.getChildren(); for (int ndx = 0; ndx < children.length; ++ndx) { XsdInstanceNode child = children[ndx]; if (child.getResolvedXsdComponent() instanceof XSDModelGroup) { child = getNode(name, namespace, child); if (child != null) { return child; } } else if (name.equals(child.getName()) && namespace.equals(child.getTargetNamespace())) { return child; } } // for return null; } private XsdInstanceNode getNode( IDeclareStatement declaration ) { for (Iterator iter = this.nodesToDeclarations.entrySet().iterator(); iter.hasNext();) { Entry nodeEntry = (Entry)iter.next(); if (nodeEntry.getValue().equals(declaration)) { return (XsdInstanceNode)nodeEntry.getKey(); } } // for return null; } Object[] getNodeChildren( Object element ) { if (element == this) { return new Object[] {this.rootNode}; } return ((XsdInstanceNode)element).getChildren(); } boolean getNodeHasChildren( Object element ) { XsdInstanceNode node = (XsdInstanceNode)element; Object[] children = node.getChildren(); // Children created lazily, so in case one of node's children dynamically determined to be recursive, update any recursive // ancestors. for (XsdInstanceNode ancestor = node.getParent(); ancestor != null; ancestor = ancestor.getParent()) { if (ancestor.isRecursive()) { this.nodeViewer.update(ancestor, null); } } return (children.length > 0); } Image getNodeImage( Object element ) { // There is an EMF bug that prevents maxOccurs values other than 1 from being stored correctly for particles with model // group definition content, so just show image of underlying model group XsdInstanceNode node = (XsdInstanceNode)element; XSDConcreteComponent comp = node.getXsdComponent(); Image img; if (comp instanceof XSDParticle) { XSDParticle particle = (XSDParticle)comp; // Start with image of "real" component img = ModelUtilities.getEMFLabelProvider().getImage(particle.getTerm()); // If non-default minOccurs/maxOccurs, overlay occurs image int min = XsdUtil.getMinOccurs(particle); int max = XsdUtil.getMaxOccurs(particle); if (min != 1 || max != 1) { Image overlay; if (min == 0) { if (max == 0) { overlay = PLUGIN.getImage(OCCURS_ZERO); } else if (max == 1) { overlay = PLUGIN.getImage(OCCURS_ZERO_TO_ONE); } else if (max > 1) { overlay = PLUGIN.getImage(OCCURS_ZERO_TO_N); } else { // Must be unbounded overlay = PLUGIN.getImage(OCCURS_ZERO_TO_UNBOUNDED); } } else if (min == 1) { if (max > 1) { overlay = PLUGIN.getImage(OCCURS_ONE_TO_N); } else { // Must be unbounded overlay = PLUGIN.getImage(OCCURS_ONE_TO_UNBOUNDED); } } else { // Min > 1 if (max == min) { overlay = PLUGIN.getImage(OCCURS_N); } else if (max > min) { overlay = PLUGIN.getImage(OCCURS_N_TO_M); } else { // Must be unbounded overlay = PLUGIN.getImage(OCCURS_N_TO_UNBOUNDED); } } img = new OverlayImageIcon(img, overlay, OverlayImageIcon.BOTTOM_LEFT).getImage(); } } else { img = ModelUtilities.getEMFLabelProvider().getImage(comp); } // If recursive, overlay recursive image if (node.isRecursive()) { return new OverlayImageIcon(img, PLUGIN.getImage(RECURSIVE), OverlayImageIcon.TOP_RIGHT).getImage(); } return img; } String getNodeName( Object element ) { XsdInstanceNode node = (XsdInstanceNode)element; XSDConcreteComponent comp = node.getXsdComponent(); if (comp instanceof XSDParticle) { comp = ((XSDParticle)comp).getTerm(); } return ModelUtilities.getEMFLabelProvider().getText(comp); } Object getNodeParent( Object element ) { return ((XsdInstanceNode)element).getParent(); } private void highlightRecursionItems( TreeItem item, TreeItem selectedItem ) { XSDConcreteComponent comp = ((XsdInstanceNode)item.getData()).getXsdComponent(); if (comp instanceof XSDParticle) { comp = ((XSDParticle)comp).getTerm(); } highlightRecursionItems(item, selectedItem, comp); } private void highlightRecursionItems( TreeItem item, TreeItem selectedItem, XSDConcreteComponent rootComponent ) { TreeItem[] items = item.getItems(); for (int ndx = items.length; --ndx >= 0;) { TreeItem childItem = items[ndx]; if (childItem != selectedItem) { XsdInstanceNode childNode = (XsdInstanceNode)childItem.getData(); if (childNode.isRecursive()) { XSDConcreteComponent childComp = childNode.getXsdComponent(); if (childComp instanceof XSDParticle) { childComp = ((XSDParticle)childComp).getTerm(); } if (childComp == rootComponent) { this.highlightedRecursionItems.add(childItem); childItem.setBackground(this.recursionBkgd); } } } if (childItem.getExpanded()) { highlightRecursionItems(childItem, selectedItem, rootComponent); } } } private boolean isDescendentOf( DisplayNode node, DisplayNode ancestor ) { if (node == ancestor) { return true; } DisplayNode parent = node.getParent(); if (parent == null) { return false; } return isDescendentOf(parent, ancestor); } boolean isNodeCheckable( TreeItem item ) { return ((XsdInstanceNode)item.getData()).isSelectable(); } void nodeCheckedStateToggled( TreeItem item ) { XsdInstanceNode node = (XsdInstanceNode)item.getData(); node.setSelected(item.getChecked()); if (item.getChecked()) { IDeclareStatement declaration = WebServiceUiUtil.createDeclareStatement(node, input); this.nodesToDeclarations.put(node, declaration); WebServiceUiUtil.ensureVariablesUnique(this.nodesToDeclarations); this.editor.getDeclarationsToAssignments().put(declaration, declaration); addDisplayNode(declaration); } else { removeVariableStatements((IDeclareStatement)this.nodesToDeclarations.remove(node)); } this.varSection.refresh(); this.editor.refreshVariables(); this.editor.getCurrentSqlEditor().setHasPendingChanges(); } void nodeExpanded( TreeExpansionEvent event ) { // Update checkboxes of expanded item's children TreeItem item = WidgetUtil.findTreeItem(event.getElement(), this.nodeViewer); updateCheckBoxes(item.getItems()); } void nodeSelected( SelectionChangedEvent event ) { // System.out.println("VariableEditorDialog.nodeSelected()"); // Clear any previously highlighted recursion items for (Iterator iter = this.highlightedRecursionItems.iterator(); iter.hasNext();) { TreeItem item = (TreeItem)iter.next(); item.setBackground(this.normalBkgd); } // for this.nodeViewer.update(this.highlightedRecursionItems.toArray(), null); this.highlightedRecursionItems.clear(); // Handle new selection IStructuredSelection selection = (IStructuredSelection)event.getSelection(); if (!selection.isEmpty()) { XsdInstanceNode node = (XsdInstanceNode)selection.getFirstElement(); // If recursive, highlight all recursion items for the recursion root if (node.isRecursive()) { XsdInstanceNode recursionRoot = node.findRecursionRoot(); TreeItem item = WidgetUtil.findTreeItem(node, this.nodeViewer); if (recursionRoot == null) { recursionRoot = node; highlightRecursionItems(item, item); } else { TreeItem recursionItem = WidgetUtil.findTreeItem(recursionRoot, this.nodeViewer); this.highlightedRecursionItems.add(recursionItem); recursionItem.setBackground(this.recursionBkgd); highlightRecursionItems(recursionItem, item); } this.nodeViewer.update(this.highlightedRecursionItems.toArray(), null); } IDeclareStatement declaration = (IDeclareStatement)this.nodesToDeclarations.get(node); if (declaration != null) { for (Iterator iter = this.editor.getDeclarationsToAssignments().entrySet().iterator(); iter.hasNext();) { Entry entry = (Entry)iter.next(); if (entry.getKey() == declaration) { this.varSection.select(entry); break; } } // for } else { this.varSection.clearSelection(); } } } void nodeUpdated( TreeItem item ) { if (item.getGrayed()) { item.setChecked(false); } } private void removeVariableStatements( IDeclareStatement declaration ) { IAssignmentStatement assignment = (IAssignmentStatement)this.editor.getDeclarationsToAssignments().remove(declaration); DisplayNode block = this.editor.findBlock(); if (block != null) { for (Iterator childIter = block.getChildren().iterator(); childIter.hasNext();) { DisplayNode blockChild = (DisplayNode)childIter.next(); if (blockChild.getLanguageObject() instanceof IDeclareStatement || blockChild.getLanguageObject() instanceof IAssignmentStatement) { ILanguageObject obj = blockChild.getLanguageObject(); if (obj == declaration || obj == assignment) { childIter.remove(); for (DisplayNode displayNode = block; displayNode != null; displayNode = displayNode.getParent()) { for (Iterator nodeIter = displayNode.getDisplayNodeList().iterator(); nodeIter.hasNext();) { if (isDescendentOf((DisplayNode)nodeIter.next(), blockChild)) { nodeIter.remove(); } } // for } // for if (obj == assignment) { break; } } } } // for } SqlEditorPanel editorPanel = this.editor.getCurrentSqlEditor(); editorPanel.setText(editorPanel.getQueryDisplayComponent().getDisplayNode().toDisplayString()); editorPanel.setHasPendingChanges(); } private void updateCheckBoxes( TreeItem[] items ) { for (int ndx = items.length; --ndx >= 0;) { TreeItem item = items[ndx]; XsdInstanceNode node = (XsdInstanceNode)item.getData(); if (!node.isSelectable()) { item.setGrayed(true); } else if (node.isSelected()) { item.setChecked(true); } if (item.getExpanded()) { updateCheckBoxes(item.getItems()); } } } void updateDeletedNodes( List entries ) { for (Iterator entryIter = entries.iterator(); entryIter.hasNext();) { Entry varEntry = (Entry)entryIter.next(); IDeclareStatement declaration = (IDeclareStatement)varEntry.getKey(); for (Iterator nodeIter = this.nodesToDeclarations.entrySet().iterator(); nodeIter.hasNext();) { Entry nodeEntry = (Entry)nodeIter.next(); if (nodeEntry.getValue() == declaration) { nodeIter.remove(); XsdInstanceNode node = (XsdInstanceNode)nodeEntry.getKey(); node.setSelected(false); WidgetUtil.findTreeItem(node, this.nodeViewer).setChecked(false); removeVariableStatements(declaration); } } // for } // for this.editor.refreshVariables(); } /** * @since 5.0.1 */ void updateLocationPreferences() { IPreferenceStore store = WebServiceUiPlugin.getDefault().getPreferenceStore(); Point loc = getShell().getLocation(); UiUtil.updateIntegerPreference(X_PREF, loc.x, 0, store); UiUtil.updateIntegerPreference(Y_PREF, loc.y, 0, store); } void updateNodesToDeclarations() { // Wire procedure section in object editor page to update selected nodes map String doc = DocumentGenerator.SHARED.generate(this.rootNode); this.nodesToDeclarations.clear(); for (Iterator entryIter = this.editor.getDeclarationsToAssignments().entrySet().iterator(); entryIter.hasNext();) { Entry entry = (Entry)entryIter.next(); try { Object obj = XPathHelper.getSingleMatch(new StringReader(doc), WebServiceUtil.getXpath((IAssignmentStatement)entry.getValue())); if (obj instanceof NodeInfo) { NodeInfo saxonNode = (NodeInfo)obj; if (saxonNode.getNodeKind() == Type.ELEMENT || saxonNode.getNodeKind() == Type.ATTRIBUTE) { XsdInstanceNode node = getNode(saxonNode); if (node != null && node.isSelectable()) { node.setSelected(true); this.nodesToDeclarations.put(node, entry.getKey()); } } } } catch (Exception ignored) { } } // for this.editor.refreshVariables(); } /** * @since 5.0.1 */ void updateSizePreferences() { IPreferenceStore store = WebServiceUiPlugin.getDefault().getPreferenceStore(); Point loc = getShell().getSize(); UiUtil.updateIntegerPreference(WTH_PREF, loc.x, 0, store); UiUtil.updateIntegerPreference(HGT_PREF, loc.y, 0, store); } void updateWeightPreferences() { IPreferenceStore store = WebServiceUiPlugin.getDefault().getPreferenceStore(); int[] wgts = this.hSplitter.getWeights(); UiUtil.updateIntegerPreference(LEFT_H_WGT_PREF, wgts[0], DFLT_LEFT_H_WGT, store); UiUtil.updateIntegerPreference(RIGHT_H_WGT_PREF, wgts[1], DFLT_RIGHT_H_WGT, store); wgts = this.vSplitter.getWeights(); UiUtil.updateIntegerPreference(TOP_V_WGT_PREF, wgts[0], DFLT_TOP_V_WGT, store); UiUtil.updateIntegerPreference(BOTTOM_V_WGT_PREF, wgts[1], DFLT_BOTTOM_V_WGT, store); } void variableSelected() { // System.out.println("VariableEditorDialog.variableSelected()"); IStructuredSelection selection = this.varSection.getSelection(); if (selection.isEmpty() || selection.size() > 1) { this.xpathSection.setText(XPATH_TITLE); this.xpathText.setText(EMPTY_STRING); } else { Entry varEntry = (Entry)selection.getFirstElement(); IDeclareStatement declaration = (IDeclareStatement)varEntry.getKey(); this.xpathSection.setText(UTIL.getString(VAR_XPATH_TITLE, declaration.getVariable().getShortName())); this.xpathSection.layout(); // This is necessary to get the title label resized IAssignmentStatement assignment = (IAssignmentStatement)varEntry.getValue(); this.xpathText.setText(WebServiceUtil.getXpath(assignment)); // Select node in tree XsdInstanceNode node = getNode(declaration); if (node != null) { WidgetUtil.select(node, this.nodeViewer); } } } }