/* ===========================================================
* TradeManager : a application to trade strategies for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Project Info: org.trade
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Oracle, Inc.
* in the United States and other countries.]
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Original Author: Simon Allen;
* Contributor(s): -;
*
* Changes
* -------
*
*/
package org.trade.ui.base;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import javax.swing.BorderFactory;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.trade.ui.widget.Clock;
/**
*
* @version $Id: MDIAppPanel,v 1.28 2002/01/24 18:13:18 simon Exp $
* @author Simon Allen
*/
public abstract class MDIAppPanel extends BasePanel
implements ActionListener, VetoableChangeListener, PropertyChangeListener {
/**
*
*/
private static final long serialVersionUID = 8405644422808736326L;
private final static Logger _log = LoggerFactory.getLogger(MDIAppPanel.class);
private final ExtendedDesktopPane m_desktopPane = new ExtendedDesktopPane();
protected JInternalFrame m_internalFrame = null;
private JPanel m_menuPanel = new JPanel();
public String m_title = null;
private static final int layer = 1;
private static int frameCount = 0;
protected JInternalFrame currentIFrame = null;
private PrintController m_printJob = new PrintController();
/**
* Constructor for MDIAppPanel.
*
* @param frame
* Frame
*/
public MDIAppPanel(Frame frame) {
try {
this.setLayout(new BorderLayout());
m_menuPanel.setLayout(new BorderLayout());
m_desktopPane.setDesktopManager(new ExtendedDesktopManager(m_desktopPane));
JPanel jPanel1 = new JPanel(new BorderLayout());
JPanel jPanelProgressBar = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JProgressBar progressBar = new JProgressBar(0, 0);
jPanelProgressBar.add(progressBar);
JPanel jPanelClock = new JPanel(new FlowLayout(FlowLayout.LEFT));
Clock clock = new Clock();
jPanelClock.add(clock);
JPanel jPanelStatus = new JPanel(new GridLayout());
JTextField jTextFieldStatus = new JTextField();
jTextFieldStatus.setRequestFocusEnabled(false);
jTextFieldStatus.setMargin(new Insets(5, 5, 5, 5));
jTextFieldStatus.setBackground(Color.white);
jTextFieldStatus.setBorder(BorderFactory.createLoweredBevelBorder());
jPanelStatus.add(jTextFieldStatus);
JPanel jPanel3 = new JPanel(new BorderLayout());
jPanel3.add(jPanelClock, BorderLayout.WEST);
jPanel3.add(jPanelProgressBar, BorderLayout.EAST);
jPanel3.add(jPanelStatus, BorderLayout.CENTER);
JPanel jPanel4 = new JPanel(new BorderLayout());
jPanel4.add(m_desktopPane, BorderLayout.CENTER);
jPanel1.add(jPanel4, BorderLayout.CENTER);
jPanel1.add(jPanel3, BorderLayout.SOUTH);
jPanel1.add(m_menuPanel, BorderLayout.NORTH);
this.add(jPanel1, BorderLayout.CENTER);
this.setStatusBar(jTextFieldStatus);
this.setProgressBar(progressBar);
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* Method setMenu.
*
* @param menu
* BasePanelMenu
*/
public void setMenu(BasePanelMenu menu) {
m_menuPanel.removeAll();
m_menuPanel.add(menu, BorderLayout.NORTH);
super.setMenu(menu);
}
/**
* Method addInternalFrame.
*
* @param title
* String
* @param innerPanel
* BasePanel
*/
public void addInternalFrame(String title, final BasePanel innerPanel) {
currentIFrame = new JInternalFrame(title, true, true, true, true);
try {
currentIFrame.setFrameIcon(ImageBuilder.getImageIcon("trade.gif"));
} catch (Exception ex) {
_log.error("Could not get Image trade.gif Msg: " + ex.getMessage(), ex);
}
frameCount++;
// Increment the tile in case the same frame is open more than once
title = title + frameCount;
currentIFrame.setTitle(title);
currentIFrame.setPreferredSize(innerPanel.getPreferredSize());
// currentIFrame.setBounds(20 * (frameCount % 10), 20 * (frameCount %
// 10),
// currentIFrame.getPreferredSize().width,
// currentIFrame.getPreferredSize().height);
currentIFrame.setContentPane(new MyPanel(layer, frameCount, innerPanel));
m_desktopPane.add(currentIFrame, new Integer(layer));
try {
currentIFrame.setSelected(true);
currentIFrame.setMaximum(true);
} catch (PropertyVetoException e) {
_log.error("Could not open JInternalFrame", e);
}
currentIFrame.pack();
currentIFrame.show();
setComponentSize(currentIFrame);
currentIFrame.addPropertyChangeListener(this);
currentIFrame.addVetoableChangeListener(this);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
innerPanel.doWindowOpen();
}
});
}
public void doWindowOpen() {
}
public void doWindowClose() {
doExit();
}
public void doWindowActivated() {
}
public void doLFMetal() {
try {
UIManager.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
SwingUtilities.updateComponentTreeUI(getFrame());
} catch (Exception eMetal) {
_log.error("Could not load LookAndFeel: " + eMetal);
}
}
public void doLFWindows() {
try {
// UIManager
// .setLookAndFeel(new
// javax.swing.plaf.windows.WindowsLookAndFeel());
SwingUtilities.updateComponentTreeUI(getFrame());
} catch (Exception eMetal) {
_log.error("Could not load LookAndFeel: " + eMetal);
}
}
public void doLFMotif() {
try {
// UIManager
// .setLookAndFeel(new
// com.sun.java.swing.plaf.motif.MotifLookAndFeel());
UIManager.put("swing.boldMetal", Boolean.FALSE);
SwingUtilities.updateComponentTreeUI(getFrame());
} catch (Exception eMetal) {
_log.error("Could not load LookAndFeel: " + eMetal);
}
}
public void doExit() {
System.exit(0);
}
public void doHelp() {
}
public void doPrint() {
}
/**
* Method printComponent.
*
* @param comp
* Component
*/
protected void printComponent(Component comp) {
m_printJob.printComponent(getFrame(), comp, null);
}
public void doClose() {
try {
currentIFrame.setClosed(true);
} catch (PropertyVetoException eClose) {
// Do nothing
}
}
public void doCloseAll() {
JInternalFrame[] frames = m_desktopPane.getAllFrames();
for (JInternalFrame frame : frames) {
try {
frame.setClosed(true);
} catch (PropertyVetoException eClose) {
// Do nothing
}
}
}
public void doCascadeAll() {
m_desktopPane.cascadeAll();
}
public void doTileAll() {
m_desktopPane.tileAll();
}
public void doCascade() {
m_desktopPane.cascade(currentIFrame);
}
/**
* Method actionPerformed.
*
* @param evt
* ActionEvent
* @see java.awt.event.ActionListener#actionPerformed(ActionEvent)
*/
public void actionPerformed(ActionEvent evt) {
JMenuItem mi = (JMenuItem) evt.getSource();
if (mi.getActionCommand().equals("Cascade")) {
doCascade();
} else if (mi.getActionCommand().equals("Cascade All")) {
doCascadeAll();
} else if (mi.getActionCommand().equals("Tile All")) {
doTileAll();
} else if (mi.getActionCommand().equals("Close")) {
doClose();
}
this.repaint();
}
/**
* Method getSelectPanel.
*
* @return BasePanel
*/
public BasePanel getSelectPanel() {
return ((MyPanel) currentIFrame.getContentPane()).getInnerPanel();
}
/**
* Method propertyChange.
*
* @param epc
* PropertyChangeEvent
* @see java.beans.PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent epc) {
if (epc.getSource() instanceof JInternalFrame) {
String name = epc.getPropertyName();
Object value = epc.getNewValue();
if (name.equals(JInternalFrame.IS_CLOSED_PROPERTY) && ((Boolean) value == Boolean.TRUE)) {
currentIFrame = (JInternalFrame) epc.getSource();
((BasePanel) currentIFrame.getContentPane()).doWindowClose();
// Remove it from the hastable and all listeners
currentIFrame.removePropertyChangeListener(this);
currentIFrame.removeVetoableChangeListener(this);
} else if (name.equals(JInternalFrame.IS_SELECTED_PROPERTY) && ((Boolean) value == Boolean.TRUE)) {
// switch current frame
((BasePanel) currentIFrame.getContentPane()).setSelected(false);
currentIFrame = (JInternalFrame) epc.getSource();
((BasePanel) currentIFrame.getContentPane()).clearStatusBarMessage();
((BasePanel) currentIFrame.getContentPane()).setSelected(true);
((BasePanel) currentIFrame.getContentPane()).doWindowActivated();
}
}
}
/**
* Method vetoableChange.
*
* @param evc
* PropertyChangeEvent
* @throws PropertyVetoException
* @see java.beans.VetoableChangeListener#vetoableChange(PropertyChangeEvent)
*/
public void vetoableChange(PropertyChangeEvent evc) throws PropertyVetoException {
if (evc.getSource() instanceof JInternalFrame) {
currentIFrame = (JInternalFrame) evc.getSource();
String name = evc.getPropertyName();
Object value = evc.getNewValue();
if (name.equals(JInternalFrame.IS_CLOSED_PROPERTY) && ((Boolean) value == Boolean.TRUE)) {
}
}
}
/**
* Method setComponentSize.
*
* @param component
* Component
*/
private void setComponentSize(Component component) {
if ((20 + component.getHeight()) > this.getVisibleRect().height) {
component.setSize(new Dimension(component.getSize().width, (this.getVisibleRect().height - 20)));
}
if ((20 + component.getWidth()) > this.getVisibleRect().width) {
component.setSize(new Dimension((this.getVisibleRect().width - 20), component.getSize().height));
}
component.setSize(new Dimension(this.getVisibleRect().width, this.getVisibleRect().height));
}
/**
*/
class MyPanel extends BasePanel {
/**
*
*/
private static final long serialVersionUID = 1746964092801489754L;
BasePanel pane = null;
public MyPanel() {
super();
}
/**
* Constructor for MyPanel.
*
* @param layer
* int
* @param count
* int
*/
public MyPanel(int layer, int count) {
super();
pane = new MyPanel();
JLabel layerLabel = new JLabel("Layer " + layer);
layerLabel.setOpaque(false);
add(pane, BorderLayout.CENTER);
}
/**
* Constructor for MyPanel.
*
* @param layer
* int
* @param count
* int
* @param innerPanel
* BasePanel
*/
public MyPanel(int layer, int count, BasePanel innerPanel) {
super();
pane = innerPanel;
// pane.setOpaque(false);
this.setLayout(new BorderLayout());
JLabel layerLabel = new JLabel("Layer " + layer);
layerLabel.setOpaque(false);
add(pane, BorderLayout.CENTER);
}
/**
* Method getInnerPanel.
*
* @return BasePanel
*/
public BasePanel getInnerPanel() {
return pane;
}
public void doWindowClose() {
}
public void doWindowActivated() {
}
/**
* Method doWindowDeActivated.
*
* @return boolean
*/
public boolean doWindowDeActivated() {
return true;
}
public void doWindowOpen() {
}
}
}