Java tutorial
//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 Columba Project" // //The Initial Developers of the Original Code are Frederik Dietz and Timo Stich. //Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003. // //All Rights Reserved. package org.columba.mail.gui.config.export; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import org.columba.core.command.CommandProcessor; import org.columba.core.gui.base.ButtonWithMnemonic; import org.columba.core.gui.base.SingleSideEtchedBorder; import org.columba.core.gui.util.DialogHeaderPanel; import org.columba.core.help.HelpManager; import org.columba.mail.command.MailFolderCommandReference; import org.columba.mail.folder.IMailFolder; import org.columba.mail.folder.command.ExportFolderCommand; import org.columba.mail.gui.tree.FolderTreeModel; import org.columba.mail.gui.tree.util.FolderTreeCellRenderer; import org.columba.mail.util.MailResourceLoader; import org.frapuccino.checkabletree.CheckableItem; import org.frapuccino.checkabletree.CheckableTree; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; /** * ExportDialog lets you select a number of folders for exporting messages into * the MBOX format. * * @author fdietz */ public class ExportDialog extends JDialog implements ActionListener { private ButtonWithMnemonic exportButton; private ButtonWithMnemonic selectAllButton; private JTree tree; private JButton helpButton; private JButton closeButton; public ExportDialog(JFrame parent) { super(parent, MailResourceLoader.getString("dialog", "export", "dialog_title"), false); initComponents(); pack(); setLocationRelativeTo(null); setVisible(true); } private void createChildNodes(CheckableTreeNode root, IMailFolder parent) { for (int i = 0; i < parent.getChildCount(); i++) { IMailFolder child = (IMailFolder) parent.getChildAt(i); CheckableTreeNode c = new CheckableTreeNode(child.getName()); c.setIcon(FolderTreeCellRenderer.getFolderIcon(child, false)); c.setNode(child); root.add(c); createChildNodes(c, child); } } protected void initComponents() { JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); getContentPane().add(mainPanel); exportButton = new ButtonWithMnemonic(MailResourceLoader.getString("dialog", "export", "export")); exportButton.setActionCommand("EXPORT"); exportButton.addActionListener(this); selectAllButton = new ButtonWithMnemonic(MailResourceLoader.getString("dialog", "export", "select_all")); selectAllButton.setActionCommand("SELECTALL"); selectAllButton.addActionListener(this); IMailFolder parent = (IMailFolder) FolderTreeModel.getInstance().getRoot(); CheckableTreeNode root = new CheckableTreeNode(parent.getName()); root.setNode(parent); createChildNodes(root, parent); tree = new CheckableTree(root); tree.setRootVisible(false); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addMouseListener(new NodeSelectionListener(tree)); tree.expandRow(0); tree.expandRow(1); getContentPane().add(createPanel(), BorderLayout.CENTER); getContentPane().add(createBottomPanel(), BorderLayout.SOUTH); getContentPane().add( new DialogHeaderPanel(MailResourceLoader.getString("dialog", "export", "header_title"), MailResourceLoader.getString("dialog", "export", "header_description")), BorderLayout.NORTH); getRootPane().setDefaultButton(closeButton); getRootPane().registerKeyboardAction(this, "CLOSE", KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_IN_FOCUSED_WINDOW); // associate with JavaHelp HelpManager.getInstance().enableHelpOnButton(helpButton, "organising_and_managing_your_email_5"); HelpManager.getInstance().enableHelpKey(getRootPane(), "organising_and_managing_your_email_5"); } private JPanel createPanel() { JPanel jpanel1 = new JPanel(); FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0),3DLU,FILL:DEFAULT:NONE", "CENTER:DEFAULT:NONE,1DLU,FILL:DEFAULT:GROW(1.0),3DLU,CENTER:DEFAULT:NONE"); CellConstraints cc = new CellConstraints(); jpanel1.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); jpanel1.setLayout(formlayout1); JLabel jlabel1 = new JLabel(); jlabel1.setText("Select Folders:"); jpanel1.add(jlabel1, cc.xy(1, 1)); JScrollPane scrollPane = new JScrollPane(tree); scrollPane.setPreferredSize(new Dimension(350, 250)); jpanel1.add(scrollPane, cc.xy(1, 3)); jpanel1.add(createPanel1(), new CellConstraints(3, 3, 1, 1, CellConstraints.DEFAULT, CellConstraints.TOP)); return jpanel1; } private JPanel createPanel1() { JPanel jpanel1 = new JPanel(); FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:NONE", "CENTER:DEFAULT:NONE,3DLU,CENTER:DEFAULT:NONE,3DLU,CENTER:DEFAULT:NONE"); CellConstraints cc = new CellConstraints(); jpanel1.setLayout(formlayout1); jpanel1.add(exportButton, cc.xy(1, 1)); jpanel1.add(selectAllButton, cc.xy(1, 3)); return jpanel1; } private JPanel createBottomPanel() { JPanel bottomPanel = new JPanel(new BorderLayout()); bottomPanel.setBorder(new SingleSideEtchedBorder(SwingConstants.TOP)); JPanel buttonPanel = new JPanel(new GridLayout(1, 3, 6, 0)); buttonPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12)); closeButton = new ButtonWithMnemonic(MailResourceLoader.getString("global", "close")); closeButton.setActionCommand("CLOSE"); //$NON-NLS-1$ closeButton.addActionListener(this); buttonPanel.add(closeButton); helpButton = new ButtonWithMnemonic(MailResourceLoader.getString("global", "help")); buttonPanel.add(helpButton); bottomPanel.add(buttonPanel, BorderLayout.EAST); return bottomPanel; } private void getTreeNodeIteration(TreeNode parent, List l) { l.add(parent); for (int i = 0; i < parent.getChildCount(); i++) { l.add(parent.getChildAt(i)); getTreeNodeIteration((TreeNode) parent.getChildAt(i), l); } } /* * (non-Javadoc) * * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); if (action.equals("CLOSE")) { setVisible(false); } else if (action.equals("SELECTALL")) { List list = new LinkedList(); getTreeNodeIteration((TreeNode) tree.getModel().getRoot(), list); Iterator iterator = list.iterator(); CheckableTreeNode node; while (iterator.hasNext()) { node = (CheckableTreeNode) iterator.next(); node.setSelected(true); ((DefaultTreeModel) tree.getModel()).nodeChanged(node); } } else if (action.equals("EXPORT")) { File destFile = null; // ask the user about the destination file JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.setMultiSelectionEnabled(false); int result = chooser.showSaveDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); destFile = file; } else { return; } setVisible(false); // get list of all folders List list = new LinkedList(); getTreeNodeIteration((TreeNode) tree.getModel().getRoot(), list); Iterator it = list.iterator(); Vector v = new Vector(); // get list of all selected folders while (it.hasNext()) { CheckableItem node = (CheckableItem) it.next(); boolean export = (boolean) node.isSelected(); if (export) { v.add(node); } } // create command reference array for the command MailFolderCommandReference r = null; for (int i = 0; i < v.size(); i++) { IMailFolder node = (IMailFolder) ((CheckableTreeNode) v.get(i)).getNode(); r = new MailFolderCommandReference(node); r.setDestFile(destFile); // execute the command CommandProcessor.getInstance().addOp(new ExportFolderCommand(r)); } } } class NodeSelectionListener extends MouseAdapter { JTree tree; NodeSelectionListener(JTree tree) { this.tree = tree; } public void mouseClicked(MouseEvent e) { int x = e.getX(); int y = e.getY(); int row = tree.getRowForLocation(x, y); TreePath path = tree.getPathForRow(row); // TreePath path = tree.getSelectionPath(); if (path != null) { CheckableItem node = (CheckableItem) path.getLastPathComponent(); node.setSelected(!node.isSelected()); ((DefaultTreeModel) tree.getModel()).nodeChanged(node); // I need revalidate if node is root. but why? if (row == 0) { tree.revalidate(); tree.repaint(); } } } } }