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    }