// ============================================================================
//
// 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 com.amalto.workbench.widgets.composites;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.xsd.XSDComponent;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDNamedComponent;
import org.eclipse.xsd.XSDSchema;
import com.amalto.workbench.detailtabs.sections.XpathSection;
import com.amalto.workbench.detailtabs.sections.providers.StringViewerSorter;
import com.amalto.workbench.dialogs.datamodel.SelectXPathDialog;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.image.EImage;
import com.amalto.workbench.image.ImageCache;
import com.amalto.workbench.models.infoextractor.IAllDataModelHolder;
import com.amalto.workbench.models.infoextractor.XSDComponentChildElementsHolder;
import com.amalto.workbench.providers.ListContentProvider;
import com.amalto.workbench.providers.ListStringLabelProvider;
import com.amalto.workbench.utils.Util;
public class XpathComposite extends ListStringContentsComposite {
protected XpathSection section;
private ComboViewer comboInfos;
public XpathComposite(Composite parent, int style, XpathSection section) {
super(parent, style, null, section);
this.section = section;
}
public XpathComposite(Composite parent) {
super(parent, SWT.NONE, new Object[] {}, null);
}
protected XSDComponent getXSD() {
return section.getEditedObj();
}
@Override
protected String getInfoColTitle() {
return "XPath"; //$NON-NLS-1$
}
@Override
protected void createExtentUIArea(Composite parent) {
}
protected String getDatamodel() {
return section.getDataModelName();
}
protected String getConcept() {
Set<String> entities = section.getEntities();
if (null != entities) {
StringBuilder builder = new StringBuilder();
for (String entity : entities) {
if (builder.length() > 0) {
builder.append("|");
}
builder.append(entity);
}
return builder.toString();
}
return null;
}
protected IAllDataModelHolder getDataholder() {
return section.getDataHolder();
}
XSDSchema getDatamodelXSD(XSDConcreteComponent component) {
if (null == component.getContainer()) {
return (XSDSchema) component;
}
return getDatamodelXSD(component.getContainer());
}
XSDSchema getDatamodelXSD() {
return getDatamodelXSD(this.getXSD());
}
Object[] getXSDSchemaChildren(XSDSchema schema) {
List<XSDElementDeclaration> declarations = new ArrayList<XSDElementDeclaration>();
EList<XSDElementDeclaration> elementDeclarations = schema
.getElementDeclarations();
for (XSDElementDeclaration declaration : elementDeclarations) {
if (declaration.eContainer().equals(schema)) {
declarations.add(declaration);
}
}
Object[] schemaChildren = Util.filterOutDuplicatedElems(declarations
.toArray(new XSDNamedComponent[declarations.size()]));
return schemaChildren;
}
protected String[] getItems() {
Set<String> entities = section.getEntities();
if (null != entities) {
XSDSchema schema = getDatamodelXSD();
Object[] child = getXSDSchemaChildren(schema);
List<String> items = new LinkedList<String>();
for (Object obj : child) {
if (obj instanceof XSDNamedComponent) {
if (entities.contains(((XSDNamedComponent) obj).getName())) {
XSDComponentChildElementsHolder holder = new XSDComponentChildElementsHolder(
(XSDNamedComponent) obj);
String[] eles = holder.getAllElements();
if (null == eles) {
continue;
}
for (String ele : eles) {
items.add(ele);
}
}
}
}
return items.toArray(new String[0]);
}
return null;
}
protected String[] getElementPathsFrXSDElementDeclaration(
XSDElementDeclaration parent) {
try {
return Util.getChildElementNames(parent.getName(), parent).toArray(
new String[0]);
} catch (Exception e) {
return new String[0];
}
}
@Override
protected void createCandidateInfoUIArea(Composite parent) {
Composite compSimpleXPath = new Composite(this, SWT.NONE);
compSimpleXPath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
false));
compSimpleXPath.setLayout(new GridLayout(2, false));
comboInfos = new ComboViewer(compSimpleXPath, SWT.DROP_DOWN);
comboInfos.getControl().setLayoutData(
new GridData(SWT.FILL, SWT.CENTER, true, false));
comboInfos.setContentProvider(new ListContentProvider());
comboInfos.setLabelProvider(new ListStringLabelProvider());
comboInfos.setSorter(new StringViewerSorter());
comboInfos.getCombo().addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
comboInfos.setInput(getItems());
}
});
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(comboInfos.getControl());
Button btnSelectXPath = new Button(compSimpleXPath, SWT.NONE);
btnSelectXPath.setImage(ImageCache.getCreatedImage(EImage.DOTS_BUTTON.getPath()));
btnSelectXPath.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
SelectXPathDialog dialog = new SelectXPathDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(),
getDataholder(), getDatamodel(), getConcept(), null);
if (dialog.open() != Window.OK) {
return;
}
String xpath = dialog.getSelectedXPath();
if (null != xpath) {
XpathComposite.this.addInfoToInfoTree(xpath);
}
}
});
btnSelectXPath.setToolTipText(Messages.SchematronExpressBuilder_selectXPath);
}
@Override
protected boolean hasCandidateInfo() {
return !("".equals(getCandidateInfo()));
}
@Override
protected String getCandidateInfo() {
return comboInfos.getCombo().getText();
}
@Override
protected void initCandidateInfoUIArea() {
comboInfos.setSelection(null);
}
@Override
protected void initParas(Object[] paras) {
}
}