Don't use Strings to hold primary key values.
[online-glom:gwt-glom.git] / src / main / java / org / glom / web / client / Utils.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;
21
22 import org.glom.web.shared.DataItem;
23 import org.glom.web.shared.GlomNumericFormat;
24 import org.glom.web.shared.PrimaryKeyItem;
25 import org.glom.web.shared.layout.LayoutItemField.GlomFieldType;
26
27 import com.google.gwt.core.client.GWT;
28 import com.google.gwt.dom.client.Document;
29 import com.google.gwt.i18n.client.NumberFormat;
30 import com.google.gwt.user.client.ui.Widget;
31
32 /**
33  * @author Ben Konrath <ben@bagu.org>
34  * 
35  */
36 public class Utils {
37
38         public static NumberFormat getNumberFormat(GlomNumericFormat glomNumericFormat) {
39
40                 StringBuilder pattern = new StringBuilder("0.");
41
42                 // add pattern for thousands separator
43                 if (glomNumericFormat.getUseThousandsSeparator()) {
44                         pattern.insert(0, "#,##");
45                 }
46
47                 // add pattern for restricted decimal places
48                 if (glomNumericFormat.getDecimalPlacesRestricted()) {
49                         for (int i = 0; i < glomNumericFormat.getDecimalPlaces(); i++) {
50                                 pattern.append('0');
51                         }
52                 } else {
53                         // The default precision in libglom is 15.
54                         pattern.append("###############");
55                 }
56
57                 // TODO use exponential numbers when more than 15 decimal places
58
59                 return NumberFormat.getFormat(pattern.toString());
60
61         }
62
63         /**
64          * Get the vertical height with decorations (i.e. CSS) by temporarily adding the widget to the body element of the
65          * document in a transparent container. This is required because the size information is only available when the
66          * widget is attached to the DOM.
67          * 
68          * This method must be called before the widget is added to its container because it will be removed from any
69          * container it is already inside. TODO: Fix this problem by saving a reference to its parent and re-addding it
70          * after the height information has been calculated.
71          * 
72          * TODO: Remove duplicate code in FlowTable.FlowTableItem
73          * 
74          * @param widget
75          *            get the height information for this widget
76          * @return the height of the widget with styling applied
77          */
78         public static int getWidgetHeight(Widget widget) {
79                 Document doc = Document.get();
80                 com.google.gwt.dom.client.Element div = doc.createDivElement();
81
82                 div.getStyle().setOpacity(0.0);
83                 div.appendChild(widget.getElement().<com.google.gwt.user.client.Element> cast());
84
85                 doc.getBody().appendChild(div);
86                 int height = widget.getOffsetHeight();
87                 doc.getBody().removeChild(div);
88
89                 return height;
90         }
91
92         public static PrimaryKeyItem getPrimaryKeyItem(GlomFieldType glomFieldType, DataItem dataItem) {
93                 PrimaryKeyItem primaryKeyItem = new PrimaryKeyItem();
94                 switch (glomFieldType) {
95                 case TYPE_BOOLEAN:
96                         primaryKeyItem.setBoolean(dataItem.getBoolean());
97                         break;
98                 case TYPE_NUMERIC:
99                         primaryKeyItem.setNumber(dataItem.getNumber());
100                         break;
101                 case TYPE_TEXT:
102                         primaryKeyItem.setText(new String(dataItem.getText() == null ? "" : dataItem.getText()));
103                         break;
104                 default:
105                         GWT.log("getPrimaryKeyItem(): Unsupported Glom Field Type: " + glomFieldType);
106                         break;
107                 }
108
109                 return primaryKeyItem;
110         }
111
112 }