org.openstreetmap.beboj.client.gui.UploadDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.openstreetmap.beboj.client.gui.UploadDialog.java

Source

// License: GPL. For details, see LICENSE file.
package org.openstreetmap.beboj.client.gui;

import java.util.Collection;
import java.util.HashSet;

import org.openstreetmap.beboj.client.Beboj;
import org.openstreetmap.beboj.client.io.API;
import org.openstreetmap.beboj.client.io.APIAsync;
import org.openstreetmap.beboj.shared.data.osm.SimpleDataSet;
import org.openstreetmap.beboj.shared.data.osm.UploadRequestData;
import org.openstreetmap.beboj.shared.data.osm.UploadResponseData;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.io.DiffResultEntry;
import org.openstreetmap.josm.tools.Predicate;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Cursor;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class UploadDialog extends DialogBox {

    Collection<OsmPrimitive> primitivesForUpload;

    TextBox user;
    PasswordTextBox pw;
    TextBox comment;

    public UploadDialog() {
        setText("Upload");
        setGlassEnabled(true);

        Button cancel = new Button("Cancel");
        Button upload = new Button("Upload");

        cancel.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                UploadDialog.this.hide();
            }
        });
        upload.addClickHandler(new UploadClickHandler());

        user = new TextBox();
        user.setText(Beboj.username == null ? "" : Beboj.username);
        pw = new PasswordTextBox();
        pw.setText(Beboj.password == null ? "" : Beboj.password);
        comment = new TextBox();
        comment.setText(Beboj.comment == null ? "" : Beboj.comment);

        Grid g = new Grid(3, 2);

        g.setText(0, 0, "User name:");
        g.setWidget(0, 1, user);
        g.setText(1, 0, "Password:");
        g.setWidget(1, 1, pw);
        g.setText(2, 0, "Changeset Comment:");
        g.setWidget(2, 1, comment);

        primitivesForUpload = new HashSet<OsmPrimitive>();
        for (OsmPrimitive osm : Main.main.getCurrentDataSet().allPrimitives()) {
            if (forUpload.evaluate(osm)) {
                primitivesForUpload.add(osm);
            }
        }

        HorizontalPanel hp = new HorizontalPanel();
        hp.add(cancel);
        hp.add(upload);

        VerticalPanel vp = new VerticalPanel();
        vp.add(new HTML("uploading " + primitivesForUpload.size() + " objects"));
        vp.add(g);
        vp.add(hp);

        setWidget(vp);
        center();
    }

    protected class UploadClickHandler implements ClickHandler {
        @Override
        public void onClick(ClickEvent event) {
            UploadDialog.this.getElement().getStyle().setCursor(Cursor.WAIT);

            final UploadRequestData request = new UploadRequestData();

            request.data = new SimpleDataSet();
            request.data.addAll(primitivesForUpload);
            request.changeSetComment = Beboj.comment = comment.getText();
            request.username = Beboj.username = user.getText();
            request.password = Beboj.password = pw.getText();

            APIAsync as = GWT.create(API.class);
            as.uploadOsmData(request, new AsyncCallback<UploadResponseData>() {
                @Override
                public void onFailure(Throwable caught) {
                    UploadDialog.this.getElement().getStyle().clearCursor();
                    UploadDialog.this.hide();
                    Window.alert("uploadOsmData/RPC failure");
                }

                @Override
                public void onSuccess(UploadResponseData response) {
                    UploadDialog.this.getElement().getStyle().clearCursor();
                    UploadDialog.this.hide();
                    for (OsmPrimitive p : primitivesForUpload) {
                        DiffResultEntry entry = response.diffResults.get(p.getPrimitiveId());
                        if (entry == null) {
                            continue;
                        }
                        if (!p.isDeleted()) {
                            p.setOsmId(entry.new_id, entry.new_version);
                            p.setVisible(true);
                        } else {
                            p.setVisible(false);
                        }
                        //                        if (cs != null && !cs.isNew()) {
                        //                            p.setChangesetId(cs.getId());
                        //                        }
                    }
                    // ids have changed, so we have to rebuild the HashSet
                    primitivesForUpload = new HashSet<OsmPrimitive>(primitivesForUpload);

                    Main.main.getEditLayer().cleanupAfterUpload(primitivesForUpload);

                    Window.alert("uploadOsmData/RPC success (" + response.diffResults.size() + ")");
                }
            });
        }
    }

    Predicate<OsmPrimitive> forUpload = new Predicate<OsmPrimitive>() {
        @Override
        public boolean evaluate(OsmPrimitive osm) {
            return (osm.isDeleted() && !osm.isNew() && osm.isModified() && osm.isVisible())
                    || (!osm.isDeleted() && osm.isModified()) || (!osm.isDeleted() && osm.isNewOrUndeleted());
        }
    };

}