// ========================================================================
// $Id: FrameSet.java,v 1.4 2004/11/20 13:32:33 gregwilkins Exp $
// Copyright 1996-2004 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at 
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================

package org.mortbay.html;
import java.io.IOException;
import java.io.Writer;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

/* ---------------------------------------------------------------- */
/** FrameSet.
 * <p>
 * Usage
 * <pre>
 *      FrameSet set = new FrameSet("FrameTest","*,*","*,*");
 *      set.frame(0,0).name("Frame1",req.getRequestPath()+"?Frame=1");
 *      set.frame(0,1).name("Frame2",req.getRequestPath()+"?Frame=2");
 *      set.frame(1,0).name("Frame3",req.getRequestPath()+"?Frame=3");
 *      set.frame(1,1).name("Frame4",req.getRequestPath()+"?Frame=4");
 *      set.write(new Writer(res.getOutputStream()));
 * </pre>
 * @version $Id: FrameSet.java,v 1.4 2004/11/20 13:32:33 gregwilkins Exp $
 * @author Greg Wilkins
*/
public class FrameSet extends Page
{
    Frame[][] frames=null;
    String colSpec=null;
    String rowSpec=null;
    int cols;
    int rows;
    String border="";
    Vector frameNames=null;
    Hashtable frameMap=null;
    
    /* ------------------------------------------------------------ */
    /** FrameSet constructor.
     * @param colSpec Comma separated list of column widths specified
     *                as pixels, percentage or '*' for variable
     */
    public FrameSet(String title, String colSpec, String rowSpec)
    {
        super(title);

        this.colSpec=colSpec;
        this.rowSpec=rowSpec;
        
        cols=1;
        rows=1;

        int i=-1;
        while(colSpec != null && (i=colSpec.indexOf(",",i+1))>=0)
            cols++;
        
        i=-1;
        while(rowSpec != null && (i=rowSpec.indexOf(",",i+1))>=0)
            rows++;
        
        frames=new Frame[cols][rows];
        for(int c=0;c<cols;c++)
            for(int r=0;r<rows;r++)
                frames[c][r]=new Frame();
    }
    
    /* ------------------------------------------------------------ */
    public Frame frame(int col, int row)
    {
        return frames[col][row];
    }

    /* ------------------------------------------------------------ */
    public FrameSet border(boolean threeD, int width, String color)
    {
        border=" frameborder=\""+(threeD?"yes":"no")+"\"";
        if (width>=0)
            border+=" border=\""+width+"\"";

        if (color!=null)
            border+=" bordercolor=\""+color+"\"";
        return this;
    }
    
    /* ----------------------------------------------------------------- */
    public Enumeration namedFrames()
    {
        if (frameNames==null)
            return new Vector().elements();
        return frameNames.elements();
    }
    
    /* ----------------------------------------------------------------- */
    public Frame frame(String name)
    {
        if (frameMap==null)
            return null;
        return (Frame) frameMap.get(name);
    }
    
    /* ----------------------------------------------------------------- */
    /** Name a frame.
     * By convention, frame names match Page section names
     */
    public Frame nameFrame(String name,int col, int row)
    {
        if (frameMap==null)
        {
            frameMap=new Hashtable(10);
            frameNames=new Vector(10);
        }
        
        Frame frame = frames[col][row];
        if (frame==null)
            frame = frames[col][row] = new Frame();
        
        if (frameMap.get(name)==null)
            frameNames.addElement(name);
        frameMap.put(name,frame);
        frame.name(name);

        return frame;
    }
    
    
    /* ----------------------------------------------------------------- */
    public void write(Writer out)
         throws IOException
    {
        writeHtmlHead(out);
        
        out.write("<frameset "+border);
        
        if(colSpec!=null)
            out.write(" cols=\""+colSpec+"\"");
        if(rowSpec!=null)
            out.write(" rows=\""+rowSpec+"\"");
        out.write(">");

        for(int r=0;r<rows;r++)
            for(int c=0;c<cols;c++)
                frames[c][r].write(out);

        out.write("<noframes>");
        writeElements(out);
        out.write("</noframes>");

        out.write("</frameset>");
        out.write("</html>");
    }
};


