//----------------------------------------------------------------------------
//    filename             : kmdichildfrmcaption.cpp
//----------------------------------------------------------------------------
//    Project              : KDE MDI extension
//
//    begin                : 07/1999       by Szymon Stefanek as part of kvirc
//                                         (an IRC application)
//    changes              : 09/1999       by Falk Brettschneider to create an
//                           - 06/2000     stand-alone Qt extension set of
//                                         classes and a Qt-based library
//                           2000-2003     maintained by the KDevelop project
//
//    copyright            : (C) 1999-2003 by Szymon Stefanek (stefanek@tin.it)
//                                         and
//                                         Falk Brettschneider
//    email                :  falkbr@kdevelop.org (Falk Brettschneider)
//----------------------------------------------------------------------------
//
//----------------------------------------------------------------------------
//
//    This program is free software; you can redistribute it and/or modify
//    it under the terms of the GNU Library General Public License as
//    published by the Free Software Foundation; either version 2 of the
//    License, or (at your option) any later version.
//
//----------------------------------------------------------------------------

#include "kmdichildfrmcaption.h"
#include "kmdichildfrmcaption.moc"

#include <qpainter.h>
#include <qapplication.h>
#include <qcursor.h>
#include <qtoolbutton.h>
#include <qpopupmenu.h>

#include "kmdidefines.h"
#include "kmdichildfrm.h"
#include "kmdichildarea.h"
#include "kmdimainfrm.h"
#include <klocale.h>
#include <iostream>

#ifdef Q_WS_WIN 
//TODO: one day gradient can be added for win98/winnt5+
// ask system properties on windows
#ifndef SPI_GETGRADIENTCAPTIONS
# define SPI_GETGRADIENTCAPTIONS 0x1008
#endif
#ifndef COLOR_GRADIENTACTIVECAPTION
# define COLOR_GRADIENTACTIVECAPTION 27
#endif
#ifndef COLOR_GRADIENTINACTIVECAPTION
# define COLOR_GRADIENTINACTIVECAPTION 28
#endif
#endif 
//#endif

//////////////////////////////////////////////////////////////////////////////
// Class   : KMdiChildFrmCaption
// Purpose : An MDI label that draws the title
//
//
//////////////////////////////////////////////////////////////////////////////

//============== KMdiChildFrmCaption =============//

KMdiChildFrmCaption::KMdiChildFrmCaption( KMdiChildFrm *parent )
		: QWidget( parent, "kmdi_childfrmcaption" )
{
	m_szCaption = i18n( "Unnamed" );
	m_bActive = false;
	m_pParent = parent;
	setBackgroundMode( NoBackground );
	setFocusPolicy( NoFocus );
	m_bChildInDrag = false;
}

//============== ~KMdiChildFrmCaption =============//

KMdiChildFrmCaption::~KMdiChildFrmCaption()
{}

//============= mousePressEvent ==============//

void KMdiChildFrmCaption::mousePressEvent( QMouseEvent *e )
{
	if ( e->button() == LeftButton )
	{
		setMouseTracking( false );
		if ( KMdiMainFrm::frameDecorOfAttachedViews() != KMdi::Win95Look )
		{
			QApplication::setOverrideCursor( Qt::sizeAllCursor, true );
		}
		m_pParent->m_bDragging = true;
		m_offset = mapToParent( e->pos() );
	}
	else if ( e->button() == RightButton )
	{
		m_pParent->systemMenu()->popup( mapToGlobal( e->pos() ) );
	}
}

//============= mouseReleaseEvent ============//

void KMdiChildFrmCaption::mouseReleaseEvent( QMouseEvent *e )
{
	if ( e->button() == LeftButton )
	{
		if ( KMdiMainFrm::frameDecorOfAttachedViews() != KMdi::Win95Look )
			QApplication::restoreOverrideCursor();
		
		releaseMouse();
		if ( m_pParent->m_bDragging )
		{
			m_pParent->m_bDragging = false;
			if ( m_bChildInDrag )
			{
				//notify child view
				KMdiChildFrmDragEndEvent ue( e );
				if ( m_pParent->m_pClient != 0L )
					QApplication::sendEvent( m_pParent->m_pClient, &ue );
				
				m_bChildInDrag = false;
			}
		}
	}
}

//============== mouseMoveEvent =============//
void KMdiChildFrmCaption::mouseMoveEvent( QMouseEvent *e )
{
	if ( !m_pParent->m_bDragging )
		return ;

	if ( !m_bChildInDrag )
	{
		//notify child view
		KMdiChildFrmDragBeginEvent ue( e );
		if ( m_pParent->m_pClient != 0L )
			QApplication::sendEvent( m_pParent->m_pClient, &ue );
		
		m_bChildInDrag = true;
	}

	QPoint relMousePosInChildArea = m_pParent->m_pManager->mapFromGlobal( e->globalPos() );

	// mouse out of child area? stop child frame dragging
	if ( !m_pParent->m_pManager->rect().contains( relMousePosInChildArea ) )
	{
		if ( relMousePosInChildArea.x() < 0 )
			relMousePosInChildArea.rx() = 0;
		
		if ( relMousePosInChildArea.y() < 0 )
			relMousePosInChildArea.ry() = 0;
		
		if ( relMousePosInChildArea.x() > m_pParent->m_pManager->width() )
			relMousePosInChildArea.rx() = m_pParent->m_pManager->width();
		
		if ( relMousePosInChildArea.y() > m_pParent->m_pManager->height() )
			relMousePosInChildArea.ry() = m_pParent->m_pManager->height();
	}
	QPoint mousePosInChildArea = relMousePosInChildArea - m_offset;

	// set new child frame position
	parentWidget() ->move( mousePosInChildArea );
}

