1 /*
   2  * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package sun.awt.X11;
  27 
  28 import java.awt.Color;
  29 import java.awt.Font;
  30 import java.awt.SystemColor;
  31 
  32 import javax.swing.*;
  33 import javax.swing.plaf.*;
  34 import javax.swing.border.*;
  35 import javax.swing.text.DefaultEditorKit;
  36 
  37 import javax.swing.plaf.basic.BasicBorders;
  38 import com.sun.java.swing.plaf.motif.*;
  39 import sun.awt.X11.XComponentPeer;
  40 
  41 @SuppressWarnings("serial") // JDK-implementation class
  42 class XAWTLookAndFeel extends MotifLookAndFeel {
  43 
  44     /**
  45      * Load the SystemColors into the defaults table.  The keys
  46      * for SystemColor defaults are the same as the names of
  47      * the public fields in SystemColor.  If the table is being
  48      * created on a native Motif platform we use the SystemColor
  49      * values, otherwise we create color objects whose values match
  50      * the default CDE/Motif colors.
  51      */
  52     protected void initSystemColorDefaults(UIDefaults table) {
  53         String[] defaultSystemColors = {
  54             "desktop", "#005C5C", /* Color of the desktop background */
  55             "activeCaption", "#000080", /* Color for captions (title bars) when they are active. */
  56             "activeCaptionText", "#FFFFFF", /* Text color for text in captions (title bars). */
  57             "activeCaptionBorder", "#B24D7A", /* Border color for caption (title bar) window borders. */
  58             "inactiveCaption", "#AEB2C3", /* Color for captions (title bars) when not active. */
  59             "inactiveCaptionText", "#000000", /* Text color for text in inactive captions (title bars). */
  60             "inactiveCaptionBorder", "#AEB2C3", /* Border color for inactive caption (title bar) window borders. */
  61             "window", "#AEB2C3", /* Default color for the interior of windows */
  62             "windowBorder", "#AEB2C3", /* ??? */
  63             "windowText", "#000000", /* ??? */
  64             "menu", "#AEB2C3", /* ??? */
  65             "menuText", "#000000", /* ??? */
  66             "text", "#FFF7E9", /* Text background color */
  67             "textText", "#000000", /* Text foreground color */
  68             "textHighlight", "#000000", /* Text background color when selected */
  69             "textHighlightText", "#FFF7E9", /* Text color when selected */
  70             "textInactiveText", "#808080", /* Text color when disabled */
  71             "control", "#AEB2C3", /* Default color for controls (buttons, sliders, etc) */
  72             "controlText", "#000000", /* Default color for text in controls */
  73             "controlHighlight", "#DCDEE5", /* Highlight color for controls */
  74             "controlLtHighlight", "#DCDEE5", /* Light highlight color for controls */
  75             "controlShadow", "#63656F", /* Shadow color for controls */
  76             "controlLightShadow", "#9397A5", /* Shadow color for controls */
  77             "controlDkShadow", "#000000", /* Dark shadow color for controls */
  78             "scrollbar", "#AEB2C3", /* Scrollbar ??? color. PENDING(jeff) foreground? background? ?*/
  79             "info", "#FFF7E9", /* ??? */
  80             "infoText", "#000000"  /* ??? */
  81         };
  82 
  83         loadSystemColors(table, defaultSystemColors, true);
  84     }
  85 
  86     protected void initComponentDefaults(UIDefaults table) {
  87         super.initComponentDefaults(table);
  88 
  89         FontUIResource dialogPlain12 = new FontUIResource(Font.DIALOG,
  90                                                           Font.PLAIN, 12);
  91         FontUIResource sansSerifPlain12 = new FontUIResource(Font.SANS_SERIF,
  92                                                              Font.PLAIN, 12);
  93         FontUIResource monospacedPlain12 = new FontUIResource(Font.MONOSPACED,
  94                                                               Font.PLAIN, 12);
  95         ColorUIResource red = new ColorUIResource(Color.red);
  96         ColorUIResource black = new ColorUIResource(Color.black);
  97         ColorUIResource white = new ColorUIResource(Color.white);
  98         ColorUIResource lightGray = new ColorUIResource(Color.lightGray);
  99         ColorUIResource controlDarker =  new ColorUIResource(SystemColor.controlDkShadow);
 100 
 101         Color back = table.getColor("control");
 102         Color[] colors  = XComponentPeer.getSystemColors();
 103         Color scrollBarBackground = colors[XComponentPeer.BACKGROUND_COLOR];
 104         Color trackColor = new Color(MotifColorUtilities.calculateSelectFromBackground(scrollBarBackground.getRed(), scrollBarBackground.getGreen(), scrollBarBackground.getBlue()));
 105         Border loweredBevelBorder = new MotifBorders.BevelBorder(false,
 106                                                                  table.getColor("controlShadow"),
 107                                                                  table.getColor("controlLtHighlight"));
 108 
 109         Border raisedBevelBorder = new MotifBorders.BevelBorder(true,
 110                                                                 table.getColor("controlShadow"),
 111                                                                 table.getColor("controlLtHighlight"));
 112 
 113         Border marginBorder = new BasicBorders.MarginBorder();
 114 
 115         Border focusBorder = new MotifBorders.FocusBorder(
 116             table.getColor("control"),
 117             table.getColor("activeCaptionBorder"));
 118 
 119 
 120         Border focusBevelBorder = new BorderUIResource.CompoundBorderUIResource(
 121             focusBorder,
 122             loweredBevelBorder);
 123 
 124         Border textFieldBorder = new BorderUIResource.CompoundBorderUIResource(
 125             focusBevelBorder,
 126             marginBorder);
 127 
 128         // *** Text
 129 
 130         Object fieldInputMap = new UIDefaults.LazyInputMap(new Object[] {
 131             "COPY", DefaultEditorKit.copyAction,
 132             "PASTE", DefaultEditorKit.pasteAction,
 133             "CUT", DefaultEditorKit.cutAction,
 134             "control C", DefaultEditorKit.copyAction,
 135             "control V", DefaultEditorKit.pasteAction,
 136             "control X", DefaultEditorKit.cutAction,
 137             "control INSERT", DefaultEditorKit.copyAction,
 138             "shift INSERT", DefaultEditorKit.pasteAction,
 139             "shift DELETE", DefaultEditorKit.cutAction,
 140             "control F", DefaultEditorKit.forwardAction,
 141             "control B", DefaultEditorKit.backwardAction,
 142             "control D", DefaultEditorKit.deleteNextCharAction,
 143             "typed \010", DefaultEditorKit.deletePrevCharAction,
 144             "DELETE", DefaultEditorKit.deleteNextCharAction,
 145             "RIGHT", DefaultEditorKit.forwardAction,
 146             "LEFT", DefaultEditorKit.backwardAction,
 147             "KP_RIGHT", DefaultEditorKit.forwardAction,
 148             "KP_LEFT", DefaultEditorKit.backwardAction,
 149             "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 150             "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 151             "control LEFT", DefaultEditorKit.previousWordAction,
 152             "control RIGHT", DefaultEditorKit.nextWordAction,
 153             "control shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
 154             "control shift RIGHT", DefaultEditorKit.selectionNextWordAction,
 155             "control SLASH", DefaultEditorKit.selectAllAction,
 156             "HOME", DefaultEditorKit.beginLineAction,
 157             "END", DefaultEditorKit.endLineAction,
 158             "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 159             "shift END", DefaultEditorKit.selectionEndLineAction,
 160             "control BACK_SLASH", "unselect",
 161             "ENTER", JTextField.notifyAction,
 162             "control shift O", "toggle-componentOrientation"
 163         });
 164 
 165         Object passwordInputMap = new UIDefaults.LazyInputMap(new Object[] {
 166             "COPY", DefaultEditorKit.copyAction,
 167             "PASTE", DefaultEditorKit.pasteAction,
 168             "CUT", DefaultEditorKit.cutAction,
 169             "control C", DefaultEditorKit.copyAction,
 170             "control V", DefaultEditorKit.pasteAction,
 171             "control X", DefaultEditorKit.cutAction,
 172             "control INSERT", DefaultEditorKit.copyAction,
 173             "shift INSERT", DefaultEditorKit.pasteAction,
 174             "shift DELETE", DefaultEditorKit.cutAction,
 175             "control F", DefaultEditorKit.forwardAction,
 176             "control B", DefaultEditorKit.backwardAction,
 177             "control D", DefaultEditorKit.deleteNextCharAction,
 178             "typed \010", DefaultEditorKit.deletePrevCharAction,
 179             "DELETE", DefaultEditorKit.deleteNextCharAction,
 180             "RIGHT", DefaultEditorKit.forwardAction,
 181             "LEFT", DefaultEditorKit.backwardAction,
 182             "KP_RIGHT", DefaultEditorKit.forwardAction,
 183             "KP_LEFT", DefaultEditorKit.backwardAction,
 184             "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 185             "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 186             "control LEFT", DefaultEditorKit.beginLineAction,
 187             "control RIGHT", DefaultEditorKit.endLineAction,
 188             "control shift LEFT", DefaultEditorKit.selectionBeginLineAction,
 189             "control shift RIGHT", DefaultEditorKit.selectionEndLineAction,
 190             "control SLASH", DefaultEditorKit.selectAllAction,
 191             "HOME", DefaultEditorKit.beginLineAction,
 192             "END", DefaultEditorKit.endLineAction,
 193             "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 194             "shift END", DefaultEditorKit.selectionEndLineAction,
 195             "control BACK_SLASH", "unselect",
 196             "ENTER", JTextField.notifyAction,
 197             "control shift O", "toggle-componentOrientation"
 198         });
 199 
 200         Object multilineInputMap = new UIDefaults.LazyInputMap(new Object[] {
 201             "COPY", DefaultEditorKit.copyAction,
 202             "PASTE", DefaultEditorKit.pasteAction,
 203             "CUT", DefaultEditorKit.cutAction,
 204             "control C", DefaultEditorKit.copyAction,
 205             "control V", DefaultEditorKit.pasteAction,
 206             "control X", DefaultEditorKit.cutAction,
 207             "control INSERT", DefaultEditorKit.copyAction,
 208             "shift INSERT", DefaultEditorKit.pasteAction,
 209             "shift DELETE", DefaultEditorKit.cutAction,
 210             "control F", DefaultEditorKit.forwardAction,
 211             "control B", DefaultEditorKit.backwardAction,
 212             "control D", DefaultEditorKit.deleteNextCharAction,
 213             "typed \010", DefaultEditorKit.deletePrevCharAction,
 214             "DELETE", DefaultEditorKit.deleteNextCharAction,
 215             "RIGHT", DefaultEditorKit.forwardAction,
 216             "LEFT", DefaultEditorKit.backwardAction,
 217             "KP_RIGHT", DefaultEditorKit.forwardAction,
 218             "KP_LEFT", DefaultEditorKit.backwardAction,
 219             "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 220             "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 221             "control LEFT", DefaultEditorKit.previousWordAction,
 222             "control RIGHT", DefaultEditorKit.nextWordAction,
 223             "control shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
 224             "control shift RIGHT", DefaultEditorKit.selectionNextWordAction,
 225             "control SLASH", DefaultEditorKit.selectAllAction,
 226             "HOME", DefaultEditorKit.beginLineAction,
 227             "END", DefaultEditorKit.endLineAction,
 228             "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 229             "shift END", DefaultEditorKit.selectionEndLineAction,
 230 
 231             "control N", DefaultEditorKit.downAction,
 232             "control P", DefaultEditorKit.upAction,
 233             "UP", DefaultEditorKit.upAction,
 234             "DOWN", DefaultEditorKit.downAction,
 235             "KP_UP", DefaultEditorKit.upAction,
 236             "KP_DOWN", DefaultEditorKit.downAction,
 237             "PAGE_UP", DefaultEditorKit.pageUpAction,
 238             "PAGE_DOWN", DefaultEditorKit.pageDownAction,
 239             "shift PAGE_UP", "selection-page-up",
 240             "shift PAGE_DOWN", "selection-page-down",
 241             "ctrl shift PAGE_UP", "selection-page-left",
 242             "ctrl shift PAGE_DOWN", "selection-page-right",
 243             "shift UP", DefaultEditorKit.selectionUpAction,
 244             "shift DOWN", DefaultEditorKit.selectionDownAction,
 245             "shift KP_UP", DefaultEditorKit.selectionUpAction,
 246             "shift KP_DOWN", DefaultEditorKit.selectionDownAction,
 247             "ENTER", DefaultEditorKit.insertBreakAction,
 248             "TAB", DefaultEditorKit.insertTabAction,
 249             "control BACK_SLASH", "unselect",
 250             "control HOME", DefaultEditorKit.beginAction,
 251             "control END", DefaultEditorKit.endAction,
 252             "control shift HOME", DefaultEditorKit.selectionBeginAction,
 253             "control shift END", DefaultEditorKit.selectionEndAction,
 254             "control T", "next-link-action",
 255             "control shift T", "previous-link-action",
 256             "control SPACE", "activate-link-action",
 257             "control shift O", "toggle-componentOrientation"
 258         });
 259 
 260         Object sliderFocusInsets = new InsetsUIResource( 0, 0, 0, 0 );
 261 
 262         Object[] defaults = {
 263 
 264             "ScrollBar.background", scrollBarBackground,
 265             "ScrollBar.foreground", table.get("control"),
 266             "ScrollBar.track", trackColor,
 267             "ScrollBar.trackHighlight", trackColor,
 268             "ScrollBar.thumb", scrollBarBackground,
 269             "ScrollBar.thumbHighlight", table.get("controlHighlight") ,
 270             "ScrollBar.thumbDarkShadow", table.get("controlDkShadow"),
 271             "ScrollBar.thumbShadow", table.get("controlShadow"),
 272             "ScrollBar.border", loweredBevelBorder,
 273             "ScrollBar.allowsAbsolutePositioning", Boolean.TRUE,
 274             "ScrollBar.defaultWidth", Integer.valueOf(17),
 275             "ScrollBar.focusInputMap",
 276             new UIDefaults.LazyInputMap(new Object[] {
 277                 "RIGHT", "positiveUnitIncrement",
 278                 "KP_RIGHT", "positiveUnitIncrement",
 279                 "DOWN", "positiveUnitIncrement",
 280                 "KP_DOWN", "positiveUnitIncrement",
 281                 "PAGE_DOWN", "positiveBlockIncrement",
 282                 "ctrl PAGE_DOWN", "positiveBlockIncrement",
 283                 "LEFT", "negativeUnitIncrement",
 284                 "KP_LEFT", "negativeUnitIncrement",
 285                 "UP", "negativeUnitIncrement",
 286                 "KP_UP", "negativeUnitIncrement",
 287                 "PAGE_UP", "negativeBlockIncrement",
 288                 "ctrl PAGE_UP", "negativeBlockIncrement",
 289                 "HOME", "minScroll",
 290                 "END", "maxScroll"
 291             }),
 292 
 293             "ScrollPane.font", dialogPlain12,
 294             "ScrollPane.background", scrollBarBackground,
 295             "ScrollPane.foreground", table.get("controlText"),
 296             "ScrollPane.border", null,
 297             "ScrollPane.viewportBorder", loweredBevelBorder,
 298             "ScrollPane.ancestorInputMap",
 299             new UIDefaults.LazyInputMap(new Object[] {
 300                 "RIGHT", "unitScrollRight",
 301                 "KP_RIGHT", "unitScrollRight",
 302                 "DOWN", "unitScrollDown",
 303                 "KP_DOWN", "unitScrollDown",
 304                 "LEFT", "unitScrollLeft",
 305                 "KP_LEFT", "unitScrollLeft",
 306                 "UP", "unitScrollUp",
 307                 "KP_UP", "unitScrollUp",
 308                 "PAGE_UP", "scrollUp",
 309                 "PAGE_DOWN", "scrollDown",
 310                 "ctrl PAGE_UP", "scrollLeft",
 311                 "ctrl PAGE_DOWN", "scrollRight",
 312                 "ctrl HOME", "scrollHome",
 313                 "ctrl END", "scrollEnd"
 314             }),
 315 
 316             "FormattedTextField.focusInputMap",
 317             new UIDefaults.LazyInputMap(new Object[] {
 318                 "ctrl C", DefaultEditorKit.copyAction,
 319                 "ctrl V", DefaultEditorKit.pasteAction,
 320                 "ctrl X", DefaultEditorKit.cutAction,
 321                 "COPY", DefaultEditorKit.copyAction,
 322                 "PASTE", DefaultEditorKit.pasteAction,
 323                 "CUT", DefaultEditorKit.cutAction,
 324                 "shift LEFT", DefaultEditorKit.selectionBackwardAction,
 325                 "shift KP_LEFT", DefaultEditorKit.selectionBackwardAction,
 326                 "shift RIGHT", DefaultEditorKit.selectionForwardAction,
 327                 "shift KP_RIGHT", DefaultEditorKit.selectionForwardAction,
 328                 "ctrl LEFT", DefaultEditorKit.previousWordAction,
 329                 "ctrl KP_LEFT", DefaultEditorKit.previousWordAction,
 330                 "ctrl RIGHT", DefaultEditorKit.nextWordAction,
 331                 "ctrl KP_RIGHT", DefaultEditorKit.nextWordAction,
 332                 "ctrl shift LEFT", DefaultEditorKit.selectionPreviousWordAction,
 333                 "ctrl shift KP_LEFT", DefaultEditorKit.selectionPreviousWordAction,
 334                 "ctrl shift RIGHT", DefaultEditorKit.selectionNextWordAction,
 335                 "ctrl shift KP_RIGHT", DefaultEditorKit.selectionNextWordAction,
 336                 "ctrl A", DefaultEditorKit.selectAllAction,
 337                 "HOME", DefaultEditorKit.beginLineAction,
 338                 "END", DefaultEditorKit.endLineAction,
 339                 "shift HOME", DefaultEditorKit.selectionBeginLineAction,
 340                 "shift END", DefaultEditorKit.selectionEndLineAction,
 341                 "typed \010", DefaultEditorKit.deletePrevCharAction,
 342                 "DELETE", DefaultEditorKit.deleteNextCharAction,
 343                 "RIGHT", DefaultEditorKit.forwardAction,
 344                 "LEFT", DefaultEditorKit.backwardAction,
 345                 "KP_RIGHT", DefaultEditorKit.forwardAction,
 346                 "KP_LEFT", DefaultEditorKit.backwardAction,
 347                 "ENTER", JTextField.notifyAction,
 348                 "ctrl BACK_SLASH", "unselect",
 349                 "control shift O", "toggle-componentOrientation",
 350                 "ESCAPE", "reset-field-edit",
 351                 "UP", "increment",
 352                 "KP_UP", "increment",
 353                 "DOWN", "decrement",
 354                 "KP_DOWN", "decrement",
 355             }),
 356 
 357             "TextField.caretForeground", black,
 358             "TextField.caretBlinkRate", Integer.valueOf(500),
 359             "TextField.inactiveForeground", table.get("textInactiveText"),
 360             "TextField.selectionBackground", table.get("textHighlight"),
 361             "TextField.selectionForeground", table.get("textHighlightText"),
 362             "TextField.background", table.get("window"),
 363             "TextField.foreground", table.get("textText"),
 364             "TextField.font", sansSerifPlain12,
 365             "TextField.border", textFieldBorder,
 366             "TextField.focusInputMap", fieldInputMap,
 367 
 368             "PasswordField.caretForeground", black,
 369             "PasswordField.caretBlinkRate", Integer.valueOf(500),
 370             "PasswordField.inactiveForeground", table.get("textInactiveText"),
 371             "PasswordField.selectionBackground", table.get("textHighlight"),
 372             "PasswordField.selectionForeground", table.get("textHighlightText"),
 373             "PasswordField.background", table.get("window"),
 374             "PasswordField.foreground", table.get("textText"),
 375             "PasswordField.font", sansSerifPlain12,
 376             "PasswordField.border", textFieldBorder,
 377             "PasswordField.focusInputMap", passwordInputMap,
 378 
 379             "TextArea.caretForeground", black,
 380             "TextArea.caretBlinkRate", Integer.valueOf(500),
 381             "TextArea.inactiveForeground", table.get("textInactiveText"),
 382             "TextArea.selectionBackground", table.get("textHighlight"),
 383             "TextArea.selectionForeground", table.get("textHighlightText"),
 384             "TextArea.background", table.get("window"),
 385             "TextArea.foreground", table.get("textText"),
 386             "TextArea.font", monospacedPlain12,
 387             "TextArea.border", marginBorder,
 388             "TextArea.focusInputMap", multilineInputMap
 389         };
 390 
 391         table.putDefaults(defaults);
 392     }
 393 }