You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kmdi/kmdichildfrmcaption.cpp

323 lines
9.1 KiB

//----------------------------------------------------------------------------
// 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;