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; 005import static org.openstreetmap.josm.tools.I18n.trn; 006 007import java.awt.event.ActionEvent; 008 009import javax.swing.JOptionPane; 010import javax.swing.event.DocumentEvent; 011import javax.swing.event.DocumentListener; 012 013import org.openstreetmap.josm.Main; 014import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil; 015import org.openstreetmap.josm.gui.dialogs.relation.MemberTable; 016import org.openstreetmap.josm.gui.dialogs.relation.MemberTableModel; 017import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField; 018import org.openstreetmap.josm.tools.ImageProvider; 019 020/** 021 * Sets a role for the selected members 022 * @since 9496 023 */ 024public class SetRoleAction extends AbstractRelationEditorAction implements DocumentListener { 025 026 private final transient AutoCompletingTextField tfRole; 027 028 /** 029 * Constructs a new {@code SetRoleAction}. 030 * @param memberTable member table 031 * @param memberTableModel member table model 032 * @param tfRole role text field 033 */ 034 public SetRoleAction(MemberTable memberTable, MemberTableModel memberTableModel, AutoCompletingTextField tfRole) { 035 super(memberTable, memberTableModel, null); 036 this.tfRole = tfRole; 037 putValue(SHORT_DESCRIPTION, tr("Sets a role for the selected members")); 038 putValue(SMALL_ICON, ImageProvider.get("apply")); 039 putValue(NAME, tr("Apply Role")); 040 updateEnabledState(); 041 } 042 043 @Override 044 protected void updateEnabledState() { 045 setEnabled(memberTable.getSelectedRowCount() > 0); 046 } 047 048 protected boolean isEmptyRole() { 049 return tfRole.getText() == null || tfRole.getText().trim().isEmpty(); 050 } 051 052 protected boolean confirmSettingEmptyRole(int onNumMembers) { 053 String message = "<html>" 054 + trn("You are setting an empty role on {0} object.", 055 "You are setting an empty role on {0} objects.", onNumMembers, onNumMembers) 056 + "<br>" 057 + tr("This is equal to deleting the roles of these objects.") + 058 "<br>" 059 + tr("Do you really want to apply the new role?") + "</html>"; 060 String[] options = new String[] { 061 tr("Yes, apply it"), 062 tr("No, do not apply") 063 }; 064 int ret = ConditionalOptionPaneUtil.showOptionDialog( 065 "relation_editor.confirm_applying_empty_role", 066 Main.parent, 067 message, 068 tr("Confirm empty role"), 069 JOptionPane.YES_NO_OPTION, 070 JOptionPane.WARNING_MESSAGE, 071 options, 072 options[0] 073 ); 074 switch(ret) { 075 case JOptionPane.YES_OPTION: 076 case ConditionalOptionPaneUtil.DIALOG_DISABLED_OPTION: 077 return true; 078 default: 079 return false; 080 } 081 } 082 083 @Override 084 public void actionPerformed(ActionEvent e) { 085 if (isEmptyRole() && !confirmSettingEmptyRole(memberTable.getSelectedRowCount())) { 086 return; 087 } 088 memberTableModel.updateRole(memberTable.getSelectedRows(), tfRole.getText()); 089 } 090 091 @Override 092 public void changedUpdate(DocumentEvent e) { 093 updateEnabledState(); 094 } 095 096 @Override 097 public void insertUpdate(DocumentEvent e) { 098 updateEnabledState(); 099 } 100 101 @Override 102 public void removeUpdate(DocumentEvent e) { 103 updateEnabledState(); 104 } 105}