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; 007 008import javax.swing.JOptionPane; 009import javax.swing.RootPaneContainer; 010 011import org.openstreetmap.josm.Main; 012import org.openstreetmap.josm.data.osm.Relation; 013import org.openstreetmap.josm.gui.HelpAwareOptionPane; 014import org.openstreetmap.josm.gui.HelpAwareOptionPane.ButtonSpec; 015import org.openstreetmap.josm.gui.dialogs.relation.MemberTable; 016import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel; 017import org.openstreetmap.josm.gui.dialogs.relation.IRelationEditor; 018import org.openstreetmap.josm.gui.layer.OsmDataLayer; 019import org.openstreetmap.josm.gui.tagging.TagEditorModel; 020import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 021import org.openstreetmap.josm.tools.ImageProvider; 022import org.openstreetmap.josm.tools.InputMapUtils; 023 024/** 025 * Cancel the updates and close the dialog 026 * @since 9496 027 */ 028public class CancelAction extends SavingAction { 029 030 /** 031 * Constructs a new {@code CancelAction}. 032 * @param memberTable member table 033 * @param memberTableModel member table model 034 * @param tagModel tag editor model 035 * @param layer OSM data layer 036 * @param editor relation editor 037 * @param tfRole role text field 038 */ 039 public CancelAction(MemberTable memberTable, MemberTableModel memberTableModel, TagEditorModel tagModel, OsmDataLayer layer, 040 IRelationEditor editor, AutoCompletingTextField tfRole) { 041 super(memberTable, memberTableModel, tagModel, layer, editor, tfRole); 042 putValue(SHORT_DESCRIPTION, tr("Cancel the updates and close the dialog")); 043 new ImageProvider("cancel").getResource().attachImageIcon(this); 044 putValue(NAME, tr("Cancel")); 045 046 if (editor instanceof RootPaneContainer) { 047 InputMapUtils.addEscapeAction(((RootPaneContainer) editor).getRootPane(), this); 048 } 049 setEnabled(true); 050 } 051 052 @Override 053 public void actionPerformed(ActionEvent e) { 054 memberTable.stopHighlighting(); 055 Relation snapshot = editor.getRelationSnapshot(); 056 if ((!memberTableModel.hasSameMembersAs(snapshot) || tagModel.isDirty()) 057 && !(snapshot == null && tagModel.getTags().isEmpty())) { 058 //give the user a chance to save the changes 059 int ret = confirmClosingByCancel(); 060 if (ret == 0) { //Yes, save the changes 061 //copied from OKAction.run() 062 Main.pref.put("relation.editor.generic.lastrole", tfRole.getText()); 063 if (!applyChanges()) 064 return; 065 } else if (ret == 2 || ret == JOptionPane.CLOSED_OPTION) //Cancel, continue editing 066 return; 067 //in case of "No, discard", there is no extra action to be performed here. 068 } 069 hideEditor(); 070 } 071 072 protected int confirmClosingByCancel() { 073 ButtonSpec[] options = new ButtonSpec[] { 074 new ButtonSpec( 075 tr("Yes, save the changes and close"), 076 ImageProvider.get("ok"), 077 tr("Click to save the changes and close this relation editor"), 078 null /* no specific help topic */ 079 ), 080 new ButtonSpec( 081 tr("No, discard the changes and close"), 082 ImageProvider.get("cancel"), 083 tr("Click to discard the changes and close this relation editor"), 084 null /* no specific help topic */ 085 ), 086 new ButtonSpec( 087 tr("Cancel, continue editing"), 088 ImageProvider.get("cancel"), 089 tr("Click to return to the relation editor and to resume relation editing"), 090 null /* no specific help topic */ 091 ) 092 }; 093 094 return HelpAwareOptionPane.showOptionDialog( 095 Main.parent, 096 tr("<html>The relation has been changed.<br><br>Do you want to save your changes?</html>"), 097 tr("Unsaved changes"), 098 JOptionPane.WARNING_MESSAGE, 099 null, 100 options, 101 options[0], // OK is default, 102 "/Dialog/RelationEditor#DiscardChanges" 103 ); 104 } 105}