001// Copyright (c) 2001 Hursh Jain (http://www.mollypages.org) 
002// The Molly framework is freely distributable under the terms of an
003// MIT-style license. For details, see the molly pages web site at:
004// http://www.mollypages.org/. Use, modify, have fun !
005
006package fc.web.forms;
007
008import javax.servlet.*;
009import javax.servlet.http.*;
010import java.io.*;
011import java.util.*;
012
013import fc.io.*;
014import fc.util.*;
015
016/** 
017A container for a sequence of forms. 
018<p>
019
020@author hursh jain
021**/
022public class FormSequence 
023{
024Map sequence;
025Map doneMap;
026
027public FormSequence()
028  {
029  sequence = new LinkedHashMap(); 
030  doneMap = new HashMap();
031  }
032  
033/** 
034Adds a form to the sequence 
035
036@throws IllegalStateException   if a form with the same name already
037                exists in this sequence.            
038**/
039public void add(Form f) {
040  Argcheck.notnull(f, "param f was null");
041  sequence.put(f.getName(), f);
042  doneMap.put(f.getName(), Boolean.valueOf(false)); 
043  }
044
045/** specify <tt>true</tt> to mark the form as done**/
046public void setDone(Form form, boolean done) 
047  {
048  Form f = (Form) sequence.get(form.getName());
049  if (f == null) {
050    return;
051    }
052  doneMap.put(form.getName(), Boolean.valueOf(done)); 
053  }
054
055/** 
056@return <tt>true</tt> is the specified form is marked
057    as done.
058**/
059public boolean isDone(Form f) 
060  {
061  if (! sequence.containsKey(f.getName()) )
062    return false;
063  
064  Boolean b = (Boolean) doneMap.get(f.getName()); 
065  return b.booleanValue();
066  }
067
068/** 
069Returns the form with the specified name or <tt>null</tt> 
070if a form with that name does not exist
071**/
072public Form get(String name) {
073  return (Form) sequence.get(name);
074  }
075
076/** 
077@return the first form which is still not done or <tt>null</tt>
078    if none are remaining to be done.
079**/
080public Form getFirstRemaining() 
081  {
082  Form f = null;
083  Iterator it = sequence.values().iterator();
084  while (it.hasNext()) {
085    f = (Form) it.next();
086    if (! isDone(f) ) {
087      break;
088      }
089    } 
090  return f;
091  }
092
093/**
094@return <tt>true</tt> is all forms in the sequence are
095    marked as done <tt>false</tt> otherwise. Also 
096    returns <tt>false</tt> if this sequence contains
097    no forms at all.
098**/
099public boolean isFinished() {
100  return getFirstRemaining() == null; 
101  }
102  
103}