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 java.awt.*; samer@0: import java.awt.event.*; samer@0: import javax.swing.*; 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 Frame extends JFrame samer@0: implements ComponentListener, ActionListener, Shell.Window samer@0: { samer@0: Node node; samer@0: samer@0: public Frame() { this("frame"); } samer@0: public Frame( String nm) { samer@0: // remove "." from start of name samer@0: if (nm.startsWith(".")) nm=nm.substring(1); samer@0: node=new Node(nm); 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: // override pack to stop window being bigger than screen samer@0: public void pack() { samer@0: super.pack(); samer@0: samer@0: Dimension d=getToolkit().getScreenSize(); samer@0: Rectangle b=getBounds(); samer@0: boolean f=false; samer@0: if (b.y+b.height>d.height) { samer@0: b.height=d.height-b.y; samer@0: b.width+=16; // this is to make room for vertical scroll bar (hack - sorry) samer@0: f=true; samer@0: } samer@0: if (b.x+b.width>d.width) { b.width=d.width-b.x; f=true; } samer@0: if (f) setBounds(b); 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 { samer@0: // remove "." from start of name samer@0: String n=node.fullName(); samer@0: if (n.startsWith(".")) n=n.substring(1); samer@0: // remove ".window" from end of name samer@0: if (n.endsWith(".window")) n=n.substring(0,n.length()-7); samer@0: setTitle(n); samer@0: } 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: samer@0: } samer@0: