1. /*
  2. * @(#)MotifMenuUI.java 1.30 03/01/23
  3. *
  4. * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
  5. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  6. */
  7. package com.sun.java.swing.plaf.motif;
  8. import java.awt.*;
  9. import java.awt.event.*;
  10. import javax.swing.*;
  11. import javax.swing.event.*;
  12. import javax.swing.plaf.*;
  13. import javax.swing.border.*;
  14. import javax.swing.plaf.basic.*;
  15. import javax.swing.plaf.basic.BasicMenuUI;
  16. import javax.swing.plaf.basic.BasicGraphicsUtils;
  17. /**
  18. * A Motif L&F implementation of MenuUI.
  19. * <p>
  20. *
  21. * @version 1.30 01/23/03
  22. * @author Georges Saab
  23. * @author Rich Schiavi
  24. */
  25. public class MotifMenuUI extends BasicMenuUI
  26. {
  27. public static ComponentUI createUI( JComponent x ) {
  28. return new MotifMenuUI();
  29. }
  30. // These should not be necessary because BasicMenuUI does this,
  31. // and this class overrides createChangeListener.
  32. // protected void installListeners() {
  33. // super.installListeners();
  34. // changeListener = createChangeListener(menuItem);
  35. // menuItem.addChangeListener(changeListener);
  36. // }
  37. //
  38. // protected void uninstallListeners() {
  39. // super.uninstallListeners();
  40. // menuItem.removeChangeListener(changeListener);
  41. // }
  42. protected ChangeListener createChangeListener(JComponent c) {
  43. return new MotifChangeHandler((JMenu)c, this);
  44. }
  45. public void paint(Graphics g, JComponent c){
  46. MotifGraphicsUtils.paintMenuItem(g,c,checkIcon,arrowIcon,
  47. selectionBackground, selectionForeground,
  48. defaultTextIconGap);
  49. }
  50. private boolean popupIsOpen(JMenu m,MenuElement me[]) {
  51. int i;
  52. JPopupMenu pm = m.getPopupMenu();
  53. for(i=me.length-1;i>=0;i--) {
  54. if(me[i].getComponent() == pm)
  55. return true;
  56. }
  57. return false;
  58. }
  59. protected MouseInputListener createMouseInputListener(JComponent c) {
  60. return new MouseInputHandler();
  61. }
  62. public class MotifChangeHandler extends ChangeHandler {
  63. public MotifChangeHandler(JMenu m, MotifMenuUI ui) {
  64. super(m, ui);
  65. }
  66. public void stateChanged(ChangeEvent e) {
  67. JMenuItem c = (JMenuItem)e.getSource();
  68. if (c.isArmed() || c.isSelected()) {
  69. c.setBorderPainted(true);
  70. // c.repaint();
  71. } else {
  72. c.setBorderPainted(false);
  73. }
  74. super.stateChanged(e);
  75. }
  76. }
  77. protected class MouseInputHandler implements MouseInputListener {
  78. public void mouseClicked(MouseEvent e) {}
  79. public void mousePressed(MouseEvent e) {
  80. MenuSelectionManager manager = MenuSelectionManager.defaultManager();
  81. JMenu menu = (JMenu)e.getComponent();
  82. if(menu.isEnabled()) {
  83. if(menu.isTopLevelMenu()) {
  84. if(menu.isSelected()) {
  85. manager.clearSelectedPath();
  86. } else {
  87. Container cnt = menu.getParent();
  88. if(cnt != null && cnt instanceof JMenuBar) {
  89. MenuElement me[] = new MenuElement[2];
  90. me[0]=(MenuElement)cnt;
  91. me[1]=menu;
  92. manager.setSelectedPath(me);
  93. }
  94. }
  95. }
  96. MenuElement path[] = getPath();
  97. if (path.length > 0) {
  98. MenuElement newPath[] = new MenuElement[path.length+1];
  99. System.arraycopy(path,0,newPath,0,path.length);
  100. newPath[path.length] = menu.getPopupMenu();
  101. manager.setSelectedPath(newPath);
  102. }
  103. }
  104. }
  105. public void mouseReleased(MouseEvent e) {
  106. MenuSelectionManager manager =
  107. MenuSelectionManager.defaultManager();
  108. JMenuItem menuItem = (JMenuItem)e.getComponent();
  109. Point p = e.getPoint();
  110. if(!(p.x >= 0 && p.x < menuItem.getWidth() &&
  111. p.y >= 0 && p.y < menuItem.getHeight())) {
  112. manager.processMouseEvent(e);
  113. }
  114. }
  115. public void mouseEntered(MouseEvent e) {}
  116. public void mouseExited(MouseEvent e) {}
  117. public void mouseDragged(MouseEvent e) {
  118. MenuSelectionManager.defaultManager().processMouseEvent(e);
  119. }
  120. public void mouseMoved(MouseEvent e) { }
  121. }
  122. }