001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.actions; 003 004import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 005import static org.openstreetmap.josm.tools.I18n.tr; 006 007import java.awt.Dialog.ModalityType; 008import java.awt.event.ActionEvent; 009import java.io.File; 010 011import javax.swing.AbstractAction; 012import javax.swing.Box; 013import javax.swing.JCheckBox; 014import javax.swing.JDialog; 015import javax.swing.JOptionPane; 016 017import org.openstreetmap.josm.Main; 018import org.openstreetmap.josm.gui.layer.Layer; 019import org.openstreetmap.josm.gui.widgets.JosmTextField; 020import org.openstreetmap.josm.tools.ImageProvider; 021 022/** 023 * Action to rename an specific layer. Provides the option to rename the 024 * file, this layer was loaded from as well (if it was loaded from a file). 025 * 026 * @author Imi 027 */ 028public class RenameLayerAction extends AbstractAction { 029 030 private final File file; 031 private final transient Layer layer; 032 033 /** 034 * Constructs a new {@code RenameLayerAction}. 035 * @param file The file of the original location of this layer. 036 * If null, no possibility to "rename the file as well" is provided. 037 * @param layer layer to rename 038 */ 039 public RenameLayerAction(File file, Layer layer) { 040 super(tr("Rename layer"), ImageProvider.get("dialogs", "edit")); 041 this.file = file; 042 this.layer = layer; 043 this.putValue("help", ht("/Action/RenameLayer")); 044 } 045 046 @Override 047 public void actionPerformed(ActionEvent e) { 048 Box panel = Box.createVerticalBox(); 049 final JosmTextField name = new JosmTextField(layer.getName()); 050 panel.add(name); 051 JCheckBox filerename = new JCheckBox(tr("Also rename the file")); 052 panel.add(filerename); 053 filerename.setEnabled(file != null); 054 if (filerename.isEnabled()) { 055 filerename.setSelected(Main.pref.getBoolean("layer.rename-file", true)); 056 } 057 058 final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION) { 059 @Override public void selectInitialValue() { 060 name.requestFocusInWindow(); 061 name.selectAll(); 062 } 063 }; 064 final JDialog dlg = optionPane.createDialog(Main.parent, tr("Rename layer")); 065 dlg.setModalityType(ModalityType.DOCUMENT_MODAL); 066 dlg.setVisible(true); 067 068 Object answer = optionPane.getValue(); 069 if (answer == null || answer == JOptionPane.UNINITIALIZED_VALUE || 070 (answer instanceof Integer && (Integer) answer != JOptionPane.OK_OPTION)) 071 return; 072 073 String nameText = name.getText(); 074 if (filerename.isEnabled()) { 075 Main.pref.put("layer.rename-file", filerename.isSelected()); 076 if (filerename.isSelected()) { 077 String newname = nameText; 078 if (newname.indexOf('/') == -1 && newname.indexOf('\\') == -1) { 079 newname = file.getParent() + File.separator + newname; 080 } 081 String oldname = file.getName(); 082 if (name.getText().indexOf('.') == -1 && oldname.indexOf('.') >= 0) { 083 newname += oldname.substring(oldname.lastIndexOf('.')); 084 } 085 File newFile = new File(newname); 086 if (Main.platform.rename(file, newFile)) { 087 layer.setAssociatedFile(newFile); 088 nameText = newFile.getName(); 089 } else { 090 JOptionPane.showMessageDialog( 091 Main.parent, 092 tr("Could not rename file ''{0}''", file.getPath()), 093 tr("Error"), 094 JOptionPane.ERROR_MESSAGE 095 ); 096 return; 097 } 098 } 099 } 100 layer.setName(nameText); 101 Main.parent.repaint(); 102 } 103}