annotate src/samer/core_/util/swing/Frame.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
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