001 /* 002 * Copyright 2002 - 2008 JEuclid, http://jeuclid.sf.net 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 /* $Id: ParametersDialog.java,v 613e4e95ff93 2010/02/17 13:59:15 max $ */ 018 019 package net.sourceforge.jeuclid.app.mathviewer; 020 021 import java.awt.BorderLayout; 022 import java.awt.Color; 023 import java.awt.FlowLayout; 024 import java.awt.GridBagConstraints; 025 import java.awt.GridBagLayout; 026 import java.awt.event.ActionEvent; 027 import java.awt.event.ActionListener; 028 import java.util.Collections; 029 import java.util.HashMap; 030 import java.util.List; 031 import java.util.Map; 032 033 import javax.swing.Box; 034 import javax.swing.JButton; 035 import javax.swing.JCheckBox; 036 import javax.swing.JColorChooser; 037 import javax.swing.JComboBox; 038 import javax.swing.JComponent; 039 import javax.swing.JDialog; 040 import javax.swing.JFormattedTextField; 041 import javax.swing.JLabel; 042 import javax.swing.JPanel; 043 import javax.swing.JTextField; 044 import javax.swing.WindowConstants; 045 046 import net.sourceforge.jeuclid.context.Parameter; 047 import net.sourceforge.jeuclid.context.typewrapper.BooleanTypeWrapper; 048 import net.sourceforge.jeuclid.context.typewrapper.ColorTypeWrapper; 049 import net.sourceforge.jeuclid.context.typewrapper.EnumTypeWrapper; 050 import net.sourceforge.jeuclid.context.typewrapper.NumberTypeWrapper; 051 import net.sourceforge.jeuclid.context.typewrapper.TypeWrapper; 052 import net.sourceforge.jeuclid.swing.JMathComponent; 053 054 /** 055 * Dialog that lets user see and change all Layout Parameters. 056 * 057 * @see Parameter 058 * 059 * @version $Revision: 613e4e95ff93 $ 060 */ 061 // CHECKSTYLE:OFF 062 public class ParametersDialog extends JDialog { 063 // CHECKSTYLE:ON 064 065 private static final int NUMBER_OF_COLUMNS = 5; 066 067 /** 068 * 069 */ 070 private static final long serialVersionUID = 1L; 071 072 private static final int PADDING = 30; 073 074 private static interface DataExtractor { 075 Object extractData(); 076 } 077 078 private final JMathComponent mathComponent; 079 080 // CHECKSTYLE:OFF 081 private final Map<Parameter, DataExtractor> extractors = new HashMap<Parameter, DataExtractor>(); 082 083 // CHECKSTYLE:ON 084 085 /** 086 * Initialize all the swing stuff. 087 * 088 * @param parent 089 * parent MainFrame 090 */ 091 public ParametersDialog(final MainFrame parent) { 092 super(parent); 093 this.mathComponent = parent.getMathComponent(); 094 this.init(); 095 } 096 097 private void init() { 098 099 this 100 .setTitle(Messages 101 .getString("MathViewer.ParametersDialog.title")); 102 this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 103 final JPanel paramArea = new JPanel(new GridBagLayout()); 104 this.getContentPane().add(paramArea, BorderLayout.CENTER); 105 final GridBagConstraints gbc = new GridBagConstraints(); 106 gbc.gridy = 0; 107 gbc.weightx = 1; 108 gbc.ipadx = ParametersDialog.PADDING; 109 // gbc.fill = GridBagConstraints.HORIZONTAL; 110 for (final Parameter param : Parameter.values()) { 111 final JLabel label = new JLabel(param.getOptionName()); 112 label.setToolTipText(param.getOptionDesc()); 113 gbc.gridx = 0; 114 gbc.anchor = GridBagConstraints.EAST; 115 paramArea.add(label, gbc); 116 gbc.gridx = 1; 117 gbc.anchor = GridBagConstraints.WEST; 118 paramArea.add(this.createInputForParameter(param), gbc); 119 gbc.gridy++; 120 } 121 this.setupButtonsPanel(); 122 this.setSize(this.getMinimumSize().width, 123 this.getPreferredSize().height); 124 this.setLocationByPlatform(true); 125 this.setModal(true); 126 } 127 128 private void setupButtonsPanel() { 129 final JPanel buttonsPanel = new JPanel(new FlowLayout( 130 FlowLayout.CENTER)); 131 final JButton btnSave = new JButton(Messages 132 .getString("MathViewer.save")); 133 btnSave.setMnemonic('S'); 134 btnSave.addActionListener(new ActionListener() { 135 public void actionPerformed(final ActionEvent e) { 136 final Map<Parameter, Object> newValues = new HashMap<Parameter, Object>(); 137 for (final Map.Entry<Parameter, ParametersDialog.DataExtractor> entry : ParametersDialog.this.extractors 138 .entrySet()) { 139 newValues.put(entry.getKey(), entry.getValue() 140 .extractData()); 141 } 142 ParametersDialog.this.mathComponent.setParameters(newValues); 143 ParametersDialog.this.dispose(); 144 } 145 }); 146 buttonsPanel.add(btnSave); 147 final JButton btnCancel = new JButton(Messages 148 .getString("MathViewer.cancel")); 149 btnCancel.setMnemonic('C'); 150 btnCancel.addActionListener(new ActionListener() { 151 public void actionPerformed(final ActionEvent e) { 152 ParametersDialog.this.dispose(); 153 } 154 }); 155 buttonsPanel.add(btnCancel); 156 this.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); 157 } 158 159 private JComponent createInputForParameter(final Parameter param) { 160 JComponent input = null; 161 final TypeWrapper type = param.getTypeWrapper(); 162 DataExtractor dataExtractor = null; 163 if (type instanceof BooleanTypeWrapper) { 164 final JCheckBox checkbox = new JCheckBox(); 165 Boolean val = (Boolean) this.mathComponent.getParameters() 166 .getParameter(param); 167 if (val == null) { 168 val = Boolean.FALSE; 169 } 170 checkbox.setSelected(val.booleanValue()); 171 input = checkbox; 172 dataExtractor = new DataExtractor() { 173 public Object extractData() { 174 return Boolean.valueOf(checkbox.isSelected()); 175 } 176 }; 177 } else if (type instanceof ColorTypeWrapper) { 178 final Map.Entry<? extends JComponent, ? extends ParametersDialog.DataExtractor> entry = this 179 .setupColorParameter(param); 180 input = entry.getKey(); 181 dataExtractor = entry.getValue(); 182 } else if (type instanceof EnumTypeWrapper) { 183 final Object val = this.mathComponent.getParameters() 184 .getParameter(param); 185 final JComboBox comboBox = new JComboBox(((EnumTypeWrapper) type) 186 .values()); 187 if (val != null) { 188 comboBox.setSelectedItem(val); 189 } 190 input = comboBox; 191 dataExtractor = new DataExtractor() { 192 public Object extractData() { 193 return comboBox.getSelectedItem(); 194 } 195 }; 196 } else if (type instanceof NumberTypeWrapper) { 197 final JFormattedTextField ftf = new JFormattedTextField( 198 this.mathComponent.getParameters().getParameter(param)); 199 input = ftf; 200 dataExtractor = new DataExtractor() { 201 public Object extractData() { 202 return ftf.getValue(); 203 } 204 }; 205 } else { 206 final Map.Entry<? extends JComponent, ? extends ParametersDialog.DataExtractor> entry = this 207 .setupTextParameter(param); 208 input = entry.getKey(); 209 dataExtractor = entry.getValue(); 210 } 211 input.setToolTipText(param.getOptionDesc()); 212 this.extractors.put(param, dataExtractor); 213 return input; 214 } 215 216 private Map.Entry<? extends JComponent, ? extends ParametersDialog.DataExtractor> setupColorParameter( 217 final Parameter param) { 218 Color color = (Color) this.mathComponent.getParameters() 219 .getParameter(param); 220 if (color == null) { 221 color = Color.white; 222 } 223 final JColorChooser colorChooser = new JColorChooser(color); 224 final JDialog colorChooserDialog = JColorChooser.createDialog( 225 ParametersDialog.this, Messages 226 .getString("MathViewer.ParametersDialog.pickColor"), 227 true, colorChooser, null, null); 228 final JPanel box = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); 229 box.setBackground(color); 230 final JButton btn = new JButton(Messages 231 .getString("MathViewer.ParametersDialog.showColorChooser")); 232 btn.addActionListener(new ActionListener() { 233 public void actionPerformed(final ActionEvent e) { 234 colorChooserDialog.setVisible(true); 235 box.setBackground(colorChooser.getColor()); 236 box.revalidate(); 237 } 238 }); 239 box.add(btn); 240 box.add(Box.createHorizontalStrut(ParametersDialog.PADDING)); 241 return Collections.singletonMap(box, new DataExtractor() { 242 public Object extractData() { 243 return colorChooser.getColor(); 244 } 245 }).entrySet().iterator().next(); 246 } 247 248 private Map.Entry<? extends JComponent, ? extends ParametersDialog.DataExtractor> setupTextParameter( 249 final Parameter param) { 250 final JTextField text = new JTextField(param 251 .toString(this.mathComponent.getParameters().getParameter( 252 param)), 50); 253 text.setMinimumSize(text.getPreferredSize()); 254 final Box box = Box.createHorizontalBox(); 255 box.add(text); 256 box 257 .add(Box 258 .createHorizontalStrut(ParametersDialog.NUMBER_OF_COLUMNS)); 259 final JButton btn = new JButton(Messages 260 .getString("MathViewer.ParametersDialog.showFontSelection")); 261 box.add(btn); 262 btn.addActionListener(new ActionListener() { 263 @SuppressWarnings("unchecked") 264 public void actionPerformed(final ActionEvent e) { 265 final FontSelectionDialog fsd = new FontSelectionDialog( 266 ParametersDialog.this, (List<String>) param 267 .fromString(text.getText())); 268 fsd.setVisible(true); 269 if (fsd.getFontNames().isEmpty()) { 270 text.setText(""); 271 } else { 272 text.setText(param.toString(fsd.getFontNames())); 273 } 274 } 275 }); 276 return Collections.singletonMap(box, new DataExtractor() { 277 public Object extractData() { 278 return param.fromString(text.getText()); 279 } 280 }).entrySet().iterator().next(); 281 } 282 }