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.geom.GeneralPath;
034: import java.awt.image.BufferedImage;
035:
036: import org.jvnet.substance.SubstanceLookAndFeel;
037: import org.jvnet.substance.utils.SubstanceColorUtilities;
038: import org.jvnet.substance.utils.SubstanceCoreUtilities;
039:
040: /**
041: * Simple implementation of {@link SubstanceWatermark}, drawing cross hatches
042: * as watermark. This class is part of officially supported API.
043: *
044: * @author Kirill Grouchnikov
045: * @author Chris Hall
046: */
047: public class SubstanceLatchWatermark 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(SubstanceLatchWatermark.watermarkImage, x,
066: 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: SubstanceLatchWatermark.watermarkImage = SubstanceCoreUtilities
089: .getBlankImage(screenWidth, screenHeight);
090:
091: Graphics2D graphics = (Graphics2D) SubstanceLatchWatermark.watermarkImage
092: .getGraphics().create();
093:
094: boolean status = this .drawWatermarkImage(graphics, 0, 0,
095: screenWidth, screenHeight, false);
096: graphics.dispose();
097: return status;
098: }
099:
100: /*
101: * (non-Javadoc)
102: *
103: * @see org.jvnet.substance.watermark.SubstanceWatermark#previewWatermark(java.awt.Graphics,
104: * int, int, int, int)
105: */
106: public void previewWatermark(Graphics g, int x, int y, int width,
107: int height) {
108: this .drawWatermarkImage((Graphics2D) g, x, y, width, height,
109: true);
110: }
111:
112: /**
113: * Draws the specified portion of the watermark image.
114: *
115: * @param graphics
116: * Graphic context.
117: * @param x
118: * the <i>x</i> coordinate of the watermark to be drawn.
119: * @param y
120: * The <i>y</i> coordinate of the watermark to be drawn.
121: * @param width
122: * The width of the watermark to be drawn.
123: * @param height
124: * The height of the watermark to be drawn.
125: * @param isPreview
126: * Indication whether the result is a preview image.
127: * @return Indication whether the draw succeeded.
128: */
129: private boolean drawWatermarkImage(Graphics2D graphics, int x,
130: int y, int width, int height, boolean isPreview) {
131: Color stampColorDark = null;
132: Color stampColorAll = null;
133: // Color stampColorLight = null;
134: if (isPreview) {
135: stampColorDark = SubstanceCoreUtilities
136: .isThemeDark(SubstanceLookAndFeel.getTheme()) ? Color.white
137: : Color.black;
138: stampColorAll = Color.lightGray;
139: // stampColorLight = SubstanceCoreUtilities
140: // .isThemeDark(SubstanceLookAndFeel.getTheme()) ? Color.black
141: // : Color.white;
142: } else {
143: stampColorDark = SubstanceColorUtilities
144: .getWatermarkDarkColor();
145: stampColorAll = SubstanceColorUtilities
146: .getWatermarkStampColor();
147: // stampColorLight = SubstanceColorUtilities.getWatermarkLightColor();
148: }
149:
150: Color c1 = stampColorDark;
151: Color c2 = SubstanceColorUtilities.getInterpolatedColor(
152: stampColorDark, stampColorAll, 0.5);
153: graphics.setColor(stampColorAll);
154: graphics.fillRect(0, 0, width, height);
155:
156: int dimension = 12;
157: BufferedImage tile = SubstanceCoreUtilities.getBlankImage(
158: dimension, dimension);
159: GeneralPath latch1 = new GeneralPath();
160: latch1.moveTo(0.45f * dimension, 0);
161: latch1.quadTo(0.45f * dimension, 0.45f * dimension,
162: 0.05f * dimension, 0.45f * dimension);
163: latch1.quadTo(0.15f * dimension, 0.15f * dimension,
164: 0.45f * dimension, 0);
165: this .drawLatch(tile, latch1, c1, c2);
166:
167: GeneralPath latch2 = new GeneralPath();
168: latch2.moveTo(0.55f * dimension, 0.55f * dimension);
169: latch2.quadTo(0.75f * dimension, 0.4f * dimension, dimension,
170: dimension);
171: latch2.quadTo(0.4f * dimension, 0.75f * dimension,
172: 0.5f * dimension, 0.5f * dimension);
173: this .drawLatch(tile, latch2, c1, c2);
174:
175: for (int row = 0; row < height; row += dimension) {
176: for (int col = 0; col < width; col += dimension) {
177: graphics.drawImage(tile, x + col, y + row, null);
178: }
179: }
180: return true;
181: }
182:
183: /**
184: * Draws a single latch.
185: *
186: * @param tile
187: * Tile to draw on.
188: * @param latchOutline
189: * Latch outline path.
190: * @param colorLight
191: * Light color.
192: * @param colorDark
193: * Dark color.
194: */
195: private void drawLatch(BufferedImage tile,
196: GeneralPath latchOutline, Color colorLight, Color colorDark) {
197:
198: Graphics2D graphics = (Graphics2D) tile.getGraphics().create();
199: graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
200: RenderingHints.VALUE_ANTIALIAS_ON);
201:
202: graphics.setColor(colorLight);
203: graphics.draw(latchOutline);
204: graphics.setColor(colorDark);
205: graphics.setStroke(new BasicStroke(1.5f));
206: graphics.fill(latchOutline);
207:
208: graphics.dispose();
209: }
210:
211: /*
212: * (non-Javadoc)
213: *
214: * @see org.jvnet.substance.watermark.SubstanceWatermark#getDisplayName()
215: */
216: public String getDisplayName() {
217: return SubstanceLatchWatermark.getName();
218: }
219:
220: /**
221: * Returns the name of all watermarks of <code>this</code> class.
222: *
223: * @return The name of all watermarks of <code>this</code> class.
224: */
225: public static String getName() {
226: return "Latch";
227: }
228:
229: /*
230: * (non-Javadoc)
231: *
232: * @see org.jvnet.substance.watermark.SubstanceWatermark#isDependingOnTheme()
233: */
234: public boolean isDependingOnTheme() {
235: return true;
236: }
237:
238: /*
239: * (non-Javadoc)
240: *
241: * @see org.jvnet.substance.watermark.SubstanceWatermark#dispose()
242: */
243: public void dispose() {
244: watermarkImage = null;
245: }
246: }
|