001    package net.sf.logdistiller.gui;
002    
003    /*
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    import java.awt.Insets;
018    import java.io.InputStream;
019    import java.util.*;
020    import javax.xml.parsers.DocumentBuilder;
021    import javax.xml.parsers.DocumentBuilderFactory;
022    import org.w3c.dom.Document;
023    import org.w3c.dom.Element;
024    
025    import com.jgoodies.forms.layout.CellConstraints;
026    
027    import net.sf.logdistiller.xml.DOMUtils;
028    
029    /**
030     * This class is a simplified version of FormLayoutMaker's equivalent class, in a dream to avoid need for Java 1.4 at
031     * runtime.
032     */
033    public class SimpleLayoutConstraintsManager
034    {
035        private final Map layouts = new HashMap();
036    
037        private SimpleLayoutConstraintsManager()
038        {
039        }
040    
041        public SimpleContainerLayout getLayout( String name )
042        {
043            return (SimpleContainerLayout) layouts.get( name );
044        }
045    
046        public void addLayout( SimpleContainerLayout containerLayout )
047        {
048            layouts.put( containerLayout.getName(), containerLayout );
049        }
050    
051        public static final String DEFAULT = "default";
052    
053        private final static Map CELL_CONSTRAINTS = new HashMap()
054        {
055            {
056                put( "default", CellConstraints.DEFAULT );
057                put( "fill", CellConstraints.FILL );
058                put( "center", CellConstraints.CENTER );
059                put( "left", CellConstraints.LEFT );
060                put( "right", CellConstraints.RIGHT );
061                put( "top", CellConstraints.TOP );
062                put( "bottom", CellConstraints.BOTTOM );
063            }
064        };
065    
066        public static CellConstraints.Alignment getAlignment( String value )
067        {
068            CellConstraints.Alignment alignment =
069                (CellConstraints.Alignment) CELL_CONSTRAINTS.get( ( value == null ) ? DEFAULT : value );
070            if ( alignment == null )
071            {
072                throw new RuntimeException( "Invalid alignment '" + value + "'" );
073            }
074            return alignment;
075        }
076    
077        public static SimpleLayoutConstraintsManager getLayoutConstraintsManager( InputStream stream )
078        {
079            try
080            {
081                DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
082                Document dataDocument = documentBuilder.parse( stream );
083                Element root = (Element) dataDocument.getDocumentElement();
084                return getLayoutConstraintsManager( root );
085            }
086            catch ( Exception e )
087            {
088                throw new RuntimeException( "Unable to create DocumentBuilder", e );
089            }
090        }
091    
092        public static SimpleLayoutConstraintsManager getLayoutConstraintsManager( Element containersNode )
093        {
094            if ( !containersNode.getNodeName().equals( "containers" ) )
095            {
096                throw new RuntimeException( "Expected a node named 'containers', found '" + containersNode.getNodeName()
097                    + "'" );
098            }
099            SimpleLayoutConstraintsManager layoutConstraintsManager = new SimpleLayoutConstraintsManager();
100            Iterator iter = DOMUtils.getChildElementsByTagName( containersNode, "container" );
101            while ( iter.hasNext() )
102            {
103                Element containerNode = (Element) iter.next();
104                String containerName = containerNode.getAttribute( "name" );
105                String columnSpecs = containerNode.getAttribute( "columnSpecs" );
106                String rowSpecs = containerNode.getAttribute( "rowSpecs" );
107                SimpleContainerLayout containerLayout = new SimpleContainerLayout( containerName, columnSpecs, rowSpecs );
108    
109                Iterator iterConstraints = DOMUtils.getChildElementsByTagName( containerNode, "cellconstraints" );
110                while ( iterConstraints.hasNext() )
111                {
112                    Element constraintsNode = (Element) iterConstraints.next();
113                    String name = constraintsNode.getAttribute( "name" );
114                    CellConstraints.Alignment horizontalAlignment =
115                        getAlignment( constraintsNode.getAttribute( "horizontalAlignment" ) );
116                    CellConstraints.Alignment verticalAlignment =
117                        getAlignment( constraintsNode.getAttribute( "verticalAlignment" ) );
118                    int gridX = getIntValue( constraintsNode, "gridX", 1 );
119                    int gridY = getIntValue( constraintsNode, "gridY", 1 );
120                    int gridWidth = getIntValue( constraintsNode, "gridWidth", 1 );
121                    int gridHeight = getIntValue( constraintsNode, "gridHeight", 1 );
122                    int topInset = getIntValue( constraintsNode, "topInset", 0 );
123                    int bottomInset = getIntValue( constraintsNode, "bottomInset", 0 );
124                    int rightInset = getIntValue( constraintsNode, "rightInset", 0 );
125                    int leftInset = getIntValue( constraintsNode, "leftInset", 0 );
126    
127                    CellConstraints constraints =
128                        new CellConstraints( gridX, gridY, gridWidth, gridHeight, horizontalAlignment, verticalAlignment,
129                                             new Insets( topInset, leftInset, bottomInset, rightInset ) );
130                    containerLayout.addCellConstraints( name, constraints );
131                }
132                layoutConstraintsManager.addLayout( containerLayout );
133            }
134            return layoutConstraintsManager;
135        }
136    
137        private static int getIntValue( Element elmt, String name, int defaultValue )
138        {
139            String value = elmt.getAttribute( name );
140            return ( value == null ) ? defaultValue : Integer.parseInt( value );
141        }
142    }