001/* 002 * This library is part of OpenCms - 003 * the Open Source Content Management System 004 * 005 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com) 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * For further information about Alkacon Software GmbH & Co. KG, please see the 018 * company website: http://www.alkacon.com 019 * 020 * For further information about OpenCms, please see the 021 * project website: http://www.opencms.org 022 * 023 * You should have received a copy of the GNU Lesser General Public 024 * License along with this library; if not, write to the Free Software 025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 026 */ 027 028package org.opencms.workplace.editors.directedit; 029 030import org.opencms.cache.CmsVfsMemoryObjectCache; 031import org.opencms.file.CmsFile; 032import org.opencms.file.CmsObject; 033import org.opencms.i18n.CmsEncoder; 034import org.opencms.main.CmsException; 035import org.opencms.util.CmsMacroResolver; 036import org.opencms.util.CmsStringUtil; 037import org.opencms.workplace.editors.Messages; 038 039/** 040 * Provider for the OpenCms graphical "direct edit" buttons. <p> 041 * 042 * Uses the JQuery library to create the buttons and place it to the correct position.<p> 043 * 044 * This provider DOES NOT support {@link CmsDirectEditMode#MANUAL} mode.<p> 045 * 046 * @since 7.0.3 047 */ 048public class CmsDirectEditJQueryProvider extends CmsDirectEditDefaultProvider { 049 050 /** Default direct edit include file URI for the jQuery direct edit provider. */ 051 protected static final String INCLUDE_FILE_JQUERY = "/system/workplace/editors/jquery_direct_edit_include.txt"; 052 053 /** Contains the close link. */ 054 private String m_closeLink; 055 056 /** 057 * 058 * @see org.opencms.workplace.editors.directedit.CmsDirectEditDefaultProvider#getDirectEditIncludes(org.opencms.workplace.editors.directedit.CmsDirectEditParams) 059 */ 060 @Override 061 public String getDirectEditIncludes(CmsDirectEditParams params) { 062 063 m_closeLink = getLink(params.getLinkForClose()); 064 return super.getDirectEditIncludes(params); 065 } 066 067 /** 068 * @see org.opencms.workplace.editors.directedit.I_CmsDirectEditProvider#init(org.opencms.file.CmsObject, org.opencms.workplace.editors.directedit.CmsDirectEditMode, java.lang.String) 069 */ 070 @Override 071 public void init(CmsObject cms, CmsDirectEditMode mode, String fileName) { 072 073 if (CmsStringUtil.isEmpty(fileName)) { 074 fileName = INCLUDE_FILE_JQUERY; 075 } 076 super.init(cms, mode, fileName); 077 } 078 079 /** 080 * @see org.opencms.workplace.editors.directedit.I_CmsDirectEditProvider#newInstance() 081 */ 082 @Override 083 public I_CmsDirectEditProvider newInstance() { 084 085 CmsDirectEditJQueryProvider result = new CmsDirectEditJQueryProvider(); 086 result.m_configurationParameters = m_configurationParameters; 087 return result; 088 } 089 090 /** 091 * 092 * @see org.opencms.workplace.editors.directedit.CmsDirectEditDefaultProvider#startDirectEditDisabled(org.opencms.workplace.editors.directedit.CmsDirectEditParams, org.opencms.workplace.editors.directedit.CmsDirectEditResourceInfo) 093 */ 094 @Override 095 public String startDirectEditDisabled(CmsDirectEditParams params, CmsDirectEditResourceInfo resourceInfo) { 096 097 return appendDirectEditData(params, false); 098 } 099 100 /** 101 * 102 * @see org.opencms.workplace.editors.directedit.CmsDirectEditDefaultProvider#startDirectEditEnabled(org.opencms.workplace.editors.directedit.CmsDirectEditParams, org.opencms.workplace.editors.directedit.CmsDirectEditResourceInfo) 103 */ 104 @Override 105 public String startDirectEditEnabled(CmsDirectEditParams params, CmsDirectEditResourceInfo resourceInfo) { 106 107 return appendDirectEditData(params, false); 108 } 109 110 /** 111 * @see org.opencms.workplace.editors.directedit.CmsDirectEditDefaultProvider#prepareMacroResolverForIncludes(org.opencms.workplace.editors.directedit.CmsDirectEditParams) 112 */ 113 @Override 114 protected CmsMacroResolver prepareMacroResolverForIncludes(CmsDirectEditParams params) { 115 116 CmsMacroResolver resolver = super.prepareMacroResolverForIncludes(params); 117 resolver.addMacro("jquery_flydom", readFile("/system/workplace/resources/jquery/packed/jquery.flydom.js")); 118 resolver.addMacro( 119 "jquery_dimensions", 120 readFile("/system/workplace/resources/jquery/packed/jquery.dimensions.js")); 121 resolver.addMacro("jquery", readFile("/system/workplace/resources/jquery/packed/jquery.js")); 122 return resolver; 123 } 124 125 /** 126 * Appends the data for the direct edit buttons, which are dynamically created with jQuery.<p> 127 * 128 * Generates the following code:<p> 129 * <pre> 130 * <script > 131 * ocms_de_data['key']= { 132 * id: key, 133 * resource: res, 134 * ... 135 * }; 136 * </script > 137 * </pre> 138 * 139 * @param params the direct edit parameters 140 * @param disabled if the buttons are disabled or not 141 * 142 * @return the data needed for the direct edit buttons 143 */ 144 private String appendDirectEditData(CmsDirectEditParams params, boolean disabled) { 145 146 StringBuffer result = new StringBuffer(512); 147 String editId = getNextDirectEditId(); 148 149 result.append("\n<script>\n"); 150 151 result.append("ocms_de_data['").append(editId).append("']= {\n"); 152 result.append("\t").append("id: '").append(editId).append("',\n"); 153 result.append("\t").append("deDisabled: ").append(disabled).append(",\n"); 154 result.append("\t").append("hasEdit: ").append(params.getButtonSelection().isShowEdit()).append(",\n"); 155 result.append("\t").append("hasDelete: ").append(params.getButtonSelection().isShowDelete()).append(",\n"); 156 result.append("\t").append("hasNew: ").append(params.getButtonSelection().isShowNew()).append(",\n"); 157 result.append("\t").append("resource: '").append(params.getResourceName()).append("',\n"); 158 result.append("\t").append("editLink: '").append(getLink(params.getLinkForEdit())).append("',\n"); 159 result.append("\t").append("language: '").append(m_cms.getRequestContext().getLocale().toString()); 160 result.append("',\n"); 161 result.append("\t").append("element: '").append(params.getElement()).append("',\n"); 162 result.append("\t").append("backlink: '").append(m_cms.getRequestContext().getUri()).append("',\n"); 163 result.append("\t").append("newlink: '").append(CmsEncoder.encode(params.getLinkForNew())).append("',\n"); 164 result.append("\t").append("closelink: '").append(m_closeLink).append("',\n"); 165 result.append("\t").append("deletelink: '").append(getLink(params.getLinkForDelete())).append("',\n"); 166 if (!disabled) { 167 result.append("\t").append("button_edit: '"); 168 result.append(m_messages.key(Messages.GUI_EDITOR_FRONTEND_BUTTON_EDIT_0)).append("',\n"); 169 result.append("\t").append("button_delete: '"); 170 result.append(m_messages.key(Messages.GUI_BUTTON_DELETE_0)).append("',\n"); 171 result.append("\t").append("button_new: '"); 172 result.append(m_messages.key(Messages.GUI_BUTTON_NEW_0)).append("',\n"); 173 } else { 174 result.append("\t").append("button_edit: '"); 175 result.append(m_messages.key(Messages.GUI_EDITOR_FRONTEND_BUTTON_LOCKED_0)).append("',\n"); 176 result.append("\t").append("button_delete: '"); 177 result.append(m_messages.key(Messages.GUI_EDITOR_FRONTEND_BUTTON_LOCKED_0)).append("',\n"); 178 result.append("\t").append("button_new: '"); 179 result.append(m_messages.key(Messages.GUI_EDITOR_FRONTEND_BUTTON_LOCKED_0)).append("',\n"); 180 } 181 result.append("\t").append("editortitle: '").append(m_messages.key(Messages.GUI_EDITOR_TITLE_NEW_0)); 182 183 result.append("'\n"); 184 result.append("};\n"); 185 result.append("</script>\n"); 186 187 result.append("<div id=\"").append(editId).append("\" class=\"ocms_de_norm\">"); 188 return result.toString(); 189 } 190 191 /** 192 * Helper method to read the content of an included Javascript file.<p> 193 * 194 * @param path the root path of a Javascript file 195 * 196 * @return the content of the Javascript file 197 */ 198 private String readFile(String path) { 199 200 String result = (String)CmsVfsMemoryObjectCache.getVfsMemoryObjectCache().getCachedObject(m_cms, path); 201 if (result == null) { 202 try { 203 CmsFile file = m_cms.readFile(path); 204 result = getContentAsString(file); 205 } catch (CmsException e) { 206 throw new RuntimeException(e); 207 } 208 } 209 if (result != null) { 210 CmsVfsMemoryObjectCache.getVfsMemoryObjectCache().putCachedObject(m_cms, path, result); 211 } 212 return result; 213 214 } 215}