2
* Copyright (c) 2005-2010 Flamingo Kirill Grouchnikov. All Rights Reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
7
* o Redistributions of source code must retain the above copyright notice,
8
* this list of conditions and the following disclaimer.
10
* o Redistributions in binary form must reproduce the above copyright notice,
11
* this list of conditions and the following disclaimer in the documentation
12
* and/or other materials provided with the distribution.
14
* o Neither the name of Flamingo Kirill Grouchnikov nor the names of
15
* its contributors may be used to endorse or promote products derived
16
* from this software without specific prior written permission.
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
package org.pushingpixels.flamingo.internal.utils;
33
import java.awt.image.BufferedImage;
34
import java.beans.PropertyChangeEvent;
35
import java.beans.PropertyChangeListener;
39
public class ButtonSizingUtils {
40
private static ButtonSizingUtils instance;
42
private Insets outsets;
44
private Insets toggleOutsets;
46
public static synchronized ButtonSizingUtils getInstance() {
48
instance = new ButtonSizingUtils();
52
private ButtonSizingUtils() {
53
this.outsets = this.syncOutsets(new JButton(""));
54
this.toggleOutsets = this.syncOutsets(new JToggleButton(""));
55
UIManager.addPropertyChangeListener(new PropertyChangeListener() {
57
public void propertyChange(PropertyChangeEvent evt) {
58
if ("lookAndFeel".equals(evt.getPropertyName())) {
59
outsets = syncOutsets(new JButton(""));
60
toggleOutsets = syncOutsets(new JToggleButton(""));
66
private Insets syncOutsets(AbstractButton renderer) {
67
JPanel panel = new JPanel(null);
68
renderer.putClientProperty("JButton.buttonStyle", "square");
69
renderer.setFocusable(false);
70
renderer.setOpaque(false);
72
renderer.setBounds(0, 0, 100, 50);
74
GraphicsEnvironment e = GraphicsEnvironment
75
.getLocalGraphicsEnvironment();
76
GraphicsDevice d = e.getDefaultScreenDevice();
77
GraphicsConfiguration c = d.getDefaultConfiguration();
78
BufferedImage compatibleImage = c.createCompatibleImage(100, 50,
79
Transparency.TRANSLUCENT);
80
renderer.paint(compatibleImage.getGraphics());
84
for (int i = 0; i < 25; i++) {
85
int rgba = compatibleImage.getRGB(50, i);
86
int alpha = (rgba >>> 24) & 0xFF;
94
for (int i = 49; i > 25; i--) {
95
int rgba = compatibleImage.getRGB(50, i);
96
int alpha = (rgba >>> 24) & 0xFF;
104
for (int i = 0; i < 50; i++) {
105
int rgba = compatibleImage.getRGB(i, 25);
106
int alpha = (rgba >>> 24) & 0xFF;
114
for (int i = 99; i > 50; i--) {
115
int rgba = compatibleImage.getRGB(i, 25);
116
int alpha = (rgba >>> 24) & 0xFF;
123
return new Insets(top, left, bottom, right);
126
public Insets getOutsets() {
127
return new Insets(outsets.top, outsets.left, outsets.bottom,
131
public Insets getToggleOutsets() {
132
return new Insets(toggleOutsets.top, toggleOutsets.left,
133
toggleOutsets.bottom, toggleOutsets.right);