// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.mdm.repository.ui.widgets; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.IContentProvider; 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.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDParticle; import org.eclipse.xsd.XSDSchema; import org.talend.mdm.repository.i18n.Messages; import org.talend.mdm.repository.plugin.RepositoryPlugin; import org.talend.mdm.repository.utils.EclipseResourceManager; import com.amalto.workbench.utils.Util; /** * created by liusongbo on 2014-3-25 */ class UserVariableDialog extends Dialog { private static Logger log = Logger.getLogger(UserVariableDialog.class); private final String USER = "User"; //$NON-NLS-1$ private TreeViewer tv; private String schema; private String result; public UserVariableDialog(Shell parentShell, String schema) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.schema = schema; } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setSize(400, 500); newShell.setText(Messages.UserVariableDialog_SelectVariable); } @Override protected void initializeBounds() { super.initializeBounds(); Point location = getInitialLocation(getShell().getSize()); getShell().setLocation(location.x, location.y); } @Override protected Control createDialogArea(Composite parent) { Composite control = (Composite) super.createDialogArea(parent); control.setLayout(new GridLayout()); createUserVariableTree(control); return control; } private void createUserVariableTree(Composite parent) { int style = SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER; tv = new TreeViewer(parent, style); tv.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); tv.setLabelProvider(getLabelProvider()); tv.setContentProvider(getContentProvider()); tv.addSelectionChangedListener(getSelectionChangedListener()); tv.setAutoExpandLevel(2); tv.setInput(new Object()); } private ILabelProvider getLabelProvider() { ILabelProvider labelProvider = new LabelProvider() { Image IMG = EclipseResourceManager.getImage(RepositoryPlugin.PLUGIN_ID, "icons/methpub_obj.gif"); //$NON-NLS-1$; @Override public Image getImage(Object element) { if (USER.equals(element)) { return null; } return IMG; } @Override public String getText(Object element) { return element.toString(); } }; return labelProvider; } private IContentProvider getContentProvider() { return new ITreeContentProvider() { public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } public void dispose() { } public boolean hasChildren(Object element) { return getChildren(element).length > 0; } public Object getParent(Object element) { return null; } public Object[] getElements(Object inputElement) { return new String[] { USER }; } public Object[] getChildren(Object parentElement) { if (USER.equals(parentElement)) { return getUserFields().toArray(); } return new Object[0]; } }; } protected ISelectionChangedListener getSelectionChangedListener() { return new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Object firstElement = selection.getFirstElement(); if (firstElement != null && !USER.equals(firstElement.toString())) { getButton(IDialogConstants.OK_ID).setEnabled(true); } else { getButton(IDialogConstants.OK_ID).setEnabled(false); } } }; } private List<String> getUserFields() { try { if (schema != null) { XSDSchema xsd = Util.createXsdSchema(schema, null); List<String> results = new ArrayList<String>(); EList<XSDElementDeclaration> elementDeclarations = xsd.getElementDeclarations(); for (XSDElementDeclaration decl : elementDeclarations) { if (decl.getName().equals(USER)) { Map<String, XSDParticle> childElements = Util.getChildElements("", decl, true, new HashSet<Object>()); //$NON-NLS-1$ for (String element : childElements.keySet()) { String prefix = "//"; //$NON-NLS-1$ if (element.startsWith(prefix)) { element = element.substring(prefix.length()); } results.add(element); } } } return results; } } catch (Exception e) { log.error(e.getMessage(), e); } return null; } @Override protected void createButtonsForButtonBar(Composite parent) { super.createButtonsForButtonBar(parent); getButton(IDialogConstants.OK_ID).setEnabled(false); } @Override protected void okPressed() { IStructuredSelection selection = (IStructuredSelection) tv.getSelection(); result = selection.getFirstElement().toString(); super.okPressed(); } public String getResult() { return result; } }