/*
 * FindBugs - Find Bugs in Java programs
 * Copyright (C) 2006, University of Maryland
 * 
 * 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
 */

package edu.umd.cs.findbugs.gui2;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

/**
 * This is the properties dialog of the GUI. It allows the user to set the 
 * size of the tabs and font size. If the user changes the font size they
 * will be told to restart the computer before the new size takes affect.
 * @author Kristin Stephens
 */
public class PropertiesDialog extends FBDialog {
	private static PropertiesDialog instance;
	private JTextField tabTextField;
	private JTextField fontTextField;

	public static PropertiesDialog getInstance()
	{
		if(instance == null)
			instance = new PropertiesDialog();
		return instance;
	}

	private PropertiesDialog()
	{
		JPanel contentPanel = new JPanel(new BorderLayout());
		JPanel mainPanel = new JPanel();
		mainPanel.setLayout(new GridLayout(2,2));
		mainPanel.add(new JLabel("Tab Size"));
		tabTextField = new JTextField(Integer.toString(GUISaveState.getInstance().getTabSize()));
		mainPanel.add(tabTextField);

		mainPanel.add(new JLabel("Font Size"));
		fontTextField = new JTextField(Float.toString(GUISaveState.getInstance().getFontSize()));
		mainPanel.add(fontTextField);

		contentPanel.add(mainPanel, BorderLayout.CENTER);

		JPanel bottomPanel = new JPanel();
		bottomPanel.add(new JButton(new AbstractAction("Apply")
		{
			public void actionPerformed(ActionEvent evt)
			{
				if(Integer.decode(tabTextField.getText()).intValue() != GUISaveState.getInstance().getTabSize()){
					GUISaveState.getInstance().setTabSize(Integer.decode(tabTextField.getText()).intValue());
					MainFrame.getInstance().displayer.clearCache();
					MainFrame.getInstance().syncBugInformation(); //This causes the GUI to redisplay the current code
				}

				if(Float.parseFloat(fontTextField.getText()) != GUISaveState.getInstance().getFontSize()){
					GUISaveState.getInstance().setFontSize(Float.parseFloat(fontTextField.getText()));
					JOptionPane.showMessageDialog(PropertiesDialog.getInstance(),
							"To implement the new font size, please restart FindBugs.",
							"Changing Font", JOptionPane.INFORMATION_MESSAGE);
				}
			}
		}));

		bottomPanel.add(new JButton(new AbstractAction("Reset")
		{
			public void actionPerformed(ActionEvent evt)
			{
				tabTextField.setText(Integer.toString(GUISaveState.getInstance().getTabSize()));
				fontTextField.setText(Float.toString(GUISaveState.getInstance().getFontSize()));
			}
		}));

		contentPanel.add(bottomPanel, BorderLayout.SOUTH);
		setContentPane(contentPanel);
		setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
		setModal(true);
		pack();

		addWindowListener(new WindowAdapter(){
			@Override
			public void windowDeactivated(WindowEvent e) {
				if(Integer.decode(tabTextField.getText()).intValue() != GUISaveState.getInstance().getTabSize())
					tabTextField.setText(Integer.toString(GUISaveState.getInstance().getTabSize()));

				if(Float.parseFloat(fontTextField.getText()) != GUISaveState.getInstance().getFontSize()){
					fontTextField.setText(Float.toString(GUISaveState.getInstance().getFontSize()));
				}
			}
		});
	}
}
