/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

  1. /*
  2. * Copyright 2007 Future Earth, info@future-earth.eu
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package eu.future.earth.gwt.client.file;
  17. import org.cobogw.gwt.user.client.CSS;
  18. import com.google.gwt.core.client.GWT;
  19. import com.google.gwt.event.dom.client.ClickEvent;
  20. import com.google.gwt.event.dom.client.ClickHandler;
  21. import com.google.gwt.event.shared.HandlerRegistration;
  22. import com.google.gwt.user.client.Element;
  23. import com.google.gwt.user.client.Timer;
  24. import com.google.gwt.user.client.ui.Anchor;
  25. import com.google.gwt.user.client.ui.CheckBox;
  26. import com.google.gwt.user.client.ui.FileUpload;
  27. import com.google.gwt.user.client.ui.HTML;
  28. import com.google.gwt.user.client.ui.HorizontalPanel;
  29. import com.google.gwt.user.client.ui.SimplePanel;
  30. import eu.future.earth.gwt.client.events.FileEvent;
  31. import eu.future.earth.gwt.client.events.FileEventListener;
  32. import eu.future.earth.gwt.client.events.FileUploadAction;
  33. import eu.future.earth.gwt.client.events.HasFileEventHandlers;
  34. public class FilePanel extends HorizontalPanel implements ClickHandler, HasFileEventHandlers {
  35. private FileText texts = (FileText) GWT.create(FileText.class);
  36. private SimplePanel holder = new SimplePanel();
  37. private FileUpload fileField = new FileUpload();
  38. private int maxDetectionDelay = 3000;
  39. private Anchor addAction = new Anchor(texts.add());
  40. private Anchor remove = new Anchor(texts.remove());
  41. private CheckBox checkBoxForSave = new CheckBox();
  42. private HTML info = new HTML();
  43. private FileHolderHandler handler = null;
  44. private HandlerRegistration addListener = null;
  45. public FilePanel(FileHolderHandler newhandler) {
  46. super();
  47. handler = newhandler;
  48. super.setSpacing(0);
  49. super.add(checkBoxForSave);
  50. super.add(holder);
  51. holder.add(fileField);
  52. super.add(info);
  53. super.add(addAction);
  54. super.add(remove);
  55. addListener = addAction.addClickHandler(this);
  56. remove.addClickHandler(this);
  57. checkBoxForSave.addClickHandler(this);
  58. checkBoxForSave.setVisible(false);
  59. remove.setVisible(false);
  60. info.setVisible(false);
  61. fileField.setVisible(false);
  62. checkBoxForSave.setValue(true);
  63. CSS.setProperty(checkBoxForSave, CSS.A.MARGIN_RIGHT, "3px");
  64. CSS.setProperty(holder, CSS.A.MARGIN_RIGHT, "3px");
  65. CSS.setProperty(info, CSS.A.MARGIN_RIGHT, "3px");
  66. CSS.setProperty(info, CSS.A.MARGIN_RIGHT, "3px");
  67. }
  68. private String fieldname = null;
  69. public void setFieldName(String newName) {
  70. fieldname = newName;
  71. fileField.setName(fieldname);
  72. }
  73. private String url = null;
  74. private String fileName = null;
  75. public void setInfo(String newName, String newUrl) {
  76. fileName = newName;
  77. url = newUrl;
  78. setUploadState(uploadState);
  79. }
  80. private boolean uploadState = false;
  81. public boolean hasImageSelected() {
  82. return fileField.getFilename() != null && fileField.getFilename().length() > 0;
  83. }
  84. public String getFileName() {
  85. if (fileName == null) {
  86. return fileField.getFilename();
  87. } else {
  88. return fileName;
  89. }
  90. }
  91. public void resetPanel() {
  92. if (hasImageSelected()) {
  93. holder.remove(fileField);
  94. fileField = new FileUpload();
  95. fileField.setName(fieldname);
  96. holder.setWidget(fileField);
  97. fileField.setVisible(false);
  98. }
  99. }
  100. public void setAddActionVisible(boolean newState) {
  101. addAction.setVisible(newState);
  102. }
  103. public void setSaveVisible(boolean newState) {
  104. if (handler.showViewLink()) {
  105. checkBoxForSave.setVisible(newState);
  106. } else {
  107. checkBoxForSave.setVisible(false);
  108. }
  109. }
  110. public void setRemoveVisible(boolean newState) {
  111. remove.setVisible(newState);
  112. }
  113. public void setUploadState(boolean newState) {
  114. uploadState = newState;
  115. remove.setVisible(!newState);
  116. if (handler.showViewLink()) {
  117. checkBoxForSave.setVisible(newState);
  118. } else {
  119. checkBoxForSave.setVisible(false);
  120. }
  121. if (newState) {
  122. info.setHTML("<a href='" + url + " ' >" + getFileName() + "</a>");
  123. } else {
  124. info.setText(getFileName());
  125. }
  126. if (handler.showViewLink()) {
  127. if (uploadState) {
  128. info.setVisible(true);
  129. } else {
  130. info.setVisible(false);
  131. }
  132. } else {
  133. info.setVisible(false);
  134. }
  135. }
  136. public void setSelectedForSave(boolean newState) {
  137. checkBoxForSave.setValue(newState);
  138. }
  139. public boolean isFileFieldVisible() {
  140. // Window.alert("Visible " + fileField.isVisible());
  141. return fileField.isVisible();
  142. }
  143. /**
  144. * Timer for that start after the click on determining if a file is present.
  145. */
  146. private Timer filePresentTimer = null;
  147. private void selectFileAction() {
  148. // image.se
  149. if (getBrowserType().indexOf("ie") > -1) {
  150. jsClickUpload(fileField.getElement());
  151. } else {
  152. addAction.setVisible(false);
  153. fileField.setVisible(true);
  154. }
  155. filePresentTimer = new Timer() {
  156. public void run() {
  157. if (hasImageSelected()) {
  158. fireFileSelectedEvent();
  159. }
  160. }
  161. };
  162. filePresentTimer.scheduleRepeating(maxDetectionDelay);
  163. }
  164. private void fireFileSelectedEvent() {
  165. fileField.setVisible(false);
  166. addAction.setVisible(false);
  167. // addListener.removeHandler();
  168. remove.setVisible(true);
  169. info.setText(getFileName());
  170. if (handler.showViewLink()) {
  171. info.setVisible(true);
  172. }
  173. filePresentTimer.cancel();
  174. FileEvent.fire(this, FileUploadAction.FILE_SELECTED);
  175. }
  176. public void onClick(ClickEvent widget) {
  177. if (widget.getSource() == addAction) {
  178. selectFileAction();
  179. }
  180. if (widget.getSource() == remove) {
  181. FileEvent.fire(this, FileUploadAction.FILE_REMOVED);
  182. }
  183. if (widget.getSource() == checkBoxForSave) {
  184. FileEvent.fire(this, FileUploadAction.FILE_SELECTION_CHANGE);
  185. }
  186. }
  187. public boolean shouldSave() {
  188. return checkBoxForSave.getValue();
  189. }
  190. private native String getBrowserType() /*-{
  191. var ua = navigator.userAgent.toLowerCase();
  192. if (ua.indexOf("opera") != -1) {
  193. return "opera";
  194. }
  195. else if (ua.indexOf("webkit") != -1) {
  196. return "safari";
  197. }
  198. else if ((ua.indexOf("msie 6.0") != -1) ||
  199. (ua.indexOf("msie 7.0") != -1)) {
  200. return "ie6";
  201. }
  202. else if (ua.indexOf("gecko") != -1) {
  203. var result = /rv:([0-9]+)\.([0-9]+)/.exec(ua);
  204. if (result && result.length == 3) {
  205. var version = (parseInt(result[1]) * 10) +
  206. parseInt(result[2]);
  207. if (version >= 18)
  208. return "gecko1_8";
  209. }
  210. return "gecko";
  211. }
  212. return "unknown";
  213. }-*/;
  214. native void jsClickUpload(Element pElement) /*-{
  215. pElement.click();
  216. }-*/;
  217. @Override
  218. public HandlerRegistration addFileEventHandler(FileEventListener handler) {
  219. return addHandler(handler, FileEvent.getType());
  220. }
  221. }