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;
017    
018    import com.github.gwtbootstrap.client.ui.resources.Bootstrap;
019    import com.github.gwtbootstrap.client.ui.resources.prettify.HasProgrammingLanguage;
020    import com.github.gwtbootstrap.client.ui.resources.prettify.PrettifyHelper;
021    import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
022    import com.google.gwt.user.client.ui.HTMLPanel;
023    import com.google.gwt.user.client.ui.HasHTML;
024    
025    //@formatter:off
026    /**
027     * Block of Code with syntax highlighting.
028     * <p>
029     * Line breaks have to be escaped with "\n".
030     * 
031     * <p>
032     * <h3>UiBinder Usage:</h3>
033     * 
034     * <pre>
035     * {@code 
036     * <b:CodeBlock linenums="true">}
037     *     public class Person { \n
038     *     \n
039     *     private final String name;\n
040     *     private final int age;\n
041     *     }
042     * {@code </b:CodeBlock>}
043     * </pre>
044     * All arguments are optional.
045     * 
046     * @since 2.0.4.0
047     * 
048     * @author Dominik Mayer
049     * 
050     * @author Carlos Alexandro Becker
051     * 
052     * @see <a href="http://twitter.github.com/bootstrap/base-css.html#code">Bootstrap documentation</a>
053     * @see Code
054     */
055    //@formatter:on
056    public class CodeBlock extends HTMLPanel implements HasProgrammingLanguage, HasHTML {
057    
058            private final PrettifyHelper helper;
059            private boolean linenums = false;
060    
061            /**
062             * Creates an empty widget.
063             */
064            public CodeBlock() {
065                    super("pre", "");
066                    helper = new PrettifyHelper(this);
067            }
068    
069            /**
070             * Creates a widget with the content set.
071             * 
072             * @param content
073             *            the content of the widget
074             */
075            public CodeBlock(String content) {
076                    this();
077                    setHTML(content);
078            }
079    
080            /**
081             * Sets whether the widget should be restricted to a maximum height of 350
082             * px with y-axis scrollbars enabled.
083             * 
084             * @param scrollable
085             *            <code>true</code> to show scrollbars. Default:
086             *            <code>false</code>
087             */
088            public void setScrollable(boolean scrollable) {
089                    if (scrollable)
090                            addStyleName(Bootstrap.pre_scrollable);
091                    else
092                            removeStyleName(Bootstrap.pre_scrollable);
093            }
094    
095            /**
096             * Sets whether line numbers are shown.
097             * 
098             * @param linenums
099             *            <code>true</code> to show line numbers. Default:
100             *            <code>false</code>
101             */
102            public void setLinenums(boolean linenums) {
103                    this.linenums = linenums;
104            }
105    
106            /**
107             * {@inheritDoc}
108             */
109            public String getHTML() {
110                    return getElement().getInnerHTML();
111            }
112    
113            /**
114             * Sets the widget's text.
115             * <p>
116             * Any HTML content is escaped and displayed as text.
117             * 
118             * @param html
119             *            the text to be set
120             */
121            public void setHTML(String html) {
122                    String[] lines = html.split("\\\\n");
123                    SafeHtmlBuilder shb = new SafeHtmlBuilder();
124    
125                    for (String s : lines) {
126                            shb.appendEscaped(s);
127                            shb.appendHtmlConstant("<br/>");
128                    }
129                    
130                    if(getStyleName().contains("prettyprinted")) {
131                        removeStyleName("prettyprinted");
132                    }
133    
134                    getElement().setInnerHTML(shb.toSafeHtml().asString());
135                    
136                    if(isAttached()) {
137                        helper.configure(linenums);
138                    }
139                    
140            }
141    
142            /**
143             * {@inheritDoc}
144             */
145            public String getText() {
146                    return getHTML();
147            }
148    
149            /**
150             * {@inheritDoc}
151             */
152            public void setText(String text) {
153                    setHTML(text);
154            }
155    
156            /**
157             * {@inheritDoc}
158             */
159            public void setLang(String programmingLanguage) {
160                    helper.setLang(programmingLanguage);
161            }
162    
163            /**
164             * {@inheritDoc}
165             */
166            @Override
167            protected void onLoad() {
168                    super.onLoad();
169                    helper.configure(linenums);
170            }
171    }