//=============================================================================
//
//   File : kvi_tal_listbox.cpp
//   Creation date : Mon Jan 22 2007 11:25:08 by Szymon Stefanek
//
//   This file is part of the KVirc irc client distribution
//   Copyright (C) 2007 Szymon Stefanek (pragma at kvirc dot 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 opinion) any later version.
//
//   This program 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 this program. If not, write to the Free Software Foundation,
//   Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=============================================================================

#define __KVILIB__
#include "kvi_tal_listbox.h"

#ifdef COMPILE_USE_QT4
	#include <tqpainter.h>
	#include <tqstyle.h>
	#include <tqapplication.h>
	
	KviTalListBox::KviTalListBox(TQWidget * pParent,TQt::WFlags f)
	: Q3ListBox(pParent,0,f)
	{
		connect(this,TQT_SIGNAL(highlighted(Q3ListBoxItem *)),this,TQT_SLOT(redirect_highlighted(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(selected(Q3ListBoxItem *)),this,TQT_SLOT(redirect_selected(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(selectionChanged(Q3ListBoxItem *)),this,TQT_SLOT(redirect_selectionChanged(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(currentChanged(Q3ListBoxItem *)),this,TQT_SLOT(redirect_currentChanged(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(clicked(Q3ListBoxItem *)),this,TQT_SLOT(redirect_clicked(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(clicked(Q3ListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_clicked(Q3ListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(pressed(Q3ListBoxItem *)),this,TQT_SLOT(redirect_pressed(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(pressed(Q3ListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_pressed(Q3ListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(doubleClicked(Q3ListBoxItem *)),this,TQT_SLOT(redirect_doubleClicked(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(returnPressed(Q3ListBoxItem *)),this,TQT_SLOT(redirect_returnPressed(Q3ListBoxItem *)));
		connect(this,TQT_SIGNAL(rightButtonClicked(Q3ListBoxItem *, const TQPoint &)),this,TQT_SLOT(redirect_rightButtonClicked(Q3ListBoxItem *, const TQPoint &)));
		connect(this,TQT_SIGNAL(rightButtonPressed(Q3ListBoxItem *, const TQPoint &)),this,TQT_SLOT(redirect_rightButtonPressed(Q3ListBoxItem *, const TQPoint &)));
		connect(this,TQT_SIGNAL(mouseButtonPressed(int,Q3ListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_mouseButtonPressed(int,Q3ListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(mouseButtonClicked(int,Q3ListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_mouseButtonClicked(int,Q3ListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(contextMenuRequested(Q3ListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_contextMenuRequested(Q3ListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(onItem(Q3ListBoxItem *)),this,TQT_SLOT(redirect_onItem(Q3ListBoxItem *)));
	}

	void KviTalListBox::redirect_highlighted(Q3ListBoxItem *item)
	{
		emit highlighted((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_selected(Q3ListBoxItem *item)
	{
		emit selected((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_selectionChanged(Q3ListBoxItem * item)
	{
		emit selectionChanged((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_currentChanged(Q3ListBoxItem * item)
	{
		emit currentChanged((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_clicked(Q3ListBoxItem * item)
	{
		emit clicked((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_clicked(Q3ListBoxItem * item,const TQPoint & pnt)
	{
		emit clicked((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_pressed(Q3ListBoxItem * item)
	{
		emit pressed((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_pressed(Q3ListBoxItem * item,const TQPoint & pnt)
	{
		emit pressed((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_doubleClicked(Q3ListBoxItem * item)
	{
		emit doubleClicked((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_returnPressed(Q3ListBoxItem * item)
	{
		emit returnPressed((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_rightButtonClicked(Q3ListBoxItem * item, const TQPoint &pnt)
	{
		emit rightButtonClicked((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_rightButtonPressed(Q3ListBoxItem * item, const TQPoint &pnt)
	{
		emit rightButtonPressed((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_mouseButtonPressed(int button,Q3ListBoxItem * item,const TQPoint & pos)
	{
		emit mouseButtonPressed(button,(KviTalListBoxItem *)item,pos);
	}

	void KviTalListBox::redirect_mouseButtonClicked(int button,Q3ListBoxItem * item,const TQPoint & pos)
	{
		emit mouseButtonClicked(button,(KviTalListBoxItem *)item,pos);
	}

	void KviTalListBox::redirect_contextMenuRequested(Q3ListBoxItem * item,const TQPoint & pos)
	{
		emit contextMenuRequested((KviTalListBoxItem *)item,pos);
	}

	void KviTalListBox::redirect_onItem(Q3ListBoxItem * i)
	{
		emit onItem((KviTalListBoxItem *)i);
	}

	KviTalListBoxText::KviTalListBoxText(KviTalListBox *listbox, const TQString &text)
	    :KviTalListBoxItem(listbox)
	{
	    setText(text);
	}

	KviTalListBoxText::KviTalListBoxText(const TQString &text)
	    :KviTalListBoxItem()
	{
	    setText(text);
	}
	
	KviTalListBoxText::KviTalListBoxText(KviTalListBox* listbox, const TQString &text, KviTalListBoxItem *after)
	    : KviTalListBoxItem(listbox, after)
	{
	    setText(text);
	}
	
	KviTalListBoxText::~KviTalListBoxText()
	{
	}
	
	void KviTalListBoxText::paint(TQPainter *painter)
	{
	    int itemHeight = height(listBox());
	    TQFontMetrics fm = painter->fontMetrics();
	    int yPos = ((itemHeight - fm.height()) / 2) + fm.ascent();
	    painter->drawText(3, yPos, text());
	}
	
	int KviTalListBoxText::height(const KviTalListBox* lb) const
	{
	    int h = lb ? lb->fontMetrics().lineSpacing() + 2 : 0;
	    return qMax(h, TQApplication::globalStrut().height());
	}
	
	int KviTalListBoxText::width(const KviTalListBox* lb) const
	{
	    int w = lb ? lb->fontMetrics().width(text()) + 6 : 0;
	    return qMax(w, TQApplication::globalStrut().width());
	}
	
	int KviTalListBoxText::rtti() const
	{
	    return RTTI;
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap(KviTalListBox* listbox, const TQPixmap &pixmap)
	    : KviTalListBoxItem(listbox)
	{
	    pm = pixmap;
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap(const TQPixmap &pixmap)
	    : KviTalListBoxItem()
	{
	    pm = pixmap;
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap(KviTalListBox* listbox, const TQPixmap &pixmap, KviTalListBoxItem *after)
	    : KviTalListBoxItem(listbox, after)
	{
	    pm = pixmap;
	}
	
	KviTalListBoxPixmap::~KviTalListBoxPixmap()
	{
	}

	KviTalListBoxPixmap::KviTalListBoxPixmap(KviTalListBox* listbox, const TQPixmap &pix, const TQString& text)
	    : KviTalListBoxItem(listbox)
	{
	    pm = pix;
	    setText(text);
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap(const TQPixmap & pix, const TQString& text)
	    : KviTalListBoxItem()
	{
	    pm = pix;
	    setText(text);
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap(KviTalListBox* listbox, const TQPixmap & pix, const TQString& text,
	                                KviTalListBoxItem *after)
	    : KviTalListBoxItem(listbox, after)
	{
	    pm = pix;
	    setText(text);
	}
	
	void KviTalListBoxPixmap::paint(TQPainter *painter)
	{
	    int itemHeight = height(listBox());
	    int yPos;
	
	    const TQPixmap *pm = pixmap();
	    if (pm && ! pm->isNull()) {
	        yPos = (itemHeight - pm->height()) / 2;
	        painter->drawPixmap(3, yPos, *pm);
	    }
	
	    if (!text().isEmpty()) {
	        TQFontMetrics fm = painter->fontMetrics();
	        yPos = ((itemHeight - fm.height()) / 2) + fm.ascent();
	        painter->drawText(pm->width() + 5, yPos, text());
	    }
	}
	
	int KviTalListBoxPixmap::height(const KviTalListBox* lb) const
	{
	    int h;
	    if (text().isEmpty())
	        h = pm.height();
	    else
	        h = qMax(pm.height(), lb->fontMetrics().lineSpacing() + 2);
	    return qMax(h, TQApplication::globalStrut().height());
	}
	
	int KviTalListBoxPixmap::width(const KviTalListBox* lb) const
	{
	    if (text().isEmpty())
	        return qMax(pm.width() + 6, TQApplication::globalStrut().width());
	    return qMax(pm.width() + lb->fontMetrics().width(text()) + 6,
	            TQApplication::globalStrut().width());
	}
	
	int KviTalListBoxPixmap::rtti() const
	{
	    return RTTI;
	}
	

	#include "kvi_tal_listbox_qt4.moc"
#else
	#include <tqpainter.h>
	#include <tqstyle.h>
	#include <tqapplication.h>


	KviTalListBox::KviTalListBox(TQWidget * pParent,TQt::WFlags f)
	: TQListBox(pParent,0,f)
	{
		connect(this,TQT_SIGNAL(highlighted(TQListBoxItem *)),this,TQT_SLOT(redirect_highlighted(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(selected(TQListBoxItem *)),this,TQT_SLOT(redirect_selected(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(selectionChanged(TQListBoxItem *)),this,TQT_SLOT(redirect_selectionChanged(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(currentChanged(TQListBoxItem *)),this,TQT_SLOT(redirect_currentChanged(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(clicked(TQListBoxItem *)),this,TQT_SLOT(redirect_clicked(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(clicked(TQListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_clicked(TQListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(pressed(TQListBoxItem *)),this,TQT_SLOT(redirect_pressed(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(pressed(TQListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_pressed(TQListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(doubleClicked(TQListBoxItem *)),this,TQT_SLOT(redirect_doubleClicked(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(returnPressed(TQListBoxItem *)),this,TQT_SLOT(redirect_returnPressed(TQListBoxItem *)));
		connect(this,TQT_SIGNAL(rightButtonClicked(TQListBoxItem *, const TQPoint &)),this,TQT_SLOT(redirect_rightButtonClicked(TQListBoxItem *, const TQPoint &)));
		connect(this,TQT_SIGNAL(rightButtonPressed(TQListBoxItem *, const TQPoint &)),this,TQT_SLOT(redirect_rightButtonPressed(TQListBoxItem *, const TQPoint &)));
		connect(this,TQT_SIGNAL(mouseButtonPressed(int,TQListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_mouseButtonPressed(int,TQListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(mouseButtonClicked(int,TQListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_mouseButtonClicked(int,TQListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(contextMenuRequested(TQListBoxItem *,const TQPoint &)),this,TQT_SLOT(redirect_contextMenuRequested(TQListBoxItem *,const TQPoint &)));
		connect(this,TQT_SIGNAL(onItem(TQListBoxItem *)),this,TQT_SLOT(redirect_onItem(TQListBoxItem *)));
	}

	void KviTalListBox::redirect_highlighted(TQListBoxItem *item)
	{
		emit highlighted((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_selected(TQListBoxItem *item)
	{
		emit selected((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_selectionChanged(TQListBoxItem * item)
	{
		emit selectionChanged((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_currentChanged(TQListBoxItem * item)
	{
		emit currentChanged((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_clicked(TQListBoxItem * item)
	{
		emit clicked((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_clicked(TQListBoxItem * item,const TQPoint & pnt)
	{
		emit clicked((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_pressed(TQListBoxItem * item)
	{
		emit pressed((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_pressed(TQListBoxItem * item,const TQPoint & pnt)
	{
		emit pressed((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_doubleClicked(TQListBoxItem * item)
	{
		emit doubleClicked((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_returnPressed(TQListBoxItem * item)
	{
		emit returnPressed((KviTalListBoxItem *)item);
	}

	void KviTalListBox::redirect_rightButtonClicked(TQListBoxItem * item, const TQPoint &pnt)
	{
		emit rightButtonClicked((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_rightButtonPressed(TQListBoxItem * item, const TQPoint &pnt)
	{
		emit rightButtonPressed((KviTalListBoxItem *)item,pnt);
	}

	void KviTalListBox::redirect_mouseButtonPressed(int button,TQListBoxItem * item,const TQPoint & pos)
	{
		emit mouseButtonPressed(button,(KviTalListBoxItem *)item,pos);
	}

	void KviTalListBox::redirect_mouseButtonClicked(int button,TQListBoxItem * item,const TQPoint & pos)
	{
		emit mouseButtonClicked(button,(KviTalListBoxItem *)item,pos);
	}

	void KviTalListBox::redirect_contextMenuRequested(TQListBoxItem * item,const TQPoint & pos)
	{
		emit contextMenuRequested((KviTalListBoxItem *)item,pos);
	}

	void KviTalListBox::redirect_onItem(TQListBoxItem * i)
	{
		emit onItem((KviTalListBoxItem *)i);
	}

	KviTalListBoxText::KviTalListBoxText( KviTalListBox *listbox, const TQString &text )
	    :KviTalListBoxItem( listbox )
	{
	    setText( text );
	}
	
	KviTalListBoxText::KviTalListBoxText( const TQString &text )
	    :KviTalListBoxItem()
	{
	    setText( text );
	}
	
	KviTalListBoxText::KviTalListBoxText( KviTalListBox* listbox, const TQString &text, KviTalListBoxItem *after )
	    : KviTalListBoxItem( listbox, after )
	{
	    setText( text );
	}
	
	KviTalListBoxText::~KviTalListBoxText()
	{
	}
	
	void KviTalListBoxText::paint( TQPainter *painter )
	{
	    int itemHeight = height( listBox() );
	    TQFontMetrics fm = painter->fontMetrics();
	    int yPos = ( ( itemHeight - fm.height() ) / 2 ) + fm.ascent();
	    painter->drawText( 3, yPos, text() );
	}
	
	int KviTalListBoxText::height( const KviTalListBox* lb ) const
	{
	    int h = lb ? lb->fontMetrics().lineSpacing() + 2 : 0;
	    return TQMAX( h, TQApplication::globalStrut().height() );
	}
	
	int KviTalListBoxText::width( const KviTalListBox* lb ) const
	{
	    int w = lb ? lb->fontMetrics().width( text() ) + 6 : 0;
	    return TQMAX( w, TQApplication::globalStrut().width() );
	}
	
	int KviTalListBoxText::RTTI = 1;
	
	int KviTalListBoxText::rtti() const
	{
	    return RTTI;
	}

	KviTalListBoxPixmap::KviTalListBoxPixmap( KviTalListBox* listbox, const TQPixmap &pixmap )
	    : KviTalListBoxItem( listbox )
	{
	    pm = pixmap;
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap( const TQPixmap &pixmap )
	    : KviTalListBoxItem()
	{
	    pm = pixmap;
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap( KviTalListBox* listbox, const TQPixmap &pixmap, KviTalListBoxItem *after )
	    : KviTalListBoxItem( listbox, after )
	{
	    pm = pixmap;
	}
	
	KviTalListBoxPixmap::~KviTalListBoxPixmap()
	{
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap( KviTalListBox* listbox, const TQPixmap &pix, const TQString& text)
	    : KviTalListBoxItem( listbox )
	{
	    pm = pix;
	    setText( text );
	}

	KviTalListBoxPixmap::KviTalListBoxPixmap( const TQPixmap & pix, const TQString& text)
	    : KviTalListBoxItem()
	{
	    pm = pix;
	    setText( text );
	}
	
	KviTalListBoxPixmap::KviTalListBoxPixmap( KviTalListBox* listbox, const TQPixmap & pix, const TQString& text,
					KviTalListBoxItem *after )
	    : KviTalListBoxItem( listbox, after )
	{
	    pm = pix;
	    setText( text );
	}
	
	void KviTalListBoxPixmap::paint( TQPainter *painter )
	{
	    int itemHeight = height( listBox() );
	    int yPos;
	
	    const TQPixmap *pm = pixmap();
	    if ( pm && ! pm->isNull() ) {
		yPos = ( itemHeight - pm->height() ) / 2;
		painter->drawPixmap( 3, yPos, *pm);
	    }
	
	    if ( !text().isEmpty() ) {
		TQFontMetrics fm = painter->fontMetrics();
		yPos = ( ( itemHeight - fm.height() ) / 2 ) + fm.ascent();
		painter->drawText( pm->width() + 5, yPos, text() );
	    }
	}
	
	int KviTalListBoxPixmap::height( const KviTalListBox* lb ) const
	{
	    int h;
	    if ( text().isEmpty() )
		h = pm.height();
	    else
		h = TQMAX( pm.height(), lb->fontMetrics().lineSpacing() + 2 );
	    return TQMAX( h, TQApplication::globalStrut().height() );
	}
	
	int KviTalListBoxPixmap::width( const KviTalListBox* lb ) const
	{
	    if ( text().isEmpty() )
		return TQMAX( pm.width() + 6, TQApplication::globalStrut().width() );
	    return TQMAX( pm.width() + lb->fontMetrics().width( text() ) + 6,
		    TQApplication::globalStrut().width() );
	}
	
	int KviTalListBoxPixmap::RTTI = 2;
	
	int KviTalListBoxPixmap::rtti() const
	{
	    return RTTI;
	}
	
	#include "kvi_tal_listbox_qt3.moc"
#endif