jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifIconFactory.java
changeset 25859 3317bb8137f4
parent 23632 cd7a34d12e8c
child 32865 f9cb6e427f9e
equal deleted inserted replaced
25858:836adbf7a2cd 25859:3317bb8137f4
       
     1 /*
       
     2  * Copyright (c) 1997, 2014, 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 com.sun.java.swing.plaf.motif;
       
    27 
       
    28 import javax.swing.*;
       
    29 
       
    30 import javax.swing.plaf.UIResource;
       
    31 
       
    32 import java.awt.Color;
       
    33 import java.awt.Component;
       
    34 import java.awt.Dimension;
       
    35 import java.awt.Graphics;
       
    36 import java.awt.Polygon;
       
    37 
       
    38 import java.io.Serializable;
       
    39 
       
    40 /**
       
    41  * Icon factory for the CDE/Motif Look and Feel
       
    42  * <p>
       
    43  * <strong>Warning:</strong>
       
    44  * Serialized objects of this class will not be compatible with
       
    45  * future Swing releases.  The current serialization support is appropriate
       
    46  * for short term storage or RMI between applications running the same
       
    47  * version of Swing.  A future release of Swing will provide support for
       
    48  * long term persistence.
       
    49  *
       
    50  * 1.20 04/27/99
       
    51  * @author Georges Saab
       
    52  */
       
    53 @SuppressWarnings("serial") // Same-version serialization only
       
    54 public class MotifIconFactory implements Serializable
       
    55 {
       
    56     private static Icon checkBoxIcon;
       
    57     private static Icon radioButtonIcon;
       
    58     private static Icon menuItemCheckIcon;
       
    59     private static Icon menuItemArrowIcon;
       
    60     private static Icon menuArrowIcon;
       
    61 
       
    62     public static Icon getMenuItemCheckIcon() {
       
    63         return null;
       
    64     }
       
    65 
       
    66     public static Icon getMenuItemArrowIcon() {
       
    67         if (menuItemArrowIcon == null) {
       
    68             menuItemArrowIcon = new MenuItemArrowIcon();
       
    69         }
       
    70         return menuItemArrowIcon;
       
    71     }
       
    72 
       
    73     public static Icon getMenuArrowIcon() {
       
    74         if (menuArrowIcon == null) {
       
    75             menuArrowIcon = new MenuArrowIcon();
       
    76         }
       
    77         return menuArrowIcon;
       
    78     }
       
    79 
       
    80     public static Icon getCheckBoxIcon() {
       
    81         if (checkBoxIcon == null) {
       
    82             checkBoxIcon = new CheckBoxIcon();
       
    83         }
       
    84         return checkBoxIcon;
       
    85     }
       
    86 
       
    87     public static Icon getRadioButtonIcon() {
       
    88         if (radioButtonIcon == null) {
       
    89             radioButtonIcon = new RadioButtonIcon();
       
    90         }
       
    91         return radioButtonIcon;
       
    92     }
       
    93 
       
    94     @SuppressWarnings("serial") // Same-version serialization only
       
    95     private static class CheckBoxIcon implements Icon, UIResource, Serializable  {
       
    96         final static int csize = 13;
       
    97 
       
    98         private Color control = UIManager.getColor("control");
       
    99         private Color foreground = UIManager.getColor("CheckBox.foreground");
       
   100         private Color shadow = UIManager.getColor("controlShadow");
       
   101         private Color highlight = UIManager.getColor("controlHighlight");
       
   102         private Color lightShadow = UIManager.getColor("controlLightShadow");
       
   103 
       
   104         public void paintIcon(Component c, Graphics g, int x, int y) {
       
   105             AbstractButton b = (AbstractButton) c;
       
   106             ButtonModel model = b.getModel();
       
   107 
       
   108             boolean flat = false;
       
   109 
       
   110             if(b instanceof JCheckBox) {
       
   111                 flat = ((JCheckBox)b).isBorderPaintedFlat();
       
   112             }
       
   113 
       
   114             boolean isPressed = model.isPressed();
       
   115             boolean isArmed = model.isArmed();
       
   116             boolean isEnabled = model.isEnabled();
       
   117             boolean isSelected = model.isSelected();
       
   118 
       
   119             // There are 4 "looks" to the Motif CheckBox:
       
   120             //  drawCheckBezelOut  -  default unchecked state
       
   121             //  drawBezel          -  when we uncheck in toggled state
       
   122             //  drawCheckBezel     -  when we check in toggle state
       
   123             //  drawCheckBezelIn   -  selected, mouseReleased
       
   124             boolean checkToggleIn = ((isPressed &&
       
   125                                       !isArmed   &&
       
   126                                       isSelected) ||
       
   127                                      (isPressed &&
       
   128                                       isArmed   &&
       
   129                                       !isSelected));
       
   130             boolean uncheckToggleOut = ((isPressed &&
       
   131                                          !isArmed &&
       
   132                                          !isSelected) ||
       
   133                                         (isPressed &&
       
   134                                          isArmed &&
       
   135                                          isSelected));
       
   136 
       
   137             boolean checkIn = (!isPressed  &&
       
   138                                isArmed    &&
       
   139                                isSelected  ||
       
   140                                (!isPressed &&
       
   141                                 !isArmed  &&
       
   142                                 isSelected));
       
   143 
       
   144 
       
   145             if(flat) {
       
   146                 g.setColor(shadow);
       
   147                 g.drawRect(x+2,y,csize-1,csize-1);
       
   148                 if(uncheckToggleOut || checkToggleIn) {
       
   149                     g.setColor(control);
       
   150                     g.fillRect(x+3,y+1,csize-2,csize-2);
       
   151                 }
       
   152             }
       
   153 
       
   154             if (checkToggleIn) {
       
   155                 // toggled from unchecked to checked
       
   156                 drawCheckBezel(g,x,y,csize,true,false,false,flat);
       
   157             } else if (uncheckToggleOut) {
       
   158                 // MotifBorderFactory.drawBezel(g,x,y,csize,csize,false,false);
       
   159                 drawCheckBezel(g,x,y,csize,true,true,false,flat);
       
   160             } else if (checkIn) {
       
   161                 // show checked, unpressed state
       
   162                 drawCheckBezel(g,x,y,csize,false,false,true,flat);
       
   163             } else if(!flat) {
       
   164                 //  show unchecked state
       
   165                 drawCheckBezelOut(g,x,y,csize);
       
   166             }
       
   167         }
       
   168 
       
   169         public int getIconWidth() {
       
   170             return csize;
       
   171         }
       
   172 
       
   173         public int getIconHeight() {
       
   174             return csize;
       
   175         }
       
   176 
       
   177         public void drawCheckBezelOut(Graphics g, int x, int y, int csize){
       
   178             Color controlShadow = UIManager.getColor("controlShadow");
       
   179 
       
   180             int w = csize;
       
   181             int h = csize;
       
   182             Color oldColor = g.getColor();
       
   183 
       
   184             g.translate(x,y);
       
   185             g.setColor(highlight);    // inner 3D border
       
   186             g.drawLine(0, 0, 0, h-1);
       
   187             g.drawLine(1, 0, w-1, 0);
       
   188 
       
   189             g.setColor(shadow);         // black drop shadow  __|
       
   190             g.drawLine(1, h-1, w-1, h-1);
       
   191             g.drawLine(w-1, h-1, w-1, 1);
       
   192             g.translate(-x,-y);
       
   193             g.setColor(oldColor);
       
   194         }
       
   195 
       
   196         public void drawCheckBezel(Graphics g, int x, int y, int csize,
       
   197                                    boolean shade, boolean out, boolean check, boolean flat)
       
   198             {
       
   199 
       
   200 
       
   201                 Color oldColor = g.getColor();
       
   202                 g.translate(x, y);
       
   203 
       
   204 
       
   205                 //bottom
       
   206                 if(!flat) {
       
   207                     if (out) {
       
   208                         g.setColor(control);
       
   209                         g.fillRect(1,1,csize-2,csize-2);
       
   210                         g.setColor(shadow);
       
   211                     } else {
       
   212                         g.setColor(lightShadow);
       
   213                         g.fillRect(0,0,csize,csize);
       
   214                         g.setColor(highlight);
       
   215                     }
       
   216 
       
   217                     g.drawLine(1,csize-1,csize-2,csize-1);
       
   218                     if (shade) {
       
   219                         g.drawLine(2,csize-2,csize-3,csize-2);
       
   220                         g.drawLine(csize-2,2,csize-2 ,csize-1);
       
   221                         if (out) {
       
   222                             g.setColor(highlight);
       
   223                         } else {
       
   224                             g.setColor(shadow);
       
   225                         }
       
   226                         g.drawLine(1,2,1,csize-2);
       
   227                         g.drawLine(1,1,csize-3,1);
       
   228                         if (out) {
       
   229                             g.setColor(shadow);
       
   230                         } else {
       
   231                             g.setColor(highlight);
       
   232                         }
       
   233                     }
       
   234                     //right
       
   235                     g.drawLine(csize-1,1,csize-1,csize-1);
       
   236 
       
   237                     //left
       
   238                     if (out) {
       
   239                         g.setColor(highlight);
       
   240                     } else {
       
   241                         g.setColor(shadow);
       
   242                     }
       
   243                     g.drawLine(0,1,0,csize-1);
       
   244 
       
   245                     //top
       
   246                     g.drawLine(0,0,csize-1,0);
       
   247                 }
       
   248 
       
   249                 if (check) {
       
   250                     // draw check
       
   251                     g.setColor(foreground);
       
   252                     g.drawLine(csize-2,1,csize-2,2);
       
   253                     g.drawLine(csize-3,2,csize-3,3);
       
   254                     g.drawLine(csize-4,3,csize-4,4);
       
   255                     g.drawLine(csize-5,4,csize-5,6);
       
   256                     g.drawLine(csize-6,5,csize-6,8);
       
   257                     g.drawLine(csize-7,6,csize-7,10);
       
   258                     g.drawLine(csize-8,7,csize-8,10);
       
   259                     g.drawLine(csize-9,6,csize-9,9);
       
   260                     g.drawLine(csize-10,5,csize-10,8);
       
   261                     g.drawLine(csize-11,5,csize-11,7);
       
   262                     g.drawLine(csize-12,6,csize-12,6);
       
   263                 }
       
   264                 g.translate(-x, -y);
       
   265                 g.setColor(oldColor);
       
   266             }
       
   267     } // end class CheckBoxIcon
       
   268 
       
   269     @SuppressWarnings("serial") // Same-version serialization only
       
   270     private static class RadioButtonIcon implements Icon, UIResource, Serializable {
       
   271         private Color dot = UIManager.getColor("activeCaptionBorder");
       
   272         private Color highlight = UIManager.getColor("controlHighlight");
       
   273         private Color shadow = UIManager.getColor("controlShadow");
       
   274 
       
   275         public void paintIcon(Component c, Graphics g, int x, int y) {
       
   276             // fill interior
       
   277             AbstractButton b = (AbstractButton) c;
       
   278             ButtonModel model = b.getModel();
       
   279 
       
   280             int w = getIconWidth();
       
   281             int h = getIconHeight();
       
   282 
       
   283             boolean isPressed = model.isPressed();
       
   284             boolean isArmed = model.isArmed();
       
   285             boolean isEnabled = model.isEnabled();
       
   286             boolean isSelected = model.isSelected();
       
   287 
       
   288             boolean checkIn = ((isPressed &&
       
   289                                 !isArmed   &&
       
   290                                 isSelected) ||
       
   291                                (isPressed &&
       
   292                                 isArmed   &&
       
   293                                 !isSelected)
       
   294                                ||
       
   295                                (!isPressed  &&
       
   296                                 isArmed    &&
       
   297                                 isSelected  ||
       
   298                                 (!isPressed &&
       
   299                                  !isArmed  &&
       
   300                                  isSelected)));
       
   301 
       
   302             if (checkIn){
       
   303                 g.setColor(shadow);
       
   304                 g.drawLine(x+5,y+0,x+8,y+0);
       
   305                 g.drawLine(x+3,y+1,x+4,y+1);
       
   306                 g.drawLine(x+9,y+1,x+9,y+1);
       
   307                 g.drawLine(x+2,y+2,x+2,y+2);
       
   308                 g.drawLine(x+1,y+3,x+1,y+3);
       
   309                 g.drawLine(x,y+4,x,y+9);
       
   310                 g.drawLine(x+1,y+10,x+1,y+10);
       
   311                 g.drawLine(x+2,y+11,x+2,y+11);
       
   312                 g.setColor(highlight);
       
   313                 g.drawLine(x+3,y+12,x+4,y+12);
       
   314                 g.drawLine(x+5,y+13,x+8,y+13);
       
   315                 g.drawLine(x+9,y+12,x+10,y+12);
       
   316                 g.drawLine(x+11,y+11,x+11,y+11);
       
   317                 g.drawLine(x+12,y+10,x+12,y+10);
       
   318                 g.drawLine(x+13,y+9,x+13,y+4);
       
   319                 g.drawLine(x+12,y+3,x+12,y+3);
       
   320                 g.drawLine(x+11,y+2,x+11,y+2);
       
   321                 g.drawLine(x+10,y+1,x+10,y+1);
       
   322                 g.setColor(dot);
       
   323                 g.fillRect(x+4,y+5,6,4);
       
   324                 g.drawLine(x+5,y+4,x+8,y+4);
       
   325                 g.drawLine(x+5,y+9,x+8,y+9);
       
   326             }
       
   327             else {
       
   328                 g.setColor(highlight);
       
   329                 g.drawLine(x+5,y+0,x+8,y+0);
       
   330                 g.drawLine(x+3,y+1,x+4,y+1);
       
   331                 g.drawLine(x+9,y+1,x+9,y+1);
       
   332                 g.drawLine(x+2,y+2,x+2,y+2);
       
   333                 g.drawLine(x+1,y+3,x+1,y+3);
       
   334                 g.drawLine(x,y+4,x,y+9);
       
   335                 g.drawLine(x+1,y+10,x+1,y+10);
       
   336                 g.drawLine(x+2,y+11,x+2,y+11);
       
   337 
       
   338                 g.setColor(shadow);
       
   339                 g.drawLine(x+3,y+12,x+4,y+12);
       
   340                 g.drawLine(x+5,y+13,x+8,y+13);
       
   341                 g.drawLine(x+9,y+12,x+10,y+12);
       
   342                 g.drawLine(x+11,y+11,x+11,y+11);
       
   343                 g.drawLine(x+12,y+10,x+12,y+10);
       
   344                 g.drawLine(x+13,y+9,x+13,y+4);
       
   345                 g.drawLine(x+12,y+3,x+12,y+3);
       
   346                 g.drawLine(x+11,y+2,x+11,y+2);
       
   347                 g.drawLine(x+10,y+1,x+10,y+1);
       
   348 
       
   349             }
       
   350         }
       
   351 
       
   352         public int getIconWidth() {
       
   353             return 14;
       
   354         }
       
   355 
       
   356         public int getIconHeight() {
       
   357             return 14;
       
   358         }
       
   359     } // end class RadioButtonIcon
       
   360 
       
   361     @SuppressWarnings("serial") // Same-version serialization only
       
   362     private static class MenuItemCheckIcon implements Icon, UIResource, Serializable
       
   363     {
       
   364         public void paintIcon(Component c,Graphics g, int x, int y)
       
   365             {
       
   366             }
       
   367         public int getIconWidth() { return 0; }
       
   368         public int getIconHeight() { return 0; }
       
   369     }  // end class MenuItemCheckIcon
       
   370 
       
   371 
       
   372     @SuppressWarnings("serial") // Same-version serialization only
       
   373     private static class MenuItemArrowIcon implements Icon, UIResource, Serializable
       
   374     {
       
   375         public void paintIcon(Component c,Graphics g, int x, int y)
       
   376             {
       
   377             }
       
   378         public int getIconWidth() { return 0; }
       
   379         public int getIconHeight() { return 0; }
       
   380     }  // end class MenuItemArrowIcon
       
   381 
       
   382     @SuppressWarnings("serial") // Same-version serialization only
       
   383     private static class MenuArrowIcon implements Icon, UIResource, Serializable
       
   384     {
       
   385         private Color focus = UIManager.getColor("windowBorder");
       
   386         private Color shadow = UIManager.getColor("controlShadow");
       
   387         private Color highlight = UIManager.getColor("controlHighlight");
       
   388 
       
   389         public void paintIcon(Component c, Graphics g, int x, int y) {
       
   390             AbstractButton b = (AbstractButton) c;
       
   391             ButtonModel model = b.getModel();
       
   392 
       
   393             // These variables are kind of pointless as the following code
       
   394             // assumes the icon will be 10 x 10 regardless of their value.
       
   395             int w = getIconWidth();
       
   396             int h = getIconHeight();
       
   397 
       
   398             Color oldColor = g.getColor();
       
   399 
       
   400             if (model.isSelected()){
       
   401                 if( MotifGraphicsUtils.isLeftToRight(c) ){
       
   402                     g.setColor(shadow);
       
   403                     g.fillRect(x+1,y+1,2,h);
       
   404                     g.drawLine(x+4,y+2,x+4,y+2);
       
   405                     g.drawLine(x+6,y+3,x+6,y+3);
       
   406                     g.drawLine(x+8,y+4,x+8,y+5);
       
   407                     g.setColor(focus);
       
   408                     g.fillRect(x+2,y+2,2,h-2);
       
   409                     g.fillRect(x+4,y+3,2,h-4);
       
   410                     g.fillRect(x+6,y+4,2,h-6);
       
   411                     g.setColor(highlight);
       
   412                     g.drawLine(x+2,y+h,x+2,y+h);
       
   413                     g.drawLine(x+4,y+h-1,x+4,y+h-1);
       
   414                     g.drawLine(x+6,y+h-2,x+6,y+h-2);
       
   415                     g.drawLine(x+8,y+h-4,x+8,y+h-3);
       
   416                 } else {
       
   417                     g.setColor(highlight);
       
   418                     g.fillRect(x+7,y+1,2,10);
       
   419                     g.drawLine(x+5,y+9,x+5,y+9);
       
   420                     g.drawLine(x+3,y+8,x+3,y+8);
       
   421                     g.drawLine(x+1,y+6,x+1,y+7);
       
   422                     g.setColor(focus);
       
   423                     g.fillRect(x+6,y+2,2,8);
       
   424                     g.fillRect(x+4,y+3,2,6);
       
   425                     g.fillRect(x+2,y+4,2,4);
       
   426                     g.setColor(shadow);
       
   427                     g.drawLine(x+1,y+4,x+1,y+5);
       
   428                     g.drawLine(x+3,y+3,x+3,y+3);
       
   429                     g.drawLine(x+5,y+2,x+5,y+2);
       
   430                     g.drawLine(x+7,y+1,x+7,y+1);
       
   431                 }
       
   432             } else {
       
   433                 if( MotifGraphicsUtils.isLeftToRight(c) ){
       
   434                     g.setColor(highlight);
       
   435                     g.drawLine(x+1,y+1,x+1,y+h);
       
   436                     g.drawLine(x+2,y+1,x+2,y+h-2);
       
   437                     g.fillRect(x+3,y+2,2,2);
       
   438                     g.fillRect(x+5,y+3,2,2);
       
   439                     g.fillRect(x+7,y+4,2,2);
       
   440                     g.setColor(shadow);
       
   441                     g.drawLine(x+2,y+h-1,x+2,y+h);
       
   442                     g.fillRect(x+3,y+h-2,2,2);
       
   443                     g.fillRect(x+5,y+h-3,2,2);
       
   444                     g.fillRect(x+7,y+h-4,2,2);
       
   445                     g.setColor(oldColor);
       
   446                 } else {
       
   447                     g.setColor(highlight);
       
   448                     g.fillRect(x+1,y+4,2,2);
       
   449                     g.fillRect(x+3,y+3,2,2);
       
   450                     g.fillRect(x+5,y+2,2,2);
       
   451                     g.drawLine(x+7,y+1,x+7,y+2);
       
   452                     g.setColor(shadow);
       
   453                     g.fillRect(x+1,y+h-4,2,2);
       
   454                     g.fillRect(x+3,y+h-3,2,2);
       
   455                     g.fillRect(x+5,y+h-2,2,2);
       
   456                     g.drawLine(x+7,y+3,x+7,y+h);
       
   457                     g.drawLine(x+8,y+1,x+8,y+h);
       
   458                     g.setColor(oldColor);
       
   459                 }
       
   460             }
       
   461 
       
   462         }
       
   463         public int getIconWidth() { return 10; }
       
   464         public int getIconHeight() { return 10; }
       
   465     } // End class MenuArrowIcon
       
   466 }