001    /*
002     *  Copyright 2012 GWT-Bootstrap
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package com.github.gwtbootstrap.client.ui.resources;
017    
018    import com.github.gwtbootstrap.client.ui.config.Configurator;
019    import com.google.gwt.core.client.GWT;
020    import com.google.gwt.dom.client.Document;
021    import com.google.gwt.dom.client.Element;
022    import com.google.gwt.dom.client.HeadElement;
023    import com.google.gwt.dom.client.LinkElement;
024    import com.google.gwt.dom.client.StyleInjector;
025    import com.google.gwt.resources.client.TextResource;
026    
027    /**
028     * Utility class to inject our resources into modules page. Use it to inject
029     * JavaScript and CSS files.
030     * 
031     * @since 2.0.4.0
032     * 
033     * @author Carlos Alexandro Becker
034     */
035    public class ResourceInjector {
036    
037        private static final Configurator ADAPTER = GWT.create(Configurator.class);
038    
039        private static HeadElement head;
040    
041        /**
042         * Injects the required CSS styles and JavaScript files into the document header.
043         * <pre>
044         * It's for NoStyle Module.
045         * </pre>
046         */
047        public static void configureWithCssFile() {
048            
049            injectResourceCssAsFile("bootstrap.min.css");
050            injectResourceCssAsFile("gwt-bootstrap.css");
051            injectResourceCssAsFile("font-awesome.css");
052    
053            configure();
054            
055        }
056        
057        /**
058         * Injects the required CSS styles and JavaScript files into the document
059         * header.
060         */
061        public static void configure() {
062    
063            Resources res = ADAPTER.getResources();
064            if (ADAPTER.hasResponsiveDesign())
065                activateResponsiveDesign(res);
066    
067            if(isNotLoadedJquery()) 
068                injectJs(res.jquery());
069            
070            injectJs(res.bootstrapJs());
071        }
072    
073        private native static boolean isNotLoadedJquery() /*-{
074            return !$wnd['jQuery'] || (typeof $wnd['jQuery'] !== 'function');
075        }-*/;
076    
077        private static void injectCss(TextResource r) {
078            StyleInjector.inject(r.getText());
079        }
080    
081        /**
082         * Inject public resource css file as a file.
083         * @param filename inject file name
084         */
085        public static void injectResourceCssAsFile(String filename) {
086            LinkElement link = Document.get().createLinkElement();
087            link.setType("text/css");
088            link.setRel("stylesheet");
089            link.setHref(GWT.getModuleName() + "/css/" + filename);
090            getHead().appendChild(link);
091        }
092    
093        private static HeadElement getHead() {
094            if (head == null) {
095                Element elt = Document.get().getElementsByTagName("head").getItem(0);
096                assert elt != null : "The host HTML page does not have a <head> element"
097                        + " which is required by StyleInjector";
098                head = HeadElement.as(elt);
099            }
100            return head;
101        }
102    
103        private static void injectJs(TextResource r) {
104            JavaScriptInjector.inject(r.getText());
105        }
106    
107        private static void activateResponsiveDesign(Resources res) {
108            injectCss(res.bootstrapResponsiveCss());
109            MetaInjector
110                    .inject("viewport", "width=device-width, initial-scale=1.0");
111        }
112    
113    }