1 28 29 package org.opencms.workplace.comparison; 30 31 import com.alkacon.diff.Diff; 32 33 import org.opencms.jsp.CmsJspActionElement; 34 import org.opencms.util.CmsStringUtil; 35 import org.opencms.workplace.CmsDialog; 36 import org.opencms.workplace.CmsWorkplace; 37 import org.opencms.workplace.CmsWorkplaceSettings; 38 import org.opencms.workplace.list.A_CmsListDialog; 39 import org.opencms.workplace.tools.A_CmsHtmlIconButton; 40 import org.opencms.workplace.tools.CmsHtmlIconButtonStyleEnum; 41 42 import java.io.BufferedReader ; 43 import java.io.IOException ; 44 import java.io.StringReader ; 45 46 import javax.servlet.http.HttpServletRequest ; 47 import javax.servlet.jsp.JspException ; 48 import javax.servlet.jsp.JspWriter ; 49 50 60 public abstract class A_CmsDiffViewDialog extends CmsDialog { 61 62 63 private CmsDiffViewMode m_mode; 64 65 70 protected A_CmsDiffViewDialog(CmsJspActionElement jsp) { 71 72 super(jsp); 73 setParamStyle(STYLE_NEW); 74 } 75 76 81 public void displayDialog() throws Exception { 82 83 if (getAction() == ACTION_CANCEL) { 84 actionCloseDialog(); 85 } 86 JspWriter out = getJsp().getJspContext().getOut(); 87 out.print("<link rel='stylesheet' type='text/css' HREF='"); 88 out.print(getStyleUri(getJsp())); 89 out.println("diff.css'>"); 90 out.println(dialogContentStart(getParamTitle())); 91 out.print("<form name='diff-form' method='post' action='"); 92 out.print(getDialogUri()); 93 out.println("'>"); 94 out.println(allParamsAsHidden()); 95 out.println("</form>"); 96 out.println("<p>"); 98 out.println(getDiffOnlyButtonsHtml()); 99 out.println("</p>"); 100 out.println(dialogBlockStart(null)); 101 out.println("<table cellspacing='0' cellpadding='0' class='xmlTable'>\n<tr><td><pre style='overflow:auto'>"); 102 try { 103 CmsHtmlDifferenceConfiguration conf = new CmsHtmlDifferenceConfiguration( 104 getMode() == CmsDiffViewMode.ALL ? -1 : getLinesBeforeSkip(), 105 getLocale()); 106 String diff = Diff.diffAsHtml(getOriginalSource(), getCopySource(), conf); 107 if (CmsStringUtil.isNotEmpty(diff)) { 108 out.println(diff); 109 } else { 110 out.println(wrapLinesWithUnchangedStyle(CmsStringUtil.substitute(CmsStringUtil.escapeHtml(getOriginalSource()), "<br/>", ""))); 112 } 113 } catch (Exception e) { 114 out.print(e); 115 } 116 out.println("</pre></td></tr>\n</table>"); 117 out.println(dialogBlockEnd()); 118 out.println(dialogContentEnd()); 119 out.println(dialogEnd()); 120 out.println(bodyEnd()); 121 out.println(htmlEnd()); 122 } 123 124 129 String getDiffOnlyButtonsHtml() { 130 131 StringBuffer result = new StringBuffer (); 132 if (!getOriginalSource().equals(getCopySource())) { 133 String onClick1 = "javascript:document.forms['diff-form'].mode.value = '"; 134 String onClick2 = "javascript:document.forms['diff-form'].mode.value = '"; 135 onClick1 += CmsDiffViewMode.ALL; 136 onClick2 += CmsDiffViewMode.DIFF_ONLY; 137 onClick1 += "'; document.forms['diff-form'].submit();"; 138 onClick2 += "'; document.forms['diff-form'].submit();"; 139 result.append(getTwoButtonsHtml(CmsDiffViewMode.DIFF_ONLY.getName().key(getLocale()), 140 CmsDiffViewMode.ALL.getName().key(getLocale()), onClick1, onClick2, 141 getMode() == CmsDiffViewMode.DIFF_ONLY)); 142 } else { 143 setMode(CmsDiffViewMode.ALL); 145 } 146 return result.toString(); 147 } 148 149 160 public String getTwoButtonsHtml(String label1, String label2, String onClick1, String onClick2, boolean firstActive) { 161 StringBuffer result = new StringBuffer (); 162 if (firstActive) { 163 result.append(A_CmsHtmlIconButton.defaultButtonHtml( 164 getJsp(), 165 CmsHtmlIconButtonStyleEnum.SMALL_ICON_TEXT, 166 "id", 167 label1, 168 null, 169 true, 170 A_CmsListDialog.ICON_DETAILS_SHOW, 171 null, 172 onClick1)); 173 result.append(" "); 174 result.append(deactivatedEmphasizedButtonHtml( 175 label2, 176 A_CmsListDialog.ICON_DETAILS_HIDE)); 177 } else { 178 179 result.append(deactivatedEmphasizedButtonHtml( 180 label1, 181 A_CmsListDialog.ICON_DETAILS_HIDE)); 182 result.append(" "); 183 result.append(A_CmsHtmlIconButton.defaultButtonHtml( 184 getJsp(), 185 CmsHtmlIconButtonStyleEnum.SMALL_ICON_TEXT, 186 "id", 187 label2, 188 null, 189 true, 190 A_CmsListDialog.ICON_DETAILS_SHOW, 191 null, 192 onClick2)); 193 } 194 result.append(" "); 195 return result.toString(); 196 } 197 198 206 public String deactivatedEmphasizedButtonHtml(String name, String iconPath) { 207 208 StringBuffer result = new StringBuffer (); 209 result.append("<span style='vertical-align:middle;'><img style='width:20px;height:20px;display:inline;vertical-align:middle;text-decoration:none;' SRC=\'"); 210 result.append(CmsWorkplace.getSkinUri()); 211 result.append(iconPath); 212 result.append("\' alt=\'"); 213 result.append(name); 214 result.append("\' title=\'"); 215 result.append(name); 216 result.append("\'> <b>"); 217 result.append(name); 218 result.append("</b></span>"); 219 return result.toString(); 220 } 221 222 227 public CmsDiffViewMode getMode() { 228 229 return m_mode; 230 } 231 232 237 public String getParamMode() { 238 239 if (m_mode == null) { 240 return null; 241 } 242 return m_mode.getMode(); 243 } 244 245 250 public void setMode(CmsDiffViewMode mode) { 251 252 m_mode = mode; 253 } 254 255 260 public void setParamMode(String mode) { 261 262 m_mode = CmsDiffViewMode.valueOf(mode); 263 } 264 265 270 protected abstract String getCopySource(); 271 272 277 protected abstract int getLinesBeforeSkip(); 278 279 284 protected abstract String getOriginalSource(); 285 286 289 protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { 290 291 super.initWorkplaceRequestValues(settings, request); 292 if (CmsStringUtil.isEmptyOrWhitespaceOnly(getParamMode())) { 293 m_mode = CmsDiffViewMode.DIFF_ONLY; 295 } 296 try { 298 validateParamaters(); 299 } catch (Exception e) { 300 setAction(ACTION_CANCEL); 302 try { 303 actionCloseDialog(); 304 } catch (JspException e1) { 305 } 307 return; 308 } 309 } 310 311 316 protected abstract void validateParamaters() throws Exception ; 317 318 326 protected String wrapLinesWithUnchangedStyle(String diff) throws IOException { 327 328 String line; 329 StringBuffer result = new StringBuffer (); 330 BufferedReader br = new BufferedReader (new StringReader (diff)); 331 while ((line = br.readLine()) != null) { 332 if ("".equals(line.trim())) { 333 line = " "; 334 } 335 result.append("<div class=\"df-unc\"><span class=\"df-unc\">").append(line).append("</span></div>\n"); 336 } 337 return result.toString(); 338 } 339 340 } | Popular Tags |