/*
 *  Copyright (C) 2004  The Concord Consortium, Inc.,
 *  10 Concord Crossing, Concord, MA 01742
 *
 *  Web Site: http://www.concord.org
 *  Email: info@concord.org
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * END LICENSE */

package org.concord.swing;

import java.awt.BorderLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ZipperPanel extends JPanel {

	CCJCheckBoxTree filesTree;
	MostRecentFileDialog mrfd = 
		new MostRecentFileDialog("org.concord.zip.file.source");
	Hashtable filesHash = new Hashtable();
	Vector filesToZip = new Vector();
	
	public ZipperPanel() {
		super();
		init();
		// TODO Auto-generated constructor stub
	}

	public ZipperPanel(boolean isDoubleBuffered) {
		super(isDoubleBuffered);
		// TODO Auto-generated constructor stub
		init();
	}

	public ZipperPanel(LayoutManager layout) {
		super(layout);
		// TODO Auto-generated constructor stub
		init();
	}

	public ZipperPanel(LayoutManager layout, boolean isDoubleBuffered) {
		super(layout, isDoubleBuffered);
		// TODO Auto-generated constructor stub
		init();
	}
	
	private void init() {
		this.setLayout(new BorderLayout());
		
		filesTree = new CCJCheckBoxTree("Files to Zip");
	    filesTree.setCellRenderer(new CCJCheckBoxRenderer());
	    filesTree.setRootVisible(false);
		
		JScrollPane scrollPane = new JScrollPane(filesTree);
		
		this.add(scrollPane, BorderLayout.CENTER);
		
		JButton addFile = new JButton("Add File(s)");
		addFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int retval = mrfd.showOpenDialog(null, "Add a file to compress");
				if(retval == MostRecentFileDialog.APPROVE_OPTION) {
					File f = mrfd.getSelectedFile();
					if(f.isFile() && 
							(!filesHash.contains(f.getAbsolutePath()))) {
						String fn = f.getName();
				    	CCJCheckBoxTree.NodeHolder newNodeHolder = 
				    		new CCJCheckBoxTree.NodeHolder(fn, true);
				    	filesTree.addObject(newNodeHolder);
				    	filesHash.put(newNodeHolder, f.getAbsolutePath());
					}
				}
			}
		});
		
		JButton zipFile = new JButton("Zip File(s)");
		zipFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(filesHash.isEmpty()) {
					String msg = "No files to zip. Please add files first.";
					JOptionPane.showMessageDialog(null, msg, 
							"NO Files", JOptionPane.ERROR_MESSAGE);
					return;
				}
				
				filesToZip.removeAllElements();
				Set keys = filesHash.keySet();
				Iterator it = keys.iterator();
				while(it.hasNext()) {
					CCJCheckBoxTree.NodeHolder key = (CCJCheckBoxTree.NodeHolder)it.next();
					if(key.checked)
						filesToZip.addElement((new File(filesHash.get(key).toString())));
				}
				
				if(filesToZip.size() == 0) {
					String msg = "Please select the files to zip.";
					JOptionPane.showMessageDialog(null, msg, 
							"NO Files", JOptionPane.ERROR_MESSAGE);
					return;
				}
				
				MostRecentFileDialog mrfd2 = new MostRecentFileDialog("org.concord.zip.file.target");
				int retval = mrfd2.showSaveDialog(null, "Save zipped file");
				if(retval == MostRecentFileDialog.APPROVE_OPTION) {
					File f = mrfd2.getSelectedFile();
					Zipper.zip(filesToZip, f);
				}
			}
		});
		
		JPanel control = new JPanel();
		control.add(addFile);
		control.add(zipFile);
		
		this.add(control, BorderLayout.SOUTH);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame frame = new JFrame("Zip Example");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		ZipperPanel zp = new ZipperPanel();
		frame.getContentPane().add(zp);
		frame.pack();
		frame.show();
	}
}
