/ftr-gwt-library-file/src/main/java/eu/future/earth/gwt/client/file/FilePanel.java
http://ftr-gwt-library.googlecode.com/ · Java · 264 lines · 177 code · 43 blank · 44 comment · 26 complexity · aa85bddc7599ba922f8c74e4fd9d7c03 MD5 · raw file
- /*
- * Copyright 2007 Future Earth, info@future-earth.eu
- *
- * 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 eu.future.earth.gwt.client.file;
- import org.cobogw.gwt.user.client.CSS;
- import com.google.gwt.core.client.GWT;
- import com.google.gwt.event.dom.client.ClickEvent;
- import com.google.gwt.event.dom.client.ClickHandler;
- import com.google.gwt.event.shared.HandlerRegistration;
- import com.google.gwt.user.client.Element;
- import com.google.gwt.user.client.Timer;
- import com.google.gwt.user.client.ui.Anchor;
- import com.google.gwt.user.client.ui.CheckBox;
- import com.google.gwt.user.client.ui.FileUpload;
- import com.google.gwt.user.client.ui.HTML;
- import com.google.gwt.user.client.ui.HorizontalPanel;
- import com.google.gwt.user.client.ui.SimplePanel;
- import eu.future.earth.gwt.client.events.FileEvent;
- import eu.future.earth.gwt.client.events.FileEventListener;
- import eu.future.earth.gwt.client.events.FileUploadAction;
- import eu.future.earth.gwt.client.events.HasFileEventHandlers;
- public class FilePanel extends HorizontalPanel implements ClickHandler, HasFileEventHandlers {
- private FileText texts = (FileText) GWT.create(FileText.class);
- private SimplePanel holder = new SimplePanel();
- private FileUpload fileField = new FileUpload();
- private int maxDetectionDelay = 3000;
- private Anchor addAction = new Anchor(texts.add());
- private Anchor remove = new Anchor(texts.remove());
- private CheckBox checkBoxForSave = new CheckBox();
- private HTML info = new HTML();
- private FileHolderHandler handler = null;
- private HandlerRegistration addListener = null;
- public FilePanel(FileHolderHandler newhandler) {
- super();
- handler = newhandler;
- super.setSpacing(0);
- super.add(checkBoxForSave);
- super.add(holder);
- holder.add(fileField);
- super.add(info);
- super.add(addAction);
- super.add(remove);
- addListener = addAction.addClickHandler(this);
- remove.addClickHandler(this);
- checkBoxForSave.addClickHandler(this);
- checkBoxForSave.setVisible(false);
- remove.setVisible(false);
- info.setVisible(false);
- fileField.setVisible(false);
- checkBoxForSave.setValue(true);
- CSS.setProperty(checkBoxForSave, CSS.A.MARGIN_RIGHT, "3px");
- CSS.setProperty(holder, CSS.A.MARGIN_RIGHT, "3px");
- CSS.setProperty(info, CSS.A.MARGIN_RIGHT, "3px");
- CSS.setProperty(info, CSS.A.MARGIN_RIGHT, "3px");
- }
- private String fieldname = null;
- public void setFieldName(String newName) {
- fieldname = newName;
- fileField.setName(fieldname);
- }
- private String url = null;
- private String fileName = null;
- public void setInfo(String newName, String newUrl) {
- fileName = newName;
- url = newUrl;
- setUploadState(uploadState);
- }
- private boolean uploadState = false;
- public boolean hasImageSelected() {
- return fileField.getFilename() != null && fileField.getFilename().length() > 0;
- }
- public String getFileName() {
- if (fileName == null) {
- return fileField.getFilename();
- } else {
- return fileName;
- }
- }
- public void resetPanel() {
- if (hasImageSelected()) {
- holder.remove(fileField);
- fileField = new FileUpload();
- fileField.setName(fieldname);
- holder.setWidget(fileField);
- fileField.setVisible(false);
- }
- }
- public void setAddActionVisible(boolean newState) {
- addAction.setVisible(newState);
- }
- public void setSaveVisible(boolean newState) {
- if (handler.showViewLink()) {
- checkBoxForSave.setVisible(newState);
- } else {
- checkBoxForSave.setVisible(false);
- }
- }
- public void setRemoveVisible(boolean newState) {
- remove.setVisible(newState);
- }
- public void setUploadState(boolean newState) {
- uploadState = newState;
- remove.setVisible(!newState);
- if (handler.showViewLink()) {
- checkBoxForSave.setVisible(newState);
- } else {
- checkBoxForSave.setVisible(false);
- }
- if (newState) {
- info.setHTML("<a href='" + url + " ' >" + getFileName() + "</a>");
- } else {
- info.setText(getFileName());
- }
- if (handler.showViewLink()) {
- if (uploadState) {
- info.setVisible(true);
- } else {
- info.setVisible(false);
- }
- } else {
- info.setVisible(false);
- }
- }
- public void setSelectedForSave(boolean newState) {
- checkBoxForSave.setValue(newState);
- }
- public boolean isFileFieldVisible() {
- // Window.alert("Visible " + fileField.isVisible());
- return fileField.isVisible();
- }
- /**
- * Timer for that start after the click on determining if a file is present.
- */
- private Timer filePresentTimer = null;
- private void selectFileAction() {
- // image.se
- if (getBrowserType().indexOf("ie") > -1) {
- jsClickUpload(fileField.getElement());
- } else {
- addAction.setVisible(false);
- fileField.setVisible(true);
- }
- filePresentTimer = new Timer() {
- public void run() {
- if (hasImageSelected()) {
- fireFileSelectedEvent();
- }
- }
- };
- filePresentTimer.scheduleRepeating(maxDetectionDelay);
- }
- private void fireFileSelectedEvent() {
- fileField.setVisible(false);
- addAction.setVisible(false);
- // addListener.removeHandler();
- remove.setVisible(true);
- info.setText(getFileName());
- if (handler.showViewLink()) {
- info.setVisible(true);
- }
- filePresentTimer.cancel();
- FileEvent.fire(this, FileUploadAction.FILE_SELECTED);
- }
- public void onClick(ClickEvent widget) {
- if (widget.getSource() == addAction) {
- selectFileAction();
- }
- if (widget.getSource() == remove) {
- FileEvent.fire(this, FileUploadAction.FILE_REMOVED);
- }
- if (widget.getSource() == checkBoxForSave) {
- FileEvent.fire(this, FileUploadAction.FILE_SELECTION_CHANGE);
- }
- }
- public boolean shouldSave() {
- return checkBoxForSave.getValue();
- }
- private native String getBrowserType() /*-{
- var ua = navigator.userAgent.toLowerCase();
- if (ua.indexOf("opera") != -1) {
- return "opera";
- }
- else if (ua.indexOf("webkit") != -1) {
- return "safari";
- }
- else if ((ua.indexOf("msie 6.0") != -1) ||
- (ua.indexOf("msie 7.0") != -1)) {
- return "ie6";
- }
- else if (ua.indexOf("gecko") != -1) {
- var result = /rv:([0-9]+)\.([0-9]+)/.exec(ua);
- if (result && result.length == 3) {
- var version = (parseInt(result[1]) * 10) +
- parseInt(result[2]);
- if (version >= 18)
- return "gecko1_8";
- }
- return "gecko";
- }
- return "unknown";
- }-*/;
- native void jsClickUpload(Element pElement) /*-{
- pElement.click();
- }-*/;
- @Override
- public HandlerRegistration addFileEventHandler(FileEventListener handler) {
- return addHandler(handler, FileEvent.getType());
- }
- }