be.progs.routeshare.client.RouteShareMenu.java Source code

Java tutorial

Introduction

Here is the source code for be.progs.routeshare.client.RouteShareMenu.java

Source

/*
 * This file is part routeshare.
 * Copyright PROGS bvba, http://www.progs.be/
 * For licensing details, see LICENSE.txt in the project root.
 */

package be.progs.routeshare.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.SpanElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.HasCloseHandlers;
import com.google.gwt.event.logical.shared.HasOpenHandlers;
import com.google.gwt.event.logical.shared.HasResizeHandlers;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import org.geomajas.geometry.Geometry;
import org.geomajas.plugin.editing.client.service.GeometryEditService;
import org.geomajas.plugin.editing.client.service.GeometryEditState;
import org.geomajas.plugin.editing.client.service.GeometryIndex;
import org.geomajas.plugin.editing.client.service.GeometryIndexType;
import org.geomajas.plugin.editing.puregwt.client.GeometryEditor;
import org.geomajas.puregwt.client.map.MapPresenter;

/**
 * Menu for the RouteShare application.
 *
 * @author Joachim Van der Auwera
 */
public class RouteShareMenu extends Composite
        implements HasOpenHandlers<RouteShareMenu>, HasCloseHandlers<RouteShareMenu>, HasResizeHandlers {

    private static final RouteShareGinjector INJECTOR = GWT.create(RouteShareGinjector.class);

    /**
     * UI binder definition for the {@link RouteShareMenu} widget.
     *
     * @author Pieter De Graef
     */
    interface RouteShareMenuUiBinder extends UiBinder<Widget, RouteShareMenu> {
        // built by GWT.create
    }

    private static final RouteShareMenuUiBinder UI_BINDER = GWT.create(RouteShareMenuUiBinder.class);

    private boolean open;

    @UiField
    protected HTML title;

    @UiField
    protected SpanElement titleElement;

    @UiField
    protected VerticalPanel contentPanel;

    public RouteShareMenu(MapPresenter mapPresenter) {
        initWidget(UI_BINDER.createAndBindUi(this));
        setWidth("200px");

        title.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                setOpen(!open);
            }
        });

        GeometryEditor editor = INJECTOR.getGeometryEditorFactory().create(mapPresenter);
        GeometryEditService editService = editor.getEditService();
        GeometryToShapeConverter geometryToShapeConverter = new GeometryToShapeConverter(editService);

        Button createButton = new Button("Create route");
        createButton.addClickHandler(new CreateRouteClickHandler(editService, geometryToShapeConverter));
        contentPanel.add(createButton);
    }

    @Override
    public HandlerRegistration addCloseHandler(CloseHandler<RouteShareMenu> handler) {
        return addHandler(handler, CloseEvent.getType());
    }

    @Override
    public HandlerRegistration addOpenHandler(OpenHandler<RouteShareMenu> handler) {
        return addHandler(handler, OpenEvent.getType());
    }

    @Override
    public HandlerRegistration addResizeHandler(ResizeHandler handler) {
        return addHandler(handler, ResizeEvent.getType());
    }

    /**
     * Is the drop down panel currently visible or not?
     *
     * @return Is the drop down panel currently visible or not?
     */
    public boolean isOpen() {
        return open;
    }

    /**
     * Open or close the legend drop down panel.
     *
     * @param open The new value.
     */
    public void setOpen(boolean open) {
        this.open = open;
        buildGui();
    }

    /**
     * Apply a new title on the drop down button.
     *
     * @param safeHtml The title in the form of a trusted HTML string.
     */
    public void setTitle(String safeHtml) {
        titleElement.setInnerHTML(safeHtml);
    }

    private void buildGui() {
        contentPanel.setVisible(open);
        if (open) {
            int width = contentPanel.getOffsetWidth();
            setWidth(width + "px");
        } else {
            setWidth("100px");
        }
        ResizeEvent.fire(this, getOffsetWidth(), getOffsetHeight());
    }

    /**
     * Click handler to start creating a new route.
     */
    private final class CreateRouteClickHandler implements ClickHandler {

        private final GeometryEditService editService;
        private final GeometryToShapeConverter geometryToShapeConverter;

        private CreateRouteClickHandler(GeometryEditService editService,
                GeometryToShapeConverter geometryToShapeConverter) {
            this.editService = editService;
            this.geometryToShapeConverter = geometryToShapeConverter;
        }

        public void onClick(ClickEvent event) {
            geometryToShapeConverter.processCurrentGeometry();

            Geometry line = new Geometry(Geometry.LINE_STRING, 0, -1);
            editService.start(line);

            GeometryIndex index = editService.getIndexService().create(GeometryIndexType.TYPE_VERTEX, 0);
            editService.setEditingState(GeometryEditState.INSERTING);
            editService.setInsertIndex(index);
        }

    }
}