/* * ********************************************************************************* * $URL: https://source.sakaiproject.org/svn/metaobj/trunk/metaobj-util/tool-lib/src/java/org/sakaiproject/metaobj/shared/control/tag/RichTextWrapperTag.java $ * $Id: RichTextWrapperTag.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $ * ********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * ********************************************************************************* * */ package org.sakaiproject.metaobj.shared.control.tag; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.taglibs.standard.tag.el.core.ExpressionUtil; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.content.api.ContentHostingService; import org.sakaiproject.portal.api.PortalService; import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.util.EditorConfiguration; import org.sakaiproject.util.Web; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTagSupport; import java.io.IOException; public class RichTextWrapperTag extends BodyTagSupport { protected final transient Log logger = LogFactory.getLog(getClass()); private static PortalService portalService = (PortalService) ComponentManager.get(PortalService.class); //private static final String SCRIPT_PATH; //private static final String HTMLAREA_SCRIPT_PATH; //private static final String RESOURCE_PATH; private String textAreaId; /* // we have static resources for our script path and built-in toolbars etc. static { ConfigurationResource cr = new ConfigurationResource(); SCRIPT_PATH = cr.get("inputRichTextScript"); HTMLAREA_SCRIPT_PATH = cr.get("inputRichTextHTMLArea"); RESOURCE_PATH = cr.get("resources"); } */ public int doStartTag() throws JspException { JspWriter writer = pageContext.getOut(); String textAreaId = (String) ExpressionUtil.evalNotNull("richTextWrapper", "textAreaId", getTextAreaId(), String.class, this, pageContext); try { writer.write("<script type=\"text/javascript\" defer=\"1\">sakai.editor.launch('" + textAreaId + "');</script>"); /* String editor = ServerConfigurationService.getString("wysiwyg.editor"); if(editor != null && !editor.equalsIgnoreCase("FCKeditor")) { // Render JavaScripts. //writeExternalScripts(locale, writer); writer.write("<script type=\"text/javascript\" src=\"/library/editor/HTMLArea/sakai_editor.js\"></script>\n"); writer.write("<script type=\"text/javascript\" defer=\"1\">chef_setupformattedtextarea('"+textAreaId+"');</script>"); } else { String collectionId = getContentHostingService().getSiteCollection(ToolManager.getCurrentPlacement().getContext()); String tagFocus = ServerConfigurationService.getString("tags.focus"); boolean resourceSearch = EditorConfiguration.enableResourceSearch(); writer.write("<script type=\"text/javascript\" src=\"/library/editor/FCKeditor/sakai_fckconfig.js\"></script>\n"); writer.write("<script type=\"text/javascript\" defer=\"1\">\n"); if(resourceSearch) { // need to set document.__pid to placementId String placementId = ToolManager.getCurrentPlacement().getId(); writer.write("\t\tdocument.__pid=\"" + placementId + "\";\n"); // need to set document.__baseUrl to baseUrl String baseUrl = ServerConfigurationService.getToolUrl() + "/" + Web.escapeUrl(placementId); writer.write("\t\tdocument.__baseUrl=\"" + baseUrl + "\";\n"); } writer.write("\t\tvar inputArea = document.getElementById('"+textAreaId+"');\n"); writer.write("\t\tvar cols = document.getElementById('"+textAreaId+"').cols;\n"); writer.write("\t\tvar rows = document.getElementById('"+textAreaId+"').rows;\n"); writer.write("\t\tvar width = 450 * cols / 80;\n"); writer.write("\t\tvar height = 50 * rows / 4;\n"); writer.write("\t\tchef_setupfcktextarea('"+ textAreaId+"', width, height, '" + collectionId + "', '" + tagFocus + "', '" + Boolean.toString(resourceSearch) + "');\n"); writer.write("\t\tvar f = document.getElementById('"+textAreaId+"').form;\n" + "\t\tif (typeof f.onsubmit != \"function\") f.onsubmit = function() {};\n"); writer.write("</script>"); } */ } catch (IOException e) { logger.error("", e); throw new JspException(e); } return EVAL_BODY_INCLUDE; } /** * @todo do these as a document.write after testing if done * @param contextPath * @param writer * @throws IOException */ /* protected void writeExternalScripts(Locale locale, ResponseWriter writer) throws IOException { writer.write("<script type=\"text/javascript\">var _editor_url = \"" + "/" + RESOURCE_PATH + "/" + HTMLAREA_SCRIPT_PATH + "/" + "\";</script>\n"); writer.write("<script type=\"text/javascript\" src=\"" + "/" + RESOURCE_PATH + "/" + HTMLAREA_SCRIPT_PATH + "/" + "htmlarea.js\"></script>\n"); writer.write("<script type=\"text/javascript\" src=\"" + "/" + RESOURCE_PATH + "/" + HTMLAREA_SCRIPT_PATH + "/" + "dialog.js\"></script>\n"); writer.write("<script type=\"text/javascript\" src=\"" + "/" + RESOURCE_PATH + "/" + HTMLAREA_SCRIPT_PATH + "/" + "popupwin.js\"></script>\n"); writer.write("<script type=\"text/javascript\" src=\"" + "/" + RESOURCE_PATH + "/" + HTMLAREA_SCRIPT_PATH + "/" + "lang/en.js\"></script>\n"); String language = locale.getLanguage(); if (!Locale.ENGLISH.equals(language)) { writer.write("<script type=\"text/javascript\" src=\"" + "/" + RESOURCE_PATH + "/" + HTMLAREA_SCRIPT_PATH + "/" + "lang/" + language + ".js\"></script>\n"); } writer.write("<script type=\"text/javascript\" src=\"" + "/" + RESOURCE_PATH + "/" + SCRIPT_PATH + "\"></script>\n"); } protected void doFckStuff(JspWriter writer, String clientId) { // set up dimensions int widthPx = 450; int heightPx = 50; int textareaColumns = 80; int textareaRows = 4; widthPx = (DEFAULT_WIDTH_PX*textareaColumns)/DEFAULT_COLUMNS; heightPx = (DEFAULT_HEIGHT_PX*textareaRows)/DEFAULT_ROWS; // not as slick as the way htmlarea is rendered, but the difference in functionality doesn't all //make sense for FCK at this time since it's already got the ability to insert files and such. String collectionId = ContentHostingService.getSiteCollection(ToolManager.getCurrentPlacement().getContext()); //is there a slicker way to get this? String connector = "/sakai-fck-connector/web/editor/filemanager/browser/default/connectors/jsp/connector"; //writer.write("<table border=\"0\"><tr><td>"); writer.write("<script type=\"text/javascript\" src=\"/library/editor/FCKeditor/fckeditor.js\"></script>\n"); writer.write("<script type=\"text/javascript\" language=\"JavaScript\">\n"); writer.write("function chef_setupformattedtextarea(textarea_id){\n"); writer.write("var oFCKeditor = new FCKeditor(textarea_id);\n"); writer.write("oFCKeditor.BasePath = \"/library/editor/FCKeditor/\";\n"); if (widthPx < 0) widthPx = 600; if (heightPx < 0) heightPx = 400; //FCK's toolset is larger then htmlarea and this prevents tools from ending up with all toolbar //and no actual editing area. if (heightPx < 200) heightPx = 200; writer.write("oFCKeditor.Width = \"" + widthPx + "\" ;\n"); writer.write("oFCKeditor.Height = \"" + heightPx + "\" ;\n"); if ("archival".equals(ServerConfigurationService.getString("tags.focus"))) writer.write("\n\toFCKeditor.Config['CustomConfigurationsPath'] = \"/library/editor/FCKeditor/archival_config.js\";\n"); else { writer.write("\n\t\tvar courseId = \"" + collectionId + "\";"); writer.write("\n\toFCKeditor.Config['ImageBrowserURL'] = oFCKeditor.BasePath + " + "\"editor/filemanager/browser/default/browser.html?Connector=" + connector + "&Type=Image&CurrentFolder=\" + courseId;"); writer.write("\n\toFCKeditor.Config['LinkBrowserURL'] = oFCKeditor.BasePath + " + "\"editor/filemanager/browser/default/browser.html?Connector=" + connector + "&Type=Link&CurrentFolder=\" + courseId;"); writer.write("\n\toFCKeditor.Config['FlashBrowserURL'] = oFCKeditor.BasePath + " + "\"editor/filemanager/browser/default/browser.html?Connector=" + connector + "&Type=Flash&CurrentFolder=\" + courseId;"); writer.write("\n\toFCKeditor.Config['ImageUploadURL'] = oFCKeditor.BasePath + " + "\"" + connector + "?Type=Image&Command=QuickUpload&Type=Image&CurrentFolder=\" + courseId;"); writer.write("\n\toFCKeditor.Config['FlashUploadURL'] = oFCKeditor.BasePath + " + "\"" + connector + "?Type=Flash&Command=QuickUpload&Type=Flash&CurrentFolder=\" + courseId;"); writer.write("\n\toFCKeditor.Config['LinkUploadURL'] = oFCKeditor.BasePath + " + "\"" + connector + "?Type=File&Command=QuickUpload&Type=Link&CurrentFolder=\" + courseId;"); writer.write("\n\n\toFCKeditor.Config['CurrentFolder'] = courseId;"); writer.write("\n\toFCKeditor.Config['CustomConfigurationsPath'] = \"/library/editor/FCKeditor/config.js\";\n"); } } */ public String getTextAreaId() { return textAreaId; } public void setTextAreaId(String textAreaId) { this.textAreaId = textAreaId; } protected ContentHostingService getContentHostingService() { return (ContentHostingService) ComponentManager.get("org.sakaiproject.content.api.ContentHostingService"); } }