316 lines
10 KiB
Java
316 lines
10 KiB
Java
/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Mozilla Public
|
|
* License Version 1.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/MPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is the Grendel mail/news client.
|
|
*
|
|
* The Initial Developer of the Original Code is Edwin Woudt
|
|
* <edwin@woudt.nl>. Portions created by Edwin Woudt are
|
|
* Copyright (C) 1999 Edwin Woudt. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s): Jeff Galyan <talisman@anamorphic.com>
|
|
*/
|
|
|
|
package grendel.prefs.ui;
|
|
|
|
import java.util.Vector;
|
|
|
|
import java.awt.Dimension;
|
|
import java.awt.FlowLayout;
|
|
import java.awt.Font;
|
|
import java.awt.Insets;
|
|
import java.awt.Rectangle;
|
|
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.ActionListener;
|
|
|
|
import java.net.URL;
|
|
|
|
import javax.swing.JButton;
|
|
import javax.swing.JCheckBox;
|
|
import javax.swing.JComboBox;
|
|
import javax.swing.JFrame;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JRadioButton;
|
|
import javax.swing.JTextField;
|
|
|
|
import javax.swing.AbstractListModel;
|
|
import javax.swing.ButtonGroup;
|
|
import javax.swing.ComboBoxModel;
|
|
import javax.swing.ImageIcon;
|
|
import javax.swing.LookAndFeel;
|
|
import javax.swing.UIManager;
|
|
|
|
import grendel.prefs.base.UIPrefs;
|
|
|
|
import grendel.ui.UnifiedMessageDisplayManager;
|
|
|
|
|
|
public class UI extends JFrame {
|
|
|
|
private static boolean DEBUG = true;
|
|
|
|
UIPrefs prefs = UIPrefs.GetMaster();
|
|
|
|
JRadioButton rb1, rb2, rb3, rb4, rb5;
|
|
JCheckBox cbTooltips;
|
|
JComboBox cbLandF;
|
|
// BUGFIX: Fonts were too big (may be specific to Linux JVM,
|
|
// but this is a safe bet for a Font). --Jeff
|
|
Font baseFont = new Font("Helvetica", Font.PLAIN, 12);
|
|
|
|
public static void main(String argv[]) {
|
|
|
|
UI ui = new UI();
|
|
// Edwin: the show() method is deprecated as of JDK 1.1
|
|
// use setVisible(boolean) instead --Jeff
|
|
ui.setVisible(true);
|
|
|
|
}
|
|
|
|
public UI() {
|
|
|
|
super();
|
|
// Edwin: explicitly setting the window size and using a null layout
|
|
// manager to hardcode pixel coordinates for UI components is by
|
|
// definition not cross-platform compatible. Consider using a
|
|
// GridBagLayout instead. Also, the layout isn't very consistent in terms
|
|
// of placement of components. --Jeff
|
|
setSize(500,354);
|
|
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
|
getContentPane().setLayout(null);
|
|
|
|
JLabel label = new JLabel("Choose your window layout:");
|
|
label.setFont(baseFont);
|
|
label.setBounds(12,12,label.getPreferredSize().width,label.getPreferredSize().height);
|
|
getContentPane().add(label);
|
|
label = new JLabel("Look and Feel");
|
|
label.setFont(baseFont);
|
|
label.setBounds(12,148,label.getPreferredSize().width,label.getPreferredSize().height);
|
|
getContentPane().add(label);
|
|
label = new JLabel("Note: Grendel must be restarted to see any changes");
|
|
label.setFont(baseFont);
|
|
label.setBounds(12,294,label.getPreferredSize().width,label.getPreferredSize().height);
|
|
getContentPane().add(label);
|
|
|
|
JLabel icon; URL iconUrl;
|
|
|
|
iconUrl = getClass().getResource("images/multi.gif");
|
|
icon = new JLabel(new ImageIcon(iconUrl));
|
|
icon.setBounds(48,44,icon.getPreferredSize().width,icon.getPreferredSize().height);
|
|
getContentPane().add(icon);
|
|
iconUrl = getClass().getResource("images/right.gif");
|
|
icon = new JLabel(new ImageIcon(iconUrl));
|
|
icon.setBounds(138,44,icon.getPreferredSize().width,icon.getPreferredSize().height);
|
|
getContentPane().add(icon);
|
|
iconUrl = getClass().getResource("images/top.gif");
|
|
icon = new JLabel(new ImageIcon(iconUrl));
|
|
icon.setBounds(228,44,icon.getPreferredSize().width,icon.getPreferredSize().height);
|
|
getContentPane().add(icon);
|
|
iconUrl = getClass().getResource("images/left.gif");
|
|
icon = new JLabel(new ImageIcon(iconUrl));
|
|
icon.setBounds(318,44,icon.getPreferredSize().width,icon.getPreferredSize().height);
|
|
getContentPane().add(icon);
|
|
iconUrl = getClass().getResource("images/stacked.gif");
|
|
icon = new JLabel(new ImageIcon(iconUrl));
|
|
icon.setBounds(408,44,icon.getPreferredSize().width,icon.getPreferredSize().height);
|
|
getContentPane().add(icon);
|
|
|
|
rb1 = new JRadioButton("");
|
|
rb1.setBounds(26,44,rb1.getPreferredSize().width,rb1.getPreferredSize().height);
|
|
getContentPane().add(rb1);
|
|
rb2 = new JRadioButton("");
|
|
rb2.setBounds(116,44,rb2.getPreferredSize().width,rb2.getPreferredSize().height);
|
|
getContentPane().add(rb2);
|
|
rb3 = new JRadioButton("");
|
|
rb3.setBounds(206,44,rb3.getPreferredSize().width,rb3.getPreferredSize().height);
|
|
getContentPane().add(rb3);
|
|
rb4 = new JRadioButton("");
|
|
rb4.setBounds(296,44,rb4.getPreferredSize().width,rb4.getPreferredSize().height);
|
|
getContentPane().add(rb4);
|
|
rb5 = new JRadioButton("");
|
|
rb5.setBounds(386,44,rb5.getPreferredSize().width,rb5.getPreferredSize().height);
|
|
getContentPane().add(rb5);
|
|
|
|
ButtonGroup bg = new ButtonGroup();
|
|
bg.add(rb1); bg.add(rb2); bg.add(rb3); bg.add(rb4); bg.add(rb5);
|
|
|
|
cbTooltips = new JCheckBox("Show tooltips");
|
|
cbTooltips.setFont(baseFont);
|
|
cbTooltips.setBounds(12,100,cbTooltips.getPreferredSize().width, cbTooltips.getPreferredSize().height);
|
|
getContentPane().add(cbTooltips);
|
|
|
|
cbLandF = new JComboBox(new LAFListModel());
|
|
cbLandF.setFont(baseFont);
|
|
cbLandF.setBounds(100,144,300,cbLandF.getPreferredSize().height);
|
|
getContentPane().add(cbLandF);
|
|
|
|
JButton button = new JButton("Cancel");
|
|
button.setFont(baseFont);
|
|
button.setBounds(334,290,68,button.getPreferredSize().height);
|
|
button.addActionListener(new CancelActionListener());
|
|
button.setMargin(new Insets(0,0,0,0));
|
|
getContentPane().add(button);
|
|
button = new JButton("Finish");
|
|
button.setFont(baseFont);
|
|
button.setBounds(414,290,68,button.getPreferredSize().height);
|
|
button.addActionListener(new FinishActionListener());
|
|
button.setMargin(new Insets(0,0,0,0));
|
|
getContentPane().add(button);
|
|
|
|
getData();
|
|
}
|
|
|
|
void getData() {
|
|
if (prefs.getDisplayManager().equals("multi")) {
|
|
rb1.setSelected(true);
|
|
} else {
|
|
if (prefs.getMultiPaneLayout().equals(UnifiedMessageDisplayManager.SPLIT_RIGHT)) {
|
|
rb2.setSelected(true);
|
|
}
|
|
if (prefs.getMultiPaneLayout().equals(UnifiedMessageDisplayManager.SPLIT_TOP)) {
|
|
rb3.setSelected(true);
|
|
}
|
|
if (prefs.getMultiPaneLayout().equals(UnifiedMessageDisplayManager.SPLIT_LEFT)) {
|
|
rb4.setSelected(true);
|
|
}
|
|
if (prefs.getMultiPaneLayout().equals(UnifiedMessageDisplayManager.STACKED)) {
|
|
rb5.setSelected(true);
|
|
}
|
|
}
|
|
if (prefs.getTooltips()) {
|
|
cbTooltips.setSelected(true);
|
|
}
|
|
}
|
|
|
|
void setData() {
|
|
if (rb1.isSelected()) {
|
|
prefs.setDisplayManager("multi");
|
|
}
|
|
if (rb2.isSelected()) {
|
|
prefs.setDisplayManager("unified");
|
|
prefs.setMultiPaneLayout(UnifiedMessageDisplayManager.SPLIT_RIGHT);
|
|
}
|
|
if (rb3.isSelected()) {
|
|
prefs.setDisplayManager("unified");
|
|
prefs.setMultiPaneLayout(UnifiedMessageDisplayManager.SPLIT_TOP);
|
|
}
|
|
if (rb4.isSelected()) {
|
|
prefs.setDisplayManager("unified");
|
|
prefs.setMultiPaneLayout(UnifiedMessageDisplayManager.SPLIT_LEFT);
|
|
}
|
|
if (rb5.isSelected()) {
|
|
prefs.setDisplayManager("unified");
|
|
prefs.setMultiPaneLayout(UnifiedMessageDisplayManager.STACKED);
|
|
}
|
|
if (cbTooltips.isSelected()) {
|
|
prefs.setTooltips(true);
|
|
} else {
|
|
prefs.setTooltips(false);
|
|
}
|
|
prefs.setLookAndFeel((String)cbLandF.getSelectedItem());
|
|
}
|
|
|
|
class FinishActionListener implements ActionListener {
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
setData();
|
|
prefs.writePrefs();
|
|
// Edwin: the hide() method is deprecated as of JDK 1.1
|
|
// use setVisible(boolean) instead --Jeff
|
|
setVisible(false);
|
|
dispose();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class CancelActionListener implements ActionListener {
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
setVisible(false);
|
|
dispose();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class LAFListModel extends AbstractListModel implements ComboBoxModel {
|
|
LookAndFeel fLAFs[] = null;
|
|
Object selection = null;
|
|
String os_name = System.getProperty("os.name");
|
|
|
|
LAFListModel() {
|
|
UIManager.LookAndFeelInfo[] info =
|
|
UIManager.getInstalledLookAndFeels();
|
|
Vector LAFVec = new Vector();
|
|
for (int i = 0; i < info.length; i++) {
|
|
try {
|
|
String name = info[i].getClassName();
|
|
if ((name.endsWith("WindowsLookAndFeel") && !os_name.startsWith("Win"))
|
|
|| (name.endsWith("MacLookAndFeel") && !os_name.startsWith("Mac"))) {
|
|
// don't add it to the list
|
|
} else {
|
|
Class c = Class.forName(name);
|
|
LAFVec.addElement((LookAndFeel)c.newInstance());
|
|
}
|
|
} catch (Exception e){
|
|
// Edwin: please at least provide a static private boolean at
|
|
// class scope to test if we want debug output so if we get
|
|
// exceptions where we don't expect them, we can handle them
|
|
// gracefully (and hopefully find out what's causing them).
|
|
// We can always set DEBUG to "false" for a release. --Jeff
|
|
if (DEBUG) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
fLAFs = new LookAndFeel[LAFVec.size()];
|
|
for (int j = 0; j < LAFVec.size(); j++) {
|
|
fLAFs[j] = (LookAndFeel)LAFVec.elementAt(j);
|
|
if (fLAFs[j].getDescription().equals(prefs.getLookAndFeel())) {
|
|
selection = fLAFs[j].getDescription();
|
|
}
|
|
}
|
|
setFont(baseFont);
|
|
}
|
|
|
|
public int getSize() {
|
|
if (fLAFs != null) {
|
|
return fLAFs.length;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public Object getElementAt(int index) {
|
|
if (fLAFs != null && index < fLAFs.length) {
|
|
// this is a hack. the toString() returns a string which is
|
|
// best described as "unwieldly"
|
|
// Actually, I would say this is the right way to do this. --Jeff
|
|
return fLAFs[index].getDescription();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public void setSelectedItem(Object anItem) {
|
|
selection = anItem;
|
|
}
|
|
|
|
public Object getSelectedItem() {
|
|
return selection;
|
|
}
|
|
}
|
|
|
|
}
|