/* Copyright (c) 2001-2021, The HSQL Development Group
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of the HSQL Development Group nor the names of its
 * contributors may be used to endorse or promote products derived from this
 * software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL HSQL DEVELOPMENT GROUP, HSQLDB.ORG,
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */


package org.hsqldb.util;

import java.awt.Dimension;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

// sqlbob@users 20020407 - patch 1.7.0 - reengineering
// weconsultants@users 20041109 - patch 1.8.0 - enhancements:
//      Added Methods: setSwingLAF(), LookAndFeelInfo(), setFramePositon()
//      errorMessage(String errorMessage),
//      errorMessage(Exception exceptionMsg,
//      Added: Ability to switch the current LAF while runing (Native,Java or Motif)

/**
 * Common code in the Swing versions of DatabaseManager and Tranfer
 *
 * @author Bob Preston (sqlbob@users dot sourceforge.net)
 * @version 1.7.2
 * @since 1.7.0
 */
final class CommonSwing {

    protected static final String messagerHeader =
        "Database Manager Swing Error";
    protected static final String Native = "Native";
    protected static final String Java   = "Java";
    protected static final String Motif  = "Motif";
    protected static String       plaf   = "plaf";
    protected static String       GTK    = "GTK";

    // (ulrivo): An actual Image.
    static Image getIcon(String target) {

        if (target.equalsIgnoreCase("SystemCursor")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("Hourglass.gif")).getImage());
        } else if (target.equalsIgnoreCase("Frame")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("hsqldb.png")).getImage());
        } else if (target.equalsIgnoreCase("Execute")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("run_exc.gif")).getImage());
        } else if (target.equalsIgnoreCase("StatusRunning")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("RedCircle.gif")).getImage());
        } else if (target.equalsIgnoreCase("StatusReady")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("GreenCircle.gif")).getImage());
        } else if (target.equalsIgnoreCase("Clear")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("Clear.png")).getImage());
        } else if (target.equalsIgnoreCase("Problem")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("problems.gif")).getImage());
        } else if (target.equalsIgnoreCase("BoldFont")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("Bold.gif")).getImage());
        } else if (target.equalsIgnoreCase("ItalicFont")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("Italic.gif")).getImage());
        } else if (target.equalsIgnoreCase("ColorSelection")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("Colors.png")).getImage());
        } else if (target.equalsIgnoreCase("Close")) {
            return (new ImageIcon(
                CommonSwing.class.getResource("Close.png")).getImage());
        } else {
            return (null);
        }
    }

    // (weconsultants@users: Callable errorMessage method
    protected static void errorMessage(String errorMessage) {

        /*
         * Display Jpanel Error messages any text Errors. Overloads
         * errorMessage(Exception exceptionMsg)
         */
        Object[] options = { "OK" };

        JOptionPane.showOptionDialog(null, errorMessage, messagerHeader,
                                     JOptionPane.DEFAULT_OPTION,
                                     JOptionPane.WARNING_MESSAGE, null,
                                     options, options[0]);

        // DatabaseManagerSwing.StatusMessage(READY_STATUS);
    }

    public static void errorMessage(Exception exceptionMsg) {
        errorMessage(exceptionMsg, false);
    }

    // (weconsultants@users: Callable errorMessage method
    public static void errorMessage(Exception exceptionMsg, boolean quiet) {

        /*
         * Display Jpanel Error messages any SQL Errors. Overloads
         * errorMessage(String e)
         */
        Object[] options = { "OK", };

        JOptionPane.showOptionDialog(null, exceptionMsg, messagerHeader,
                                     JOptionPane.DEFAULT_OPTION,
                                     JOptionPane.ERROR_MESSAGE, null, options,
                                     options[0]);

        if (!quiet) {
            exceptionMsg.printStackTrace();
        }

        // DatabaseManagerSwing.StatusMessage(READY_STATUS);
    }

    // (weconsultants@users: Callable setFramePositon method
    static void setFramePositon(JFrame inTargetFrame) {

        Dimension d    = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension size = inTargetFrame.getSize();

        // (ulrivo): full size on screen with less than 640 width
        if (d.width >= 640) {
            inTargetFrame.setLocation((d.width - size.width) / 2,
                                      (d.height - size.height) / 2);
        } else {
            inTargetFrame.setLocation(0, 0);
            inTargetFrame.setSize(d);
        }
    }

