org.opensingular.lib.wicket.util.maps.MarkableGoogleMapsPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.opensingular.lib.wicket.util.maps.MarkableGoogleMapsPanel.java

Source

/*
 * Copyright (C) 2016 Singular Studios (a.k.a Atom Tecnologia) - www.opensingular.com
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.opensingular.lib.wicket.util.maps;

import org.apache.wicket.Component;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.markup.html.form.HiddenField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.util.template.PackageTextTemplate;
import org.opensingular.lib.wicket.util.util.WicketUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class MarkableGoogleMapsPanel<T> extends Panel {

    private static final Logger LOGGER = LoggerFactory.getLogger(MarkableGoogleMapsPanel.class);
    private static final String PANEL_SCRIPT = "MarkableGoogleMapsPanel.js";
    private static final String METADATA_JSON = "MarkableGoogleMapsPanelMetadata.json";
    private static final Integer DEFAULT_ZOOM = 4;

    private final IModel<String> metadadosModel = new Model<>();
    private final IModel<Boolean> readOnly = Model.of(Boolean.FALSE);

    private final WebMarkupContainer map = new WebMarkupContainer("map");
    private final HiddenField<String> metadados = new HiddenField<>("metadados", metadadosModel);

    private final HiddenField<T> lat = new HiddenField<>("lat");
    private final HiddenField<T> lng = new HiddenField<>("lng");

    @Override
    public void renderHead(IHeaderResponse response) {

        final PackageResourceReference customJS = new PackageResourceReference(getClass(), PANEL_SCRIPT);

        response.render(JavaScriptReferenceHeaderItem.forReference(customJS));
        response.render(OnDomReadyHeaderItem.forScript("createBelverMap(" + stringfyId(metadados) + ");"));

        super.renderHead(response);
    }

    public MarkableGoogleMapsPanel(String id, IModel<T> latModel, IModel<T> lngModel) {
        super(id);
        lat.setModel(latModel);
        lng.setModel(lngModel);
    }

    private void popularMetadados() {

        final Map<String, Object> properties = new HashMap<>();
        try (final PackageTextTemplate metadataJSON = new PackageTextTemplate(getClass(), METADATA_JSON)) {
            properties.put("idMap", map.getMarkupId(true));
            properties.put("idLat", lat.getMarkupId(true));
            properties.put("idLng", lng.getMarkupId(true));
            properties.put("zoom", DEFAULT_ZOOM);
            properties.put("readOnly", isReadOnly());
            metadataJSON.interpolate(properties);
            metadadosModel.setObject(metadataJSON.getString());
            metadataJSON.close();
        } catch (IOException e) {
            LOGGER.error("Erro ao fechar stream", e);
        }
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();
        popularMetadados();
        add(map, lat, lng, metadados);
    }

    @Override
    protected void onConfigure() {
        super.onConfigure();
        visitChildren(FormComponent.class, (comp, visit) -> comp.setEnabled(!isReadOnly()));
        this.add(WicketUtils.$b.attrAppender("style", "height: " + getHeight() + "px;", ""));
    }

    protected Integer getHeight() {
        return 500;
    }

    private String stringfyId(Component c) {
        return "'" + c.getMarkupId(true) + "'";
    }

    public MarkableGoogleMapsPanel<T> setReadOnly(boolean readOnly) {
        this.readOnly.setObject(readOnly);
        return this;
    }

    protected boolean isReadOnly() {
        return readOnly.getObject();
    }
}