/**
* 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.xhtml;
import org.orbeon.oxf.xforms.XFormsConstants;
import org.orbeon.oxf.xforms.control.XFormsControl;
import org.orbeon.oxf.xforms.control.XFormsControl$;
import org.orbeon.oxf.xforms.control.controls.XXFormsDialogControl;
import org.orbeon.oxf.xml.XMLReceiverHelper;
import org.orbeon.oxf.xml.XMLConstants;
import org.orbeon.oxf.xml.XMLUtils;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
/**
* Handle xxf:dialog.
*
* TODO: Subclasses per appearance.
*/
public class XXFormsDialogHandler extends XFormsBaseHandlerXHTML {
public XXFormsDialogHandler() {
super(false, true);
}
public void start(String uri, String localname, String qName, Attributes attributes) throws SAXException {
final String effectiveDialogId = handlerContext.getEffectiveId(attributes);
final XXFormsDialogControl dialogXFormsControl = ((XXFormsDialogControl) containingDocument.getControlByEffectiveId(effectiveDialogId));
// Find classes to add
// NOTE: attributes logic duplicated in XXFormsDialogControl
// Get values statically so we can handle the case of the repeat template
final StringBuilder classes = getInitialClasses(uri, localname, attributes, null, false);
{
classes.append(" xforms-initially-hidden");
classes.append(" xforms-dialog-");
final String level; {
final String explicitLevel = attributes.getValue("level");
if (explicitLevel == null) {
level = XFormsControl$.MODULE$.appearances(elementAnalysis).contains(XFormsConstants.XFORMS_MINIMAL_APPEARANCE_QNAME) ? "modeless" : "modal";
} else {
level = explicitLevel;
}
}
classes.append(level);
classes.append(" xforms-dialog-close-");
classes.append(Boolean.toString(!"false".equals(attributes.getValue("close"))));
classes.append(" xforms-dialog-draggable-");
classes.append(Boolean.toString(!"false".equals(attributes.getValue("draggable"))));
classes.append(" xforms-dialog-visible-");
classes.append(Boolean.toString("true".equals(attributes.getValue("visible"))));
}
// Start main xhtml:div
final String xhtmlPrefix = handlerContext.findXHTMLPrefix();
final String divQName = XMLUtils.buildQName(xhtmlPrefix, "div");
final ContentHandler contentHandler = handlerContext.getController().getOutput();
contentHandler.startElement(XMLConstants.XHTML_NAMESPACE_URI, "div", divQName, getIdClassXHTMLAttributes(attributes, classes.toString(), effectiveDialogId));
// Child xhtml:div for label
reusableAttributes.clear();
reusableAttributes.addAttribute("", "class", "class", XMLReceiverHelper.CDATA, "hd xxforms-dialog-head");
contentHandler.startElement(XMLConstants.XHTML_NAMESPACE_URI, "div", divQName, reusableAttributes);
final String labelValue = (dialogXFormsControl != null) ? dialogXFormsControl.getLabel() : null;
if (labelValue != null) {
contentHandler.characters(labelValue.toCharArray(), 0, labelValue.length());
}
contentHandler.endElement(XMLConstants.XHTML_NAMESPACE_URI, "div", divQName);
// Child xhtml:div for body
reusableAttributes.clear();
reusableAttributes.addAttribute("", "class", "class", XMLReceiverHelper.CDATA, "bd xxforms-dialog-body");
contentHandler.startElement(XMLConstants.XHTML_NAMESPACE_URI, "div", divQName, reusableAttributes);
}
public void end(String uri, String localname, String qName) throws SAXException {
// Close xhtml:div's
final String xhtmlPrefix = handlerContext.findXHTMLPrefix();
final String divQName = XMLUtils.buildQName(xhtmlPrefix, "div");
final ContentHandler contentHandler = handlerContext.getController().getOutput();
contentHandler.endElement(XMLConstants.XHTML_NAMESPACE_URI, "div", divQName);
contentHandler.endElement(XMLConstants.XHTML_NAMESPACE_URI, "div", divQName);
}
}