package sale.multiwindow;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.*;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Rectangle;
import java.util.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.io.*;
import sale.*;
public class MultiWindow extends JFrame implements ChangeListener, PropertyChangeListener {
private int m_nHandleCount = 0;
private int m_nViewMode;
private int m_nArrangement = OVERLAPPED;
private Map m_mpmwhHandles = new HashMap();
private List m_lmwhVisibles = new LinkedList();
private MenuSheet m_msCurrentMenuSheet;
private Integer m_iSelectedFrame;
private MenuSheetItem m_msiToggleViewMode = null;
private Vector m_vcActions = new Vector();
public static abstract class MultiWindowAction implements sale.Action {
private void writeObject (ObjectOutputStream oos) throws IOException {
util.Debug.print ("Writing sale.multiwindow.MultiWindow$MultiWindowAction.", -1);
oos.defaultWriteObject();
util.Debug.print ("Done writing sale.multiwindow.MultiWindow$MultiWindowAction.", -1);
}
protected transient MultiWindow m_mwReference;
public MultiWindowAction (MultiWindow mwReference) {
super();
m_mwReference = mwReference;
m_mwReference.registerAction (this);
}
}
private void writeObject (ObjectOutputStream oos) throws IOException {
throw new java.io.NotSerializableException ("sale.multiwindow.MultiWindow");
}
private void readObject (ObjectInputStream ois) throws IOException, ClassNotFoundException {
throw new java.io.NotSerializableException ("sale.multiwindow.MultiWindow");
}
public MultiWindow() {
this ("", MULTIFRAME);
}
public MultiWindow(String sTitle) {
this (sTitle, MULTIFRAME);
}
public MultiWindow(String sTitle, int nViewMode) {
super (sTitle);
m_nViewMode = NONE;
if (nViewMode == MULTIFRAME) {
transformToPane();
}
else {
transformToTab();
}
setDefaultMenuSheet();
pack();
}
void registerAction (MultiWindowAction mwa) {
m_vcActions.add (mwa);
}
public void save (ObjectOutputStream oos) throws IOException {
oos.writeInt (m_nHandleCount);
oos.writeInt (m_nViewMode);
oos.writeInt (m_nArrangement);
oos.writeObject (m_mpmwhHandles);
oos.writeObject (m_lmwhVisibles);
oos.writeObject (m_msCurrentMenuSheet);
oos.writeObject (m_iSelectedFrame);
oos.writeObject (m_msiToggleViewMode);
oos.writeObject (m_vcActions);
oos.writeObject (getTitle());
oos.writeObject (getBounds());
oos.writeBoolean (isVisible());
}
public void load (ObjectInputStream ois) throws IOException, ClassNotFoundException {
m_nHandleCount = ois.readInt();
final int nViewMode = ois.readInt();
m_nArrangement = ois.readInt();
m_mpmwhHandles = (Map) ois.readObject();
m_lmwhVisibles = (List) ois.readObject();
m_msCurrentMenuSheet = (MenuSheet) ois.readObject();
m_iSelectedFrame = (Integer) ois.readObject();
m_msiToggleViewMode = (MenuSheetItem) ois.readObject();
m_vcActions = (Vector) ois.readObject();
setTitle ((String) ois.readObject());
try {
for (Iterator i = m_vcActions.iterator(); i.hasNext();) {
((MultiWindowAction) i.next()).m_mwReference = this;
}
for (Iterator i = m_mpmwhHandles.values().iterator(); i.hasNext();) {
MultiWindowHandle mwh = (MultiWindowHandle) i.next();
mwh.setOwner (this);
mwh.getFrame().addPropertyChangeListener (this);
}
}
catch (Throwable t) {}
final Rectangle rcBounds = (Rectangle) ois.readObject();
final boolean fVisible = ois.readBoolean();
ois.registerValidation (new ObjectInputValidation() {
public void validateObject()
throws InvalidObjectException {
try {
m_nViewMode = NONE;
setViewMode (nViewMode);
}
catch (Throwable t) {
throw new InvalidObjectException (t.toString());
}
setBounds (rcBounds);
setVisible (fVisible);
validate();
}
},
OIV.MULTIWINDOW_PRIO);
}
public MenuSheet getMultiWindowMenuSheet() {
MenuSheet msMWMenu = new MenuSheet("MultiWindow", MULTIWINDOW_MENU_TAG);
m_msiToggleViewMode = new MenuSheetItem (getToggleViewMenuText(),
TOGGLE_VIEW_TAG,
new ToggleViewModeAction (this));
msMWMenu.add (m_msiToggleViewMode);
msMWMenu.add (new MenuSheetSeparator (SEPARATOR_TAG));
msMWMenu.add (new MenuSheetItem ("Cascade", CASCADE_TAG, new CascadeAction (this)));
msMWMenu.add (new MenuSheetItem ("Tile horizontally", TILE_HORIZ_TAG, new TileHorizontallyAction (this)));
msMWMenu.add (new MenuSheetItem ("Tile vertically", TILE_VERT_TAG, new TileVerticallyAction (this)));
return msMWMenu;
}
private String getToggleViewMenuText() {
return (s_sToggleViewPrefix +
((m_nViewMode == MULTIFRAME)?
(s_asViewModeTexts[TABBED]):
(s_asViewModeTexts[MULTIFRAME])));
}
public void setDefaultMenuSheet() {
MenuSheet msContainer = new MenuSheet ("MWMenuBar", "__TAG:_MWMENUBAR_");
msContainer.add (getMultiWindowMenuSheet());
setMenuSheet (msContainer);
}
public void setMenuSheet (MenuSheet msNewMenuSheet) {
if (m_msCurrentMenuSheet != null) {
m_msCurrentMenuSheet.mergePeers (null, null);
m_msCurrentMenuSheet.setVisible (false);
}
m_msCurrentMenuSheet = msNewMenuSheet;
if (m_msCurrentMenuSheet != null) {
JMenuBar jmbNewMB = msNewMenuSheet.getMenuBar();
m_msCurrentMenuSheet.setVisible (true);
setJMenuBar (jmbNewMB);
}
else {
setJMenuBar (null);
}
if (m_nViewMode == TABBED) {
stateChanged (new ChangeEvent (getContentPane().getComponents()[0]));
}
validate();
}
public MenuSheet getCurrentMenuSheet() {
return m_msCurrentMenuSheet;
}
public int getViewMode() {
return m_nViewMode;
}
public void setViewMode (int nViewMode) {
if (m_nViewMode != nViewMode) {
if (nViewMode == MULTIFRAME) {
transformToPane ();
}
if (nViewMode == TABBED) {
transformToTab ();
}
}
if (m_msiToggleViewMode != null) {
m_msiToggleViewMode.setCaption (getToggleViewMenuText());
}
}
public void arrangeFrames (int nArrangement) {
if (getHandleCount() > 0) {
int x = 0;
int y = 0;
int nWidth = getContentPane().getWidth();
int nHeight = getContentPane().getHeight();
switch (nArrangement) {
case OVERLAPPED:
MultiWindowHandle mwhSelected = (MultiWindowHandle) m_mpmwhHandles.get (m_iSelectedFrame);
for (Iterator i = m_lmwhVisibles.iterator(); i.hasNext();) {
MultiWindowHandle mwh = (MultiWindowHandle) i.next();
if (mwh == mwhSelected) {
continue;
}
JInternalFrame internal = (JInternalFrame) mwh.getFrame();
internal.setSize (internal.getPreferredSize());
internal.setLocation (x, y);
internal.moveToFront();
x += 30;
y += 30;
if ((x > getWidth() - 100) ||
(y > getHeight() - 100)) {
x = 0; y = 0;
}
}
if (mwhSelected != null) {
JInternalFrame internal = (JInternalFrame) mwhSelected.getFrame();
internal.setSize (internal.getPreferredSize());
internal.setLocation (x, y);
internal.moveToFront();
}
break;
case TILED_HORIZONTALLY:
nWidth /= getVisibleHandleCount();
for (Iterator i = m_lmwhVisibles.iterator(); i.hasNext();) {
MultiWindowHandle mwh = (MultiWindowHandle) i.next();
JInternalFrame internal = (JInternalFrame) mwh.getFrame();
internal.setBounds (x, 0, nWidth, nHeight);
x += nWidth;
}
break;
case TILED_VERTICALLY:
nHeight /= getVisibleHandleCount();
for (Iterator i = m_lmwhVisibles.iterator(); i.hasNext();) {
MultiWindowHandle mwh = (MultiWindowHandle) i.next();
JInternalFrame internal = (JInternalFrame) mwh.getFrame();
internal.setBounds (0, y, nWidth, nHeight);
y += nHeight;
}
}
validate();
m_nArrangement = nArrangement;
}
}
public Display getNewHandle() {
MultiWindowHandle mwhNew = new MultiWindowHandle (new Integer (m_nHandleCount++));
mwhNew.getFrame().addPropertyChangeListener (this);
mwhNew.setOwner (this);
m_mpmwhHandles.put (mwhNew.getID(), mwhNew);
return mwhNew;
}
public void makeVisible (List lmwhHandles,
Display dSelected) {
m_lmwhVisibles = new ArrayList (lmwhHandles);
if (m_lmwhVisibles.contains (dSelected)) {
m_iSelectedFrame = ((MultiWindowHandle) dSelected).getID();
}
else {
if (m_lmwhVisibles.size() > 0) {
m_iSelectedFrame = ((MultiWindowHandle) m_lmwhVisibles.get (0)).getID();
}
else {
m_iSelectedFrame = new Integer (-1);
}
}
switch (m_nViewMode) {
case MULTIFRAME:
transformToPane();
break;
case TABBED:
transformToTab();
break;
}
}
public void makeVisible (Display d) {
MultiWindowHandle mwh = (MultiWindowHandle) d;
if (m_mpmwhHandles.get (mwh.getID()) != mwh) {
return;
}
if (!m_lmwhVisibles.contains (mwh)) {
m_lmwhVisibles.add (mwh);
if (m_lmwhVisibles.size() == 1) {
m_iSelectedFrame = mwh.getID();
}
switch (m_nViewMode) {
case MULTIFRAME:
JDesktopPane jdp = (JDesktopPane) getContentPane();
mwh.transformToPane();
jdp.add (mwh.getFrame(), mwh.getID().intValue());
if (m_lmwhVisibles.size() == 1) {
jdp.moveToFront (mwh.getFrame());
mwh.getFrame().requestFocus();
try {
mwh.getFrame().setSelected (true);
}
catch (java.beans.PropertyVetoException e) {}
}
break;
case TABBED:
JTabbedPane jtp = (JTabbedPane) getContentPane().getComponents()[0];
mwh.transformToTab();
jtp.add (mwh.getContentPane(), mwh.getFrame().getTitle());
if (m_lmwhVisibles.size() == 1) {
jtp.setSelectedComponent (mwh.getContentPane());
mwh.getContentPane().requestFocus();
}
}
}
}
public void makeInVisible (Display d) {
MultiWindowHandle mwh = (MultiWindowHandle) d;
if (m_lmwhVisibles.contains (mwh)) {
m_lmwhVisibles.remove (mwh);
if (m_iSelectedFrame == mwh.getID()) {
if (m_lmwhVisibles.size() >= 1) {
m_iSelectedFrame = ((MultiWindowHandle) m_lmwhVisibles.get (0)).getID();
}
else {
m_iSelectedFrame = new Integer (-1);
}
}
switch (m_nViewMode) {
case MULTIFRAME:
transformToPane();
break;
case TABBED:
transformToTab();
}
}
}
public Iterator iterator() {
return m_mpmwhHandles.values().iterator();
}
public int getHandleCount() {
return m_mpmwhHandles.size();
}
public int getVisibleHandleCount() {
return m_lmwhVisibles.size();
}
public Display getSelectedDisplay() {
return (Display) m_mpmwhHandles.get (m_iSelectedFrame);
}
public void setSelectedDisplay (Display d) {
if (m_lmwhVisibles.contains (d)) {
MultiWindowHandle mwh = (MultiWindowHandle) d;
m_iSelectedFrame = mwh.getID();
switch (m_nViewMode) {
case MULTIFRAME:
JDesktopPane jdp = (JDesktopPane) getContentPane();
jdp.moveToFront (mwh.getFrame());
mwh.getFrame().requestFocus();
try {
mwh.getFrame().setSelected (true);
}
catch (java.beans.PropertyVetoException e) {}
break;
case TABBED:
JTabbedPane jtp = (JTabbedPane) getContentPane().getComponents()[0];
jtp.setSelectedComponent (mwh.getContentPane());
}
}
}
protected void transformToPane() {
if (m_nViewMode == MULTIFRAME) {
JDesktopPane jdp = (JDesktopPane) getContentPane();
jdp.removeAll();
}
m_nViewMode = MULTIFRAME;
JDesktopPane jDeskField = new JDesktopPane();
jDeskField.setOpaque (true);
jDeskField.setPreferredSize (getContentPane().getSize());
setContentPane (jDeskField);
setJMenuBar (m_msCurrentMenuSheet.mergePeers (null, null));
if (getHandleCount() > 0) {
for (Iterator i = m_lmwhVisibles.iterator(); i.hasNext();) {
MultiWindowHandle mwh = (MultiWindowHandle) i.next();
mwh.transformToPane();
JInternalFrame internal = (JInternalFrame) mwh.getFrame();
jDeskField.add (internal);
internal.moveToFront();
}
MultiWindowHandle mwhSelected = (MultiWindowHandle) m_mpmwhHandles.get (m_iSelectedFrame);
if (mwhSelected != null) {
mwhSelected.getFrame().moveToFront();
mwhSelected.getContentPane().requestFocus();
try {
mwhSelected.getFrame().setSelected (true);
}
catch (java.beans.PropertyVetoException e) {}
}
}
pack();
}
protected void transformToTab() {
if (m_nViewMode == TABBED) {
JTabbedPane jtp = (JTabbedPane) getContentPane().getComponents()[0];
jtp.removeChangeListener (this);
jtp.removeAll();
}
Dimension d = getContentPane().getSize();
JPanel jp = new JPanel();
jp.setPreferredSize (d);
jp.setLayout (new BorderLayout());
setContentPane(jp);
JTabbedPane jtp = new JTabbedPane();
if (getHandleCount() > 0) {
for (Iterator i = m_lmwhVisibles.iterator(); i.hasNext();) {
MultiWindowHandle mwh = (MultiWindowHandle) i.next();
mwh.transformToTab();
jtp.add (mwh.getContentPane(), mwh.getFrame().getTitle());
}
}
m_nViewMode = TABBED;
jtp.setPreferredSize (d);
jtp.addChangeListener (this);
jp.add (jtp);
MultiWindowHandle mwhSelected = (MultiWindowHandle) m_mpmwhHandles.get (m_iSelectedFrame);
if (mwhSelected != null) {
jtp.setSelectedComponent (mwhSelected.getContentPane());
}
stateChanged (new ChangeEvent (jtp));
pack();
}
public void stateChanged (ChangeEvent evt) {
if (m_nViewMode == TABBED) {
MenuSheet msTab = null;
m_iSelectedFrame = new Integer(-1);
Component cmpTab = ((JTabbedPane) evt.getSource()).getSelectedComponent();
for (Iterator i = m_mpmwhHandles.values().iterator(); i.hasNext() && (msTab == null);) {
MultiWindowHandle mwh = (MultiWindowHandle) i.next();
if (mwh.getContentPane() == cmpTab) {
msTab = mwh.getMenuSheet();
m_iSelectedFrame = mwh.getID();
}
}
if (msTab == null) {
if (m_msCurrentMenuSheet != null) {
setJMenuBar (m_msCurrentMenuSheet.mergePeers (null, null));
}
else {
setJMenuBar (null);
}
}
else {
if (m_msCurrentMenuSheet != null) {
setJMenuBar(m_msCurrentMenuSheet.mergePeers (msTab, MULTIWINDOW_MENU_TAG));
}
else {
setJMenuBar (msTab.getMenuBar());
}
}
if (m_msCurrentMenuSheet != null) {
m_msCurrentMenuSheet.setVisible (true);
}
if (msTab != null) {
msTab.setVisible (true);
}
validate();
}
}
public void propertyChange (PropertyChangeEvent e) {
if ((e.getSource() instanceof JInternalFrame) &&
(e.getPropertyName().equals ("maximum")) &&
(((Boolean) e.getNewValue()).booleanValue())) {
setViewMode (TABBED);
try {
((JInternalFrame) e.getSource()).setMaximum (false);
}
catch (java.beans.PropertyVetoException ex) {}
}
}
void onMenuSheetChanged (MultiWindowHandle mwh, MenuSheet msNewMenuSheet) {
if (m_nViewMode == TABBED) {
if (mwh.getID() == m_iSelectedFrame) {
setJMenuBar (m_msCurrentMenuSheet.mergePeers (msNewMenuSheet, MULTIWINDOW_MENU_TAG));
validate();
}
}
else mwh.getFrame().pack();
}
void onDisplayCaptionChanged (MultiWindowHandle mwh, String sNewCaption) {
if (m_nViewMode == TABBED) {
if (m_lmwhVisibles.contains (mwh)) {
JTabbedPane jtp = ((JTabbedPane) getContentPane().getComponents()[0]);
jtp.setTitleAt (jtp.indexOfComponent (mwh.getContentPane()), sNewCaption);
validate();
}
}
}
void onComponentChanged (MultiWindowHandle mwh, JComponent jcmpNewComponent) {
if (m_nViewMode == TABBED) {
((JTabbedPane) getContentPane().getComponents()[0]).validate();
}
else mwh.getFrame().pack();
}
void onDisplayFocusGained (MultiWindowHandle mwh, Integer intID) {
m_iSelectedFrame = intID;
}
void onDisplayClosing (MultiWindowHandle mwh) {
makeInVisible (mwh);
mwh.getFrame().removePropertyChangeListener (this);
m_mpmwhHandles.remove (mwh.getID());
}
public void closeDisplay (Display dWhich) {
((MultiWindowHandle) dWhich).closeDisplay();
}
public static final int MULTIFRAME = 0;
public static final int TABBED = 1;
private static final int NONE = -1;
public static final int OVERLAPPED = 1;
public static final int TILED_VERTICALLY = 2;
public static final int TILED_HORIZONTALLY = 3;
public static final String MULTIWINDOW_MENU_TAG = "__TAG:_MULTIWINDOW_MENU_";
public static final String TOGGLE_VIEW_TAG = "__TAG:_MULTIWINDOW_TOGGLE_VIEW_";
public static final String SEPARATOR_TAG = "__TAG:_MULTIWINDOW_SEPARATOR_";
public static final String CASCADE_TAG = "__TAG:_MULTIWINDOW_CASCADE_";
public static final String TILE_HORIZ_TAG = "__TAG:_MULTIWINDOW_TILE_HORIZ_";
public static final String TILE_VERT_TAG = "__TAG:_MULTIWINDOW_TILE_VERT_";
public static String s_sToggleViewPrefix = "Toggle View ";
public static String[] s_asViewModeTexts = {"(MULTIFRAME)", "(TABBED)"};
}
class ToggleViewModeAction extends MultiWindow.MultiWindowAction {
public ToggleViewModeAction (MultiWindow owner) {
super (owner);
}
public void doAction (SaleProcess p, SalesPoint sp) {
m_mwReference.setViewMode ((m_mwReference.getViewMode() == MultiWindow.MULTIFRAME)?(MultiWindow.TABBED):(MultiWindow.MULTIFRAME));
}
}
class CascadeAction extends MultiWindow.MultiWindowAction {
public CascadeAction (MultiWindow owner) {
super (owner);
}
public void doAction (SaleProcess p, SalesPoint sp) {
if (m_mwReference.getViewMode() == MultiWindow.TABBED) {
m_mwReference.setViewMode (MultiWindow.MULTIFRAME);
}
m_mwReference.arrangeFrames(MultiWindow.OVERLAPPED);
}
}
class TileHorizontallyAction extends MultiWindow.MultiWindowAction {
public TileHorizontallyAction (MultiWindow owner) {
super (owner);
}
public void doAction (SaleProcess p, SalesPoint sp) {
if (m_mwReference.getViewMode() == MultiWindow.TABBED) {
m_mwReference.setViewMode (MultiWindow.MULTIFRAME);
}
m_mwReference.arrangeFrames(MultiWindow.TILED_HORIZONTALLY);
}
}
class TileVerticallyAction extends MultiWindow.MultiWindowAction {
public TileVerticallyAction (MultiWindow owner) {
super (owner);
}
public void doAction (SaleProcess p, SalesPoint sp) {
if (m_mwReference.getViewMode() == MultiWindow.TABBED) {
m_mwReference.setViewMode (MultiWindow.MULTIFRAME);
}
m_mwReference.arrangeFrames(MultiWindow.TILED_VERTICALLY);
}
}