org.columba.mail.gui.config.export.ExportDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.columba.mail.gui.config.export.ExportDialog.java

Source

//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();
                }
            }
        }
    }
}