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.theme;
031:
032: import java.awt.Color;
033: import java.util.HashMap;
034: import java.util.Map;
035:
036: import org.jvnet.substance.color.ShiftColorScheme;
037:
038: /**
039: * Shift theme. A shift theme is based on some original theme that is shifted
040: * towards some color.
041: *
042: * @author Kirill Grouchnikov
043: * @see ShiftColorScheme
044: */
045: public class SubstanceShiftTheme extends SubstanceWrapperTheme {
046: /**
047: * The background shift factor for <code>this</code> theme.
048: */
049: private double backgroundShiftFactor;
050:
051: /**
052: * The background shift color for <code>this</code> theme.
053: */
054: private Color backgroundShiftColor;
055:
056: /**
057: * The foreground shift factor for <code>this</code> theme.
058: */
059: private double foregroundShiftFactor;
060:
061: /**
062: * The foreground shift color for <code>this</code> theme.
063: */
064: private Color foregroundShiftColor;
065:
066: /**
067: * Creates a new shift theme. <b>Do not</b> use this constructor directly,
068: * use {@link SubstanceTheme#shift(Color, double)} instead.
069: *
070: * @param substanceTheme
071: * The original theme.
072: * @param backgroundShiftColor
073: * Shift color for background colors.
074: * @param backgroundShiftFactor
075: * Shift factor for background colors.
076: * @param foregroundShiftColor
077: * Shift color for foreground colors.
078: * @param foregroundShiftFactor
079: * Shift factor for foreground colors.
080: */
081: SubstanceShiftTheme(SubstanceTheme substanceTheme,
082: Color backgroundShiftColor, double backgroundShiftFactor,
083: Color foregroundShiftColor, double foregroundShiftFactor) {
084: super (substanceTheme, new ShiftColorScheme(substanceTheme
085: .getColorScheme(), backgroundShiftColor,
086: backgroundShiftFactor, foregroundShiftColor,
087: foregroundShiftFactor, true), "Shift "
088: + substanceTheme.getDisplayName() + " to ["
089: + backgroundShiftColor + "] "
090: + (int) (100 * backgroundShiftFactor) + "% * ["
091: + foregroundShiftColor + "]"
092: + (int) (100 * foregroundShiftFactor) + "%",
093: substanceTheme.getKind());
094: this .backgroundShiftColor = backgroundShiftColor;
095: this .backgroundShiftFactor = backgroundShiftFactor;
096: this .foregroundShiftColor = foregroundShiftColor;
097: this .foregroundShiftFactor = foregroundShiftFactor;
098: }
099:
100: /*
101: * (non-Javadoc)
102: *
103: * @see org.jvnet.substance.theme.SubstanceTheme#getDefaultTheme()
104: */
105: @Override
106: public SubstanceTheme getDefaultTheme() {
107: if (this .defaultTheme == null)
108: this .defaultTheme = this .originalTheme.getDefaultTheme()
109: .shift(this .backgroundShiftColor,
110: this .backgroundShiftFactor,
111: this .foregroundShiftColor,
112: this .foregroundShiftFactor);
113: return this .defaultTheme;
114: }
115:
116: /*
117: * (non-Javadoc)
118: *
119: * @see org.jvnet.substance.theme.SubstanceTheme#getDisabledTheme()
120: */
121: @Override
122: public SubstanceTheme getDisabledTheme() {
123: if (this .disabledTheme == null)
124: this .disabledTheme = this .originalTheme.getDisabledTheme()
125: .shift(this .backgroundShiftColor,
126: this .backgroundShiftFactor / 2.0,
127: this .foregroundShiftColor,
128: this .foregroundShiftFactor / 2.0);
129: return this .disabledTheme;
130: }
131:
132: /**
133: * Cache of shifted themes.
134: */
135: protected static Map<String, SubstanceTheme> shiftedCache = new HashMap<String, SubstanceTheme>();
136:
137: /**
138: * Returns a shifted theme. This method is for internal use only.
139: *
140: * @param orig
141: * The original theme.
142: * @param backgroundShiftColor
143: * Shift color for the background theme colors. May be
144: * <code>null</code> - in this case, the background theme
145: * colors will not be shifted.
146: * @param backgroundShiftFactor
147: * Shift factor for the background theme colors. If the shift
148: * color for the background theme colors is <code>null</code>,
149: * this value is ignored.
150: * @param foregroundShiftColor
151: * Shift color for the foreground theme colors. May be
152: * <code>null</code> - in this case, the foreground theme
153: * colors will not be shifted.
154: * @param foregroundShiftFactor
155: * Shift factor for the foreground theme colors. If the shift
156: * color for the foreground theme colors is <code>null</code>,
157: * this value is ignored.
158: * @return Shifted theme.
159: */
160: public static synchronized SubstanceTheme getShiftedTheme(
161: SubstanceTheme orig, Color backgroundShiftColor,
162: double backgroundShiftFactor, Color foregroundShiftColor,
163: double foregroundShiftFactor) {
164: String key = orig.getDisplayName() + ":" + backgroundShiftColor
165: + ":" + backgroundShiftFactor + ":"
166: + foregroundShiftColor + ":" + foregroundShiftFactor;
167: SubstanceTheme result = shiftedCache.get(key);
168: if (result == null) {
169: result = orig.shift(backgroundShiftColor,
170: backgroundShiftFactor, foregroundShiftColor,
171: foregroundShiftFactor);
172: shiftedCache.put(key, result);
173: }
174: return result;
175: }
176: }
|