/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly
*/
// SiteFrame.java
//A simple extension of the JInternalFrame class that contains a list
//object. Elements of the list represent HTML pages for a web site.
//
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JToolBar;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class SiteFrame extends JInternalFrame {
JList nameList;
SiteManager parent;
// Hardcode the pages of our "site" to keep things simple
String[] pages = { "index.html", "page1.html", "page2.html" };
public SiteFrame(String name, SiteManager sm) {
super("Site: " + name, true, true, true);
parent = sm;
setBounds(50, 50, 250, 100);
nameList = new JList(pages);
nameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
nameList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent lse) {
// We know this is the list, so pop up the page.
if (!lse.getValueIsAdjusting()) {
parent.addPageFrame((String) nameList.getSelectedValue());
}
}
});
Container contentPane = getContentPane();
contentPane.add(nameList, BorderLayout.CENTER);
}
}
//A sample Swing application that manages several internal frames. This
//is the main class for working with the SiteFrame and PageFrame classes.
//
class SiteManager extends JFrame {
JLayeredPane desktop;
Vector popups = new Vector();
public SiteManager() {
super("Web Site Manager");
setSize(450, 250);
setDefaultCloseOperation(EXIT_ON_CLOSE);
Container contentPane = getContentPane();
JToolBar jtb = new JToolBar();
jtb.add(new CutAction(this));
jtb.add(new CopyAction(this));
jtb.add(new PasteAction(this));
contentPane.add(jtb, BorderLayout.NORTH);
// Add our LayeredPane object for the internal frames.
desktop = new JDesktopPane();
contentPane.add(desktop, BorderLayout.CENTER);
addSiteFrame("Sample");
}
public static void main(String args[]) {
SiteManager mgr = new SiteManager();
mgr.setVisible(true);
}
// Methods to create our internal frames
public void addSiteFrame(String name) {
SiteFrame sf = new SiteFrame(name, this);
popups.addElement(sf);
desktop.add(sf, new Integer(2)); // Keep sites on top for now
sf.setVisible(true);
}
public void addPageFrame(String name) {
PageFrame pf = new PageFrame(name, this);
desktop.add(pf, new Integer(1));
pf.setVisible(true);
pf.setIconifiable(true);
popups.addElement(pf);
}
public JInternalFrame getCurrentFrame() {
for (int i = 0; i < popups.size(); i++) {
JInternalFrame currentFrame = (JInternalFrame) popups.elementAt(i);
if (currentFrame.isSelected()) {
return currentFrame;
}
}
return null;
}
}
class PasteAction extends AbstractAction {
SiteManager manager;
public PasteAction(SiteManager sm) {
super("", new ImageIcon("paste.gif"));
manager = sm;
}
public void actionPerformed(ActionEvent ae) {
JInternalFrame currentFrame = manager.getCurrentFrame();
if (currentFrame == null) {
return;
}
// cannot cut or paste sites
if (currentFrame instanceof SiteFrame) {
return;
}
((PageFrame) currentFrame).pasteText();
}
}
class PageFrame extends JInternalFrame implements ActionListener {
SiteManager parent;
String filename;
JTextArea ta;
public PageFrame(String name, SiteManager sm) {
super("Page: " + name, true, true, true, true);
parent = sm;
setBounds(50, 50, 300, 150);
Container contentPane = getContentPane();
// Create a text area to display the contents of our file in
// and stick it in a scrollable pane so we can see everything
ta = new JTextArea();
JScrollPane jsp = new JScrollPane(ta);
contentPane.add(jsp, BorderLayout.CENTER);
JMenuBar jmb = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem saveItem = new JMenuItem("Save");
saveItem.addActionListener(this);
fileMenu.add(saveItem);
jmb.add(fileMenu);
setJMenuBar(jmb);
filename = name;
loadContent();
}
public void actionPerformed(ActionEvent ae) {
// Can only be the save menu
saveContent();
}
public void loadContent() {
try {
FileReader fr = new FileReader(filename);
ta.read(fr, null);
fr.close();
} catch (Exception e) {
System.err.println("Could not load page: " + filename);
}
}
public void saveContent() {
try {
FileWriter fw = new FileWriter(filename);
ta.write(fw);
fw.close();
} catch (Exception e) {
System.err.println("Could not save page: " + filename);
}
}
public void cutText() {
ta.cut();
}
public void copyText() {
ta.copy();
}
public void pasteText() {
ta.paste();
}
}
class CutAction extends AbstractAction {
SiteManager manager;
public CutAction(SiteManager sm) {
super("", new ImageIcon("cut.gif"));
manager = sm;
}
public void actionPerformed(ActionEvent ae) {
JInternalFrame currentFrame = manager.getCurrentFrame();
if (currentFrame == null) {
return;
}
// cannot cut or paste sites
if (currentFrame instanceof SiteFrame) {
return;
}
((PageFrame) currentFrame).cutText();
}
}
class CopyAction extends AbstractAction {
SiteManager manager;
public CopyAction(SiteManager sm) {
super("", new ImageIcon("copy.gif"));
manager = sm;
}
public void actionPerformed(ActionEvent ae) {
JInternalFrame currentFrame = manager.getCurrentFrame();
if (currentFrame == null) {
return;
}
// can't cut or paste sites
if (currentFrame instanceof SiteFrame) {
return;
}
((PageFrame) currentFrame).copyText();
}
}