001 package sale;
002
003 import java.util.*;
004
005 import javax.swing.*;
006
007 /**
008 * A MenuSheet consisting of {@link MenuSheetObject MenuSheetObjects}.
009 *
010 * <p>MenuSheets represent menus, abstracting from the form they are being displayed in. A MenuSheet could be
011 * displayed as a JMenuBar as well as a JMenu or JPopUpMenu. Independently of this it will always behave in
012 * the same way from the point of view of the applicion developer.</p>
013 *
014 * @author Steffen Zschaler
015 * @version 2.0 20/05/1999
016 * @since v1.0
017 */
018 public class MenuSheet extends MenuSheetObject {
019
020 /**
021 * ID for serialization.
022 */
023 private static final long serialVersionUID = -9113481311456989013L;
024
025 /**
026 * The JMenu peer, if any.
027 */
028 protected transient JMenu m_jmPeer = null;
029
030 /**
031 * The JMenuBar peer, if any.
032 */
033 protected transient JMenuBar m_jmbBarPeer = null;
034
035 /**
036 * The monitor used to synchronize access to the peers.
037 */
038 private transient Object m_oPeerLock;
039 /**
040 * Return the monitor used to synchronized access to the peers.
041 *
042 * @override Never
043 */
044 protected final Object getPeerLock() {
045 if (m_oPeerLock == null) {
046 m_oPeerLock = new Object();
047 }
048
049 return m_oPeerLock;
050 }
051
052 /**
053 * The MenuSheet that has been merged into this one, if any.
054 *
055 * @serial
056 */
057 protected MenuSheet m_msMerged = null;
058
059 /**
060 * The tag before which the merged menu was inserted.
061 *
062 * @serial
063 */
064 protected String m_sMergedBefore = null;
065
066 /**
067 * The peer index at which the merged menu was inserted.
068 *
069 * @serial
070 */
071 protected int m_nMergedAt = -1;
072
073 /**
074 * The MenuSheet into which this MenuSheet was merged, if any.
075 *
076 * @serial
077 */
078 protected MenuSheet m_msMergeParent = null;
079
080 /**
081 * The items of this MenuSheet.
082 *
083 * @serial
084 */
085 protected LinkedList<MenuSheetObject> m_lmsoItems;
086
087 /**
088 * The Images associated with the icons of this MenuSheet( [0]:DefaultImage, [1]:PressedImage,
089 * [2]:DisabledImage, [3]:PressedDiabledImage ).
090 *
091 * @serial
092 */
093 protected ImageIcon m_aiImages[] = null;
094
095 /**
096 * The Mnemonic of this MenuSheet.
097 *
098 * @serial
099 */
100 protected char m_cMnemonic;
101
102 /**
103 * The ToolTip of this MenuSheet.
104 *
105 * @serial
106 */
107 protected String m_sToolTip = "";
108
109 private void writeObject(java.io.ObjectOutputStream oos) throws java.io.IOException {
110 util.Debug.print("Starting to write menu sheet: \"" + getCaption() + "\" <" + getTag() + ">", -1);
111
112 oos.defaultWriteObject();
113
114 util.Debug.print("Done writing menu sheet: \"" + getCaption() + "\" <" + getTag() + ">", -1);
115 }
116
117 // Helpmethod for setting an ImageIcon
118 private void setIcon(ImageIcon iiImageIcon, int nIndex) {
119 if (m_aiImages == null) {
120 m_aiImages = new ImageIcon[4];
121
122 }
123 m_aiImages[nIndex] = iiImageIcon;
124
125 synchronized (getPeerLock()) {
126 if (m_jmPeer != null) {
127 switch (nIndex) {
128 case DEFAULT_IMAGE:
129 m_jmPeer.setIcon(iiImageIcon);
130 break;
131 case SELECTED_IMAGE:
132 m_jmPeer.setSelectedIcon(iiImageIcon);
133 break;
134 case DISABLED_IMAGE:
135 m_jmPeer.setDisabledIcon(iiImageIcon);
136 break;
137 case DISABLED_SELECTED_IMAGE:
138 m_jmPeer.setDisabledSelectedIcon(iiImageIcon);
139 break;
140 }
141
142 m_jmPeer.validate();
143 }
144 }
145 }
146
147 /**
148 * Creates a new MenuSheet with caption, tag and mnemonic.
149 *
150 * @param sCaption the caption of the new MenuSheet.
151 * @param sTag the tag of the new MenuSheet. If <code>null</code> a default tag will be created.
152 * @param cMnemonic the mnemonic of the new MenuSheet.
153 */
154 public MenuSheet(String sCaption, String sTag, char cMnemonic) {
155 super(sCaption, sTag);
156 m_cMnemonic = cMnemonic;
157
158 m_lmsoItems = new LinkedList<MenuSheetObject>();
159 }
160
161 /**
162 * Creates a new MenuSheet with caption and tag.
163 *
164 * @param sCaption the caption of the new MenuSheet.
165 * @param sTag the tag of the new MenuSheet. If <code>null</code> a default tag will be created.
166 */
167 public MenuSheet(String sCaption, String sTag) {
168 this(sCaption, sTag, '\0');
169
170 m_lmsoItems = new LinkedList<MenuSheetObject>();
171 }
172
173 /**
174 * Creates a new MenuSheet with caption and a default tag.
175 *
176 * @param sCaption the caption of the new MenuSheet.
177 */
178 public MenuSheet(String sCaption) {
179 this(sCaption, null, '\0');
180 }
181
182 /**
183 * Adds a MenuSheetObject to the end of this MenuSheet.
184 *
185 * <p>Should the MenuSheet currently be displayed, the new item will be displayed as
186 * well.</p>
187 *
188 * @override Never
189 *
190 * @param mso the new MenuSheetObject.
191 */
192 public synchronized void add(MenuSheetObject mso) {
193 if (m_msMergeParent == null) {
194 // we are not merged into some other MenuSheet, so we posess the peer.
195 synchronized (getPeerLock()) {
196 // update peer
197
198 if (mso.isSeparator()) {
199 if (m_jmPeer != null) {
200 m_jmPeer.addSeparator();
201 m_jmPeer.validate();
202 }
203 } else {
204 if (m_jmPeer != null) {
205 m_jmPeer.add(mso.getPeer());
206 m_jmPeer.validate();
207 }
208
209 if (m_jmbBarPeer != null) {
210 JMenu jm = mso.getMenuPeer();
211 m_jmbBarPeer.add(jm);
212 if (HELP_MENU_TAG.equals(mso.getTag())) {
213 m_jmbBarPeer.setHelpMenu(jm);
214 }
215 m_jmbBarPeer.validate();
216 }
217 }
218 }
219
220 // insert MenuSheetObject
221 m_lmsoItems.addLast(mso); // Attention: Must be after peer update to make sure,
222 // we don't change the list while trying to create the
223 // peer.
224 } else {
225 // We are merged into another MenuSheet, so we don't manage the peer.
226
227 m_lmsoItems.addLast(mso);
228
229 // Tell merge parent to update peer.
230 if (!mso.isSeparator()) {
231 int nIndex = m_lmsoItems.size() - 1; // nIndex == m_lmsoItems.indexOf (mso)
232
233 // index needs to be in peer "coordinates"
234 for (Iterator<MenuSheetObject> i = m_lmsoItems.iterator(); i.hasNext(); ) {
235 if (i.next().isSeparator()) {
236 nIndex--;
237 }
238 }
239
240 m_msMergeParent.mergedAdd(mso, nIndex);
241 }
242 }
243
244 // Tell new item about its new environment
245 mso.setParent(this);
246 mso.setVisible(isVisible());
247 mso.attach(m_spAttached);
248 mso.attach(m_pAttached);
249 }
250
251 /**
252 * Internal method used for updating merged peers correctly.
253 *
254 * @override Never
255 *
256 * @param mso the MenuSheet that was added in the merged MenuSheet.
257 * @param nIndex the peer index at which the element was added into the merged MenuSheet.
258 */
259 synchronized void mergedAdd(MenuSheetObject mso, int nIndex) {
260 if (m_msMergeParent == null) {
261 synchronized (getPeerLock()) {
262 if (m_jmbBarPeer != null) {
263 m_jmbBarPeer.add(mso.getMenuPeer(), nIndex + m_nMergedAt);
264 m_jmbBarPeer.validate();
265 }
266 }
267 } else {
268 m_msMergeParent.mergedAdd(mso, nIndex + m_nMergedAt);
269 }
270 }
271
272 /**
273 * Remove a tagged top level item from the MenuSheet.
274 *
275 * <p>If an item with the given tag is found among the top level items of this
276 * MenuSheet, it is removed and the removed item is returned. Otherwise, the call is
277 * ignored.</p>
278 *
279 * <p>If the MenuSheet is currently on display, the peer will reflect the changes.</p>
280 *
281 * @override Never
282 *
283 * @param sTag the tag of the item to be removed.
284 *
285 * @return the removed item
286 */
287 public MenuSheetObject remove(String sTag) {
288 MenuSheetObject msoRemove = getTaggedItem(sTag, true);
289
290 return ((msoRemove != null) ? (remove(msoRemove)) : (null));
291 }
292
293 /**
294 * Remove a MenuSheetObject from the MenuSheet.
295 *
296 * <p>If the MenuSheet is currently on display, the peer will reflect the changes.</p>
297 *
298 * @override Never
299 *
300 * @param msoRemove the MenuSheetObject to be removed.
301 *
302 * @return the removed MenuSheetObject.
303 */
304 public synchronized MenuSheetObject remove(MenuSheetObject msoRemove) {
305 // find the index of the item
306 int nIndex = m_lmsoItems.indexOf(msoRemove);
307 if (nIndex == -1) {
308 // item not found
309 return null;
310 }
311
312 if (m_msMergeParent == null) {
313 // We have the peer, so we update it.
314 synchronized (getPeerLock()) {
315 if (m_jmPeer != null) {
316 m_jmPeer.remove(nIndex); // Separators can only be removed via index
317 m_jmPeer.validate();
318 }
319
320 if (!msoRemove.isSeparator()) {
321 if (m_jmbBarPeer != null) {
322 m_jmbBarPeer.remove(msoRemove.getMenuPeer());
323 m_jmbBarPeer.validate();
324 }
325 }
326 }
327 } else {
328 // inform MenuSheet into which we are merged
329 m_msMergeParent.mergedRemove(msoRemove);
330 }
331
332 // remove item
333 m_lmsoItems.remove(msoRemove);
334
335 // set item's environment.
336 msoRemove.attach((SalesPoint)null);
337 msoRemove.attach((SaleProcess)null);
338 msoRemove.setVisible(false);
339 msoRemove.setParent(null);
340
341 return msoRemove;
342 }
343
344 /**
345 * Internal method used to properly update merged peers.
346 *
347 * @override Never
348 *
349 * @param mso the MenuSheetObject that was removed from the merged MenuSheet.
350 */
351 synchronized void mergedRemove(MenuSheetObject mso) {
352 if (m_msMergeParent == null) {
353 synchronized (getPeerLock()) {
354 if ((m_jmbBarPeer != null) && (!mso.isSeparator())) {
355 m_jmbBarPeer.remove(mso.getMenuPeer());
356 m_jmbBarPeer.validate();
357 }
358 }
359 } else {
360 m_msMergeParent.mergedRemove(mso);
361 }
362 }
363
364 /**
365 * Return a <i>fail-fast</i>, readonly iterator of the items in this MenuSheet.
366 *
367 * <p>Fail-fast means, that this iterator will throw a <code>ConcurrentModificationException</code> when a
368 * structural change occured to the underlying MenuSheet.</p>
369 *
370 * <p>Also, the <code>remove()</code> method will throw an <code>UnsupportedOperationException</code>, as
371 * this is a readonly iterator.</p>
372 *
373 * @override Never
374 *
375 * @see ConcurrentModificationException
376 */
377 public Iterator<MenuSheetObject> iterator() {
378 class I implements Iterator<MenuSheetObject> {
379 private Iterator<MenuSheetObject> m_i;
380
381 public I(Iterator<MenuSheetObject> i) {
382 m_i = i;
383 }
384
385 public boolean hasNext() {
386 return m_i.hasNext();
387 }
388
389 public MenuSheetObject next() {
390 return m_i.next();
391 }
392
393 public void remove() {
394 throw new UnsupportedOperationException(
395 "Please use the MenuSheet's remove() methods, not the iterator's.");
396 }
397 }
398
399 return new I(m_lmsoItems.iterator());
400 }
401
402 /**
403 * Internal method used when merging peers.
404 *
405 * @override Never
406 */
407 synchronized void setMergeParent(MenuSheet msMergeParent) {
408 m_msMergeParent = msMergeParent;
409 }
410
411 /**
412 * Merges the peers of two MenuSheets. If a MenuSheet is already merged into this one,
413 * it will be removed and marked invisible.
414 *
415 * <p>The peers of the top level MenuSheetObjects of the given MenuSheet are merged
416 * into the JMenuBar peer of this MenuSheet. They will be inserted into the JMenuBar
417 * peer before the MenuSheetpObject with the given tag. If no such MenuSheetObject can
418 * be found in the MenuSheet they are appended to the end of the peer.</p>
419 *
420 * <p>Merging can always only result in a JMenuBar peer. A JMenu peer cannot be merged.
421 * However, merging can be nested. I.e. it is legal, to merge a MenuSheet, into whose
422 * peer another MenuSheet's peer has been merged, into a third MenuSheet.</p>
423 *
424 * <p>Although the peers of the two MenuSheets are merged, they stay independent with
425 * respect to anything else. The MenuSheetObjects of the merged MenuSheet can still
426 * only be accessed through that MenuSheet and vice-vera. Also, the attached SalesPoint
427 * and SaleProcess stay independent.</p>
428 *
429 * <p>For merging to function correctly, you must set the created JMenuBar in your
430 * JFrame. Something like this will do the trick:</p>
431 * <pre>
432 * setJMenuBar (ms.mergePeers (msToMerge, "MERGE_BEFORE_THIS"));
433 * </pre>
434 *
435 * <p>This method is usually not called directly.</p>
436 *
437 * @param msToMerge the MenuSheet to be merged into this one.
438 * @param sBeforeTag before which tag to merge in the MenuSheet.
439 *
440 * @override Never
441 */
442 public final JMenuBar mergePeers(MenuSheet msToMerge, String sBeforeTag) {
443 synchronized (getPeerLock()) {
444 boolean fVisible = isVisible();
445
446 if (fVisible) {
447 setVisible(false);
448 }
449
450 if (m_msMerged != null) {
451 m_msMerged.setMergeParent(null);
452 }
453
454 m_msMerged = msToMerge;
455 m_sMergedBefore = sBeforeTag;
456 m_nMergedAt = -1;
457
458 if (m_msMerged != null) {
459 m_msMerged.setMergeParent(this);
460 }
461
462 if (fVisible) {
463 setVisible(true);
464 }
465 if (m_msMergeParent != null) {
466 return m_msMergeParent.remergePeers();
467 } else {
468 return getMenuBar();
469 }
470 }
471 }
472
473 /**
474 * Internal method used for proper merging of peers.
475 *
476 * @override Never
477 */
478 JMenuBar remergePeers() {
479 return mergePeers(m_msMerged, m_sMergedBefore);
480 }
481
482 /**
483 * Get a MenuSheetObject by its tag.
484 *
485 * <p>This will iterate over all MenuSheetObjects in this MenuSheet and return the
486 * first one, that has the given tag.</p>
487 *
488 * @override Never
489 *
490 * @param sTag the tag to search for.
491 * @param fTopLevelOnly if true, only the direct elements in this MenuSheet are searched.
492 *
493 * @exception ConcurrentModificationException if the structure of the MenuSheet changed
494 * during the search.
495 *
496 * @return the first MenuSheetObject that has the given tag, if any.
497 */
498 public MenuSheetObject getTaggedItem(String sTag, boolean fTopLevelOnly) {
499 MenuSheetObject msoReturn = super.getTaggedItem(sTag, fTopLevelOnly);
500 if (msoReturn != null) {
501 return msoReturn;
502 }
503
504 for (Iterator<MenuSheetObject> i = iterator(); i.hasNext(); ) {
505 MenuSheetObject mso = i.next();
506
507 if (fTopLevelOnly) {
508 String sCurTag = mso.getTag();
509
510 if (sCurTag.equals(sTag)) {
511 return mso;
512 }
513 } else {
514 msoReturn = mso.getTaggedItem(sTag, fTopLevelOnly);
515
516 if (msoReturn != null) {
517 return msoReturn;
518 }
519 }
520 }
521
522 return null;
523 }
524
525 /**
526 * Attach a SalesPoint to this MenuSheet.
527 *
528 * @override Never
529 */
530 public synchronized SalesPoint attach(SalesPoint sp) {
531 for (Iterator<MenuSheetObject> i = iterator(); i.hasNext(); ) {
532 i.next().attach(sp);
533 }
534
535 return super.attach(sp);
536 }
537
538 /**
539 * Attach a SaleProcess to this MenuSheet.
540 *
541 * @override Never
542 */
543 public synchronized SaleProcess attach(SaleProcess p) {
544 for (Iterator<MenuSheetObject> i = iterator(); i.hasNext(); ) {
545 i.next().attach(p);
546 }
547
548 return super.attach(p);
549 }
550
551 /**
552 * Mark this MenuSheet, all its descendants and merged peer MenuSheets visible or
553 * invisible.
554 *
555 * @override Never
556 */
557 public synchronized void setVisible(boolean fVisible) {
558 super.setVisible(fVisible);
559
560 for (Iterator<MenuSheetObject> i = iterator(); i.hasNext(); ) {
561 i.next().setVisible(fVisible);
562 }
563
564 if (m_msMerged != null) {
565 m_msMerged.setVisible(fVisible);
566 }
567
568 if (!fVisible) {
569 synchronized (getPeerLock()) {
570 if (m_jmbBarPeer != null) {
571 m_jmbBarPeer.removeAll();
572 m_jmbBarPeer = null;
573 }
574
575 if (m_jmPeer != null) {
576 m_jmPeer.removeAll();
577 m_jmPeer = null;
578 }
579 }
580 }
581 }
582
583 /**
584 * Set the caption of this MenuSheet.
585 *
586 * <p>If there is a peer it will reflect the changes immediately.</p>
587 *
588 * @override Never
589 *
590 * @param sCaption the new caption.
591 */
592 public void setCaption(String sCaption) {
593 super.setCaption(sCaption);
594
595 synchronized (getPeerLock()) {
596 if (m_jmPeer != null) {
597 m_jmPeer.setText(sCaption);
598 m_jmPeer.validate();
599 }
600 }
601 }
602
603 /**
604 * Set the mnemonic of this MenuSheet.
605 *
606 * <p>If there is a peer it will reflect the changes immediately.</p>
607 *
608 * @override Never
609 *
610 * @param cMnemonic the new mnemonic.
611 */
612 public void setMnemonic(char cMnemonic) {
613 m_cMnemonic = cMnemonic;
614
615 synchronized (getPeerLock()) {
616 if (m_jmPeer != null) {
617 m_jmPeer.setMnemonic(cMnemonic);
618 m_jmPeer.validate();
619 }
620 }
621 }
622
623 /**
624 * Set the ToolTip of this MenuSheet.
625 *
626 * <p>If there is a peer it will reflect the changes immediately.</p>
627 *
628 * @override Never
629 *
630 * @param s the new ToolTip-Text.
631 */
632 public void setToolTipText(String s) {
633 m_sToolTip = s;
634
635 synchronized (getPeerLock()) {
636 if (m_jmPeer != null) {
637 m_jmPeer.setToolTipText(s);
638 m_jmPeer.validate();
639 }
640 }
641 }
642
643 /**
644 * Set the default icon of this MenuSheet.
645 *
646 * <p>If there is a peer it will reflect the changes immediately.</p>
647 *
648 * @override Never
649 *
650 * @param iiImageIcon the new icon.
651 */
652 public void setDefaultIcon(ImageIcon iiImageIcon) {
653 setIcon(iiImageIcon, DEFAULT_IMAGE);
654 }
655
656 /**
657 * Set the selected icon of this MenuSheet.
658 *
659 * <p>If there is a peer it will reflect the changes immediately.</p>
660 *
661 * @override Never
662 *
663 * @param iiImageIcon the new icon.
664 */
665 public void setSelectedIcon(ImageIcon iiImageIcon) {
666 setIcon(iiImageIcon, SELECTED_IMAGE);
667 }
668
669 /**
670 * Set the disabled icon of this MenuSheet.
671 *
672 * <p>If there is a peer it will reflect the changes immediately.</p>
673 *
674 * @override Never
675 *
676 * @param iiImageIcon the new icon.
677 */
678 public void setDisabledIcon(ImageIcon iiImageIcon) {
679 setIcon(iiImageIcon, DISABLED_IMAGE);
680 }
681
682 /**
683 * Set the disabled selected icon of this MenuSheet.
684 *
685 * <p>If there is a peer it will reflect the changes immediately.</p>
686 *
687 * @override Never
688 *
689 * @param iiImageIcon the new icon.
690 */
691 public void setDisabledSelectedIcon(ImageIcon iiImageIcon) {
692 setIcon(iiImageIcon, DISABLED_SELECTED_IMAGE);
693 }
694
695 /**
696 * The JMenuItem peer of a MenuSheet is, of course, a JMenu.
697 *
698 * @override Never
699 */
700 public JMenuItem getPeer() {
701 synchronized (getPeerLock()) {
702 if (m_jmPeer == null) {
703 m_jmPeer = new JMenu(getCaption());
704
705 // add Mnemonic to JMenu if exists
706 if (m_cMnemonic != '\0') {
707 m_jmPeer.setMnemonic(m_cMnemonic);
708
709 }
710 if (m_sToolTip.compareTo("") != 0) {
711 m_jmPeer.setToolTipText(m_sToolTip);
712 }
713
714 if (m_aiImages != null) {
715 // add DefaultIcon, if any
716 if (m_aiImages[DEFAULT_IMAGE] != null) {
717 m_jmPeer.setIcon(m_aiImages[DEFAULT_IMAGE]);
718 // add PressedIcon, if any
719 }
720 if (m_aiImages[SELECTED_IMAGE] != null) {
721 m_jmPeer.setSelectedIcon(m_aiImages[SELECTED_IMAGE]);
722 // add DisabledIcon, if any
723 }
724 if (m_aiImages[DISABLED_IMAGE] != null) {
725 m_jmPeer.setDisabledIcon(m_aiImages[DISABLED_IMAGE]);
726 // add DisabledSelectedIcon, if any
727 }
728 if (m_aiImages[DISABLED_SELECTED_IMAGE] != null) {
729 m_jmPeer.setDisabledSelectedIcon(m_aiImages[DISABLED_SELECTED_IMAGE]);
730 }
731 }
732
733 for (Iterator<MenuSheetObject> i = iterator(); i.hasNext(); ) {
734 MenuSheetObject mso = i.next();
735
736 if (mso.isSeparator()) {
737 m_jmPeer.addSeparator();
738 } else {
739 m_jmPeer.add(mso.getPeer());
740 }
741 }
742 }
743 }
744
745 return m_jmPeer;
746 }
747
748 /**
749 * For MenuSheets there is no difference between JMenuItem and JMenu peer, they are
750 * both JMenus.
751 *
752 * @override Never
753 */
754 public JMenu getMenuPeer() {
755 return (JMenu)getPeer();
756 }
757
758 /**
759 * Return the JMenuBar peer.
760 *
761 * <p>For a MenuSheet there is a special peer: the JMenuBar peer. All items of this
762 * MenuSheet will present their JMenu peer in the JMenuBar. Only MenuSheetSeparators
763 * are not displayed in a JMenuBar representation. Merged peers are only displayed in
764 * the JMenuBar representation.</p>
765 *
766 * @override Never
767 */
768 public JMenuBar getMenuBar() {
769 synchronized (getPeerLock()) {
770 if (m_jmbBarPeer == null) {
771 boolean fResolvedMerge = false;
772
773 m_jmbBarPeer = new JMenuBar();
774
775 for (Iterator<MenuSheetObject> i = iterator(); i.hasNext(); ) {
776 MenuSheetObject mso = i.next();
777
778 if ((!fResolvedMerge) && (m_msMerged != null)) {
779 if (mso.getTag().equals(m_sMergedBefore)) {
780
781 m_nMergedAt = m_jmbBarPeer.getMenuCount();
782 synchronized (m_msMerged) {
783 MenuElement[] ajmMerged = m_msMerged.getMenuBar().getSubElements();
784 m_msMerged.getMenuBar().removeAll();
785
786 for (int n = 0; n < ajmMerged.length; n++) {
787 m_jmbBarPeer.add((JMenu)ajmMerged[n]);
788 }
789 }
790
791 fResolvedMerge = true;
792 }
793 }
794
795 if (!mso.isSeparator()) {
796 m_jmbBarPeer.add(mso.getMenuPeer());
797 if (HELP_MENU_TAG.equals(mso.getTag())) {
798 m_jmbBarPeer.setHelpMenu(mso.getMenuPeer());
799 }
800 }
801 }
802
803 if ((!fResolvedMerge) && (m_msMerged != null)) {
804 // mark merge at end !
805 m_sMergedBefore = null;
806 m_nMergedAt = m_jmbBarPeer.getMenuCount();
807
808 synchronized (m_msMerged) {
809 MenuElement[] ajmMerged = m_msMerged.getMenuBar().getSubElements();
810 m_msMerged.getMenuBar().removeAll();
811
812 for (int n = 0; n < ajmMerged.length; n++) {
813 m_jmbBarPeer.add((JMenu)ajmMerged[n]);
814 }
815 }
816 }
817 }
818 }
819
820 return m_jmbBarPeer;
821 }
822
823 /**
824 * Get the Mnemonic of this MenuSheet.
825 *
826 * @override Never
827 *
828 * @return the mnemonic of this MenuSheet.
829 */
830 public char getMnemonic() {
831 return m_cMnemonic;
832 }
833
834 /**
835 * Get the ToolTip of this MenuSheet.
836 *
837 * @override Never
838 *
839 * @return the ToolTip-String of this MenuSheet.
840 */
841 public String getToolTipText() {
842 return m_sToolTip;
843 }
844
845 /**
846 * Get the default icon of this MenuSheet.
847 *
848 * @override Never
849 *
850 * @return the default icon of this MenuSheet.
851 */
852 public ImageIcon getDefaultIcon() {
853 return (m_aiImages != null) ? (m_aiImages[DEFAULT_IMAGE]) : (null);
854 }
855
856 /**
857 * Get the selected icon of this MenuSheet.
858 *
859 * @override Never
860 *
861 * @return the pressed icon of this MenuSheet.
862 */
863 public ImageIcon getSelectedIcon() {
864 return (m_aiImages != null) ? (m_aiImages[SELECTED_IMAGE]) : (null);
865 }
866
867 /**
868 * Get the disabled item of this MenuSheet.
869 *
870 * @override Never
871 *
872 * @return the disabled icon of this MenuSheet.
873 */
874 public ImageIcon getDisabledIcon() {
875 return (m_aiImages != null) ? (m_aiImages[DISABLED_IMAGE]) : (null);
876 }
877
878 /**
879 * Get the disabled selected item of this MenuSheet.
880 *
881 * @override Never
882 *
883 * @return the disabled selected icon of this MenuSheet.
884 */
885 public ImageIcon getDisabledSelectedIcon() {
886 return (m_aiImages != null) ? (m_aiImages[DISABLED_SELECTED_IMAGE]) : (null);
887 }
888
889 /**
890 * A tag that will identify the help menu, should this MenuSheet be displayed as a
891 * JMenuBar.
892 */
893 public final static String HELP_MENU_TAG = "__TAG:_HELP_MENU";
894 // A Tag that will identify the Image for the DefaultIcon
895 private final static int DEFAULT_IMAGE = 0;
896 // A Tag that will identify the Image for the SelectedIcon
897 private final static int SELECTED_IMAGE = 1;
898 // A Tag that will identify the Image for the DisabledIcon
899 private final static int DISABLED_IMAGE = 2;
900 // A Tag that will identify the Image for the DisabledSelectedIcon
901 private final static int DISABLED_SELECTED_IMAGE = 3;
902 }