/***************************************************************************
* $Id$
**
* Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
**
* This file is part of an example program for Qt.  This example
* program may be used, distributed and modified without limitation.
**
****************************************************************************/

import org.trinitydesktop.qt.*;
import java.math.*;



class FontDisplayer  extends TQMainWindow {



class FontRowTable  extends TQFrame {
private    TQFont tablefont;
private    int row;

FontRowTable( TQWidget parent )
{
	this(parent, null);
}

FontRowTable( TQWidget parent, String name )
{
    super(parent,name);
    setBackgroundMode(PaletteBase);
    setFrameStyle(Panel|Sunken);
    setMargin(8);
    setRow(0);
    tablefont = TQApplication.font();
}

public TQSize sizeHint()
{
	return new TQSize( 16*cellSize().width()+2*(margin()+frameWidth()),
	                  16*cellSize().height()+2*(margin()+frameWidth()) );
}

TQSize cellSize()
{
    TQFontMetrics fm = fontMetrics();
    return new TQSize( fm.maxWidth(), fm.lineSpacing()+1 );
}

protected void paintEvent( TQPaintEvent e )
{
    super.paintEvent(e);
System.out.println("In paintEvent");
    TQPainter p = new TQPainter(this);
    p.setClipRegion(e.region());
    TQRect r = e.rect();
    TQFontMetrics fm = fontMetrics();
    int ml = frameWidth()+margin() + 1 + (-fm.minLeftBearing() > 0 ? -fm.minLeftBearing() : 0);
    int mt = frameWidth()+margin();
    TQSize cell = new TQSize((width()-15-ml)/16,(height()-15-mt)/16);

    if ( cell.width() == 0 || cell.height() == 0 )
	return;

    int mini = r.left() / cell.width();
    int maxi = (r.right()+cell.width()-1) / cell.width();
    int minj = r.top() / cell.height();
    int maxj = (r.bottom()+cell.height()-1) / cell.height();

    int h = fm.height();

    TQColor body = new TQColor(255,255,192);
    TQColor negative = new TQColor(255,192,192);
    TQColor positive = new TQColor(192,192,255);
    TQColor rnegative = new TQColor(255,128,128);
    TQColor rpositive = new TQColor(128,128,255);

    for (int j = minj; j<=maxj; j++) {
	for (int i = mini; i<=maxi; i++) {
	    if ( i < 16 && j < 16 ) {
		int x = i * cell.width();
		int y = j* cell.height();

		char ch = (char) ((j*16+i) + (row*256));
		
		if ( fm.inFont(ch) ) {
		    int w = fm.width(ch);
		    int lb = fm.leftBearing(ch);
		    int rb = fm.rightBearing(ch);

		    x += ml;
		    y += mt+h;

		    p.fillRect(x,y,w,-h,new TQBrush(body));
		    if ( w != 0) {
			if ( lb != 0 ) {
			    p.fillRect(x+(lb>0?0:lb), y-h/2, Math.abs(lb),-h/2,
				       new TQBrush(lb < 0 ? negative : positive));
			}
			if ( rb != 0) {
			    p.fillRect(x+w-(rb>0?rb:0),y+2, Math.abs(rb),-h/2,
				       new TQBrush(rb < 0 ? rnegative : rpositive));
			}
		    }
		    String s = "";
		    s += ch;
		    p.setPen(new TQPen(Qt.black()));
		    p.drawText(x,y,s);
		}
	    }
	}
    }
	p.end();
}

void setRow(int r)
{
    row = r;

    TQFontMetrics fm = fontMetrics();
    String str = "mLB=" + fm.minLeftBearing() + 
	             " mRB=" + fm.minRightBearing() + 
				 " mW=" + fm.maxWidth();

    emit("fontInformation", str);
    update();
}

void chooseFont()
{
    boolean[] ok = { true };
    TQFont oldfont = tablefont;
    tablefont = TQFontDialog.getFont(ok, oldfont, this);

    if (ok[0])
	setFont(tablefont);
    else
	tablefont = oldfont;


}
}

FontDisplayer( )
{
	this(null, null);
}

FontDisplayer( TQWidget parent, String name )
{
    super(parent,name);
    FontRowTable table = new FontRowTable(this);
    TQToolBar controls = new TQToolBar(this);
    new TQLabel(tr("Row:"), controls);
    TQSpinBox row = new TQSpinBox(0,255,1,controls);
    controls.addSeparator();
    TQPushButton fontbutton = new TQPushButton(tr("Font..."), controls);

    connect(row,SIGNAL("valueChanged(int)"),table,SLOT("setRow(int)"));
    connect(fontbutton, SIGNAL("clicked()"), table, SLOT("chooseFont()"));
    connect(table,SIGNAL("fontInformation(String)"),
	    statusBar(),SLOT("message(String)"));
    table.setRow(0);
    setCentralWidget(table);
}
}
