package sale;
import java.util.*;
import javax.swing.*;
import java.awt.*;
public class MenuSheet extends MenuSheetObject {
protected transient JMenu m_jmPeer = null;
protected transient JMenuBar m_jmbBarPeer = null;
private transient Object m_oPeerLock;
protected final Object getPeerLock() {
if (m_oPeerLock == null) {
m_oPeerLock = new Object();
}
return m_oPeerLock;
}
protected MenuSheet m_msMerged = null;
protected String m_sMergedBefore = null;
protected int m_nMergedAt = -1;
protected MenuSheet m_msMergeParent = null;
protected LinkedList m_lmsoItems;
protected Image m_aiImages[] = null;
protected char m_cMnemonic;
private void writeObject (java.io.ObjectOutputStream oos)
throws java.io.IOException {
util.Debug.print ("Starting to write menu sheet: \"" + getCaption () + "\" <" + getTag () + ">", -1);
oos.defaultWriteObject ();
util.Debug.print ("Done writing menu sheet: \"" + getCaption () + "\" <" + getTag () + ">", -1);
}
private void setIcon (ImageIcon iiImageIcon, int nIndex) {
if (m_aiImages == null)
m_aiImages = new Image[4];
m_aiImages[nIndex] = iiImageIcon.getImage();
synchronized (getPeerLock()) {
if (m_jmPeer != null) {
switch (nIndex) {
case DEFAULT_IMAGE :
m_jmPeer.setIcon (iiImageIcon);
break;
case SELECTED_IMAGE :
m_jmPeer.setSelectedIcon (iiImageIcon);
break;
case DISABLED_IMAGE :
m_jmPeer.setDisabledIcon (iiImageIcon);
break;
case DISABLED_SELECTED_IMAGE :
m_jmPeer.setDisabledSelectedIcon (iiImageIcon);
break;
}
m_jmPeer.validate();
}
}
}
public MenuSheet (String sCaption,
String sTag,
char cMnemonic) {
super (sCaption, sTag);
m_cMnemonic = cMnemonic;
m_lmsoItems = new LinkedList();
}
public MenuSheet (String sCaption,
String sTag) {
this (sCaption, sTag, '\0');
m_lmsoItems = new LinkedList();
}
public MenuSheet (String sCaption) {
this (sCaption, null, '\0');
}
public synchronized void add (MenuSheetObject mso) {
if (m_msMergeParent == null) {
synchronized (getPeerLock()) {
if (mso.isSeparator()) {
if (m_jmPeer != null) {
m_jmPeer.addSeparator();
m_jmPeer.validate();
}
}
else {
if (m_jmPeer != null) {
m_jmPeer.add (mso.getPeer());
m_jmPeer.validate();
}
if (m_jmbBarPeer != null) {
JMenu jm = mso.getMenuPeer();
m_jmbBarPeer.add (jm);
if (HELP_MENU_TAG.equals (mso.getTag())) {
m_jmbBarPeer.setHelpMenu (jm);
}
m_jmbBarPeer.validate();
}
}
}
m_lmsoItems.addLast (mso);
}
else {
m_lmsoItems.addLast (mso);
if (!mso.isSeparator()) {
int nIndex = m_lmsoItems.size() - 1;
for (Iterator i = m_lmsoItems.iterator(); i.hasNext();) {
if (((MenuSheetObject) i.next()).isSeparator()) {
nIndex--;
}
}
m_msMergeParent.mergedAdd (mso, nIndex);
}
}
mso.setParent (this);
mso.setVisible (isVisible());
mso.attach (m_spAttached);
mso.attach (m_pAttached);
}
synchronized void mergedAdd (MenuSheetObject mso, int nIndex) {
if (m_msMergeParent == null) {
synchronized (getPeerLock()) {
if (m_jmbBarPeer != null) {
m_jmbBarPeer.add (mso.getMenuPeer(), nIndex + m_nMergedAt);
m_jmbBarPeer.validate();
}
}
}
else {
m_msMergeParent.mergedAdd (mso, nIndex + m_nMergedAt);
}
}
public MenuSheetObject remove (String sTag) {
MenuSheetObject msoRemove = getTaggedItem (sTag, true);
return ((msoRemove != null)?(remove (msoRemove)):(null));
}
public synchronized MenuSheetObject remove (MenuSheetObject msoRemove) {
int nIndex = m_lmsoItems.indexOf (msoRemove);
if (nIndex == -1) {
return null;
}
if (m_msMergeParent == null) {
synchronized (getPeerLock()) {
if (m_jmPeer != null) {
m_jmPeer.remove (nIndex);
m_jmPeer.validate();
}
if (!msoRemove.isSeparator()) {
if (m_jmbBarPeer != null) {
m_jmbBarPeer.remove (msoRemove.getMenuPeer());
m_jmbBarPeer.validate();
}
}
}
}
else {
m_msMergeParent.mergedRemove (msoRemove);
}
m_lmsoItems.remove (msoRemove);
msoRemove.attach ((SalesPoint) null);
msoRemove.attach ((SaleProcess) null);
msoRemove.setVisible (false);
msoRemove.setParent (null);
return msoRemove;
}
synchronized void mergedRemove (MenuSheetObject mso) {
if (m_msMergeParent == null) {
synchronized (getPeerLock()) {
if ((m_jmbBarPeer != null) && (!mso.isSeparator())) {
m_jmbBarPeer.remove (mso.getMenuPeer());
m_jmbBarPeer.validate();
}
}
}
else {
m_msMergeParent.mergedRemove (mso);
}
}
public Iterator iterator() {
class I implements Iterator {
private Iterator m_i;
public I (Iterator i) {
m_i = i;
}
public boolean hasNext() {
return m_i.hasNext();
}
public Object next() {
return m_i.next();
}
public void remove() {
throw new UnsupportedOperationException ("Please use the MenuSheet's remove() methods, not the iterator's.");
}
}
return new I (m_lmsoItems.iterator());
}
synchronized void setMergeParent (MenuSheet msMergeParent) {
m_msMergeParent = msMergeParent;
}
public final JMenuBar mergePeers (MenuSheet msToMerge, String sBeforeTag) {
synchronized (getPeerLock()) {
boolean fVisible = isVisible();
if (fVisible) {
setVisible (false);
}
if (m_msMerged != null) {
m_msMerged.setMergeParent (null);
}
m_msMerged = msToMerge;
m_sMergedBefore = sBeforeTag;
m_nMergedAt = -1;
if (m_msMerged != null) {
m_msMerged.setMergeParent (this);
}
if (fVisible) {
setVisible (true);
}
if (m_msMergeParent != null) {
return m_msMergeParent.remergePeers();
}
else {
return getMenuBar();
}
}
}
JMenuBar remergePeers() {
return mergePeers (m_msMerged, m_sMergedBefore);
}
public MenuSheetObject getTaggedItem (String sTag, boolean fTopLevelOnly) {
MenuSheetObject msoReturn = super.getTaggedItem (sTag, fTopLevelOnly);
if (msoReturn != null) {
return msoReturn;
}
for (Iterator i = iterator(); i.hasNext();) {
MenuSheetObject mso = (MenuSheetObject) i.next();
if (fTopLevelOnly) {
String sCurTag = mso.getTag();
if (sCurTag.equals (sTag)) {
return mso;
}
}
else {
msoReturn = mso.getTaggedItem (sTag, fTopLevelOnly);
if (msoReturn != null) {
return msoReturn;
}
}
}
return null;
}
public synchronized SalesPoint attach (SalesPoint sp) {
for (Iterator i = iterator(); i.hasNext();) {
((MenuSheetObject) i.next()).attach (sp);
}
return super.attach (sp);
}
public synchronized SaleProcess attach (SaleProcess p) {
for (Iterator i = iterator(); i.hasNext();) {
((MenuSheetObject) i.next()).attach (p);
}
return super.attach (p);
}
public synchronized void setVisible (boolean fVisible) {
super.setVisible (fVisible);
for (Iterator i = iterator(); i.hasNext();) {
((MenuSheetObject) i.next()).setVisible (fVisible);
}
if (m_msMerged != null) {
m_msMerged.setVisible (fVisible);
}
if (!fVisible) {
synchronized (getPeerLock()) {
if (m_jmbBarPeer != null) {
m_jmbBarPeer.removeAll();
m_jmbBarPeer = null;
}
if (m_jmPeer != null) {
m_jmPeer.removeAll();
m_jmPeer = null;
}
}
}
}
public void setCaption (String sCaption) {
super.setCaption (sCaption);
synchronized (getPeerLock()) {
if (m_jmPeer != null) {
m_jmPeer.setText (sCaption);
m_jmPeer.validate();
}
}
}
public void setMnemonic (char cMnemonic) {
m_cMnemonic = cMnemonic;
synchronized (getPeerLock()) {
if (m_jmPeer != null) {
m_jmPeer.setMnemonic (cMnemonic);
m_jmPeer.validate();
}
}
}
public void setDefaultIcon (ImageIcon iiImageIcon) {
setIcon (iiImageIcon, DEFAULT_IMAGE);
}
public void setSelectedIcon (ImageIcon iiImageIcon) {
setIcon (iiImageIcon, SELECTED_IMAGE);
}
public void setDisabledIcon (ImageIcon iiImageIcon) {
setIcon (iiImageIcon, DISABLED_IMAGE);
}
public void setDisabledSelectedIcon (ImageIcon iiImageIcon) {
setIcon (iiImageIcon, DISABLED_SELECTED_IMAGE);
}
public JMenuItem getPeer() {
synchronized (getPeerLock()) {
if (m_jmPeer == null) {
m_jmPeer = new JMenu (getCaption());
if (m_cMnemonic != '\0')
m_jmPeer.setMnemonic (m_cMnemonic);
if (m_aiImages != null) {
if (m_aiImages[DEFAULT_IMAGE] != null)
m_jmPeer.setIcon (new ImageIcon ((Image)m_aiImages[DEFAULT_IMAGE]));
if (m_aiImages[SELECTED_IMAGE] != null)
m_jmPeer.setSelectedIcon (new ImageIcon ((Image)m_aiImages[SELECTED_IMAGE]));
if (m_aiImages[DISABLED_IMAGE] != null)
m_jmPeer.setDisabledIcon (new ImageIcon ((Image)m_aiImages[DISABLED_IMAGE]));
if (m_aiImages[DISABLED_SELECTED_IMAGE] != null)
m_jmPeer.setDisabledSelectedIcon (new ImageIcon ((Image)m_aiImages[DISABLED_SELECTED_IMAGE]));
}
for (Iterator i = iterator(); i.hasNext();) {
MenuSheetObject mso = (MenuSheetObject) i.next();
if (mso.isSeparator()) {
m_jmPeer.addSeparator();
}
else {
m_jmPeer.add (mso.getPeer());
}
}
}
}
return m_jmPeer;
}
public JMenu getMenuPeer() {
return (JMenu)getPeer();
}
public JMenuBar getMenuBar() {
synchronized (getPeerLock()) {
if (m_jmbBarPeer == null) {
boolean fResolvedMerge = false;
m_jmbBarPeer = new JMenuBar();
for (Iterator i = iterator(); i.hasNext();) {
MenuSheetObject mso = (MenuSheetObject) i.next();
if ((!fResolvedMerge) && (m_msMerged != null)) {
if (mso.getTag().equals (m_sMergedBefore)) {
m_nMergedAt = m_jmbBarPeer.getMenuCount();
synchronized (m_msMerged) {
MenuElement[] ajmMerged = m_msMerged.getMenuBar().getSubElements();
m_msMerged.getMenuBar().removeAll();
for (int n = 0; n < ajmMerged.length; n++) {
m_jmbBarPeer.add ((JMenu) ajmMerged[n]);
}
}
fResolvedMerge = true;
}
}
if (!mso.isSeparator()) {
m_jmbBarPeer.add (mso.getMenuPeer());
if (HELP_MENU_TAG.equals (mso.getTag())) {
m_jmbBarPeer.setHelpMenu (mso.getMenuPeer());
}
}
}
if ((!fResolvedMerge) && (m_msMerged != null)) {
m_sMergedBefore = null;
m_nMergedAt = m_jmbBarPeer.getMenuCount();
synchronized (m_msMerged) {
MenuElement[] ajmMerged = m_msMerged.getMenuBar().getSubElements();
m_msMerged.getMenuBar().removeAll();
for (int n = 0; n < ajmMerged.length; n++) {
m_jmbBarPeer.add ((JMenu) ajmMerged[n]);
}
}
}
}
}
return m_jmbBarPeer;
}
public char getMnemonic() {
return m_cMnemonic;
}
public ImageIcon getDefaultIcon() {
return (m_aiImages != null)? new ImageIcon ((Image)m_aiImages[DEFAULT_IMAGE]) : null;
}
public ImageIcon getSelectedIcon() {
return (m_aiImages != null)? new ImageIcon ((Image)m_aiImages[SELECTED_IMAGE]) : null;
}
public ImageIcon getDisabledIcon() {
return (m_aiImages != null)? new ImageIcon ((Image)m_aiImages[DISABLED_IMAGE]) : null;
}
public ImageIcon getDisabledSelectedIcon() {
return (m_aiImages != null)? new ImageIcon ((Image)m_aiImages[DISABLED_SELECTED_IMAGE]) : null;
}
public final static String HELP_MENU_TAG = "__TAG:_HELP_MENU";
private final static int DEFAULT_IMAGE = 0;
private final static int SELECTED_IMAGE = 1;
private final static int DISABLED_IMAGE = 2;
private final static int DISABLED_SELECTED_IMAGE = 3;
}