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        DataSet ds = editorAccess.getEditor().getLayer().getDataSet();
093        return !NetworkManager.isOffline(OnlineResource.OSM_API) && ds != null && !ds.isLocked()
094                && DownloadPolicy.BLOCKED != ds.getDownloadPolicy();
095    }
096
097    protected MemberTable getMemberTable() {
098        return editorAccess.getMemberTable();
099    }
100
101    protected MemberTableModel getMemberTableModel() {
102        return editorAccess.getMemberTableModel();
103    }
104
105    protected SelectionTable getSelectionTable() {
106        return editorAccess.getSelectionTable();
107    }
108
109    protected SelectionTableModel getSelectionTableModel() {
110        return editorAccess.getSelectionTableModel();
111    }
112
113    protected IRelationEditor getEditor() {
114        return editorAccess.getEditor();
115    }
116
117    protected TagEditorModel getTagModel() {
118        return editorAccess.getTagModel();
119    }
120
121    protected OsmDataLayer getLayer() {
122        return editorAccess.getEditor().getLayer();
123    }
124
125    /**
126     * Indicates that this action only visible in expert mode
127     * @return <code>true</code> for expert mode actions.
128     * @since 14027
129     */
130    public boolean isExpertOnly() {
131        return false;
132    }
133}