/*******************************************************************************
* Copyright (c) 2016 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.xviewer.core.model;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.nebula.widgets.xviewer.core.util.CollectionsUtil;
import org.eclipse.nebula.widgets.xviewer.core.util.XViewerUtil;
import org.eclipse.nebula.widgets.xviewer.core.util.XmlUtil;
/**
* @author Donald G. Dunne
*/
public class XViewerColumn {
protected String id;
protected String name = "";
private String description;
private boolean multiColumnEditable = false;
private int width;
private XViewerAlign align;
private boolean sortForward = true; // if true, sort alphabetically; else reverse
private boolean show = true;
private SortDataType sortDataType = SortDataType.String;
private String toolTip = "";
protected Map<Long, String> preComputedValueMap = null;
private Object xViewer;
protected XViewerColumn() {
super();
}
public XViewerColumn(String id, String name, int width, XViewerAlign align, boolean show, SortDataType sortDataType, boolean multiColumnEditable, String description) {
super();
setId(id);
setName(name);
this.width = width;
this.align = align;
this.show = show;
this.sortDataType = sortDataType;
this.multiColumnEditable = multiColumnEditable;
setDescription(description);
setToolTip(this.name);
}
/**
* XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending
* XViewerColumn need to extend this method to copy extra stored fields
*/
public XViewerColumn copy() {
XViewerColumn newXCol = new XViewerColumn();
copy(this, newXCol);
return newXCol;
}
/**
* This method should be extended if new column needs to store (and copy) it's own data.
*/
protected void copy(XViewerColumn fromXCol, XViewerColumn toXCol) {
toXCol.setAlign(fromXCol.align);
toXCol.setDescription(fromXCol.description);
toXCol.setMultiColumnEditable(fromXCol.multiColumnEditable);
toXCol.setName(fromXCol.name);
toXCol.setSortDataType(fromXCol.sortDataType);
toXCol.setToolTip(fromXCol.toolTip);
toXCol.setWidth(fromXCol.width);
toXCol.setShow(fromXCol.show);
toXCol.setId(fromXCol.id);
}
public XViewerColumn(Object xViewer, String xml) {
setFromXml(xml);
this.xViewer = xViewer;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof XViewerColumn) {
return ((XViewerColumn) obj).getId().equals(id);
}
return super.equals(obj);
}
@Override
public int hashCode() {
return getId().hashCode();
}
public final static String ID = "id";
public final static String NAME = "name";
public final static String WIDTH = "wdth";
public final static String ALIGN = "algn";
public final static String SORT_FORWARD = "srtFwd";
public final static String SHOW = "show";
public final static String XTREECOLUMN_TAG = "xCol";
public String toXml() {
StringBuffer sb = new StringBuffer("<" + XTREECOLUMN_TAG + ">");
sb.append(XmlUtil.addTagData(ID, id));
sb.append(XmlUtil.addTagData(NAME, name));
sb.append(XmlUtil.addTagData(WIDTH, width + ""));
sb.append(XmlUtil.addTagData(ALIGN, getAlignStoreName(align)));
sb.append(XmlUtil.addTagData(SORT_FORWARD, sortForward + ""));
sb.append(XmlUtil.addTagData(SHOW, show + ""));
sb.append("</" + XTREECOLUMN_TAG + ">");
return sb.toString();
}
public void setFromXml(String xml) {
setId(XmlUtil.getTagData(xml, ID));
setName(XmlUtil.getTagData(xml, NAME));
width = XmlUtil.getTagIntData(xml, WIDTH);
align = getAlignStoreValue(XmlUtil.getTagData(xml, ALIGN));
sortForward = XmlUtil.getTagBooleanData(xml, SORT_FORWARD);
show = XmlUtil.getTagBooleanData(xml, SHOW);
}
public static String getColumnId(String xml) {
return XmlUtil.getTagData(xml, ID);
}
public String getAlignStoreName(XViewerAlign align) {
if (align == XViewerAlign.Center) {
return "center";
} else if (align == XViewerAlign.Right) {
return "right";
} else {
return "left";
}
}
public XViewerAlign getAlignStoreValue(String str) {
if (str.equals("center")) {
return XViewerAlign.Center;
} else if (str.equals("right")) {
return XViewerAlign.Right;
} else {
return XViewerAlign.Left;
}
}
public String getDisplayName() {
if (id != null && !id.equals(name)) {
return name + " - " + id + " - width:" + width + " - show:" + show;
} else {
return name + " - width:" + width + " - show:" + show;
}
}
public XViewerAlign getAlign() {
return align;
}
public void setAlign(XViewerAlign align) {
this.align = align;
}
public String getId() {
return id;
}
public int getWidth() {
return width;
}
public boolean isSortForward() {
return sortForward;
}
public void setSortForward(boolean sortForward) {
this.sortForward = sortForward;
}
public void reverseSort() {
setSortForward(!sortForward);
}
public boolean isShow() {
return show;
}
public void setShow(boolean show) {
this.show = show;
}
public String getName() {
return name;
}
public SortDataType getSortDataType() {
return sortDataType;
}
public void setSortDataType(SortDataType sortDataType) {
this.sortDataType = sortDataType;
}
public String getToolTip() {
return toolTip;
}
public void setToolTip(String toolTip) {
if (toolTip != null) {
this.toolTip = XViewerUtil.intern(toolTip);
}
}
public void setName(String name) {
this.name = XViewerUtil.intern(name);
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public boolean isMultiColumnEditable() {
return multiColumnEditable;
}
public void setMultiColumnEditable(boolean multiColumnEditable) {
this.multiColumnEditable = multiColumnEditable;
}
public void setWidth(int newWidth) {
this.width = newWidth;
}
public boolean isSummable() {
if (sortDataType == SortDataType.Float || sortDataType == SortDataType.Integer || sortDataType == SortDataType.Long || sortDataType == SortDataType.Percent) {
return true;
}
return false;
}
public String sumValues(Collection<String> values) {
if (sortDataType == SortDataType.Float) {
double sum = 0.0;
Set<String> exceptions = new HashSet<String>();
sum = sumFloatValues(values, sum, exceptions);
return "Sum: " + XViewerUtil.doubleToI18nString(
sum) + "\n\nNum Items: " + values.size() + (exceptions.size() > 0 ? "\n\nErrors: " + CollectionsUtil.toString(
";", exceptions) : "");
} else if (sortDataType == SortDataType.Integer || sortDataType == SortDataType.Percent) {
int sum = 0;
Set<String> exceptions = new HashSet<String>();
sum = sumIntegerValues(values, sum, exceptions);
return "Sum: " + sum + "\n\nNum Items: " + values.size() + (exceptions.size() > 0 ? "\n\nErrors: " + CollectionsUtil.toString(
";", exceptions) : "");
} else if (sortDataType == SortDataType.Long) {
long sum = 0;
Set<String> exceptions = new HashSet<String>();
sum = sumLongValues(values, sum, exceptions);
return "Sum: " + sum + "\n\nNum Items: " + values.size() + (exceptions.size() > 0 ? "\n\nErrors: " + CollectionsUtil.toString(
";", exceptions) : "");
}
return "Unhandled column type";
}
private double sumFloatValues(Collection<String> values, double sum, Set<String> exceptions) {
for (String value : values) {
if (value == null || value.equals("")) {
continue;
}
try {
sum += new Double(value);
} catch (Exception ex) {
exceptions.add(ex.getLocalizedMessage());
}
}
return sum;
}
public String averageValues(Collection<String> values) {
if (sortDataType == SortDataType.Float) {
double sum = 0.0;
Set<String> exceptions = new HashSet<String>();
sum = sumFloatValues(values, sum, exceptions);
Double average = sum == 0 || values.isEmpty() ? 0 : sum / values.size();
return "Average: " + XViewerUtil.doubleToI18nString(
average) + "\n\nNum Items: " + values.size() + (exceptions.size() > 0 ? "\n\nErrors: " + CollectionsUtil.toString(
";", exceptions) : "");
} else if (sortDataType == SortDataType.Integer || sortDataType == SortDataType.Percent) {
int sum = 0;
Set<String> exceptions = new HashSet<String>();
sum = sumIntegerValues(values, sum, exceptions);
Integer average = sum == 0 || values.isEmpty() ? 0 : sum / values.size();
return "Average: " + average + "\n\nNum Items: " + values.size() + (exceptions.size() > 0 ? "\n\nErrors: " + CollectionsUtil.toString(
";", exceptions) : "");
} else if (sortDataType == SortDataType.Long) {
long sum = 0;
Set<String> exceptions = new HashSet<String>();
sum = sumLongValues(values, sum, exceptions);
Long average = sum == 0 || values.isEmpty() ? 0 : sum / Long.valueOf(values.size());
return "Average: " + average + "\n\nNum Items: " + values.size() + (exceptions.size() > 0 ? "\n\nErrors: " + CollectionsUtil.toString(
";", exceptions) : "");
}
return "Unhandled column type";
}
private long sumLongValues(Collection<String> values, long sum, Set<String> exceptions) {
for (String value : values) {
if (value == null || value.equals("")) {
continue;
}
try {
sum += Long.valueOf(value);
} catch (Exception ex) {
exceptions.add(ex.getLocalizedMessage());
}
}
return sum;
}
private int sumIntegerValues(Collection<String> values, int sum, Set<String> exceptions) {
for (String value : values) {
if (value == null || value.equals("")) {
continue;
}
try {
sum += Integer.valueOf(value);
} catch (Exception ex) {
exceptions.add(ex.getLocalizedMessage());
}
}
return sum;
}
public void setId(String id) {
this.id = XViewerUtil.intern(id);
}
public String getPreComputedValue(Long key) {
String result = null;
if (preComputedValueMap == null) {
return result;
}
return preComputedValueMap.get(key);
}
public Object getXViewer() {
return xViewer;
}
public void setXViewer(Object xViewer) {
this.xViewer = xViewer;
}
public Map<Long, String> getPreComputedValueMap() {
if(preComputedValueMap == null) {
preComputedValueMap = new HashMap<Long, String>();
}
return preComputedValueMap;
}
public void setPreComputedValueMap(Map<Long, String> preComputedValueMap) {
this.preComputedValueMap = preComputedValueMap;
}
@Override
public String toString() {
return "XViewerColumn [id=" + id + ", name=" + name + ", sortDataType=" + sortDataType + ", show=" + show + ", width=" + width + "]";
}
}