001 /** 002 * Java Gui Builder - A library to build GUIs using an XML file. 003 * Copyright 2002, 2003 (C) François Beausoleil 004 * 005 * This library is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU Lesser General Public 007 * License as published by the Free Software Foundation; either 008 * version 2.1 of the License, or (at your option) any later version. 009 * 010 * This library is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013 * Lesser General Public License for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public 016 * License along with this library; if not, write to the Free Software 017 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 018 */ 019 020 package jgb.handlers.swing; 021 022 import org.xml.sax.SAXException; 023 024 import javax.swing.*; 025 import java.awt.*; 026 import java.lang.reflect.Field; 027 import java.lang.reflect.Method; 028 import java.util.Map; 029 030 public class PanelTagHandler extends AbstractControlTagHandler { 031 /** 032 * The name of the layout attribute. 033 */ 034 protected static final String ATTR_LAYOUT = "layout"; 035 036 /** 037 * The name of the rows attribute. 038 */ 039 protected static final String ATTR_ROWS = "rows"; 040 041 /** 042 * The name of the columns attribute. 043 */ 044 protected static final String ATTR_COLUMNS = "columns"; 045 046 /** 047 * The name of the hgap attribute. 048 */ 049 protected static final String ATTR_HGAP = "hgap"; 050 051 /** 052 * The name of the vgap attribute. 053 */ 054 protected static final String ATTR_VGAP = "vgap"; 055 056 /** 057 * The name of the alignment attribute. 058 */ 059 protected static final String ATTR_ALIGNMENT = "alignment"; 060 061 protected void enterElement(Map atts) throws SAXException { 062 final JPanel panel = new JPanel(); 063 final String layoutClassName = (String)atts.get(ATTR_LAYOUT); 064 if (layoutClassName != null) { 065 try { 066 final Class layoutClass = Class.forName(layoutClassName); 067 final LayoutManager layoutManager = (LayoutManager)layoutClass.newInstance(); 068 069 panel.setLayout(layoutManager); 070 } catch (ClassNotFoundException e) { 071 try { 072 final Class layoutClass = Class.forName("java.awt." + layoutClassName); 073 final LayoutManager layoutManager = (LayoutManager)layoutClass.newInstance(); 074 075 panel.setLayout(layoutManager); 076 } catch (ClassNotFoundException e1) { 077 throwParsingException("Could not find layout manager named " + layoutClassName, e1); 078 } catch (Exception e1) { 079 throwParsingException(e1); 080 } 081 } catch (Exception e) { 082 throwParsingException(e); 083 } 084 } 085 086 final LayoutManager layoutManager = panel.getLayout(); 087 setLayoutManagerProperty(layoutManager, ATTR_ROWS, atts); 088 setLayoutManagerProperty(layoutManager, ATTR_COLUMNS, atts); 089 setLayoutManagerProperty(layoutManager, ATTR_HGAP, atts); 090 setLayoutManagerProperty(layoutManager, ATTR_VGAP, atts); 091 setLayoutManagerProperty(layoutManager, ATTR_ALIGNMENT, atts); 092 093 if (atts.containsKey(ATTR_REFLABEL)) { 094 JLabel referrent = (JLabel)getObject(atts.get(ATTR_REFLABEL).toString()); 095 referrent.setLabelFor(panel); 096 } 097 098 pushCurrentControl(panel, (String)atts.get(ATTR_ID)); 099 if (atts.containsKey(ATTR_ID)) { 100 putObject((String)atts.get(ATTR_ID), panel); 101 } 102 } 103 104 protected void exitElement() throws SAXException { 105 popCurrentControl(); 106 } 107 108 protected String getDefaultPackagePrefix() { 109 throw new IllegalStateException(); 110 } 111 112 private void setLayoutManagerProperty(final LayoutManager layoutManager, final String attrKey, Map atts) throws SAXException { 113 if (atts.containsKey(attrKey)) { 114 final String methodName = "set" + Character.toUpperCase(attrKey.charAt(0)) + attrKey.substring(1); 115 try { 116 Method setRowsMethod = layoutManager.getClass().getMethod(methodName, new Class[]{Integer.TYPE}); 117 final String attrValue = atts.get(attrKey).toString(); 118 Integer integerValue = null; 119 try { 120 integerValue = Integer.valueOf(attrValue); 121 } catch (NumberFormatException e) { 122 Field constantValue = layoutManager.getClass().getField(attrValue.toUpperCase()); 123 integerValue = new Integer(constantValue.getInt(null)); 124 } 125 126 setRowsMethod.invoke(layoutManager, new Object[]{ 127 integerValue 128 }); 129 } catch (Exception e) { 130 throwParsingException("Could not set number of " + attrKey 131 + " - LayoutManager is probably not of the right class - " 132 + layoutManager.getClass().getName(), e); 133 } 134 } 135 } 136 }