Ticket #4043: patch2.diff

File patch2.diff, 15.7 KB (added by Don-vip, 14 years ago)
  • core/src/org/openstreetmap/josm/actions/ToggleUploadDiscouragedLayerAction.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.actions;
     3
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.event.ActionEvent;
     7
     8import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
     9import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     10
     11public class ToggleUploadDiscouragedLayerAction extends JosmAction {
     12
     13    private OsmDataLayer layer;
     14   
     15    public ToggleUploadDiscouragedLayerAction(OsmDataLayer layer) {
     16        super(tr("Encourage/discourage upload"), null, null, null, false);
     17        this.layer = layer;
     18    }
     19
     20    @Override
     21    public void actionPerformed(ActionEvent e) {
     22        layer.setUploadDiscouraged(!layer.isUploadDiscouraged());
     23        LayerListDialog.getInstance().repaint();
     24    }
     25}
  • core/src/org/openstreetmap/josm/actions/UploadAction.java

     
    44import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    55import static org.openstreetmap.josm.tools.I18n.tr;
    66
     7import java.awt.Image;
    78import java.awt.event.ActionEvent;
    89import java.awt.event.KeyEvent;
    910import java.util.LinkedList;
    1011
     12import javax.swing.Icon;
     13import javax.swing.ImageIcon;
    1114import javax.swing.JOptionPane;
    1215import javax.swing.SwingUtilities;
    1316
     
    1821import org.openstreetmap.josm.actions.upload.ValidateUploadHook;
    1922import org.openstreetmap.josm.data.APIDataSet;
    2023import org.openstreetmap.josm.data.conflict.ConflictCollection;
     24import org.openstreetmap.josm.gui.ExtendedDialog;
    2125import org.openstreetmap.josm.gui.HelpAwareOptionPane;
    2226import org.openstreetmap.josm.gui.help.HelpUtil;
    2327import org.openstreetmap.josm.gui.io.UploadDialog;
    2428import org.openstreetmap.josm.gui.io.UploadPrimitivesTask;
    2529import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     30import org.openstreetmap.josm.tools.ImageProvider;
    2631import org.openstreetmap.josm.tools.Shortcut;
    2732
    2833/**
     
    103108        return checkPreUploadConditions(layer, new APIDataSet(layer.data));
    104109    }
    105110
    106     protected void alertUnresolvedConflicts(OsmDataLayer layer) {
     111    protected static void alertUnresolvedConflicts(OsmDataLayer layer) {
    107112        HelpAwareOptionPane.showOptionDialog(
    108113                Main.parent,
    109114                tr("<html>The data to be uploaded participates in unresolved conflicts of layer ''{0}''.<br>"
     
    114119                HelpUtil.ht("/Action/Upload#PrimitivesParticipateInConflicts")
    115120        );
    116121    }
     122   
     123    /**
     124     * returns true if the user wants to cancel, false if they
     125     * want to continue
     126     */
     127    public static final boolean warnUploadDiscouraged(OsmDataLayer layer) {
     128        ExtendedDialog dlg = new ExtendedDialog(Main.parent,
     129                tr("Upload discouraged"),
     130                new String[] {tr("Cancel"), tr("Continue")});
     131        dlg.setContent("<html>" +
     132                tr("You are about to upload data from the layer ''{0}''.<br /><br />"+
     133                        "Sending data from this layer is <b>strongly discouraged</b>. If you continue,<br />"+
     134                        "it may require you subsequently have to revert your changes, or force other contributors to.<br /><br />"+
     135                        "Are you sure you want to continue?", layer.getName())+
     136                "</html>");
     137        dlg.setButtonIcons(new Icon[] {
     138                ImageProvider.get("cancel"),
     139                ImageProvider.overlay(
     140                        ImageProvider.get("upload"),
     141                        new ImageIcon(ImageProvider.get("warning-small").getImage().getScaledInstance(10 , 10, Image.SCALE_SMOOTH)),
     142                        ImageProvider.OverlayPosition.SOUTHEAST)});
     143        dlg.setToolTipTexts(new String[] {
     144                tr("Cancel"),
     145                tr("Ignore this hint and upload anyway")});
     146        dlg.setIcon(JOptionPane.WARNING_MESSAGE);
     147        dlg.setCancelButton(1);
     148        return dlg.showDialog().getValue() != 2;
     149    }
    117150
    118151    /**
    119152     * Check whether the preconditions are met to upload data in <code>apiData</code>.
    120      * Makes sure primitives in <code>apiData</code> don't participate in conflicts and
     153     * Makes sure upload is allowed, primitives in <code>apiData</code> don't participate in conflicts and
    121154     * runs the installed {@see UploadHook}s.
    122155     *
    123156     * @param layer the source layer of the data to be uploaded
     
    125158     * @return true, if the preconditions are met; false, otherwise
    126159     */
    127160    public boolean checkPreUploadConditions(OsmDataLayer layer, APIDataSet apiData) {
     161        if (layer.isUploadDiscouraged()) {
     162            if (warnUploadDiscouraged(layer)) {
     163                return false;
     164            }
     165        }
    128166        ConflictCollection conflicts = layer.getConflicts();
    129167        if (apiData.participatesInConflict(conflicts)) {
    130168            alertUnresolvedConflicts(layer);
  • core/src/org/openstreetmap/josm/actions/UploadSelectionAction.java

     
    8787    public void actionPerformed(ActionEvent e) {
    8888        if (!isEnabled())
    8989            return;
     90        if (getEditLayer().isUploadDiscouraged()) {
     91            if (UploadAction.warnUploadDiscouraged(getEditLayer())) {
     92                return;
     93            }
     94        }
    9095        UploadHullBuilder builder = new UploadHullBuilder();
    9196        UploadSelectionDialog dialog = new UploadSelectionDialog();
    9297        Collection<OsmPrimitive> modifiedCandidates = getModifiedPrimitives(getEditLayer().data.getSelected());
  • core/src/org/openstreetmap/josm/data/osm/DataSet.java

     
    124124    private final List<AbstractDatasetChangedEvent> cachedEvents = new ArrayList<AbstractDatasetChangedEvent>();
    125125
    126126    private int highlightUpdateCount;
     127   
     128    private boolean uploadDiscouraged = false;
    127129
    128130    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    129131    private final Object selectionLock = new Object();
     
    206208        this.version = version;
    207209    }
    208210
     211    public final boolean isUploadDiscouraged() {
     212        return uploadDiscouraged;
     213    }
     214
     215    public final void setUploadDiscouraged(boolean uploadDiscouraged) {
     216        this.uploadDiscouraged = uploadDiscouraged;
     217    }
     218
    209219    /*
    210220     * Holding bin for changeset tag information, to be applied when or if this is ever uploaded.
    211221     */
  • core/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

     
    1212import java.awt.Composite;
    1313import java.awt.Graphics2D;
    1414import java.awt.GridBagLayout;
     15import java.awt.Image;
    1516import java.awt.Point;
    1617import java.awt.Rectangle;
    1718import java.awt.TexturePaint;
     
    2021import java.awt.image.BufferedImage;
    2122import java.io.File;
    2223import java.util.ArrayList;
     24import java.util.Arrays;
    2325import java.util.Collection;
    2426import java.util.HashMap;
    2527import java.util.HashSet;
     
    2931import javax.swing.AbstractAction;
    3032import javax.swing.Action;
    3133import javax.swing.Icon;
     34import javax.swing.ImageIcon;
    3235import javax.swing.JLabel;
    3336import javax.swing.JOptionPane;
    3437import javax.swing.JPanel;
     
    3639import javax.swing.JTextArea;
    3740
    3841import org.openstreetmap.josm.Main;
     42import org.openstreetmap.josm.actions.ExpertToggleAction;
    3943import org.openstreetmap.josm.actions.RenameLayerAction;
     44import org.openstreetmap.josm.actions.ToggleUploadDiscouragedLayerAction;
    4045import org.openstreetmap.josm.data.Bounds;
    4146import org.openstreetmap.josm.data.SelectionChangedListener;
    4247import org.openstreetmap.josm.data.conflict.Conflict;
     
    218223     *         updated by a background thread to not disturb the running programm.
    219224     */
    220225    @Override public Icon getIcon() {
    221         return ImageProvider.get("layer", "osmdata_small");
     226        Icon baseIcon = ImageProvider.get("layer", "osmdata_small");
     227        if (isUploadDiscouraged()) {
     228            return ImageProvider.overlay(baseIcon,
     229                    new ImageIcon(ImageProvider.get("warning-small").getImage().getScaledInstance(8, 8, Image.SCALE_SMOOTH)),
     230                    ImageProvider.OverlayPosition.SOUTHEAST);
     231        } else {
     232            return baseIcon;
     233        }
    222234    }
    223235
    224236    /**
     
    394406
    395407
    396408    @Override public boolean isMergable(final Layer other) {
    397         return other instanceof OsmDataLayer;
     409        return other instanceof OsmDataLayer && (isUploadDiscouraged() == ((OsmDataLayer)other).isUploadDiscouraged());
    398410    }
    399411
    400412    @Override public void visitBoundingBox(final BoundingXYVisitor v) {
     
    456468        p.add(new JLabel(nodeText, ImageProvider.get("data", "node"), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
    457469        p.add(new JLabel(wayText, ImageProvider.get("data", "way"), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
    458470        p.add(new JLabel(relationText, ImageProvider.get("data", "relation"), JLabel.HORIZONTAL), GBC.eop().insets(15,0,0,0));
    459         p.add(new JLabel(tr("API version: {0}", (data.getVersion() != null) ? data.getVersion() : tr("unset"))));
     471        p.add(new JLabel(tr("API version: {0}", (data.getVersion() != null) ? data.getVersion() : tr("unset"))), GBC.eop().insets(15,0,0,0));
     472        if (isUploadDiscouraged()) {
     473            p.add(new JLabel(tr("Upload is discouraged")), GBC.eop().insets(15,0,0,0));
     474        }
    460475
    461476        return p;
    462477    }
     
    474489                new ConsistencyTestAction(),
    475490                SeparatorLayerAction.INSTANCE,
    476491                new LayerListPopup.InfoAction(this)};
    477         return new Action[]{
     492        ArrayList<Action> actions = new ArrayList<Action>();
     493        actions.addAll(Arrays.asList(new Action[]{
    478494                LayerListDialog.getInstance().createActivateLayerAction(this),
    479495                LayerListDialog.getInstance().createShowHideLayerAction(),
    480496                LayerListDialog.getInstance().createDeleteLayerAction(),
     
    485501                new LayerGpxExportAction(this),
    486502                new ConvertToGpxLayerAction(),
    487503                SeparatorLayerAction.INSTANCE,
    488                 new RenameLayerAction(getAssociatedFile(), this),
     504                new RenameLayerAction(getAssociatedFile(), this)}));
     505        if (ExpertToggleAction.isExpert()) {
     506            actions.add(new ToggleUploadDiscouragedLayerAction(this));
     507        }
     508        actions.addAll(Arrays.asList(new Action[]{
    489509                new ConsistencyTestAction(),
    490510                SeparatorLayerAction.INSTANCE,
    491                 new LayerListPopup.InfoAction(this)};
     511                new LayerListPopup.InfoAction(this)}));
     512        return actions.toArray(new Action[0]);
    492513    }
    493514
    494515    public static GpxData toGpxData(DataSet data, File file) {
     
    701722         * change listener and already got notified.
    702723         */
    703724    }
     725
     726    public final boolean isUploadDiscouraged() {
     727        return data.isUploadDiscouraged();
     728    }
     729
     730    public final void setUploadDiscouraged(boolean uploadDiscouraged) {
     731        data.setUploadDiscouraged(uploadDiscouraged);
     732    }
    704733}
  • core/src/org/openstreetmap/josm/io/OsmExporter.java

     
    7373            OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, layer.data.getVersion());
    7474            layer.data.getReadLock().lock();
    7575            try {
    76                 w.header();
    77                 w.writeDataSources(layer.data);
    78                 w.writeContent(layer.data);
    79                 w.footer();
     76                w.writeLayer(layer);
    8077                w.close();
    8178            } finally {
    8279                layer.data.getReadLock().unlock();
  • core/src/org/openstreetmap/josm/io/OsmReader.java

     
    116116            throwException(tr("Unsupported version: {0}", v));
    117117        }
    118118        ds.setVersion(v);
     119        String upload = parser.getAttributeValue(null, "upload");
     120        if (upload != null) {
     121            ds.setUploadDiscouraged(!Boolean.parseBoolean(upload));
     122        }
    119123        String generator = parser.getAttributeValue(null, "generator");
    120124        Long uploadChangesetId = null;
    121125        if (parser.getAttributeValue(null, "upload-changeset") != null) {
  • core/src/org/openstreetmap/josm/io/OsmWriter.java

     
    2525import org.openstreetmap.josm.data.osm.Tagged;
    2626import org.openstreetmap.josm.data.osm.Way;
    2727import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
     28import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    2829import org.openstreetmap.josm.tools.DateUtils;
    2930
    3031/**
     
    6162    }
    6263
    6364    public void header() {
     65        header(null);
     66    }
     67    public void header(Boolean upload) {
    6468        out.println("<?xml version='1.0' encoding='UTF-8'?>");
    6569        out.print("<osm version='");
    6670        out.print(version);
     71        if (upload != null) {
     72            out.print("' upload='");
     73            out.print(upload);
     74        }
    6775        out.println("' generator='JOSM'>");
    6876    }
    6977    public void footer() {
     
    8290        Collections.sort(result, byIdComparator);
    8391        return result;
    8492    }
     93   
     94    public void writeLayer(OsmDataLayer layer) {
     95        header(!layer.isUploadDiscouraged());
     96        writeDataSources(layer.data);
     97        writeContent(layer.data);
     98        footer();
     99    }
    85100
    86101    public void writeContent(DataSet ds) {
    87102        for (OsmPrimitive n : sortById(ds.getNodes())) {
  • core/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java

     
    221221        OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, layer.data.getVersion());
    222222        layer.data.getReadLock().lock();
    223223        try {
    224             w.header();
    225             w.writeDataSources(layer.data);
    226             w.writeContent(layer.data);
    227             w.footer();
     224            w.writeLayer(layer);
    228225            w.flush();
    229226        } finally {
    230227            layer.data.getReadLock().unlock();