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