001: /*
002: * Copyright (c) 2005-2008 Flamingo / 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 Flamingo 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.flamingo.ribbon.ui;
031:
032: import java.awt.*;
033: import java.awt.image.BufferedImage;
034:
035: import javax.swing.*;
036: import javax.swing.plaf.ComponentUI;
037:
038: import org.jvnet.flamingo.ribbon.ui.BasicRibbonBandUI;
039: import org.jvnet.lafwidget.layout.TransitionLayout;
040: import org.jvnet.substance.*;
041: import org.jvnet.substance.color.ColorScheme;
042: import org.jvnet.substance.painter.MatteGradientPainter;
043: import org.jvnet.substance.painter.SubstanceGradientPainter;
044: import org.jvnet.substance.painter.text.SubstanceTextPainter;
045: import org.jvnet.substance.theme.SubstanceTheme;
046: import org.jvnet.substance.utils.*;
047:
048: /**
049: * UI for ribbon bands in <b>Substance</b> look and feel.
050: *
051: * @author Kirill Grouchnikov
052: */
053: public class SubstanceRibbonBandUI extends BasicRibbonBandUI {
054: /**
055: * Background delegate.
056: */
057: protected static SubstanceFillBackgroundDelegate bgDelegate = new SubstanceFillBackgroundDelegate();// 0.4f);
058:
059: /*
060: * (non-Javadoc)
061: *
062: * @see javax.swing.plaf.ComponentUI#createUI(javax.swing.JComponent)
063: */
064: public static ComponentUI createUI(JComponent c) {
065: return new SubstanceRibbonBandUI();
066: }
067:
068: /*
069: * (non-Javadoc)
070: *
071: * @see org.jvnet.flamingo.ribbon.ui.BasicRibbonBandUI#installComponents()
072: */
073: @Override
074: protected void installComponents() {
075: super .installComponents();
076:
077: if (this .expandButton != null) {
078: this .expandButton.putClientProperty(
079: SubstanceLookAndFeel.FLAT_PROPERTY, Boolean.TRUE);
080: this .expandButton.putClientProperty(
081: SubstanceLookAndFeel.USE_THEMED_DEFAULT_ICONS,
082: Boolean.FALSE);
083: this .expandButton.setFocusable(false);
084: }
085: }
086:
087: /*
088: * (non-Javadoc)
089: *
090: * @see org.jvnet.flamingo.ribbon.ui.BasicRibbonBandUI#paintBandTitle(java.awt.Graphics,
091: * java.awt.Rectangle, java.lang.String)
092: */
093: @Override
094: protected void paintBandTitle(Graphics graphics,
095: Rectangle titleRectangle, String title) {
096:
097: Graphics2D g2d = (Graphics2D) graphics.create();
098: g2d.setFont(UIManager.getFont("Ribbon.font"));
099:
100: int y = titleRectangle.y
101: + (titleRectangle.height + g2d.getFontMetrics()
102: .getAscent()) / 2 - 2;
103:
104: FontMetrics fm = graphics.getFontMetrics();
105:
106: int currLength = (int) fm.getStringBounds(title, g2d)
107: .getWidth();
108: String titleToPaint = title;
109: while (currLength > titleRectangle.width) {
110: title = title.substring(0, title.length() - 1);
111: titleToPaint = title + "...";
112: currLength = (int) fm.getStringBounds(titleToPaint, g2d)
113: .getWidth();
114: }
115:
116: int x = titleRectangle.x + (titleRectangle.width - currLength)
117: / 2;
118:
119: g2d
120: .setColor(SubstanceCoreUtilities
121: .getInterpolatedForegroundColor(
122: this .ribbonBand, null,
123: SubstanceThemeUtilities
124: .getTheme(this .ribbonBand),
125: ComponentState.DEFAULT,
126: ComponentState.DEFAULT));
127:
128: SubstanceTextPainter textPainter = SubstanceLookAndFeel
129: .getCurrentTextPainter();
130: textPainter.attachText(this .ribbonBand, titleRectangle,
131: titleToPaint, -1, g2d.getFont(), g2d.getColor(), g2d
132: .getClipBounds());
133: textPainter.renderSurface(g2d);
134:
135: // g2d.drawString(titleToPaint, x, y);
136:
137: g2d.dispose();
138: }
139:
140: /*
141: * (non-Javadoc)
142: *
143: * @see org.jvnet.flamingo.ribbon.ui.BasicRibbonBandUI#paintBandTitleBackground(java.awt.Graphics,
144: * java.awt.Rectangle, java.lang.String)
145: */
146: @Override
147: protected void paintBandTitleBackground(Graphics g,
148: Rectangle titleRectangle, String title) {
149:
150: SubstanceGradientPainter gp = new MatteGradientPainter();
151: ColorScheme colorScheme = SubstanceThemeUtilities.getTheme(
152: this .ribbonBand, ComponentState.DEFAULT)
153: .getColorScheme();
154: BufferedImage backgr = gp.getContourBackground(
155: titleRectangle.width, titleRectangle.height,
156: new Rectangle(titleRectangle.width,
157: titleRectangle.height), false, colorScheme,
158: colorScheme, 0.0f, false, true);
159:
160: SubstanceTextPainter textPainter = SubstanceLookAndFeel
161: .getCurrentTextPainter();
162: textPainter.init(this .ribbonBand, null, true);
163: if (textPainter.needsBackgroundImage()) {
164: float alpha = this .isUnderMouse ? 0.7f : 1.0f;
165: textPainter.setBackgroundFill(this .ribbonBand,
166: this .ribbonBand.getBackground(), true, 0, 0);
167: textPainter
168: .attachCallback(new SubstanceTextPainter.ImageBackgroundPaintingCallback(
169: backgr, titleRectangle.getLocation(), alpha));
170: } else {
171: Graphics2D g2d = (Graphics2D) g.create();
172: if (!this .isUnderMouse)
173: g2d.setComposite(TransitionLayout.getAlphaComposite(
174: this .ribbonBand, 0.7f, g));
175: g2d.drawImage(backgr, titleRectangle.x, titleRectangle.y,
176: null);
177: g2d.dispose();
178: }
179: }
180:
181: /*
182: * (non-Javadoc)
183: *
184: * @see org.jvnet.flamingo.ribbon.ui.BasicRibbonBandUI#paintBandBackground(java.awt.Graphics,
185: * java.awt.Rectangle)
186: */
187: @Override
188: protected void paintBandBackground(Graphics graphics,
189: Rectangle toFill) {
190: SubstanceTheme theme = SubstanceThemeUtilities
191: .getTheme(this .ribbonBand);
192: Color fillColor = this .isUnderMouse ? theme
193: .getLightBackgroundColor() : theme.getBackgroundColor();
194:
195: bgDelegate.fillAndWatermark(graphics, this .ribbonBand,
196: fillColor, toFill);
197: }
198:
199: /*
200: * (non-Javadoc)
201: *
202: * @see org.jvnet.flamingo.ribbon.ui.BasicRibbonBandUI#getBandTitleHeight()
203: */
204: @Override
205: public int getBandTitleHeight() {
206: return SubstanceSizeUtils
207: .getAdjustedSize(SubstanceSizeUtils
208: .getComponentFontSize(this .ribbonBand), 16, 1,
209: 1, false);
210: }
211:
212: /*
213: * (non-Javadoc)
214: *
215: * @see org.jvnet.flamingo.ribbon.ui.BasicRibbonBandUI#createExpandButton()
216: */
217: @Override
218: protected AbstractButton createExpandButton() {
219: Icon icon = SubstanceImageCreator.getDoubleArrowIcon(
220: SubstanceSizeUtils
221: .getComponentFontSize(this .ribbonBand), 0, 2,
222: -0.2f, SwingConstants.EAST, SubstanceThemeUtilities
223: .getTheme(this .ribbonBand));
224: JButton result = new JButton(icon);
225: result.putClientProperty(SubstanceLookAndFeel.FLAT_PROPERTY,
226: Boolean.TRUE);
227: result.setPreferredSize(new Dimension(result.getIcon()
228: .getIconWidth() + 4,
229: result.getIcon().getIconHeight() + 4));
230: return result;
231: }
232: }
|