ontopoly.pages.ModalGeoPickerPage.java Source code

Java tutorial

Introduction

Here is the source code for ontopoly.pages.ModalGeoPickerPage.java

Source

/*
 * #!
 * Ontopoly Editor
 * #-
 * Copyright (C) 2001 - 2013 The Ontopia Project
 * #-
 * 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 ontopoly.pages;

import java.util.Collection;
import java.util.Iterator;

import net.ontopia.infoset.core.LocatorIF;
import net.ontopia.topicmaps.core.OccurrenceIF;
import net.ontopia.topicmaps.core.TopicIF;
import net.ontopia.topicmaps.core.TopicMapBuilderIF;
import net.ontopia.topicmaps.core.TopicMapIF;
import ontopoly.components.FieldInstanceOccurrencePanel;
import ontopoly.components.FieldInstancesPanel;
import ontopoly.model.FieldAssignment;
import ontopoly.model.FieldDefinition;
import ontopoly.model.FieldInstance;
import ontopoly.model.OccurrenceField;
import ontopoly.model.OccurrenceType;
import ontopoly.model.PSI;
import ontopoly.model.Topic;
import ontopoly.models.FieldInstanceModel;
import ontopoly.models.TopicModel;

import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;

public class ModalGeoPickerPage extends Panel {
    ModalWindow dialog;
    TopicModel<Topic> thetopic;
    AbstractDefaultAjaxBehavior behave;
    Label ajaxurllabel;
    Model<String> ajaxurlmodel;

    FieldInstanceOccurrencePanel latpan;
    FieldInstanceOccurrencePanel lngpan;

    public ModalGeoPickerPage(ModalWindow dialog, Topic thetopic) {
        super(dialog.getContentId());
        this.dialog = dialog;
        this.thetopic = new TopicModel<Topic>(thetopic);

        //setInitialHeight(700);

        final WebMarkupContainer popupContent = new WebMarkupContainer("popupContent");
        popupContent.setOutputMarkupId(true);
        add(popupContent);

        popupContent.add(new Label("title", new Model<String>("Pick location for '" + thetopic.getName() + "'")));

        behave = new ReceiveRequest(this);
        this.add(behave);

        // using a label to provide the callback URI to the JavaScript code
        // in the page. unfortunately, we don't know the URI here, so we set
        // things up, then insert it later.
        ajaxurlmodel = new Model<String>("// and the url is ...");
        ajaxurllabel = new Label("ajaxurl", ajaxurlmodel);
        ajaxurllabel.setEscapeModelStrings(false);
        popupContent.add(ajaxurllabel);
    }

    protected void onBeforeRender() {
        super.onBeforeRender();

        String lat = get(thetopic.getTopic().getTopicIF(), PSI.ON_LATITUDE);
        if (lat == null)
            lat = "59.92";
        String lng = get(thetopic.getTopic().getTopicIF(), PSI.ON_LONGITUDE);
        if (lng == null)
            lng = "10.74";

        // we can't call getCallbackUrl() in the constructor, but here it's
        // possible, so we insert the URI into the label we created above,
        // and everything is hunky dory.
        String js = "var ajaxurl = '" + behave.getCallbackUrl() + "';\n";
        js += "var latitude = " + lat + ";\n";
        js += "var longitude = " + lng + ";\n";

        ajaxurllabel.modelChanging();
        ajaxurlmodel.setObject(js);
        ajaxurllabel.modelChanged();

    }

    protected void onSetPosition(AjaxRequestTarget target) {
        String lat = RequestCycle.get().getRequest().getParameter("lat");
        String lng = RequestCycle.get().getRequest().getParameter("long");

        findFields();

        set(thetopic.getTopic().getTopicIF(), lat, PSI.ON_LATITUDE);
        set(thetopic.getTopic().getTopicIF(), lng, PSI.ON_LONGITUDE);

        latpan.getFieldValuesModel().setShowExtraField(false, false);
        latpan.onUpdate(target);
        lngpan.getFieldValuesModel().setShowExtraField(false, false);
        lngpan.onUpdate(target);

        onCloseOk(target);
    }

    protected void onCloseCancel(AjaxRequestTarget target) {
        dialog.close(target);
    }

    protected void onCloseOk(AjaxRequestTarget target) {
        dialog.close(target);
    }

    private void findFields() {
        MarkupContainer container = this;
        while (!(container instanceof FieldInstancesPanel))
            container = container.getParent();

        FieldInstancesPanel parent = (FieldInstancesPanel) container;
        ListView<FieldInstanceModel> listView = parent.getFieldList();
        Iterator<? extends ListItem<FieldInstanceModel>> itfim = listView.iterator();
        while (itfim.hasNext()) {
            ListItem<FieldInstanceModel> li = itfim.next();
            FieldInstance fi = li.getModelObject().getFieldInstance();
            FieldAssignment fa = fi.getFieldAssignment();
            FieldDefinition fd = fa.getFieldDefinition();
            if (fd.getFieldType() != FieldDefinition.FIELD_TYPE_OCCURRENCE)
                continue;
            OccurrenceField of = (OccurrenceField) fd;
            OccurrenceType ot = of.getOccurrenceType();
            if (ot == null)
                continue;
            Collection<LocatorIF> psis = ot.getTopicIF().getSubjectIdentifiers();

            if (psis.contains(PSI.ON_LATITUDE) || psis.contains(PSI.ON_LONGITUDE)) {
                Iterator<? extends Component> it = li.iterator();
                while (it.hasNext()) {
                    Object component = it.next();
                    if (component instanceof FieldInstanceOccurrencePanel) {
                        FieldInstanceOccurrencePanel fiop = (FieldInstanceOccurrencePanel) component;
                        if (psis.contains(PSI.ON_LONGITUDE))
                            lngpan = fiop;
                        else
                            latpan = fiop;
                    }
                }
            }
        }
    }

    private void set(TopicIF topic, String value, LocatorIF psi) {
        for (OccurrenceIF occ : topic.getOccurrences()) {
            TopicIF type = occ.getType();
            if (type.getSubjectIdentifiers().contains(psi)) {
                occ.setValue(value);
                return;
            }
        }

        TopicMapIF tm = topic.getTopicMap();
        TopicMapBuilderIF builder = tm.getBuilder();
        TopicIF type = tm.getTopicBySubjectIdentifier(psi);
        builder.makeOccurrence(topic, type, value);
    }

    private String get(TopicIF topic, LocatorIF psi) {
        for (OccurrenceIF occ : topic.getOccurrences()) {
            TopicIF type = occ.getType();
            if (type.getSubjectIdentifiers().contains(psi))
                return occ.getValue();
        }

        return null;
    }

    // --- Ajax request receipt

    public class ReceiveRequest extends AbstractDefaultAjaxBehavior {
        private ModalGeoPickerPage parent;

        public ReceiveRequest(ModalGeoPickerPage parent) {
            this.parent = parent;
        }

        protected void respond(final AjaxRequestTarget target) {
            parent.onSetPosition(target);
        }
    }
}