package com.nwalsh.saxon;

import org.xml.sax.SAXException;
import org.w3c.dom.*;

import javax.xml.transform.TransformerException;

import com.icl.saxon.om.NamePool;
import com.icl.saxon.output.Emitter;
import com.icl.saxon.tree.AttributeCollection;

import com.nwalsh.saxon.Callout;

/**
 * <p>Utility class for the Verbatim extension (ignore this).</p>
 *
 * <p>$Id: FormatUnicodeCallout.java,v 1.2 2001/08/05 22:35:38 nwalsh Exp $</p>
 *
 * <p>Copyright (C) 2000, 2001 Norman Walsh.</p>
 *
 * <p><b>Change Log:</b></p>
 * <dl>
 * <dt>1.0</dt>
 * <dd><p>Initial release.</p></dd>
 * </dl>
 *
 * @author Norman Walsh
 * <a href="mailto:ndw@nwalsh.com">ndw@nwalsh.com</a>
 *
 * @see Verbatim
 *
 * @version $Id: FormatUnicodeCallout.java,v 1.2 2001/08/05 22:35:38 nwalsh Exp $
 **/

public class FormatUnicodeCallout extends FormatCallout {
  int unicodeMax = 0;
  int unicodeStart = 0;
  String unicodeFont = "";

  public FormatUnicodeCallout(NamePool nPool,
			      String font,
			      int start,
			      int max,
			      boolean fo) {
    super(nPool, fo);
    unicodeFont = font;
    unicodeMax = max;
    unicodeStart = start;
  }

  public void formatCallout(Emitter rtfEmitter,
			    Callout callout) {
    Element area = callout.getArea();
    int num = callout.getCallout();
    String userLabel = areaLabel(area);
    String label = "";

    if (userLabel != null) {
      label = userLabel;
    }

    try {
      if (userLabel == null && num <= unicodeMax) {
	int inName = 0;
	AttributeCollection inAttr = null;
	int namespaces[] = new int[1];

	if (!unicodeFont.equals("")) {
	  if (foStylesheet) {
	    inName = namePool.allocate("fo", foURI, "inline");
	    inAttr = new AttributeCollection(namePool);
	    inAttr.addAttribute("", "", "font-family", "CDATA", unicodeFont);
	  } else {
	    inName = namePool.allocate("", "", "font");
	    inAttr = new AttributeCollection(namePool);
	    inAttr.addAttribute("", "", "face", "CDATA", unicodeFont);
	  }

	  startSpan(rtfEmitter);
	  rtfEmitter.startElement(inName, inAttr, namespaces, 0);
	}

	char chars[] = new char[1];
	chars[0] = (char) (unicodeStart + num - 1);
	rtfEmitter.characters(chars, 0, 1);

	if (!unicodeFont.equals("")) {
	  rtfEmitter.endElement(inName);
	  endSpan(rtfEmitter);
	}
      } else {
	formatTextCallout(rtfEmitter, callout);
      }
    } catch (TransformerException e) {
      System.out.println("Transformer Exception in graphic formatCallout");
    }
  }
}
