/*
 * Copyright 2003-2007 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code 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 General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

package sun.awt.X11;

import java.awt.Color;
import java.awt.Font;
import java.awt.SystemColor;

import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.border.*;
import javax.swing.text.DefaultEditorKit;

import javax.swing.plaf.basic.BasicBorders;
import com.sun.java.swing.plaf.motif.*;
import sun.awt.X11.XComponentPeer;

class XAWTLookAndFeel extends MotifLookAndFeel {

    /**
     * Load the SystemColors into the defaults table.  The keys
     * for SystemColor defaults are the same as the names of
     * the public fields in SystemColor.  If the table is being
     * created on a native Motif platform we use the SystemColor
     * values, otherwise we create color objects whose values match
     * the default CDE/Motif colors.
     */
    protected void initSystemColorDefaults(UIDefaults table) {
        String[] defaultSystemColors = {
            "desktop", "#005C5C", /* Color of the desktop background */
            "activeCaption", "#000080", /* Color for captions (title bars) when they are active. */
            "activeCaptionText", "#FFFFFF", /* Text color for text in captions (title bars). */
            "activeCaptionBorder", "#B24D7A", /* Border color for caption (title bar) window borders. */
            "inactiveCaption", "#AEB2C3", /* Color for captions (title bars) when not active. */
            "inactiveCaptionText", "#000000", /* Text color for text in inactive captions (title bars). */
            "inactiveCaptionBorder", "#AEB2C3", /* Border color for inactive caption (title bar) window borders. */
            "window", "#AEB2C3", /* Default color for the interior of windows */
            "windowBorder", "#AEB2C3", /* ??? */
            "windowText", "#000000", /* ??? */
            "menu", "#AEB2C3", /* ??? */
            "menuText", "#000000", /* ??? */
            "text", "#FFF7E9", /* Text background color */
            "textText", "#000000", /* Text foreground color */
            "textHighlight", "#000000", /* Text background color when selected */
            "textHighlightText", "#FFF7E9", /* Text color when selected */
            "textInactiveText", "#808080", /* Text color when disabled */
            "control", "#AEB2C3", /* Default color for controls (buttons, sliders, etc) */
            "controlText", "#000000", /* Default color for text in controls */
            "controlHighlight", "#DCDEE5", /* Highlight color for controls */
            "controlLtHighlight", "#DCDEE5", /* Light highlight color for controls */
            "controlShadow", "#63656F", /* Shadow color for controls */
            "controlLightShadow", "#9397A5", /* Shadow color for controls */
            "controlDkShadow", "#000000", /* Dark shadow color for controls */
            "scrollbar", "#AEB2C3", /* Scrollbar ??? color. PENDING(jeff) foreground? background? ?*/
            "info", "#FFF7E9", /* ??? */
            "infoText", "#000000"  /* ??? */
        };

        loadSystemColors(table, defaultSystemColors, true);
    }

    protected void initComponentDefaults(UIDefaults table) {
        super.initComponentDefaults(table);

        FontUIResource dialogPlain12 = new FontUIResource(Font.DIALOG,
                                                          Font.PLAIN, 12);
        FontUIResource sansSerifPlain12 = new FontUIResource(Font.SANS_SERIF,
                                                             Font.PLAIN, 12);
        FontUIResource monospacedPlain12 = new FontUIResource(Font.MONOSPACED,
                                                              Font.PLAIN, 12);
        ColorUIResource red = new ColorUIResource(Color.red);
        ColorUIResource black = new ColorUIResource(Color.black);
        ColorUIResource white = new ColorUIResource(Color.white);
        ColorUIResource lightGray = new ColorUIResource(Color.lightGray);
        ColorUIResource controlDarker =  new ColorUIResource(SystemColor.controlDkShadow);

        Color back = table.getColor("control");
        Color colors [] = XComponentPeer.getSystemColors();
        Color scrollBarBackground = colors[XComponentPeer.BACKGROUND_COLOR];
        Color trackColor = new Color(MotifColorUtilities.calculateSelectFromBackground(scrollBarBackground.getRed(), scrollBarBackground.getGreen(), scrollBarBackground.getBlue()));
        Border loweredBevelBorder = new MotifBorders.BevelBorder(false,
                                                                 table.getColor("controlShadow"),
                                                                 table.getColor("controlLtHighlight"));

        Border raisedBevelBorder = new MotifBorders.BevelBorder(true,
                                                                table.getColor("controlShadow"),
                                                                table.getColor("controlLtHighlight"));

        Border marginBorder = new BasicBorders.MarginBorder();

        Border focusBorder = new MotifBorders.FocusBorder(
            table.getColor("control"),
            table.getColor("activeCaptionBorder"));


        Border focusBevelBorder = new BorderUIResource.CompoundBorderUIResource(
            focusBorder,
            loweredBevelBorder);

        Border textFieldBorder = new BorderUIResource.CompoundBorderUIResource(
            focusBevelBorder,
            marginBorder);

        // *** Text

        Object fieldInputMap = new UIDefaults.LazyInputMap(new Object[] {
            "COPY", DefaultEditorKit.copyAction,
            "PASTE", DefaultEditorKit.pasteAction,
            "CUT", DefaultEditorKit.cutAction,
            "control C", DefaultEditorKit.copyAction,
            "control V", DefaultEditorKit.pasteAction,
            "control X", DefaultEditorKit.cutAction,
            "control INSERT", DefaultEditorKit.copyAction,
            "shift INSERT", DefaultEditorKit.pasteAction,
            "shift DELETE", DefaultEditorKit.cutAction,
            "control F", DefaultEditorKit.forwardAction,
            "control B", DefaultEditorKit.backwardAction,
            "control D", DefaultEditorKit.deleteNextCharAction,
            "typed \010", DefaultEditorKit.deletePrevCharAction,
            "DELETE", DefaultEditorKit.deleteNextCharAction,
            "RIGHT", DefaultEditorKit.forwardAction,
            "LEFT", DefaultEditorKit.backwardAction,
            "KP_RIGHT", DefaultEditorKit.forwardAction,
            "KP_LEFT", DefaultEditorKit.backwardAction,
            "shift LEFT", DefaultEditorKit.selectionBackwardAction,
            "shift RIGHT", DefaultEditorKit.selectionForwardAction,
            "control LEFT", DefaultEditorKit.previousWordAction,
            "control RIGHT", DefaultEditorKit.nextWordAction,
            "control shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
            "control shift RIGHT", DefaultEditorKit.selectionNextWordAction,
            "control SLASH", DefaultEditorKit.selectAllAction,
            "HOME", DefaultEditorKit.beginLineAction,
            "END", DefaultEditorKit.endLineAction,
            "shift HOME", DefaultEditorKit.selectionBeginLineAction,
            "shift END", DefaultEditorKit.selectionEndLineAction,
            "control BACK_SLASH", "unselect",
            "ENTER", JTextField.notifyAction,
            "control shift O", "toggle-componentOrientation"
        });

        Object passwordInputMap = new UIDefaults.LazyInputMap(new Object[] {
            "COPY", DefaultEditorKit.copyAction,
            "PASTE", DefaultEditorKit.pasteAction,
            "CUT", DefaultEditorKit.cutAction,
            "control C", DefaultEditorKit.copyAction,
            "control V", DefaultEditorKit.pasteAction,
            "control X", DefaultEditorKit.cutAction,
            "control INSERT", DefaultEditorKit.copyAction,
            "shift INSERT", DefaultEditorKit.pasteAction,
            "shift DELETE", DefaultEditorKit.cutAction,
            "control F", DefaultEditorKit.forwardAction,
            "control B", DefaultEditorKit.backwardAction,
            "control D", DefaultEditorKit.deleteNextCharAction,
            "typed \010", DefaultEditorKit.deletePrevCharAction,
            "DELETE", DefaultEditorKit.deleteNextCharAction,
            "RIGHT", DefaultEditorKit.forwardAction,
            "LEFT", DefaultEditorKit.backwardAction,
            "KP_RIGHT", DefaultEditorKit.forwardAction,
            "KP_LEFT", DefaultEditorKit.backwardAction,
            "shift LEFT", DefaultEditorKit.selectionBackwardAction,
            "shift RIGHT", DefaultEditorKit.selectionForwardAction,
            "control LEFT", DefaultEditorKit.beginLineAction,
            "control RIGHT", DefaultEditorKit.endLineAction,
            "control shift LEFT", DefaultEditorKit.selectionBeginLineAction,
            "control shift RIGHT", DefaultEditorKit.selectionEndLineAction,
            "control SLASH", DefaultEditorKit.selectAllAction,
            "HOME", DefaultEditorKit.beginLineAction,
            "END", DefaultEditorKit.endLineAction,
            "shift HOME", DefaultEditorKit.selectionBeginLineAction,
            "shift END", DefaultEditorKit.selectionEndLineAction,
            "control BACK_SLASH", "unselect",
            "ENTER", JTextField.notifyAction,
            "control shift O", "toggle-componentOrientation"
        });

        Object multilineInputMap = new UIDefaults.LazyInputMap(new Object[] {
            "COPY", DefaultEditorKit.copyAction,
            "PASTE", DefaultEditorKit.pasteAction,
            "CUT", DefaultEditorKit.cutAction,
            "control C", DefaultEditorKit.copyAction,
            "control V", DefaultEditorKit.pasteAction,
            "control X", DefaultEditorKit.cutAction,
            "control INSERT", DefaultEditorKit.copyAction,
            "shift INSERT", DefaultEditorKit.pasteAction,
            "shift DELETE", DefaultEditorKit.cutAction,
            "control F", DefaultEditorKit.forwardAction,
            "control B", DefaultEditorKit.backwardAction,
            "control D", DefaultEditorKit.deleteNextCharAction,
            "typed \010", DefaultEditorKit.deletePrevCharAction,
            "DELETE", DefaultEditorKit.deleteNextCharAction,
            "RIGHT", DefaultEditorKit.forwardAction,
            "LEFT", DefaultEditorKit.backwardAction,
            "KP_RIGHT", DefaultEditorKit.forwardAction,
            "KP_LEFT", DefaultEditorKit.backwardAction,
            "shift LEFT", DefaultEditorKit.selectionBackwardAction,
            "shift RIGHT", DefaultEditorKit.selectionForwardAction,
            "control LEFT", DefaultEditorKit.previousWordAction,
            "control RIGHT", DefaultEditorKit.nextWordAction,
            "control shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
            "control shift RIGHT", DefaultEditorKit.selectionNextWordAction,
            "control SLASH", DefaultEditorKit.selectAllAction,
            "HOME", DefaultEditorKit.beginLineAction,
            "END", DefaultEditorKit.endLineAction,
            "shift HOME", DefaultEditorKit.selectionBeginLineAction,
            "shift END", DefaultEditorKit.selectionEndLineAction,

            "control N", DefaultEditorKit.downAction,
            "control P", DefaultEditorKit.upAction,
            "UP", DefaultEditorKit.upAction,
            "DOWN", DefaultEditorKit.downAction,
            "KP_UP", DefaultEditorKit.upAction,
            "KP_DOWN", DefaultEditorKit.downAction,
            "PAGE_UP", DefaultEditorKit.pageUpAction,
            "PAGE_DOWN", DefaultEditorKit.pageDownAction,
            "shift PAGE_UP", "selection-page-up",
            "shift PAGE_DOWN", "selection-page-down",
            "ctrl shift PAGE_UP", "selection-page-left",
            "ctrl shift PAGE_DOWN", "selection-page-right",
            "shift UP", DefaultEditorKit.selectionUpAction,
            "shift DOWN", DefaultEditorKit.selectionDownAction,
            "shift KP_UP", DefaultEditorKit.selectionUpAction,
            "shift KP_DOWN", DefaultEditorKit.selectionDownAction,
            "ENTER", DefaultEditorKit.insertBreakAction,
            "TAB", DefaultEditorKit.insertTabAction,
            "control BACK_SLASH", "unselect",
            "control HOME", DefaultEditorKit.beginAction,
            "control END", DefaultEditorKit.endAction,
            "control shift HOME", DefaultEditorKit.selectionBeginAction,
            "control shift END", DefaultEditorKit.selectionEndAction,
            "control T", "next-link-action",
            "control shift T", "previous-link-action",
            "control SPACE", "activate-link-action",
            "control shift O", "toggle-componentOrientation"
        });

        Object sliderFocusInsets = new InsetsUIResource( 0, 0, 0, 0 );

        Object[] defaults = {

            "ScrollBar.background", scrollBarBackground,
            "ScrollBar.foreground", table.get("control"),
            "ScrollBar.track", trackColor,
            "ScrollBar.trackHighlight", trackColor,
            "ScrollBar.thumb", scrollBarBackground,
            "ScrollBar.thumbHighlight", table.get("controlHighlight") ,
            "ScrollBar.thumbDarkShadow", table.get("controlDkShadow"),
            "ScrollBar.thumbShadow", table.get("controlShadow"),
            "ScrollBar.border", loweredBevelBorder,
            "ScrollBar.allowsAbsolutePositioning", Boolean.TRUE,
            "ScrollBar.defaultWidth", Integer.valueOf(17),
            "ScrollBar.focusInputMap",
            new UIDefaults.LazyInputMap(new Object[] {
                "RIGHT", "positiveUnitIncrement",
                "KP_RIGHT", "positiveUnitIncrement",
                "DOWN", "positiveUnitIncrement",
                "KP_DOWN", "positiveUnitIncrement",
                "PAGE_DOWN", "positiveBlockIncrement",
                "ctrl PAGE_DOWN", "positiveBlockIncrement",
                "LEFT", "negativeUnitIncrement",
                "KP_LEFT", "negativeUnitIncrement",
                "UP", "negativeUnitIncrement",
                "KP_UP", "negativeUnitIncrement",
                "PAGE_UP", "negativeBlockIncrement",
                "ctrl PAGE_UP", "negativeBlockIncrement",
                "HOME", "minScroll",
                "END", "maxScroll"
            }),

            "ScrollPane.font", dialogPlain12,
            "ScrollPane.background", scrollBarBackground,
            "ScrollPane.foreground", table.get("controlText"),
            "ScrollPane.border", null,
            "ScrollPane.viewportBorder", loweredBevelBorder,
            "ScrollPane.ancestorInputMap",
            new UIDefaults.LazyInputMap(new Object[] {
                "RIGHT", "unitScrollRight",
                "KP_RIGHT", "unitScrollRight",
                "DOWN", "unitScrollDown",
                "KP_DOWN", "unitScrollDown",
                "LEFT", "unitScrollLeft",
                "KP_LEFT", "unitScrollLeft",
                "UP", "unitScrollUp",
                "KP_UP", "unitScrollUp",
                "PAGE_UP", "scrollUp",
                "PAGE_DOWN", "scrollDown",
                "ctrl PAGE_UP", "scrollLeft",
                "ctrl PAGE_DOWN", "scrollRight",
                "ctrl HOME", "scrollHome",
                "ctrl END", "scrollEnd"
            }),

            "FormattedTextField.focusInputMap",
            new UIDefaults.LazyInputMap(new Object[] {
                "ctrl C", DefaultEditorKit.copyAction,
                "ctrl V", DefaultEditorKit.pasteAction,
                "ctrl X", DefaultEditorKit.cutAction,
                "COPY", DefaultEditorKit.copyAction,
                "PASTE", DefaultEditorKit.pasteAction,
                "CUT", DefaultEditorKit.cutAction,
                "shift LEFT", DefaultEditorKit.selectionBackwardAction,
                "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
                "shift RIGHT", DefaultEditorKit.selectionForwardAction,
                "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
                "ctrl LEFT", DefaultEditorKit.previousWordAction,
                "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
                "ctrl RIGHT", DefaultEditorKit.nextWordAction,
                "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
                "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
                "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
                "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
                "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
                "ctrl A", DefaultEditorKit.selectAllAction,
                "HOME", DefaultEditorKit.beginLineAction,
                "END", DefaultEditorKit.endLineAction,
                "shift HOME", DefaultEditorKit.selectionBeginLineAction,
                "shift END", DefaultEditorKit.selectionEndLineAction,
                "typed \010", DefaultEditorKit.deletePrevCharAction,
                "DELETE", DefaultEditorKit.deleteNextCharAction,
                "RIGHT", DefaultEditorKit.forwardAction,
                "LEFT", DefaultEditorKit.backwardAction,
                "KP_RIGHT", DefaultEditorKit.forwardAction,
                "KP_LEFT", DefaultEditorKit.backwardAction,
                "ENTER", JTextField.notifyAction,
                "ctrl BACK_SLASH", "unselect",
                "control shift O", "toggle-componentOrientation",
                "ESCAPE", "reset-field-edit",
                "UP", "increment",
                "KP_UP", "increment",
                "DOWN", "decrement",
                "KP_DOWN", "decrement",
            }),

            "TextField.caretForeground", black,
            "TextField.caretBlinkRate", Integer.valueOf(500),
            "TextField.inactiveForeground", table.get("textInactiveText"),
            "TextField.selectionBackground", table.get("textHighlight"),
            "TextField.selectionForeground", table.get("textHighlightText"),
            "TextField.background", table.get("window"),
            "TextField.foreground", table.get("textText"),
            "TextField.font", sansSerifPlain12,
            "TextField.border", textFieldBorder,
            "TextField.focusInputMap", fieldInputMap,

            "PasswordField.caretForeground", black,
            "PasswordField.caretBlinkRate", Integer.valueOf(500),
            "PasswordField.inactiveForeground", table.get("textInactiveText"),
            "PasswordField.selectionBackground", table.get("textHighlight"),
            "PasswordField.selectionForeground", table.get("textHighlightText"),
            "PasswordField.background", table.get("window"),
            "PasswordField.foreground", table.get("textText"),
            "PasswordField.font", sansSerifPlain12,
            "PasswordField.border", textFieldBorder,
            "PasswordField.focusInputMap", passwordInputMap,

            "TextArea.caretForeground", black,
            "TextArea.caretBlinkRate", Integer.valueOf(500),
            "TextArea.inactiveForeground", table.get("textInactiveText"),
            "TextArea.selectionBackground", table.get("textHighlight"),
            "TextArea.selectionForeground", table.get("textHighlightText"),
            "TextArea.background", table.get("window"),
            "TextArea.foreground", table.get("textText"),
            "TextArea.font", monospacedPlain12,
            "TextArea.border", marginBorder,
            "TextArea.focusInputMap", multilineInputMap
        };

        table.putDefaults(defaults);
    }
}
