/*******************************************************************************
 * Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
 * This program and the accompanying materials are made available under the 
 * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 
 * which accompanies this distribution. 
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *     Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench.test.uitools;

import java.awt.Point;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Collection;
import java.util.prefs.Preferences;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

import org.eclipse.persistence.tools.workbench.utility.ClassTools;
import org.eclipse.persistence.tools.workbench.utility.HashBag;

/**
 * Browse the Java preferences, both "system" and "current user".
 * Optionally, a command-line argument can specify a particular
 * set of user preferences to browse.
 */
public class PreferencesBrowser {
	private Preferences preferences;
	Collection windows;
	private Point windowLocation;
	private static final int INIT_X = 300;
	private static final int INIT_Y = 300;

	public static void main(String[] args) throws Exception {
		new PreferencesBrowser().exec(args);
	}

	private PreferencesBrowser() {
		super();
		this.windows = new HashBag();
		this.windowLocation = this.calculateNewWindowLocation();
	}

	private Point calculateNewWindowLocation() {
		if ((this.windowLocation == null) || (this.windowLocation.x == INIT_X + 100)) {
			return new Point(INIT_X, INIT_Y);
		}
		return new Point(this.windowLocation.x + 20, this.windowLocation.y + 20);
	}

	private void exec(String[] args) throws Exception {
		UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		if ((args == null) || (args.length == 0)) {
			this.preferences = null;
		} else {
			this.preferences = Preferences.userRoot().node(args[0]);
		}
		this.openWindow();
	}

	void openWindow() {
		JFrame window = this.buildWindow();
		this.windows.add(window);
		window.setVisible(true);
	}

	private JFrame buildWindow() {
		JFrame frame = new JFrame(ClassTools.shortClassNameForObject(this));
		frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		frame.addWindowListener(this.buildWindowListener());
		frame.getContentPane().add(this.buildPreferencesPanel(), "Center");
		frame.setLocation(this.windowLocation);
		this.windowLocation = this.calculateNewWindowLocation();
		frame.setSize(400, 400);
		return frame;
	}

	private WindowListener buildWindowListener() {
		return new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				Window window = e.getWindow();
				window.setVisible(false);
				window.dispose();
				PreferencesBrowser.this.windows.remove(window);
				if (PreferencesBrowser.this.windows.isEmpty()) {
					System.exit(0);
				}
			}
		};
	}

	private JPanel buildPreferencesPanel() {
		PreferencesPanel panel = new PreferencesPanel(this.preferences);
		panel.addAction(this.buildNewWindowAction());
		return panel;
	}

	private Action buildNewWindowAction() {
		return new AbstractAction("New Window") {
			public void actionPerformed(ActionEvent event) {
				PreferencesBrowser.this.openWindow();
			}
		};
	}

}
