8054834: Modular Source Code
Reviewed-by: alanb, chegar, ihse, mduigou
Contributed-by: alan.bateman@oracle.com, alex.buckley@oracle.com, chris.hegarty@oracle.com, erik.joelsson@oracle.com, jonathan.gibbons@oracle.com, karen.kinnear@oracle.com, magnus.ihse.bursie@oracle.com, mandy.chung@oracle.com, mark.reinhold@oracle.com, paul.sandoz@oracle.com
/*
* Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* This source code is provided to illustrate the usage of a given feature
* or technique and has been deliberately simplified. Additional steps
* required for a production-quality application, such as security checks,
* input validation and proper error handling, might not be present in
* this sample code.
*/
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;
/**
* This is dialog which allows users to choose preferences
*
* @author Steve Wilson
* @author Alexander Kouznetsov
*/
@SuppressWarnings("serial")
public final class MetalworksPrefs extends JDialog {
public MetalworksPrefs(JFrame f) {
super(f, "Preferences", true);
JPanel container = new JPanel();
container.setLayout(new BorderLayout());
JTabbedPane tabs = new JTabbedPane();
JPanel filters = buildFilterPanel();
JPanel conn = buildConnectingPanel();
tabs.addTab("Filters", null, filters);
tabs.addTab("Connecting", null, conn);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CancelPressed();
}
});
buttonPanel.add(cancel);
JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
OKPressed();
}
});
buttonPanel.add(ok);
getRootPane().setDefaultButton(ok);
container.add(tabs, BorderLayout.CENTER);
container.add(buttonPanel, BorderLayout.SOUTH);
getContentPane().add(container);
pack();
centerDialog();
UIManager.addPropertyChangeListener(new UISwitchListener(container));
}
public JPanel buildFilterPanel() {
JPanel filters = new JPanel();
filters.setLayout(new GridLayout(1, 0));
JPanel spamPanel = new JPanel();
spamPanel.setLayout(new ColumnLayout());
spamPanel.setBorder(new TitledBorder("Spam"));
ButtonGroup spamGroup = new ButtonGroup();
JRadioButton file = new JRadioButton("File in Spam Folder");
JRadioButton delete = new JRadioButton("Auto Delete");
JRadioButton bomb = new JRadioButton("Reverse Mail-Bomb");
spamGroup.add(file);
spamGroup.add(delete);
spamGroup.add(bomb);
spamPanel.add(file);
spamPanel.add(delete);
spamPanel.add(bomb);
file.setSelected(true);
filters.add(spamPanel);
JPanel autoRespond = new JPanel();
autoRespond.setLayout(new ColumnLayout());
autoRespond.setBorder(new TitledBorder("Auto Response"));
ButtonGroup respondGroup = new ButtonGroup();
JRadioButton none = new JRadioButton("None");
JRadioButton vaca = new JRadioButton("Send Vacation Message");
JRadioButton thx = new JRadioButton("Send Thank You Message");
respondGroup.add(none);
respondGroup.add(vaca);
respondGroup.add(thx);
autoRespond.add(none);
autoRespond.add(vaca);
autoRespond.add(thx);
none.setSelected(true);
filters.add(autoRespond);
return filters;
}
public JPanel buildConnectingPanel() {
JPanel connectPanel = new JPanel();
connectPanel.setLayout(new ColumnLayout());
JPanel protoPanel = new JPanel();
JLabel protoLabel = new JLabel("Protocol");
JComboBox protocol = new JComboBox();
protocol.addItem("SMTP");
protocol.addItem("IMAP");
protocol.addItem("Other...");
protoPanel.add(protoLabel);
protoPanel.add(protocol);
JPanel attachmentPanel = new JPanel();
JLabel attachmentLabel = new JLabel("Attachments");
JComboBox attach = new JComboBox();
attach.addItem("Download Always");
attach.addItem("Ask size > 1 Meg");
attach.addItem("Ask size > 5 Meg");
attach.addItem("Ask Always");
attachmentPanel.add(attachmentLabel);
attachmentPanel.add(attach);
JCheckBox autoConn = new JCheckBox("Auto Connect");
JCheckBox compress = new JCheckBox("Use Compression");
autoConn.setSelected(true);
connectPanel.add(protoPanel);
connectPanel.add(attachmentPanel);
connectPanel.add(autoConn);
connectPanel.add(compress);
return connectPanel;
}
protected void centerDialog() {
Dimension screenSize = this.getToolkit().getScreenSize();
Dimension size = this.getSize();
screenSize.height = screenSize.height / 2;
screenSize.width = screenSize.width / 2;
size.height = size.height / 2;
size.width = size.width / 2;
int y = screenSize.height - size.height;
int x = screenSize.width - size.width;
this.setLocation(x, y);
}
public void CancelPressed() {
this.setVisible(false);
}
public void OKPressed() {
this.setVisible(false);
}
}
class ColumnLayout implements LayoutManager {
int xInset = 5;
int yInset = 5;
int yGap = 2;
public void addLayoutComponent(String s, Component c) {
}
public void layoutContainer(Container c) {
Insets insets = c.getInsets();
int height = yInset + insets.top;
Component[] children = c.getComponents();
Dimension compSize = null;
for (Component child : children) {
compSize = child.getPreferredSize();
child.setSize(compSize.width, compSize.height);
child.setLocation(xInset + insets.left, height);
height += compSize.height + yGap;
}
}
public Dimension minimumLayoutSize(Container c) {
Insets insets = c.getInsets();
int height = yInset + insets.top;
int width = 0 + insets.left + insets.right;
Component[] children = c.getComponents();
Dimension compSize = null;
for (Component child : children) {
compSize = child.getPreferredSize();
height += compSize.height + yGap;
width = Math.max(width, compSize.width + insets.left + insets.right + xInset
* 2);
}
height += insets.bottom;
return new Dimension(width, height);
}
public Dimension preferredLayoutSize(Container c) {
return minimumLayoutSize(c);
}
public void removeLayoutComponent(Component c) {
}
}