/* * GWT-Ext Widget Library * Copyright 2007 - 2008, GWT-Ext LLC., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package com.gwtext.client.widgets; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DeferredCommand; import com.gwtext.client.core.Ext; import com.gwtext.client.core.Function; import com.gwtext.client.widgets.HTMLPanel; /** * This class creates a Syntax Highlight panel for different * languages, XML, and HTML for displaying. This class * uses the syntaxhighlighter library found at: * http://code.google.com/p/syntaxhighlighter/ * * @author Mario Lim * */ public class SyntaxHighlightPanel extends HTMLPanel { public static final String SYNTAX_CPP = "cpp"; public static final String SYNTAX_CSHARP = "csharp"; public static final String SYNTAX_CSS = "css"; public static final String SYNTAX_PASCAL = "pascal"; public static final String SYNTAX_DELPHI = "pascal"; public static final String SYNTAX_JAVA = "java"; public static final String SYNTAX_JAVASCRIPT = "javascript"; public static final String SYNTAX_PHP = "php"; public static final String SYNTAX_PYTHON = "python"; public static final String SYNTAX_RUBY = "ruby"; public static final String SYNTAX_SQL = "sql"; public static final String SYNTAX_VB = "vb"; public static final String SYNTAX_XML = "xml"; public static final String SYNTAX_HTML = "html"; private String name = "sh_" + Ext.generateId(); private String html = null; private String syntaxType = SYNTAX_XML; private boolean showGutter = true; private boolean showControls = true; private boolean collapseAll = false; private int firstLine = 1; private boolean showColumns = true; private boolean hideBeforeHighlight = false; /** * Create a new SyntaxHighlightPanel. */ public SyntaxHighlightPanel() { this(null, SYNTAX_XML); } /** * Create a new SyntaxHighlightPanel. * * @param code the code to show in the panel * @param syntaxType is one of the available types: * */ public SyntaxHighlightPanel(String code, String syntaxType) { setBorder(true); setHtml(code); this.syntaxType = syntaxType; } /** * Hide the panel until after the hightlighting has been * rendered correctly. This is to avoid showing a non- * highlighted panel as it might take time to do the * syntax highliting. * @param hide true if need to hide. Default is false; */ public void setHideBeforeHighlighting(boolean hide){ this.hideBeforeHighlight = hide; } /** * sets the code to the SyntaxHighlightPanel. This is the code * that will be displayed in the panel * @param code is the code to display in the panel */ public void setHtml(String code){ this.html = code; final SyntaxHighlightPanel me = this; addListener("render", new Function(){ public void execute() { if(me.hideBeforeHighlight) me.hide(); setSuperHtml(setSyntaxHighlight()); doDeferredCommand(); } }); } private void doDeferredCommand(){ final SyntaxHighlightPanel me = this; DeferredCommand.addCommand(new Command(){ public void execute() { executeSh(name, showGutter, showControls, collapseAll, firstLine, showColumns); me.show(); } }); } /** * This method can be called after the component is rendered * so that it can update the code * @param html the code fragment to hightlight * @param syntaxType the syntax type */ public void updateHtml(String html, String syntaxType) { this.html = html; this.syntaxType = syntaxType; setSuperHtml(setSyntaxHighlight()); executeSh(name, showGutter, showControls, collapseAll, firstLine, showColumns); } /** * This method can be called after the component is rendered * so that it can update the code * @param html the code fragment to hightlight */ public void updateHtml(String html) { updateHtml(html, syntaxType); } /** * used internally to call the super method for setHtml... * @param html the html to set for the panel */ private void setSuperHtml(String html){ super.setHtml(html); } /** * This method is called internally to set the html to use * the textarea with a specific name and classname for * the library to use its specific css * @return the String that will be used for the setHtml. */ protected String setSyntaxHighlight(){ StringBuffer buffer = new StringBuffer(); buffer.append(""); return buffer.toString(); } /** * Private method that is called to apply the highlight for the textarea * @param name the name generated for this highlight * @param showGutter if it should show gutter * @param showControls if it should show the controls at the top * @param collapseAll if it should collapse the code * @param firstLine the first line to show * @param showColumns if it should show the column numbers */ private native void executeSh(String name, boolean showGutter, boolean showControls, boolean collapseAll, int firstLine, boolean showColumns) /*-{ $wnd.dp.SyntaxHighlighter.ClipboardSwf = 'js/sh/clipboard.swf'; $wnd.dp.SyntaxHighlighter.HighlightAll(name, showGutter, showControls, collapseAll, firstLine, showColumns); }-*/; protected JavaScriptObject create(JavaScriptObject config){ super.setHtml(setSyntaxHighlight()); return createJ(config); } protected JavaScriptObject createJ(JavaScriptObject config){ return super.create(config); } /** * Method to show gutter * @param showGutter true or false to show gutter */ public void setShowGutter(boolean showGutter){ this.showGutter = showGutter; } /** * Method to show controls * @param showControls true or false to show controls */ public void setShowControls(boolean showControls){ this.showControls = showControls; } /** * Method to collapse the code * @param collapseAll true or false to collapse or not the code */ public void setCollapseAll(boolean collapseAll){ this.collapseAll = collapseAll; } /** * Method to set what line to start showing * @param firstLine integer of the line to show first */ public void setFirstLine(int firstLine){ this.firstLine = firstLine; } /** * Method to show columns * @param showColumns true or false to show columns or not */ public void setShowColumns(boolean showColumns){ this.showColumns = showColumns; } }