/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geogig.geoserver.web.repository;
import java.io.File;
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.FormComponentPanel;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.form.validation.FormComponentFeedbackBorder;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.geoserver.web.data.store.panel.FileParamPanel;
/**
* A panel to browse the filesystem for geogig repositories.
* <p>
* Adapted from {@link FileParamPanel}
*/
class GeoGigDirectoryFormComponent extends FormComponentPanel<String> {
private static final long serialVersionUID = -7456670856888745195L;
private final TextField<String> directory;
private final ModalWindow dialog;
/**
*
* @param validators any extra validator that should be added to the input field, or
* {@code null}
*/
GeoGigDirectoryFormComponent(final String id, final IModel<String> valueModel) {
// make the value of the text field the model of this panel, for easy value retrieval
super(id, valueModel);
// add the dialog for the file chooser
add(dialog = new ModalWindow("dialog"));
// the text field, with a decorator for validations
directory = new TextField<>("value", valueModel);
directory.setRequired(true);
directory.setOutputMarkupId(true);
IModel<String> labelModel = new ResourceModel("GeoGigDirectoryFormComponent.directory",
"Parent directory") {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
String value = super.getObject();
return value + " *";
}
};
final Label directoryLabel = new Label("directoryLabel", labelModel.getObject());
add(directoryLabel);
directory.setLabel(labelModel);
FormComponentFeedbackBorder feedback = new FormComponentFeedbackBorder("wrapper");
feedback.add(directory);
feedback.add(chooserButton());
add(feedback);
}
@Override
public void convertInput() {
String uri = directory.getConvertedInput();
setConvertedInput(uri);
}
private Component chooserButton() {
AjaxSubmitLink link = new AjaxSubmitLink("chooser") {
private static final long serialVersionUID = 1242472443848716943L;
@Override
public boolean getDefaultFormProcessing() {
return false;
}
@Override
public void onSubmit(AjaxRequestTarget target, Form<?> form) {
File file = null;
directory.processInput();
String input = directory.getConvertedInput();
if (input != null && !input.isEmpty()) {
file = new File(input);
}
final boolean makeRepositoriesSelectable = false;
DirectoryChooser chooser = new DirectoryChooser(dialog.getContentId(),
new Model<>(file), makeRepositoriesSelectable) {
private static final long serialVersionUID = 1L;
@Override
protected void geogigDirectoryClicked(final File file, AjaxRequestTarget target) {
// clear the raw input of the field won't show the new model value
directory.clearInput();
directory.setModelObject(file.getAbsolutePath());
target.add(directory);
dialog.close(target);
};
@Override
protected void directorySelected(File file, AjaxRequestTarget target) {
directory.clearInput();
directory.setModelObject(file.getAbsolutePath());
target.add(directory);
dialog.close(target);
}
};
chooser.setFileTableHeight(null);
dialog.setContent(chooser);
dialog.setTitle(new ResourceModel(
"GeoGigDirectoryFormComponent.chooser.chooseParentTile"));
dialog.show(target);
}
};
return link;
}
}