package com.akjava.gwt.html5.client.file.ui; import com.akjava.gwt.html5.client.file.File; import com.akjava.gwt.html5.client.file.FileUtils; import com.akjava.gwt.html5.client.file.webkit.DirectoryCallback; import com.akjava.gwt.html5.client.file.webkit.FileEntry; import com.akjava.gwt.html5.client.file.webkit.FilePathCallback; import com.akjava.gwt.html5.client.file.webkit.Item; import com.google.gwt.core.client.JsArray; import com.google.gwt.event.dom.client.DragLeaveEvent; import com.google.gwt.event.dom.client.DragLeaveHandler; import com.google.gwt.event.dom.client.DragOverEvent; import com.google.gwt.event.dom.client.DragOverHandler; import com.google.gwt.event.dom.client.DropEvent; import com.google.gwt.event.dom.client.DropHandler; /** * TODO * how to know drop end? * @author aki * */ public abstract class AbstractVerticalDropPanel extends DropVerticalPanelBase { public abstract void dropStart(); //public abstract void dropEnd(); public abstract void dropFile(File file,String parent); public AbstractVerticalDropPanel(){ this.addDropHandler(new DropHandler() { @Override public void onDrop(DropEvent event) { event.preventDefault(); dropStart(); final JsArray<Item> items = FileUtils.transferToItem(event .getNativeEvent()); final FilePathCallback callback = new FilePathCallback() { @Override public void callback(File file, String parent) { if(file!=null){ dropFile(file,parent); } } }; for(int i=0;i<items.length();i++){ FileEntry entry = items.get(i).webkitGetAsEntry(); entryCallback(entry,callback,""); } } }); this.addDragOverHandler(new DragOverHandler() { @Override public void onDragOver(DragOverEvent event) { event.preventDefault(); dragOver(); } }); this.addDragLeaveHandler(new DragLeaveHandler() { @Override public void onDragLeave(DragLeaveEvent event) { event.preventDefault(); dragLeave(); } }); } public abstract void dragLeave() ; public abstract void dragOver() ; private void entryCallback(final FileEntry entry,final FilePathCallback callback,String path){ if(entry==null){ return; } if (entry.isFile()) { entry.file(callback,path); } else if (entry.isDirectory()) { entry.getReader().readEntries( new DirectoryCallback() { @Override public void callback( JsArray<FileEntry> entries) { callback.callback(null, entry.getFullPath()); for (int j = 0; j < entries .length(); j++) { entryCallback(entries.get(j),callback,entry.getFullPath()); } } }); } } }