001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.dialogs.relation.actions; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.event.ActionEvent; 007import java.awt.event.KeyEvent; 008 009import javax.swing.JComponent; 010import javax.swing.JOptionPane; 011 012import org.openstreetmap.josm.Main; 013import org.openstreetmap.josm.data.osm.Relation; 014import org.openstreetmap.josm.gui.HelpAwareOptionPane; 015import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec; 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.layer.OsmDataLayer; 020import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener; 021import org.openstreetmap.josm.gui.tagging.TagEditorModel; 022import org.openstreetmap.josm.tools.ImageProvider; 023import org.openstreetmap.josm.tools.Shortcut; 024 025/** 026 * Refresh relation. 027 * @since 9657 028 */ 029public class RefreshAction extends SavingAction implements CommandQueueListener { 030 031 /** 032 * Constructs a new {@code RefreshAction}. 033 * @param memberTable member table 034 * @param memberTableModel member table model 035 * @param layer OSM data layer 036 * @param editor relation editor 037 * @param tagModel tag editor model 038 */ 039 public RefreshAction(MemberTable memberTable, MemberTableModel memberTableModel, TagEditorModel tagModel, OsmDataLayer layer, 040 IRelationEditor editor) { 041 super(memberTable, memberTableModel, tagModel, layer, editor, null); 042 // CHECKSTYLE.OFF: LineLength 043 Shortcut sc = Shortcut.registerShortcut("relationeditor:refresh", tr("Relation Editor: Refresh"), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE); 044 // CHECKSTYLE.ON: LineLength 045 putValue(SHORT_DESCRIPTION, Main.platform.makeTooltip(tr("Refresh relation from data layer"), sc)); 046 putValue(SMALL_ICON, ImageProvider.get("dialogs/refresh")); 047 putValue(NAME, tr("Refresh")); 048 if (editor instanceof JComponent) { 049 ((JComponent) editor).getRootPane().getActionMap().put("refresh", this); 050 ((JComponent) editor).getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(sc.getKeyStroke(), "refresh"); 051 } 052 Main.main.undoRedo.addCommandQueueListener(this); 053 updateEnabledState(); 054 } 055 056 @Override 057 public void actionPerformed(ActionEvent e) { 058 Relation relation = editor.getRelation(); 059 if (relation == null) 060 return; 061 if (relation.isDeleted()) { 062 if (confirmCloseDeletedRelation() == 0) { 063 hideEditor(); 064 } 065 return; 066 } 067 if (isEditorDirty() && confirmDiscardDirtyData() != 0) 068 return; 069 editor.reloadDataFromRelation(); 070 } 071 072 @Override 073 public void updateEnabledState() { 074 Relation relation = editor.getRelation(); 075 Relation snapshot = editor.getRelationSnapshot(); 076 setEnabled(snapshot != null && ( 077 !relation.hasEqualTechnicalAttributes(snapshot) || 078 !relation.hasEqualSemanticAttributes(snapshot) 079 )); 080 } 081 082 protected int confirmDiscardDirtyData() { 083 ButtonSpec[] options = new ButtonSpec[] { 084 new ButtonSpec( 085 tr("Yes, discard changes and reload"), 086 ImageProvider.get("ok"), 087 tr("Click to discard the changes and reload data from layer"), 088 null /* no specific help topic */ 089 ), 090 new ButtonSpec( 091 tr("Cancel, continue editing"), 092 ImageProvider.get("cancel"), 093 tr("Click to return to the relation editor and to resume relation editing"), 094 null /* no specific help topic */ 095 ) 096 }; 097 098 return HelpAwareOptionPane.showOptionDialog( 099 Main.parent, 100 tr("<html>You have unsaved changes in this editor window.<br>"+ 101 "<br>Do you want to discard these changes and reload data from layer?</html>"), 102 tr("Unsaved changes"), 103 JOptionPane.WARNING_MESSAGE, 104 null, 105 options, 106 options[1], // Cancel is default 107 "/Dialog/RelationEditor#Reload" 108 ); 109 } 110 111 protected int confirmCloseDeletedRelation() { 112 ButtonSpec[] options = new ButtonSpec[] { 113 new ButtonSpec( 114 tr("Yes"), 115 ImageProvider.get("ok"), 116 tr("Click to close window"), 117 null /* no specific help topic */ 118 ), 119 new ButtonSpec( 120 tr("No, continue editing"), 121 ImageProvider.get("cancel"), 122 tr("Click to return to the relation editor and to resume relation editing"), 123 null /* no specific help topic */ 124 ) 125 }; 126 127 return HelpAwareOptionPane.showOptionDialog( 128 Main.parent, 129 tr("<html>Relation has been deleted outside editor.<br><br>Do you want to close this window?</html>"), 130 tr("Deleted relation"), 131 JOptionPane.WARNING_MESSAGE, 132 null, 133 options, 134 options[0], // Yes is default 135 "/Dialog/RelationEditor#Reload" 136 ); 137 } 138 139 @Override 140 public void commandChanged(int queueSize, int redoSize) { 141 updateEnabledState(); 142 } 143}