/*
* Copyright (C) 2000-2012 InfoChamp System Corporation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gk.ui.client.com.panel;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import jfreecode.gwt.event.client.bus.EventBusImpl;
import org.gk.ui.client.com.form.gkFileUploadField;
import org.gk.ui.client.com.form.gkMap;
import org.gk.ui.client.com.grid.gkListGridIC;
import org.gk.ui.client.com.i18n.Msg;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FormEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
import com.extjs.gxt.ui.client.widget.Layout;
import com.extjs.gxt.ui.client.widget.ProgressBar;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.FileUploadField;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.FormPanel.Encoding;
import com.extjs.gxt.ui.client.widget.form.FormPanel.Method;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.google.gwt.user.client.ui.HTML;
public class gkFileUploadPanel {
private Dialog myDialog;
private gkListGridIC listGrid;
private Button startUpload;
private List fileUploadList = Collections.EMPTY_LIST;
private String fileType;
private String fileDescript;
private String maxSize;
protected String beanName;
private gkFileUploadField field;
protected Listener<MessageBoxEvent> callback;
public interface Event {
public final static String SAVE = ".save";
public final static String GET_FILE_LIST = ".getFileList";
public final static String DOWNLOAD = ".download";
public final static String DELETE = ".delete";
}
public gkFileUploadPanel(gkFileUploadField field) {
this.field = field;
initJS(this);
beanName = field.getBeanName();
}
public void show() {
// 目前flash的版本有session無法取得問題 及關閉 window視窗時會有 Null Reference Exceptions in
// IE8 的問題
// 暫時先切到HTML版本使用
// if (checkSWF()) {
// // flash模式
// flashShow();
// } else {
// 傳統模式
normalShow();
// }
}
/**
* 傳統上傳顯示視窗
*/
private void normalShow() {
myDialog = createDialog(300, 120, new FitLayout());
final FormPanel formPanel = new FormPanel();
formPanel.setHeaderVisible(false);
String filePath = "";
if (((String) field.getValue()).indexOf("..") == -1)
filePath = (String) field.getValue();
formPanel.setAction("event/multipart/eventBus/"
+ (beanName + Event.SAVE) + EventBusImpl.go + "?fileId="
+ filePath);
formPanel.setEncoding(Encoding.MULTIPART);
formPanel.setMethod(Method.POST);
final HTML uploadStatus = new HTML();
formPanel.addListener(Events.Submit, new Listener<FormEvent>() {
@Override
public void handleEvent(FormEvent be) {
startUpload.setEnabled(false);
if (be.getResultHtml() == null
|| be.getResultHtml().trim().equals("")) {
uploadStatus.setHTML("<font color=red>"
+ Msg.get.uploadError() + "</font>");
} else {
uploadCompleted("");
}
}
});
HorizontalPanel hp = new HorizontalPanel();
HorizontalPanel hp_Msg = new HorizontalPanel();
final FileUploadField fileUpload = new FileUploadField();
fileUpload.getMessages().setBrowseText(Msg.get.pickup());
fileUpload.setName("name");
// 開始上傳按鈕
startUpload = new Button(Msg.get.startUpload());
startUpload.setEnabled(false);
startUpload.addSelectionListener(new SelectionListener<ButtonEvent>() {
@Override
public void componentSelected(ButtonEvent ce) {
fileUpload.setReadOnly(false);
formPanel.submit();
};
});
fileUpload.addListener(Events.OnChange, new Listener<ComponentEvent>() {
@Override
public void handleEvent(ComponentEvent be) {
// Because the upload path will html5 specification is based on
// the path to security X:\\fakePath\\aaaa.gul,
// So just to display only the filename
String path = fileUpload.getValue();
path = path.substring(path.lastIndexOf("\\") + 1, path.length());
fileUpload.setValue(path);
startUpload.setEnabled(true);
}
});
hp.add(fileUpload);
hp.add(startUpload);
hp_Msg.add(uploadStatus);
formPanel.add(hp);
formPanel.add(hp_Msg);
myDialog.add(formPanel);
myDialog.show();
}
private Dialog createDialog(int width, int height, Layout layout) {
Dialog dialog = new Dialog() {
@Override
protected void onButtonPressed(Button button) {
super.onButtonPressed(button);
removeFromParent();
}
};
dialog.setBodyBorder(false);
dialog.setWidth(width);
dialog.setHeight(height);
dialog.setLayout(layout);
dialog.setModal(true);
dialog.setHideOnButtonClick(true);
dialog.getButtonById(Dialog.OK).setText(Msg.get.exit());
return dialog;
}
private ColumnConfig createColumnConfig(String id, String name, int width) {
ColumnConfig cc = new ColumnConfig(id, name, width);
cc.setSortable(false);
cc.setMenuDisabled(true);
return cc;
}
private GridCellRenderer createProgressRenderer() {
GridCellRenderer progressRenderer = new GridCellRenderer() {
@Override
public Object render(ModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore store, Grid grid) {
ProgressBar pb2 = new ProgressBar();
return pb2;
}
};
return progressRenderer;
}
// 檔案加入list
public void addItem(String id, String name, String size) {
gkMap m = new gkMap();
m.put("filename", name);
m.put("filesize", getSize(size));
m.put("process", "false");
m.put("id", id);
m.put("cancelId", id);
myDialog.getButtonById(Dialog.OK).setEnabled(false);
startUpload.setEnabled(true);
listGrid.getListItem().add(m);
listGrid.getGrid().getStore().add(m);
}
// queue結束時..控制ui
public void queueDone() {
startUpload.setEnabled(false);
myDialog.getButtonById(Dialog.OK).setEnabled(true);
}
// progressbar的更新
public void updateProgressBar(String id, String bytescomplete,
String totalbytes) {
int index = 0;
List list = (List) listGrid.getInfo();
for (int i = 0; i < list.size(); i++) {
Map data = (Map) list.get(i);
if (data.get("id").equals(id)) {
index = i;
break;
}
}
Double total = Double.valueOf(bytescomplete)
/ Double.valueOf(totalbytes);
((ProgressBar) listGrid.getGrid().getView().getWidget(index, 2))
.updateProgress(total, Math.round(100 * total) + "%");
if (total > 0.0 && total < 1.0) { // 上傳過程中
startUpload.setEnabled(false);
setButtonUI(index, 3, false);
setButtonUI(index, 4, true);
} else { // 上傳未開始或完成
((Map) ((List) listGrid.getInfo()).get(index)).put("process",
"true");
setButtonUI(index, 3, true);
setButtonUI(index, 4, false);
}
}
public void uploadCompleted(String id) {
field.loadFileList();
}
private void setButtonUI(int rowIndex, int colIndex, boolean enable) {
((Button) listGrid.getGrid().getView().getWidget(rowIndex, colIndex))
.setEnabled(enable);
}
// 取得單位為kb的檔案大小
private String getSize(String size) {
return Integer.parseInt(size) / 1000.0 + "";
}
private static native void initJS(gkFileUploadPanel hg)/*-{
$wnd.addItem = function(id, name, size) {
hg.@org.gk.ui.client.com.panel.gkFileUploadPanel::addItem(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(id, name, size);
}
$wnd.updateProgressBar = function(id, bytescomplete, totalbytes) {
hg.@org.gk.ui.client.com.panel.gkFileUploadPanel::updateProgressBar(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)(id, bytescomplete, totalbytes);
}
$wnd.queueDone = function(name, size) {
hg.@org.gk.ui.client.com.panel.gkFileUploadPanel::queueDone()();
}
$wnd.uploadCompleted = function(id) {
hg.@org.gk.ui.client.com.panel.gkFileUploadPanel::uploadCompleted(Ljava/lang/String;)(id);
}
}-*/;
/**
* 檢查是否安裝Flash
*/
private native boolean checkSWF()/*-{
try {
//IE_Flash
var ie_swf = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
return (ie_swf) ? true : false;
} catch (e) {
try {
//FF_or_Chrome_Flash()
var ff_swf = navigator.plugins["Shockwave Flash"];
return (ff_swf) ? true : false;
} catch (e) {
return false;
}
}
}-*/;
}