//=============== setActive ===============//

void KMdiChildFrmCaption::setActive( bool bActive )
{
	if ( m_bActive == bActive )
		return ;

	//    Ensure the icon's pixmap has the correct bg color
	m_pParent->m_pWinIcon->setBackgroundColor( bActive ?
	                                           m_pParent->m_pManager->m_captionActiveBackColor :
	                                           m_pParent->m_pManager->m_captionInactiveBackColor );
	m_pParent->m_pUnixIcon->setBackgroundColor( bActive ?
	                                            m_pParent->m_pManager->m_captionActiveBackColor :
	                                            m_pParent->m_pManager->m_captionInactiveBackColor );

	m_bActive = bActive;
	repaint( false );
}

//=============== setCaption ===============//

void KMdiChildFrmCaption::setCaption( const QString& text )
{
	m_szCaption = text;
	repaint( false );
}

//============== heightHint ===============//

int KMdiChildFrmCaption::heightHint()
{
	int hint = m_pParent->m_pManager->m_captionFontLineSpacing + 3;
	if ( KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::Win95Look )
	{
		if ( hint < 18 )
			hint = 18;
	}
	else if ( KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDE1Look )
	{
		if ( hint < 20 )
			hint = 20;
	}
	else if ( KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDELook )
	{
		if ( hint < 16 )
			hint = 16;
	}
	else
	{   // kde2laptop look
		hint -= 4;
		if ( hint < 14 )
			hint = 14;
	}
	return hint;
}

//=============== paintEvent ==============//

void KMdiChildFrmCaption::paintEvent( QPaintEvent * )
{
	QPainter p( this );
	QRect r = rect();
	p.setFont( m_pParent->m_pManager->m_captionFont );
	
	if ( m_bActive )
	{
		p.fillRect( r, m_pParent->m_pManager->m_captionActiveBackColor );
		p.setPen( m_pParent->m_pManager->m_captionActiveForeColor );
	}
	else
	{
		p.fillRect( r, m_pParent->m_pManager->m_captionInactiveBackColor );
		p.setPen( m_pParent->m_pManager->m_captionInactiveForeColor );
	}
	
	//Shift the text after the icon
	if ( KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::Win95Look )
		r.setLeft( r.left() + m_pParent->icon() ->width() + 3 );
	else if ( KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDE1Look )
		r.setLeft( r.left() + 22 );
	else if ( KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDELook )
		r.setLeft( r.left() + m_pParent->icon() ->width() + 3 );
	else  // kde2laptop look
		r.setLeft( r.left() + 30 );

	int captionWidthForText = width() - 4 * m_pParent->m_pClose->width() - m_pParent->icon() ->width() - 5;
	QString text = abbreviateText( m_szCaption, captionWidthForText );
	p.drawText( r, AlignVCenter | AlignLeft | SingleLine, text );

}


QString KMdiChildFrmCaption::abbreviateText( QString origStr, int maxWidth )
{
	QFontMetrics fm = fontMetrics();
	int actualWidth = fm.width( origStr );

	int realLetterCount = origStr.length();
	int newLetterCount;
	
	if ( actualWidth != 0 )
		newLetterCount = ( maxWidth * realLetterCount ) / actualWidth;
	else
		newLetterCount = realLetterCount; // should be 0 anyway

	int w = maxWidth + 1;
	QString s = origStr;
	
	if ( newLetterCount <= 0 )
		s = "";
	
	while ( ( w > maxWidth ) && ( newLetterCount >= 1 ) )
	{
		if ( newLetterCount < realLetterCount )
		{
			if ( newLetterCount > 3 )
				s = origStr.left( newLetterCount / 2 ) + "..." + origStr.right( newLetterCount / 2 );
			else
			{
				if ( newLetterCount > 1 )
					s = origStr.left( newLetterCount ) + "..";
				else
					s = origStr.left( 1 );
			}
		}
		QFontMetrics fm = fontMetrics();
		w = fm.width( s );
		newLetterCount--;
	}
	return s;
}

//============= mouseDoubleClickEvent ===========//

void KMdiChildFrmCaption::mouseDoubleClickEvent( QMouseEvent * )
{
	m_pParent->maximizePressed();
}

//============= slot_moveViaSystemMenu ===========//

void KMdiChildFrmCaption::slot_moveViaSystemMenu()
{
	setMouseTracking( true );
	grabMouse();
	
	if ( KMdiMainFrm::frameDecorOfAttachedViews() != KMdi::Win95Look )
		QApplication::setOverrideCursor( Qt::sizeAllCursor, true );
	
	m_pParent->m_bDragging = true;
	m_offset = mapFromGlobal( QCursor::pos() );
}

// kate: space-indent off; replace-tabs off; indent-mode csands; tab-width 4;
