package com.gwt.ui.client.gwtupld; import java.util.ArrayList; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.EventTarget; import com.google.gwt.dom.client.Style; import com.google.gwt.dom.client.TableCellElement; import com.google.gwt.dom.client.TableElement; import com.google.gwt.dom.client.TableRowElement; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.gwt.ui.client.gwtupld.events.UploadingCompletedEvent; import com.gwt.ui.client.gwtupld.events.UploadingCompletedEventHandler; public class FileUploaderBasic extends FileUploader implements UploadingCompletedEventHandler { interface Binder extends UiBinder<DivElement, FileUploaderBasic> { } private static Binder binder = GWT.create(Binder.class); private List<String> UrlList = new ArrayList<String>(); @UiField MyCss style; interface MyCss extends CssResource { String progressBar(); String dropzone(); String dropzoneHover(); String data(); } @UiField TableElement table; @UiField DivElement dropZoneAndButtonContainer; @UiField DivElement totalProgress; public FileUploaderBasic(Options options) { super(options); setElement(binder.createAndBindUi(this)); initialize(); addUploadingCompletedEventHandler(this); } @Override public void updateView(List<FileInfo> files) { fileInfos.clear(); while (table.getRows().getLength() > 0) { table.getRows().getItem(0).removeFromParent(); } initAddFileInfos(files); } @Override public void onCancel(String id, String filename) { // TODO mark item as cancelled in the list and delete it from server } @Override protected void onDropEvent() { getDropZone().removeClassName(style.dropzoneHover()); } @Override protected void onDragLeaveEvent() { getDropZone().removeClassName(style.dropzoneHover()); } @Override protected void onDragEnterEvent() { getDropZone().addClassName(style.dropzoneHover()); } @Override protected Element getDropZone() { return dropZoneAndButtonContainer; } @Override protected void updateExactFileInfo(String justAddedId) { if (filesDueToUpload() > 0) { totalProgress.setInnerHTML("Uploaded " + filesUploaded() + " of " + filesDueToUpload() + ", total progress is " + totalProgress() + "%"); } int index = -1; for (int i = 0; i < table.getRows().getLength(); i++) { final TableRowElement item = table.getRows().getItem(i); if (item.getCells() != null && item.getCells().getLength() > 0) { if (item.getCells().getItem(0).getInnerHTML().equals(justAddedId)) { index = i; break; } } } updateFileInfo(index, fileInfos.get(justAddedId)); } private void updateFileInfo(int index, final FileInfo fileInfo) { int idx = table.getRows().getLength(); final TableRowElement row; final TableCellElement fileNameCell; final TableCellElement progressCell; if (index != -1) { idx = index; row = table.getRows().getItem(idx); fileNameCell = row.getCells().getItem(1); progressCell = row.getCells().getItem(2); progressCell.setClassName(style.progressBar()); } else { // create new row row = table.insertRow(idx); row.insertCell(0).getStyle().setDisplay(Style.Display.NONE); row.getCells().getItem(0).setInnerHTML(fileInfo.getId()); fileNameCell = row.insertCell(1); // progress bar cell row.insertCell(2); // TODO: cancelling works for XHR uploads, to be tested for iframe // insertCancelButton(fileInfo, row); progressCell = row.getCells().getItem(2); final DivElement progressBar = Document.get().createDivElement(); progressCell.appendChild(progressBar); } String fileinfo = fileInfo.getName(); if (fileInfo.getUrl() != null && !fileInfo.getUrl().isEmpty()) { fileinfo = "<a target=\"_blank\" href=\"" + fileInfo.getUrl() + "\">" + fileInfo.getName() + "</a>"; UrlList.add(fileInfo.getUrl()); } String size = formatSize(fileInfo.getTotal()); if (!size.isEmpty()) { size = ", " + size; } fileNameCell.setInnerHTML(fileinfo + size); updateProgressBar(fileInfo, progressCell); } private void insertCancelButton(final FileInfo fileInfo, TableRowElement row) { final TableCellElement cc = row.insertCell(row.getCells().getLength()); cc.setInnerHTML("cancel"); cc.getStyle().setTextDecoration(Style.TextDecoration.UNDERLINE); cc.getStyle().setCursor(Style.Cursor.POINTER); addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { final EventTarget et = event.getNativeEvent().getEventTarget(); final Element el = Element.as(et); if (el == cc) { uploadHandler._cancel(fileInfo.getId()); } } }, ClickEvent.getType()); } private void updateProgressBar(FileInfo fileInfo, TableCellElement cell) { final DivElement div = (DivElement)cell.getElementsByTagName("div").getItem(0); if (fileInfo.uploadingWasStartedAndHasNotFinished()) { div.setInnerText(String.valueOf(fileInfo.getPercentageReady()) + "%"); div.getStyle().setWidth(fileInfo.getPercentageReady(), Style.Unit.PCT); } else if (fileInfo.uploadingHasFinished()) { // this will skip inserting messages.ready() // when doing initial updateView if (!div.getInnerText().isEmpty()) { div.setInnerText("ready"); div.getStyle().setWidth(100, Style.Unit.PCT); } } else { div.setInnerText(fileInfo.getError() == null ? "uploading" : fileInfo.getError()); div.getStyle().setWidth(100, Style.Unit.PCT); } } @Override public void onUploadingCompleted(UploadingCompletedEvent event) { GWT.log("uploading completed"); } /** * @return the urlList */ public List<String> getUrlList() { return UrlList; } }