/*
* Freeplane - mind map editor
* Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
*
* This file is modified by Dimitry Polivaev in 2008.
*
* 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.resources.components;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Properties;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.resources.components.OptionPanel.IOptionPanelFeedback;
import org.freeplane.core.ui.AFreeplaneAction;
import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.TextUtils;
/**
* @author foltin
*/
public class PropertyAction extends AFreeplaneAction {
/**
*
*/
private static final long serialVersionUID = 1L;
private final DefaultMutableTreeNode controls;
/**
* @param controls
*
*/
public PropertyAction( final DefaultMutableTreeNode controls) {
super("PropertyAction");
this.controls = controls;
}
public void actionPerformed(final ActionEvent e) {
JDialog dialog = null;
if(e != null){
final Object source = e.getSource();
if(source instanceof Component){
final Window window = SwingUtilities.getWindowAncestor((Component) source);
if(window instanceof Dialog){
dialog= new JDialog((Dialog)window, true /* modal */);
}
else if(window instanceof Frame){
dialog= new JDialog((Frame)window, true /* modal */);
}
}
}
if(dialog == null)
dialog= new JDialog(UITools.getFrame(), true /* modal */);
dialog.setResizable(true);
dialog.setUndecorated(false);
final OptionPanel options = new OptionPanel(dialog, new IOptionPanelFeedback() {
public void writeProperties(final Properties props) {
boolean propertiesChanged = false;
for (final Object keyObject : props.keySet()) {
final String key = keyObject.toString();
final String newProperty = props.getProperty(key);
propertiesChanged = propertiesChanged
|| !newProperty.equals(ResourceController.getResourceController().getProperty(key));
ResourceController.getResourceController().setProperty(key, newProperty);
}
if (propertiesChanged) {
JOptionPane.showMessageDialog(UITools.getFrame(), TextUtils
.getText("option_changes_may_require_restart"));
ResourceController.getResourceController().saveProperties();
}
}
});
final String marshalled = ResourceController.getResourceController().getProperty(
OptionPanel.PREFERENCE_STORAGE_PROPERTY);
final OptionPanelWindowConfigurationStorage storage = OptionPanelWindowConfigurationStorage.decorateDialog(
marshalled, dialog);
if (storage != null) {
options.setSelectedPanel(storage.getPanel());
}
options.buildPanel(controls);
options.setProperties();
final String title = TextUtils.getText("PropertyAction.dialog");
dialog.setTitle(title);
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(final WindowEvent event) {
options.closeWindow();
}
});
final Action action = new AbstractAction() {
/**
*
*/
private static final long serialVersionUID = 1L;
public void actionPerformed(final ActionEvent arg0) {
options.closeWindow();
}
};
UITools.addEscapeActionToDialog(dialog, action);
if (storage == null) {
dialog.pack();
}
dialog.setVisible(true);
}
@Override
public void afterMapChange(final Object newMap) {
}
}