// $Id: SettingsTabNotation.java 41 2010-04-03 20:04:12Z marcusvnac $
// Copyright (c) 1996-2008 The Regents of the University of California. All
// Rights Reserved. Permission to use, copy, modify, and distribute this
// software and its documentation without fee, and without a written
// agreement is hereby granted, provided that the above copyright notice
// and this paragraph appear in all copies. This software program and
// documentation are copyrighted by The Regents of the University of
// California. The software program and documentation are supplied "AS
// IS", without any accompanying services from The Regents. The Regents
// does not warrant that the operation of the program will be
// uninterrupted or error-free. The end-user understands that the program
// was developed for research purposes and is advised not to rely
// exclusively on the program for any reason. IN NO EVENT SHALL THE
// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
package org.argouml.notation.ui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.argouml.application.api.Argo;
import org.argouml.application.api.GUISettingsTabInterface;
import org.argouml.configuration.Configuration;
import org.argouml.configuration.ConfigurationKey;
import org.argouml.i18n.Translator;
import org.argouml.kernel.Project;
import org.argouml.kernel.ProjectManager;
import org.argouml.kernel.ProjectSettings;
import org.argouml.notation.Notation;
import org.argouml.notation.NotationName;
import org.argouml.swingext.JLinkButton;
import org.argouml.ui.ActionProjectSettings;
import org.argouml.ui.ShadowComboBox;
/**
* Settings tab panel for handling Notation settings. <p>
*
* It supports different scopes: application and project.
* The former is stored in the properties file in the user-directory,
* the latter in the project file (.zargo,...). <p>
*
* This class is written in a way that supports
* adding more scopes easily.
*
* @author Thierry Lach
* @since 0.9.4
*/
public class SettingsTabNotation
extends JPanel
implements GUISettingsTabInterface {
private JComboBox notationLanguage;
private JCheckBox showBoldNames;
private JCheckBox useGuillemots;
private JCheckBox showAssociationNames;
private JCheckBox showVisibility;
private JCheckBox showMultiplicity;
private JCheckBox showInitialValue;
private JCheckBox showProperties;
private JCheckBox showTypes;
private JCheckBox showStereotypes;
private JCheckBox showSingularMultiplicities;
private JCheckBox hideBidirectionalArrows;
private ShadowComboBox defaultShadowWidth;
private int scope;
/**
* The constructor.
* We currently support 2 scopes, but this class is written
* in a way to easily extend that.
*
* @param settingsScope the scope of the settings
*/
public SettingsTabNotation(int settingsScope) {
super();
scope = settingsScope;
setLayout(new BorderLayout());
JPanel top = new JPanel();
top.setLayout(new BorderLayout());
if (settingsScope == Argo.SCOPE_APPLICATION) {
JPanel warning = new JPanel();
warning.setLayout(new BoxLayout(warning, BoxLayout.PAGE_AXIS));
JLabel warningLabel = new JLabel(Translator
.localize("label.warning"));
warningLabel.setAlignmentX(Component.RIGHT_ALIGNMENT);
warning.add(warningLabel);
JLinkButton projectSettings = new JLinkButton();
projectSettings.setAction(new ActionProjectSettings());
projectSettings.setText(Translator
.localize("button.project-settings"));
projectSettings.setIcon(null);
projectSettings.setAlignmentX(Component.RIGHT_ALIGNMENT);
warning.add(projectSettings);
top.add(warning, BorderLayout.NORTH);
}
JPanel settings = new JPanel();
settings.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.WEST;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.gridy = 0;
constraints.gridx = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = 1.0;
constraints.insets = new Insets(0, 30, 0, 4);
constraints.gridy = GridBagConstraints.RELATIVE;
JPanel notationLanguagePanel =
new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
JLabel notationLanguageLabel =
createLabel("label.notation-language");
notationLanguage = new NotationComboBox();
notationLanguageLabel.setLabelFor(notationLanguage);
notationLanguagePanel.add(notationLanguageLabel);
notationLanguagePanel.add(notationLanguage);
settings.add(notationLanguagePanel, constraints);
showBoldNames = createCheckBox("label.show-bold-names");
settings.add(showBoldNames, constraints);
useGuillemots = createCheckBox("label.use-guillemots");
settings.add(useGuillemots, constraints);
// 2002-07-31
// Jaap Branderhorst
// from here made visibility etc. configurable
showAssociationNames = createCheckBox("label.show-associationnames");
settings.add(showAssociationNames, constraints);
showVisibility = createCheckBox("label.show-visibility");
settings.add(showVisibility, constraints);
showMultiplicity = createCheckBox("label.show-multiplicity");
settings.add(showMultiplicity, constraints);
showInitialValue = createCheckBox("label.show-initialvalue");
settings.add(showInitialValue, constraints);
showProperties = createCheckBox("label.show-properties");
settings.add(showProperties, constraints);
showTypes = createCheckBox("label.show-types");
settings.add(showTypes, constraints);
showStereotypes = createCheckBox("label.show-stereotypes");
settings.add(showStereotypes, constraints);
showSingularMultiplicities =
createCheckBox("label.show-singular-multiplicities");
settings.add(showSingularMultiplicities, constraints);
hideBidirectionalArrows =
createCheckBox("label.hide-bidirectional-arrows");
settings.add(hideBidirectionalArrows, constraints);
constraints.insets = new Insets(5, 30, 0, 4);
JPanel defaultShadowWidthPanel = new JPanel(new FlowLayout(
FlowLayout.LEFT, 5, 0));
JLabel defaultShadowWidthLabel = createLabel(
"label.default-shadow-width");
defaultShadowWidth = new ShadowComboBox();
defaultShadowWidthLabel.setLabelFor(defaultShadowWidth);
defaultShadowWidthPanel.add(defaultShadowWidthLabel);
defaultShadowWidthPanel.add(defaultShadowWidth);
settings.add(defaultShadowWidthPanel, constraints);
top.add(settings, BorderLayout.CENTER);
add(top, BorderLayout.NORTH);
}
/*
* @see org.argouml.ui.GUISettingsTabInterface#handleSettingsTabRefresh()
*/
public void handleSettingsTabRefresh() {
if (scope == Argo.SCOPE_APPLICATION) {
showBoldNames.setSelected(getBoolean(
Notation.KEY_SHOW_BOLD_NAMES));
useGuillemots.setSelected(getBoolean(
Notation.KEY_USE_GUILLEMOTS));
notationLanguage.setSelectedItem(Notation.getConfiguredNotation());
showAssociationNames.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_ASSOCIATION_NAMES, true));
showVisibility.setSelected(getBoolean(
Notation.KEY_SHOW_VISIBILITY));
showInitialValue.setSelected(getBoolean(
Notation.KEY_SHOW_INITIAL_VALUE));
showProperties.setSelected(getBoolean(
Notation.KEY_SHOW_PROPERTIES));
/*
* The next one defaults to TRUE, to stay compatible with older
* ArgoUML versions that did not have this setting:
*/
showTypes.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_TYPES, true));
showMultiplicity.setSelected(getBoolean(
Notation.KEY_SHOW_MULTIPLICITY));
showStereotypes.setSelected(getBoolean(
Notation.KEY_SHOW_STEREOTYPES));
/*
* The next one defaults to TRUE, despite that this is
* NOT compatible with older ArgoUML versions
* (before 0.24) that did
* not have this setting - see issue 1395 for the rationale:
*/
showSingularMultiplicities.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_SINGULAR_MULTIPLICITIES, true));
/*
* The next one defaults to TRUE, despite that this is
* NOT compatible with older ArgoUML versions
* (before 0.28?) that did
* not have this setting - see issue 535
*/
hideBidirectionalArrows.setSelected(Configuration.getBoolean(
Notation.KEY_HIDE_BIDIRECTIONAL_ARROWS, true));
defaultShadowWidth.setSelectedIndex(Configuration.getInteger(
Notation.KEY_DEFAULT_SHADOW_WIDTH, 1));
}
if (scope == Argo.SCOPE_PROJECT) {
Project p = ProjectManager.getManager().getCurrentProject();
ProjectSettings ps = p.getProjectSettings();
notationLanguage.setSelectedItem(Notation.findNotation(
ps.getNotationLanguage()));
showBoldNames.setSelected(ps.getShowBoldNamesValue());
useGuillemots.setSelected(ps.getUseGuillemotsValue());
showAssociationNames.setSelected(ps.getShowAssociationNamesValue());
showVisibility.setSelected(ps.getShowVisibilityValue());
showMultiplicity.setSelected(ps.getShowMultiplicityValue());
showInitialValue.setSelected(ps.getShowInitialValueValue());
showProperties.setSelected(ps.getShowPropertiesValue());
showTypes.setSelected(ps.getShowTypesValue());
showStereotypes.setSelected(ps.getShowStereotypesValue());
showSingularMultiplicities.setSelected(
ps.getShowSingularMultiplicitiesValue());
hideBidirectionalArrows.setSelected(
ps.getHideBidirectionalArrowsValue());
defaultShadowWidth.setSelectedIndex(
ps.getDefaultShadowWidthValue());
}
}
/**
* Get a boolean from the configuration.
*
* @param key a notation key.
* @return a boolean
*/
protected static boolean getBoolean(ConfigurationKey key) {
return Configuration.getBoolean(key, false);
}
/*
* @see org.argouml.ui.GUISettingsTabInterface#handleSettingsTabSave()
*/
public void handleSettingsTabSave() {
if (scope == Argo.SCOPE_APPLICATION) {
Notation.setDefaultNotation(
(NotationName) notationLanguage.getSelectedItem());
Configuration.setBoolean(Notation.KEY_SHOW_BOLD_NAMES,
showBoldNames.isSelected());
Configuration.setBoolean(Notation.KEY_USE_GUILLEMOTS,
useGuillemots.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_ASSOCIATION_NAMES,
showAssociationNames.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_VISIBILITY,
showVisibility.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_MULTIPLICITY,
showMultiplicity.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_INITIAL_VALUE,
showInitialValue.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_PROPERTIES,
showProperties.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_TYPES,
showTypes.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_STEREOTYPES,
showStereotypes.isSelected());
Configuration.setBoolean(Notation.KEY_SHOW_SINGULAR_MULTIPLICITIES,
showSingularMultiplicities.isSelected());
Configuration.setBoolean(Notation.KEY_HIDE_BIDIRECTIONAL_ARROWS,
hideBidirectionalArrows.isSelected());
Configuration.setInteger(Notation.KEY_DEFAULT_SHADOW_WIDTH,
defaultShadowWidth.getSelectedIndex());
}
if (scope == Argo.SCOPE_PROJECT) {
Project p = ProjectManager.getManager().getCurrentProject();
ProjectSettings ps = p.getProjectSettings();
NotationName nn = (NotationName) notationLanguage.getSelectedItem();
if (nn != null) ps.setNotationLanguage(nn.getConfigurationValue());
ps.setShowBoldNames(showBoldNames.isSelected());
ps.setUseGuillemots(useGuillemots.isSelected());
ps.setShowAssociationNames(showAssociationNames.isSelected());
ps.setShowVisibility(showVisibility.isSelected());
ps.setShowMultiplicity(showMultiplicity.isSelected());
ps.setShowInitialValue(showInitialValue.isSelected());
ps.setShowProperties(showProperties.isSelected());
ps.setShowTypes(showTypes.isSelected());
ps.setShowStereotypes(showStereotypes.isSelected());
ps.setShowSingularMultiplicities(
showSingularMultiplicities.isSelected());
ps.setDefaultShadowWidth(defaultShadowWidth.getSelectedIndex());
ps.setHideBidirectionalArrows(hideBidirectionalArrows.isSelected());
}
}
/*
* @see org.argouml.ui.GUISettingsTabInterface#handleSettingsTabCancel()
*/
public void handleSettingsTabCancel() {
handleSettingsTabRefresh();
}
/*
* @see org.argouml.ui.GUISettingsTabInterface#handleResetToDefault()
*/
public void handleResetToDefault() {
if (scope == Argo.SCOPE_PROJECT) {
notationLanguage.setSelectedItem(Notation.getConfiguredNotation());
showBoldNames.setSelected(getBoolean(
Notation.KEY_SHOW_BOLD_NAMES));
useGuillemots.setSelected(getBoolean(
Notation.KEY_USE_GUILLEMOTS));
showAssociationNames.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_ASSOCIATION_NAMES, true));
showVisibility.setSelected(getBoolean(
Notation.KEY_SHOW_VISIBILITY));
showMultiplicity.setSelected(getBoolean(
Notation.KEY_SHOW_MULTIPLICITY));
showInitialValue.setSelected(getBoolean(
Notation.KEY_SHOW_INITIAL_VALUE));
showProperties.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_PROPERTIES));
showTypes.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_TYPES, true));
showStereotypes.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_STEREOTYPES));
showSingularMultiplicities.setSelected(Configuration.getBoolean(
Notation.KEY_SHOW_SINGULAR_MULTIPLICITIES));
hideBidirectionalArrows.setSelected(Configuration.getBoolean(
Notation.KEY_HIDE_BIDIRECTIONAL_ARROWS, true));
defaultShadowWidth.setSelectedIndex(Configuration.getInteger(
Notation.KEY_DEFAULT_SHADOW_WIDTH, 1));
}
}
/*
* @see org.argouml.ui.GUISettingsTabInterface#getTabKey()
*/
public String getTabKey() { return "tab.notation"; }
/*
* @see org.argouml.ui.GUISettingsTabInterface#getTabPanel()
*/
public JPanel getTabPanel() { return this; }
/**
* Create a localized JCheckBox.
*
* @param key the key for the string to be localized
* @return a new checkbox with localized text
*/
protected JCheckBox createCheckBox(String key) {
JCheckBox j = new JCheckBox(Translator.localize(key));
return j;
}
/**
* Create a localized JLabel.
*
* @param key the key of the text for the label
* @return a new label with a localized text for the given key
*/
protected JLabel createLabel(String key) {
return new JLabel(Translator.localize(key));
}
/*
* @see javax.swing.JComponent#setVisible(boolean)
*/
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
handleSettingsTabRefresh();
}
}
}