/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
*
* This library 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 2.1 of the License, or (at your option) any later version.
*
* This library 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.
*
* For further information about Alkacon Software, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.ade.upload.client.ui;
import org.opencms.ade.upload.client.Messages;
import org.opencms.ade.upload.client.ui.css.I_CmsLayoutBundle;
import org.opencms.gwt.client.ui.css.I_CmsConstantsBundle;
import org.opencms.gwt.client.ui.input.upload.CmsFileInfo;
import org.opencms.gwt.client.util.CmsClientStringUtil;
import org.opencms.gwt.shared.CmsListInfoBean;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.user.client.ui.HTML;
/**
* Provides the upload dialog for form data support.<p>
*
* @since 8.0.0
*/
public class CmsUploadDialogFormDataImpl extends A_CmsUploadDialog {
private String m_hightLightColor = I_CmsConstantsBundle.INSTANCE.css().backgroundColorHighlight();
private String m_normalColor = I_CmsLayoutBundle.INSTANCE.constants().css().backgroundColorDialog();
/**
* Default constructor.<p>
*/
public CmsUploadDialogFormDataImpl() {
super();
addUploadZone(getContentWrapper().getElement(), this);
}
/**
* @see org.opencms.ade.upload.client.ui.A_CmsUploadDialog#createInfoBean(org.opencms.gwt.client.ui.input.upload.CmsFileInfo)
*/
@Override
public CmsListInfoBean createInfoBean(CmsFileInfo file) {
return new CmsListInfoBean(file.getFileName(), formatBytes(file.getFileSize())
+ " ("
+ getResourceType(file)
+ ")", null);
}
/**
* @see org.opencms.ade.upload.client.ui.A_CmsUploadDialog#getFileSizeTooLargeMessage(org.opencms.gwt.client.ui.input.upload.CmsFileInfo)
*/
@Override
public String getFileSizeTooLargeMessage(CmsFileInfo file) {
return Messages.get().key(
Messages.GUI_UPLOAD_FILE_TOO_LARGE_2,
formatBytes(file.getFileSize()),
formatBytes(new Long(getData().getUploadFileSizeLimit()).intValue()));
}
/**
* @see org.opencms.ade.upload.client.ui.A_CmsUploadDialog#isTooLarge(org.opencms.gwt.client.ui.input.upload.CmsFileInfo)
*/
@Override
public boolean isTooLarge(CmsFileInfo cmsFileInfo) {
long maxFileSize = getData().getUploadFileSizeLimit();
if (maxFileSize < 0) {
return false;
}
return cmsFileInfo.getFileSize() > maxFileSize;
}
/**
* @see org.opencms.ade.upload.client.ui.A_CmsUploadDialog#submit()
*/
@Override
public void submit() {
// create a JsArray containing the files to upload
List<String> orderedFilenamesToUpload = new ArrayList<String>(getFilesToUpload().keySet());
Collections.sort(orderedFilenamesToUpload, String.CASE_INSENSITIVE_ORDER);
JsArray<CmsFileInfo> filesToUpload = JavaScriptObject.createArray().cast();
for (String filename : orderedFilenamesToUpload) {
filesToUpload.push(getFilesToUpload().get(filename));
}
// create a array that contains the names of the files that should be unziped
JavaScriptObject filesToUnzip = JavaScriptObject.createArray();
for (String filename : getFilesToUnzip(false)) {
CmsClientStringUtil.pushArray(filesToUnzip, filename);
}
upload(getUploadUri(), getTargetFolder(), filesToUpload, filesToUnzip, this);
}
/**
* @see org.opencms.ade.upload.client.ui.A_CmsUploadDialog#updateSummary()
*/
@Override
public void updateSummary() {
setContentLength(calculateContentLength());
StringBuffer buffer = new StringBuffer(64);
buffer.append("<p class=\"").append(I_CmsLayoutBundle.INSTANCE.uploadCss().dialogMessage()).append("\">");
buffer.append("<b>" + Messages.get().key(Messages.GUI_UPLOAD_SUMMARY_FILES_0) + "</b> ");
buffer.append(Messages.get().key(
Messages.GUI_UPLOAD_SUMMARY_FILES_VALUE_3,
new Integer(getFilesToUpload().size()),
getFileText(),
formatBytes(new Long(getContentLength()).intValue())));
buffer.append("</p>");
setSummaryHTML(buffer.toString());
}
/**
* Adds a javascript file array to the list of files to upload.<p>
*
* @param files a javascript file array
*/
protected void addJsFiles(JavaScriptObject files) {
JsArray<CmsFileInfo> cmsFiles = getFiles(files);
CmsFileInfo[] result = new CmsFileInfo[cmsFiles.length()];
for (int i = 0; i < cmsFiles.length(); ++i) {
result[i] = cmsFiles.get(i);
}
List<CmsFileInfo> fileObjects = Arrays.asList(result);
addFiles(fileObjects);
}
/**
* Returns the content length.<p>
*
* @return the content length
*/
protected long calculateContentLength() {
int result = 0;
for (CmsFileInfo file : getFilesToUpload().values()) {
result += file.getFileSize();
}
return new Long(result).longValue();
}
/**
* @see org.opencms.ade.upload.client.ui.A_CmsUploadDialog#setDragAndDropMessage()
*/
@Override
protected void setDragAndDropMessage() {
if (m_dragAndDropMessage == null) {
m_dragAndDropMessage = new HTML();
m_dragAndDropMessage.setStyleName(I_CmsLayoutBundle.INSTANCE.uploadCss().dragAndDropMessage());
m_dragAndDropMessage.setText(Messages.get().key(Messages.GUI_UPLOAD_DRAG_AND_DROP_ENABLED_0));
}
getContentWrapper().add(m_dragAndDropMessage);
m_normalColor = I_CmsConstantsBundle.INSTANCE.css().notificationNormalBg();
getContentWrapper().getElement().getStyle().setBackgroundColor(m_normalColor);
}
/**
* @see org.opencms.ade.upload.client.ui.A_CmsUploadDialog#removeDragAndDropMessage()
*/
@Override
protected void removeDragAndDropMessage() {
if (m_dragAndDropMessage != null) {
m_dragAndDropMessage.removeFromParent();
m_dragAndDropMessage = null;
m_normalColor = I_CmsLayoutBundle.INSTANCE.constants().css().backgroundColorDialog();
getContentWrapper().getElement().getStyle().setBackgroundColor(m_normalColor);
}
}
/**
* Adds a upload drop zone to the given element.<p>
*
* @param element the element to add the upload zone
* @param dialog this dialog
*/
private native void addUploadZone(JavaScriptObject element, CmsUploadDialogFormDataImpl dialog)/*-{
function dragover(event) {
event.stopPropagation();
event.preventDefault();
element.style.backgroundColor = dialog.@org.opencms.ade.upload.client.ui.CmsUploadDialogFormDataImpl::m_hightLightColor;
}
function dragleave(event) {
event.stopPropagation();
event.preventDefault();
element.style.backgroundColor = dialog.@org.opencms.ade.upload.client.ui.CmsUploadDialogFormDataImpl::m_normalColor;
}
function drop(event) {
event.preventDefault();
var dt = event.dataTransfer;
var files = dt.files;
element.style.backgroundColor = dialog.@org.opencms.ade.upload.client.ui.CmsUploadDialogFormDataImpl::m_normalColor;
dialog.@org.opencms.ade.upload.client.ui.CmsUploadDialogFormDataImpl::addJsFiles(Lcom/google/gwt/core/client/JavaScriptObject;)(files);
}
element.addEventListener("dragover", dragover, false);
element.addEventListener("dragexit", dragleave, false);
element.addEventListener("dragleave", dragleave, false);
element.addEventListener("dragend", dragleave, false);
element.addEventListener("drop", drop, false);
}-*/;
/**
* Converts a JavaScriptObject to an JsArray.<p>
*
* @param files the array of files as JavaScriptObject
*
* @return a JsArray of CmsFileInfo objects
*/
private native JsArray<CmsFileInfo> getFiles(JavaScriptObject files) /*-{
return files;
}-*/;
/**
* Sends a post request to the upload JSP.<p>
*
* @param uploadUri the URI of the JSP that performs the upload
* @param targetFolderFieldName the field name for the target folder
* @param unzipFilesFieldName the field name for the file names to unzip
* @param targetFolder the target folder to upload
* @param filesToUpload the files to upload
* @param filesToUnzip the file names to unzip
* @param dialog this dialog
*/
private native void upload(
String uploadUri,
String targetFolder,
JsArray<CmsFileInfo> filesToUpload,
JavaScriptObject filesToUnzip,
CmsUploadDialogFormDataImpl dialog) /*-{
var data = new FormData();
for (i = 0; i < filesToUpload.length; i++) {
var fieldName = "file_" + i;
data.append(fieldName, filesToUpload[i]);
data
.append(
fieldName
+ @org.opencms.ade.upload.shared.I_CmsUploadConstants::UPLOAD_FILENAME_ENCODED_SUFFIX,
encodeURI(filesToUpload[i].name));
}
data
.append(
@org.opencms.ade.upload.shared.I_CmsUploadConstants::UPLOAD_TARGET_FOLDER_FIELD_NAME,
targetFolder);
for ( var i = 0; i < filesToUnzip.length; ++i) {
data
.append(
@org.opencms.ade.upload.shared.I_CmsUploadConstants::UPLOAD_UNZIP_FILES_FIELD_NAME,
encodeURI(filesToUnzip[i]));
}
var xhr = new XMLHttpRequest();
xhr.open("POST", uploadUri, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
dialog.@org.opencms.ade.upload.client.ui.CmsUploadDialogFormDataImpl::parseResponse(Ljava/lang/String;)(xhr.responseText);
} else {
dialog.@org.opencms.ade.upload.client.ui.CmsUploadDialogFormDataImpl::showErrorReport(Ljava/lang/String;Ljava/lang/String;)(xhr.statusText, null);
}
}
}
xhr.send(data);
}-*/;
}