View Javadoc

1   /**
2    * This file Copyright (c) 2003-2011 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.cms.gui.dialog;
35  
36  import info.magnolia.cms.beans.config.MIMEMapping;
37  import info.magnolia.cms.beans.runtime.Document;
38  import info.magnolia.cms.beans.runtime.MultipartForm;
39  import info.magnolia.cms.core.Content;
40  import info.magnolia.cms.gui.control.File;
41  import info.magnolia.cms.gui.misc.CssConstants;
42  import info.magnolia.cms.gui.misc.Spacer;
43  
44  import java.io.IOException;
45  import java.io.Writer;
46  import java.util.ArrayList;
47  import java.util.List;
48  
49  import javax.jcr.PropertyType;
50  import javax.jcr.RepositoryException;
51  import javax.servlet.http.HttpServletRequest;
52  import javax.servlet.http.HttpServletResponse;
53  
54  import org.apache.commons.lang.StringUtils;
55  
56  
57  /**
58   * @author Vinzenz Wyser
59   * @version 2.0
60   */
61  public class DialogFile extends DialogBox {
62  
63      private List imageExtensions = new ArrayList();
64  
65      /**
66       * @see info.magnolia.cms.gui.dialog.DialogControl#init(HttpServletRequest, HttpServletResponse, Content, Content)
67       */
68      public void init(HttpServletRequest request, HttpServletResponse response, Content websiteNode, Content configNode)
69          throws RepositoryException {
70          super.init(request, response, websiteNode, configNode);
71          initImageExtensions();
72      }
73  
74      public List getImageExtensions() {
75          return this.imageExtensions;
76      }
77  
78      public void setImageExtensions(List l) {
79          this.imageExtensions = l;
80      }
81  
82      public void initImageExtensions() {
83          this.getImageExtensions().add("jpg"); //$NON-NLS-1$
84          this.getImageExtensions().add("jpeg"); //$NON-NLS-1$
85          this.getImageExtensions().add("gif"); //$NON-NLS-1$
86          this.getImageExtensions().add("png"); //$NON-NLS-1$
87          this.getImageExtensions().add("bmp"); //$NON-NLS-1$
88          this.getImageExtensions().add("swf"); //$NON-NLS-1$
89      }
90  
91      public void drawHtml(Writer out) throws IOException {
92          File control = getFileControl();
93          control.setType(this.getConfigValue("type", PropertyType.TYPENAME_STRING)); //$NON-NLS-1$
94          control.setSaveInfo(false); // set manualy below
95          control.setCssClass(CssConstants.CSSCLASS_FILE);
96          control.setCssClassFileName(CssConstants.CSSCLASS_EDIT);
97          control.setCssStyles("width", this.getConfigValue("width", "100%")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
98  
99          this.drawHtmlPre(out);
100 
101         String width = this.getConfigValue("width", "100%"); //$NON-NLS-1$ //$NON-NLS-2$
102 
103 
104         final boolean preview = Boolean.valueOf(getConfigValue("preview", "true")).booleanValue();
105         final boolean extensionIsDisplayableImage = this.getImageExtensions().contains(control.getExtension().toLowerCase());
106         final boolean showImage = extensionIsDisplayableImage && preview;
107 
108         StringBuffer htmlControlFileName = getHtmlControlFileName(control);
109         String htmlContentEmpty = control.getHtmlBrowse() + Spacer.getHtml(0, 0) + htmlControlFileName;
110         out.write("<div id=\"" + this.getName() + "_contentDiv\" style=\"width:100%;\">"); //$NON-NLS-1$ //$NON-NLS-2$
111         boolean exists = false;
112 
113         if (this.getStorageNode() != null) {
114             exists = this.getStorageNode().getNodeData(this.getName()).isExist();
115         }
116 
117         if (!exists) {
118             out.write(htmlContentEmpty);
119             out.write("</div>"); //$NON-NLS-1$
120         }
121         else {
122             String link = getLink(control);
123 
124             if (showImage) {
125 
126                 out.write("\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"" + width + "\">"); //$NON-NLS-1$ //$NON-NLS-2$
127                 out.write("<tr><td class=\"" + CssConstants.CSSCLASS_FILEIMAGE + "\">"); //$NON-NLS-1$ //$NON-NLS-2$
128 
129                 if ("swf".equals(control.getExtension().toLowerCase())) {
130 
131                     // flash movie
132                     out.write("<object type=\"application/x-shockwave-flash\" data=\"");
133                     out.write(link);
134                     out.write("\" title=\"");
135                     out.write(control.getFileName());
136                     out.write("\" ");
137                     out.write("width=\"150\" ");
138                     out.write("height=\"100\" ");
139                     out.write(">");
140 
141                     out.write("<param name=\"movie\" value=\"");
142                     out.write(link);
143                     out.write("\"/>");
144 
145                     out.write("</object>\n");
146 
147                 }
148                 else {
149                     // standard image
150 
151                     // todo: image thumbnail template
152                     // out.write("<img src=\""+ this.getRequest().getContextPath()
153                     // +THUMB_PATH+"?src="+control.getHandle()+"\"
154                     // class=\""+CSSCLASS_FILEIMAGE+"\">");
155                     // tmp workaround: resize in html ...
156 
157                     int imgwidth = 150;
158                     int imgheight = 150;
159 
160                     try{
161                         imgwidth = Integer.parseInt(control.getImageWidth());
162                         imgheight = Integer.parseInt(control.getImageHeight());
163                     }
164                     catch(NumberFormatException e){
165                         // ignore (is 150)
166                     }
167 
168                     // resize if to big
169                     if(imgwidth > imgheight && imgwidth > 150){
170                         imgheight = (int)(150.0/imgwidth * imgheight);
171                         imgwidth = 150;
172                     }
173                     else if(imgheight > imgwidth && imgheight > 150){
174                         imgwidth = (int)(150.0/imgheight * imgwidth);
175                         imgheight = 150;
176                     }
177 
178                     out.write("<img width=\"" + imgwidth + "\" height=\"" + imgheight + "\"src=\""); //$NON-NLS-1$
179                     out.write(link);
180                     out.write("\" class=\""); //$NON-NLS-1$
181                     out.write(CssConstants.CSSCLASS_FILEIMAGE);
182                     out.write("\" alt=\""); //$NON-NLS-1$
183                     out.write(control.getFileName());
184                     out.write("\" title=\""); //$NON-NLS-1$
185                     out.write(control.getFileName());
186                     out.write("\" />\n"); //$NON-NLS-1$
187 
188                     if (StringUtils.isNotEmpty(control.getImageWidth())) {
189                         out.write("<em style='white-space:nowrap'>"); //$NON-NLS-1$
190 
191                         out.write("width: "); //$NON-NLS-1$
192                         out.write(control.getImageWidth());
193 
194                         out.write(" height: "); //$NON-NLS-1$
195                         out.write(control.getImageHeight());
196 
197                         out.write("</em>\n"); //$NON-NLS-1$
198                     }
199 
200                 }
201 
202                 out.write("</td><td>"); //$NON-NLS-1$
203             }
204             writeInnerHtml(out, showImage, control, htmlControlFileName, link);
205 
206             out.write(Spacer.getHtml(12, 12));
207             out.write(control.getHtmlRemove("mgnlDialogFileRemove('" + this.getName() + "');")); //$NON-NLS-1$ //$NON-NLS-2$
208             if (showImage) {
209                 out.write("</td></tr></table>"); //$NON-NLS-1$
210             }
211             out.write("</div>\n"); //$NON-NLS-1$
212             out.write("<div style=\"position:absolute;top:-500px;left:-500px;visibility:hidden;\">\n<textarea id=\""); //$NON-NLS-1$
213             out.write(this.getName());
214             out.write("_contentEmpty\">");//$NON-NLS-1$
215             out.write(htmlContentEmpty);
216 
217             // @todo should be escaped, but we need to test it
218             // out.write(StringEscapeUtils.escapeXml(htmlContentEmpty));
219             out.write("</textarea>\n</div>\n"); //$NON-NLS-1$
220         }
221         control.setSaveInfo(true);
222         out.write(control.getHtmlSaveInfo());
223         control.setNodeDataTemplate(this.getConfigValue("nodeDataTemplate", null)); //$NON-NLS-1$
224         out.write(control.getHtmlNodeDataTemplate());
225         this.drawHtmlPost(out);
226     }
227 
228     protected String getLink(File control) {
229         String link = this.getRequest().getContextPath() + getFileURI(control);
230         if (!StringUtils.isEmpty(control.getExtension())) {
231             link += "." + control.getExtension();
232         }
233         return link;
234     }
235 
236     protected void writeInnerHtml(Writer out, final boolean showImage, File control, StringBuffer htmlControlFileName, String link) throws IOException {
237         out.write(htmlControlFileName.toString());
238         if (!showImage) {
239             String iconPath = MIMEMapping.getMIMETypeIcon(control.getExtension());
240 
241             out.write(Spacer.getHtml(0, 0));
242 
243             out.write("<a href=");
244             out.write(link);
245             out.write(" target=\"_blank\">"); //$NON-NLS-1$ //$NON-NLS-2$
246 
247             out.write("<img src=\"" //$NON-NLS-1$
248                 + this.getRequest().getContextPath()
249                 + iconPath
250                 + "\" class=\"" //$NON-NLS-1$
251                 + CssConstants.CSSCLASS_FILEICON
252                 + "\" border=\"0\">"); //$NON-NLS-1$
253             out.write(control.getFileName() + "." + control.getExtension() + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
254         }
255     }
256 
257     protected StringBuffer getHtmlControlFileName(File control) {
258         StringBuffer htmlControlFileName = new StringBuffer();
259         htmlControlFileName.append("<span class=\"" //$NON-NLS-1$
260             + CssConstants.CSSCLASS_DESCRIPTION
261             + "\">" //$NON-NLS-1$
262             + getMessage("dialog.file.filename") //$NON-NLS-1$
263             + "</span>"); //$NON-NLS-1$
264         htmlControlFileName.append(Spacer.getHtml(1, 1));
265         htmlControlFileName.append(control.getHtmlFileName() + "<span id=\"" //$NON-NLS-1$
266             + this.getName()
267             + "_fileNameExtension\">." //$NON-NLS-1$
268             + control.getExtension()
269             + "</span>"); //$NON-NLS-1$
270         return htmlControlFileName;
271     }
272 
273     public boolean validate() {
274         if (isRequired()) {
275             // if we have a form, then this is going to the database
276             MultipartForm form = (MultipartForm) getRequest().getAttribute(MultipartForm.REQUEST_ATTRIBUTE_NAME);
277             if (form != null) {
278                 Document doc = form.getDocument(getName());
279                 if (doc != null) { // we're submitting a document for this required field
280                     return true;
281                 }
282                 // we're removing the document
283                 // for this required field but
284                 // not uploading one
285                 if (form.getParameter(getName() + "_" + File.REMOVE) != null) {
286                     setValidationMessage("dialogs.validation.required");
287                     return false;
288                 }
289             }
290             // we are not uploading or removing
291             // check if there is a binary stored
292             if(this.getStorageNode() == null || !getStorageNode().getNodeData(getName()).isExist()){
293                 setValidationMessage("dialogs.validation.required");
294                 return false;
295             }
296         }
297         return true;
298     }
299 
300     /**
301      * Get the uri of the file (used to show images)
302      * @param control
303      * @return
304      */
305     protected String getFileURI(File control) {
306         return control.getHandle();
307     }
308 
309     /**
310      * Configures the inner file upload control
311      */
312     protected File getFileControl() {
313         File control = new File(this.getName(), this.getStorageNode());
314         return control;
315     }
316 }