1:
37:
38:
39: package ;
40:
41: import ;
42: import ;
43: import ;
44: import ;
45: import ;
46: import ;
47: import ;
48: import ;
49: import ;
50: import ;
51: import ;
52: import ;
53: import ;
54: import ;
55: import ;
56:
57: import ;
58: import ;
59: import ;
60: import ;
61: import ;
62: import ;
63: import ;
64: import ;
65: import ;
66: import ;
67: import ;
68: import ;
69: import ;
70:
71:
74: public class BasicInternalFrameTitlePane extends JComponent
75: {
76:
83: public class CloseAction extends AbstractAction
84: {
85:
88: public CloseAction()
89: {
90: super("Close");
91: }
92:
93:
98: public void actionPerformed(ActionEvent e)
99: {
100: if (frame.isClosable())
101: {
102: try
103: {
104: frame.setClosed(true);
105: }
106: catch (PropertyVetoException pve)
107: {
108:
109: }
110: }
111: }
112: }
113:
114:
121: public class IconifyAction extends AbstractAction
122: {
123:
126: public IconifyAction()
127: {
128: super("Minimize");
129: }
130:
131:
137: public void actionPerformed(ActionEvent e)
138: {
139: if (frame.isIconifiable() && ! frame.isIcon())
140: {
141: try
142: {
143: frame.setIcon(true);
144: }
145: catch (PropertyVetoException pve)
146: {
147:
148: }
149: }
150: }
151: }
152:
153:
160: public class MaximizeAction extends AbstractAction
161: {
162:
165: public MaximizeAction()
166: {
167: super("Maximize");
168: }
169:
175: public void actionPerformed(ActionEvent e)
176: {
177: try
178: {
179: if (frame.isMaximizable() && ! frame.isMaximum())
180: frame.setMaximum(true);
181: else if (frame.isMaximum())
182: frame.setMaximum(false);
183: }
184: catch (PropertyVetoException pve)
185: {
186:
187: }
188: }
189: }
190:
191:
198: public class MoveAction extends AbstractAction
199: {
200:
203: public MoveAction()
204: {
205: super("Move");
206: }
207:
212: public void actionPerformed(ActionEvent e)
213: {
214:
215: }
216: }
217:
218:
226: public class RestoreAction extends AbstractAction
227: {
228:
231: public RestoreAction()
232: {
233: super("Restore");
234: }
235:
241: public void actionPerformed(ActionEvent e)
242: {
243: if (frame.isMaximum())
244: {
245: try
246: {
247: frame.setMaximum(false);
248: }
249: catch (PropertyVetoException pve)
250: {
251:
252: }
253: }
254: }
255: }
256:
257:
264: public class SizeAction extends AbstractAction
265: {
266:
269: public SizeAction()
270: {
271: super("Size");
272: }
273:
278: public void actionPerformed(ActionEvent e)
279: {
280:
281: }
282: }
283:
284:
292: public class PropertyChangeHandler implements PropertyChangeListener
293: {
294:
300: public void propertyChange(PropertyChangeEvent evt)
301: {
302: String propName = evt.getPropertyName();
303: if (propName.equals("closable"))
304: {
305: if (evt.getNewValue().equals(Boolean.TRUE))
306: closeButton.setVisible(true);
307: else
308: closeButton.setVisible(false);
309: }
310: else if (propName.equals("iconable"))
311: {
312: if (evt.getNewValue().equals(Boolean.TRUE))
313: iconButton.setVisible(true);
314: else
315: iconButton.setVisible(false);
316: }
317: else if (propName.equals("maximizable"))
318: {
319: if (evt.getNewValue().equals(Boolean.TRUE))
320: maxButton.setVisible(true);
321: else
322: maxButton.setVisible(false);
323: }
324: enableActions();
325: }
326: }
327:
328:
336: public class SystemMenuBar extends JMenuBar
337: {
338:
343: public boolean isFocusTraversable()
344: {
345: return true;
346: }
347:
348:
354: public boolean isOpaque()
355: {
356: return true;
357: }
358:
359:
364: public void paint(Graphics g)
365: {
366: Icon frameIcon = frame.getFrameIcon();
367: if (frameIcon == null)
368: frameIcon = BasicDesktopIconUI.defaultIcon;
369: frameIcon.paintIcon(this, g, 0, 0);
370: }
371:
372:
375: public void requestFocus()
376: {
377: super.requestFocus();
378: }
379: }
380:
381:
388: public class TitlePaneLayout implements LayoutManager
389: {
390:
393: public TitlePaneLayout()
394: {
395:
396: }
397:
398:
404: public void addLayoutComponent(String name, Component c)
405: {
406:
407: }
408:
409:
414: public void layoutContainer(Container c)
415: {
416: Dimension size = c.getSize();
417: Insets insets = c.getInsets();
418: int width = size.width - insets.left - insets.right;
419: int height = size.height - insets.top - insets.bottom;
420:
421:
422: Dimension menupref = menuBar.getPreferredSize();
423: menuBar.setBounds(insets.left, insets.top, menupref.width, height);
424:
425: int loc = width + insets.left - 1;
426: int top = insets.top + 1;
427: int buttonHeight = height - 4;
428: if (closeButton.isVisible())
429: {
430: int buttonWidth = closeIcon.getIconWidth();
431: loc -= buttonWidth + 2;
432: closeButton.setBounds(loc, top, buttonWidth, buttonHeight);
433: }
434:
435: if (maxButton.isVisible())
436: {
437: int buttonWidth = maxIcon.getIconWidth();
438: loc -= buttonWidth + 2;
439: maxButton.setBounds(loc, top, buttonWidth, buttonHeight);
440: }
441:
442: if (iconButton.isVisible())
443: {
444: int buttonWidth = iconIcon.getIconWidth();
445: loc -= buttonWidth + 2;
446: iconButton.setBounds(loc, top, buttonWidth, buttonHeight);
447: }
448:
449: if (title != null)
450: title.setBounds(insets.left + menupref.width, insets.top,
451: loc - menupref.width - insets.left, height);
452: }
453:
454:
462: public Dimension minimumLayoutSize(Container c)
463: {
464: return preferredLayoutSize(c);
465: }
466:
467:
475: public Dimension preferredLayoutSize(Container c)
476: {
477: return new Dimension(22, 18);
478: }
479:
480:
485: public void removeLayoutComponent(Component c)
486: {
487:
488: }
489: }
490:
491:
496: private class PaneButton extends JButton
497: {
498:
503: public PaneButton(Action a)
504: {
505: super(a);
506: setMargin(new Insets(0, 0, 0, 0));
507: }
508:
509:
514: public boolean isFocusable()
515: {
516:
517: return false;
518: }
519:
520: }
521:
522:
523: protected static final String CLOSE_CMD;
524:
525:
526: protected static final String ICONIFY_CMD;
527:
528:
529: protected static final String MAXIMIZE_CMD;
530:
531:
532: protected static final String MOVE_CMD;
533:
534:
535: protected static final String RESTORE_CMD;
536:
537:
538: protected static final String SIZE_CMD;
539:
540:
541: protected Action closeAction;
542:
543:
544: protected Action iconifyAction;
545:
546:
547: protected Action maximizeAction;
548:
549:
550: protected Action moveAction;
551:
552:
553: protected Action restoreAction;
554:
555:
556: protected Action sizeAction;
557:
558:
559: protected JButton closeButton;
560:
561:
562: protected JButton iconButton;
563:
564:
565: protected JButton maxButton;
566:
567:
568: protected Icon minIcon = BasicIconFactory.createEmptyFrameIcon();
569:
570:
571: protected Icon maxIcon = BasicIconFactory.createEmptyFrameIcon();
572:
573:
574: protected Icon iconIcon = BasicIconFactory.createEmptyFrameIcon();
575:
576:
577: protected Icon closeIcon;
578:
579:
580: protected JInternalFrame frame;
581:
582:
583: protected JMenuBar menuBar;
584:
585:
586: protected JMenu windowMenu;
587:
588:
591: protected Color notSelectedTextColor;
592:
593:
597: protected Color notSelectedTitleColor;
598:
599:
600: protected Color selectedTextColor;
601:
602:
606: protected Color selectedTitleColor;
607:
608:
609: protected PropertyChangeListener propertyChangeListener;
610:
611:
616: transient JLabel title;
617:
618: static
619: {
620:
621: CLOSE_CMD = "Close";
622: ICONIFY_CMD = "Minimize";
623: MAXIMIZE_CMD = "Maximize";
624: MOVE_CMD = "Move";
625: RESTORE_CMD = "Restore";
626: SIZE_CMD = "Size";
627: }
628:
629:
636: public BasicInternalFrameTitlePane(JInternalFrame f)
637: {
638: frame = f;
639: setLayout(createLayout());
640: title = new JLabel();
641: title.setHorizontalAlignment(SwingConstants.LEFT);
642: title.setHorizontalTextPosition(SwingConstants.LEFT);
643: title.setOpaque(false);
644: setOpaque(true);
645:
646: setBackground(Color.LIGHT_GRAY);
647: setOpaque(true);
648:
649: installTitlePane();
650: }
651:
652:
657: protected void installTitlePane()
658: {
659: installDefaults();
660: installListeners();
661: createActions();
662:
663: assembleSystemMenu();
664:
665: createButtons();
666: setButtonIcons();
667: addSubComponents();
668: enableActions();
669: }
670:
671:
674: protected void addSubComponents()
675: {
676: add(menuBar);
677:
678: add(closeButton);
679: add(iconButton);
680: add(maxButton);
681: }
682:
683:
687: protected void createActions()
688: {
689: closeAction = new CloseAction();
690: closeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, CLOSE_CMD);
691:
692: iconifyAction = new IconifyAction();
693: iconifyAction.putValue(AbstractAction.ACTION_COMMAND_KEY, ICONIFY_CMD);
694:
695: maximizeAction = new MaximizeAction();
696: maximizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MAXIMIZE_CMD);
697:
698: sizeAction = new SizeAction();
699: sizeAction.putValue(AbstractAction.ACTION_COMMAND_KEY, SIZE_CMD);
700:
701: restoreAction = new RestoreAction();
702: restoreAction.putValue(AbstractAction.ACTION_COMMAND_KEY, RESTORE_CMD);
703:
704: moveAction = new MoveAction();
705: moveAction.putValue(AbstractAction.ACTION_COMMAND_KEY, MOVE_CMD);
706: }
707:
708:
711: protected void installListeners()
712: {
713: propertyChangeListener = createPropertyChangeListener();
714: frame.addPropertyChangeListener(propertyChangeListener);
715: }
716:
717:
720: protected void uninstallListeners()
721: {
722: frame.removePropertyChangeListener(propertyChangeListener);
723: propertyChangeListener = null;
724: }
725:
726:
729: protected void installDefaults()
730: {
731: title.setFont(UIManager.getFont("InternalFrame.titleFont"));
732: selectedTextColor = UIManager.getColor("InternalFrame.activeTitleForeground");
733: selectedTitleColor = UIManager.getColor("InternalFrame.activeTitleBackground");
734: notSelectedTextColor = UIManager.getColor("InternalFrame.inactiveTitleForeground");
735: notSelectedTitleColor = UIManager.getColor("InternalFrame.inactiveTitleBackground");
736:
737: closeIcon = UIManager.getIcon("InternalFrame.closeIcon");
738: iconIcon = UIManager.getIcon("InternalFrame.iconifyIcon");
739: maxIcon = UIManager.getIcon("InternalFrame.maximizeIcon");
740: }
741:
742:
745: protected void uninstallDefaults()
746: {
747: setFont(null);
748: selectedTextColor = null;
749: selectedTitleColor = null;
750: notSelectedTextColor = null;
751: notSelectedTitleColor = null;
752:
753: closeIcon = null;
754: iconIcon = null;
755: maxIcon = null;
756: }
757:
758:
761: protected void createButtons()
762: {
763: closeButton = new PaneButton(closeAction);
764: closeButton.setText(null);
765: if (!frame.isClosable())
766: closeButton.setVisible(false);
767: iconButton = new PaneButton(iconifyAction);
768: iconButton.setText(null);
769: if (!frame.isIconifiable())
770: iconButton.setVisible(false);
771: maxButton = new PaneButton(maximizeAction);
772: maxButton.setText(null);
773: if (!frame.isMaximizable())
774: maxButton.setVisible(false);
775: }
776:
777:
780: protected void setButtonIcons()
781: {
782: if (closeIcon != null && closeButton != null)
783: closeButton.setIcon(closeIcon);
784: if (iconIcon != null && iconButton != null)
785: iconButton.setIcon(iconIcon);
786: if (maxIcon != null && maxButton != null)
787: maxButton.setIcon(maxIcon);
788: }
789:
790:
793: protected void assembleSystemMenu()
794: {
795: menuBar = createSystemMenuBar();
796: windowMenu = createSystemMenu();
797:
798: menuBar.add(windowMenu);
799:
800: addSystemMenuItems(windowMenu);
801: enableActions();
802: }
803:
804:
809: protected void addSystemMenuItems(JMenu systemMenu)
810: {
811: JMenuItem tmp;
812:
813: tmp = new JMenuItem(RESTORE_CMD);
814: tmp.addActionListener(restoreAction);
815: tmp.setMnemonic(KeyEvent.VK_R);
816: systemMenu.add(tmp);
817:
818: tmp = new JMenuItem(MOVE_CMD);
819: tmp.addActionListener(moveAction);
820: tmp.setMnemonic(KeyEvent.VK_M);
821: systemMenu.add(tmp);
822:
823: tmp = new JMenuItem(SIZE_CMD);
824: tmp.addActionListener(sizeAction);
825: tmp.setMnemonic(KeyEvent.VK_S);
826: systemMenu.add(tmp);
827:
828: tmp = new JMenuItem(ICONIFY_CMD);
829: tmp.addActionListener(iconifyAction);
830: tmp.setMnemonic(KeyEvent.VK_N);
831: systemMenu.add(tmp);
832:
833: tmp = new JMenuItem(MAXIMIZE_CMD);
834: tmp.addActionListener(maximizeAction);
835: tmp.setMnemonic(KeyEvent.VK_X);
836: systemMenu.add(tmp);
837:
838: systemMenu.addSeparator();
839:
840: tmp = new JMenuItem(CLOSE_CMD);
841: tmp.addActionListener(closeAction);
842: tmp.setMnemonic(KeyEvent.VK_C);
843: systemMenu.add(tmp);
844: }
845:
846:
851: protected JMenuBar createSystemMenuBar()
852: {
853: if (menuBar == null)
854: menuBar = new SystemMenuBar();
855: menuBar.removeAll();
856: return menuBar;
857: }
858:
859:
864: protected JMenu createSystemMenu()
865: {
866: if (windowMenu == null)
867: windowMenu = new JMenu();
868: windowMenu.removeAll();
869: return windowMenu;
870: }
871:
872:
875: protected void showSystemMenu()
876: {
877:
878: menuBar.getMenu(1).getPopupMenu().show();
879: }
880:
881:
886: public void paintComponent(Graphics g)
887: {
888: paintTitleBackground(g);
889: if (frame.getTitle() != null && title != null)
890: {
891: Color saved = g.getColor();
892: Font f = title.getFont();
893: g.setFont(f);
894: FontMetrics fm = g.getFontMetrics(f);
895: if (frame.isSelected())
896: g.setColor(selectedTextColor);
897: else
898: g.setColor(notSelectedTextColor);
899: title.setText(getTitle(frame.getTitle(), fm, title.getBounds().width));
900: SwingUtilities.paintComponent(g, title, null, title.getBounds());
901: g.setColor(saved);
902: }
903: }
904:
905:
910: protected void paintTitleBackground(Graphics g)
911: {
912: if (!isOpaque())
913: return;
914:
915: Color saved = g.getColor();
916: Dimension dims = getSize();
917:
918: Color bg = getBackground();
919: if (frame.isSelected())
920: bg = selectedTitleColor;
921: else
922: bg = notSelectedTitleColor;
923: g.setColor(bg);
924: g.fillRect(0, 0, dims.width, dims.height);
925: g.setColor(saved);
926: }
927:
928:
938: protected String getTitle(String text, FontMetrics fm, int availableWidth)
939: {
940: Rectangle vr = new Rectangle(0, 0, availableWidth, fm.getHeight());
941: Rectangle ir = new Rectangle();
942: Rectangle tr = new Rectangle();
943: String value = SwingUtilities.layoutCompoundLabel(this, fm, text, null,
944: SwingConstants.CENTER,
945: SwingConstants.LEFT,
946: SwingConstants.CENTER,
947: SwingConstants.LEFT, vr,
948: ir, tr, 0);
949: return value;
950: }
951:
952:
957: protected void postClosingEvent(JInternalFrame frame)
958: {
959:
960:
961:
962:
963:
964:
965: }
966:
967:
971: protected void enableActions()
972: {
973: closeAction.setEnabled(frame.isClosable());
974:
975: iconifyAction.setEnabled(frame.isIconifiable());
976:
977:
978: maximizeAction.setEnabled(frame.isMaximizable());
979:
980:
981:
982: restoreAction.setEnabled(frame.isMaximum());
983:
984: sizeAction.setEnabled(frame.isResizable());
985:
986:
987: moveAction.setEnabled(false);
988: }
989:
990:
995: protected PropertyChangeListener createPropertyChangeListener()
996: {
997: return new PropertyChangeHandler();
998: }
999:
1000:
1005: protected LayoutManager createLayout()
1006: {
1007: return new TitlePaneLayout();
1008: }
1009: }