/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.xpathchooser;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import de.rcenvironment.core.gui.resources.api.ImageManager;
import de.rcenvironment.core.gui.resources.api.StandardImages;
import de.rcenvironment.core.gui.xpathchooser.model.XSDAttribute;
import de.rcenvironment.core.gui.xpathchooser.model.XSDElement;
import de.rcenvironment.core.gui.xpathchooser.model.XSDValue;
/**
* LabelProvider for the XSD TreeView.
*
* @author Heinrich Wendel
* @author Arne Bachmann
* @author Markus Kunde
*/
public final class XSDLabelProvider extends LabelProvider implements ITableLabelProvider {
/**
* XML element.
*/
private final Image imageElement;
/**
* XML elements.
*/
private final Image imageElements;
/**
* XML attribute.
*/
private final Image imageAttribute;
/**
* XML value.
*/
private final Image imageValue;
/**
* Constructor.
*
* @param display The parent display to register images in.
*/
public XSDLabelProvider(final Display display) {
imageElement = ImageManager.getInstance().getSharedImage(StandardImages.ELEMENT);
imageElements = ImageManager.getInstance().getSharedImage(StandardImages.ELEMENTS);
imageAttribute = ImageManager.getInstance().getSharedImage(StandardImages.ATTRIBUTE);
imageValue = ImageManager.getInstance().getSharedImage(StandardImages.FILE_16);
}
/**
* Return the text for the given XSD entry and column.
*
* @param element The XSD element to show
* @param column The column
* @return The item text
*/
@Override
public String getColumnText(final Object element, final int column) {
if ((element == null) || !(element instanceof XSDElement)) {
return null;
}
final XSDElement e = (XSDElement) element;
final String string;
if (column == 0) {
string = e.getName();
} else if (column == 1) {
if (e.getCurrentAttributeName() == null) { // if already initialized
addElementAttributes(e); // otherwise initialize
}
string = e.getCurrentAttributeName();
} else if (column == 2) {
if (e.getCurrentAttributeValue() == null) {
addElementAttributes(e);
}
string = e.getCurrentAttributeValue();
} else {
string = "";
}
return string;
}
/**
* Return the image for the given XSD enty and column.
*
* @param element The XSD element to show
* @param column The column
* @return The image
*/
@Override
public Image getColumnImage(final Object element, final int column) {
if ((element == null) || !(element instanceof XSDElement)) {
return null;
}
final XSDElement e = (XSDElement) element;
final Image image;
if (column == 0) {
if (e.getElements().size() > 0) {
image = imageElements;
} else {
image = imageElement;
}
} else if (column == 1) {
if (e.getCurrentAttributeName() == null) {
addElementAttributes(e);
}
if (e.getCurrentAttributeName().equals("")) {
image = null;
} else {
image = imageAttribute;
}
} else if (column == 2) {
if (e.getCurrentAttributeValue() == null) {
addElementAttributes(e);
}
if (e.getCurrentAttributeValue().equals("")) {
image = null;
} else {
image = imageValue;
}
} else {
image = null;
}
return image;
}
/**
* Lazily create meta data.
*
* @param e The element to process.
*/
private void addElementAttributes(final XSDElement e) {
final Set<String> values = new HashSet<String>();
for (final XSDAttribute a : e.getAttributes()) {
if (!a.getName().equals("")) { // only non-empty strings
for (final XSDValue value : a.getValues()) {
values.add(value.getName());
}
e.setAttributeValues(a.getName(), values);
}
values.clear();
}
// set initial value
final String[] names = e.getAttributeNames();
if (names.length == 0) {
e.setAttributeName("");
e.setAttributeValue("");
} else {
e.setAttributeName(names[0]);
final String[] tmp = e.getAttributeValues();
if (tmp.length == 0) {
e.setAttributeValue("");
} else {
e.setAttributeValue(tmp[0]);
}
}
}
}