/**
* Copyright (C) 2010 Orbeon, Inc.
*
* This program is free software; you can redistribute it and/or modify it under the terms of the
* GNU Lesser General Public License as published by the Free Software Foundation; either version
* 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The full text of the license is available at http://www.gnu.org/copyleft/lesser.html
*/
package org.orbeon.oxf.xforms.processor.handlers.xml;
import org.orbeon.oxf.xml.XMLParsing;
import org.orbeon.oxf.xml.XMLReceiver;
import org.orbeon.oxf.xforms.XFormsConstants;
import org.orbeon.oxf.xforms.XFormsUtils;
import org.orbeon.oxf.xforms.control.XFormsControl;
import org.orbeon.oxf.xforms.control.XFormsValueControl;
import org.orbeon.oxf.xforms.processor.handlers.XFormsBaseHandler;
import org.orbeon.oxf.xml.XMLReceiverHelper;
import org.orbeon.oxf.xml.dom4j.Dom4jUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
* Base class for all XHTML and XForms element handlers.
*/
public abstract class XFormsBaseHandlerXML extends XFormsBaseHandler {
protected XFormsBaseHandlerXML(boolean repeating, boolean forwarding) {
super(repeating, forwarding);
}
public void handleMIPAttributes(AttributesImpl newAttributes, String controlPrefixedId, XFormsControl control) {
// Output MIP classes only having a binding
final boolean hasBinding = containingDocument.getStaticOps().hasBinding(controlPrefixedId);
if (hasBinding && control != null)
// Output standard MIP classes
control.writeMIPsAsAttributes(newAttributes);
}
public void handleValueAttribute(AttributesImpl newAttributes, String controlPrefixedId, XFormsControl control) {
if (containingDocument.getStaticOps().isValueControl(controlPrefixedId)) {
if (control instanceof XFormsValueControl)
{
XFormsValueControl valueControl = (XFormsValueControl) control;
if (valueControl.getValue() != null) {
newAttributes.addAttribute(XFormsConstants.XXFORMS_NAMESPACE_URI, "value", XFormsConstants.XXFORMS_PREFIX + ":value", XMLReceiverHelper.CDATA, ((XFormsValueControl) control).getValue());
}
if (valueControl.getExternalValue() != null) {
newAttributes.addAttribute(XFormsConstants.XXFORMS_NAMESPACE_URI, "external-value", XFormsConstants.XXFORMS_PREFIX + ":external-value", XMLReceiverHelper.CDATA, ((XFormsValueControl) control).getExternalValue());
}
}
}
}
// TODO: implement label hint and alert for XML content
protected void handleLabelHintHelpAlert(String controlEffectiveId, String forEffectiveId, LHHAC lhhaType, XFormsControl control, boolean isTemplate) throws SAXException {
// NOTE: We used to not handle alerts and help in read-only mode. We now prefer to controls this with CSS.
final boolean isHint = lhhaType == LHHAC.HINT;
final boolean isAlert = lhhaType == LHHAC.ALERT;
final boolean isLabel = lhhaType == LHHAC.LABEL;
final boolean isHelp = lhhaType == LHHAC.HELP;
final String labelHintHelpAlertValue;
final boolean mustOutputHTMLFragment;
if (control != null) {
// Get actual value from control
if (isLabel) {
labelHintHelpAlertValue = control.getLabel();
mustOutputHTMLFragment = control.isHTMLLabel();
} else if (isHelp) {
// NOTE: Special case here where we get the escaped help to facilitate work below. Help is a special
// case because it is stored as escaped HTML within a <label> element.
labelHintHelpAlertValue = control.getEscapedHelp();
mustOutputHTMLFragment = false;
} else if (isHint) {
labelHintHelpAlertValue = control.getHint();
mustOutputHTMLFragment = control.isHTMLHint();
} else if (isAlert) {
labelHintHelpAlertValue = control.getAlert();
mustOutputHTMLFragment = control.isHTMLAlert();
} else {
throw new IllegalStateException("Illegal type requested");
}
} else {
// Placeholder
labelHintHelpAlertValue = null;
mustOutputHTMLFragment = false;
}
final String elementName;
if (isLabel) {
elementName = handlerContext.getLabelElementName();
} else if (isHelp) {
elementName = handlerContext.getHelpElementName();
} else if (isHint) {
elementName = handlerContext.getHintElementName();
} else if (isAlert) {
elementName = handlerContext.getAlertElementName();
} else {
throw new IllegalStateException("Illegal type requested");
}
final Attributes labelHintHelpAlertAttributes;
{
final String forPrefixedId = XFormsUtils.getPrefixedId(controlEffectiveId);
final AttributesImpl tempAttributes = Dom4jUtils.getSAXAttributes(getStaticLHHA(forPrefixedId, lhhaType).element());
if (tempAttributes != null)
updateID(tempAttributes, controlEffectiveId, lhhaType);
labelHintHelpAlertAttributes = tempAttributes;
}
final XMLReceiver xmlReceiver = handlerContext.getController().getOutput();
xmlReceiver.startElement(XFormsConstants.XFORMS_NAMESPACE_URI, elementName, XFormsConstants.XFORMS_PREFIX + ":" + elementName, labelHintHelpAlertAttributes);
if (labelHintHelpAlertValue != null && !labelHintHelpAlertValue.equals("")) {
if (mustOutputHTMLFragment) {
XMLParsing.parseDocumentFragment(labelHintHelpAlertValue, xmlReceiver);
}
else
xmlReceiver.characters(labelHintHelpAlertValue.toCharArray(), 0, labelHintHelpAlertValue.length());
}
xmlReceiver.endElement(XFormsConstants.XFORMS_NAMESPACE_URI, elementName, XFormsConstants.XFORMS_PREFIX + ":" + elementName);
}
void updateID(AttributesImpl attributes, String effectiveId, LHHAC lhhac) {
attributes.setAttribute(attributes.getIndex("id"),"", "id", "id", XMLReceiverHelper.CDATA, getLHHACId(containingDocument, effectiveId, LHHAC_CODES.get(lhhac)));
}
}