/*******************************************************************************
 * Copyright (c) 2007, 2008 IBM Corporation and Others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Tatsuya ISHIHARA - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.model.dom.odf.draw.impl;

import org.eclipse.actf.model.dom.odf.ODFException;
import org.eclipse.actf.model.dom.odf.base.ODFDocument;
import org.eclipse.actf.model.dom.odf.base.impl.DrawingObjectElementImpl;
import org.eclipse.actf.model.dom.odf.draw.ControlElement;
import org.eclipse.actf.model.dom.odf.draw.DrawConstants;
import org.eclipse.actf.model.dom.odf.form.FixedTextElement;
import org.eclipse.actf.model.dom.odf.form.FormConstants;
import org.eclipse.actf.model.dom.odf.form.FormControlElement;
import org.eclipse.actf.model.dom.odf.office.OfficeConstants;
import org.eclipse.actf.util.xpath.XPathServiceFactory;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

class ControlElementImpl extends DrawingObjectElementImpl implements
		ControlElement {
	private static final long serialVersionUID = -4483584669064968195L;

	protected ControlElementImpl(ODFDocument odfDoc, Element element) {
		super(odfDoc, element);
	}

	public String getAttrDrawControl() {
		if (hasAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
				DrawConstants.ATTR_CONTROL))
			return getAttributeNS(DrawConstants.DRAW_NAMESPACE_URI,
					DrawConstants.ATTR_CONTROL);
		return null;
	}

	public FormControlElement getFormControlElement() {
		NodeList nl = XPathServiceFactory.newService().evalPathForNodeList(
				"ancestor::*/*[namespace-uri()='"
						+ OfficeConstants.OFFICE_NAMESPACE_URI
						+ "' and local-name()='"
						+ OfficeConstants.ELEMENT_FORMS
						+ "']/*[namespace-uri()='"
						+ FormConstants.FORM_NAMESPACE_URI
						+ "' and local-name()='" + FormConstants.ELEMENT_FORM
						+ "']/*[attribute::*[namespace-uri()='"
						+ FormConstants.FORM_NAMESPACE_URI
						+ "' and local-name()='id']='" + getAttrDrawControl()
						+ "']", this);

		if ((nl != null) && (nl.getLength() == 1)) {
			Element control = (Element) nl.item(0);
			if (control instanceof FormControlElement) {
				return (FormControlElement) control;
			} else {
				new ODFException(
						"draw:id should specify the id of FormControlElement")
						.printStackTrace();
				System.err.println("namespace : " + control.getNamespaceURI());
				System.err.println("localname : " + control.getLocalName());
				System.err
						.println("text content : " + control.getTextContent());
			}
		} else if ((nl != null) && (nl.getLength() > 1)) {
			new ODFException(
					"draw:control should not have more thant one form:property element")
					.printStackTrace();
		}
		return null;
	}

	public FixedTextElement getFormLabelFixedTextElement() {
		String drawControl = getAttrDrawControl();
		NodeList nl = XPathServiceFactory.newService().evalPathForNodeList(
				"ancestor::*/*[namespace-uri()='"
						+ OfficeConstants.OFFICE_NAMESPACE_URI
						+ "' and local-name()='"
						+ OfficeConstants.ELEMENT_FORMS
						+ "']/*[namespace-uri()='"
						+ FormConstants.FORM_NAMESPACE_URI
						+ "' and local-name()='" + FormConstants.ELEMENT_FORM
						+ "']/*[namespace-uri()='"
						+ FormConstants.FORM_NAMESPACE_URI
						+ "' and local-name()='"
						+ FormConstants.ELEMENT_FIXED_TEXT
						+ "'][attribute::*[namespace-uri()='"
						+ FormConstants.FORM_NAMESPACE_URI
						+ "' and local-name()='" + FormConstants.ATTR_FOR
						+ "']='" + drawControl + "']", this);
		if ((nl != null) && (nl.getLength() == 1)) {
			Element text = (Element) nl.item(0);
			if (text instanceof FixedTextElement) {
				return (FixedTextElement) text;
			}
		} else if ((nl != null) && (nl.getLength() > 1)) {
			new ODFException(
					"draw:control should not have more thant one form label field element")
					.printStackTrace();
		}
		return null;
	}
}