/* * Copyright 2010 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; import gwtupload.client.IFileInput.FileInputType; import gwtupload.client.IUploadStatus.Status; import java.util.ArrayList; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.uibinder.client.UiChild; import com.google.gwt.uibinder.client.UiConstructor; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.FormPanel; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.HasText; import com.google.gwt.user.client.ui.Hidden; import com.google.gwt.user.client.ui.Widget; /** * <p> * Implementation of a single uploader panel with a submit button. * </p> * * @author Manolo Carrasco Moñino * * <p> * When the user selects a file, the button changes its style * so the she could realize that she has to push the button. * </p> * */ public class SingleUploader extends Uploader { protected Widget button; private void setEnabledButton(boolean b) { if (button != null) { // HasEnabled is only available after gwt-2.1.x if (button instanceof HasEnabled) { ((HasEnabled)button).setEnabled(b); } else if (button instanceof Button) { ((Button)button).setEnabled(b); } } } /** * Default constructor. * Uses the standard browser input, a basic status widget, and * creates a standard button to send the file * */ public SingleUploader() { this(FileInputType.BROWSER_INPUT); } /** * Use a basic status widget, and creates * a standard button to send the file * * @param type * file input to use */ @UiConstructor public SingleUploader(FileInputType type) { this(type, null); } /** * Creates a standard button to send the file * * @param type * file input to use * @param status * Customized status widget to use */ public SingleUploader(FileInputType type, IUploadStatus status) { this(type, status, new Button()); } /** * Constructor * * @param type * file input to use * @param status * Customized status widget to use * @param submitButton * Customized button which submits the form */ public SingleUploader(FileInputType type, IUploadStatus status, Widget submitButton) { this(type, status, submitButton, null); } /** * This constructor allows to use an existing form panel. * * @param type * file input to use * @param status * Customized status widget to use * @param submitButton * Customized button which submits the form * @param form * Customized form panel */ public SingleUploader(FileInputType type, IUploadStatus status, Widget submitButton, FormPanel form) { super(type, form); final Uploader thisInstance = this; if (status == null) { status = new BaseUploadStatus(); } super.setStatusWidget(status); this.button = submitButton; if (submitButton != null) { submitButton.addStyleName("submit"); if (submitButton instanceof HasClickHandlers) { ((HasClickHandlers)submitButton).addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { thisInstance.submit(); } }); } if (submitButton instanceof HasText) { ((HasText)submitButton).setText(I18N_CONSTANTS.uploaderSend()); } // The user could have attached the button anywhere in the page. if (!submitButton.isAttached()) { super.add(submitButton); } } } /** * Uses the standard browser input, customized status, and creates a * standard button to send the file * * @param status * Customized status widget to use */ public SingleUploader(IUploadStatus status) { this(FileInputType.BROWSER_INPUT, status); } /** * * @param status * Customized status widget to use * @param submitButton * Customized button which submits the form */ public SingleUploader(IUploadStatus status, Widget submitButton) { this(FileInputType.BROWSER_INPUT, status, submitButton, null); } @Override public void setEnabled(boolean b) { super.setEnabled(b); setEnabledButton(b); } /* (non-Javadoc) * @see gwtupload.client.Uploader#setI18Constants(gwtupload.client.IUploader.UploaderConstants) */ @Override public void setI18Constants(UploaderConstants strs) { super.setI18Constants(strs); if (button != null && button instanceof HasText) { ((HasText)button).setText(strs.uploaderSend()); } } /* (non-Javadoc) * @see gwtupload.client.Uploader#onChangeInput() */ @Override protected void onChangeInput() { super.onChangeInput(); if (button != null) { button.addStyleName("changed"); if (button instanceof Focusable) { ((Focusable)button).setFocus(true); } } } ArrayList<Widget> formWidgets = new ArrayList<Widget>(); public void add(Widget w) { formWidgets.add(w); super.add(w); } public void add(Widget w, int index) { formWidgets.add(w); super.add(w, index); } public void clear() { for (Widget w : formWidgets) { w.removeFromParent(); } formWidgets.clear(); } /* (non-Javadoc) * @see gwtupload.client.Uploader#onFinishUpload() */ @Override protected void onFinishUpload() { super.onFinishUpload(); if (getStatus() == Status.REPEATED) { getStatusWidget().setError(getI18NConstants().uploaderAlreadyDone()); } getStatusWidget().setStatus(Status.UNINITIALIZED); reuse(); assignNewNameToFileInput(); for (Widget i : formWidgets) { if (i instanceof Hidden) { Hidden h = (Hidden)i; if (h.getValue().startsWith(fileInputPrefix)) { h.setValue(getInputName()); } } } getFileInput().asWidget().setVisible(true); if (button != null) { setEnabledButton(true); button.removeStyleName("changed"); if (!autoSubmit) { button.setVisible(true); } } if (autoSubmit) { getFileInput().setText(i18nStrs.uploaderBrowse()); } } /* (non-Javadoc) * @see gwtupload.client.Uploader#onStartUpload() */ @Override protected void onStartUpload() { super.onStartUpload(); if (button != null) { setEnabledButton(false); button.removeStyleName("changed"); button.setVisible(false); } getFileInput().asWidget().setVisible(false); } public void setAvoidRepeatFiles(boolean b){ this.avoidRepeatFiles(b); } /* (non-Javadoc) * @see gwtupload.client.Uploader#setAutoSubmit(boolean) */ @Override public void setAutoSubmit(boolean b) { if (button != null) { button.setVisible(!b); } super.setAutoSubmit(b); } /** * Add a customized Upload bar, used in Uibinder. */ @UiChild(limit = 1, tagname = "statusBar") public void addStatusBar(IUploadStatus status) { this.setStatusWidget((IUploadStatus) status); } /** * Add any html button created with Uibinder. * The content has to implement the interface HasClickHandlers */ @UiChild(limit = 1, tagname = "button") public void addButton(Widget button) { this.setFileInput(IFileInput.FileInputType.CUSTOM.with(button).getInstance()); } }