001 package sale;
002
003 import javax.swing.*;
004
005 import java.awt.event.*;
006
007 /**
008 * A MenuSheetItem that has a label and an associated action.
009 *
010 * @see Action
011 * @see MenuSheet
012 * @see MenuSheetSeparator
013 *
014 * @author Steffen Zschaler
015 * @version 2.0 20/05/1999
016 * @since v1.0
017 */
018 public class MenuSheetItem extends MenuSheetObject implements ActionListener {
019
020 /**
021 * ID for serialization.
022 */
023 private static final long serialVersionUID = 6809127518902187252L;
024
025 /**
026 * The JMenuItem peer.
027 */
028 protected transient JMenuItem m_jmiPeer = null;
029
030 /**
031 * The JMenu peer.
032 */
033 protected transient JMenu m_jmMenuPeer = null;
034
035 /**
036 * The monitor synchronizing 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 Object getPeerLock() {
045 if (m_oPeerLock == null) {
046 m_oPeerLock = new Object();
047 }
048
049 return m_oPeerLock;
050 }
051
052 /**
053 * The action associated with this MenuSheetItem.
054 *
055 * @serial
056 */
057 protected Action m_aAction;
058 /**
059 * The monitor synchronizing accesses to m_aAction.
060 */
061 private transient Object m_oActionLock;
062 /**
063 * Return the monitor used to synchronized access to the m_aAction.
064 *
065 * @override Never
066 */
067 protected Object getActionLock() {
068 if (m_oActionLock == null) {
069 m_oActionLock = new Object();
070 }
071
072 return m_oActionLock;
073 }
074
075 /**
076 * Can this MenuSheetItem be clicked?
077 *
078 * @serial
079 */
080 private boolean m_fEnabled = true;
081
082 /**
083 * The Images associated with the icons of this MenuSheetItem( [0]:DefaultImage, [1]:PressedImage,
084 * [2]:DisabledImage, [3]:PressedDiabledImage ).
085 *
086 * @serial
087 */
088 protected ImageIcon m_aiImages[] = null;
089
090 /**
091 * The Mnemonic of this MenuSheetItem.
092 *
093 * @serial
094 */
095 protected char m_cMnemonic;
096
097 /**
098 * The KeyStroke of this MenuSheetItem.
099 *
100 * @serial
101 */
102 protected KeyStroke m_ksKeyStroke;
103
104 /**
105 * The ToolTip of this MenuSheeItemt.
106 *
107 * @serial
108 */
109 protected String m_sToolTip = "";
110
111 private void writeObject(java.io.ObjectOutputStream oos) throws java.io.IOException {
112 util.Debug.print("Starting to write menu sheet item: \"" + getCaption() + "\" <" + getTag() + ">", -1);
113
114 oos.defaultWriteObject();
115
116 util.Debug.print("Done writing menu sheet item: \"" + getCaption() + "\" <" + getTag() + ">", -1);
117 }
118
119 /**
120 * Creates a new MenuSheetItem with caption, tag, an action and a mnemonic.
121 *
122 * @param sCaption the caption of the new MenuSheetItem.
123 * @param sTag the tag that will identify this MenuSheetItem.
124 * @param aAction the action to perform when this MenuSheetItem is selected.
125 * @param cMnemonic the mnemonic of the new MenuSheetItem
126 */
127 public MenuSheetItem(String sCaption, String sTag, Action aAction, char cMnemonic) {
128 super(sCaption, sTag);
129 m_cMnemonic = cMnemonic;
130
131 m_aAction = aAction;
132 }
133
134 /**
135 * Creates a new MenuSheetItem with caption, tag and action; initially enabled.
136 *
137 * @param sCaption the caption of the new MenuSheetItem.
138 * @param sTag the tag that will identify this MenuSheetItem.
139 * @param aAction the action to perform when this MenuSheetItem is selected.
140 */
141 public MenuSheetItem(String sCaption, String sTag, Action aAction) {
142 this(sCaption, sTag, aAction, '\0');
143 }
144
145 /**
146 * Creates a new MenuSheetItem with caption and action. The MenuSheetItem will have
147 * a default, unique tag.
148 *
149 * @param sCaption the caption of the new MenuSheetItem.
150 * @param aAction the action to perform when this MenuSheetItem is selected.
151 */
152 public MenuSheetItem(String sCaption, Action aAction) {
153 this(sCaption, null, aAction, '\0');
154 }
155
156 // Helpmethod for setting an ImageIcon
157 private void setIcon(ImageIcon iiImageIcon, int nIndex) {
158 if (m_aiImages == null) {
159 m_aiImages = new ImageIcon[4];
160
161 }
162 m_aiImages[nIndex] = iiImageIcon;
163
164 synchronized (getPeerLock()) {
165 if (m_jmiPeer != null) {
166 switch (nIndex) {
167 case DEFAULT_IMAGE:
168 m_jmiPeer.setIcon(iiImageIcon);
169 break;
170 case SELECTED_IMAGE: {
171 m_jmiPeer.setSelectedIcon(iiImageIcon);
172 break;
173 }
174 case DISABLED_IMAGE:
175 m_jmiPeer.setDisabledIcon(iiImageIcon);
176 break;
177 case DISABLED_SELECTED_IMAGE:
178 m_jmiPeer.setDisabledSelectedIcon(iiImageIcon);
179 break;
180 }
181 }
182
183 if (m_jmMenuPeer != null) {
184 switch (nIndex) {
185 case DEFAULT_IMAGE:
186 m_jmMenuPeer.getItem(0).setIcon(iiImageIcon);
187 break;
188 case SELECTED_IMAGE:
189 m_jmMenuPeer.getItem(0).setSelectedIcon(iiImageIcon);
190 break;
191 case DISABLED_IMAGE:
192 m_jmMenuPeer.getItem(0).setDisabledIcon(iiImageIcon);
193 break;
194 case DISABLED_SELECTED_IMAGE:
195 m_jmMenuPeer.getItem(0).setDisabledSelectedIcon(iiImageIcon);
196 break;
197 }
198 }
199 }
200 }
201
202 /**
203 * Set the caption of this MenuSheetItem. If the MenuSheetItem is already on display,
204 * also the peer's caption is set.
205 *
206 * @override Never
207 *
208 * @param sCaption the new caption.
209 */
210 public void setCaption(String sCaption) {
211
212 synchronized (getPeerLock()) {
213 if (m_jmiPeer != null) {
214 m_jmiPeer.setText(sCaption);
215 }
216
217 if (m_jmMenuPeer != null) {
218 m_jmMenuPeer.setText(sCaption);
219 m_jmMenuPeer.getItem(0).setText(sCaption);
220 }
221 }
222
223 super.setCaption(sCaption);
224 }
225
226 /**
227 * Set the enabled state of this MenuSheetItem. If the MenuSheetItem is already on
228 * display, also the peer's enabled state is set.
229 *
230 * @override Never
231 *
232 * @param fEnabled the new enabled state.
233 */
234 public void setEnabled(boolean fEnabled) {
235 m_fEnabled = fEnabled;
236
237 synchronized (getPeerLock()) {
238 if (m_jmiPeer != null) {
239 m_jmiPeer.setEnabled(fEnabled);
240 }
241
242 if (m_jmMenuPeer != null) {
243 m_jmMenuPeer.getItem(0).setEnabled(fEnabled);
244 }
245 }
246 }
247
248 /**
249 * Return the current enabled state of this MenuSheetItem.
250 *
251 * @override Never
252 */
253 public boolean isEnabled() {
254 return m_fEnabled;
255 }
256
257 /**
258 * Mark the item visible or invisible.
259 *
260 * @override Never
261 */
262 public void setVisible(boolean fVisible) {
263 super.setVisible(fVisible);
264
265 if (!fVisible) {
266 synchronized (getPeerLock()) {
267 m_jmiPeer = null;
268 m_jmMenuPeer = null;
269 }
270 }
271 }
272
273 /**
274 * Set the action to perform when this item is selected.
275 *
276 * @override Never
277 *
278 * @param aAction the action to perform when this item is selected.
279 *
280 * @return the previously set action, if any.
281 */
282 public Action setAction(Action aAction) {
283 Action aOld = null;
284
285 synchronized (getActionLock()) {
286 aOld = m_aAction;
287
288 m_aAction = aAction;
289 }
290
291 return aOld;
292 }
293
294 /**
295 * Set the mnemonic of this MenuSheetItem.
296 *
297 * <p>If there is a peer it will reflect the changes immediately.</p>
298 *
299 * @override Never
300 *
301 * @param cMnemonic the new mnemonic.
302 */
303 public void setMnemonic(char cMnemonic) {
304 m_cMnemonic = cMnemonic;
305
306 synchronized (getPeerLock()) {
307 if (m_jmiPeer != null) {
308 m_jmiPeer.setMnemonic(cMnemonic);
309 }
310
311 if (m_jmMenuPeer != null) {
312 m_jmMenuPeer.getItem(0).setMnemonic(cMnemonic);
313 }
314 }
315 }
316
317 /**
318 * Set the accelerator of this MenuSheetItem.
319 *
320 * <p>If there is a peer it will reflect the changes immediately.</p>
321 *
322 * @override Never
323 *
324 * @param ks the new keystroke.
325 */
326 public void setAccelerator(KeyStroke ks) {
327 m_ksKeyStroke = ks;
328
329 synchronized (getPeerLock()) {
330 if (m_jmiPeer != null) {
331 m_jmiPeer.setAccelerator(ks);
332 }
333
334 if (m_jmMenuPeer != null) {
335 m_jmMenuPeer.getItem(0).setAccelerator(ks);
336 }
337 }
338 }
339
340 /**
341 * Set the ToolTip of this MenuSheetItem.
342 *
343 * <p>If there is a peer it will reflect the changes immediately.</p>
344 *
345 * @override Never
346 *
347 * @param s the new ToolTip-Text.
348 */
349 public void setToolTipText(String s) {
350 m_sToolTip = s;
351
352 synchronized (getPeerLock()) {
353 if (m_jmiPeer != null) {
354 m_jmiPeer.setToolTipText(s);
355 m_jmiPeer.validate();
356 }
357 }
358 }
359
360 /**
361 * Set the default icon of this MenuSheetItem.
362 *
363 * <p>If there is a peer it will reflect the changes immediately.</p>
364 *
365 * @override Never
366 *
367 * @param iiImageIcon the new icon.
368 */
369 public void setDefaultIcon(ImageIcon iiImageIcon) {
370 setIcon(iiImageIcon, DEFAULT_IMAGE);
371 }
372
373 /**
374 * Set the selected icon of this MenuSheetItem.
375 *
376 * <p>If there is a peer it will reflect the changes immediately.</p>
377 *
378 * @override Never
379 *
380 * @param iiImageIcon the new icon.
381 */
382 public void setSelectedIcon(ImageIcon iiImageIcon) {
383 setIcon(iiImageIcon, SELECTED_IMAGE);
384 }
385
386 /**
387 * Set the disabled icon of this MenuSheetItem.
388 *
389 * <p>If there is a peer it will reflect the changes immediately.</p>
390 *
391 * @override Never
392 *
393 * @param iiImageIcon the new icon.
394 */
395 public void setDisabledIcon(ImageIcon iiImageIcon) {
396 setIcon(iiImageIcon, DISABLED_IMAGE);
397 }
398
399 /**
400 * Set the disabled selected icon of this MenuSheetItem.
401 *
402 * <p>If there is a peer it will reflect the changes immediately.</p>
403 *
404 * @override Never
405 *
406 * @param iiImageIcon the new icon.
407 */
408 public void setDisabledSelectedIcon(ImageIcon iiImageIcon) {
409 setIcon(iiImageIcon, DISABLED_SELECTED_IMAGE);
410 }
411
412 /**
413 * Get the JMenuItem peer of the MenuSheetItem. The JMenuItem peer is a JMenuItem
414 * with the same caption as this MenuSheetItem. Selecting this JMenuItem will invoke
415 * the action associated to this MenuSheetItem.
416 *
417 * @override Never
418 */
419 public JMenuItem getPeer() {
420 synchronized (getPeerLock()) {
421 if (m_jmiPeer == null) {
422 m_jmiPeer = new JMenuItem(getCaption());
423 m_jmiPeer.addActionListener(this);
424
425 // add Mnemonic to JMenuItem if exists
426 if (m_cMnemonic != '\0') {
427 m_jmiPeer.setMnemonic(m_cMnemonic);
428
429 // add Accelerator to JMenuItem if exists
430 }
431 if (m_ksKeyStroke != null) {
432 m_jmiPeer.setAccelerator(m_ksKeyStroke);
433
434 }
435 if (m_sToolTip.compareTo("") != 0) {
436 m_jmiPeer.setToolTipText(m_sToolTip);
437 }
438
439 if (m_aiImages != null) {
440 // add DefaultIcon, if any
441 if (m_aiImages[DEFAULT_IMAGE] != null) {
442 m_jmiPeer.setIcon(m_aiImages[DEFAULT_IMAGE]);
443 // add PressedIcon, if any
444 }
445 if (m_aiImages[SELECTED_IMAGE] != null) {
446 System.out.println("Selected Icon - getPeer(): " + m_aiImages[SELECTED_IMAGE]);
447 m_jmiPeer.setSelectedIcon(m_aiImages[SELECTED_IMAGE]);
448 System.out.println("Peer hat Selected Icon: " + m_jmiPeer.getSelectedIcon());
449 }
450 // add DisabledIcon, if any
451 if (m_aiImages[DISABLED_IMAGE] != null) {
452 m_jmiPeer.setDisabledIcon(m_aiImages[DISABLED_IMAGE]);
453 // add DisabledSelectedIcon, if any
454 }
455 if (m_aiImages[DISABLED_SELECTED_IMAGE] != null) {
456 m_jmiPeer.setDisabledSelectedIcon(m_aiImages[DISABLED_SELECTED_IMAGE]);
457 }
458 }
459
460 m_jmiPeer.setEnabled(m_fEnabled);
461 }
462 }
463
464 return m_jmiPeer;
465 }
466
467 /**
468 * Return the JMenu peer for this MenuSheetItem. The JMenu peer is a JMenu with the
469 * same caption as this MenuSheetItem, containing just one JMenuItem, which is
470 * equivalent to the JMenuItem peer of the MenuSheetItem.
471 *
472 * @override Never
473 */
474 public JMenu getMenuPeer() {
475 synchronized (getPeerLock()) {
476 if (m_jmMenuPeer == null) {
477 m_jmMenuPeer = new JMenu(getCaption());
478 JMenuItem jmi = m_jmMenuPeer.add(getCaption());
479 jmi.addActionListener(this);
480
481 // add Mnemonic to JMenuItem if exists
482 if (m_cMnemonic != '\0') {
483 jmi.setMnemonic(m_cMnemonic);
484
485 // add Accelerator to JMenuItem if exists
486 }
487 if (m_ksKeyStroke != null) {
488 jmi.setAccelerator(m_ksKeyStroke);
489
490 }
491 if (m_aiImages != null) {
492 // add DefaultIcon, if any
493 if (m_aiImages[DEFAULT_IMAGE] != null) {
494 jmi.setIcon(m_aiImages[DEFAULT_IMAGE]);
495 // add SelectedIcon, if any
496 }
497 if (m_aiImages[SELECTED_IMAGE] != null) {
498 System.out.println("Selected Icon - getMenuPeer(): " + m_aiImages[SELECTED_IMAGE]);
499 jmi.setSelectedIcon(m_aiImages[SELECTED_IMAGE]);
500 }
501 // add DisabledIcon, if any
502 if (m_aiImages[DISABLED_IMAGE] != null) {
503 jmi.setDisabledIcon(m_aiImages[DISABLED_IMAGE]);
504 // add DisabledSelectedIcon, if any
505 }
506 if (m_aiImages[DISABLED_SELECTED_IMAGE] != null) {
507 jmi.setDisabledSelectedIcon(m_aiImages[DISABLED_SELECTED_IMAGE]);
508 }
509 }
510
511 jmi.setEnabled(m_fEnabled);
512 }
513 }
514
515 return m_jmMenuPeer;
516 }
517
518 /**
519 * Hook method called whenever the user selects the MenuSheetItem. As a default
520 * invokes the action currently associated with the MenuSheetItem, handing it the
521 * currently attached SalesPoint and SaleProcess.
522 *
523 * @override Never
524 *
525 * @see #setAction
526 * @see SalesPoint
527 * @see SaleProcess
528 */
529 public void actionPerformed(ActionEvent e) {
530 final Action[] aaTemp = new Action[1];
531
532 synchronized (getActionLock()) {
533 aaTemp[0] = m_aAction;
534 }
535
536 if (aaTemp[0] != null) {
537 new Thread("ActionPerfomer: MenuSheetItem: \"" + getCaption() + "\"") {
538 public void run() {
539 try {
540 aaTemp[0].doAction(m_pAttached, m_spAttached);
541 }
542 catch (ThreadDeath td) {
543 throw td;
544 }
545 catch (Throwable t) {
546 System.err.println("Exception occured during event dispatching: MenuSheetItem \"" +
547 getCaption() + "\":");
548 t.printStackTrace();
549 }
550 }
551 }
552
553 .start();
554 }
555 }
556
557 /**
558 * Get the Mnemonic of this MenuSheetItem.
559 *
560 * @override Never
561 *
562 * @return the mnemonic of this MenuSheetItem.
563 */
564 public char getMnemonic() {
565 return m_cMnemonic;
566 }
567
568 /**
569 * Get the accelerator of this MenuSheetItem.
570 *
571 * @override Never
572 *
573 * @return the keystroke associated with the accelerator of this MenuSheetItem.
574 */
575 public KeyStroke getAccelerator() {
576 return m_ksKeyStroke;
577 }
578
579 /**
580 * Get the ToolTip of this MenuSheetItem.
581 *
582 * @override Never
583 *
584 * @return the ToolTip-String of this MenuSheetItem.
585 */
586 public String getToolTipText() {
587 return m_sToolTip;
588 }
589
590 /**
591 * Get the default icon of this MenuSheetItem.
592 *
593 * @override Never
594 *
595 * @return the default icon of this MenuSheetItem.
596 */
597 public ImageIcon getDefaultIcon() {
598 return (m_aiImages != null) ? (m_aiImages[DEFAULT_IMAGE]) : (null);
599 }
600
601 /**
602 * Get the selected icon of this MenuSheetItem.
603 *
604 * @override Never
605 *
606 * @return the pressed icon of this MenuSheetItem.
607 */
608 public ImageIcon getSelectedIcon() {
609 return (m_aiImages != null) ? (m_aiImages[SELECTED_IMAGE]) : (null);
610 }
611
612 /**
613 * Get the disabled item of this MenuSheetItem.
614 *
615 * @override Never
616 *
617 * @return the disabled icon of this MenuSheetItem.
618 */
619 public ImageIcon getDisabledIcon() {
620 return (m_aiImages != null) ? (m_aiImages[DISABLED_IMAGE]) : (null);
621 }
622
623 /**
624 * Get the disabled selected item of this MenuSheetItem.
625 *
626 * @override Never
627 *
628 * @return the disabled selected icon of this MenuSheetItem.
629 */
630 public ImageIcon getDisabledSelectedIcon() {
631 return (m_aiImages != null) ? (m_aiImages[DISABLED_SELECTED_IMAGE]) : (null);
632 }
633
634 // A Tag that will identify the Image for the DefaultIcon
635 private final static int DEFAULT_IMAGE = 0;
636 // A Tag that will identify the Image for the SelectedIcon
637 private final static int SELECTED_IMAGE = 1;
638 // A Tag that will identify the Image for the DisabledIcon
639 private final static int DISABLED_IMAGE = 2;
640 // A Tag that will identify the Image for the DisabledSelectedIcon
641 private final static int DISABLED_SELECTED_IMAGE = 3;
642 }