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 }