History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/swing/plaf/basic/BasicRadioButtonUI.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/swing/plaf/basic/BasicRadioButtonUI.java+261−0
@@ -0,0 +1,261 @@
1/*
2 * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package javax.swing.plaf.basic;
27
28import java.awt.*;
29import java.awt.event.*;
30import javax.swing.*;
31import javax.swing.border.*;
32import javax.swing.plaf.*;
33import javax.swing.text.View;
34import sun.swing.SwingUtilities2;
35import sun.awt.AppContext;
36
37
38/**
39 * RadioButtonUI implementation for BasicRadioButtonUI
40 *
41 * @author Jeff Dinkins
42 */
43public class BasicRadioButtonUI extends BasicToggleButtonUI
44{
45 private static final Object BASIC_RADIO_BUTTON_UI_KEY = new Object();
46
47 protected Icon icon;
48
49 private boolean defaults_initialized = false;
50
51 private final static String propertyPrefix = "RadioButton" + ".";
52
53 // ********************************
54 // Create PLAF
55 // ********************************
56 public static ComponentUI createUI(JComponent b) {
57 AppContext appContext = AppContext.getAppContext();
58 BasicRadioButtonUI radioButtonUI =
59 (BasicRadioButtonUI) appContext.get(BASIC_RADIO_BUTTON_UI_KEY);
60 if (radioButtonUI == null) {
61 radioButtonUI = new BasicRadioButtonUI();
62 appContext.put(BASIC_RADIO_BUTTON_UI_KEY, radioButtonUI);
63 }
64 return radioButtonUI;
65 }
66
67 protected String getPropertyPrefix() {
68 return propertyPrefix;
69 }
70
71 // ********************************
72 // Install PLAF
73 // ********************************
74 protected void installDefaults(AbstractButton b){
75 super.installDefaults(b);
76 if(!defaults_initialized) {
77 icon = UIManager.getIcon(getPropertyPrefix() + "icon");
78 defaults_initialized = true;
79 }
80 }
81
82 // ********************************
83 // Uninstall PLAF
84 // ********************************
85 protected void uninstallDefaults(AbstractButton b){
86 super.uninstallDefaults(b);
87 defaults_initialized = false;
88 }
89
90 public Icon getDefaultIcon() {
91 return icon;
92 }
93
94
95 /* These Dimensions/Rectangles are allocated once for all
96 * RadioButtonUI.paint() calls. Re-using rectangles
97 * rather than allocating them in each paint call substantially
98 * reduced the time it took paint to run. Obviously, this
99 * method can't be re-entered.
100 */
101 private static Dimension size = new Dimension();
102 private static Rectangle viewRect = new Rectangle();
103 private static Rectangle iconRect = new Rectangle();
104 private static Rectangle textRect = new Rectangle();
105
106 /**
107 * paint the radio button
108 */
109 public synchronized void paint(Graphics g, JComponent c) {
110 AbstractButton b = (AbstractButton) c;
111 ButtonModel model = b.getModel();
112
113 Font f = c.getFont();
114 g.setFont(f);
115 FontMetrics fm = SwingUtilities2.getFontMetrics(c, g, f);
116
117 Insets i = c.getInsets();
118 size = b.getSize(size);
119 viewRect.x = i.left;
120 viewRect.y = i.top;
121 viewRect.width = size.width - (i.right + viewRect.x);
122 viewRect.height = size.height - (i.bottom + viewRect.y);
123 iconRect.x = iconRect.y = iconRect.width = iconRect.height = 0;
124 textRect.x = textRect.y = textRect.width = textRect.height = 0;
125
126 Icon altIcon = b.getIcon();
127 Icon selectedIcon = null;
128 Icon disabledIcon = null;
129
130 String text = SwingUtilities.layoutCompoundLabel(
131 c, fm, b.getText(), altIcon != null ? altIcon : getDefaultIcon(),
132 b.getVerticalAlignment(), b.getHorizontalAlignment(),
133 b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
134 viewRect, iconRect, textRect,
135 b.getText() == null ? 0 : b.getIconTextGap());
136
137 // fill background
138 if(c.isOpaque()) {
139 g.setColor(b.getBackground());
140 g.fillRect(0,0, size.width, size.height);
141 }
142
143
144 // Paint the radio button
145 if(altIcon != null) {
146
147 if(!model.isEnabled()) {
148 if(model.isSelected()) {
149 altIcon = b.getDisabledSelectedIcon();
150 } else {
151 altIcon = b.getDisabledIcon();
152 }
153 } else if(model.isPressed() && model.isArmed()) {
154 altIcon = b.getPressedIcon();
155 if(altIcon == null) {
156 // Use selected icon
157 altIcon = b.getSelectedIcon();
158 }
159 } else if(model.isSelected()) {
160 if(b.isRolloverEnabled() && model.isRollover()) {
161 altIcon = b.getRolloverSelectedIcon();
162 if (altIcon == null) {
163 altIcon = b.getSelectedIcon();
164 }
165 } else {
166 altIcon = b.getSelectedIcon();
167 }
168 } else if(b.isRolloverEnabled() && model.isRollover()) {
169 altIcon = b.getRolloverIcon();
170 }
171
172 if(altIcon == null) {
173 altIcon = b.getIcon();
174 }
175
176 altIcon.paintIcon(c, g, iconRect.x, iconRect.y);
177
178 } else {
179 getDefaultIcon().paintIcon(c, g, iconRect.x, iconRect.y);
180 }
181
182
183 // Draw the Text
184 if(text != null) {
185 View v = (View) c.getClientProperty(BasicHTML.propertyKey);
186 if (v != null) {
187 v.paint(g, textRect);
188 } else {
189 paintText(g, b, textRect, text);
190 }
191 if(b.hasFocus() && b.isFocusPainted() &&
192 textRect.width > 0 && textRect.height > 0 ) {
193 paintFocus(g, textRect, size);
194 }
195 }
196 }
197
198 protected void paintFocus(Graphics g, Rectangle textRect, Dimension size){
199 }
200
201
202 /* These Insets/Rectangles are allocated once for all
203 * RadioButtonUI.getPreferredSize() calls. Re-using rectangles
204 * rather than allocating them in each call substantially
205 * reduced the time it took getPreferredSize() to run. Obviously,
206 * this method can't be re-entered.
207 */
208 private static Rectangle prefViewRect = new Rectangle();
209 private static Rectangle prefIconRect = new Rectangle();
210 private static Rectangle prefTextRect = new Rectangle();
211 private static Insets prefInsets = new Insets(0, 0, 0, 0);
212
213 /**
214 * The preferred size of the radio button
215 */
216 public Dimension getPreferredSize(JComponent c) {
217 if(c.getComponentCount() > 0) {
218 return null;
219 }
220
221 AbstractButton b = (AbstractButton) c;
222
223 String text = b.getText();
224
225 Icon buttonIcon = b.getIcon();
226 if(buttonIcon == null) {
227 buttonIcon = getDefaultIcon();
228 }
229
230 Font font = b.getFont();
231 FontMetrics fm = b.getFontMetrics(font);
232
233 prefViewRect.x = prefViewRect.y = 0;
234 prefViewRect.width = Short.MAX_VALUE;
235 prefViewRect.height = Short.MAX_VALUE;
236 prefIconRect.x = prefIconRect.y = prefIconRect.width = prefIconRect.height = 0;
237 prefTextRect.x = prefTextRect.y = prefTextRect.width = prefTextRect.height = 0;
238
239 SwingUtilities.layoutCompoundLabel(
240 c, fm, text, buttonIcon,
241 b.getVerticalAlignment(), b.getHorizontalAlignment(),
242 b.getVerticalTextPosition(), b.getHorizontalTextPosition(),
243 prefViewRect, prefIconRect, prefTextRect,
244 text == null ? 0 : b.getIconTextGap());
245
246 // find the union of the icon and text rects (from Rectangle.java)
247 int x1 = Math.min(prefIconRect.x, prefTextRect.x);
248 int x2 = Math.max(prefIconRect.x + prefIconRect.width,
249 prefTextRect.x + prefTextRect.width);
250 int y1 = Math.min(prefIconRect.y, prefTextRect.y);
251 int y2 = Math.max(prefIconRect.y + prefIconRect.height,
252 prefTextRect.y + prefTextRect.height);
253 int width = x2 - x1;
254 int height = y2 - y1;
255
256 prefInsets = b.getInsets(prefInsets);
257 width += prefInsets.left + prefInsets.right;
258 height += prefInsets.top + prefInsets.bottom;
259 return new Dimension(width, height);
260 }
261}