All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sourceforge.squirrel_sql.client.preferences.GlobalPreferencesSheet Maven / Gradle / Ivy

package net.sourceforge.squirrel_sql.client.preferences;
/*
 * Copyright (C) 2001-2004 Colin Bell
 * [email protected]
 *
 * 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
 */

import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.plugin.PluginInfo;
import static net.sourceforge.squirrel_sql.client.preferences.PreferenceType.DATATYPE_PREFERENCES;
import net.sourceforge.squirrel_sql.fw.gui.CursorChanger;
import net.sourceforge.squirrel_sql.fw.gui.GUIUtils;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.prefs.Preferences;
/**
 * This sheet allows the user to maintain global preferences.
 * JASON: Rename to GlobalPreferencesInternalFrame
 *
 * @author Colin Bell
 */
@SuppressWarnings("serial")
public class GlobalPreferencesSheet extends DialogWidget
{
	/** Internationalized strings for this class. */
	private static final StringManager s_stringMgr =
		StringManagerFactory.getStringManager(GlobalPreferencesSheet.class);

	/** Logger for this class. */
	private final static ILogger s_log =
		LoggerController.createLogger(GlobalPreferencesSheet.class);

	/** Singleton instance of this class. */
	private static GlobalPreferencesSheet s_instance;

	/** Application API. */
	private IApplication _app;

	/**
	 * List of all the panels (instances of
	 * IGlobalPreferencesPanel objects in shhet.
	 */
	private List _panels = 
        new ArrayList();

   private JTabbedPane _tabPane;


   /** Sheet title. */
	private JLabel _titleLbl = new JLabel();

	public static final String PREF_KEY_GLOBAL_PREFS_SHEET_WIDTH = "Squirrel.globalPrefsSheetWidth";
	public static final String PREF_KEY_GLOBAL_PREFS_SHEET_HEIGHT = "Squirrel.globalPrefsSheetHeight";


	private static ArrayList _listeners = 
	   new ArrayList();
	
   /**
    * Ctor specifying the application API.
    *
    * @param	app		Application API.
    *
    * @throws	IllegalArgumentException
    *			Thrown if a null IApplication passed.
    */
   private GlobalPreferencesSheet(IApplication app)
   {
      super(s_stringMgr.getString("GlobalPreferencesSheet.title"), true, app);
      if (app == null)
      {
         throw new IllegalArgumentException("IApplication == null");
      }

      _app = app;
      createGUI();

      for (Iterator it = _panels.iterator(); it.hasNext();)
      {
         IGlobalPreferencesPanel pnl = it.next();
         try
         {
            pnl.initialize(_app);
         }
         catch (Throwable th)
         {
            final String msg = s_stringMgr.getString("GlobalPreferencesSheet.error.loading", pnl.getTitle());
            s_log.error(msg, th);
            _app.showErrorDialog(msg, th);
         }
      }
      setSize(getDimension());

      app.getMainFrame().addWidget(this);
      DialogWidget.centerWithinDesktop(this);
      setVisible(true);

   }

	private Dimension getDimension()
	{
		return new Dimension(
			Preferences.userRoot().getInt(PREF_KEY_GLOBAL_PREFS_SHEET_WIDTH, 650),
			Preferences.userRoot().getInt(PREF_KEY_GLOBAL_PREFS_SHEET_HEIGHT, 600)
		);
	}


	/**
	 * Registers a GlobalPreferencesActionListener to receive callbacks when 
	 * certain actions take place.
	 * 
	 * @param listener the GlobalPreferencesActionListener to register.
	 */
	public static void addGlobalPreferencesActionListener(GlobalPreferencesActionListener listener) {
	   _listeners.add(listener);
	}
	
	
   /**
    * Unregisters a GlobalPreferencesActionListener to receive callbacks when 
    * certain actions take place.
    * 
    * @param listener the GlobalPreferencesActionListener to unregister.
    */
   public static void removeGlobalPreferencesActionListener(GlobalPreferencesActionListener listener) {
      _listeners.remove(listener);
   }
	
	
	/**
	 * Show the Preferences dialog
	 *
	 * @param	app		Application API.
	 *
	 * @throws	IllegalArgumentException
	 * 			Thrown if a null IApplication object passed.
	 */
    @SuppressWarnings("unchecked")
	public static synchronized void showSheet(IApplication app, Class componentClassOfTabToSelect)
	{
		if (s_instance == null)
		{
			s_instance = new GlobalPreferencesSheet(app);
		}
		else
		{
         s_instance.moveToFront();
		}

      if(null != componentClassOfTabToSelect)
      {
         s_instance.selectTab(componentClassOfTabToSelect);
      }
      for (GlobalPreferencesActionListener listener : _listeners) {
         listener.onDisplayGlobalPreferences();
      }
   }
   @SuppressWarnings("unchecked")
   private void selectTab(Class componentClassofTabToSelect)
   {
      for (int i = 0; i < _tabPane.getTabCount(); i++)
      {
         Component comp = _tabPane.getComponentAt(i);
         if(JScrollPane.class.equals(comp.getClass()))
         {
            comp = ((JScrollPane) comp).getViewport().getView();
         }

         if(componentClassofTabToSelect.equals(comp.getClass()))
         {
            _tabPane.setSelectedIndex(i);
            return;
         }
      }
   }

   public void dispose()
   {
      Dimension size = getSize();
      Preferences.userRoot().putInt(PREF_KEY_GLOBAL_PREFS_SHEET_WIDTH, size.width);
      Preferences.userRoot().putInt(PREF_KEY_GLOBAL_PREFS_SHEET_HEIGHT, size.height);

      for (Iterator it = _panels.iterator(); it.hasNext();)
      {
         IGlobalPreferencesPanel pnl = it.next();
         pnl.uninitialize(_app);
      }

      synchronized (GlobalPreferencesSheet.class)
      {
         s_instance = null;
      }
      super.dispose();
   }


