package org.aplikator.client.local.widgets.fileupload; import org.gwtbootstrap3.client.ui.Icon; import org.gwtbootstrap3.client.ui.constants.ButtonType; import org.gwtbootstrap3.client.ui.constants.IconType; import org.gwtbootstrap3.client.ui.constants.Styles; import org.gwtbootstrap3.client.ui.html.Span; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.logical.shared.HasValueChangeHandlers; 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.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FileUpload; /* * Copied from https://groups.google.com/forum/#!msg/gwtbootstrap3/3Yd5fxfEHYA/RF2CpbwToXsJ * USAGE FileInputButton one = new FileInputButton(ButtonType.PRIMARY, false); one.setText("Select ONE"); one.setIcon(IconType.UPLOAD); FileInputButton two = new FileInputButton(ButtonType.DANGER, true); two.setIcon(IconType.PLUS); two.setText("Select MANY"); InputGroup ig = new InputGroup(); final TextBox tb = new TextBox(); tb.setEnabled(false); FileInputButton three = new FileInputButton(ButtonType.DEFAULT, false); three.setText("Browse..."); three.addValueChangeHandler(new ValueChangeHandler<JsArray<UploadFile>>() { @Override public void onValueChange(ValueChangeEvent<JsArray<UploadFile>> event) { tb.setText(""); if( event.getValue() != null && event.getValue().length() > 0 ){ tb.setText(event.getValue().get(0).getName()); } } }); ig.add(new FileInputGroupButton(three)); ig.add(tb); RootPanel.get().add(one); RootPanel.get().add(two); RootPanel.get().add(ig); */ public class FileInputButton extends Composite implements HasValueChangeHandlers<JsArray<UploadFile>> { public interface FileInputButtonResources extends ClientBundle { public static final FileInputButtonResources INSTANCE = GWT.create(FileInputButtonResources.class); @Source("FileInputButton.css") public FileInputButtonCss css(); } public interface FileInputButtonCss extends CssResource { @ClassName("btn-file") public String btnFile(); } static { FileInputButtonResources.INSTANCE.css().ensureInjected(); } private Span wrapper; private Span textSpan; private FileUpload upload; private Icon icon; public FileInputButton(boolean isMultiple) { this(null, isMultiple); } public FileInputButton(ButtonType additionalStyle, boolean isMultiple) { wrapper = new Span(); wrapper.addStyleName(Styles.BTN); if (additionalStyle != null) { wrapper.addStyleName(additionalStyle.getCssName()); } //wrapper.addStyleName("btn-file"); wrapper.addStyleName(FileInputButtonResources.INSTANCE.css().btnFile()); initWidget(wrapper); upload = new FileUpload(); if (isMultiple) { upload.getElement().setPropertyBoolean("multiple", true); } upload.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { fireChanged(); } }); wrapper.add(upload); } public void setText(String text) { if (textSpan == null) { textSpan = new Span(text); wrapper.add(textSpan); } else { textSpan.setText(text); } } public void setIcon(IconType type) { if (icon == null) { icon = new Icon(type); wrapper.add(icon); } else { icon.setType(type); } } private void fireChanged() { ValueChangeEvent.fire(this, getFiles(upload.getElement())); } private native JsArray<UploadFile> getFiles(Element el) /*-{ if (el.files) { return el.files; } else { return null; } }-*/; @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler<JsArray<UploadFile>> handler) { return super.addHandler(handler, ValueChangeEvent.getType()); } }