Ignore:
Timestamp:
2014-10-27T23:30:49+01:00 (10 years ago)
Author:
donvip
Message:

[josm-merge_overlap] fix #josm10668 - ClassCastException while merging ways

File:
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyCombinePrimitiveResolverDialog.java

    r30714 r30766  
    4343import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecision;
    4444import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecisionType;
     45import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictResolver;
    4546import org.openstreetmap.josm.gui.conflict.tags.TagConflictResolver;
    4647import org.openstreetmap.josm.gui.conflict.tags.TagConflictResolverModel;
    4748import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
    4849import org.openstreetmap.josm.gui.help.HelpUtil;
     50import org.openstreetmap.josm.gui.util.GuiHelper;
    4951import org.openstreetmap.josm.tools.ImageProvider;
    5052import org.openstreetmap.josm.tools.WindowGeometry;
     
    5557 *
    5658 * There is a singleton instance of this dialog which can be retrieved using
    57  * {@see #getInstance()}.
     59 * {@link #getInstance()}.
    5860 *
    5961 * The dialog uses two models: one  for resolving tag conflicts, the other
    6062 * for resolving conflicts in relation memberships. For both models there are accessors,
    61  * i.e {@see #getTagConflictResolverModel()} and {@see #getRelationMemberConflictResolverModel()}.
     63 * i.e {@link #getTagConflictResolverModel()} and {@link #getRelationMemberConflictResolverModel()}.
    6264 *
    6365 * Models have to be <strong>populated</strong> before the dialog is launched. Example:
     
    7072 *
    7173 * You should also set the target primitive which other primitives (ways or nodes) are
    72  * merged to, see {@see #setTargetPrimitive(OsmPrimitive)}.
     74 * merged to, see {@link #setTargetPrimitive(OsmPrimitive)}.
    7375 *
    74  * After the dialog is closed use {@see #isCancelled()} to check whether the user canceled
    75  * the dialog. If it wasn't canceled you may build a collection of {@see Command} objects
     76 * After the dialog is closed use {@link #isCanceled()} to check whether the user canceled
     77 * the dialog. If it wasn't canceled you may build a collection of {@link Command} objects
    7678 * which reflect the conflict resolution decisions the user made in the dialog:
    77  * see {@see #buildResolutionCommands()}
    78  *
    79  *
     79 * see {@link #buildResolutionCommands()}
    8080 */
    8181public class MyCombinePrimitiveResolverDialog extends JDialog {
    8282
    8383    /** the unique instance of the dialog */
    84     static private MyCombinePrimitiveResolverDialog instance;
     84    private static MyCombinePrimitiveResolverDialog instance;
    8585
    8686    /**
     
    9191    public static MyCombinePrimitiveResolverDialog getInstance() {
    9292        if (instance == null) {
    93             instance = new MyCombinePrimitiveResolverDialog(Main.parent);
     93            GuiHelper.runInEDTAndWait(new Runnable() {
     94                @Override public void run() {
     95                    instance = new MyCombinePrimitiveResolverDialog(Main.parent);
     96                }
     97            });
    9498        }
    9599        return instance;
     
    98102    private AutoAdjustingSplitPane spTagConflictTypes;
    99103    private TagConflictResolver pnlTagConflictResolver;
    100     private MyRelationMemberConflictResolver pnlRelationMemberConflictResolver;
    101     private boolean cancelled;
     104    private RelationMemberConflictResolver pnlRelationMemberConflictResolver;
     105    private boolean canceled;
    102106    private JPanel pnlButtons;
    103107    private OsmPrimitive targetPrimitive;
     
    119123
    120124    /**
    121      * Sets the primitive the collection of primitives is merged or combined
    122      * to.
     125     * Sets the primitive the collection of primitives is merged or combined to.
    123126     *
    124127     * @param primitive the target primitive
    125128     */
    126     public void setTargetPrimitive(OsmPrimitive primitive) {
     129    public void setTargetPrimitive(final OsmPrimitive primitive) {
    127130        this.targetPrimitive = primitive;
    128         updateTitle();
    129         if (primitive instanceof Way) {
    130             pnlRelationMemberConflictResolver.initForWayCombining();
    131         } else if (primitive instanceof Node) {
    132             pnlRelationMemberConflictResolver.initForNodeMerging();
    133         }
     131        GuiHelper.runInEDTAndWait(new Runnable() {
     132            @Override public void run() {
     133                updateTitle();
     134                if (primitive instanceof Way) {
     135                    pnlRelationMemberConflictResolver.initForWayCombining();
     136                } else if (primitive instanceof Node) {
     137                    pnlRelationMemberConflictResolver.initForNodeMerging();
     138                }
     139            }
     140        });
    134141    }
    135142
     
    152159    }
    153160
    154     protected void build() {
     161    protected final void build() {
    155162        getContentPane().setLayout(new BorderLayout());
    156163        updateTitle();
     
    169176
    170177    protected JPanel buildRelationMemberConflictResolverPanel() {
    171         pnlRelationMemberConflictResolver = new MyRelationMemberConflictResolver();
     178        pnlRelationMemberConflictResolver = new RelationMemberConflictResolver(new MyRelationMemberConflictResolverModel());
    172179        return pnlRelationMemberConflictResolver;
    173180    }
    174181
    175182    protected JPanel buildButtonPanel() {
    176         JPanel pnl = new JPanel();
    177         pnl.setLayout(new FlowLayout(FlowLayout.CENTER));
     183        JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
    178184
    179185        // -- apply button
     
    196202    }
    197203
    198     public MyCombinePrimitiveResolverDialog(Component owner) {
    199         super(JOptionPane.getFrameForComponent(owner), ModalityType.DOCUMENT_MODAL);
     204    /**
     205     * Constructs a new {@code MyCombinePrimitiveResolverDialog}.
     206     * @param parent The parent component in which this dialog will be displayed.
     207     */
     208    public MyCombinePrimitiveResolverDialog(Component parent) {
     209        super(JOptionPane.getFrameForComponent(parent), ModalityType.DOCUMENT_MODAL);
    200210        build();
    201211    }
    202212
     213    /**
     214     * Replies the tag conflict resolver model.
     215     * @return The tag conflict resolver model.
     216     */
    203217    public TagConflictResolverModel getTagConflictResolverModel() {
    204218        return pnlTagConflictResolver.getModel();
    205219    }
    206220
     221    /**
     222     * Replies the relation membership conflict resolver model.
     223     * @return The relation membership conflict resolver model.
     224     */
    207225    public MyRelationMemberConflictResolverModel getRelationMemberConflictResolverModel() {
    208         return pnlRelationMemberConflictResolver.getModel();
     226        return (MyRelationMemberConflictResolverModel) pnlRelationMemberConflictResolver.getModel();
    209227    }
    210228
     
    230248
    231249        TagCollection allResolutions = getTagConflictResolverModel().getAllResolutions();
    232         if (allResolutions.size() > 0) {
     250        if (!allResolutions.isEmpty()) {
    233251            cmds.addAll(buildTagChangeCommand(targetPrimitive, allResolutions));
    234252        }
     
    279297    }
    280298
     299    /**
     300     * Prepares the default decisions for populated tag and relation membership conflicts.
     301     */
    281302    public void prepareDefaultDecisions() {
    282303        prepareDefaultTagDecisions();
     
    285306
    286307    protected JPanel buildEmptyConflictsPanel() {
    287         JPanel pnl = new JPanel();
    288         pnl.setLayout(new BorderLayout());
     308        JPanel pnl = new JPanel(new BorderLayout());
    289309        pnl.add(new JLabel(tr("No conflicts to resolve")));
    290310        return pnl;
     
    297317
    298318        if (relModel.getNumDecisions() > 0 && tagModel.getNumDecisions() > 0) {
    299             // display both, the dialog for resolving relation conflicts and for resolving
    300             // tag conflicts
     319            // display both, the dialog for resolving relation conflicts and for resolving tag conflicts
    301320            spTagConflictTypes.setTopComponent(pnlTagConflictResolver);
    302321            spTagConflictTypes.setBottomComponent(pnlRelationMemberConflictResolver);
     
    304323        } else if (relModel.getNumDecisions() > 0) {
    305324            // relation conflicts only
    306             //
    307325            getContentPane().add(pnlRelationMemberConflictResolver, BorderLayout.CENTER);
    308326        } else if (tagModel.getNumDecisions() > 0) {
    309327            // tag conflicts only
    310             //
    311328            getContentPane().add(pnlTagConflictResolver, BorderLayout.CENTER);
    312329        } else {
     
    324341    }
    325342
    326     protected void setCancelled(boolean cancelled) {
    327         this.cancelled = cancelled;
    328     }
    329 
    330     public boolean isCancelled() {
    331         return cancelled;
     343    protected void setCanceled(boolean canceled) {
     344        this.canceled = canceled;
     345    }
     346
     347    /**
     348     * Determines if this dialog has been cancelled.
     349     * @return true if this dialog has been cancelled, false otherwise.
     350     */
     351    public boolean isCanceled() {
     352        return canceled;
    332353    }
    333354
     
    338359            new WindowGeometry(getClass().getName() + ".geometry", WindowGeometry.centerInWindow(Main.parent,
    339360                    new Dimension(600, 400))).applySafe(this);
    340             setCancelled(false);
     361            setCanceled(false);
    341362            btnApply.requestFocusInWindow();
    342363        } else if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
     
    357378        @Override
    358379        public void actionPerformed(ActionEvent arg0) {
    359             setCancelled(true);
     380            setCanceled(true);
    360381            setVisible(false);
    361382        }
     
    377398        }
    378399
    379         protected void updateEnabledState() {
     400        protected final void updateEnabledState() {
    380401            setEnabled(pnlTagConflictResolver.getModel().getNumConflicts() == 0
    381402                    && pnlRelationMemberConflictResolver.getModel().getNumConflicts() == 0);
Note: See TracChangeset for help on using the changeset viewer.