/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.web.data.store.panel;
import java.io.File;
import java.io.FileFilter;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.validation.FormComponentFeedbackBorder;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.validation.IValidator;
import org.geoserver.web.wicket.browser.GeoServerFileChooser;
/**
* A label, a text field, a file chooser
*
* @author Andrea Aime - GeoSolutions
*/
public class FileParamPanel extends Panel implements ParamPanel {
private static final long serialVersionUID = 2630421795437249103L;
TextField<String> textField;
ModalWindow dialog;
IModel<? extends FileFilter> fileFilter;
/**
*
* @param id
* @param paramsMap
* @param paramName
* @param paramLabelModel
* @param required
* @param validators
* any extra validator that should be added to the input field, or {@code null}
*/
@SafeVarargs
public FileParamPanel(final String id, final IModel<String> paramValue, final IModel<String> paramLabelModel,
final boolean required, IValidator<? super String>... validators) {
// make the value of the text field the model of this panel, for easy value retrieval
super(id, paramValue);
// add the dialog for the file chooser
add(dialog = new ModalWindow("dialog"));
// the label
String requiredMark = required ? " *" : "";
Label label = new Label("paramName", paramLabelModel.getObject() + requiredMark);
add(label);
// the text field, with a decorator for validations
textField = new TextField<String>("paramValue", new FileModel(paramValue));
textField.setRequired(required);
textField.setOutputMarkupId(true);
// set the label to be the paramLabelModel otherwise a validation error would look like
// "Parameter 'paramValue' is required"
textField.setLabel(paramLabelModel);
if (validators != null) {
for (IValidator<? super String> validator : validators) {
textField.add(validator);
}
}
FormComponentFeedbackBorder feedback = new FormComponentFeedbackBorder("border");
feedback.add(textField);
feedback.add(chooserButton(paramLabelModel.getObject()));
add(feedback);
}
protected Component chooserButton(final String windowTitle) {
AjaxSubmitLink link = new AjaxSubmitLink("chooser") {
private static final long serialVersionUID = -6640131658256808053L;
@Override
public boolean getDefaultFormProcessing() {
return false;
}
@Override
public void onSubmit(AjaxRequestTarget target, Form<?> form) {
File file = null;
textField.processInput();
String input = textField.getConvertedInput();
if (input != null && !input.equals("")) {
file = new File(input);
}
GeoServerFileChooser chooser = new GeoServerFileChooser(dialog.getContentId(), new Model<File>(file)) {
private static final long serialVersionUID = -7096642192491726498L;
protected void fileClicked(File file, AjaxRequestTarget target) {
// clear the raw input of the field won't show the new model value
textField.clearInput();
textField.setModelObject(file.getAbsolutePath());
target.add(textField);
dialog.close(target);
};
};
chooser.setFileTableHeight(null);
chooser.setFilter(fileFilter);
dialog.setContent(chooser);
dialog.setTitle(windowTitle);
dialog.show(target);
}
};
return link;
}
/**
* The text field stored inside the panel.
*
*/
public FormComponent<String> getFormComponent() {
return textField;
}
/**
* Sets the filter that will act in the file chooser dialog
* @param fileFilter
*/
public void setFileFilter(IModel<? extends FileFilter> fileFilter) {
this.fileFilter = fileFilter;
}
}