/***************************************************************************
*   Copyright (C) 2003 by Unai Garro (ugarro@users.sourceforge.net)       *
*                                                                         *
*                                                                         *
*   This program 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 of the License, or     *
*   (at your option) any later version.                                   *
***************************************************************************/
#include "paneldeco.h"

#include <tqpainter.h>
#include <tqpoint.h>
#include <tqrect.h>

#include <kiconloader.h>
#include <kpixmap.h>
#include <kpixmapeffect.h>


// Panel decoration

PanelDeco::PanelDeco( TQWidget *parent, const char *name, const TQString &title, const TQString &iconName ) : TQVBox( parent, name )
{

	// Top decoration
	tDeco = new TopDeco( this, "TopDecoration", title, iconName );

	hbox = new TQHBox( this );

	//Left decoration
	lDeco = new LeftDeco( hbox, "LeftDecoration" );

	//The widget stack (panels)
	stack = new TQWidgetStack( hbox );
	stack->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding ) );

}


PanelDeco::~PanelDeco()
{}

void PanelDeco::childEvent( TQChildEvent *e )
{
	if ( e->type() == TQEvent::ChildInserted ) {
		TQObject * obj = e->child();
		if ( obj->inherits( "TQWidget" ) ) {
			TQWidget * w = ( TQWidget* ) obj;
			if ( w != hbox && w != tDeco )
				w->reparent( stack, TQPoint( 0, 0 ) );
		}
	}
}


int PanelDeco::id( TQWidget* w )
{
	return ( stack->id( w ) );
}

void PanelDeco::raise( TQWidget *w )
{
	TQWidget * old_w = visiblePanel();

	stack->raiseWidget( w );

	if ( old_w != w )
		emit panelRaised( w, old_w );
}

TQWidget* PanelDeco::visiblePanel( void )
{
	return ( stack->visibleWidget() );
}

void PanelDeco::setHeader( const TQString &title, const TQString &icon )
{
	tDeco->setHeader( title, icon );
}

// Left part of the decoration

LeftDeco::LeftDeco( TQWidget *parent, const char *name ) :
		TQWidget( parent, name, TQt::WNoAutoErase )
{}

LeftDeco::~LeftDeco()
{}

// Top part of the decoration

TopDeco::TopDeco( TQWidget *parent, const char *name, const TQString &title, const TQString &iconName ) :
		TQWidget( parent, name, TQt::WNoAutoErase )
{
	setMinimumHeight( 30 );
	icon = 0;
	panelTitle = TQString::null;
	if ( !iconName.isNull() ) {
		TDEIconLoader il;
		icon = new TQPixmap( il.loadIcon( iconName, TDEIcon::NoGroup, 22 ) );
	}

	if ( !title.isNull() ) {
		panelTitle = title;
	}
}

TopDeco::~TopDeco()
{
	delete icon;
}


void TopDeco::paintEvent( TQPaintEvent * )
{
	// Get gradient colors
	TQColor c1 = colorGroup().button().light( 120 );
	TQColor c2 = paletteBackgroundColor();

	// Draw the gradient
	KPixmap kpm;
	kpm.resize( size() );
	KPixmapEffect::unbalancedGradient ( kpm, c1, c2, KPixmapEffect::VerticalGradient, 150, 150 );

	// Add a line on top
	TQPainter painter( &kpm );
	painter.setPen( colorGroup().button().dark( 130 ) );
	painter.drawLine( 0, 0, width(), 0 );

	// Now Add the icon
	int xpos = 0, ypos = 0;
	if ( icon ) {
		xpos = 20;
		ypos = ( height() - icon->height() ) / 2 - 1;
		painter.drawPixmap( xpos, ypos, *icon );
		xpos += icon->width(); // Move it so that later we can easily place the text
	}

	// Finally, draw the text besides the icon
	if ( !panelTitle.isNull() ) {
		xpos += 15;
		TQRect r = rect();
		r.setLeft( xpos );
		painter.setPen( TQColor( 0x00, 0x00, 0x00 ) );
		TQFont ft = font();
		ft.setBold( true );
		painter.setFont( ft );
		painter.drawText( r, TQt::AlignVCenter, panelTitle );
	}
	painter.end();
	// Copy the pixmap to the widget
	bitBlt( this, 0, 0, &kpm );
}

void TopDeco::setHeader( const TQString &title, const TQString &iconName )
{
	if ( !title.isNull() )
		panelTitle = title;
	if ( !iconName.isNull() ) {
		TDEIconLoader il;
		icon = new TQPixmap( il.loadIcon( iconName, TDEIcon::NoGroup, 22 ) );
	}
	if ( !title.isNull() || !iconName.isNull() )
		update();
}

TQSize TopDeco::sizeHint( void )
{
	return ( TQSize( parentWidget() ->width(), 30 ) );
}

#include "paneldeco.moc"
