/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2005 Christian Foltin.
*
*See COPYING for Details
*
*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, write to the Free Software
*Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Created on 06.05.2005
*/
package freemind.preferences.layout;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
import freemind.common.BooleanProperty;
import freemind.common.ColorProperty;
import freemind.common.ComboProperty;
import freemind.common.DontShowNotificationProperty;
import freemind.common.NextLineProperty;
import freemind.common.NumberProperty;
import freemind.common.PasswordProperty;
import freemind.common.PropertyBean;
import freemind.common.PropertyControl;
import freemind.common.RemindValueProperty;
import freemind.common.SeparatorProperty;
import freemind.common.StringProperty;
import freemind.common.TextTranslator;
import freemind.common.XmlBindingTools;
import freemind.controller.StructuredMenuHolder;
import freemind.controller.actions.generated.instance.OptionPanelWindowConfigurationStorage;
import freemind.controller.actions.generated.instance.WindowConfigurationStorage;
import freemind.main.FreeMind;
import freemind.main.FreeMindCommon;
import freemind.main.Tools;
import freemind.modes.IconInformation;
import freemind.modes.MindIcon;
import freemind.modes.MindMapNode;
import freemind.modes.ModeController;
import freemind.modes.mindmapmode.MindMapController;
import freemind.preferences.FreemindPropertyContributor;
/**
* @author foltin
*
*/
public class OptionPanel implements TextTranslator {
// TODO: Cancel and windowClose => Are you sure, or save.
// FIXME: key dialog
// FIXME: Translate me and html
private static final String TOOLTIP_EXT = ".tooltip";
private static final Color MARKED_BUTTON_COLOR = Color.BLUE;
private Vector controls;
private final JDialog frame;
private HashMap tabButtonMap = new HashMap();
private HashMap tabActionMap = new HashMap();
private String selectedPanel = null;
private static JColorChooser colorChooser;
private final OptionPanelFeedback feedback;
private static FreeMind fmMain;
private static final String PREFERENCE_STORAGE_PROPERTY = "OptionPanel_Window_Properties";
private static final String DEFAULT_LAYOUT_FORMAT = "right:max(40dlu;p), 4dlu, 120dlu, 7dlu";
/**
* @throws IOException
*
*/
public OptionPanel(FreeMind fm, JDialog frame, OptionPanelFeedback feedback) {
super();
if (fmMain == null) {
fmMain = fm;
}
this.frame = frame;
this.feedback = feedback;
// Retrieve window size and column positions.
WindowConfigurationStorage storage = XmlBindingTools.getInstance()
.decorateDialog(fm.getController(), frame,
PREFERENCE_STORAGE_PROPERTY);
if (storage != null
&& storage instanceof OptionPanelWindowConfigurationStorage) {
OptionPanelWindowConfigurationStorage oWindowSettings = (OptionPanelWindowConfigurationStorage) storage;
selectedPanel = oWindowSettings.getPanel();
}
}
public interface OptionPanelFeedback {
void writeProperties(Properties props);
}
public static Vector changeListeners = new Vector();
/**
*/
public void setProperties() {
for (Iterator i = controls.iterator(); i.hasNext();) {
PropertyControl control = (PropertyControl) i.next();
if (control instanceof PropertyBean) {
PropertyBean bean = (PropertyBean) control;
// System.out.println("grep -n -e \""+bean.getLabel()+"\" -r * |
// grep -e \"\\.(java|xml):\"");
final String label = bean.getLabel();
String value = fmMain.getAdjustableProperty(label);
// System.out.println("Setting property " + bean.getLabel()
// + " to " + value);
bean.setValue(value);
}
}
}
private Properties getOptionProperties() {
Properties p = new Properties();
for (Iterator i = controls.iterator(); i.hasNext();) {
PropertyControl control = (PropertyControl) i.next();
if (control instanceof PropertyBean) {
PropertyBean bean = (PropertyBean) control;
final String value = bean.getValue();
if (value != null)
p.setProperty(bean.getLabel(), value);
}
}
return p;
}
public void buildPanel() {
FormLayout leftLayout = new FormLayout("80dlu", "");
DefaultFormBuilder leftBuilder = new DefaultFormBuilder(leftLayout);
CardLayout cardLayout = new VariableSizeCardLayout();
JPanel rightStack = new JPanel(cardLayout);
FormLayout rightLayout = null; // add rows dynamically
DefaultFormBuilder rightBuilder = null;
String lastTabName = null;
controls = getControls();
for (Iterator i = controls.iterator(); i.hasNext();) {
PropertyControl control = (PropertyControl) i.next();
// System.out.println("layouting : " + control.getLabel());
if (control instanceof NewTabProperty) {
NewTabProperty newTab = (NewTabProperty) control;
if (rightBuilder != null) {
// terminate old panel:
rightStack.add(rightBuilder.getPanel(), lastTabName);
}
rightLayout = new FormLayout(newTab.getDescription(), "");
rightBuilder = new DefaultFormBuilder(rightLayout);
rightBuilder.setDefaultDialogBorder();
lastTabName = newTab.getLabel();
// add a button to the left side:
JButton tabButton = new JButton(getText(lastTabName));
ChangeTabAction changeTabAction = new ChangeTabAction(
cardLayout, rightStack, lastTabName);
tabButton.addActionListener(changeTabAction);
registerTabButton(tabButton, lastTabName, changeTabAction);
leftBuilder.append(tabButton);
} else {
control.layout(rightBuilder, this);
}
}
// add the last one, too
rightStack.add(rightBuilder.getPanel(), lastTabName);
// select one panel:
if (selectedPanel != null && tabActionMap.containsKey(selectedPanel)) {
((ChangeTabAction) tabActionMap.get(selectedPanel))
.actionPerformed(null);
}
JScrollPane rightScrollPane = new JScrollPane(rightStack);
rightScrollPane.getVerticalScrollBar().setUnitIncrement(100);
JSplitPane centralPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
leftBuilder.getPanel(), rightScrollPane);
frame.getContentPane().add(centralPanel, BorderLayout.CENTER);
JButton cancelButton = new JButton(getText("Cancel"));
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
closeWindow();
}
});
JButton okButton = new JButton(getText("OK"));
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
feedback.writeProperties(getOptionProperties());
closeWindow();
}
});
frame.getRootPane().setDefaultButton(okButton);
frame.getContentPane().add(
ButtonBarFactory.buildOKCancelBar(cancelButton, okButton),
BorderLayout.SOUTH);
}
private static String lastKey = "";
/**
*/
public String getText(String string) {
if (string == null)
return null;
checkConnectionToFreeMindMain();
return fmMain.getResourceString("OptionPanel." + string);
}
private static void checkConnectionToFreeMindMain() {
if (fmMain == null) {
throw new IllegalArgumentException("FreeMindMain not set yet.");
}
}
/**
*/
private void registerTabButton(JButton tabButton, String name,
ChangeTabAction changeTabAction) {
tabButtonMap.put(name, tabButton);
tabActionMap.put(name, changeTabAction);
// if no default panel was given, we use the first.
if (selectedPanel == null) {
selectedPanel = name;
}
}
private JButton getTabButton(String name) {
return (JButton) tabButtonMap.get(name);
}
private Collection getAllButtons() {
return tabButtonMap.values();
}
private final class ChangeTabAction implements ActionListener {
private CardLayout cardLayout;
private JPanel centralPanel;
private String tabName;
private ChangeTabAction(CardLayout cardLayout, JPanel centralPanel,
String tabName) {
super();
this.cardLayout = cardLayout;
this.centralPanel = centralPanel;
this.tabName = tabName;
}
public void actionPerformed(ActionEvent arg0) {
cardLayout.show(centralPanel, tabName);
// design: mark selected button with a color
Collection c = getAllButtons();
for (Iterator i = c.iterator(); i.hasNext();) {
JButton button = (JButton) i.next();
button.setForeground(null);
}
getTabButton(tabName).setForeground(MARKED_BUTTON_COLOR);
selectedPanel = tabName;
}
}
public static class NewTabProperty implements PropertyControl {
private String label;
private String layoutFormat;
public NewTabProperty(String label) {
this(label, DEFAULT_LAYOUT_FORMAT);
}
public NewTabProperty(String label, String layoutFormat) {
super();
this.label = label;
this.layoutFormat = layoutFormat;
}
public String getDescription() {
return layoutFormat;
}
public String getLabel() {
return label;
}
public void layout(DefaultFormBuilder builder,
TextTranslator pTranslator) {
}
public void setEnabled(boolean pEnabled) {
}
}
private static class KeyProperty extends PropertyBean implements
PropertyControl {
private int modifierMask = 0;
String description;
String label;
JButton mButton = new JButton();
private String labelText;
private ImageIcon icon;
private static RowSpec rowSpec;
/**
*/
public KeyProperty(final JDialog frame, String description, String label) {
super();
this.description = description;
this.label = label;
mButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// FIXME: Determine bindings.
Vector allKeybindings = new Vector();
GrabKeyDialog dialog = new GrabKeyDialog(fmMain, frame,
new GrabKeyDialog.KeyBinding(getLabel(),
getLabel(), getValue(), false),
allKeybindings, null, modifierMask);
if (dialog.isOK()) {
setValue(dialog.getShortcut());
firePropertyChangeEvent();
}
}
});
}
public void disableModifiers() {
modifierMask = KeyEvent.ALT_MASK | KeyEvent.CTRL_MASK;
}
public String getDescription() {
return description;
}
public String getLabel() {
return label;
}
public void setValue(String value) {
mButton.setText(value);
mButton.setToolTipText(mButton.getText());
}
public String getValue() {
return mButton.getText();
}
public void layout(DefaultFormBuilder builder,
TextTranslator pTranslator) {
if (labelText == null)
labelText = pTranslator.getText(getLabel());
JLabel label = new JLabel(labelText, icon, JLabel.RIGHT);
label.setToolTipText(pTranslator.getText(getDescription()));
if (rowSpec == null) {
rowSpec = new RowSpec("fill:20dlu");
}
if (3 < builder.getColumn()) {
builder.appendRelatedComponentsGapRow();
builder.appendRow(rowSpec);
builder.nextLine(2);
} else {
builder.nextColumn(2);
}
builder.add(label);
builder.nextColumn(2);
builder.add(mButton);
}
public void setEnabled(boolean pEnabled) {
mButton.setEnabled(pEnabled);
}
public void setLabelText(String labelText) {
this.labelText = labelText;
}
public void setImageIcon(ImageIcon icon) {
this.icon = icon;
}
}
//
private Vector getControls() {
Vector controls = new Vector();
/***********************************************************************
* Language
* ****************************************************************
*/
controls.add(new NewTabProperty("Environment"));
controls.add(new SeparatorProperty("language"));
// TODO: Search class path for translations.
controls.add(new ComboProperty(
/**
* For the codes see
* http://www.loc.gov/standards/iso639-2/php/English_list.php
*/
"language.tooltip", FreeMindCommon.RESOURCE_LANGUAGE,
new String[] { "automatic", "ar", "bg", "cs", "de", "dk", "en",
"el", "es", "et", "eu", "fr", "gl", "hr", "hu", "id",
"it", "ja", "ko", "lt", "nl", "nn", "nb", "pl",
"pt_BR", "pt_PT", "ro", "ru", "sk", "se", "sl", "sr",
"tr", "uk_UA", "vi", "zh_TW", "zh_CN" },
new TextTranslator() {
public String getText(String pKey) {
// decorator, that removes "TranslateMe" comments.
return Tools.removeTranslateComment(OptionPanel.this
.getText(pKey));
}
})); // automatic
controls.add(new BooleanProperty(FreeMindCommon.CHECK_SPELLING
+ TOOLTIP_EXT, FreeMindCommon.CHECK_SPELLING)); // true
// INTERNAL PROPERTY.
// controls
// .add(new StringProperty(
// "The Modes which Freemind will load on startup, full Class names,
// comma, identifier, separated by a comma.",
// "modes_since_0_8_0")); //
// freemind.modes.browsemode.BrowseMode,Browse,freemind.modes.mindmapmode.MindMapMode,MindMap,freemind.modes.filemode.FileMode,File
//
// controls.add(new StringProperty(
// "The initial mode that is loaded on startup", "initial_mode")); //
// MindMap
//
// controls
// .add(new StringProperty(
// "This is the place where the users properties file is located. It is
// ignored by the applet (set Parameters in the html file instead). You
// can write '~' to indicate the users home directory. Of course this
// works only in the default 'freemind.properties', which is included in
// the jar file, not for the users freemind.props out of the jar file.",
// "properties_folder")); // .freemind
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("proxy"));
controls.add(new BooleanProperty(FreeMind.PROXY_USE_SETTINGS
+ TOOLTIP_EXT, FreeMind.PROXY_USE_SETTINGS));
controls.add(new StringProperty(FreeMind.PROXY_HOST + TOOLTIP_EXT,
FreeMind.PROXY_HOST));
controls.add(new NumberProperty(FreeMind.PROXY_PORT + TOOLTIP_EXT,
FreeMind.PROXY_PORT, 1, 65535, 1));
controls.add(new BooleanProperty(FreeMind.PROXY_IS_AUTHENTICATED
+ TOOLTIP_EXT, FreeMind.PROXY_IS_AUTHENTICATED));
controls.add(new StringProperty(FreeMind.PROXY_USER + TOOLTIP_EXT,
FreeMind.PROXY_USER));
controls.add(new PasswordProperty(
FreeMind.PROXY_PASSWORD + TOOLTIP_EXT, FreeMind.PROXY_PASSWORD));
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("files"));
controls.add(new NumberProperty(null, "last_opened_list_length", 0,
200, 1)); // 25
controls.add(new BooleanProperty(FreeMindCommon.LOAD_LAST_MAP
+ TOOLTIP_EXT, FreeMindCommon.LOAD_LAST_MAP)); // true
controls.add(new BooleanProperty(FreeMind.RESOURCES_DON_T_OPEN_PORT
+ TOOLTIP_EXT, FreeMind.RESOURCES_DON_T_OPEN_PORT));
controls.add(new BooleanProperty(
FreeMindCommon.LOAD_LAST_MAPS_AND_LAYOUT + TOOLTIP_EXT,
FreeMindCommon.LOAD_LAST_MAPS_AND_LAYOUT)); // true
controls.add(new BooleanProperty(
"experimental_file_locking_on.tooltip", "experimental_file_locking_on")); // false
controls.add(new NextLineProperty());
controls.add(new StringProperty(null, "userproperties")); // user.properties
// FIXME: Remove autoproperties from Freemind.
// controls.add(new StringProperty(null, "autoproperties")); //
// auto.properties
controls.add(new StringProperty(null, "patternsfile")); // patterns.xml
// FIXME: Which one? controls.add(new StringProperty(
// "The URL of the documentation mindmap (.mm)", "docmapurl")); //
// ./doc/freemind.mm
// replaced by browsemode_initial_map?? (See Controller,
// DocumentationAction).
// controls.add(new StringProperty(null,
// "docmapurl_since_version_0_7_0")); // ./doc/freemind.mm
//
// The Browse Mode
//
controls.add(new StringProperty("browsemode_initial_map.tooltip",
"browsemode_initial_map")); // ./doc/freemind.mm
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("automatic_save"));
controls.add(new StringProperty("time_for_automatic_save.tooltip",
"time_for_automatic_save")); // 60000
//
controls.add(new BooleanProperty(
"delete_automatic_saves_at_exit.tooltip",
"delete_automatic_saves_at_exit")); // true
controls.add(new StringProperty(
"number_of_different_files_for_automatic_save.tooltip",
"number_of_different_files_for_automatic_save")); // 10
controls.add(new StringProperty("path_to_automatic_saves.tooltip",
"path_to_automatic_saves")); // freemind_home
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("save"));
controls.add(new BooleanProperty(
"resources_save_folding_state.tooltip",
FreeMind.RESOURCES_SAVE_FOLDING_STATE)); // false
controls.add(new BooleanProperty(
"save_only_intrisically_needed_ids.tooltip",
FreeMindCommon.SAVE_ONLY_INTRISICALLY_NEEDED_IDS)); // false
/***********************************************************************
* Defaults
* ****************************************************************
*/
controls.add(new NewTabProperty("Defaults"));
controls.add(new SeparatorProperty("default_styles"));
controls.add(new ComboProperty("standardnodestyle.tooltip",
FreeMind.RESOURCES_NODE_STYLE, MindMapNode.NODE_STYLES, this)); // as_parent
controls.add(new ComboProperty("standardrootnodestyle.tooltip",
FreeMind.RESOURCES_ROOT_NODE_STYLE, new String[] {
MindMapNode.STYLE_FORK, MindMapNode.STYLE_BUBBLE,
MindMapNode.STYLE_COMBINED }, this)); // fork
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("default_colors"));
controls.add(new ColorProperty("standardnodetextcolor.tooltip",
FreeMind.RESOURCES_NODE_TEXT_COLOR,
fmMain.getDefaultProperty(FreeMind.RESOURCES_NODE_TEXT_COLOR),
this)); // #000000
controls.add(new ColorProperty("standardedgecolor.tooltip",
FreeMind.RESOURCES_EDGE_COLOR, fmMain
.getDefaultProperty(FreeMind.RESOURCES_EDGE_COLOR),
this)); // #808080
controls.add(new ColorProperty("standardlinkcolor.tooltip",
FreeMind.RESOURCES_LINK_COLOR, fmMain
.getDefaultProperty(FreeMind.RESOURCES_LINK_COLOR),
this)); // #b0b0b0
controls.add(new ColorProperty("standardbackgroundcolor.tooltip",
FreeMind.RESOURCES_BACKGROUND_COLOR,
fmMain.getDefaultProperty(FreeMind.RESOURCES_BACKGROUND_COLOR),
this)); // #ffffff
controls.add(new BooleanProperty(
FreeMind.RESOURCE_PRINT_ON_WHITE_BACKGROUND + TOOLTIP_EXT,
FreeMind.RESOURCE_PRINT_ON_WHITE_BACKGROUND)); // true
controls.add(new ColorProperty("standardcloudcolor.tooltip",
FreeMind.RESOURCES_CLOUD_COLOR, fmMain
.getDefaultProperty(FreeMind.RESOURCES_CLOUD_COLOR),
this)); // #f0f0f0
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("default_fonts"));
controls.add(new StringProperty(
"defaultfont.tooltip", "defaultfont")); // SansSerif
controls.add(new StringProperty(null, "defaultfontstyle")); // 0
controls.add(new NumberProperty("defaultfontsize.tooltip",
"defaultfontsize", 1,
96 /* taken from openoffice as maximum. */, 1)); // 12
// controls.add(new StringProperty(null, "defaultfontsize")); // 12
controls.add(new NumberProperty("max_node_width.tooltip",
"max_node_width", 1, Integer.MAX_VALUE, 1)); // 600
controls.add(new NumberProperty("max_tooltip_width.tooltip",
"max_tooltip_width", 1, Integer.MAX_VALUE, 1)); // 600
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("other_defaults"));
controls.add(new ComboProperty("standardedgestyle.tooltip",
FreeMind.RESOURCES_EDGE_STYLE, new String[] { "bezier",
"linear" }, this)); // bezier
// controls.add(new ComboProperty(
//
// "standardcloudestyle.tooltip", "standardcloudestyle",
// new String[] { "bezier" })); // bezier
//
// controls.add(new ComboProperty(
//
// "standardlinkestyle.tooltip", "standardlinkestyle",
// new String[] { "bezier" })); // bezier
/***********************************************************************
* Appearance
* ****************************************************************
*/
controls.add(new NewTabProperty("Appearance"));
controls.add(new SeparatorProperty("look_and_feel"));
LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels();
int reservedCount = 6;
String[] lafNames = new String[lafInfo.length + reservedCount];
Vector translatedLafNames = new Vector();
lafNames[0] = "default";
translatedLafNames.add(getText("default"));
lafNames[1] = "metal";
translatedLafNames.add(getText("metal"));
lafNames[2] = "windows";
translatedLafNames.add(getText("windows"));
lafNames[3] = "motif";
translatedLafNames.add(getText("motif"));
lafNames[4] = "gtk";
translatedLafNames.add(getText("gtk"));
lafNames[5] = "nothing";
translatedLafNames.add(getText("nothing"));
for (int i = 0; i < lafInfo.length; i++) {
LookAndFeelInfo info = lafInfo[i];
String className = info.getClassName();
lafNames[i + reservedCount] = className;
translatedLafNames.add(info.getName());
}
controls.add(new ComboProperty("lookandfeel.tooltip",
FreeMind.RESOURCE_LOOKANDFEEL, lafNames, translatedLafNames)); // default
controls.add(new BooleanProperty("use_tabbed_pane.tooltip",
FreeMind.RESOURCES_USE_TABBED_PANE)); // true
controls.add(new ComboProperty(FreeMind.J_SPLIT_PANE_SPLIT_TYPE
+ TOOLTIP_EXT, FreeMind.J_SPLIT_PANE_SPLIT_TYPE,
new String[] { FreeMind.VERTICAL_SPLIT_BELOW,
FreeMind.HORIZONTAL_SPLIT_RIGHT }, this));
controls.add(new NumberProperty(
StructuredMenuHolder.AMOUNT_OF_VISIBLE_MENU_ITEMS + TOOLTIP_EXT,
StructuredMenuHolder.AMOUNT_OF_VISIBLE_MENU_ITEMS, 10,
Integer.MAX_VALUE, 1));
controls.add(new BooleanProperty(FreeMind.RESOURCES_DISPLAY_FOLDING_BUTTONS+TOOLTIP_EXT,
FreeMind.RESOURCES_DISPLAY_FOLDING_BUTTONS)); // true
// controls.add(new BooleanProperty(
//
// "use_split_pane.tooltip", FreeMind.RESOURCES_USE_SPLIT_PANE)); //
// true
/* ***************************************************************** */
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("selection_colors"));
controls.add(new BooleanProperty(
FreeMind.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION + TOOLTIP_EXT,
FreeMind.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION)); // false
controls.add(new ColorProperty(
"standardselectednoderectanglecolor.tooltip",
FreeMind.RESOURCES_SELECTED_NODE_RECTANGLE_COLOR,
fmMain.getDefaultProperty(FreeMind.RESOURCES_SELECTED_NODE_RECTANGLE_COLOR),
this)); // #000000
controls.add(new ColorProperty(
"standardselectednodecolor.tooltip",
FreeMind.RESOURCES_SELECTED_NODE_COLOR,
fmMain.getDefaultProperty(FreeMind.RESOURCES_SELECTED_NODE_COLOR),
this)); // #D2D2D2
/* ***************************************************************** */
controls.add(new NextLineProperty());
final String RESOURCE_ROOT_NODE = "root_node_appearance";
final String RESOURCE_USE_COMMON_OUT_POINT_FOR_ROOT_NODE = "use_common_out_point_for_root_node";
controls.add(new SeparatorProperty(RESOURCE_ROOT_NODE));
controls.add(new BooleanProperty(
RESOURCE_USE_COMMON_OUT_POINT_FOR_ROOT_NODE + TOOLTIP_EXT,
RESOURCE_USE_COMMON_OUT_POINT_FOR_ROOT_NODE)); // false
/* ***************************************************************** */
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("anti_alias"));
controls.add(new ComboProperty("antialias.tooltip",
FreeMindCommon.RESOURCE_ANTIALIAS, new String[] {
"antialias_edges", "antialias_all", "antialias_none" },
this)); // true
/* ***************************************************************** */
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("initial_map_size"));
controls.add(new StringProperty("mapxsize.tooltip", "mapxsize")); // 1000
controls.add(new StringProperty(null, "mapysize")); // 3200
/* ***************************************************************** */
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("hyperlink_types"));
controls.add(new ComboProperty("links.tooltip", "links", new String[] {
"relative", "absolute" }, this)); // relative
/* ***************************************************************** */
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("edit_long_node_window"));
controls.add(new StringProperty("el__buttons_position.tooltip",
"el__buttons_position")); // above
controls.add(new BooleanProperty(null, "el__position_window_below_node")); // true
controls.add(new StringProperty(null, "el__min_default_window_height")); // 150
controls.add(new StringProperty(null, "el__max_default_window_height")); // 500
controls.add(new StringProperty(null, "el__min_default_window_width")); // 600
controls.add(new StringProperty(null, "el__max_default_window_width")); // 600
controls.add(new BooleanProperty(null, "el__enter_confirms_by_default")); // true
controls.add(new BooleanProperty(null, "el__show_icon_for_attributes")); // true
controls.add(new SeparatorProperty("note_properties"));
controls.add(new BooleanProperty(null,
FreeMind.RESOURCES_DON_T_SHOW_NOTE_ICONS));
controls.add(new BooleanProperty(null,
FreeMind.RESOURCES_DON_T_SHOW_NOTE_TOOLTIPS));
controls.add(new NumberProperty(FreeMind.TOOLTIP_DISPLAY_TIME
+ ".tooltip", FreeMind.TOOLTIP_DISPLAY_TIME, 0,
Integer.MAX_VALUE, 1)); // 4000
controls.add(new SeparatorProperty("icon_properties"));
controls.add(new StringProperty("icon_order_description",
MindIcon.PROPERTY_STRING_ICONS_LIST));
/***********************************************************************
* Keystrokes
* ****************************************************************
*/
String form = "right:max(40dlu;p), 4dlu, 80dlu, 7dlu";
controls.add(new NewTabProperty("Keystrokes", form + "," + form)); // ", right:max(40dlu;p), 4dlu, 60dlu"));
//
// These are the accelerators for the menu items. Valid modifiers are:
// shift | control | alt | meta | button1 | button2 | button3
// Valid keys should be all that are defined in java.awt.event.KeyEvent
// (without the "VK_" prefix), but I found this buggy. All normal char's
// should work.
// The ideas employed in choice of keyboard shortcuts are:
// If there is a standard for a feature, use it
// Use control modifier whereever possible
// Commands for the program
controls.add(new SeparatorProperty("commands_for_the_program"));
controls.add(new KeyProperty(frame, null, "keystroke_newMap")); // control
// N
controls.add(new KeyProperty(frame, null, "keystroke_open")); // control
// O
controls.add(new KeyProperty(frame, null, "keystroke_save")); // control
// S
controls.add(new KeyProperty(frame, null, "keystroke_saveAs")); // control
// shift
// S
controls.add(new KeyProperty(frame, null, "keystroke_print")); // control
// P
controls.add(new KeyProperty(frame, null, "keystroke_close")); // control
// W
controls.add(new KeyProperty(frame, null, "keystroke_quit")); // control
// Q
controls.add(new KeyProperty(frame, null, "keystroke_option_dialog")); // control
// COMMA
controls.add(new KeyProperty(frame, null, "keystroke_export_to_html")); // control
// E
controls.add(new KeyProperty(frame, null,
"keystroke_export_branch_to_html")); // control
// H
controls.add(new KeyProperty(frame, null,
"keystroke_open_first_in_history")); // control
// shift
// W
controls.add(new KeyProperty(frame, null,
FreeMind.KEYSTROKE_PREVIOUS_MAP)); // control
// LEFT
controls.add(new KeyProperty(frame, null, FreeMind.KEYSTROKE_NEXT_MAP)); // control
// RIGHT
controls.add(new KeyProperty(frame, null,
FreeMind.KEYSTROKE_MOVE_MAP_LEFT));
controls.add(new KeyProperty(frame, null,
FreeMind.KEYSTROKE_MOVE_MAP_RIGHT));
controls.add(new KeyProperty(frame, null, "keystroke_mode_MindMap")); // alt
// 1
controls.add(new KeyProperty(frame, null, "keystroke_mode_Browse")); // alt
// 2
controls.add(new KeyProperty(frame, null, "keystroke_mode_File")); // alt
// 3
controls.add(new KeyProperty(frame, null,
"keystroke_node_toggle_italic")); // control
// I
controls.add(new KeyProperty(frame, null,
"keystroke_node_toggle_boldface")); // control
// B
controls.add(new KeyProperty(frame, null,
"keystroke_node_toggle_underlined")); // control
// U
controls.add(new KeyProperty(frame, null, "keystroke_node_toggle_cloud")); // control
// shift
// B
controls.add(new KeyProperty(frame, null, "keystroke_undo")); // control
// Z
controls.add(new KeyProperty(frame, null, "keystroke_redo")); // control
// Y
controls.add(new KeyProperty(frame, null, "keystroke_delete_child")); // DELETE
controls.add(new KeyProperty(frame, null, "keystroke_select_all")); // control
// A
controls.add(new KeyProperty(frame, null, "keystroke_select_branch")); // control
// shift A
controls.add(new KeyProperty(frame, null, "keystroke_zoom_out")); // alt
// UP
controls.add(new KeyProperty(frame, null, "keystroke_zoom_in")); // alt
// DOWN
// Node editing commands
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("node_editing_commands"));
controls.add(new KeyProperty(frame, null, "keystroke_cut")); // control
// X
controls.add(new KeyProperty(frame, null, "keystroke_copy")); // control
// C
controls.add(new KeyProperty(frame, null, "keystroke_copy_single")); // control
// shift C
controls.add(new KeyProperty(frame, null, "keystroke_paste")); // control
// V
controls.add(new KeyProperty(frame, null, "keystroke_pasteAsPlainText"));
controls.add(new KeyProperty(frame, null, "keystroke_remove")); // none
controls.add(new KeyProperty(frame, null,
"keystroke_add_arrow_link_action")); // control
// L
controls.add(new KeyProperty(frame, null,
"keystroke_add_local_link_action")); // alt
// L
// Unline with control X, the node you remove with action remove cannot
// be
// pasted again. Therefore, we do not provide any quick shortcut. We
// suggest
// that you use cut instead of remove.
// Node navigation commands
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("node_navigation_commands"));
controls.add(new KeyProperty(frame, null, "keystroke_moveToRoot")); // ESCAPE
controls.add(new KeyProperty(frame, null, "keystroke_move_up")); // E
controls.add(new KeyProperty(frame, null, "keystroke_move_down")); // D
controls.add(new KeyProperty(frame, null, "keystroke_move_left")); // S
controls.add(new KeyProperty(frame, null, "keystroke_move_right")); // F
controls.add(new KeyProperty(frame, null, "keystroke_follow_link")); // control
// ENTER
// New node commands
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("new_node_commands"));
controls.add(new KeyProperty(frame, null, "keystroke_add")); // ENTER
controls.add(new KeyProperty(frame, null, "keystroke_add_child")); // INSERT
controls.add(new KeyProperty(frame, null, "keystroke_add_child_mac")); // TAB
controls.add(new KeyProperty(frame, null,
"keystroke_add_sibling_before")); // shift
// ENTER
// Node editing commands
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("node_editing_commands"));
controls.add(new KeyProperty(frame, null, "keystroke_edit")); // F2
controls.add(new KeyProperty(frame, null, "keystroke_edit_long_node")); // alt
// ENTER
controls.add(new KeyProperty(frame, null, "keystroke_join_nodes")); // control
// J
controls.add(new KeyProperty(frame, null, "keystroke_toggle_folded")); // SPACE
controls.add(new KeyProperty(frame, null,
"keystroke_toggle_children_folded")); // control
// SPACE
controls.add(new KeyProperty(frame, null,
"keystroke_set_link_by_filechooser")); // control
// shift
// K
controls.add(new KeyProperty(frame, null,
"keystroke_set_link_by_textfield")); // control
// K
controls.add(new KeyProperty(frame, null,
"keystroke_set_image_by_filechooser")); // alt
// K
controls.add(new KeyProperty(frame, null, "keystroke_node_up")); // control
// UP
controls.add(new KeyProperty(frame, null, "keystroke_node_down")); // control
// DOWN
controls.add(new KeyProperty(frame, null,
"keystroke_node_increase_font_size")); // control
// PLUS
controls.add(new KeyProperty(frame, null,
"keystroke_node_decrease_font_size")); // control
// MINUS
// controls.add(new KeyProperty(frame, null,
// "keystroke_branch_increase_font_size")); // control
// // shift
// // PLUS
//
// controls.add(new KeyProperty(frame, null,
// "keystroke_branch_decrease_font_size")); // control
// // shift
// // MINUS
//
controls.add(new KeyProperty(frame, null, "keystroke_export_branch")); // alt
// A
//
controls.add(new KeyProperty(frame, null, "keystroke_node_color")); // alt
// F
controls.add(new KeyProperty(frame, null, "keystroke_node_color_blend")); // alt
// B
controls.add(new KeyProperty(frame, null, "keystroke_edge_color")); // alt
// E
controls.add(new KeyProperty(frame, null, "keystroke_find")); // ctrl F
controls.add(new KeyProperty(frame, null, "keystroke_find_next")); // ctrl
// G
// Apply patterns
// There is no limiting number of the pattern, you can have as many
// keystrokes for patterns as you want. The reason I do not follow to
// F10 and further in this default is that F10 has special function on
// Windows.
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("patterns"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/ManagePatterns_manage_patterns_dialog")); // control
// shift
// F1
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_1")); // F1
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_2")); // control
// shift
// N
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_3")); // F3
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_4")); // F4
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_5")); // F5
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_6")); // F6
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_7")); // F7
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_8")); // F8
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_9")); // F9
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_10")); // control
// F1
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_11")); // control
// F2
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_12")); // control
// F3
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_13")); // control
// F4
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_14")); // control
// F5
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_15")); // control
// F6
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_16")); // control
// F7
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_17")); // control
// F8
controls.add(new KeyProperty(frame, null, "keystroke_apply_pattern_18")); // control
// F9
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("others"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/ChangeNodeLevelAction_left.properties_key"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/ChangeNodeLevelAction_right.properties_key"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/FormatCopy.properties.properties_key"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/FormatPaste.properties.properties_key"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/IconSelectionPlugin.properties.properties_key"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/NewParentNode.properties_key"));
// controls.add(new KeyProperty(frame, null,
// "keystroke_accessories/plugins/NodeNote.properties_key"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/NodeNote_jumpto.keystroke.alt_N"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/NodeNote_hide_show.keystroke.control_shift_less"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/RemoveNote.properties.properties_key"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/UnfoldAll.keystroke.alt_PAGE_UP"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/UnfoldAll.keystroke.alt_PAGE_DOWN"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/UnfoldAll.keystroke.alt_HOME"));
controls.add(new KeyProperty(frame, null,
"keystroke_accessories/plugins/UnfoldAll.keystroke.alt_END"));
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("attributes"));
controls.add(new KeyProperty(frame, null, "keystroke_edit_attributes")); // control
controls.add(new KeyProperty(frame, null,
"keystroke_show_all_attributes")); // control
controls.add(new KeyProperty(frame, null,
"keystroke_show_selected_attributes")); // control
controls.add(new KeyProperty(frame, null,
"keystroke_hide_all_attributes")); // control
controls.add(new KeyProperty(frame, null,
"keystroke_show_attribute_manager")); // control
controls.add(new KeyProperty(frame, null, "keystroke_assign_attributes")); // control
controls.add(new KeyProperty(frame, null,
"keystroke_plugins/ScriptingEngine.keystroke.evaluate"));
final ModeController modeController = fmMain.getController()
.getModeController();
if (modeController instanceof MindMapController) {
MindMapController controller = (MindMapController) modeController;
Vector iconActions = controller.iconActions;
Vector actions = new Vector();
actions.addAll(iconActions);
actions.add(controller.removeLastIconAction);
actions.add(controller.removeAllIconsAction);
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("icons"));
final Iterator iterator = actions.iterator();
while (iterator.hasNext()) {
IconInformation info = (IconInformation) iterator.next();
final KeyProperty keyProperty = new KeyProperty(frame, null,
info.getKeystrokeResourceName());
keyProperty.setLabelText(info.getDescription());
keyProperty.setImageIcon(info.getIcon());
keyProperty.disableModifiers();
controls.add(keyProperty);
}
}
/***********************************************************************
* Misc ****************************************************************
*/
controls.add(new NewTabProperty("Behaviour"));
controls.add(new SeparatorProperty("behaviour"));
controls.add(new BooleanProperty("enable_node_movement.tooltip",
"enable_node_movement"));
controls.add(new BooleanProperty(FreeMind.RESOURCES_SEARCH_IN_NOTES_TOO
+ TOOLTIP_EXT, FreeMind.RESOURCES_SEARCH_IN_NOTES_TOO));
controls.add(new ComboProperty("placenewbranches.tooltip",
"placenewbranches", new String[] { "first", "last" }, this)); // last
controls.add(new BooleanProperty("draganddrop.tooltip", "draganddrop")); // true
controls.add(new BooleanProperty("unfold_on_paste.tooltip",
"unfold_on_paste")); // true
controls.add(new BooleanProperty("disable_cursor_move_paper.tooltip",
"disable_cursor_move_paper")); // false
controls.add(new BooleanProperty("enable_leaves_folding.tooltip",
"enable_leaves_folding")); // false
controls.add(new StringProperty("foldingsymbolwidth.tooltip",
"foldingsymbolwidth")); // 6
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("key_typing"));
controls.add(new BooleanProperty("disable_key_type.tooltip",
"disable_key_type")); // false
controls.add(new BooleanProperty("key_type_adds_new.tooltip",
"key_type_adds_new")); // false
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("resources_notifications"));
controls.add(new RemindValueProperty(
"remind_type_of_new_nodes.tooltip",
FreeMind.RESOURCES_REMIND_USE_RICH_TEXT_IN_NEW_LONG_NODES,
modeController));
controls.add(new DontShowNotificationProperty(
"resources_convert_to_current_version.tooltip",
FreeMind.RESOURCES_CONVERT_TO_CURRENT_VERSION));
controls.add(new RemindValueProperty(
"reload_files_without_question.tooltip",
FreeMind.RESOURCES_RELOAD_FILES_WITHOUT_QUESTION,
modeController));
controls.add(new DontShowNotificationProperty(
"delete_nodes_without_question.tooltip",
FreeMind.RESOURCES_DELETE_NODES_WITHOUT_QUESTION));
controls.add(new DontShowNotificationProperty(
"cut_nodes_without_question.tooltip",
FreeMind.RESOURCES_CUT_NODES_WITHOUT_QUESTION));
controls.add(new DontShowNotificationProperty(
"remove_notes_without_question.tooltip",
FreeMind.RESOURCES_REMOVE_NOTES_WITHOUT_QUESTION));
controls.add(new RemindValueProperty(
FreeMind.RESOURCES_COMPLETE_CLONING + ".tooltip",
FreeMind.RESOURCES_COMPLETE_CLONING, modeController));
controls.add(new DontShowNotificationProperty(
"execute_scripts_without_asking.tooltip",
FreeMind.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING));
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty(FreeMind.RESOURCES_SELECTION_METHOD));
controls.add(new ComboProperty("selection_method.tooltip",
FreeMind.RESOURCES_SELECTION_METHOD, new String[] {
"selection_method_direct", "selection_method_delayed",
"selection_method_by_click" }, this)); // selection_method_direct
controls.add(new NumberProperty("time_for_delayed_selection.tooltip",
"time_for_delayed_selection", 1, Integer.MAX_VALUE, 1)); // 500
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("mouse_wheel"));
controls.add(new NumberProperty("wheel_velocity.tooltip",
FreeMind.RESOURCES_WHEEL_VELOCITY, 1, 250, 1));
controls.add(new NextLineProperty());
controls.add(new SeparatorProperty("undo"));
controls.add(new NumberProperty("undo_levels.tooltip", "undo_levels",
2, 1000, 1));
/***********************************************************************
* WorldHello ****************************************************************
*/
controls.add(new NewTabProperty("wh_extension"));
controls.add(new SeparatorProperty("wh_nonascii_in_utf8"));
controls.add(new BooleanProperty(
"wh_nonascii_in_utf8.tooltip",
"wh_nonascii_in_utf8")); // true
controls.add(new SeparatorProperty("wh_mm_aux_file"));
controls.add(new BooleanProperty(
"wh_save_extra_attrs_in_aux_file.tooltip",
"wh_save_extra_attrs_in_aux_file")); // true
controls.add(new BooleanProperty(
"wh_separate_attr_folded",
"wh_separate_attr_folded")); // true
controls.add(new BooleanProperty(
"wh_separate_attr_created",
"wh_separate_attr_created")); // true
controls.add(new BooleanProperty(
"wh_separate_attr_modified",
"wh_separate_attr_modified")); // true
/***********************************************************************
* Browser/external apps
* ****************************************************************
*/
controls.add(new NewTabProperty("HTML"));
controls.add(new SeparatorProperty("browser"));
//
// The default browser setting
//
// For Windows (the \"\" signs are necessary due to links, that have "="
// in their URL).
// default_browser_command_windows_nt = explorer "{0}"
//
// The next setting works for the default browser, but eventually starts
// programs without questions, so be careful!
//
// default_browser_command_windows_nt = rundll32
// url.dll,FileProtocolHandler {0}
controls.add(new StringProperty(
"default_browser_command_windows_nt.tooltip",
"default_browser_command_windows_nt")); // cmd.exe
// /c
// start
// ""
// "{0}"
controls.add(new StringProperty(
"default_browser_command_windows_9x.tooltip",
"default_browser_command_windows_9x")); // command.com
// /c
// start
// "{0}"
// Dimitri proposed:
// default_browser_command_windows_9x = explorer "{0}"
//
// Here the default browser for other operating systems goes:
//
controls.add(new StringProperty(
"default_browser_command_other_os.tooltip",
"default_browser_command_other_os")); // mozilla {0}
//
controls.add(new StringProperty("default_browser_command_mac.tooltip",
"default_browser_command_mac")); // open -a
// /Applications/Safari.app {0}
controls.add(new SeparatorProperty("html_export"));
//
controls.add(new ComboProperty(
null,
"html_export_folding",
new String[] { "html_export_no_folding",
"html_export_fold_currently_folded",
"html_export_fold_all", "html_export_based_on_headings" },
this)); // html_export_fold_currently_folded
controls.add(new NextLineProperty());
controls.add(new BooleanProperty("export_icons_in_html.tooltip",
"export_icons_in_html")); // false
for (Iterator iter = sContributors.iterator(); iter.hasNext();) {
FreemindPropertyContributor contributor = (FreemindPropertyContributor) iter
.next();
controls.addAll(contributor.getControls(this));
}
return controls;
}
public void closeWindow() {
OptionPanelWindowConfigurationStorage storage = new OptionPanelWindowConfigurationStorage();
storage.setPanel(selectedPanel);
XmlBindingTools.getInstance().storeDialogPositions(
fmMain.getController(), frame, storage,
PREFERENCE_STORAGE_PROPERTY);
frame.setVisible(false);
frame.dispose();
}
private static Set sContributors = new HashSet();
public static void addContributor(FreemindPropertyContributor contributor) {
sContributors.add(contributor);
}
public static void removeContributor(FreemindPropertyContributor contributor) {
sContributors.remove(contributor);
}
}