1 package fr.ove.openmath.mfd2;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import java.awt.*;
21 import java.awt.event.*;
22
23 public class MenuPanel extends Panel implements MouseListener, MouseMotionListener
24 {
25 PopupMenu popList[];
26 Label lblList[];
27
28 int idxHighlight;
29 int idxPressed;
30 boolean bMenuUp;
31
32
33
34
35 public MenuPanel() {
36 setLayout(new FlowLayout(FlowLayout.LEFT, 4, 3));
37
38
39 addMouseMotionListener(this);
40 addMouseListener(this);
41 idxHighlight = -1;
42 idxPressed = -1;
43 bMenuUp = false;
44
45 lblList = new Label[1];
46 lblList[0] = new Label("Testing...", Label.CENTER);
47 lblList[0].addMouseMotionListener(this);
48 lblList[0].addMouseListener(this);
49
50 add(lblList[0]);
51
52 validate();
53 }
54
55
56
57 public void setMenuBar(MenuBar mBar) {
58
59 clearMouseListeners();
60 int menuCount = mBar.getMenuCount();
61 lblList = new Label[menuCount];
62 popList = new PopupMenu[menuCount];
63
64
65 for (int i = 0; i < menuCount; i++) {
66 Menu m = mBar.getMenu(i);
67 String szName = m.getLabel();
68 int itemCount = m.getItemCount();
69
70
71 lblList[i] = new Label(szName, Label.CENTER);
72 lblList[i].addMouseMotionListener(this);
73 lblList[i].addMouseListener(this);
74 Font fnt = lblList[i].getFont();
75 add(lblList[i]);
76
77
78 popList[i] = new PopupMenu(szName);
79 for (int j = 0; j < itemCount; j++) {
80 MenuItem mi = m.getItem(0);
81 mi.setFont(fnt);
82 popList[i].add(mi);
83 }
84 lblList[i].add(popList[i]);
85 }
86 }
87
88
89
90 public void paint(Graphics g) {
91
92 Rectangle rect = getBounds();
93
94
95 g.setColor(getBackground());
96 g.fillRect(0, 0, rect.width, rect.height);
97
98
99
100
101
102
103
104
105
106 for (int i = 0; i < lblList.length; i++) {
107 rect = lblList[i].getBounds();
108 if (i == idxHighlight)
109 g.draw3DRect(rect.x-1,rect.y-1, rect.width+2,rect.height+2, true);
110 if (i == idxPressed) {
111 g.draw3DRect(rect.x-1,rect.y-1, rect.width+2,rect.height+2, false);
112 if (bMenuUp == false) {
113 bMenuUp = true;
114 popList[i].show(this, rect.x, rect.y+rect.height+1);
115 }
116 }
117 }
118 }
119
120
121
122 protected void clearMouseListeners() {
123 for (int i = 0; i < lblList.length; i++) {
124 remove(lblList[i]);
125 lblList[i].removeMouseListener(this);
126 lblList[i].removeMouseMotionListener(this);
127 }
128 }
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 static Menu makeMenu(Object parent, Object[] items, Object target) {
144 Menu m = null;
145
146 if (parent instanceof Menu)
147 m = (Menu)parent;
148 else if (parent instanceof String)
149 m = new Menu((String)parent);
150 else
151 return null;
152
153 for (int i = 0; i < items.length; i++) {
154 if (items[i] instanceof String) {
155 MenuItem mi = new MenuItem((String)items[i]);
156 if (target instanceof ActionListener)
157 mi.addActionListener((ActionListener)target);
158 m.add(mi);
159 }
160 else if (items[i] instanceof CheckboxMenuItem &&
161 target instanceof ItemListener) {
162 CheckboxMenuItem cmi = (CheckboxMenuItem)items[i];
163 cmi.addItemListener((ItemListener)target);
164 m.add(cmi);
165 }
166 else if (items[i] instanceof MenuItem) {
167 MenuItem mi = (MenuItem)items[i];
168 if (target instanceof ActionListener)
169 mi.addActionListener((ActionListener)target);
170 m.add(mi);
171 }
172 else if (items[i] == null)
173 m.addSeparator();
174 }
175 return m;
176 }
177
178
179
180
181 public void mousePressed(MouseEvent evt) {
182 int oldIdx = idxPressed;
183
184 if (idxPressed >= 0) {
185 idxHighlight = idxPressed;
186 idxPressed = -1;
187 repaint();
188 return;
189 }
190
191
192 idxPressed = -1;
193 if (evt.getSource() instanceof Label) {
194 Label lbl = (Label)evt.getSource();
195 for (int i = 0; i < lblList.length; i++) {
196 if (lblList[i] == lbl) {
197 idxPressed = i;
198 idxHighlight = -1;
199 bMenuUp = false;
200 }
201 }
202 }
203
204
205
206 if (idxPressed != oldIdx)
207 repaint();
208 }
209
210
211 public void mouseExited(MouseEvent evt) {
212 idxHighlight = -1;
213 idxPressed = -1;
214 repaint();
215 }
216
217
218 public void mouseReleased(MouseEvent evt) {
219 if (evt.getSource() instanceof Label)
220 mouseClicked(evt);
221 }
222
223
224 public void mouseMoved(MouseEvent evt) {
225 int oldIdx = idxHighlight;
226
227
228 idxHighlight = -1;
229 if (evt.getSource() instanceof Label) {
230 Label lbl = (Label)evt.getSource();
231 for (int i = 0; i < lblList.length; i++) {
232 if (lblList[i] == lbl && i != idxPressed) {
233 idxHighlight = i;
234 if (idxPressed >= 0)
235 idxPressed = i;
236 }
237 }
238 }
239
240
241
242 if (idxHighlight != oldIdx) repaint();
243 }
244
245
246 public void mouseDragged(MouseEvent evt) {
247 mouseMoved(evt);
248 }
249
250
251
252 public void mouseClicked(MouseEvent evt) { }
253 public void mouseEntered(MouseEvent evt) { }
254 }