// Copyright 2001-2007, FreeHEP.
package org.freehep.graphicsio.pdf;

import java.awt.Component;
import java.awt.Dimension;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;

import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.freehep.graphics2d.VectorGraphics;
import org.freehep.graphicsbase.swing.layout.TableLayout;
import org.freehep.graphicsbase.util.UserProperties;
import org.freehep.graphicsio.ImageConstants;
import org.freehep.graphicsio.InfoConstants;
import org.freehep.graphicsio.AbstractVectorGraphicsIO;
import org.freehep.graphicsio.exportchooser.AbstractExportFileType;
import org.freehep.graphicsio.exportchooser.BackgroundPanel;
import org.freehep.graphicsio.exportchooser.FontPanel;
import org.freehep.graphicsio.exportchooser.ImageTypePanel;
import org.freehep.graphicsio.exportchooser.InfoPanel;
import org.freehep.graphicsio.exportchooser.OptionCheckBox;
import org.freehep.graphicsio.exportchooser.OptionComboBox;
import org.freehep.graphicsio.exportchooser.OptionPanel;
import org.freehep.graphicsio.exportchooser.PageLayoutPanel;
import org.freehep.graphicsio.exportchooser.PageMarginPanel;

/**
 * 
 * @author Simon Fischer
 * @version $Id: freehep-graphicsio-pdf/src/main/java/org/freehep/graphicsio/pdf/PDFExportFileType.java 4c4708a97391 2007/06/12 22:32:31 duns $
 */
public class PDFExportFileType extends AbstractExportFileType {

	final private static String[] versionList = { PDFGraphics2D.VERSION4,
			PDFGraphics2D.VERSION5 };

	public String getDescription() {
		return "Portable Document Format";
	}

	public String[] getExtensions() {
		return new String[] { "pdf" };
	}

	public String[] getMIMETypes() {
		return new String[] { "application/pdf" };
	}

	public boolean isMultipageCapable() {
		return true;
	}

	public boolean hasOptionPanel() {
		return true;
	}

	public JPanel createOptionPanel(Properties user) {
		UserProperties options = new UserProperties(user, PDFGraphics2D
				.getDefaultProperties());
		OptionPanel format = new OptionPanel("Format");

		OptionComboBox version = new OptionComboBox(options,
				PDFGraphics2D.VERSION, versionList);
		format.add(TableLayout.LEFT, new JLabel("PDF Version"));
		format.add(TableLayout.RIGHT, version);

		format.add(TableLayout.FULL, new OptionCheckBox(options,
				PDFGraphics2D.COMPRESS, "Compress"));

		JPanel preview = new OptionPanel("Preview");

		JCheckBox thumbnails = new OptionCheckBox(options,
				PDFGraphics2D.THUMBNAILS, "Include Thumbnail");
		thumbnails.setToolTipText("Thumbnails are automatically generated by "
				+ "Acrobat Reader 5");
		preview.add(TableLayout.FULL, thumbnails);
		version.selects(PDFGraphics2D.VERSION4, thumbnails);

		// rootKeys for FontProperties
		String rootKey = PDFGraphics2D.class.getName();
		String abstractRootKey = AbstractVectorGraphicsIO.class.getName();

		JPanel infoPanel = new InfoPanel(options, rootKey, new String[] {
				InfoConstants.AUTHOR, InfoConstants.TITLE,
				InfoConstants.SUBJECT, InfoConstants.KEYWORDS });

		// TableLayout.LEFT Panel
		JPanel leftPanel = new OptionPanel();
		leftPanel
				.add(TableLayout.COLUMN, new PageLayoutPanel(options, rootKey));
		leftPanel
				.add(TableLayout.COLUMN, new PageMarginPanel(options, rootKey));
		leftPanel.add(TableLayout.COLUMN_FILL, new JLabel());

		// TableLayout.RIGHT Panel
		JPanel rightPanel = new OptionPanel();
		rightPanel.add(TableLayout.COLUMN, format);
		rightPanel.add(TableLayout.COLUMN, preview);
		rightPanel.add(TableLayout.COLUMN, new BackgroundPanel(options,
				rootKey, true));
		rightPanel.add(TableLayout.COLUMN, new ImageTypePanel(options, rootKey,
				new String[] { ImageConstants.SMALLEST, ImageConstants.ZLIB,
						ImageConstants.JPG }));
		rightPanel.add(TableLayout.COLUMN, new FontPanel(options, rootKey,
				abstractRootKey));
		rightPanel.add(TableLayout.COLUMN_FILL, new JLabel());

		// Make the full panel.
		OptionPanel optionsPanel = new OptionPanel();
		optionsPanel.add("0 0 [5 5 5 5] wt", leftPanel);
		optionsPanel.add("1 0 [5 5 5 5] wt", rightPanel);
		optionsPanel.add("0 1 2 1 [5 5 5 5] wt", infoPanel);
		optionsPanel.add(TableLayout.COLUMN_FILL, new JLabel());

		return optionsPanel;
	}

	public VectorGraphics getGraphics(OutputStream os, Component target)
			throws IOException {
		return new PDFGraphics2D(os, target);
	}

	public VectorGraphics getGraphics(OutputStream os, Dimension dimension)
			throws IOException {
		return new PDFGraphics2D(os, dimension);
	}
}
