001: /*
002: * Copyright (c) 2005-2008 Substance Kirill Grouchnikov. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of Substance Kirill Grouchnikov nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030: package org.jvnet.substance.watermark;
031:
032: import java.awt.*;
033: import java.awt.image.BufferedImage;
034:
035: import org.jvnet.substance.SubstanceLookAndFeel;
036: import org.jvnet.substance.utils.SubstanceColorUtilities;
037: import org.jvnet.substance.utils.SubstanceCoreUtilities;
038:
039: /**
040: * Simple implementation of {@link SubstanceWatermark}, drawing cross hatches
041: * as watermark. This implementation is inspired by Office 12 background. This
042: * class is part of officially supported API.
043: *
044: * @author Kirill Grouchnikov
045: * @author Chris Hall
046: */
047: public class SubstanceCrosshatchWatermark implements SubstanceWatermark {
048: /**
049: * Watermark image (screen-sized).
050: */
051: private static Image watermarkImage = null;
052:
053: /*
054: * (non-Javadoc)
055: *
056: * @see org.jvnet.substance.watermark.SubstanceWatermark#drawWatermarkImage(java.awt.Graphics,
057: * int, int, int, int)
058: */
059: public void drawWatermarkImage(Graphics graphics, Component c,
060: int x, int y, int width, int height) {
061: if (!c.isShowing())
062: return;
063: int dx = c.getLocationOnScreen().x;
064: int dy = c.getLocationOnScreen().y;
065: graphics.drawImage(SubstanceCrosshatchWatermark.watermarkImage,
066: x, y, x + width, y + height, x + dx, y + dy, x + dx
067: + width, y + dy + height, null);
068: }
069:
070: /*
071: * (non-Javadoc)
072: *
073: * @see org.jvnet.substance.watermark.SubstanceWatermark#updateWatermarkImage()
074: */
075: public boolean updateWatermarkImage() {
076: // fix by Chris for bug 67 - support for multiple screens
077: Rectangle virtualBounds = new Rectangle();
078: GraphicsEnvironment ge = GraphicsEnvironment
079: .getLocalGraphicsEnvironment();
080: GraphicsDevice[] gds = ge.getScreenDevices();
081: for (GraphicsDevice gd : gds) {
082: GraphicsConfiguration gc = gd.getDefaultConfiguration();
083: virtualBounds = virtualBounds.union(gc.getBounds());
084: }
085:
086: int screenWidth = virtualBounds.width;
087: int screenHeight = virtualBounds.height;
088: SubstanceCrosshatchWatermark.watermarkImage = SubstanceCoreUtilities
089: .getBlankImage(screenWidth, screenHeight);
090:
091: Graphics2D graphics = (Graphics2D) SubstanceCrosshatchWatermark.watermarkImage
092: .getGraphics().create();
093: boolean status = this .drawWatermarkImage(graphics, 0, 0,
094: screenWidth, screenHeight, false);
095: graphics.dispose();
096: return status;
097: }
098:
099: /*
100: * (non-Javadoc)
101: *
102: * @see org.jvnet.substance.watermark.SubstanceWatermark#previewWatermark(java.awt.Graphics,
103: * int, int, int, int)
104: */
105: public void previewWatermark(Graphics g, int x, int y, int width,
106: int height) {
107: this .drawWatermarkImage((Graphics2D) g, x, y, width, height,
108: true);
109: }
110:
111: /**
112: * Draws the specified portion of the watermark image.
113: *
114: * @param graphics
115: * Graphic context.
116: * @param x
117: * the <i>x</i> coordinate of the watermark to be drawn.
118: * @param y
119: * The <i>y</i> coordinate of the watermark to be drawn.
120: * @param width
121: * The width of the watermark to be drawn.
122: * @param height
123: * The height of the watermark to be drawn.
124: * @param isPreview
125: * Indication whether the result is a preview image.
126: * @return Indication whether the draw succeeded.
127: */
128: private boolean drawWatermarkImage(Graphics2D graphics, int x,
129: int y, int width, int height, boolean isPreview) {
130: Color stampColorDark = null;
131: Color stampColorAll = null;
132: Color stampColorLight = null;
133: if (isPreview) {
134: stampColorDark = SubstanceCoreUtilities
135: .isThemeDark(SubstanceLookAndFeel.getTheme()) ? Color.white
136: : Color.black;
137: stampColorAll = Color.lightGray;
138: stampColorLight = SubstanceCoreUtilities
139: .isThemeDark(SubstanceLookAndFeel.getTheme()) ? Color.black
140: : Color.white;
141: } else {
142: stampColorDark = SubstanceColorUtilities
143: .getWatermarkDarkColor();
144: stampColorAll = SubstanceColorUtilities
145: .getWatermarkStampColor();
146: stampColorLight = SubstanceColorUtilities
147: .getWatermarkLightColor();
148: }
149:
150: graphics.setColor(stampColorAll);
151: graphics.fillRect(0, 0, width, height);
152:
153: BufferedImage tile = SubstanceCoreUtilities.getBlankImage(4, 4);
154: tile.setRGB(0, 0, stampColorDark.getRGB());
155: tile.setRGB(2, 2, stampColorDark.getRGB());
156: tile.setRGB(0, 1, stampColorLight.getRGB());
157: tile.setRGB(2, 3, stampColorLight.getRGB());
158:
159: Graphics2D g2d = (Graphics2D) graphics.create();
160: g2d.setComposite(AlphaComposite.getInstance(
161: AlphaComposite.SRC_OVER, 0.4f));
162: for (int row = y; row < (y + height); row += 4) {
163: for (int col = x; col < (x + width); col += 4) {
164: g2d.drawImage(tile, col, row, null);
165: }
166: }
167: g2d.dispose();
168: return true;
169: }
170:
171: /*
172: * (non-Javadoc)
173: *
174: * @see org.jvnet.substance.watermark.SubstanceWatermark#getDisplayName()
175: */
176: public String getDisplayName() {
177: return SubstanceCrosshatchWatermark.getName();
178: }
179:
180: /**
181: * Returns the name of all watermarks of <code>this</code> class.
182: *
183: * @return The name of all watermarks of <code>this</code> class.
184: */
185: public static String getName() {
186: return "Crosshatch";
187: }
188:
189: /*
190: * (non-Javadoc)
191: *
192: * @see org.jvnet.substance.watermark.SubstanceWatermark#isDependingOnTheme()
193: */
194: public boolean isDependingOnTheme() {
195: return true;
196: }
197:
198: /*
199: * (non-Javadoc)
200: *
201: * @see org.jvnet.substance.watermark.SubstanceWatermark#dispose()
202: */
203: public void dispose() {
204: watermarkImage = null;
205: }
206: }
|