Ignore:
Timestamp:
2017-02-26T00:59:32+01:00 (7 years ago)
Author:
Don-vip
Message:

fix #3346 - improve drastically the performance of fixing duplicate nodes by:

  • caching data sources area computation
  • moving layer invalidation from UndoRedoHandler.addNoRedraw to UndoRedoHandler.add
  • avoiding any EDT call when building tag conflict dialog if it's not meant to be displayed
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/conflict/tags/CombinePrimitiveResolverDialog.java

    r11606 r11627  
    132132     */
    133133    public void setTargetPrimitive(final OsmPrimitive primitive) {
     134        setTargetPrimitive(primitive, true);
     135    }
     136
     137    /**
     138     * Sets the primitive the collection of primitives is merged or combined to.
     139     *
     140     * @param primitive the target primitive
     141     * @param updateTitle {@code true} to call {@link #updateTitle} in EDT (can be a slow operation)
     142     * @since 11626
     143     */
     144    private void setTargetPrimitive(final OsmPrimitive primitive, boolean updateTitle) {
    134145        this.targetPrimitive = primitive;
    135         GuiHelper.runInEDTAndWait(() -> {
    136             updateTitle();
    137             if (primitive instanceof Way) {
    138                 pnlRelationMemberConflictResolver.initForWayCombining();
    139             } else if (primitive instanceof Node) {
    140                 pnlRelationMemberConflictResolver.initForNodeMerging();
    141             }
    142         });
     146        if (updateTitle) {
     147            GuiHelper.runInEDTAndWait(this::updateTitle);
     148        }
    143149    }
    144150
     
    153159            helpAction.setHelpTopic(ht("/Action/CombineWay#ResolvingConflicts"));
    154160            getRootPane().putClientProperty("help", ht("/Action/CombineWay#ResolvingConflicts"));
     161            pnlRelationMemberConflictResolver.initForWayCombining();
    155162        } else if (targetPrimitive instanceof Node) {
    156163            setTitle(tr("Conflicts when merging nodes - target node is ''{0}''", targetPrimitive
     
    158165            helpAction.setHelpTopic(ht("/Action/MergeNodes#ResolvingConflicts"));
    159166            getRootPane().putClientProperty("help", ht("/Action/MergeNodes#ResolvingConflicts"));
     167            pnlRelationMemberConflictResolver.initForNodeMerging();
    160168        }
    161169    }
     
    295303     */
    296304    public void prepareDefaultDecisions() {
    297         getTagConflictResolverModel().prepareDefaultTagDecisions();
    298         getRelationMemberConflictResolverModel().prepareDefaultRelationDecisions();
     305        prepareDefaultDecisions(true);
     306    }
     307
     308    /**
     309     * Prepares the default decisions for populated tag and relation membership conflicts.
     310     * @param fireEvent {@code true} to call {@code fireTableDataChanged} (can be a slow operation)
     311     * @since 11626
     312     */
     313    private void prepareDefaultDecisions(boolean fireEvent) {
     314        getTagConflictResolverModel().prepareDefaultTagDecisions(fireEvent);
     315        getRelationMemberConflictResolverModel().prepareDefaultRelationDecisions(fireEvent);
    299316    }
    300317
     
    501518            final CombinePrimitiveResolverDialog dialog = CombinePrimitiveResolverDialog.getInstance();
    502519
    503             dialog.getTagConflictResolverModel().populate(tagsToEdit, completeWayTags.getKeysWithMultipleValues());
    504             dialog.getRelationMemberConflictResolverModel().populate(parentRelations, primitives);
    505             dialog.prepareDefaultDecisions();
     520            dialog.getTagConflictResolverModel().populate(tagsToEdit, completeWayTags.getKeysWithMultipleValues(), false);
     521            dialog.getRelationMemberConflictResolverModel().populate(parentRelations, primitives, false);
     522            dialog.prepareDefaultDecisions(false);
    506523
    507524            // Ensure a proper title is displayed instead of a previous target (fix #7925)
    508525            if (targetPrimitives.size() == 1) {
    509                 dialog.setTargetPrimitive(targetPrimitives.iterator().next());
     526                dialog.setTargetPrimitive(targetPrimitives.iterator().next(), false);
    510527            } else {
    511                 dialog.setTargetPrimitive(null);
     528                dialog.setTargetPrimitive(null, false);
    512529            }
    513530
    514531            // Resolve tag conflicts if necessary
    515532            if (!dialog.isResolvedCompletely()) {
     533                GuiHelper.runInEDTAndWait(() -> {
     534                    dialog.getTagConflictResolverModel().fireTableDataChanged();
     535                    dialog.getRelationMemberConflictResolverModel().fireTableDataChanged();
     536                    dialog.updateTitle();
     537                });
    516538                dialog.setVisible(true);
    517539                if (!dialog.isApplied()) {
     
    520542            }
    521543            for (OsmPrimitive i : targetPrimitives) {
    522                 dialog.setTargetPrimitive(i);
     544                dialog.setTargetPrimitive(i, false);
    523545                cmds.addAll(dialog.buildResolutionCommands());
    524546            }
Note: See TracChangeset for help on using the changeset viewer.