samer@0
|
1 /*
|
samer@0
|
2 * Frame.java
|
samer@0
|
3 *
|
samer@0
|
4 * Copyright (c) 2000, Samer Abdallah, King's College London.
|
samer@0
|
5 * All rights reserved.
|
samer@0
|
6 *
|
samer@0
|
7 * This software is provided AS iS and WITHOUT ANY WARRANTY;
|
samer@0
|
8 * without even the implied warranty of MERCHANTABILITY or
|
samer@0
|
9 * FITNESS FOR A PARTICULAR PURPOSE.
|
samer@0
|
10 */
|
samer@0
|
11
|
samer@0
|
12 package samer.core.util.swing;
|
samer@0
|
13 import samer.core.*;
|
samer@0
|
14 import java.awt.*;
|
samer@0
|
15 import java.awt.event.*;
|
samer@0
|
16 import javax.swing.*;
|
samer@0
|
17
|
samer@0
|
18 /**
|
samer@0
|
19 <p>
|
samer@0
|
20 This is a useful kind of framed window that uses
|
samer@0
|
21 the property set to get window size and position
|
samer@0
|
22 and colours. It can also send window closing events
|
samer@0
|
23 to the default command handler (see Agency) as
|
samer@0
|
24 "exit" actions.
|
samer@0
|
25
|
samer@0
|
26 <p>
|
samer@0
|
27 Addition: frame can dispose of itself when last component
|
samer@0
|
28 is removed.
|
samer@0
|
29 */
|
samer@0
|
30
|
samer@0
|
31 public class Frame extends JFrame
|
samer@0
|
32 implements ComponentListener, ActionListener, Shell.Window
|
samer@0
|
33 {
|
samer@0
|
34 Node node;
|
samer@0
|
35
|
samer@0
|
36 public Frame() { this("frame"); }
|
samer@0
|
37 public Frame( String nm) {
|
samer@0
|
38 // remove "." from start of name
|
samer@0
|
39 if (nm.startsWith(".")) nm=nm.substring(1);
|
samer@0
|
40 node=new Node(nm); init();
|
samer@0
|
41 }
|
samer@0
|
42
|
samer@0
|
43 public Container container() { return getContentPane(); }
|
samer@0
|
44 public void dispose() { super.dispose(); }
|
samer@0
|
45
|
samer@0
|
46 public void expose() {
|
samer@0
|
47 // this makes sure we don't show a zero-sized window
|
samer@0
|
48 if (getBounds().isEmpty()) pack();
|
samer@0
|
49 setVisible(true);
|
samer@0
|
50 }
|
samer@0
|
51
|
samer@0
|
52 public Node getNode() { return node; }
|
samer@0
|
53
|
samer@0
|
54 // ..... Event Listener bits .......
|
samer@0
|
55
|
samer@0
|
56 public void componentHidden(ComponentEvent e) {}
|
samer@0
|
57 public void componentShown(ComponentEvent e) {}
|
samer@0
|
58 public void componentMoved(ComponentEvent e) { savepos(); }
|
samer@0
|
59 public void componentResized(ComponentEvent e) { savepos(); }
|
samer@0
|
60 public void actionPerformed(ActionEvent e) {
|
samer@0
|
61 if (e.getActionCommand().equals("pack")) pack();
|
samer@0
|
62 }
|
samer@0
|
63
|
samer@0
|
64 // override pack to stop window being bigger than screen
|
samer@0
|
65 public void pack() {
|
samer@0
|
66 super.pack();
|
samer@0
|
67
|
samer@0
|
68 Dimension d=getToolkit().getScreenSize();
|
samer@0
|
69 Rectangle b=getBounds();
|
samer@0
|
70 boolean f=false;
|
samer@0
|
71 if (b.y+b.height>d.height) {
|
samer@0
|
72 b.height=d.height-b.y;
|
samer@0
|
73 b.width+=16; // this is to make room for vertical scroll bar (hack - sorry)
|
samer@0
|
74 f=true;
|
samer@0
|
75 }
|
samer@0
|
76 if (b.x+b.width>d.width) { b.width=d.width-b.x; f=true; }
|
samer@0
|
77 if (f) setBounds(b);
|
samer@0
|
78 }
|
samer@0
|
79
|
samer@0
|
80 // ........... private bits ...............
|
samer@0
|
81
|
samer@0
|
82 private void savepos() { X.store(node.fullNameFor("bounds"),getBounds()); }
|
samer@0
|
83
|
samer@0
|
84 private void init()
|
samer@0
|
85 {
|
samer@0
|
86 Shell.push(node);
|
samer@0
|
87 try {
|
samer@0
|
88 String tit = Shell.getString("title",null);
|
samer@0
|
89 Color bg = Shell.getColor("background",SystemColor.control);
|
samer@0
|
90 Color fg = Shell.getColor("foreground",SystemColor.controlText);
|
samer@0
|
91 Rectangle pos = X.rect(Shell.datum("bounds"),null);
|
samer@0
|
92 // Font font = X.font(Shell.datum("font"),null);
|
samer@0
|
93
|
samer@0
|
94 if (tit!=null) setTitle(tit);
|
samer@0
|
95 else {
|
samer@0
|
96 // remove "." from start of name
|
samer@0
|
97 String n=node.fullName();
|
samer@0
|
98 if (n.startsWith(".")) n=n.substring(1);
|
samer@0
|
99 // remove ".window" from end of name
|
samer@0
|
100 if (n.endsWith(".window")) n=n.substring(0,n.length()-7);
|
samer@0
|
101 setTitle(n);
|
samer@0
|
102 }
|
samer@0
|
103
|
samer@0
|
104 if (pos!=null) setBounds(pos);
|
samer@0
|
105 // if (font!=null) setFont(font);
|
samer@0
|
106
|
samer@0
|
107 // setBackground(bg);
|
samer@0
|
108 // setForeground(fg);
|
samer@0
|
109 } finally { Shell.pop(); }
|
samer@0
|
110
|
samer@0
|
111 setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
|
samer@0
|
112
|
samer@0
|
113 JPopupMenu p=new JPopupMenu( "Frame");
|
samer@0
|
114 p.add("pack").addActionListener(this);
|
samer@0
|
115
|
samer@0
|
116 addComponentListener(this);
|
samer@0
|
117 MenuBuilder.addPopup(p,getContentPane()).setBackstop(true);
|
samer@0
|
118 }
|
samer@0
|
119
|
samer@0
|
120
|
samer@0
|
121 }
|
samer@0
|
122
|