/* * Copyright 2014 Manuel Carrasco Moñino. (manolo at apache/org) * http://code.google.com/p/gwtupload * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package gwtupload.client.dnd; import com.google.gwt.dom.client.Document; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.HasAllDragAndDropHandlers; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import java.util.List; import gwtupload.client.FileList; import gwtupload.client.IFileInput; import gwtupload.client.Uploader; /** * @author Sultan Tezadov * @author Manolo Carrasco Moñino */ public class DropZoneFileInput extends Label implements HasAllDragAndDropHandlers, IFileInput, IDragAndDropFileInput { boolean i18n = true; private HasAllDragAndDropHandlers externalDropZoneWidget; private DragAndDropFilesProvider dragAndDropFilesProvider; public static final String STYLE_DROP_ZONE = "upld-drop-zone"; public static final String STYLE_DROP_ZONE_SENDING = "upld-drop-zone-sending"; public static final String STYLE_DROP_ZONE_DISABLED = "upld-drop-zone-disabled"; private Widget dropZone; public DropZoneFileInput() { this(null, true); } public DropZoneFileInput(HasAllDragAndDropHandlers dropZoneWidget) { this(dropZoneWidget, true); } public DropZoneFileInput(HasAllDragAndDropHandlers dropZoneWidget, boolean i18n) { super(Document.get().createSpanElement()); this.i18n = i18n; if (dropZoneWidget == null) { if (i18n) { setText(Uploader.I18N_CONSTANTS.uploaderDrop()); } } init(dropZoneWidget, dropZoneWidget); } private void init(HasAllDragAndDropHandlers dropZoneWidget, HasAllDragAndDropHandlers externalDropZoneWidget) { if (dropZoneWidget == null) { dropZoneWidget = this; } this.externalDropZoneWidget = externalDropZoneWidget; dragAndDropFilesProvider = new DragAndDropFilesProvider(dropZoneWidget); dragAndDropFilesProvider.addValueChangeHandler(new ValueChangeHandler<FileList>() { public void onValueChange(ValueChangeEvent<FileList> event) { fireChangeEvent(); } }); dropZone = (Widget) dropZoneWidget; dropZone.addStyleName(STYLE_DROP_ZONE); } public boolean hasFiles() { return dragAndDropFilesProvider.thereAreDragAndDropedFiles(); } @Override public void reset() { dragAndDropFilesProvider.reset(); dropZone.removeStyleName(STYLE_DROP_ZONE_SENDING); } @Override public void lock() { dropZone.addStyleName(STYLE_DROP_ZONE_SENDING); dragAndDropFilesProvider.lock(); } public FileList getFiles() { return dragAndDropFilesProvider.getDragAndDropedFiles(); } public String getFilename() { return dragAndDropFilesProvider.getFilename(); } public List<String> getFilenames() { return dragAndDropFilesProvider.getFilenames(); } public String getName() { return dragAndDropFilesProvider.getName(); } public Widget getWidget() { return asWidget(); } public boolean isEnabled() { return dragAndDropFilesProvider.isEnabled(); } public IFileInput newInstance() { return new DropZoneFileInput(externalDropZoneWidget, true); } public void setEnabled(boolean b) { dragAndDropFilesProvider.setEnabled(b); } public void setLength(int length) { } public void setName(String fieldName) { dragAndDropFilesProvider.setName(fieldName); } public void setText(String text) { if (i18n) { super.setText(text); } } public void updateSize() { } public void enableMultiple(boolean b) { } public void setAccept(String accept) { } public HandlerRegistration addChangeHandler(ChangeHandler handler) { return addDomHandler(handler, ChangeEvent.getType()); } private void fireChangeEvent() { ChangeEvent.fireNativeEvent(Document.get().createChangeEvent(), this); } }