Source code: com/fm/gui/fmSettingsDialog.java
1 /****************************************************************************
2 * Copyright (c) 2003 Andrew Duka | aduka@users.sourceforge.net
3 * All right reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 ****************************************************************************/
11 package com.fm.gui;
12
13 import com.fm.rss.ChannelStorage;
14 import com.fm.rss.rssParseException;
15
16 import javax.swing.*;
17 import java.util.ResourceBundle;
18 import java.util.Properties;
19 import java.awt.event.*;
20 import java.awt.*;
21 import java.io.IOException;
22 import java.io.File;
23
24 /**
25 * feedMan settings dialog
26 */
27 public class fmSettingsDialog extends JDialog
28 {
29 private static final int PREFFERED_WIDTH = 430;
30 private fmFrame parent;
31 /**
32 * Default constructor
33 */
34 public fmSettingsDialog(fmFrame p, Properties props)
35 {
36 super();
37
38 setTitle(fmUITheme.getString("dialog.edit_settings"));
39
40 //Dimension prefferedDimension = new Dimension(400,300);
41
42 parent = p;
43 setLocationRelativeTo(p);
44
45
46 Container contentPane = this.getContentPane();
47 contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
48
49 // Tabbed Pane
50 final JTabbedPane setsPagesPane = new JTabbedPane();
51
52 setsPagesPane.setTabPlacement(JTabbedPane.TOP);
53 setsPagesPane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
54 //setsPagesPane.setBorder(fmUITheme.FM_BUTTON_BORDER);
55
56 // Fonts
57 fontsPanel fontSettings = new fontsPanel(props);
58 fontSettings.setToolTipText(fmUITheme.getString("pane.appearance.tooltip"));
59 setsPagesPane.addTab(fmUITheme.getString("pane.appearance.label"), fontSettings);
60
61 // Browser Settings
62 browserSettingsPanel browserSettings = new browserSettingsPanel(props);
63 browserSettings.setToolTipText(fmUITheme.getString("pane.browser.tooltip"));
64 setsPagesPane.addTab(fmUITheme.getString("pane.browser.label"), browserSettings);
65 setsPagesPane.setAlignmentX(RIGHT_ALIGNMENT);
66
67
68 contentPane.add(setsPagesPane);
69
70
71 // bottom row buttons
72 JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
73 bottomPanel.setAlignmentX(RIGHT_ALIGNMENT);
74
75
76 // APPLY
77 JButton brButton = fmUITheme.getButtonInstance("button.ok_settings.label",
78 "button.ok_settings.tooltip",
79 KeyEvent.VK_O);
80 brButton.addActionListener(new ActionListener() {
81 public void actionPerformed(ActionEvent e)
82 {
83 for (int i=0,n = setsPagesPane.getTabCount(); i < n; i++)
84 {
85 JPanel p = (JPanel) setsPagesPane.getComponentAt(i);
86 if (p instanceof SettingsPanel) {
87 try {
88 ((SettingsPanel)p).apply();
89 }
90 catch (Exception ae) {
91 ae.printStackTrace();
92 }
93
94 }
95 }
96 parent.performLookAndFeelUpdate();
97 setVisible(false);
98 }
99
100 });
101 bottomPanel.add(brButton);
102
103
104 brButton = fmUITheme.getButtonInstance("button.apply.label",
105 "button.apply.tooltip",
106 KeyEvent.VK_A);
107 brButton.addActionListener(new ActionListener() {
108 public void actionPerformed(ActionEvent e)
109 {
110 JPanel p = (JPanel) setsPagesPane.getSelectedComponent();
111 if (p instanceof SettingsPanel) {
112 ((SettingsPanel)p).apply();
113 parent.performLookAndFeelUpdate();
114 }
115 }
116
117 });
118 bottomPanel.add(brButton);
119
120
121 // CANCEL
122 brButton = fmUITheme.getButtonInstance("button.cancel.label",
123 "button.cancel.tooltip",
124 KeyEvent.VK_C);
125 brButton.addActionListener(new ActionListener() {
126 public void actionPerformed(ActionEvent e)
127 {
128 dispose();
129 }
130
131 });
132 bottomPanel.add(brButton);
133
134 contentPane.add(Box.createVerticalStrut(10));
135 contentPane.add(bottomPanel);
136
137 addWindowListener(new WindowAdapter() {
138 public void windowClosing(WindowEvent e)
139 {
140 dispose();
141 }
142 });
143
144
145
146 }
147
148 // Defines apply method which must be supported by all settings panels
149 private interface SettingsPanel {
150 /** Apply current settings */
151 public void apply();
152 }
153
154
155
156 /**
157 * Panel with font settings
158 */
159 private class fontsPanel extends JPanel implements SettingsPanel
160 {
161 Properties runtimeProperties;
162 JComboBox treeFontFamily;
163 JComboBox treeFontSize;
164
165 JComboBox contentFontFamily;
166 JComboBox contentFontSize;
167
168 JComboBox headersFontFamily;
169 JComboBox headersFontSize;
170
171 public fontsPanel(Properties runP) {
172
173 super();
174 super.setPreferredSize(new Dimension(PREFFERED_WIDTH,250));
175 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
176 super.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
177
178 String[] fontFamilies = new String[]{"Serif","SansSerif", "Monospaced"};
179 Integer[] fontSizes = new Integer[]{new Integer(5),
180 new Integer(7),
181 new Integer(9),
182 new Integer(10),
183 new Integer(12),
184 new Integer(13),
185 new Integer(14),
186 new Integer(15),
187 new Integer(17),
188 new Integer(19),
189 new Integer(22)};
190
191
192
193 runtimeProperties = runP;
194
195 JPanel treeFontPanel = new JPanel();
196 treeFontPanel.setBorder(BorderFactory.createTitledBorder(fmUITheme.getString("label.tree_font")));
197 treeFontPanel.setLayout(new BoxLayout(treeFontPanel, BoxLayout.X_AXIS));
198
199 treeFontFamily = new JComboBox(fontFamilies);
200 treeFontFamily.setMaximumSize(treeFontFamily.getPreferredSize());
201 treeFontFamily.setSelectedItem(fmUITheme.TREE_FONT.getFamily());
202
203 treeFontSize = new JComboBox(fontSizes);
204 treeFontSize.setMaximumSize(treeFontSize.getPreferredSize());
205 treeFontSize.setSelectedItem(new Integer(fmUITheme.TREE_FONT.getSize()));
206
207
208
209 treeFontPanel.add(Box.createHorizontalStrut(5));
210 treeFontPanel.add(new JLabel(fmUITheme.getString("label.family")));
211 treeFontPanel.add(Box.createHorizontalStrut(3));
212
213 treeFontPanel.add(treeFontFamily);
214 treeFontPanel.add(Box.createHorizontalStrut(15));
215 //treeFontPanel.add(treeFontFace);
216 treeFontPanel.add(new JLabel(fmUITheme.getString("label.size")));
217 treeFontPanel.add(Box.createHorizontalStrut(3));
218 treeFontPanel.add(treeFontSize);
219 treeFontPanel.add(new JLabel(" " + fmUITheme.getString("label.pixels")));
220 treeFontPanel.add(Box.createHorizontalGlue());
221 treeFontPanel.add(Box.createVerticalGlue());
222
223 // ADD TREE FONT PANEL
224 add(treeFontPanel);
225 add(Box.createVerticalStrut(10));
226
227
228 // CONTENT FONT
229 JPanel contentFontPanel = new JPanel();
230 contentFontPanel.setBorder(BorderFactory.createTitledBorder(fmUITheme.getString("label.content_font")));
231 contentFontPanel.setLayout(new BoxLayout(contentFontPanel, BoxLayout.X_AXIS));
232
233 contentFontFamily = new JComboBox(fontFamilies);
234 contentFontFamily.setMaximumSize(contentFontFamily.getPreferredSize());
235
236 contentFontSize = new JComboBox(fontSizes);
237 contentFontSize.setMaximumSize(contentFontSize.getPreferredSize());
238
239 contentFontFamily.setSelectedItem(fmUITheme.CONTENT_FONT.getFamily());
240 contentFontSize.setSelectedItem(new Integer(fmUITheme.CONTENT_FONT.getSize()));
241
242
243 contentFontPanel.add(Box.createHorizontalStrut(5));
244 contentFontPanel.add(new JLabel(fmUITheme.getString("label.family")));
245 contentFontPanel.add(Box.createHorizontalStrut(3));
246
247 contentFontPanel.add(contentFontFamily);
248 contentFontPanel.add(Box.createHorizontalStrut(15));
249 //contentFontPanel.add(contentFontFace);
250 contentFontPanel.add(new JLabel(fmUITheme.getString("label.size")));
251 contentFontPanel.add(Box.createHorizontalStrut(3));
252 contentFontPanel.add(contentFontSize);
253 contentFontPanel.add(new JLabel(" " + fmUITheme.getString("label.pixels")));
254 contentFontPanel.add(Box.createHorizontalGlue());
255 contentFontPanel.add(Box.createVerticalGlue());
256
257 add(contentFontPanel);
258 add(Box.createVerticalStrut(10));
259
260
261
262
263 // CONTENT FONT
264 JPanel headersFontPanel = new JPanel();
265 headersFontPanel.setBorder(BorderFactory.createTitledBorder(fmUITheme.getString("label.headers_font")));
266 headersFontPanel.setLayout(new BoxLayout(headersFontPanel, BoxLayout.X_AXIS));
267
268 headersFontFamily = new JComboBox(fontFamilies);
269 headersFontFamily.setMaximumSize(headersFontFamily.getPreferredSize());
270
271 headersFontSize = new JComboBox(fontSizes);
272 headersFontSize.setMaximumSize(headersFontSize.getPreferredSize());
273
274 headersFontFamily.setSelectedItem(fmUITheme.HEADERS_FONT.getFamily());
275 headersFontSize.setSelectedItem(new Integer(fmUITheme.HEADERS_FONT.getSize()));
276
277 headersFontPanel.add(Box.createHorizontalStrut(5));
278 headersFontPanel.add(new JLabel(fmUITheme.getString("label.family")));
279 headersFontPanel.add(Box.createHorizontalStrut(3));
280
281 headersFontPanel.add(headersFontFamily);
282 headersFontPanel.add(Box.createHorizontalStrut(15));
283 //headersFontPanel.add(headersFontFace);
284 headersFontPanel.add(new JLabel(fmUITheme.getString("label.size")));
285 headersFontPanel.add(Box.createHorizontalStrut(3));
286 headersFontPanel.add(headersFontSize);
287 headersFontPanel.add(new JLabel(" " + fmUITheme.getString("label.pixels")));
288 headersFontPanel.add(Box.createHorizontalGlue());
289 headersFontPanel.add(Box.createVerticalGlue());
290
291
292
293 add(headersFontPanel);
294 add(Box.createVerticalStrut(10));
295 }
296
297
298 /**
299 * Apllies user input
300 */
301 public void apply() {
302
303 fmUITheme.TREE_FONT = new Font((String) treeFontFamily.getSelectedItem(),
304 Font.PLAIN,
305 ((Integer)treeFontSize.getSelectedItem()).intValue());
306
307 fmUITheme.CONTENT_FONT = new Font((String) contentFontFamily.getSelectedItem(),
308 Font.PLAIN,
309 ((Integer)contentFontSize.getSelectedItem()).intValue());
310
311 fmUITheme.HEADERS_FONT = new Font((String) headersFontFamily.getSelectedItem(),
312 Font.PLAIN,
313 ((Integer)headersFontSize.getSelectedItem()).intValue());
314
315
316 runtimeProperties.put(fmGuiConstants.TREE_FONT, fmUITheme.fontToString(fmUITheme.TREE_FONT,null));
317 runtimeProperties.put(fmGuiConstants.HEADERS_FONT, fmUITheme.fontToString(fmUITheme.HEADERS_FONT,null));
318 runtimeProperties.put(fmGuiConstants.CONTENT_FONT, fmUITheme.fontToString(fmUITheme.CONTENT_FONT,null));
319
320
321 }
322 }
323
324 private class browserSettingsPanel extends JPanel implements SettingsPanel {
325
326 Properties runtimeProperties;
327 JRadioButton internalButton;
328 JRadioButton nativeButton;
329 JRadioButton userDefinedButton;
330 JTextField userDefinedPath;
331
332 public browserSettingsPanel(Properties props) {
333
334 super();
335
336
337 //setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
338 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
339 setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
340
341
342 JPanel controlsPanel = new JPanel();
343
344 runtimeProperties = props;
345
346 internalButton = new JRadioButton(fmUITheme.getString("label.browser.built_in"));
347 internalButton.setMnemonic(KeyEvent.VK_B);
348 internalButton.setAlignmentX(LEFT_ALIGNMENT);
349 internalButton.setMaximumSize(internalButton.getPreferredSize());
350
351 if (props.getProperty(fmGuiConstants.URL_HANDLING_CMD).equals(fmGuiConstants.INTERNAL_URL_HANDLER))
352 internalButton.setSelected(true);
353
354 nativeButton = new JRadioButton(fmUITheme.getString("label.browser.native"));
355 nativeButton.setMnemonic(KeyEvent.VK_S);
356 nativeButton.setAlignmentX(LEFT_ALIGNMENT);
357 nativeButton.setMaximumSize(nativeButton.getPreferredSize());
358
359
360 if (props.getProperty(fmGuiConstants.URL_HANDLING_CMD).equals(fmGuiConstants.WIN32_URL_HANDLER))
361 nativeButton.setSelected(true);
362 else {
363 String s = System.getProperty("os.name");
364 if (s != null && (s.startsWith("Windows") == false))
365 nativeButton.setEnabled(false);
366 }
367
368 userDefinedButton = new JRadioButton(fmUITheme.getString("label.browser.user_defined"));
369 userDefinedButton.setMnemonic(KeyEvent.VK_U);
370 userDefinedButton.setAlignmentX(LEFT_ALIGNMENT);
371 userDefinedButton.setMaximumSize(userDefinedButton.getPreferredSize());
372
373 JPanel pathPanel = new JPanel();
374 pathPanel.setLayout(new BoxLayout(pathPanel, BoxLayout.X_AXIS));
375 pathPanel.setAlignmentX(LEFT_ALIGNMENT);
376
377 userDefinedPath = new JTextField(38);
378 userDefinedPath.setBorder(fmUITheme.FM_THIN_BORDER);
379 userDefinedPath.setMaximumSize(userDefinedPath.getPreferredSize());
380
381
382 final JEditorPane userDefinedHelp = new JEditorPane();
383 userDefinedHelp.setText(fmUITheme.getString("label.browser.user_defined.help"));
384 //userDefinedHelp.setMaximumSize(userDefinedHelp.getPreferredSize());
385 userDefinedHelp.setBackground(getBackground());
386 userDefinedHelp.setBorder(BorderFactory.createEmptyBorder());
387 userDefinedHelp.setAlignmentX(LEFT_ALIGNMENT);
388 userDefinedHelp.setEditable(false);
389 userDefinedHelp.setVisible(false);
390
391
392
393
394 final JButton pathButton = new JButton("...");
395 pathButton.setBorder(fmUITheme.FM_BUTTON_BORDER);
396 pathButton.setEnabled(false);
397
398
399 pathPanel.add(userDefinedButton);
400 pathPanel.add(userDefinedPath);
401 pathPanel.add(pathButton);
402 //pathPanel.add(Box.createHorizontalGlue());
403
404
405 if ((internalButton.isSelected() || nativeButton.isSelected()) == false)
406 {
407 userDefinedButton.setSelected(true);
408 pathButton.setEnabled(true);
409 userDefinedPath.setEnabled(true);
410 userDefinedHelp.setVisible(true);
411 userDefinedPath.setText(props.getProperty(fmGuiConstants.URL_HANDLING_CMD));
412 }
413
414 ///////////////////////////////////////////////////////////////////
415 // Radio button action listener
416 ActionListener al = new ActionListener () {
417 public void actionPerformed(ActionEvent e) {
418 if ((e.getSource() == internalButton) || (e.getSource() == nativeButton)) {
419 userDefinedPath.setEnabled(false);
420 pathButton.setEnabled(false);
421 userDefinedHelp.setVisible(false);
422 }
423 else {
424 userDefinedPath.setEnabled(true);
425 pathButton.setEnabled(true);
426 userDefinedHelp.setVisible(true);
427 }
428 }
429 };
430 internalButton.addActionListener(al);
431 nativeButton.addActionListener(al);
432 userDefinedButton.addActionListener(al);
433
434
435 /////////////////////////////////////////////////////////////////////////////
436 // PATH BUTTON LISTENER
437 pathButton.addActionListener(new ActionListener() {
438 public void actionPerformed(ActionEvent e) {
439
440 JFileChooser fc = new JFileChooser();
441 int returnVal = fc.showOpenDialog(null);
442
443 if (returnVal == JFileChooser.APPROVE_OPTION)
444 {
445 File file = fc.getSelectedFile();
446 String srcPath = file.getPath();
447 userDefinedPath.setText(srcPath);
448 }
449 }
450 });
451 ButtonGroup group = new ButtonGroup();
452 group.add(internalButton);
453 group.add(nativeButton);
454 group.add(userDefinedButton);
455
456 add(new JLabel(fmUITheme.getString("label.browser.help")));
457 add(internalButton);
458 add(nativeButton);
459 add(pathPanel);
460 add(Box.createVerticalStrut(20));
461 add(userDefinedHelp);
462 }
463
464 public void apply() {
465
466 if (internalButton.isSelected()) {
467 runtimeProperties.put(fmGuiConstants.URL_HANDLING_CMD,
468 fmGuiConstants.INTERNAL_URL_HANDLER);
469 }
470 else if (nativeButton.isSelected()) {
471 runtimeProperties.put(fmGuiConstants.URL_HANDLING_CMD,
472 fmGuiConstants.WIN32_URL_HANDLER);
473 }
474 else if (userDefinedPath.getText().length() > 0) {
475 String path = userDefinedPath.getText();
476
477 if (path.matches(".*?%url.*?"))
478 runtimeProperties.put(fmGuiConstants.URL_HANDLING_CMD, path);
479 else
480 runtimeProperties.put(fmGuiConstants.URL_HANDLING_CMD, path + " %url");
481 }
482 else {
483 runtimeProperties.put(fmGuiConstants.URL_HANDLING_CMD,
484 fmGuiConstants.INTERNAL_URL_HANDLER);
485 }
486
487
488
489 }
490 }
491
492 /**
493 * Overrides standard implementation
494 * @param isVisible
495 */
496 public void setVisible(boolean isVisible)
497 {
498 setLocationRelativeTo(parent);
499 super.setVisible(isVisible);
500 }
501 }
502