Replace deprecated DOM.setElementAttribute().
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / client / ui / cell / NumericCell.java
1 /*
2  * Copyright (C) 2011 Openismus GmbH
3  *
4  * This file is part of GWT-Glom.
5  *
6  * GWT-Glom is free software: you can redistribute it and/or modify it
7  * under the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation, either version 3 of the License, or (at your
9  * option) any later version.
10  *
11  * GWT-Glom is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
14  * for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with GWT-Glom.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 package org.glom.web.client.ui.cell;
21
22 import org.glom.web.client.StringUtils;
23 import org.glom.web.shared.libglom.Field.GlomFieldType;
24
25 import com.google.gwt.cell.client.AbstractCell;
26 import com.google.gwt.i18n.client.NumberFormat;
27 import com.google.gwt.safehtml.shared.SafeHtml;
28 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
29 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
30
31 /**
32  * Cell renderer for {@link GlomFieldType} TYPE_NUMERIC.
33  */
34 public class NumericCell extends AbstractCell<Double> {
35         private SafeHtml colorCSSProp;
36         private SafeHtml backgroundColorCSSProp;
37         private final NumberFormat numberFormat;
38         private final boolean useAltColorForNegatives;
39         private final String currencyCode;
40
41         // TODO Find a way to set the colors on the whole column
42         public NumericCell(final String foregroundColor, final String backgroundColor, final NumberFormat numberFormat,
43                         final boolean useAltColorForNegatives, final String currencyCode) {
44                 if (!StringUtils.isEmpty(foregroundColor)) {
45                         colorCSSProp = SafeHtmlUtils.fromString("color:" + foregroundColor + ";");
46                 } else {
47                         colorCSSProp = SafeHtmlUtils.fromSafeConstant("");
48                 }
49                 if (!StringUtils.isEmpty(backgroundColor)) {
50                         backgroundColorCSSProp = SafeHtmlUtils.fromString("background-color:" + backgroundColor + ";");
51                 } else {
52                         backgroundColorCSSProp = SafeHtmlUtils.fromSafeConstant("");
53                 }
54                 this.numberFormat = numberFormat;
55                 this.useAltColorForNegatives = useAltColorForNegatives;
56                 this.currencyCode = StringUtils.isEmpty(currencyCode) ? "" : currencyCode + " ";
57         }
58
59         /*
60          * (non-Javadoc)
61          * 
62          * @see com.google.gwt.cell.client.AbstractCell#render(com.google.gwt.cell.client.Cell.Context, java.lang.Object,
63          * com.google.gwt.safehtml.shared.SafeHtmlBuilder)
64          */
65         @Override
66         public void render(final Context context, final Double value, final SafeHtmlBuilder sb) {
67                 if (value == null) {
68                         // The value is from an empty row.
69                         sb.appendHtmlConstant("&nbsp;");
70                         return;
71                 }
72
73                 // set the foreground color to red if the number is negative and this is requested
74                 if (useAltColorForNegatives && value.doubleValue() < 0) {
75                         // The default alternative color in libglom is red.
76                         colorCSSProp = SafeHtmlUtils.fromString("color: #FF0000;");
77                 }
78
79                 // Convert the number to a string and set some CSS properties on the text.
80                 // The overflow and text-overflow properties tell the browser to add an ellipsis when the text overflows the
81                 // table cell.
82                 // FIXME this isn't using safe html correctly!
83                 sb.appendHtmlConstant("<div style=\"overflow: hidden; text-overflow: ellipsis; " + colorCSSProp.asString()
84                                 + backgroundColorCSSProp.asString() + "\">");
85                 sb.append(SafeHtmlUtils.fromString(currencyCode + numberFormat.format(value)));
86                 sb.appendHtmlConstant("</div>");
87
88         }
89 }