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