216
216
public boolean isComponentPartOfCurrentMenu(Component c)
218
218
MenuElement[] subElements;
219
for (int i = 0; i < selectedPath.size(); i++)
220
for (int i = 0; i < selectedPath.size(); i++)
221
subElements = ((MenuElement) selectedPath.get(i)).getSubElements();
222
for (int j = 0; j < subElements.length; j++)
224
MenuElement me = subElements[j];
225
if (me != null && (me.getComponent()).equals(c))
222
// Check first element.
223
MenuElement first = (MenuElement) selectedPath.get(i);
224
if (SwingUtilities.isDescendingFrom(c, first.getComponent()))
231
// Check sub elements.
232
subElements = first.getSubElements();
233
for (int j = 0; j < subElements.length; j++)
235
MenuElement me = subElements[j];
237
&& (SwingUtilities.isDescendingFrom(c, me.getComponent())))
250
* Processes key events on behalf of the MenuElements. MenuElement
251
* instances should always forward their key events to this method and
252
* get their {@link MenuElement#processKeyEvent(KeyEvent, MenuElement[],
253
* MenuSelectionManager)} eventually called back.
236
* @param e DOCUMENT ME!
255
* @param e the key event
238
257
public void processKeyEvent(KeyEvent e)
240
throw new UnsupportedOperationException("not implemented");
259
MenuElement[] selection = (MenuElement[])
260
selectedPath.toArray(new MenuElement[selectedPath.size()]);
262
for (int index = selection.length - 1; index >= 0; index--)
264
MenuElement el = selection[index];
265
// This method's main purpose is to forward key events to the
266
// relevant menu items, so that they can act in response to their
267
// mnemonics beeing typed. So we also need to forward the key event
268
// to all the subelements of the currently selected menu elements
270
MenuElement[] subEls = el.getSubElements();
272
for (int subIndex = 0; subIndex < subEls.length; subIndex++)
274
MenuElement sub = subEls[subIndex];
275
// Skip elements that are not showing or not enabled.
276
if (sub == null || ! sub.getComponent().isShowing()
277
|| ! sub.getComponent().isEnabled())
284
path = new MenuElement[index + 2];
285
System.arraycopy(selection, 0, path, 0, index + 1);
287
path[index + 1] = sub;
288
sub.processKeyEvent(e, path, this);
296
// Dispatch to first element in selection if it hasn't been consumed.
297
if (! e.isConsumed())
299
path = new MenuElement[1];
300
path[0] = selection[0];
301
path[0].processKeyEvent(e, path, this);
307
int minSize = path.length; // size of the smaller path.
309
if (path.length > selectedPath.size())
311
minSize = selectedPath.size();
313
// if new selected path contains more elements then current
314
// selection then first add all elements at
315
// the indexes > selectedPath.size
316
for (i = selectedPath.size(); i < path.length; i++)
318
selectedPath.add(path[i]);
319
path[i].menuSelectionChanged(true);
323
else if (path.length < selectedPath.size())
325
// if new selected path contains less elements then current
326
// selection then first remove all elements from the selection
327
// at the indexes > path.length
328
for (i = selectedPath.size() - 1; i >= path.length; i--)
330
((MenuElement) selectedPath.get(i)).menuSelectionChanged(false);
331
selectedPath.remove(i);
334
minSize = path.length;
337
// Now compare elements in new and current selection path at the
338
// same location and adjust selection until
339
// same menu elements will be encountered at the
340
// same index in both current and new selection path.
341
MenuElement oldSelectedItem;
343
for (i = minSize - 1; i >= 0; i--)
345
oldSelectedItem = (MenuElement) selectedPath.get(i);
347
if (path[i].equals(oldSelectedItem))
350
oldSelectedItem.menuSelectionChanged(false);
351
path[i].menuSelectionChanged(true);
352
selectedPath.setElementAt(path[i], i);
368
int minSize = path.length; // size of the smaller path.
369
int currentSize = selectedPath.size();
372
// Search first item that is different in the current and new path.
373
for (int i = 0; i < minSize; i++)
375
if (i < currentSize && (MenuElement) selectedPath.get(i) == path[i])
381
// Remove items from selection and send notification.
382
for (int i = currentSize - 1; i >= firstDiff; i--)
384
MenuElement el = (MenuElement) selectedPath.get(i);
385
selectedPath.remove(i);
386
el.menuSelectionChanged(false);
389
// Add new items to selection and send notification.
390
for (int i = firstDiff; i < minSize; i++)
394
selectedPath.add(path[i]);
395
path[i].menuSelectionChanged(true);
355
399
fireStateChanged();