blob: a8f53547d3009e89310f7da9a69f1148ac31bc29 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.cocoon.forms.formmodel;
import java.util.Iterator;
import java.util.Locale;
import org.apache.cocoon.forms.FormContext;
import org.apache.cocoon.forms.validation.ValidationError;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
/**
* A general-purpose abstract Widget which can hold zero or more widgets.
*
* @version $Id$
*/
public abstract class AbstractContainerWidget extends AbstractWidget
implements ContainerWidget {
/**
* List of contained widgets.
*/
protected WidgetList widgets;
/**
* validation errors on container widgets
*/
protected ValidationError validationError;
/**
* Constructs AbstractContainerWidget
*/
public AbstractContainerWidget(AbstractContainerDefinition definition) {
super(definition);
widgets = new WidgetList();
}
/**
* Called after widget's environment has been setup,
* to allow for any contextual initalization such as
* looking up case widgets for union widgets.
*/
public void initialize() {
Iterator it = this.getChildren();
while(it.hasNext()) {
((Widget)it.next()).initialize();
}
super.initialize();
}
public void addChild(Widget widget) {
// order is important
widgets.addWidget(widget);
widget.setParent(this);
}
public boolean hasChild(String id) {
return widgets.hasWidget(id);
}
public Widget getChild(String id) {
return widgets.getWidget(id);
}
public Iterator getChildren() {
return widgets.iterator();
}
public int getSize() {
return widgets.getWidgetList().size();
}
/**
* Delegates the readFromRequest() down to the contained child-widgets.
*
* When overriding one should call <code>super.readFromRequest()</code>
* to allow child-widgets to process the request.
*
* Overide only to add possible request-reading statements on the containment level.
*
* @param formContext to be passed to the {@link Widget#readFromRequest(FormContext)}
* of the contained widgets.
*/
public void readFromRequest(FormContext formContext) {
if (getCombinedState().isAcceptingInputs()) {
widgets.readFromRequest(formContext);
}
}
/**
* Delegates the <code>validate()</code> down to the contained child-widgets,
* and validates the extra rules on this containment level regardless of
* children widget's validities.
*
* <p>When overriding one should call <code>super.validate()</code> as the first
* statement to keep in sync with this behaviour.</p>
*
* @return <code>true</code> only if all contained widgets are valid and the
* extra validation rules on this containment level are ok.
*/
public boolean validate() {
if (!getCombinedState().isValidatingValues()) {
this.wasValid = true;
return true;
}
// Validate children first, then always validate self. Return combined result.
final boolean valid = widgets.validate();
this.wasValid = super.validate() && valid;
return this.wasValid;
}
/**
* Subclass container widgets can call this super.generateItemSaxFragment(..)
* to just insert the child-widget content wrapped in a @lt;fi:widgets@gt;
*
* @param contentHandler where the SAX is sent to via {@link Widget#generateSaxFragment(ContentHandler, Locale)}
* @param locale
* @throws SAXException
*/
public void generateItemSaxFragment(ContentHandler contentHandler, Locale locale) throws SAXException {
if (getCombinedState().isDisplayingValues()) {
widgets.generateSaxFragment(contentHandler, locale);
}
}
}