/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.io.gml.ui;
import javax.xml.namespace.QName;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import eu.esdihumboldt.hale.common.core.io.IOProvider;
import eu.esdihumboldt.hale.common.core.io.Value;
import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration;
import eu.esdihumboldt.hale.common.schema.model.Definition;
import eu.esdihumboldt.hale.common.schema.model.SchemaSpace;
import eu.esdihumboldt.hale.io.gml.writer.XmlWriterBase;
import eu.esdihumboldt.hale.io.gml.writer.internal.StreamGmlWriter;
import eu.esdihumboldt.hale.io.xsd.model.XmlElement;
import eu.esdihumboldt.hale.io.xsd.model.XmlIndex;
import eu.esdihumboldt.hale.ui.HaleWizardPage;
import eu.esdihumboldt.hale.ui.io.IOWizard;
import eu.esdihumboldt.hale.ui.io.IOWizardPage;
import eu.esdihumboldt.hale.ui.io.config.AbstractConfigurationPage;
/**
* Configuration page for setting an XML root element
*
* @author Simon Templer
* @partner 01 / Fraunhofer Institute for Computer Graphics Research
*/
@SuppressWarnings("restriction")
public class RootElementPage extends
AbstractConfigurationPage<XmlWriterBase, IOWizard<XmlWriterBase>> {
private ListViewer list;
private Text filterText;
/**
* Default constructor
*/
public RootElementPage() {
super("xml.rootElement");
setTitle("XML root element");
setDescription("Please select the root element to use in the XML file");
}
/**
* @see IOWizardPage#updateConfiguration(IOProvider)
*/
@Override
public boolean updateConfiguration(XmlWriterBase provider) {
ISelection sel = list.getSelection();
if (!sel.isEmpty() && sel instanceof IStructuredSelection) {
Object selected = ((IStructuredSelection) sel).getFirstElement();
if (selected instanceof XmlElement) {
QName name = ((XmlElement) selected).getName();
provider.setParameter(StreamGmlWriter.PARAM_ROOT_ELEMENT_NAMESPACE,
Value.of(name.getNamespaceURI()));
provider.setParameter(StreamGmlWriter.PARAM_ROOT_ELEMENT_NAME,
Value.of(name.getLocalPart()));
return true;
}
}
provider.setParameter(StreamGmlWriter.PARAM_ROOT_ELEMENT_NAMESPACE, null);
provider.setParameter(StreamGmlWriter.PARAM_ROOT_ELEMENT_NAME, null);
return false;
}
/**
* @see HaleWizardPage#createContent(Composite)
*/
@Override
protected void createContent(Composite page) {
page.setLayout(new GridLayout(1, false));
// add filter text
filterText = new Text(page, SWT.SINGLE | SWT.BORDER);
filterText.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
filterText.setText(""); //$NON-NLS-1$
// add filtered list
list = new ListViewer(page, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
list.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof XmlElement) {
QName name = ((XmlElement) element).getName();
return name.getLocalPart() + " (" + name.getNamespaceURI() + ")";
}
if (element instanceof Definition) {
return ((Definition<?>) element).getDisplayName();
}
return super.getText(element);
}
});
list.setContentProvider(ArrayContentProvider.getInstance());
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
layoutData.widthHint = SWT.DEFAULT;
layoutData.heightHint = 8 * list.getList().getItemHeight();
list.getControl().setLayoutData(layoutData);
// page status update
list.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
setPageComplete(!selection.isEmpty());
}
});
list.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
if (canFlipToNextPage()) {
getContainer().showPage(getNextPage());
return;
}
}
});
// search filter & update
list.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
String filter = filterText.getText();
// handle empty filter
if (filter == null || filter.isEmpty()) {
return true;
}
if (element instanceof Definition) {
Definition<?> def = (Definition<?>) element;
filter = filter.toLowerCase();
if (def.getDisplayName().toLowerCase().contains(filter)) {
return true;
}
}
return false;
}
});
list.setComparator(new ViewerComparator());
filterText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
// refilter
list.refresh();
}
});
updateList();
}
/**
* @see DialogPage#setVisible(boolean)
*/
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
filterText.setFocus();
}
/**
* @see AbstractConfigurationPage#disable()
*/
@Override
public void disable() {
// do nothing
}
/**
* @see AbstractConfigurationPage#enable()
*/
@Override
public void enable() {
updateList();
}
private void updateList() {
if (list != null // during enable if content not yet created
&& getWizard().getProvider() != null) {
// TODO instead of showing all elements allow filtering for elements
// that can hold the type in some form?
SchemaSpace schemas = getWizard().getProvider().getTargetSchema();
XmlIndex index = StreamGmlWriter.getXMLIndex(schemas);
// FIXME use filtered table for selection?
list.setInput(index.getElements().values());
setPageComplete(!list.getSelection().isEmpty());
}
}
/**
* @see eu.esdihumboldt.hale.ui.io.IOWizardPage#loadPreSelection(eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration)
*/
@Override
public void loadPreSelection(IOConfiguration conf) {
String name = conf.getProviderConfiguration().get(StreamGmlWriter.PARAM_ROOT_ELEMENT_NAME)
.getStringRepresentation();
String namespace = conf.getProviderConfiguration()
.get(StreamGmlWriter.PARAM_ROOT_ELEMENT_NAMESPACE).getStringRepresentation();
String elementName = namespace + "/" + name;
SchemaSpace schemas = getWizard().getProvider().getTargetSchema();
XmlIndex index = StreamGmlWriter.getXMLIndex(schemas);
for (XmlElement element : index.getElements().values()) {
if (element.getIdentifier().equals(elementName)) {
list.setSelection(new StructuredSelection(element), true);
}
}
}
}