Ticket #9634: ticket9634_2014-04-11_00:53:42_+0200.patch

File ticket9634_2014-04-11_00:53:42_+0200.patch, 23.7 KB (added by Balaitous, 9 years ago)

Draft of current work, I have found where downloaded primitives are selected. In a good way.

  • src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java

    diff --git src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java src/org/openstreetmap/josm/actions/DownloadPrimitiveAction.java
    index 5bae4eb..10307bc 100644
    package org.openstreetmap.josm.actions; 
    33
    44import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
    55import static org.openstreetmap.josm.tools.I18n.tr;
    6 import static org.openstreetmap.josm.tools.I18n.trn;
    76
    8 import java.awt.Font;
    9 import java.awt.GridBagLayout;
    107import java.awt.event.ActionEvent;
    118import java.awt.event.KeyEvent;
    12 import java.lang.reflect.InvocationTargetException;
    139import java.util.List;
    14 import java.util.Set;
    15 import java.util.TreeSet;
    16 
    17 import javax.swing.JLabel;
    18 import javax.swing.JOptionPane;
    19 import javax.swing.JPanel;
    20 import javax.swing.JScrollPane;
    21 import javax.swing.SwingUtilities;
    2210
    2311import org.openstreetmap.josm.Main;
    24 import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask;
    25 import org.openstreetmap.josm.data.osm.DataSet;
    26 import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2712import org.openstreetmap.josm.data.osm.PrimitiveId;
    28 import org.openstreetmap.josm.gui.ExtendedDialog;
    2913import org.openstreetmap.josm.gui.download.DownloadObjectDialog;
    30 import org.openstreetmap.josm.gui.io.DownloadPrimitivesTask;
    31 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    32 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
    33 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
    34 import org.openstreetmap.josm.tools.GBC;
     14import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
    3515import org.openstreetmap.josm.tools.Shortcut;
    36 import org.openstreetmap.josm.tools.Utils;
    3716
    3817/**
    3918 * Download an OsmPrimitive by specifying type and ID
    public class DownloadPrimitiveAction extends JosmAction { 
    6241
    6342    /**
    6443     * @param newLayer if the data should be downloaded into a new layer
    65      * @param ids
     44     * @param ids List of primitive id to download
    6645     * @param downloadReferrers if the referrers of the object should be downloaded as well, i.e., parent relations, and for nodes, additionally, parent ways
    6746     * @param full if the members of a relation should be downloaded as well
    6847     */
    6948    public static void processItems(boolean newLayer, final List<PrimitiveId> ids, boolean downloadReferrers, boolean full) {
    70         OsmDataLayer layer = getEditLayer();
    71         if ((layer == null) || newLayer) {
    72             layer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
    73             Main.main.addLayer(layer);
    74         }
    75         final DownloadPrimitivesTask task = new DownloadPrimitivesTask(layer, ids, full);
    76         Main.worker.submit(task);
    77 
    78         if (downloadReferrers) {
    79             for (PrimitiveId id : ids) {
    80                 Main.worker.submit(new DownloadReferrersTask(layer, id));
    81             }
    82         }
     49        System.out.printf("DEBUG: DownloadPrimitiveAction.processItems\n");
    8350
    84         Runnable showErrorsAndWarnings = new Runnable() {
    85             @Override
    86             public void run() {
    87                 final Set<PrimitiveId> errs = task.getMissingPrimitives();
    88                 if (errs != null && !errs.isEmpty()) {
    89                     try {
    90                         SwingUtilities.invokeAndWait(new Runnable() {
    91                             @Override
    92                             public void run() {
    93                                 reportProblemDialog(errs,
    94                                         trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()),
    95                                         trn("One object could not be downloaded.<br>",
    96                                             "{0} objects could not be downloaded.<br>",
    97                                             errs.size(),
    98                                             errs.size())
    99                                         + tr("The server replied with response code 404.<br>"
    100                                             + "This usually means, the server does not know an object with the requested id."),
    101                                         tr("missing objects:"),
    102                                         JOptionPane.ERROR_MESSAGE
    103                                 ).showDialog();
    104                             }
    105                         });
    106                     } catch (InterruptedException ex) {
    107                         Main.warn("InterruptedException while displaying error dialog");
    108                     } catch (InvocationTargetException ex) {
    109                         Main.warn(ex);
    110                     }
    111                 }
    112 
    113                 final Set<PrimitiveId> del = new TreeSet<PrimitiveId>();
    114                 DataSet ds = getCurrentDataSet();
    115                 for (PrimitiveId id : ids) {
    116                     OsmPrimitive osm = ds.getPrimitiveById(id);
    117                     if (osm != null && osm.isDeleted()) {
    118                         del.add(id);
    119                     }
    120                 }
    121                 if (!del.isEmpty()) {
    122                     SwingUtilities.invokeLater(new Runnable() {
    123                         @Override
    124                         public void run() {
    125                             reportProblemDialog(del,
    126                                     trn("Object deleted", "Objects deleted", del.size()),
    127                                     trn(
    128                                         "One downloaded object is deleted.",
    129                                         "{0} downloaded objects are deleted.",
    130                                         del.size(),
    131                                         del.size()),
    132                                     null,
    133                                     JOptionPane.WARNING_MESSAGE
    134                             ).showDialog();
    135                         }
    136                     });
    137                 }
    138             }
    139         };
    140         Main.worker.submit(showErrorsAndWarnings);
    141     }
     51        final DownloadPrimitivesWithReferrersTask task =
     52                new DownloadPrimitivesWithReferrersTask(newLayer, ids, downloadReferrers, full, null);
     53        Main.worker.submit(task);
    14254
    143     private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs,
    144             String TITLE, String TEXT, String LIST_LABEL, int msgType) {
    145         JPanel p = new JPanel(new GridBagLayout());
    146         p.add(new HtmlPanel(TEXT), GBC.eop());
    147         if (LIST_LABEL != null) {
    148             JLabel missing = new JLabel(LIST_LABEL);
    149             missing.setFont(missing.getFont().deriveFont(Font.PLAIN));
    150             p.add(missing, GBC.eol());
     55        System.out.printf("task done\n");
    15156        }
    152         JosmTextArea txt = new JosmTextArea();
    153         txt.setFont(new Font("Monospaced", txt.getFont().getStyle(), txt.getFont().getSize()));
    154         txt.setEditable(false);
    155         txt.setBackground(p.getBackground());
    156         txt.setColumns(40);
    157         txt.setRows(1);
    158         txt.setText(Utils.join(", ", errs));
    159         JScrollPane scroll = new JScrollPane(txt);
    160         p.add(scroll, GBC.eop().weight(1.0, 0.0).fill(GBC.HORIZONTAL));
    16157
    162         return new ExtendedDialog(
    163                 Main.parent,
    164                 TITLE,
    165                 new String[] { tr("Ok") })
    166             .setButtonIcons(new String[] { "ok" })
    167             .setIcon(msgType)
    168             .setContent(p, false);
    169     }
    17058}
  • src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java

    diff --git src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
    index ce7c850..15d7a57 100644
    public class DownloadReferrersTask extends PleaseWaitRunnable { 
    130130     *
    131131     */
    132132    public DownloadReferrersTask(OsmDataLayer targetLayer, PrimitiveId primitiveId) throws IllegalArgumentException {
    133         super("Download referrers", false /* don't ignore exception*/);
     133        this(targetLayer,  primitiveId, null);
     134    }
     135
     136    /**
     137     * constructor
     138     *
     139     * @param targetLayer the target layer. Must not be null.
     140     * @param primitiveId a PrimitiveId object.
     141     * @param progressMonitor ProgressMonitor to use or null to create a new one.
     142     * @exception IllegalArgumentException thrown if id &lt;= 0
     143     * @exception IllegalArgumentException thrown if targetLayer == null
     144     *
     145     */
     146    public DownloadReferrersTask(OsmDataLayer targetLayer, PrimitiveId primitiveId,
     147            ProgressMonitor progressMonitor) throws IllegalArgumentException {
     148        super("Download referrers", progressMonitor, false /* don't ignore exception*/);
    134149        CheckParameterUtil.ensureParameterNotNull(targetLayer, "targetLayer");
    135150        if (primitiveId.isNew())
    136151            throw new IllegalArgumentException(MessageFormat.format("Cannot download referrers for new primitives (ID {0})", primitiveId.getUniqueId()));
    public class DownloadReferrersTask extends PleaseWaitRunnable { 
    167182                    @Override
    168183                    public void run() {
    169184                        targetLayer.onPostDownloadFromServer();
    170                         Main.map.mapView.repaint();
     185                        if(Main.map != null)
     186                            Main.map.mapView.repaint();
    171187                    }
    172188                }
    173189        );
  • src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java

    diff --git src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java src/org/openstreetmap/josm/gui/io/DownloadPrimitivesTask.java
    index 519a151..ef2934d 100644
    import java.io.IOException; 
    88import java.util.List;
    99import java.util.Set;
    1010
     11import org.openstreetmap.josm.Main;
    1112import org.openstreetmap.josm.actions.AutoScaleAction;
    1213import org.openstreetmap.josm.data.osm.DataSet;
    1314import org.openstreetmap.josm.data.osm.DataSetMerger;
    public class DownloadPrimitivesTask extends PleaseWaitRunnable { 
    5152     * @throws IllegalArgumentException thrown if layer is null.
    5253     */
    5354    public DownloadPrimitivesTask(OsmDataLayer layer, List<PrimitiveId> ids, boolean fullRelation) throws IllegalArgumentException {
    54         super(tr("Download objects"), false /* don't ignore exception */);
     55        this(layer, ids, fullRelation, null);
     56    }
     57
     58    /**
     59     * Creates the  task
     60     *
     61     * @param layer the layer in which primitives are updated. Must not be null.
     62     * @param ids a collection of primitives to update from the server. Set to
     63     *     the empty collection if null.
     64     * @param fullRelation true if a full download is required, i.e.,
     65     *     a download including the immediate children of a relation.
     66     * @param progressMonitor ProgressMonitor to use or null to create a new one.
     67     * @throws IllegalArgumentException thrown if layer is null.
     68     */
     69    public DownloadPrimitivesTask(OsmDataLayer layer, List<PrimitiveId> ids, boolean fullRelation,
     70            ProgressMonitor progessMonitor) throws IllegalArgumentException {
     71        super(tr("Download objects"), progessMonitor, false /* don't ignore exception */);
    5572        ensureParameterNotNull(layer, "layer");
    5673        this.ids = ids;
    5774        this.layer = layer;
    public class DownloadPrimitivesTask extends PleaseWaitRunnable { 
    83100            @Override
    84101            public void run() {
    85102                layer.mergeFrom(ds);
    86                 AutoScaleAction.zoomTo(ds.allPrimitives());
     103                if(Main.map != null)
     104                    AutoScaleAction.zoomTo(ds.allPrimitives());
    87105                layer.onPostDownloadFromServer();
    88106            }
    89107        });
  • new file src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java

    diff --git src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java src/org/openstreetmap/josm/gui/io/DownloadPrimitivesWithReferrersTask.java
    new file mode 100644
    index 0000000..d661297
    - +  
     1package org.openstreetmap.josm.gui.io;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
     4import static org.openstreetmap.josm.tools.I18n.trn;
     5
     6import java.awt.Font;
     7import java.awt.GridBagLayout;
     8import java.io.IOException;
     9import java.lang.reflect.InvocationTargetException;
     10import java.util.List;
     11import java.util.Set;
     12import java.util.TreeSet;
     13
     14import javax.swing.JLabel;
     15import javax.swing.JOptionPane;
     16import javax.swing.JPanel;
     17import javax.swing.JScrollPane;
     18import javax.swing.SwingUtilities;
     19
     20import org.openstreetmap.josm.Main;
     21import org.openstreetmap.josm.actions.downloadtasks.DownloadReferrersTask;
     22import org.openstreetmap.josm.data.osm.DataSet;
     23import org.openstreetmap.josm.data.osm.OsmPrimitive;
     24import org.openstreetmap.josm.data.osm.PrimitiveId;
     25import org.openstreetmap.josm.gui.ExtendedDialog;
     26import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     28import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     29import org.openstreetmap.josm.gui.widgets.HtmlPanel;
     30import org.openstreetmap.josm.gui.widgets.JosmTextArea;
     31import org.openstreetmap.josm.io.OsmTransferException;
     32import org.openstreetmap.josm.tools.GBC;
     33import org.openstreetmap.josm.tools.Utils;
     34import org.xml.sax.SAXException;
     35
     36/**
     37 * Task for downloading a set of primitives with all referrers.
     38 */
     39public class DownloadPrimitivesWithReferrersTask extends PleaseWaitRunnable {
     40    /** If true download into a new layer */
     41    private final boolean newLayer;
     42    /** List of primitives id to download */
     43    private final List<PrimitiveId> ids;
     44    /** If true, download members for relation */
     45    private final boolean full;
     46    /** If true, download also referrers */
     47    private final boolean downloadReferrers;
     48
     49    /** Temporary layer where downloaded primitives are put */
     50    private OsmDataLayer tmpLayer;
     51    /** Reference to the task that download requested primitives */
     52    private DownloadPrimitivesTask mainTask;
     53    /** Flag indicated that user ask for cancel this task */
     54    private boolean canceled = false;
     55    /** Reference to the task currently running */
     56    private PleaseWaitRunnable currentTask = null;
     57
     58    /**
     59     * Constructor
     60     *
     61     * @param newLayer if the data should be downloaded into a new layer
     62     * @param ids List of primitive id to download
     63     * @param downloadReferrers if the referrers of the object should be downloaded as well,
     64     *     i.e., parent relations, and for nodes, additionally, parent ways
     65     * @param full if the members of a relation should be downloaded as well
     66     * @param monitor ProgressMonitor to use, or null to create a new one
     67     */
     68    public DownloadPrimitivesWithReferrersTask(boolean newLayer, List<PrimitiveId> ids, boolean downloadReferrers,
     69            boolean full, ProgressMonitor monitor) {
     70        super(tr("Download objects"), monitor, false);
     71        this.ids = ids;
     72        this.downloadReferrers = downloadReferrers;
     73        this.full = full;
     74        this.newLayer = newLayer;
     75        // All downloaded primitives are put in a tmpLayer
     76        tmpLayer = new OsmDataLayer(new DataSet(), OsmDataLayer.createNewName(), null);
     77        //Main.main.addLayer(tmpLayer);
     78    }
     79
     80    @Override
     81    protected void cancel() {
     82        synchronized(this) {
     83            canceled = true;
     84            if(currentTask != null)
     85                currentTask.operationCanceled();
     86        }
     87    }
     88
     89    @Override
     90    protected void realRun() throws SAXException, IOException, OsmTransferException {
     91        getProgressMonitor().setTicksCount(ids.size()+1);
     92        // First, download primitives
     93        mainTask = new DownloadPrimitivesTask(tmpLayer, ids, full, getProgressMonitor().createSubTaskMonitor(1, false));
     94        currentTask = mainTask;
     95        synchronized(this) {
     96            if(canceled) {
     97                currentTask = null;
     98                return;
     99            }
     100        }
     101        currentTask.run();
     102        // Then, download referrers for each primitive
     103        if(downloadReferrers)
     104            for(PrimitiveId id : ids) {
     105                System.out.printf("referrers task %s, canceled=%b\n", id.toString(), canceled);
     106                synchronized(this) {
     107                    if(canceled) {
     108                        currentTask = null;
     109                        return;
     110                    }
     111                }
     112                currentTask = new DownloadReferrersTask(
     113                        tmpLayer, id, getProgressMonitor().createSubTaskMonitor(1, false));
     114                currentTask.run();
     115            }
     116        currentTask = null;
     117    }
     118
     119    @Override
     120    protected void finish() {
     121        if(canceled) {
     122            // Main.map.mapView.
     123            return;
     124        }
     125        OsmDataLayer layer = Main.main.getEditLayer();
     126        if(layer == null || this.newLayer) {
     127            Main.main.addLayer(tmpLayer);
     128        } else {
     129            layer.mergeFrom(tmpLayer);
     130        }
     131        //showErrorsAndWarnings();
     132        final Set<PrimitiveId> errs = mainTask.getMissingPrimitives();
     133        if (errs != null && !errs.isEmpty())
     134            Main.main.getCurrentDataSet().setSelected(ids);
     135
     136        System.out.println("finish done");
     137    }
     138
     139    private void showErrorsAndWarnings() {
     140        // FIXME: Does all task are really finish ?
     141        System.out.printf("call to finish\n");
     142        Main.worker.submit(new Runnable() {
     143            @Override
     144            public void run() {
     145                final Set<PrimitiveId> errs = mainTask.getMissingPrimitives();
     146                if (errs != null && !errs.isEmpty()) {
     147                    try {
     148                        SwingUtilities.invokeAndWait(new Runnable() {
     149                            @Override
     150                            public void run() {
     151                                reportProblemDialog(errs,
     152                                        trn("Object could not be downloaded", "Some objects could not be downloaded", errs.size()),
     153                                        trn("One object could not be downloaded.<br>",
     154                                            "{0} objects could not be downloaded.<br>",
     155                                            errs.size(),
     156                                            errs.size())
     157                                        + tr("The server replied with response code 404.<br>"
     158                                            + "This usually means, the server does not know an object with the requested id."),
     159                                        tr("missing objects:"),
     160                                        JOptionPane.ERROR_MESSAGE
     161                                ).showDialog();
     162                            }
     163                        });
     164                    } catch (InterruptedException ex) {
     165                        Main.warn("InterruptedException while displaying error dialog");
     166                    } catch (InvocationTargetException ex) {
     167                        Main.warn(ex);
     168                    }
     169                }
     170
     171                final Set<PrimitiveId> del = new TreeSet<PrimitiveId>();
     172                DataSet ds = Main.main.getCurrentDataSet();
     173                for (PrimitiveId id : ids) {
     174                    OsmPrimitive osm = ds.getPrimitiveById(id);
     175                    if (osm != null && osm.isDeleted()) {
     176                        del.add(id);
     177                    }
     178                }
     179                if (!del.isEmpty()) {
     180                    SwingUtilities.invokeLater(new Runnable() {
     181                        @Override
     182                        public void run() {
     183                            reportProblemDialog(del,
     184                                    trn("Object deleted", "Objects deleted", del.size()),
     185                                    trn(
     186                                        "One downloaded object is deleted.",
     187                                        "{0} downloaded objects are deleted.",
     188                                        del.size(),
     189                                        del.size()),
     190                                    null,
     191                                    JOptionPane.WARNING_MESSAGE
     192                            ).showDialog();
     193                        }
     194                    });
     195                }
     196            }
     197        });
     198    }
     199
     200    private static ExtendedDialog reportProblemDialog(Set<PrimitiveId> errs,
     201            String TITLE, String TEXT, String LIST_LABEL, int msgType) {
     202        JPanel p = new JPanel(new GridBagLayout());
     203        p.add(new HtmlPanel(TEXT), GBC.eop());
     204        if (LIST_LABEL != null) {
     205            JLabel missing = new JLabel(LIST_LABEL);
     206            missing.setFont(missing.getFont().deriveFont(Font.PLAIN));
     207            p.add(missing, GBC.eol());
     208        }
     209        JosmTextArea txt = new JosmTextArea();
     210        txt.setFont(new Font("Monospaced", txt.getFont().getStyle(), txt.getFont().getSize()));
     211        txt.setEditable(false);
     212        txt.setBackground(p.getBackground());
     213        txt.setColumns(40);
     214        txt.setRows(1);
     215        txt.setText(Utils.join(", ", errs));
     216        JScrollPane scroll = new JScrollPane(txt);
     217        p.add(scroll, GBC.eop().weight(1.0, 0.0).fill(GBC.HORIZONTAL));
     218
     219        return new ExtendedDialog(
     220                Main.parent,
     221                TITLE,
     222                new String[] { tr("Ok") })
     223        .setButtonIcons(new String[] { "ok" })
     224        .setIcon(msgType)
     225        .setContent(p, false);
     226    }
     227}
     228 No newline at end of file
  • src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java

    diff --git src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java src/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandler.java
    index 9f4e0cc..3bb505e 100644
    import java.util.LinkedList; 
    77import java.util.List;
    88
    99import org.openstreetmap.josm.Main;
    10 import org.openstreetmap.josm.actions.DownloadPrimitiveAction;
    1110import org.openstreetmap.josm.data.osm.PrimitiveId;
    1211import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
    13 import org.openstreetmap.josm.gui.util.GuiHelper;
     12import org.openstreetmap.josm.gui.io.DownloadPrimitivesWithReferrersTask;
    1413import org.openstreetmap.josm.io.remotecontrol.AddTagsDialog;
    1514import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
    1615
    public class LoadObjectHandler extends RequestHandler { 
    3231    public String[] getMandatoryParams() {
    3332        return new String[]{"objects"};
    3433    }
    35    
     34
    3635    @Override
    3736    public String[] getOptionalParams() {
    3837        return new String[] {"new_layer", "addtags", "relation_members", "referrers"};
    public class LoadObjectHandler extends RequestHandler { 
    6059            final boolean newLayer = isLoadInNewLayer();
    6160            final boolean relationMembers = Boolean.parseBoolean(args.get("relation_members"));
    6261            final boolean referrers = args.containsKey("referrers") ? Boolean.parseBoolean(args.get("referrers")) : true;
    63             GuiHelper.runInEDTAndWait(new Runnable() {
    64                 @Override public void run() {
    65                     DownloadPrimitiveAction.processItems(newLayer, ps, referrers, relationMembers);
    66                 }
    67             });
    68             GuiHelper.executeByMainWorkerInEDT(new Runnable() {
     62            DownloadPrimitivesWithReferrersTask task = new DownloadPrimitivesWithReferrersTask(
     63                    newLayer, ps, referrers, relationMembers, null);
     64            Main.worker.submit(task);
     65            Main.worker.submit(new Runnable() {
    6966                @Override
    7067                public void run() {
    71                     Main.main.getCurrentDataSet().setSelected(ps);
     68                    System.out.println("task done");
    7269                    AddTagsDialog.addTags(args, sender);
    7370                    ps.clear();
    7471                }