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.Main; 015import org.openstreetmap.josm.data.osm.DataSet; 016import org.openstreetmap.josm.data.osm.DownloadPolicy; 017import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor; 018import org.openstreetmap.josm.gui.dialogs.relation.MemberTable; 019import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel; 020import org.openstreetmap.josm.gui.dialogs.relation.SelectionTable; 021import org.openstreetmap.josm.gui.dialogs.relation.SelectionTableModel; 022import org.openstreetmap.josm.gui.layer.OsmDataLayer; 023import org.openstreetmap.josm.gui.tagging.TagEditorModel; 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 !Main.isOffline(OnlineResource.OSM_API) && ds != null && !ds.isLocked() 096 && !DownloadPolicy.BLOCKED.equals(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}