// (weconsultants@users: Commented out, Not need now. Was not being called anyway.. Could delete?
//    static void setDefaultColor() {
//
//        Color hsqlBlue = new Color(102, 153, 204);
//        Color hsqlGreen = new Color(153, 204, 204);
//        UIDefaults d = UIManager.getLookAndFeelDefaults();
//
//        d.put("MenuBar.background", SystemColor.control);
//        d.put("Menu.background", SystemColor.control);
//        d.put("Menu.selectionBackground", hsqlBlue);
//        d.put("MenuItem.background", SystemColor.menu);
//        d.put("MenuItem.selectionBackground", hsqlBlue);
//        d.put("Separator.foreground", SystemColor.controlDkShadow);
//        d.put("Button.background", SystemColor.control);
//        d.put("CheckBox.background", SystemColor.control);
//        d.put("Label.background", SystemColor.control);
//        d.put("Label.foreground", Color.black);
//        d.put("Panel.background", SystemColor.control);
//        d.put("PasswordField.selectionBackground", hsqlGreen);
//        d.put("PasswordField.background", SystemColor.white);
//        d.put("TextArea.selectionBackground", hsqlGreen);
//        d.put("TextField.background", SystemColor.white);
//        d.put("TextField.selectionBackground", hsqlGreen);
//        d.put("TextField.background", SystemColor.white);
//        d.put("ScrollBar.background", SystemColor.controlHighlight);
//        d.put("ScrollBar.foreground", SystemColor.control);
//        d.put("ScrollBar.track", SystemColor.controlHighlight);
//        d.put("ScrollBar.trackHighlight", SystemColor.controlDkShadow);
//        d.put("ScrollBar.thumb", SystemColor.control);
//        d.put("ScrollBar.thumbHighlight", SystemColor.controlHighlight);
//        d.put("ScrollBar.thumbDarkShadow", SystemColor.controlDkShadow);
//        d.put("ScrollBar.thumbLightShadow", SystemColor.controlShadow);
//        d.put("ComboBox.background", SystemColor.control);
//        d.put("ComboBox.selectionBackground", hsqlBlue);
//        d.put("Table.background", SystemColor.white);
//        d.put("Table.selectionBackground", hsqlBlue);
//        d.put("TableHeader.background", SystemColor.control);
//
//        // This doesn't seem to work.
//        d.put("SplitPane.background", SystemColor.control);
//        d.put("Tree.selectionBackground", hsqlBlue);
//        d.put("List.selectionBackground", hsqlBlue);
//    }
    // (weconsultants@users: Callable setSwingLAF method for changing LAF
    static void setSwingLAF(java.awt.Component comp, String targetTheme) {

        try {
            if (targetTheme.equalsIgnoreCase(Native)) {
                UIManager.setLookAndFeel(
                    UIManager.getSystemLookAndFeelClassName());
            } else if (targetTheme.equalsIgnoreCase(Java)) {
                UIManager.setLookAndFeel(
                    UIManager.getCrossPlatformLookAndFeelClassName());
            } else if (targetTheme.equalsIgnoreCase(Motif)) {
                UIManager.setLookAndFeel(
                    "com.sun.java.swing.plaf.motif.MotifLookAndFeel");
            }

//            if (targetTheme.equalsIgnoreCase(plaf)){
//                UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
//            }
//
//            if (targetTheme.equalsIgnoreCase(GTK)){
//                UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
//            }
            SwingUtilities.updateComponentTreeUI(comp);

            if (comp instanceof java.awt.Frame) {
                ((java.awt.Frame) comp).pack();
            }
        } catch (Exception e) {
            errorMessage(e);
        }
    }
}