	/**
	 * Set title of this frame. Ensure that the title label
	 * matches the frame title.
	 *
	 * @param	title	New title text.
	 */
	public void setTitle(String title)
	{
		super.setTitle(title);
		_titleLbl.setText(title);
	}

	/**
	 * Close this sheet.
	 */
	private void performClose()
	{
		dispose();
      for (GlobalPreferencesActionListener listener : _listeners) {
         listener.onPerformClose();
      }		
	}

	/**
	 * OK button pressed so save changes.
	 */
	private void performOk()
	{
		CursorChanger cursorChg = new CursorChanger(_app.getMainFrame());
		cursorChg.show();
		try
		{
			final boolean isDebug = s_log.isDebugEnabled();
			long start = 0;
			for (Iterator it = _panels.iterator(); it.hasNext();)
			{
				if (isDebug)
				{
					start = System.currentTimeMillis();
				}
				IGlobalPreferencesPanel pnl = it.next();
				try
				{
					pnl.applyChanges();
				}
				catch (Throwable th)
				{
					final String msg = s_stringMgr.getString("GlobalPreferencesSheet.error.saving", pnl.getTitle());
					s_log.error(msg, th);
					_app.showErrorDialog(msg, th);
				}
				if (isDebug)
				{
					s_log.debug("Panel " + pnl.getTitle()
								+ " applied changes in "
								+ (System.currentTimeMillis() - start) + "ms");
				}
			}
		}
		finally
		{
         _app.savePreferences(DATATYPE_PREFERENCES);
         cursorChg.restore();
      }

		dispose();
      for (GlobalPreferencesActionListener listener : _listeners) {
         listener.onPerformOk();
      }		
	}
    
	/**
	 * Create user interface.
	 */
	private void createGUI()
	{
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

		// This is a tool window.
		makeToolWindow(true);

		// Add panels for core Squirrel functionality.
		_panels.add(new GeneralPreferencesPanel());
		_panels.add(new SQLPreferencesPanel(_app.getMainFrame()));
		_panels.add(new ProxyPreferencesPanel());
		_panels.add(new DataTypePreferencesPanel());
		_panels.add(new UpdatePreferencesTab());
		_panels.add(new WikiTablePreferencesTab());

		// Go thru all loaded plugins asking for panels.
		PluginInfo[] plugins = _app.getPluginManager().getPluginInformation();
		for (int plugIdx = 0; plugIdx < plugins.length; ++plugIdx)
		{
			PluginInfo pi = plugins[plugIdx];
			if (pi.isLoaded())
			{
				IGlobalPreferencesPanel[] pnls = pi.getPlugin().getGlobalPreferencePanels();
				if (pnls != null && pnls.length > 0)
				{
					for (int pnlIdx = 0; pnlIdx < pnls.length; ++pnlIdx)
					{
						_panels.add(pnls[pnlIdx]);
					}
				}
			}
		}

		// Add all panels to the tabbed pane.
		_tabPane = UIFactory.getInstance().createTabbedPane();
		for (Iterator it = _panels.iterator(); it.hasNext();)
		{
			IGlobalPreferencesPanel pnl = it.next();
			String pnlTitle = pnl.getTitle();
			String hint = pnl.getHint();
			_tabPane.addTab(pnlTitle, null, pnl.getPanelComponent(), hint);
		}

		// This seems to be necessary to get background colours
		// correct. Without it labels added to the content pane
		// have a dark background while those added to a JPanel
		// in the content pane have a light background under
		// the java look and feel. Similar effects occur for other
		// look and feels.
		final JPanel contentPane = new JPanel();
		contentPane.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
		setContentPane(contentPane);

		GridBagConstraints gbc = new GridBagConstraints();
		contentPane.setLayout(new GridBagLayout());

		gbc.gridwidth = 1;
		gbc.fill = GridBagConstraints.BOTH;

		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.weightx = 1;
		contentPane.add(_titleLbl, gbc);

		++gbc.gridy;
		gbc.weighty = 1;
		contentPane.add(_tabPane, gbc);

		++gbc.gridy;
		gbc.weighty = 0;
		contentPane.add(createButtonsPanel(), gbc);

      AbstractAction closeAction = new AbstractAction()
      {
         public void actionPerformed(ActionEvent actionEvent)
         {
            performClose();
         }
      };
      KeyStroke escapeStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
      getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(escapeStroke, "CloseAction");
      getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(escapeStroke, "CloseAction");
      getRootPane().getInputMap(JComponent.WHEN_FOCUSED).put(escapeStroke, "CloseAction");
      getRootPane().getActionMap().put("CloseAction", closeAction);


   }

	/**
	 * Create panel at bottom containing the buttons.
	 */
	private JPanel createButtonsPanel()
	{
		JPanel pnl = new JPanel();

		JButton okBtn = new JButton(s_stringMgr.getString("GlobalPreferencesSheet.ok"));
		okBtn.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent evt)
			{
				performOk();
			}
		});
		JButton closeBtn = new JButton(s_stringMgr.getString("GlobalPreferencesSheet.close"));
		closeBtn.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent evt)
			{
				performClose();
			}
		});

		GUIUtils.setJButtonSizesTheSame(new JButton[] { okBtn, closeBtn });

		pnl.add(okBtn);
		pnl.add(closeBtn);

		getRootPane().setDefaultButton(okBtn);

		return pnl;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy