00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#include "kmdichildfrmcaption.h"
00029
#include "kmdichildfrmcaption.moc"
00030
00031
#include <qpainter.h>
00032
#include <qapplication.h>
00033
#include <qcursor.h>
00034
#include <qtoolbutton.h>
00035
#include <qpopupmenu.h>
00036
00037
#include "kmdidefines.h"
00038
#include "kmdichildfrm.h"
00039
#include "kmdichildarea.h"
00040
#include "kmdimainfrm.h"
00041
#include <klocale.h>
00042
#include <iostream>
00043
00044
#ifdef Q_WS_WIN
00045
00046
00047
#ifndef SPI_GETGRADIENTCAPTIONS
00048
# define SPI_GETGRADIENTCAPTIONS 0x1008
00049
#endif
00050
#ifndef COLOR_GRADIENTACTIVECAPTION
00051
# define COLOR_GRADIENTACTIVECAPTION 27
00052
#endif
00053
#ifndef COLOR_GRADIENTINACTIVECAPTION
00054
# define COLOR_GRADIENTINACTIVECAPTION 28
00055
#endif
00056
#endif
00057
00058
00060
00061
00062
00063
00065
00066
00067
00068 KMdiChildFrmCaption::KMdiChildFrmCaption(
KMdiChildFrm *parent )
00069 :
QWidget( parent, "kmdi_childfrmcaption" )
00070 {
00071
m_szCaption = i18n(
"Unnamed" );
00072
m_bActive =
false;
00073
m_pParent = parent;
00074 setBackgroundMode( NoBackground );
00075 setFocusPolicy( NoFocus );
00076
m_bChildInDrag =
false;
00077 }
00078
00079
00080
00081 KMdiChildFrmCaption::~KMdiChildFrmCaption()
00082 {}
00083
00084
00085
00086 void KMdiChildFrmCaption::mousePressEvent(
QMouseEvent *e )
00087 {
00088
if ( e->
button() == LeftButton )
00089 {
00090 setMouseTracking(
false );
00091
if (
KMdiMainFrm::frameDecorOfAttachedViews() != KMdi::Win95Look )
00092 {
00093 QApplication::setOverrideCursor( Qt::sizeAllCursor,
true );
00094 }
00095
m_pParent->
m_bDragging =
true;
00096
m_offset = mapToParent( e->
pos() );
00097 }
00098
else if ( e->
button() == RightButton )
00099 {
00100
m_pParent->
systemMenu()->
popup( mapToGlobal( e->
pos() ) );
00101 }
00102 }
00103
00104
00105
00106 void KMdiChildFrmCaption::mouseReleaseEvent(
QMouseEvent *e )
00107 {
00108
if ( e->
button() == LeftButton )
00109 {
00110
if (
KMdiMainFrm::frameDecorOfAttachedViews() != KMdi::Win95Look )
00111
QApplication::restoreOverrideCursor();
00112
00113
releaseMouse();
00114
if (
m_pParent->
m_bDragging )
00115 {
00116
m_pParent->
m_bDragging =
false;
00117
if (
m_bChildInDrag )
00118 {
00119
00120
KMdiChildFrmDragEndEvent ue( e );
00121
if (
m_pParent->
m_pClient != 0L )
00122 QApplication::sendEvent(
m_pParent->
m_pClient, &ue );
00123
00124
m_bChildInDrag =
false;
00125 }
00126 }
00127 }
00128 }
00129
00130
00131 void KMdiChildFrmCaption::mouseMoveEvent(
QMouseEvent *e )
00132 {
00133
if ( !
m_pParent->
m_bDragging )
00134
return ;
00135
00136
if ( !
m_bChildInDrag )
00137 {
00138
00139
KMdiChildFrmDragBeginEvent ue( e );
00140
if (
m_pParent->
m_pClient != 0L )
00141 QApplication::sendEvent(
m_pParent->
m_pClient, &ue );
00142
00143
m_bChildInDrag =
true;
00144 }
00145
00146
QPoint relMousePosInChildArea =
m_pParent->
m_pManager->mapFromGlobal( e->
globalPos() );
00147
00148
00149
if ( !
m_pParent->
m_pManager->rect().contains( relMousePosInChildArea ) )
00150 {
00151
if ( relMousePosInChildArea.
x() < 0 )
00152 relMousePosInChildArea.
rx() = 0;
00153
00154
if ( relMousePosInChildArea.
y() < 0 )
00155 relMousePosInChildArea.
ry() = 0;
00156
00157
if ( relMousePosInChildArea.
x() >
m_pParent->
m_pManager->width() )
00158 relMousePosInChildArea.
rx() =
m_pParent->
m_pManager->width();
00159
00160
if ( relMousePosInChildArea.
y() >
m_pParent->
m_pManager->height() )
00161 relMousePosInChildArea.
ry() =
m_pParent->
m_pManager->height();
00162 }
00163
QPoint mousePosInChildArea = relMousePosInChildArea -
m_offset;
00164
00165
00166 parentWidget() ->move( mousePosInChildArea );
00167 }
00168
00169
00170
00171 void KMdiChildFrmCaption::setActive(
bool bActive )
00172 {
00173
if (
m_bActive == bActive )
00174
return ;
00175
00176
00177
m_pParent->
m_pWinIcon->setBackgroundColor( bActive ?
00178
m_pParent->
m_pManager->
m_captionActiveBackColor :
00179
m_pParent->
m_pManager->
m_captionInactiveBackColor );
00180
m_pParent->
m_pUnixIcon->setBackgroundColor( bActive ?
00181
m_pParent->
m_pManager->
m_captionActiveBackColor :
00182
m_pParent->
m_pManager->
m_captionInactiveBackColor );
00183
00184
m_bActive = bActive;
00185
repaint(
false );
00186 }
00187
00188
00189
00190 void KMdiChildFrmCaption::setCaption(
const QString& text )
00191 {
00192
m_szCaption = text;
00193
repaint(
false );
00194 }
00195
00196
00197
00198 int KMdiChildFrmCaption::heightHint()
00199 {
00200
int hint =
m_pParent->
m_pManager->
m_captionFontLineSpacing + 3;
00201
if (
KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::Win95Look )
00202 {
00203
if ( hint < 18 )
00204 hint = 18;
00205 }
00206
else if (
KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDE1Look )
00207 {
00208
if ( hint < 20 )
00209 hint = 20;
00210 }
00211
else if (
KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDELook )
00212 {
00213
if ( hint < 16 )
00214 hint = 16;
00215 }
00216
else
00217 {
00218 hint -= 4;
00219
if ( hint < 14 )
00220 hint = 14;
00221 }
00222
return hint;
00223 }
00224
00225
00226
00227 void KMdiChildFrmCaption::paintEvent(
QPaintEvent * )
00228 {
00229
QPainter p(
this );
00230
QRect r =
rect();
00231 p.
setFont(
m_pParent->
m_pManager->
m_captionFont );
00232
00233
if (
m_bActive )
00234 {
00235 p.
fillRect( r,
m_pParent->
m_pManager->
m_captionActiveBackColor );
00236 p.
setPen(
m_pParent->
m_pManager->
m_captionActiveForeColor );
00237 }
00238
else
00239 {
00240 p.
fillRect( r,
m_pParent->
m_pManager->
m_captionInactiveBackColor );
00241 p.
setPen(
m_pParent->
m_pManager->
m_captionInactiveForeColor );
00242 }
00243
00244
00245
if (
KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::Win95Look )
00246 r.
setLeft( r.
left() +
m_pParent->
icon() ->
width() + 3 );
00247
else if (
KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDE1Look )
00248 r.
setLeft( r.
left() + 22 );
00249
else if (
KMdiMainFrm::frameDecorOfAttachedViews() == KMdi::KDELook )
00250 r.
setLeft( r.
left() +
m_pParent->
icon() ->
width() + 3 );
00251
else
00252 r.
setLeft( r.
left() + 30 );
00253
00254
int captionWidthForText =
width() - 4 *
m_pParent->
m_pClose->width() -
m_pParent->
icon() ->
width() - 5;
00255
QString text =
abbreviateText(
m_szCaption, captionWidthForText );
00256 p.
drawText( r, AlignVCenter | AlignLeft | SingleLine, text );
00257
00258 }
00259
00260
00261 QString KMdiChildFrmCaption::abbreviateText(
QString origStr,
int maxWidth )
00262 {
00263
QFontMetrics fm =
fontMetrics();
00264
int actualWidth = fm.
width( origStr );
00265
00266
int realLetterCount = origStr.
length();
00267
int newLetterCount;
00268
00269
if ( actualWidth != 0 )
00270 newLetterCount = ( maxWidth * realLetterCount ) / actualWidth;
00271
else
00272 newLetterCount = realLetterCount;
00273
00274
int w = maxWidth + 1;
00275
QString s = origStr;
00276
00277
if ( newLetterCount <= 0 )
00278 s =
"";
00279
00280
while ( ( w > maxWidth ) && ( newLetterCount >= 1 ) )
00281 {
00282
if ( newLetterCount < realLetterCount )
00283 {
00284
if ( newLetterCount > 3 )
00285 s = origStr.
left( newLetterCount / 2 ) +
"..." + origStr.
right( newLetterCount / 2 );
00286
else
00287 {
00288
if ( newLetterCount > 1 )
00289 s = origStr.
left( newLetterCount ) +
"..";
00290
else
00291 s = origStr.
left( 1 );
00292 }
00293 }
00294
QFontMetrics fm =
fontMetrics();
00295 w = fm.
width( s );
00296 newLetterCount--;
00297 }
00298
return s;
00299 }
00300
00301
00302
00303 void KMdiChildFrmCaption::mouseDoubleClickEvent(
QMouseEvent * )
00304 {
00305
m_pParent->
maximizePressed();
00306 }
00307
00308
00309
00310 void KMdiChildFrmCaption::slot_moveViaSystemMenu()
00311 {
00312 setMouseTracking(
true );
00313
grabMouse();
00314
00315
if (
KMdiMainFrm::frameDecorOfAttachedViews() != KMdi::Win95Look )
00316 QApplication::setOverrideCursor( Qt::sizeAllCursor,
true );
00317
00318
m_pParent->
m_bDragging =
true;
00319
m_offset = mapFromGlobal( QCursor::pos() );
00320 }
00321
00322