001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.dialogs.relation.actions;
003
004import java.beans.PropertyChangeEvent;
005import java.beans.PropertyChangeListener;
006import java.util.Objects;
007
008import javax.swing.AbstractAction;
009import javax.swing.event.ListSelectionEvent;
010import javax.swing.event.ListSelectionListener;
011import javax.swing.event.TableModelEvent;
012import javax.swing.event.TableModelListener;
013
014import org.openstreetmap.josm.data.osm.DataSet;
015import org.openstreetmap.josm.data.osm.DownloadPolicy;
016import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor;
017import org.openstreetmap.josm.gui.dialogs.relation.MemberTable;
018import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel;
019import org.openstreetmap.josm.gui.dialogs.relation.SelectionTable;
020import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel;
021import org.openstreetmap.josm.gui.layer.OsmDataLayer;
022import org.openstreetmap.josm.gui.tagging.TagEditorModel;
023import org.openstreetmap.josm.io.NetworkManager;
024import org.openstreetmap.josm.io.OnlineResource;
025
026/**
027 * Abstract superclass of relation editor actions.
028 *
029 * @since 9496
030 */
031public abstract class AbstractRelationEditorAction extends AbstractAction
032        implements TableModelListener, ListSelectionListener, PropertyChangeListener {
033    private static final long serialVersionUID = 1L;
034    protected final transient IRelationEditorActionAccess editorAccess;
035
036    /**
037     * Create a new relation editor action
038     *
039     * @param editorAccess
040     *            The editor this action is for
041     * @param updateOn
042     *            The events that may cause the enabled state of this button to
043     *            change.
044     */
045    protected AbstractRelationEditorAction(IRelationEditorActionAccess editorAccess,
046            IRelationEditorUpdateOn... updateOn) {
047        Objects.requireNonNull(editorAccess, "editorAccess");
048        Objects.requireNonNull(updateOn, "updateOn");
049        this.editorAccess = editorAccess;
050        for (IRelationEditorUpdateOn u : updateOn) {
051            u.register(editorAccess, this);
052        }
053    }
054
055    /**
056     * Create a new relation editor action
057     *
058     * @param editorAccess
059     *            The editor this action is for
060     * @param actionMapKey
061     *            The key for the member table action map.
062     * @param updateOn
063     *            The events that may cause the enabled state of this button to
064     *            change.
065     */
066    protected AbstractRelationEditorAction(IRelationEditorActionAccess editorAccess, String actionMapKey,
067            IRelationEditorUpdateOn... updateOn) {
068        this(editorAccess, updateOn);
069        Objects.requireNonNull(actionMapKey, "actionMapKey");
070
071        this.editorAccess.addMemberTableAction(actionMapKey, this);
072    }
073
074    @Override
075    public void tableChanged(TableModelEvent e) {
076        updateEnabledState();
077    }
078
079    @Override
080    public void valueChanged(ListSelectionEvent e) {
081        updateEnabledState();
082    }
083
084    @Override
085    public void propertyChange(PropertyChangeEvent evt) {
086        updateEnabledState();
087    }
088
089    protected abstract void updateEnabledState();
090
091    protected final boolean canDownload() {
092        if (editorAccess.getEditor().getRelation() == null)
093            return false;
094        DataSet ds = editorAccess.getEditor().getRelation().getDataSet();
095        return !NetworkManager.isOffline(OnlineResource.OSM_API) && ds != null && !ds.isLocked()
096                && DownloadPolicy.BLOCKED != ds.getDownloadPolicy();
097    }
098
099    protected MemberTable getMemberTable() {
100        return editorAccess.getMemberTable();
101    }
102
103    protected MemberTableModel getMemberTableModel() {
104        return editorAccess.getMemberTableModel();
105    }
106
107    protected SelectionTable getSelectionTable() {
108        return editorAccess.getSelectionTable();
109    }
110
111    protected SelectionTableModel getSelectionTableModel() {
112        return editorAccess.getSelectionTableModel();
113    }
114
115    protected IRelationEditor getEditor() {
116        return editorAccess.getEditor();
117    }
118
119    protected TagEditorModel getTagModel() {
120        return editorAccess.getTagModel();
121    }
122
123    protected OsmDataLayer getLayer() {
124        return editorAccess.getEditor().getLayer();
125    }
126
127    /**
128     * Indicates that this action only visible in expert mode
129     * @return <code>true</code> for expert mode actions.
130     * @since 14027
131     */
132    public boolean isExpertOnly() {
133        return false;
134    }
135}