// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.preferences;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import org.openstreetmap.josm.gui.SideButton;
import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
import org.openstreetmap.josm.gui.help.HelpUtil;
import org.openstreetmap.josm.tools.ImageProvider;
import org.openstreetmap.josm.tools.WindowGeometry;
public class PreferenceDialog extends JDialog {
private PreferenceTabbedPane tpPreferences;
private boolean canceled;
protected JPanel buildActionPanel() {
JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
pnl.add(new SideButton(new OKAction()));
pnl.add(new SideButton(new CancelAction()));
pnl.add(new SideButton(new ContextSensitiveHelpAction(HelpUtil.ht("/Action/Preferences"))));
return pnl;
}
protected void build() {
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(tpPreferences = new PreferenceTabbedPane(), BorderLayout.CENTER);
tpPreferences.buildGui();
tpPreferences.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
c.add(buildActionPanel(), BorderLayout.SOUTH);
addWindowListener(new WindowEventHandler());
getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "cancel");
getRootPane().getActionMap().put("cancel", new CancelAction());
HelpUtil.setHelpContext(getRootPane(), HelpUtil.ht("/Action/Preferences"));
}
public PreferenceDialog(Component parent) {
super(JOptionPane.getFrameForComponent(parent), tr("Preferences"), true /* modal */);
build();
}
public boolean isCanceled() {
return canceled;
}
protected void setCanceled(boolean canceled) {
this.canceled = canceled;
}
@Override
public void setVisible(boolean visible) {
if (visible) {
new WindowGeometry(
getClass().getName() + ".geometry",
WindowGeometry.centerInWindow(
getParent(),
new Dimension(600,800)
)
).applySafe(this);
} else if (!visible && isShowing()){
new WindowGeometry(this).remember(getClass().getName() + ".geometry");
}
super.setVisible(visible);
}
class CancelAction extends AbstractAction {
public CancelAction() {
putValue(NAME, tr("Cancel"));
putValue(SMALL_ICON, ImageProvider.get("cancel"));
putValue(SHORT_DESCRIPTION, tr("Close the preferences dialog and discard preference updates"));
}
public void cancel() {
setCanceled(true);
setVisible(false);
}
public void actionPerformed(ActionEvent evt) {
cancel();
}
}
class OKAction extends AbstractAction {
public OKAction() {
putValue(NAME, tr("OK"));
putValue(SMALL_ICON, ImageProvider.get("ok"));
putValue(SHORT_DESCRIPTION, tr("Save the preferences and close the dialog"));
}
public void actionPerformed(ActionEvent evt) {
tpPreferences.savePreferences();
setCanceled(false);
setVisible(false);
}
}
class WindowEventHandler extends WindowAdapter {
@Override
public void windowClosing(WindowEvent arg0) {
new CancelAction().cancel();
}
}
}