001 package org.gwtbootstrap3.client.ui.base.helper;
002
003 /*
004 * #%L
005 * GwtBootstrap3
006 * %%
007 * Copyright (C) 2013 GwtBootstrap3
008 * %%
009 * Licensed under the Apache License, Version 2.0 (the "License");
010 * you may not use this file except in compliance with the License.
011 * You may obtain a copy of the License at
012 *
013 * http://www.apache.org/licenses/LICENSE-2.0
014 *
015 * Unless required by applicable law or agreed to in writing, software
016 * distributed under the License is distributed on an "AS IS" BASIS,
017 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
018 * See the License for the specific language governing permissions and
019 * limitations under the License.
020 * #L%
021 */
022
023 import org.gwtbootstrap3.client.ui.constants.DeviceSize;
024 import org.gwtbootstrap3.client.ui.constants.Responsiveness;
025
026 import com.google.gwt.dom.client.Style;
027 import com.google.gwt.user.client.ui.UIObject;
028
029 /**
030 * Helper methods regarding CSS styling of UIObjects.
031 *
032 * @author Sven Jacobs
033 * @author Joshua Godi
034 */
035 public final class StyleHelper {
036
037 /**
038 * Convenience method for first removing all enum style constants and then adding the single one.
039 *
040 * @see #removeEnumStyleNames(com.google.gwt.user.client.ui.UIObject, Class)
041 * @see #addEnumStyleName(com.google.gwt.user.client.ui.UIObject, com.google.gwt.dom.client.Style.HasCssName)
042 */
043 public static <E extends Style.HasCssName, F extends Enum<? extends Style.HasCssName>> void addUniqueEnumStyleName(final UIObject uiObject,
044 final Class<F> enumClass,
045 final E style) {
046 removeEnumStyleNames(uiObject, enumClass);
047 addEnumStyleName(uiObject, style);
048 }
049
050 /**
051 * Removes all CSS style names specified by an enum that implements {@link Style.HasCssName} from an UIObject.
052 *
053 * @param uiObject Object to remove CSS class names from
054 * @param enumClass Enum representing CSS class names
055 * @param <E> Enum type implementing {@link Style.HasCssName}
056 */
057 public static <E extends Enum<? extends Style.HasCssName>> void removeEnumStyleNames(final UIObject uiObject,
058 final Class<E> enumClass) {
059
060 for (final Enum<? extends Style.HasCssName> constant : enumClass.getEnumConstants()) {
061 final String cssClass = ((Style.HasCssName) constant).getCssName();
062
063 if (cssClass != null && !cssClass.isEmpty()) {
064 uiObject.removeStyleName(cssClass);
065 }
066 }
067 }
068
069 /**
070 * Adds enum value style name to UIObject unless style is {@code null}.
071 *
072 * @param uiObject Object to add style to
073 * @param style Style name
074 */
075 public static <E extends Style.HasCssName> void addEnumStyleName(final UIObject uiObject,
076 final E style) {
077
078 if (style != null && style.getCssName() != null && !style.getCssName().isEmpty()) {
079 uiObject.addStyleName(style.getCssName());
080 }
081 }
082
083 /**
084 * Removes enum value style name from UIObject unless style is {@code null}.
085 *
086 * @param uiObject Object to remove style from
087 * @param style Style name
088 */
089 public static <E extends Style.HasCssName> void removeEnumStyleName(final UIObject uiObject,
090 final E style) {
091
092 if (style != null && style.getCssName() != null && !style.getCssName().isEmpty()) {
093 uiObject.removeStyleName(style.getCssName());
094 }
095 }
096
097 /**
098 * Returns {@code true} if specified style is contained in space-separated list of styles
099 *
100 * @param styleNames Space-separated list of styles
101 * @param style Style to look for
102 * @return True if contains style
103 */
104 public static boolean containsStyle(final String styleNames,
105 final String style) {
106
107 if (styleNames == null || style == null) {
108 return false;
109 }
110
111 final String[] styles = styleNames.split("\\s");
112
113 for (final String s : styles) {
114 if (style.equals(s)) {
115 return true;
116 }
117 }
118
119 return false;
120 }
121
122 /**
123 * Toggles a style name on a ui object
124 *
125 * @param uiObject Object to toggle style on
126 * @param toggleStyle whether or not to toggle the style name on the object
127 * @param styleName Style name
128 */
129 public static void toggleStyleName(final UIObject uiObject,
130 final boolean toggleStyle,
131 final String styleName) {
132 if (toggleStyle) {
133 uiObject.addStyleName(styleName);
134 } else {
135 uiObject.removeStyleName(styleName);
136 }
137 }
138
139 /**
140 * Sets the ui object to be hidden on the device size
141 *
142 * @param uiObject object to be hidden on the device size
143 * @param deviceSize device size
144 */
145 public static void setHiddenOn(final UIObject uiObject,
146 final DeviceSize deviceSize) {
147 // Split the enum up by _ to get the different devices
148 // Separates the SM_MD into [SM, MD] so we can add the right styles
149 final String[] deviceString = deviceSize.name().split("_");
150
151 for (final String device : deviceString) {
152 // Case back to basic enum (PRINT, XS, SM, MD, LG)
153 final DeviceSize size = DeviceSize.valueOf(device);
154 switch (size) {
155 case PRINT:
156 addEnumStyleName(uiObject, Responsiveness.HIDDEN_PRINT);
157 break;
158 case XS:
159 addEnumStyleName(uiObject, Responsiveness.HIDDEN_XS);
160 break;
161 case SM:
162 addEnumStyleName(uiObject, Responsiveness.HIDDEN_SM);
163 break;
164 case MD:
165 addEnumStyleName(uiObject, Responsiveness.HIDDEN_MD);
166 break;
167 case LG:
168 addEnumStyleName(uiObject, Responsiveness.HIDDEN_LG);
169 break;
170 default:
171 break;
172 }
173 }
174 }
175
176 /**
177 * Sets the ui object to be visible on the device size
178 *
179 * @param uiObject object to be visible on the device size
180 * @param deviceSize device size
181 */
182 public static void setVisibleOn(final UIObject uiObject,
183 final DeviceSize deviceSize) {
184 // Split the enum up by _ to get the different devices
185 // Separates the SM_MD into [SM, MD] so we can add the right styles
186 final String[] deviceString = deviceSize.name().split("_");
187
188 for (final String device : deviceString) {
189 // Case back to basic enum (PRINT, XS, SM, MD, LG)
190 final DeviceSize size = DeviceSize.valueOf(device);
191 switch (size) {
192 case PRINT:
193 addEnumStyleName(uiObject, Responsiveness.VISIBLE_PRINT);
194 break;
195 case XS:
196 addEnumStyleName(uiObject, Responsiveness.VISIBLE_XS);
197 break;
198 case SM:
199 addEnumStyleName(uiObject, Responsiveness.VISIBLE_SM);
200 break;
201 case MD:
202 addEnumStyleName(uiObject, Responsiveness.VISIBLE_MD);
203 break;
204 case LG:
205 addEnumStyleName(uiObject, Responsiveness.VISIBLE_LG);
206 break;
207 default:
208 break;
209 }
210 }
211 }
212
213 private StyleHelper() {
214 }
215 }