org.geogig.geoserver.web.repository.GeoGigDirectoryFormComponent.java Source code

Java tutorial

Introduction

Here is the source code for org.geogig.geoserver.web.repository.GeoGigDirectoryFormComponent.java

Source

/* (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;
    }

}