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 */
016package com.github.gwtbootstrap.client.ui.resources.prettify;
017
018import java.util.ArrayList;
019import java.util.List;
020
021import com.github.gwtbootstrap.client.ui.resources.JavaScriptInjector;
022import com.google.gwt.dom.client.StyleInjector;
023import com.google.gwt.resources.client.TextResource;
024import com.google.gwt.user.client.ui.Widget;
025
026/**
027 * A helper class to inject and configure Google Code Prettify in our code
028 * components.
029 * 
030 * @since 2.0.4.0
031 * 
032 * @author Carlos Alexandro Becker
033 * 
034 */
035public class PrettifyHelper implements HasProgrammingLanguage {
036
037        static {
038                JavaScriptInjector.inject(PrettifyResources.RESOURCES.prettify_js()
039                                .getText());
040                StyleInjector.inject(PrettifyResources.RESOURCES.prettify_css()
041                                .getText());
042        }
043
044        static List<Integer> importedLangs = new ArrayList<Integer>();
045        private final Widget w;
046
047        public PrettifyHelper(Widget w) {
048                super();
049                this.w = w;
050        }
051
052        /**
053         * will import the language if needed.
054         */
055        public void setLang(String lang) {
056
057                int i = PrettifyResources.speciallangs.indexOf(lang);
058
059                // XXX thats very very very very ugly, sorry.
060
061                if (i > -1 && !importedLangs.contains(i)) {
062                        TextResource tr = null;
063                        switch (i) {
064                                case 0:
065                                        tr = PrettifyResources.RESOURCES.apollo();
066                                        break;
067                                case 1:
068                                        tr = PrettifyResources.RESOURCES.clj();
069                                        break;
070                                case 2:
071                                        tr = PrettifyResources.RESOURCES.css();
072                                        break;
073                                case 3:
074                                        tr = PrettifyResources.RESOURCES.go();
075                                        break;
076                                case 4:
077                                        tr = PrettifyResources.RESOURCES.hs();
078                                        break;
079                                case 5:
080                                        tr = PrettifyResources.RESOURCES.lisp();
081                                        break;
082                                case 6:
083                                        tr = PrettifyResources.RESOURCES.lua();
084                                        break;
085                                case 7:
086                                        tr = PrettifyResources.RESOURCES.ml();
087                                        break;
088                                case 8:
089                                        tr = PrettifyResources.RESOURCES.ml();
090                                        break;
091                                case 9:
092                                        tr = PrettifyResources.RESOURCES.n();
093                                        break;
094                                case 10:
095                                        tr = PrettifyResources.RESOURCES.proto();
096                                        break;
097                                case 11:
098                                        tr = PrettifyResources.RESOURCES.scala();
099                                        break;
100                                case 12:
101                                        tr = PrettifyResources.RESOURCES.sql();
102                                        break;
103                                case 13:
104                                        tr = PrettifyResources.RESOURCES.tex();
105                                        break;
106                                case 14:
107                                        tr = PrettifyResources.RESOURCES.vb();
108                                        break;
109                                case 15:
110                                        tr = PrettifyResources.RESOURCES.vhdl();
111                                        break;
112                                case 16:
113                                        tr = PrettifyResources.RESOURCES.wiki();
114                                        break;
115                                case 17:
116                                        tr = PrettifyResources.RESOURCES.xq();
117                                        break;
118
119                                default:
120                                        break;
121                        }
122                        if (tr != null) {
123                                JavaScriptInjector.inject(tr.getText());
124                                importedLangs.add(i);
125                        }
126                }
127        }
128
129        /**
130         * Configures prettyprint without line numbers.
131         */
132        public void configure() {
133                configure(false);
134        }
135
136        /**
137         * Configures prettyprint with optional line numbers.
138         * 
139         * @param showLineNumber
140         *            <code>true</code> if line numbers should be shown
141         */
142        public void configure(boolean showLineNumber) {
143                w.setStyleName("prettyprint");
144                if (showLineNumber)
145                        w.addStyleName("linenums");
146                setup();
147        }
148
149        private native void setup() /*-{
150                $wnd.prettyPrint();
151        }-*/;
152}