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/BasicBorders.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/swing/plaf/basic/BasicBorders.java+600−0
@@ -0,0 +1,600 @@
1/*
2 * Copyright (c) 1997, 2010, 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 javax.swing.*;
29import javax.swing.border.*;
30import javax.swing.plaf.*;
31import javax.swing.text.JTextComponent;
32
33import java.awt.Component;
34import java.awt.Insets;
35import java.awt.Dimension;
36import java.awt.Rectangle;
37import java.awt.Color;
38import java.awt.Graphics;
39
40/**
41 * Factory object that can vend Borders appropriate for the basic L & F.
42 * @author Georges Saab
43 * @author Amy Fowler
44 */
45
46public class BasicBorders {
47
48 public static Border getButtonBorder() {
49 UIDefaults table = UIManager.getLookAndFeelDefaults();
50 Border buttonBorder = new BorderUIResource.CompoundBorderUIResource(
51 new BasicBorders.ButtonBorder(
52 table.getColor("Button.shadow"),
53 table.getColor("Button.darkShadow"),
54 table.getColor("Button.light"),
55 table.getColor("Button.highlight")),
56 new MarginBorder());
57 return buttonBorder;
58 }
59
60 public static Border getRadioButtonBorder() {
61 UIDefaults table = UIManager.getLookAndFeelDefaults();
62 Border radioButtonBorder = new BorderUIResource.CompoundBorderUIResource(
63 new BasicBorders.RadioButtonBorder(
64 table.getColor("RadioButton.shadow"),
65 table.getColor("RadioButton.darkShadow"),
66 table.getColor("RadioButton.light"),
67 table.getColor("RadioButton.highlight")),
68 new MarginBorder());
69 return radioButtonBorder;
70 }
71
72 public static Border getToggleButtonBorder() {
73 UIDefaults table = UIManager.getLookAndFeelDefaults();
74 Border toggleButtonBorder = new BorderUIResource.CompoundBorderUIResource(
75 new BasicBorders.ToggleButtonBorder(
76 table.getColor("ToggleButton.shadow"),
77 table.getColor("ToggleButton.darkShadow"),
78 table.getColor("ToggleButton.light"),
79 table.getColor("ToggleButton.highlight")),
80 new MarginBorder());
81 return toggleButtonBorder;
82 }
83
84 public static Border getMenuBarBorder() {
85 UIDefaults table = UIManager.getLookAndFeelDefaults();
86 Border menuBarBorder = new BasicBorders.MenuBarBorder(
87 table.getColor("MenuBar.shadow"),
88 table.getColor("MenuBar.highlight")
89 );
90 return menuBarBorder;
91 }
92
93 public static Border getSplitPaneBorder() {
94 UIDefaults table = UIManager.getLookAndFeelDefaults();
95 Border splitPaneBorder = new BasicBorders.SplitPaneBorder(
96 table.getColor("SplitPane.highlight"),
97 table.getColor("SplitPane.darkShadow"));
98 return splitPaneBorder;
99 }
100
101 /**
102 * Returns a border instance for a JSplitPane divider
103 * @since 1.3
104 */
105 public static Border getSplitPaneDividerBorder() {
106 UIDefaults table = UIManager.getLookAndFeelDefaults();
107 Border splitPaneBorder = new BasicBorders.SplitPaneDividerBorder(
108 table.getColor("SplitPane.highlight"),
109 table.getColor("SplitPane.darkShadow"));
110 return splitPaneBorder;
111 }
112
113 public static Border getTextFieldBorder() {
114 UIDefaults table = UIManager.getLookAndFeelDefaults();
115 Border textFieldBorder = new BasicBorders.FieldBorder(
116 table.getColor("TextField.shadow"),
117 table.getColor("TextField.darkShadow"),
118 table.getColor("TextField.light"),
119 table.getColor("TextField.highlight"));
120 return textFieldBorder;
121 }
122
123 public static Border getProgressBarBorder() {
124 UIDefaults table = UIManager.getLookAndFeelDefaults();
125 Border progressBarBorder = new BorderUIResource.LineBorderUIResource(Color.green, 2);
126 return progressBarBorder;
127 }
128
129 public static Border getInternalFrameBorder() {
130 UIDefaults table = UIManager.getLookAndFeelDefaults();
131 Border internalFrameBorder = new BorderUIResource.CompoundBorderUIResource(
132 new BevelBorder(BevelBorder.RAISED,
133 table.getColor("InternalFrame.borderLight"),
134 table.getColor("InternalFrame.borderHighlight"),
135 table.getColor("InternalFrame.borderDarkShadow"),
136 table.getColor("InternalFrame.borderShadow")),
137 BorderFactory.createLineBorder(
138 table.getColor("InternalFrame.borderColor"), 1));
139
140 return internalFrameBorder;
141 }
142
143 /**
144 * Special thin border for rollover toolbar buttons.
145 * @since 1.4
146 */
147 public static class RolloverButtonBorder extends ButtonBorder {
148
149 public RolloverButtonBorder(Color shadow, Color darkShadow,
150 Color highlight, Color lightHighlight) {
151 super(shadow, darkShadow, highlight, lightHighlight);
152 }
153
154 public void paintBorder( Component c, Graphics g, int x, int y, int w, int h ) {
155 AbstractButton b = (AbstractButton) c;
156 ButtonModel model = b.getModel();
157
158 Color shade = shadow;
159 Component p = b.getParent();
160 if (p != null && p.getBackground().equals(shadow)) {
161 shade = darkShadow;
162 }
163
164 if ((model.isRollover() && !(model.isPressed() && !model.isArmed())) ||
165 model.isSelected()) {
166
167 Color oldColor = g.getColor();
168 g.translate(x, y);
169
170 if (model.isPressed() && model.isArmed() || model.isSelected()) {
171 // Draw the pressd button
172 g.setColor(shade);
173 g.drawRect(0, 0, w-1, h-1);
174 g.setColor(lightHighlight);
175 g.drawLine(w-1, 0, w-1, h-1);
176 g.drawLine(0, h-1, w-1, h-1);
177 } else {
178 // Draw a rollover button
179 g.setColor(lightHighlight);
180 g.drawRect(0, 0, w-1, h-1);
181 g.setColor(shade);
182 g.drawLine(w-1, 0, w-1, h-1);
183 g.drawLine(0, h-1, w-1, h-1);
184 }
185 g.translate(-x, -y);
186 g.setColor(oldColor);
187 }
188 }
189 }
190
191
192 /**
193 * A border which is like a Margin border but it will only honor the margin
194 * if the margin has been explicitly set by the developer.
195 *
196 * Note: This is identical to the package private class
197 * MetalBorders.RolloverMarginBorder and should probably be consolidated.
198 */
199 static class RolloverMarginBorder extends EmptyBorder {
200
201 public RolloverMarginBorder() {
202 super(3,3,3,3); // hardcoded margin for JLF requirements.
203 }
204
205 public Insets getBorderInsets(Component c, Insets insets) {
206 Insets margin = null;
207
208 if (c instanceof AbstractButton) {
209 margin = ((AbstractButton)c).getMargin();
210 }
211 if (margin == null || margin instanceof UIResource) {
212 // default margin so replace
213 insets.left = left;
214 insets.top = top;
215 insets.right = right;
216 insets.bottom = bottom;
217 } else {
218 // Margin which has been explicitly set by the user.
219 insets.left = margin.left;
220 insets.top = margin.top;
221 insets.right = margin.right;
222 insets.bottom = margin.bottom;
223 }
224 return insets;
225 }
226 }
227
228 public static class ButtonBorder extends AbstractBorder implements UIResource {
229 protected Color shadow;
230 protected Color darkShadow;
231 protected Color highlight;
232 protected Color lightHighlight;
233
234 public ButtonBorder(Color shadow, Color darkShadow,
235 Color highlight, Color lightHighlight) {
236 this.shadow = shadow;
237 this.darkShadow = darkShadow;
238 this.highlight = highlight;
239 this.lightHighlight = lightHighlight;
240 }
241
242 public void paintBorder(Component c, Graphics g, int x, int y,
243 int width, int height) {
244 boolean isPressed = false;
245 boolean isDefault = false;
246
247 if (c instanceof AbstractButton) {
248 AbstractButton b = (AbstractButton)c;
249 ButtonModel model = b.getModel();
250
251 isPressed = model.isPressed() && model.isArmed();
252
253 if (c instanceof JButton) {
254 isDefault = ((JButton)c).isDefaultButton();
255 }
256 }
257 BasicGraphicsUtils.drawBezel(g, x, y, width, height,
258 isPressed, isDefault, shadow,
259 darkShadow, highlight, lightHighlight);
260 }
261
262 public Insets getBorderInsets(Component c, Insets insets) {
263 // leave room for default visual
264 insets.set(2, 3, 3, 3);
265 return insets;
266 }
267
268 }
269
270 public static class ToggleButtonBorder extends ButtonBorder {
271
272 public ToggleButtonBorder(Color shadow, Color darkShadow,
273 Color highlight, Color lightHighlight) {
274 super(shadow, darkShadow, highlight, lightHighlight);
275 }
276
277 public void paintBorder(Component c, Graphics g, int x, int y,
278 int width, int height) {
279 BasicGraphicsUtils.drawBezel(g, x, y, width, height,
280 false, false,
281 shadow, darkShadow,
282 highlight, lightHighlight);
283 }
284
285 public Insets getBorderInsets(Component c, Insets insets) {
286 insets.set(2, 2, 2, 2);
287 return insets;
288 }
289 }
290
291 public static class RadioButtonBorder extends ButtonBorder {
292
293 public RadioButtonBorder(Color shadow, Color darkShadow,
294 Color highlight, Color lightHighlight) {
295 super(shadow, darkShadow, highlight, lightHighlight);
296 }
297
298
299 public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
300
301 if (c instanceof AbstractButton) {
302 AbstractButton b = (AbstractButton)c;
303 ButtonModel model = b.getModel();
304
305 if (model.isArmed() && model.isPressed() || model.isSelected()) {
306 BasicGraphicsUtils.drawLoweredBezel(g, x, y, width, height,
307 shadow, darkShadow,
308 highlight, lightHighlight);
309 } else {
310 BasicGraphicsUtils.drawBezel(g, x, y, width, height,
311 false, b.isFocusPainted() && b.hasFocus(),
312 shadow, darkShadow,
313 highlight, lightHighlight);
314 }
315 } else {
316 BasicGraphicsUtils.drawBezel(g, x, y, width, height, false, false,
317 shadow, darkShadow, highlight, lightHighlight);
318 }
319 }
320
321 public Insets getBorderInsets(Component c, Insets insets) {
322 insets.set(2, 2, 2, 2);
323 return insets;
324 }
325 }
326
327 public static class MenuBarBorder extends AbstractBorder implements UIResource {
328 private Color shadow;
329 private Color highlight;
330
331 public MenuBarBorder(Color shadow, Color highlight) {
332 this.shadow = shadow;
333 this.highlight = highlight;
334 }
335
336 public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
337 Color oldColor = g.getColor();
338 g.translate(x, y);
339 g.setColor(shadow);
340 g.drawLine(0, height-2, width, height-2);
341 g.setColor(highlight);
342 g.drawLine(0, height-1, width, height-1);
343 g.translate(-x,-y);
344 g.setColor(oldColor);
345 }
346
347 public Insets getBorderInsets(Component c, Insets insets) {
348 insets.set(0, 0, 2, 0);
349 return insets;
350 }
351 }
352
353 public static class MarginBorder extends AbstractBorder implements UIResource {
354 public Insets getBorderInsets(Component c, Insets insets) {
355 Insets margin = null;
356 //
357 // Ideally we'd have an interface defined for classes which
358 // support margins (to avoid this hackery), but we've
359 // decided against it for simplicity
360 //
361 if (c instanceof AbstractButton) {
362 AbstractButton b = (AbstractButton)c;
363 margin = b.getMargin();
364 } else if (c instanceof JToolBar) {
365 JToolBar t = (JToolBar)c;
366 margin = t.getMargin();
367 } else if (c instanceof JTextComponent) {
368 JTextComponent t = (JTextComponent)c;
369 margin = t.getMargin();
370 }
371 insets.top = margin != null? margin.top : 0;
372 insets.left = margin != null? margin.left : 0;
373 insets.bottom = margin != null? margin.bottom : 0;
374 insets.right = margin != null? margin.right : 0;
375
376 return insets;
377 }
378 }
379
380 public static class FieldBorder extends AbstractBorder implements UIResource {
381 protected Color shadow;
382 protected Color darkShadow;
383 protected Color highlight;
384 protected Color lightHighlight;
385
386 public FieldBorder(Color shadow, Color darkShadow,
387 Color highlight, Color lightHighlight) {
388 this.shadow = shadow;
389 this.highlight = highlight;
390 this.darkShadow = darkShadow;
391 this.lightHighlight = lightHighlight;
392 }
393
394 public void paintBorder(Component c, Graphics g, int x, int y,
395 int width, int height) {
396 BasicGraphicsUtils.drawEtchedRect(g, x, y, width, height,
397 shadow, darkShadow,
398 highlight, lightHighlight);
399 }
400
401 public Insets getBorderInsets(Component c, Insets insets) {
402 Insets margin = null;
403 if (c instanceof JTextComponent) {
404 margin = ((JTextComponent)c).getMargin();
405 }
406 insets.top = margin != null? 2+margin.top : 2;
407 insets.left = margin != null? 2+margin.left : 2;
408 insets.bottom = margin != null? 2+margin.bottom : 2;
409 insets.right = margin != null? 2+margin.right : 2;
410
411 return insets;
412 }
413 }
414
415
416 /**
417 * Draws the border around the divider in a splitpane
418 * (when BasicSplitPaneUI is used). To get the appropriate effect, this
419 * needs to be used with a SplitPaneBorder.
420 */
421 static class SplitPaneDividerBorder implements Border, UIResource {
422 Color highlight;
423 Color shadow;
424
425 SplitPaneDividerBorder(Color highlight, Color shadow) {
426 this.highlight = highlight;
427 this.shadow = shadow;
428 }
429
430 public void paintBorder(Component c, Graphics g, int x, int y,
431 int width, int height) {
432 if (!(c instanceof BasicSplitPaneDivider)) {
433 return;
434 }
435 Component child;
436 Rectangle cBounds;
437 JSplitPane splitPane = ((BasicSplitPaneDivider)c).
438 getBasicSplitPaneUI().getSplitPane();
439 Dimension size = c.getSize();
440
441 child = splitPane.getLeftComponent();
442 // This is needed for the space between the divider and end of
443 // splitpane.
444 g.setColor(c.getBackground());
445 g.drawRect(x, y, width - 1, height - 1);
446 if(splitPane.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) {
447 if(child != null) {
448 g.setColor(highlight);
449 g.drawLine(0, 0, 0, size.height);
450 }
451 child = splitPane.getRightComponent();
452 if(child != null) {
453 g.setColor(shadow);
454 g.drawLine(size.width - 1, 0, size.width - 1, size.height);
455 }
456 } else {
457 if(child != null) {
458 g.setColor(highlight);
459 g.drawLine(0, 0, size.width, 0);
460 }
461 child = splitPane.getRightComponent();
462 if(child != null) {
463 g.setColor(shadow);
464 g.drawLine(0, size.height - 1, size.width,
465 size.height - 1);
466 }
467 }
468 }
469 public Insets getBorderInsets(Component c) {
470 Insets insets = new Insets(0,0,0,0);
471 if (c instanceof BasicSplitPaneDivider) {
472 BasicSplitPaneUI bspui = ((BasicSplitPaneDivider)c).
473 getBasicSplitPaneUI();
474
475 if (bspui != null) {
476 JSplitPane splitPane = bspui.getSplitPane();
477
478 if (splitPane != null) {
479 if (splitPane.getOrientation() ==
480 JSplitPane.HORIZONTAL_SPLIT) {
481 insets.top = insets.bottom = 0;
482 insets.left = insets.right = 1;
483 return insets;
484 }
485 // VERTICAL_SPLIT
486 insets.top = insets.bottom = 1;
487 insets.left = insets.right = 0;
488 return insets;
489 }
490 }
491 }
492 insets.top = insets.bottom = insets.left = insets.right = 1;
493 return insets;
494 }
495 public boolean isBorderOpaque() { return true; }
496 }
497
498
499 /**
500 * Draws the border around the splitpane. To work correctly you shoudl
501 * also install a border on the divider (property SplitPaneDivider.border).
502 */
503 public static class SplitPaneBorder implements Border, UIResource {
504 protected Color highlight;
505 protected Color shadow;
506
507 public SplitPaneBorder(Color highlight, Color shadow) {
508 this.highlight = highlight;
509 this.shadow = shadow;
510 }
511
512 public void paintBorder(Component c, Graphics g, int x, int y,
513 int width, int height) {
514 if (!(c instanceof JSplitPane)) {
515 return;
516 }
517 // The only tricky part with this border is that the divider is
518 // not positioned at the top (for horizontal) or left (for vert),
519 // so this border draws to where the divider is:
520 // -----------------
521 // |xxxxxxx xxxxxxx|
522 // |x --- x|
523 // |x | | x|
524 // |x |D| x|
525 // |x | | x|
526 // |x --- x|
527 // |xxxxxxx xxxxxxx|
528 // -----------------
529 // The above shows (rather excessively) what this looks like for
530 // a horizontal orientation. This border then draws the x's, with
531 // the SplitPaneDividerBorder drawing its own border.
532
533 Component child;
534 Rectangle cBounds;
535
536 JSplitPane splitPane = (JSplitPane)c;
537
538 child = splitPane.getLeftComponent();
539 // This is needed for the space between the divider and end of
540 // splitpane.
541 g.setColor(c.getBackground());
542 g.drawRect(x, y, width - 1, height - 1);
543 if(splitPane.getOrientation() == JSplitPane.HORIZONTAL_SPLIT) {
544 if(child != null) {
545 cBounds = child.getBounds();
546 g.setColor(shadow);
547 g.drawLine(0, 0, cBounds.width + 1, 0);
548 g.drawLine(0, 1, 0, cBounds.height + 1);
549
550 g.setColor(highlight);
551 g.drawLine(0, cBounds.height + 1, cBounds.width + 1,
552 cBounds.height + 1);
553 }
554 child = splitPane.getRightComponent();
555 if(child != null) {
556 cBounds = child.getBounds();
557
558 int maxX = cBounds.x + cBounds.width;
559 int maxY = cBounds.y + cBounds.height;
560
561 g.setColor(shadow);
562 g.drawLine(cBounds.x - 1, 0, maxX, 0);
563 g.setColor(highlight);
564 g.drawLine(cBounds.x - 1, maxY, maxX, maxY);
565 g.drawLine(maxX, 0, maxX, maxY + 1);
566 }
567 } else {
568 if(child != null) {
569 cBounds = child.getBounds();
570 g.setColor(shadow);
571 g.drawLine(0, 0, cBounds.width + 1, 0);
572 g.drawLine(0, 1, 0, cBounds.height);
573 g.setColor(highlight);
574 g.drawLine(1 + cBounds.width, 0, 1 + cBounds.width,
575 cBounds.height + 1);
576 g.drawLine(0, cBounds.height + 1, 0, cBounds.height + 1);
577 }
578 child = splitPane.getRightComponent();
579 if(child != null) {
580 cBounds = child.getBounds();
581
582 int maxX = cBounds.x + cBounds.width;
583 int maxY = cBounds.y + cBounds.height;
584
585 g.setColor(shadow);
586 g.drawLine(0, cBounds.y - 1, 0, maxY);
587 g.drawLine(maxX, cBounds.y - 1, maxX, cBounds.y - 1);
588 g.setColor(highlight);
589 g.drawLine(0, maxY, cBounds.width + 1, maxY);
590 g.drawLine(maxX, cBounds.y, maxX, maxY);
591 }
592 }
593 }
594 public Insets getBorderInsets(Component c) {
595 return new Insets(1, 1, 1, 1);
596 }
597 public boolean isBorderOpaque() { return true; }
598 }
599
600}