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}