851 mnemIndex, textRect.x - 1, textRect.y + 852 fm.getAscent() - 1); 853 } 854 } else { 855 // *** paint the text normally 856 if (model.isArmed()|| (menuItem instanceof JMenu && model.isSelected())) { 857 g.setColor(selectionForeground); // Uses protected field. 858 } 859 SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, 860 mnemIndex, textRect.x, textRect.y + fm.getAscent()); 861 } 862 } 863 864 /** 865 * Returns a menu element path. 866 * 867 * @return a menu element path 868 */ 869 public MenuElement[] getPath() { 870 MenuSelectionManager m = MenuSelectionManager.defaultManager(); 871 MenuElement oldPath[] = m.getSelectedPath(); 872 MenuElement newPath[]; 873 int i = oldPath.length; 874 if (i == 0) 875 return new MenuElement[0]; 876 Component parent = menuItem.getParent(); 877 if (oldPath[i-1].getComponent() == parent) { 878 // The parent popup menu is the last so far 879 newPath = new MenuElement[i+1]; 880 System.arraycopy(oldPath, 0, newPath, 0, i); 881 newPath[i] = menuItem; 882 } else { 883 // A sibling menuitem is the current selection 884 // 885 // This probably needs to handle 'exit submenu into 886 // a menu item. Search backwards along the current 887 // selection until you find the parent popup menu, 888 // then copy up to that and add yourself... 889 int j; 890 for (j = oldPath.length-1; j >= 0; j--) { 891 if (oldPath[j].getComponent() == parent) 892 break; 893 } 894 newPath = new MenuElement[j+2]; 895 System.arraycopy(oldPath, 0, newPath, 0, j+1); 896 newPath[j+1] = menuItem; 897 /* 898 System.out.println("Sibling condition -- "); 899 System.out.println("Old array : "); 900 printMenuElementArray(oldPath, false); 901 System.out.println("New array : "); 902 printMenuElementArray(newPath, false); 903 */ 904 } 905 return newPath; 906 } 907 908 void printMenuElementArray(MenuElement path[], boolean dumpStack) { 909 System.out.println("Path is("); 910 int i, j; 911 for(i=0,j=path.length; i<j ;i++){ 912 for (int k=0; k<=i; k++) 913 System.out.print(" "); 914 MenuElement me = path[i]; 915 if(me instanceof JMenuItem) 916 System.out.println(((JMenuItem)me).getText() + ", "); 917 else if (me == null) 918 System.out.println("NULL , "); 919 else 920 System.out.println("" + me + ", "); 921 } 922 System.out.println(")"); 923 924 if (dumpStack == true) 925 Thread.dumpStack(); 926 } 927 /** Mouse input handler */ 928 protected class MouseInputHandler implements MouseInputListener { 1072 int modifiers = e.getModifiers(); 1073 // 4188027: drag enter/exit added in JDK 1.1.7A, JDK1.2 1074 if ((modifiers & (InputEvent.BUTTON1_MASK | 1075 InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK)) !=0 ) { 1076 MenuSelectionManager.defaultManager().processMouseEvent(e); 1077 } else { 1078 manager.setSelectedPath(getPath()); 1079 } 1080 } 1081 @SuppressWarnings("deprecation") 1082 public void mouseExited(MouseEvent e) { 1083 MenuSelectionManager manager = MenuSelectionManager.defaultManager(); 1084 1085 int modifiers = e.getModifiers(); 1086 // 4188027: drag enter/exit added in JDK 1.1.7A, JDK1.2 1087 if ((modifiers & (InputEvent.BUTTON1_MASK | 1088 InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK)) !=0 ) { 1089 MenuSelectionManager.defaultManager().processMouseEvent(e); 1090 } else { 1091 1092 MenuElement path[] = manager.getSelectedPath(); 1093 if (path.length > 1 && path[path.length-1] == menuItem) { 1094 MenuElement newPath[] = new MenuElement[path.length-1]; 1095 int i,c; 1096 for(i=0,c=path.length-1;i<c;i++) 1097 newPath[i] = path[i]; 1098 manager.setSelectedPath(newPath); 1099 } 1100 } 1101 } 1102 1103 public void mouseDragged(MouseEvent e) { 1104 MenuSelectionManager.defaultManager().processMouseEvent(e); 1105 } 1106 public void mouseMoved(MouseEvent e) { 1107 } 1108 1109 // 1110 // MenuDragListener 1111 // 1112 public void menuDragMouseEntered(MenuDragMouseEvent e) { 1113 MenuSelectionManager manager = e.getMenuSelectionManager(); 1114 MenuElement path[] = e.getPath(); 1115 manager.setSelectedPath(path); 1116 } 1117 public void menuDragMouseDragged(MenuDragMouseEvent e) { 1118 MenuSelectionManager manager = e.getMenuSelectionManager(); 1119 MenuElement path[] = e.getPath(); 1120 manager.setSelectedPath(path); 1121 } 1122 public void menuDragMouseExited(MenuDragMouseEvent e) {} 1123 public void menuDragMouseReleased(MenuDragMouseEvent e) { 1124 if (!menuItem.isEnabled()) { 1125 return; 1126 } 1127 MenuSelectionManager manager = e.getMenuSelectionManager(); 1128 MenuElement path[] = e.getPath(); 1129 Point p = e.getPoint(); 1130 if (p.x >= 0 && p.x < menuItem.getWidth() && 1131 p.y >= 0 && p.y < menuItem.getHeight()) { 1132 doClick(manager); 1133 } else { 1134 manager.clearSelectedPath(); 1135 } 1136 } 1137 1138 1139 // 1140 // PropertyChangeListener 1141 // 1142 public void propertyChange(PropertyChangeEvent e) { 1143 String name = e.getPropertyName(); 1144 1145 if (name == "labelFor" || name == "displayedMnemonic" || 1146 name == "accelerator") { 1147 updateAcceleratorBinding(); 1148 } else if (name == "text" || "font" == name || "foreground" == name | 851 mnemIndex, textRect.x - 1, textRect.y + 852 fm.getAscent() - 1); 853 } 854 } else { 855 // *** paint the text normally 856 if (model.isArmed()|| (menuItem instanceof JMenu && model.isSelected())) { 857 g.setColor(selectionForeground); // Uses protected field. 858 } 859 SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, 860 mnemIndex, textRect.x, textRect.y + fm.getAscent()); 861 } 862 } 863 864 /** 865 * Returns a menu element path. 866 * 867 * @return a menu element path 868 */ 869 public MenuElement[] getPath() { 870 MenuSelectionManager m = MenuSelectionManager.defaultManager(); 871 MenuElement[] oldPath = m.getSelectedPath(); 872 MenuElement[] newPath; 873 int i = oldPath.length; 874 if (i == 0) 875 return new MenuElement[0]; 876 Component parent = menuItem.getParent(); 877 if (oldPath[i-1].getComponent() == parent) { 878 // The parent popup menu is the last so far 879 newPath = new MenuElement[i+1]; 880 System.arraycopy(oldPath, 0, newPath, 0, i); 881 newPath[i] = menuItem; 882 } else { 883 // A sibling menuitem is the current selection 884 // 885 // This probably needs to handle 'exit submenu into 886 // a menu item. Search backwards along the current 887 // selection until you find the parent popup menu, 888 // then copy up to that and add yourself... 889 int j; 890 for (j = oldPath.length-1; j >= 0; j--) { 891 if (oldPath[j].getComponent() == parent) 892 break; 893 } 894 newPath = new MenuElement[j+2]; 895 System.arraycopy(oldPath, 0, newPath, 0, j+1); 896 newPath[j+1] = menuItem; 897 /* 898 System.out.println("Sibling condition -- "); 899 System.out.println("Old array : "); 900 printMenuElementArray(oldPath, false); 901 System.out.println("New array : "); 902 printMenuElementArray(newPath, false); 903 */ 904 } 905 return newPath; 906 } 907 908 void printMenuElementArray(MenuElement[] path, boolean dumpStack) { 909 System.out.println("Path is("); 910 int i, j; 911 for(i=0,j=path.length; i<j ;i++){ 912 for (int k=0; k<=i; k++) 913 System.out.print(" "); 914 MenuElement me = path[i]; 915 if(me instanceof JMenuItem) 916 System.out.println(((JMenuItem)me).getText() + ", "); 917 else if (me == null) 918 System.out.println("NULL , "); 919 else 920 System.out.println("" + me + ", "); 921 } 922 System.out.println(")"); 923 924 if (dumpStack == true) 925 Thread.dumpStack(); 926 } 927 /** Mouse input handler */ 928 protected class MouseInputHandler implements MouseInputListener { 1072 int modifiers = e.getModifiers(); 1073 // 4188027: drag enter/exit added in JDK 1.1.7A, JDK1.2 1074 if ((modifiers & (InputEvent.BUTTON1_MASK | 1075 InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK)) !=0 ) { 1076 MenuSelectionManager.defaultManager().processMouseEvent(e); 1077 } else { 1078 manager.setSelectedPath(getPath()); 1079 } 1080 } 1081 @SuppressWarnings("deprecation") 1082 public void mouseExited(MouseEvent e) { 1083 MenuSelectionManager manager = MenuSelectionManager.defaultManager(); 1084 1085 int modifiers = e.getModifiers(); 1086 // 4188027: drag enter/exit added in JDK 1.1.7A, JDK1.2 1087 if ((modifiers & (InputEvent.BUTTON1_MASK | 1088 InputEvent.BUTTON2_MASK | InputEvent.BUTTON3_MASK)) !=0 ) { 1089 MenuSelectionManager.defaultManager().processMouseEvent(e); 1090 } else { 1091 1092 MenuElement[] path = manager.getSelectedPath(); 1093 if (path.length > 1 && path[path.length-1] == menuItem) { 1094 MenuElement[] newPath = new MenuElement[path.length-1]; 1095 int i,c; 1096 for(i=0,c=path.length-1;i<c;i++) 1097 newPath[i] = path[i]; 1098 manager.setSelectedPath(newPath); 1099 } 1100 } 1101 } 1102 1103 public void mouseDragged(MouseEvent e) { 1104 MenuSelectionManager.defaultManager().processMouseEvent(e); 1105 } 1106 public void mouseMoved(MouseEvent e) { 1107 } 1108 1109 // 1110 // MenuDragListener 1111 // 1112 public void menuDragMouseEntered(MenuDragMouseEvent e) { 1113 MenuSelectionManager manager = e.getMenuSelectionManager(); 1114 MenuElement[] path = e.getPath(); 1115 manager.setSelectedPath(path); 1116 } 1117 public void menuDragMouseDragged(MenuDragMouseEvent e) { 1118 MenuSelectionManager manager = e.getMenuSelectionManager(); 1119 MenuElement[] path = e.getPath(); 1120 manager.setSelectedPath(path); 1121 } 1122 public void menuDragMouseExited(MenuDragMouseEvent e) {} 1123 public void menuDragMouseReleased(MenuDragMouseEvent e) { 1124 if (!menuItem.isEnabled()) { 1125 return; 1126 } 1127 MenuSelectionManager manager = e.getMenuSelectionManager(); 1128 MenuElement[] path = e.getPath(); 1129 Point p = e.getPoint(); 1130 if (p.x >= 0 && p.x < menuItem.getWidth() && 1131 p.y >= 0 && p.y < menuItem.getHeight()) { 1132 doClick(manager); 1133 } else { 1134 manager.clearSelectedPath(); 1135 } 1136 } 1137 1138 1139 // 1140 // PropertyChangeListener 1141 // 1142 public void propertyChange(PropertyChangeEvent e) { 1143 String name = e.getPropertyName(); 1144 1145 if (name == "labelFor" || name == "displayedMnemonic" || 1146 name == "accelerator") { 1147 updateAcceleratorBinding(); 1148 } else if (name == "text" || "font" == name || "foreground" == name |