/* QtFontPeer.java --
   Copyright (C)  2005, 2006  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package gnu.java.awt.peer.qt;

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.geom.Rectangle2D;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.font.LineMetrics;
import java.text.CharacterIterator;
import java.util.Locale;
import java.util.Map;

import gnu.java.awt.peer.ClasspathFontPeer;

public class QtFontPeer extends ClasspathFontPeer
{
  // Pointer to native QFont structure.
  private long nativeObject;
  private QtFontMetrics metrics;


  public QtFontPeer (String name, int style)
  {
    this(name, style, 12);
  }

  public QtFontPeer (String name, int style, int size)
  {
    super(name, style, size);
    init();
  }

  public QtFontPeer (String name, Map attributes)
  {
    super(name, attributes);
    init();
  }

  public void init()
  {
    if(this.familyName == null)
      throw new IllegalArgumentException("null family name");
    if(this.familyName.equals("Helvetica"))
      this.familyName = "sans serif";
    if(this.familyName.equals("Dialog"))
      this.familyName = "sans serif";
    create(this.familyName, this.style, (int)this.size);
    metrics = new QtFontMetrics(this);
  }

  /**
   * Creates the QFont object.
   */
  private native void create(String name, int style, int size);

  /**
   * Destroys the QFont.
   */
  public native void dispose();


  // ****************** ClasspathFontPeer Methods.

  public boolean canDisplay (Font font, int c)
  {
    return metrics.canDisplay( c );
  }

  public int canDisplayUpTo (Font font, CharacterIterator i, 
			     int start, int limit)
  {
    int index = start;
    char c = i.setIndex( index );
    while( index <= limit )
      {
	if(!canDisplay(font, c))
	  return index;
	index++;
	c = i.next();
      }
    return -1;
  }

  public String getSubFamilyName (Font font, Locale locale)
  {
    throw new UnsupportedOperationException();
  }

  public String getPostScriptName (Font font)
  {
    throw new UnsupportedOperationException();
  }

  public int getNumGlyphs (Font font)
  {
    throw new UnsupportedOperationException();
  }

  public int getMissingGlyphCode (Font font)
  {
    throw new UnsupportedOperationException();
  }

  public byte getBaselineFor (Font font, char c)
  {
    throw new UnsupportedOperationException();
  }

  public String getGlyphName (Font font, int glyphIndex)
  {
    throw new UnsupportedOperationException();
  }

  public GlyphVector createGlyphVector (Font font,
					FontRenderContext frc,
					CharacterIterator ci)
  {
    throw new UnsupportedOperationException();
  }

  public GlyphVector createGlyphVector (Font font, 
					FontRenderContext ctx, 
					int[] glyphCodes)
  {
    throw new UnsupportedOperationException();
  }

  public GlyphVector layoutGlyphVector (Font font, 
					FontRenderContext frc, 
					char[] chars, int start, 
					int limit, int flags)
  {
    throw new UnsupportedOperationException();
  }

  public FontMetrics getFontMetrics (Font font)
  {
    return new QtFontMetrics( this );
  }

  public boolean hasUniformLineMetrics (Font font)
  {
    throw new UnsupportedOperationException();
  }

  public LineMetrics getLineMetrics (Font font, 
				     CharacterIterator ci, 
				     int begin, int limit, 
				     FontRenderContext rc)
  {
    throw new UnsupportedOperationException();
  }

  public Rectangle2D getMaxCharBounds (Font font, 
				       FontRenderContext rc)
  {
    throw new UnsupportedOperationException();
  }

}
