1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45:
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56: import ;
57: import ;
58: import ;
59: import ;
60: import ;
61: import ;
62: import ;
63: import ;
64: import ;
65: import ;
66: import ;
67:
68:
69:
74: public class MetalBorders
75: {
76:
77:
78: private static Border buttonBorder;
79:
80:
81: private static Border toggleButtonBorder;
82:
83:
84: private static Border desktopIconBorder;
85:
86:
87: private static Border toolbarButtonBorder;
88:
89:
90: private static Border textFieldBorder;
91:
92:
93: private static Border textBorder;
94:
95:
96: private static Border rolloverBorder;
97:
98:
103: private static BasicBorders.MarginBorder marginBorder;
104:
105:
117: public static class ButtonBorder extends AbstractBorder implements UIResource
118: {
119:
120: protected static Insets borderInsets = new Insets(3, 3, 3, 3);
121:
122:
125: public ButtonBorder()
126: {
127:
128: }
129:
130:
140: public void paintBorder(Component c, Graphics g, int x, int y, int w,
141: int h)
142: {
143:
144:
145:
146:
147:
148: if (MetalLookAndFeel.getCurrentTheme() instanceof OceanTheme)
149: paintOceanButtonBorder(c, g, x, y, w, h);
150: else
151: paintDefaultButtonBorder(c, g, x, y, w, h);
152: }
153:
154:
164: private void paintDefaultButtonBorder(Component c, Graphics g, int x,
165: int y, int w, int h)
166: {
167: ButtonModel bmodel = null;
168:
169:
170:
171: if (c instanceof AbstractButton)
172: bmodel = ((AbstractButton) c).getModel();
173: else
174: throw new IllegalStateException("A ButtonBorder is supposed to work "
175: + "only with AbstractButton and"
176: + "subclasses.");
177:
178: Color darkShadow = MetalLookAndFeel.getControlDarkShadow();
179: Color shadow = MetalLookAndFeel.getControlShadow();
180: Color light = MetalLookAndFeel.getControlHighlight();
181: Color middle = MetalLookAndFeel.getControl();
182:
183: if (c.isEnabled())
184: {
185:
186: g.setColor(darkShadow);
187: g.drawRect(x, y, w - 2, h - 2);
188:
189:
190:
191: if (c instanceof JButton && ((JButton) c).isDefaultButton())
192: {
193: g.drawRect(x + 1, y + 1, w - 4, h - 4);
194:
195: g.setColor(light);
196: g.drawLine(x + 2, y + 2, x + w - 4, y + 2);
197: g.drawLine(x + 2, y + 2, x + 2, y + h - 4);
198: g.drawLine(x + 2, y + h - 1, x + w - 1, y + h - 1);
199: g.drawLine(x + w - 1, y + 2, x + w - 1, y + h - 1);
200:
201: g.setColor(middle);
202: g.fillRect(x + w - 2, y + 2, 1, 1);
203: g.fillRect(x + 2, y + h - 2, 1, 1);
204: }
205: else
206: {
207:
208:
209: if (! (bmodel.isPressed() && bmodel.isArmed()))
210: {
211:
212: g.setColor(light);
213: g.drawRect(x + 1, y + 1, w - 2, h - 2);
214:
215:
216: g.setColor(middle);
217: g.drawLine(x + 1, y + h - 2, x + 1, y + h - 2);
218: g.drawLine(x + w - 2, y + 1, x + w - 2, y + 1);
219: }
220:
221:
222: else
223: {
224:
225: g.setColor(light);
226: g.drawLine(x + w - 1, y + 1, x + w - 1, y + h - 1);
227: g.drawLine(x + 1, y + h - 1, x + w - 1, y + h - 1);
228:
229:
230: g.setColor(middle);
231: g.drawLine(x + 1, y + 1, x + w - 2, y + 1);
232: g.drawLine(x + 1, y + 1, x + 1, y + h - 2);
233:
234:
235: g.setColor(shadow);
236: g.drawRect(x + 1, y + h - 2, 0, 0);
237: g.drawRect(x + w - 2, y + 1, 0, 0);
238: }
239: }
240: }
241: else
242: {
243:
244: g.setColor(MetalLookAndFeel.getInactiveControlTextColor());
245: g.drawRect(x, y, w - 2, h - 2);
246: }
247: }
248:
249:
259: private void paintOceanButtonBorder(Component c, Graphics g, int x,
260: int y, int w, int h)
261: {
262: ButtonModel bmodel = null;
263:
264:
265:
266: if (c instanceof AbstractButton)
267: bmodel = ((AbstractButton) c).getModel();
268: else
269: throw new IllegalStateException("A ButtonBorder is supposed to work "
270: + "only with AbstractButton and"
271: + "subclasses.");
272:
273: Color darkShadow = MetalLookAndFeel.getControlDarkShadow();
274: Color shadow = MetalLookAndFeel.getControlShadow();
275: Color light = MetalLookAndFeel.getControlHighlight();
276: Color middle = MetalLookAndFeel.getControl();
277:
278: if (c.isEnabled())
279: {
280:
281:
282:
283: if (bmodel.isPressed() || ((c instanceof JButton)
284: && ((JButton) c).isDefaultButton()))
285: {
286:
287: g.setColor(darkShadow);
288: g.drawRect(x, y, w - 1, h - 1);
289: g.drawRect(x + 1, y + 1, w - 3, h - 3);
290: }
291: else if (bmodel.isRollover() && !(c.getParent() instanceof JToolBar))
292: {
293:
294:
295: g.setColor(shadow);
296: g.drawRect(x, y, w - 1, h - 1);
297: g.drawRect(x + 2, y + 2, w - 5, h - 5);
298: g.setColor(darkShadow);
299: g.drawRect(x + 1, y + 1, w - 3, h - 3);
300: }
301: else
302: {
303: g.setColor(darkShadow);
304: g.drawRect(x, y, w - 1, h - 1);
305: }
306: }
307: else
308: {
309:
310: g.setColor(MetalLookAndFeel.getInactiveControlTextColor());
311: g.drawRect(x, y, w - 2, h - 2);
312: }
313: }
314:
315:
322: public Insets getBorderInsets(Component c)
323: {
324: return borderInsets;
325: }
326:
327:
337: public Insets getBorderInsets(Component c, Insets newInsets)
338: {
339: newInsets.bottom = borderInsets.bottom;
340: newInsets.left = borderInsets.left;
341: newInsets.right = borderInsets.right;
342: newInsets.top = borderInsets.top;
343: return newInsets;
344: }
345: }
346:
347:
350: static class DesktopIconBorder extends AbstractBorder
351: implements UIResource
352: {
353:
356: public DesktopIconBorder()
357: {
358:
359: }
360:
361:
368: public Insets getBorderInsets(Component c)
369: {
370: return getBorderInsets(c, null);
371: }
372:
373:
379: public Insets getBorderInsets(Component c, Insets newInsets)
380: {
381: if (newInsets == null)
382: newInsets = new Insets(3, 3, 2, 3);
383: else
384: {
385: newInsets.top = 3;
386: newInsets.left = 3;
387: newInsets.bottom = 2;
388: newInsets.right = 3;
389: }
390: return newInsets;
391: }
392:
393:
403: public void paintBorder(Component c, Graphics g, int x, int y, int w,
404: int h)
405: {
406: g.setColor(MetalLookAndFeel.getControlDarkShadow());
407: g.drawRect(x, y, w - 1, h - 1);
408: }
409:
410: }
411:
412:
415: public static class Flush3DBorder extends AbstractBorder
416: implements UIResource
417: {
418: private static final Insets borderInsets = new Insets(2, 2, 2, 2);
419:
420:
423: public Flush3DBorder()
424: {
425:
426: }
427:
428:
435: public Insets getBorderInsets(Component c)
436: {
437: return borderInsets;
438: }
439:
440:
450: public Insets getBorderInsets(Component c, Insets newInsets)
451: {
452: newInsets.top = borderInsets.top;
453: newInsets.left = borderInsets.left;
454: newInsets.bottom = borderInsets.bottom;
455: newInsets.right = borderInsets.right;
456: return newInsets;
457: }
458:
459:
469: public void paintBorder(Component c, Graphics g, int x, int y, int w,
470: int h)
471: {
472: Color savedColor = g.getColor();
473: g.setColor(MetalLookAndFeel.getControlDarkShadow());
474: g.drawRect(x, y, w - 2, h - 2);
475: g.setColor(MetalLookAndFeel.getControlHighlight());
476: g.drawRect(x + 1, y + 1, w - 2, h - 2);
477: g.setColor(MetalLookAndFeel.getControl());
478: g.drawLine(x + 1, y + h - 2, x + 1, y + h - 2);
479: g.drawLine(x + w - 2, y + 1, x + w - 2, y + 1);
480: g.setColor(savedColor);
481: }
482:
483: }
484:
485:
491: public static class PaletteBorder extends AbstractBorder
492: implements UIResource
493: {
494: private static final Insets borderInsets = new Insets(1, 1, 1, 1);
495:
496:
499: public PaletteBorder()
500: {
501:
502: }
503:
504:
511: public Insets getBorderInsets(Component c)
512: {
513: return borderInsets;
514: }
515:
516:
526: public Insets getBorderInsets(Component c, Insets newInsets)
527: {
528: newInsets.top = borderInsets.top;
529: newInsets.left = borderInsets.left;
530: newInsets.bottom = borderInsets.bottom;
531: newInsets.right = borderInsets.right;
532: return newInsets;
533: }
534:
535:
545: public void paintBorder(Component c, Graphics g, int x, int y, int w,
546: int h)
547: {
548: Color savedColor = g.getColor();
549:
550:
551: g.setColor(MetalLookAndFeel.getPrimaryControlDarkShadow());
552: g.drawRect(x, y, w - 1, h - 1);
553:
554:
555: g.setColor(MetalLookAndFeel.getControl());
556: g.fillRect(x, y, 1, 1);
557: g.fillRect(x + w - 1, y, 1, 1);
558: g.fillRect(x + w - 1, y + h - 1, 1, 1);
559: g.fillRect(x, y + h - 1, 1, 1);
560: g.setColor(savedColor);
561: }
562:
563: }
564:
565:
568: public static class TextFieldBorder extends Flush3DBorder
569: implements UIResource
570: {
571:
574: public TextFieldBorder()
575: {
576:
577: }
578:
579:
589: public void paintBorder(Component c, Graphics g, int x, int y, int w,
590: int h)
591: {
592: boolean enabledTextBorder;
593: if (c instanceof JTextComponent)
594: {
595: JTextComponent tc = (JTextComponent) c;
596: enabledTextBorder = tc.isEnabled() && tc.isEditable();
597: }
598: else
599: enabledTextBorder = false;
600:
601: if (enabledTextBorder)
602: super.paintBorder(c, g, x, y, w, h);
603: else
604: {
605: Color savedColor = g.getColor();
606: g.setColor(MetalLookAndFeel.getControlShadow());
607: g.drawRect(x, y, w - 1, h - 1);
608: g.setColor(savedColor);
609: }
610: }
611:
612: }
613:
614:
617: public static class InternalFrameBorder extends AbstractBorder
618: implements UIResource
619: {
620: private static final Insets borderInsets = new Insets(5, 5, 5, 5);
621:
622:
625: public InternalFrameBorder()
626: {
627:
628: }
629:
630:
637: public Insets getBorderInsets(Component c)
638: {
639: return borderInsets;
640: }
641:
642:
652: public Insets getBorderInsets(Component c, Insets newInsets)
653: {
654: newInsets.top = borderInsets.top;
655: newInsets.left = borderInsets.left;
656: newInsets.bottom = borderInsets.bottom;
657: newInsets.right = borderInsets.right;
658: return newInsets;
659: }
660:
661:
671: public void paintBorder(Component c, Graphics g, int x, int y, int w,
672: int h)
673: {
674:
675: JInternalFrame f = (JInternalFrame) c;
676: if (f.isSelected())
677: g.setColor(MetalLookAndFeel.getPrimaryControlDarkShadow());
678: else
679: g.setColor(MetalLookAndFeel.getControlDarkShadow());
680:
681:
682: g.fillRect(x, y, w, 5);
683: g.fillRect(x, y, 5, h);
684: g.fillRect(x + w - 5, y, 5, h);
685: g.fillRect(x, y + h - 5, w, 5);
686:
687:
688: g.setColor(MetalLookAndFeel.getControl());
689: g.fillRect(x, y, 1, 1);
690: g.fillRect(x + w - 1, y, 1, 1);
691: g.fillRect(x + w - 1, y + h - 1, 1, 1);
692: g.fillRect(x, y + h - 1, 1, 1);
693:
694:
695: g.setColor(MetalLookAndFeel.getBlack());
696: g.drawLine(x + 14, y + 2, x + w - 15, y + 2);
697: g.drawLine(x + 14, y + h - 3, x + w - 15, y + h - 3);
698: g.drawLine(x + 2, y + 14, x + 2, y + h - 15);
699: g.drawLine(x + w - 3, y + 14, x + w - 3, y + h - 15);
700:
701:
702: if (f.isSelected())
703: g.setColor(MetalLookAndFeel.getPrimaryControlShadow());
704: else
705: g.setColor(MetalLookAndFeel.getControlShadow());
706: g.drawLine(x + 15, y + 3, x + w - 14, y + 3);
707: g.drawLine(x + 15, y + h - 2, x + w - 14, y + h - 2);
708: g.drawLine(x + 3, y + 15, x + 3, y + h - 14);
709: g.drawLine(x + w - 2, y + 15, x + w - 2, y + h - 14);
710: }
711:
712: }
713:
714:
718: public static class OptionDialogBorder extends AbstractBorder
719: implements UIResource
720: {
721:
722:
725: public OptionDialogBorder()
726: {
727:
728: }
729:
730:
737: public Insets getBorderInsets(Component c)
738: {
739: return getBorderInsets(c, null);
740: }
741:
742:
748: public Insets getBorderInsets(Component c, Insets newInsets)
749: {
750: if (newInsets == null)
751: newInsets = new Insets(3, 3, 3, 3);
752: else
753: {
754: newInsets.top = 3;
755: newInsets.left = 3;
756: newInsets.bottom = 3;
757: newInsets.right = 3;
758: }
759: return newInsets;
760: }
761:
762:
772: public void paintBorder(Component c, Graphics g, int x, int y, int w,
773: int h)
774: {
775:
776: JInternalFrame f = (JInternalFrame)