1 /***
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that the following conditions are
4 * met :
5 *
6 * . Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 *
9 * . Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * . The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $Id: AbstractFrame.java,v 1.11 2005/09/03 23:13:40 mat007 Exp $
29 */
30
31 package jtge.sample.chat.common.ui;
32
33 import java.awt.BorderLayout;
34 import java.awt.event.WindowAdapter;
35 import java.awt.event.WindowEvent;
36 import javax.swing.BorderFactory;
37 import javax.swing.JFrame;
38 import javax.swing.JPanel;
39 import javax.swing.WindowConstants;
40 import javax.swing.border.Border;
41 import jtge.engine.net.IClosable;
42
43 /***
44 * Abstracts frame behaviours.
45 *
46 * @author Mathieu Champlon
47 * @version $Revision: 1.11 $ $Date: 2005/09/03 23:13:40 $
48 */
49 public abstract class AbstractFrame extends JFrame
50 {
51 private static final int BORDER_SIZE = 5;
52 private final Border border;
53 private final JPanel panel;
54
55 /***
56 * Create a frame.
57 *
58 * @param title the frame title
59 * @param closable the close callback
60 */
61 public AbstractFrame( final String title, final IClosable closable )
62 {
63 super( title );
64 configureClose( closable );
65 border = BorderFactory.createEmptyBorder( BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE );
66 panel = createPanel();
67 }
68
69 private void configureClose( final IClosable closable )
70 {
71 addWindowListener( new WindowAdapter()
72 {
73 public final void windowClosing( final WindowEvent e )
74 {
75 if( closable != null )
76 closable.close();
77 hide();
78 dispose();
79 }
80 } );
81 setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
82 }
83
84 private Border createCompoundBorder( final Border border, final String title )
85 {
86 return BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder( title ), border );
87 }
88
89 private JPanel createPanel()
90 {
91 final JPanel result = new JPanel();
92 result.setBorder( border );
93 result.setLayout( new BorderLayout() );
94 setContentPane( result );
95 return result;
96 }
97
98 /***
99 * Add a panel to the frame.
100 *
101 * @param panel the panel
102 * @param title the title of the panel
103 * @param layout the layout
104 */
105 protected final void install( final JPanel panel, final String title, final String layout )
106 {
107 if( panel != null )
108 {
109 panel.setBorder( createCompoundBorder( border, title ) );
110 this.panel.add( panel, layout );
111 }
112 }
113 }