samer@0: /* samer@0: * Frame.java samer@0: * samer@0: * Copyright (c) 2000, Samer Abdallah, King's College London. samer@0: * All rights reserved. samer@0: * samer@0: * This software is provided AS iS and WITHOUT ANY WARRANTY; samer@0: * without even the implied warranty of MERCHANTABILITY or samer@0: * FITNESS FOR A PARTICULAR PURPOSE. samer@0: */ samer@0: samer@0: package samer.core.util.swing; samer@0: import samer.core.*; samer@0: import javax.swing.*; samer@0: import javax.swing.event.*; samer@0: import java.awt.*; samer@0: import java.awt.event.*; samer@0: import java.io.*; samer@0: samer@0: /** samer@0:
samer@0: This is a useful kind of framed window that uses samer@0: the property set to get window size and position samer@0: and colours. It can also send window closing events samer@0: to the default command handler (see Agency) as samer@0: "exit" actions. samer@0: samer@0:
samer@0: Addition: frame can dispose of itself when last component samer@0: is removed. samer@0: */ samer@0: samer@0: public class InternalFrame extends JInternalFrame samer@0: implements ComponentListener, ActionListener, Shell.Window samer@0: { samer@0: Node node; samer@0: samer@0: public InternalFrame( String nm) { samer@0: super(nm,true,false,true,true); samer@0: setClosable(true); samer@0: setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); samer@0: desktop.add(this); samer@0: node=new Node(nm); samer@0: init(); samer@0: } samer@0: samer@0: public Container container() { return getContentPane(); } samer@0: public void dispose() { super.dispose(); } samer@0: samer@0: public void expose() { samer@0: // this makes sure we don't show a zero-sized window samer@0: if (getBounds().isEmpty()) pack(); samer@0: setVisible(true); samer@0: } samer@0: samer@0: public Node getNode() { return node; } samer@0: samer@0: // ..... Event Listener bits ....... samer@0: samer@0: public void componentHidden(ComponentEvent e) {} samer@0: public void componentShown(ComponentEvent e) {} samer@0: public void componentMoved(ComponentEvent e) { savepos(); } samer@0: public void componentResized(ComponentEvent e) { savepos(); } samer@0: public void actionPerformed(ActionEvent e) { samer@0: if (e.getActionCommand().equals("pack")) pack(); samer@0: } samer@0: samer@0: samer@0: // ........... private bits ............... samer@0: samer@0: private void savepos() { X.store(node.fullNameFor("bounds"),getBounds()); } samer@0: samer@0: private void init() samer@0: { samer@0: Shell.push(node); samer@0: try { samer@0: String tit = Shell.getString("title",null); samer@0: Color bg = Shell.getColor("background",SystemColor.control); samer@0: Color fg = Shell.getColor("foreground",SystemColor.controlText); samer@0: Rectangle pos = X.rect(Shell.datum("bounds"),null); samer@0: // Font font = X.font(Shell.datum("font"),null); samer@0: samer@0: if (tit!=null) setTitle(tit); samer@0: else setTitle(node.fullName()); samer@0: samer@0: if (pos!=null) setBounds(pos); samer@0: // if (font!=null) setFont(font); samer@0: samer@0: setBackground(bg); samer@0: setForeground(fg); samer@0: } finally { Shell.pop(); } samer@0: samer@0: setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); samer@0: samer@0: JPopupMenu p=new JPopupMenu( "Frame"); samer@0: p.add("pack").addActionListener(this); samer@0: samer@0: addComponentListener(this); samer@0: MenuBuilder.addPopup(p,getContentPane()).setBackstop(true); samer@0: } samer@0: samer@0: public void addWindowListener(final WindowListener l) { samer@0: addInternalFrameListener( new InternalFrameAdapter() { samer@0: public void internalFrameClosing(InternalFrameEvent e) { samer@0: l.windowClosing(null); samer@0: } samer@0: } ); samer@0: } samer@0: samer@0: public static void setDesktop(Container c) { desktop=c; } samer@0: private static Container desktop; samer@0: } samer@0: