001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import javax.swing.AbstractAction;
005import javax.swing.event.ListSelectionEvent;
006import javax.swing.event.ListSelectionListener;
007import javax.swing.event.TableModelEvent;
008import javax.swing.event.TableModelListener;
009
010import org.openstreetmap.josm.Main;
011import org.openstreetmap.josm.data.osm.DataSet;
012import org.openstreetmap.josm.data.osm.DownloadPolicy;
013import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
014import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
015import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
016import org.openstreetmap.josm.gui.layer.OsmDataLayer;
017import org.openstreetmap.josm.io.OnlineResource;
018
019/**
020 * Abstract superclass of relation editor actions.
021 * @since 9496
022 */
023public abstract class AbstractRelationEditorAction extends AbstractAction implements TableModelListener, ListSelectionListener {
024    protected final MemberTable memberTable;
025    protected final MemberTableModel memberTableModel;
026    protected final transient OsmDataLayer layer;
027    protected final transient IRelationEditor editor;
028
029    protected AbstractRelationEditorAction(MemberTable memberTable, MemberTableModel memberTableModel, String actionMapKey) {
030        this(memberTable, memberTableModel, actionMapKey, null, null);
031    }
032
033    protected AbstractRelationEditorAction(MemberTable memberTable, MemberTableModel memberTableModel, String actionMapKey,
034            OsmDataLayer layer, IRelationEditor editor) {
035        this.memberTable = memberTable;
036        this.memberTableModel = memberTableModel;
037        this.layer = layer;
038        this.editor = editor;
039        if (actionMapKey != null) {
040            this.memberTable.getActionMap().put(actionMapKey, this);
041        }
042    }
043
044    @Override
045    public void tableChanged(TableModelEvent e) {
046        updateEnabledState();
047    }
048
049    @Override
050    public void valueChanged(ListSelectionEvent e) {
051        updateEnabledState();
052    }
053
054    protected abstract void updateEnabledState();
055
056    protected final boolean canDownload() {
057        if (editor.getRelation() == null)
058            return false;
059        DataSet ds = editor.getRelation().getDataSet();
060        return !Main.isOffline(OnlineResource.OSM_API)
061            && ds != null && !ds.isLocked() && !DownloadPolicy.BLOCKED.equals(ds.getDownloadPolicy());
062    }
063}