/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.core.ui.components;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;
import org.apache.commons.lang.StringUtils;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.ui.MenuBuilder;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.map.IMapSelection;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
/**
* Dialog with a decision that can be disabled.
*
* @author foltin
*/
public class OptionalDontShowMeAgainDialog {
public final static int BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED = 1;
public final static int ONLY_OK_SELECTION_IS_STORED = 0;
public final static int ONLY_OK_SELECTION_IS_SHOWN = 2;
static public int show( final String pMessageId, final String pTitleId,
final String pPropertyName, final int pMessageType) {
return new OptionalDontShowMeAgainDialog(pMessageId, pTitleId, pPropertyName, pMessageType).show()
.getResult();
}
// // private final Controller controller;
private JDialog mDialog;
private JCheckBox mDontShowAgainBox;
final private String mMessageId;
final private int mMessageType;
final private NodeModel mNode;
final private Frame mParent;
final private String mPropertyName;
private int mResult = JOptionPane.CANCEL_OPTION;
final private String mTitleId;
private OptionalDontShowMeAgainDialog( final String pMessageId, final String pTitleId,
final String pPropertyName, final int pMessageType) {
// this.controller = controller;
Controller controller = Controller.getCurrentController();
mParent = controller.getViewController().getFrame();
final IMapSelection selection = controller.getSelection();
if (selection != null) {
mNode = selection.getSelected();
}
else {
mNode = null;
}
mMessageId = pMessageId;
mTitleId = pTitleId;
mPropertyName = pPropertyName;
mMessageType = pMessageType;
}
private void close(final int pResult) {
mResult = pResult;
if (mDontShowAgainBox.isSelected()) {
if (mMessageType == OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED) {
if (mResult == JOptionPane.OK_OPTION) {
setProperty("true");
}
}
else {
setProperty((mResult == JOptionPane.OK_OPTION) ? "true" : "false");
}
}
else {
setProperty("");
}
mDialog.setVisible(false);
mDialog.dispose();
}
private String getProperty() {
return ResourceController.getResourceController().getProperty(mPropertyName);
}
/**
* @return an int from JOptionPane (eg. JOptionPane.OK_OPTION).
*/
private int getResult() {
return mResult;
}
private void setProperty(final String value) {
ResourceController.getResourceController().setProperty(mPropertyName, value);
}
private OptionalDontShowMeAgainDialog show() {
final String property = getProperty();
if (StringUtils.equals(property, "true")) {
mResult = JOptionPane.OK_OPTION;
return this;
}
if (mMessageType == BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED && StringUtils.equals(property, "false")) {
mResult = JOptionPane.CANCEL_OPTION;
return this;
}
mDialog = null;
mDialog = new JDialog(mParent, TextUtils.getText(mTitleId));
mDialog.setModal(true);
mDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
final AbstractAction cancelAction = new AbstractAction() {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent pE) {
close(JOptionPane.CANCEL_OPTION);
}
};
final AbstractAction okAction = new AbstractAction() {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent pE) {
close(JOptionPane.OK_OPTION);
}
};
UITools.addEscapeActionToDialog(mDialog, cancelAction);
mDialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent pE) {
close(JOptionPane.CANCEL_OPTION);
}
});
mDialog.getContentPane().setLayout(new GridBagLayout());
mDialog.getContentPane().add(
new JLabel(TextUtils.getText(mMessageId)),
new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
5, 5, 0, 0), 0, 0));
final ImageIcon questionMark;
if(mMessageType == ONLY_OK_SELECTION_IS_SHOWN){
questionMark = new ImageIcon(ResourceController.getResourceController().getResource(
"/images/icons/messagebox_warning.png"));
}
else{
questionMark = new ImageIcon(ResourceController.getResourceController().getResource(
"/images/icons/help.png"));
}
mDialog.getContentPane().add(
new JLabel(questionMark),
new GridBagConstraints(0, 0, 1, 2, 1.0, 2.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
5, 5, 0, 0), 0, 0));
String boxString;
if (mMessageType != OptionalDontShowMeAgainDialog.BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED) {
boxString = "OptionalDontShowMeAgainDialog.dontShowAgain";
}
else {
boxString = "OptionalDontShowMeAgainDialog.rememberMyDescision";
}
mDontShowAgainBox = new JCheckBox(TextUtils.getRawText(boxString));
MenuBuilder.setLabelAndMnemonic(mDontShowAgainBox, null);
mDialog.getContentPane().add(
mDontShowAgainBox,
new GridBagConstraints(0, 2, 3, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
5, 5, 0, 0), 0, 0));
final String okText;
if(mMessageType == ONLY_OK_SELECTION_IS_SHOWN){
okText = TextUtils.getRawText("ok");
}
else{
okText = TextUtils.getRawText("OptionalDontShowMeAgainDialog.ok");
}
final JButton okButton = new JButton(okText);
MenuBuilder.setLabelAndMnemonic(okButton, null);
okButton.addActionListener(okAction);
mDialog.getContentPane().add(
okButton,
new GridBagConstraints(2, 3, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
5, 5, 0, 0), 0, 0));
if(mMessageType != ONLY_OK_SELECTION_IS_SHOWN){
final JButton cancelButton = new JButton(TextUtils.getRawText("OptionalDontShowMeAgainDialog.cancel"));
MenuBuilder.setLabelAndMnemonic(cancelButton, null);
cancelButton.addActionListener(cancelAction);
mDialog.getContentPane().add(
cancelButton,
new GridBagConstraints(3, 3, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
5, 5, 0, 0), 0, 0));
}
mDialog.getRootPane().setDefaultButton(okButton);
mDialog.pack();
if (mNode != null) {
UITools.setDialogLocationRelativeTo(mDialog, mNode);
}
else {
mDialog.setLocationRelativeTo(null);
}
mDialog.setVisible(true);
return this;
}
}