1 /*
   2  *
   3  * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
   4  *
   5  * Redistribution and use in source and binary forms, with or without
   6  * modification, are permitted provided that the following conditions
   7  * are met:
   8  *
   9  *   - Redistributions of source code must retain the above copyright
  10  *     notice, this list of conditions and the following disclaimer.
  11  *
  12  *   - Redistributions in binary form must reproduce the above copyright
  13  *     notice, this list of conditions and the following disclaimer in the
  14  *     documentation and/or other materials provided with the distribution.
  15  *
  16  *   - Neither the name of Oracle nor the names of its
  17  *     contributors may be used to endorse or promote products derived
  18  *     from this software without specific prior written permission.
  19  *
  20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31  */
  32 package java2d;
  33 
  34 
  35 import static java.awt.Color.GRAY;
  36 import static java.awt.Color.GREEN;
  37 import static java.awt.Color.LIGHT_GRAY;
  38 import static java.awt.Color.WHITE;
  39 import java.awt.BasicStroke;
  40 import java.awt.Color;
  41 import java.awt.Component;
  42 import java.awt.Dimension;
  43 import java.awt.Font;
  44 import java.awt.Frame;
  45 import java.awt.GradientPaint;
  46 import java.awt.Graphics;
  47 import java.awt.Graphics2D;
  48 import java.awt.GridLayout;
  49 import java.awt.Image;
  50 import java.awt.Rectangle;
  51 import java.awt.TexturePaint;
  52 import java.awt.event.MouseAdapter;
  53 import java.awt.event.MouseEvent;
  54 import java.awt.event.WindowAdapter;
  55 import java.awt.event.WindowEvent;
  56 import java.awt.font.FontRenderContext;
  57 import java.awt.font.TextLayout;
  58 import java.awt.geom.Ellipse2D;
  59 import java.awt.image.BufferedImage;
  60 import javax.swing.JPanel;
  61 import javax.swing.border.EtchedBorder;
  62 import javax.swing.border.TitledBorder;
  63 
  64 
  65 /**
  66  * Four types of Paint displayed: Geometry, Text & Image Textures and
  67  * a Gradient Paint.  Paints can be selected with the Mouse.
  68  */
  69 @SuppressWarnings("serial")
  70 public final class TextureChooser extends JPanel {
  71     private final DemoInstVarsAccessor demoInstVars;
  72     public Object texture = getGeomTexture();
  73     public int num;
  74 
  75     public TextureChooser(int num, DemoInstVarsAccessor demoInstVars) {
  76         this.num = num;
  77         this.demoInstVars = demoInstVars;
  78 
  79         setLayout(new GridLayout(0, 2, 5, 5));
  80         setBorder(new TitledBorder(new EtchedBorder(), "Texture Chooser"));
  81 
  82         add(new Surface(getGeomTexture(), this, 0));
  83         add(new Surface(getImageTexture(), this, 1));
  84         add(new Surface(getTextTexture(), this, 2));
  85         add(new Surface(getGradientPaint(), this, 3));
  86     }
  87 
  88     public static TexturePaint getGeomTexture() {
  89         BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB);
  90         Graphics2D tG2 = bi.createGraphics();
  91         tG2.setBackground(WHITE);
  92         tG2.clearRect(0, 0, 5, 5);
  93         tG2.setColor(new Color(211, 211, 211, 200));
  94         tG2.fill(new Ellipse2D.Float(0, 0, 5, 5));
  95         Rectangle r = new Rectangle(0, 0, 5, 5);
  96         return new TexturePaint(bi, r);
  97     }
  98 
  99     public TexturePaint getImageTexture() {
 100         Image img = DemoImages.getImage("globe.png", this);
 101         int sw = img.getWidth(this);
 102         int sh = img.getHeight(this);
 103         int iw = sw/5;
 104         int ih = sh/5;
 105         BufferedImage bi =
 106              new BufferedImage(iw, ih, BufferedImage.TYPE_INT_ARGB);
 107         Graphics2D tG2 = bi.createGraphics();
 108         tG2.drawImage(img, 0, 0, iw, ih, 0, 0, sw, sh, this);
 109         Rectangle r = new Rectangle(0, 0, iw, ih);
 110         return new TexturePaint(bi, r);
 111     }
 112 
 113     public TexturePaint getTextTexture() {
 114         Font f = new Font(Font.SERIF, Font.BOLD, 10);
 115         TextLayout tl = new TextLayout("OpenJDK", f, new FontRenderContext(null,
 116                 false, false));
 117         int sw = (int) tl.getBounds().getWidth();
 118         int sh = (int) (tl.getAscent() + tl.getDescent());
 119         BufferedImage bi = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_RGB);
 120         Graphics2D tG2 = bi.createGraphics();
 121         tG2.setBackground(WHITE);
 122         tG2.clearRect(0, 0, sw, sh);
 123         tG2.setColor(LIGHT_GRAY);
 124         tl.draw(tG2, 0, tl.getAscent());
 125         Rectangle r = new Rectangle(0, 0, sw, sh);
 126         return new TexturePaint(bi, r);
 127     }
 128 
 129     public GradientPaint getGradientPaint() {
 130         return new GradientPaint(0, 0, WHITE, 80, 0, GREEN);
 131     }
 132 
 133 
 134     public class Surface extends JPanel {
 135 
 136         public boolean clickedFrame;
 137         private int num;
 138         private TextureChooser tc;
 139         private boolean enterExitFrame = false;
 140         private Object t;
 141 
 142         public Surface(final Object t, final TextureChooser tc, int num) {
 143             setBackground(WHITE);
 144             this.t = t;
 145             this.tc = tc;
 146             this.clickedFrame = (num == tc.num);
 147             this.num = num;
 148             if (num == tc.num) {
 149                 tc.texture = t;
 150             }
 151             addMouseListener(new MouseAdapter() {
 152 
 153                 @Override
 154                 public void mouseClicked(MouseEvent e) {
 155                     tc.texture = t;
 156                     clickedFrame = true;
 157 
 158                     for (Component comp : tc.getComponents()) {
 159                         if (comp instanceof Surface) {
 160                             Surface surf = (Surface) comp;
 161                             if (!surf.equals(Surface.this) && surf.clickedFrame) {
 162                                 surf.clickedFrame = false;
 163                                 surf.repaint();
 164                             }
 165                         }
 166                     }
 167 
 168                     // ABP
 169                     if (demoInstVars.getControls().textureCB.isSelected()) {
 170                         demoInstVars.getControls().textureCB.doClick();
 171                         demoInstVars.getControls().textureCB.doClick();
 172                     }
 173                 }
 174 
 175                 @Override
 176                 public void mouseEntered(MouseEvent e) {
 177                     enterExitFrame = true;
 178                     repaint();
 179                 }
 180 
 181                 @Override
 182                 public void mouseExited(MouseEvent e) {
 183                     enterExitFrame = false;
 184                     repaint();
 185                 }
 186             });
 187         }
 188 
 189         @Override
 190         public void paintComponent(Graphics g) {
 191             super.paintComponent(g);
 192             Graphics2D g2 = (Graphics2D) g;
 193             int w = getSize().width;
 194             int h = getSize().height;
 195             if (t instanceof TexturePaint) {
 196                 g2.setPaint((TexturePaint) t);
 197             } else {
 198                 g2.setPaint((GradientPaint) t);
 199             }
 200             g2.fill(new Rectangle(0, 0, w, h));
 201             if (clickedFrame || enterExitFrame) {
 202                 g2.setColor(GRAY);
 203                 BasicStroke bs = new BasicStroke(3, BasicStroke.CAP_BUTT,
 204                         BasicStroke.JOIN_MITER);
 205                 g2.setStroke(bs);
 206                 g2.drawRect(0, 0, w - 1, h - 1);
 207                 tc.num = num;
 208             }
 209         }
 210 
 211         @Override
 212         public Dimension getMinimumSize() {
 213             return getPreferredSize();
 214         }
 215 
 216         @Override
 217         public Dimension getMaximumSize() {
 218             return getPreferredSize();
 219         }
 220 
 221         @Override
 222         public Dimension getPreferredSize() {
 223             return new Dimension(30, 30);
 224         }
 225     }
 226 
 227     public static void main(String s[]) {
 228         Frame f = new Frame("J2D Demo - TextureChooser");
 229         f.addWindowListener(new WindowAdapter() {
 230 
 231             @Override
 232             public void windowClosing(WindowEvent e) {
 233                 System.exit(0);
 234             }
 235         });
 236         f.add("Center", new TextureChooser(0, new DemoInstVarsAccessorImplBase()));
 237         f.pack();
 238         f.setSize(new Dimension(400, 400));
 239         f.setVisible(true);
 240     }
 241 }