Some import reorganizing by Eclipse
[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.TypedDataItem;
24 import org.glom.web.shared.libglom.Field.GlomFieldType;
25 import org.glom.web.shared.libglom.NumericFormat;
26
27 import com.google.gwt.core.client.GWT;
28 import com.google.gwt.dom.client.Document;
29 import com.google.gwt.dom.client.Style.Visibility;
30 import com.google.gwt.i18n.client.LocaleInfo;
31 import com.google.gwt.i18n.client.NumberFormat;
32 import com.google.gwt.user.client.Window;
33 import com.google.gwt.user.client.ui.Widget;
34
35 /**
36  *
37  */
38 public class Utils {
39
40         public static NumberFormat getNumberFormat(final NumericFormat numericFormat) {
41
42                 final StringBuilder pattern = new StringBuilder("0.");
43
44                 // add pattern for thousands separator
45                 if (numericFormat.getUseThousandsSeparator()) {
46                         pattern.insert(0, "#,##");
47                 }
48
49                 // add pattern for restricted decimal places
50                 if (numericFormat.getDecimalPlacesRestricted()) {
51                         for (int i = 0; i < numericFormat.getDecimalPlaces(); i++) {
52                                 pattern.append('0');
53                         }
54                 } else {
55                         // The default precision in libglom is 15.
56                         pattern.append("###############");
57                 }
58
59                 // TODO use exponential numbers when more than 15 decimal places
60
61                 return NumberFormat.getFormat(pattern.toString());
62
63         }
64
65         /**
66          * Get the vertical height with decorations (i.e. CSS) by temporarily adding the widget to the body element of the
67          * document in a transparent container. This is required because the size information is only available when the
68          * widget is attached to the DOM.
69          * 
70          * This method must be called before the widget is added to its container because it will be removed from any
71          * container it is already inside. TODO: Fix this problem by saving a reference to its parent and re-addding it
72          * after the height information has been calculated.
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(final Widget widget) {
79                 final Document doc = Document.get();
80                 com.google.gwt.dom.client.Element div = doc.createDivElement();
81
82                 // Hidden elements are invisible, don't respond to events and are not part of the tab order. But they will take
83                 // up space.
84                 div.getStyle().setVisibility(Visibility.HIDDEN);
85                 div.appendChild(widget.getElement().<com.google.gwt.user.client.Element> cast());
86
87                 doc.getBody().appendChild(div);
88                 final int height = widget.getOffsetHeight();
89                 doc.getBody().removeChild(div);
90                 div = null;
91
92                 return height;
93         }
94
95         public static TypedDataItem getTypedDataItem(final GlomFieldType glomFieldType, final DataItem dataItem) {
96                 final TypedDataItem primaryKeyItem = new TypedDataItem();
97                 switch (glomFieldType) {
98                 case TYPE_BOOLEAN:
99                         primaryKeyItem.setBoolean(dataItem.getBoolean());
100                         break;
101                 case TYPE_NUMERIC:
102                         primaryKeyItem.setNumber(dataItem.getNumber());
103                         break;
104                 case TYPE_TEXT:
105                         primaryKeyItem.setText(new String(dataItem.getText() == null ? "" : dataItem.getText()));
106                         break;
107                 default:
108                         GWT.log("getTypedDataItem(): Unsupported Glom Field Type: " + glomFieldType);
109                         break;
110                 }
111
112                 return primaryKeyItem;
113         }
114
115         public static String getCurrentLocaleID() {
116                 String localeID = LocaleInfo.getCurrentLocale().getLocaleName();
117                 if (localeID.equals("default")) {
118                         localeID = ""; // This is how libglom refers to the default locale.
119                 }
120
121                 if (StringUtils.isEmpty(localeID)) {
122                         // LocaleInfo.getCurrentLocale() returns "default" even if a real locale was specified in the URL,
123                         // if the locale is not specified as supported in our OnlineGlom.gwt.xml file,
124                         // but people could use locales in .glom files that we have not thought of,
125                         // so we should allow their use by getting the query parameter value directly:
126                         final String paramValue = Window.Location.getParameter(LocaleInfo.getLocaleQueryParam());
127                         localeID = paramValue;
128
129                         // Prevent a null string from being used,
130                         // in case the caller does not expect it.
131                         if (localeID == null)
132                                 localeID = "";
133                 }
134
135                 return localeID;
136         }
137
138 }