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;
031:
032: import java.awt.*;
033:
034: import javax.swing.*;
035: import javax.swing.border.AbstractBorder;
036: import javax.swing.plaf.UIResource;
037:
038: import org.jvnet.substance.theme.SubstanceTheme;
039: import org.jvnet.substance.utils.SubstanceSizeUtils;
040: import org.jvnet.substance.utils.SubstanceThemeUtilities;
041:
042: /**
043: * Border for toolbar.
044: *
045: * @author Kirill Grouchnikov
046: */
047: public class SubstanceToolBarBorder extends AbstractBorder implements
048: UIResource {
049: /*
050: * (non-Javadoc)
051: *
052: * @see javax.swing.border.Border#paintBorder(java.awt.Component,
053: * java.awt.Graphics, int, int, int, int)
054: */
055: @Override
056: public void paintBorder(Component c, Graphics g, int x, int y,
057: int w, int h) {
058: // failsafe for LAF change
059: if (!(UIManager.getLookAndFeel() instanceof SubstanceLookAndFeel))
060: return;
061:
062: Graphics2D graphics = (Graphics2D) g;
063: graphics.translate(x, y);
064:
065: if (((JToolBar) c).isFloatable()) {
066: SubstanceTheme theme = SubstanceThemeUtilities.getTheme(c)
067: .getDefaultTheme();
068: int dragBumpsWidth = (int) (0.75 * SubstanceSizeUtils
069: .getToolBarDragInset(SubstanceSizeUtils
070: .getComponentFontSize(c)));
071: if (((JToolBar) c).getOrientation() == SwingConstants.HORIZONTAL) {
072: // fix for defect 3 on NB module
073: int height = c.getHeight() - 4;
074: if (height > 0) {
075: if (c.getComponentOrientation().isLeftToRight()) {
076: graphics.drawImage(SubstanceImageCreator
077: .getDragImage(c, theme, dragBumpsWidth,
078: height, false, false, 2), 2, 1,
079: null);
080: } else {
081: graphics.drawImage(SubstanceImageCreator
082: .getDragImage(c, theme, dragBumpsWidth,
083: height, false, false, 2), c
084: .getBounds().width
085: - dragBumpsWidth - 2, 1, null);
086: }
087: }
088: } else // vertical
089: {
090: // fix for defect 3 on NB module
091: int width = c.getWidth() - 4;
092: if (width > 0) {
093: graphics.drawImage(SubstanceImageCreator
094: .getDragImage(c, theme, width,
095: dragBumpsWidth, false, false, 2),
096: 2, 2, null);
097: }
098: }
099: }
100:
101: graphics.translate(-x, -y);
102: }
103:
104: /*
105: * (non-Javadoc)
106: *
107: * @see javax.swing.border.Border#getBorderInsets(java.awt.Component)
108: */
109: @Override
110: public Insets getBorderInsets(Component c) {
111: return this .getBorderInsets(c, new Insets(0, 0, 0, 0));
112: }
113:
114: /*
115: * (non-Javadoc)
116: *
117: * @see javax.swing.border.AbstractBorder#getBorderInsets(java.awt.Component,
118: * java.awt.Insets)
119: */
120: @Override
121: public Insets getBorderInsets(Component c, Insets newInsets) {
122: Insets defaultInsets = SubstanceSizeUtils
123: .getToolBarInsets(SubstanceSizeUtils
124: .getComponentFontSize(c));
125: newInsets.set(defaultInsets.top, defaultInsets.left,
126: defaultInsets.bottom, defaultInsets.right);
127:
128: JToolBar toolbar = (JToolBar) c;
129: if (toolbar.isFloatable()) {
130: int dragInset = SubstanceSizeUtils
131: .getToolBarDragInset(SubstanceSizeUtils
132: .getComponentFontSize(c));
133: if (toolbar.getOrientation() == SwingConstants.HORIZONTAL) {
134: if (toolbar.getComponentOrientation().isLeftToRight()) {
135: newInsets.left = dragInset;
136: } else {
137: newInsets.right = dragInset;
138: }
139: } else {// vertical
140: newInsets.top = dragInset;
141: }
142: }
143:
144: Insets margin = toolbar.getMargin();
145:
146: if (margin != null) {
147: newInsets.left += margin.left;
148: newInsets.top += margin.top;
149: newInsets.right += margin.right;
150: newInsets.bottom += margin.bottom;
151: }
152:
153: return newInsets;
154: }
155: }
|