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
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "kdhorizontalline.h"
00042
00043 #include <qstyle.h>
00044 #include <qpainter.h>
00045 #ifdef QT_ACCESSIBILITY_SUPPORT
00046 #include <qaccessible.h>
00047 #endif
00048 #include <qfontmetrics.h>
00049 #include <qapplication.h>
00050
00051 KDHorizontalLine::KDHorizontalLine( QWidget * parent, const char * name, WFlags f )
00052 : QFrame( parent, name, f ),
00053 mAlign( Qt::AlignAuto ),
00054 mLenVisible( 0 )
00055 {
00056 QFrame::setFrameStyle( HLine | Sunken );
00057 }
00058
00059 KDHorizontalLine::KDHorizontalLine( const QString & title, QWidget * parent, const char * name, WFlags f )
00060 : QFrame( parent, name, f ),
00061 mAlign( Qt::AlignAuto ),
00062 mLenVisible( 0 )
00063 {
00064 QFrame::setFrameStyle( HLine | Sunken );
00065 setTitle( title );
00066 }
00067
00068 KDHorizontalLine::~KDHorizontalLine() {}
00069
00070 void KDHorizontalLine::setFrameStyle( int style ) {
00071 QFrame::setFrameStyle( ( style & ~MShape ) | HLine );
00072 }
00073
00074 void KDHorizontalLine::setTitle( const QString & title ) {
00075 if ( mTitle == title )
00076 return;
00077 mTitle = title;
00078 calculateFrame();
00079 update();
00080 updateGeometry();
00081 #ifdef QT_ACCESSIBILITY_SUPPORT
00082 QAccessible::updateAccessibility( this, 0, QAccessible::NameChanged );
00083 #endif
00084 }
00085
00086 void KDHorizontalLine::calculateFrame() {
00087 mLenVisible = mTitle.length();
00088 #if 0
00089 if ( mLenVisible ) {
00090 const QFontMetrics fm = fontMetrics();
00091 while ( mLenVisible ) {
00092 const int tw = fm.width( mTitle, mLenVisible ) + 4*fm.width(QChar(' '));
00093 if ( tw < width() )
00094 break;
00095 mLenVisible--;
00096 }
00097 qDebug( "mLenVisible = %d (of %d)", mLenVisible, mTitle.length() );
00098 if ( mLenVisible ) {
00099 QRect r = rect();
00100 const int va = style().styleHint( QStyle::SH_GroupBox_TextLabelVerticalAlignment, this );
00101 if( va & AlignVCenter )
00102 r.setTop( fm.height() / 2 );
00103 else if( va & AlignTop )
00104 r.setTop( fm.ascent() );
00105 setFrameRect( r );
00106 return;
00107 }
00108 }
00109
00110 setFrameRect( QRect(0,0,0,0) );
00111 #endif
00112 }
00113
00114 QSizePolicy KDHorizontalLine::sizePolicy() const {
00115 return QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed );
00116 }
00117
00118 QSize KDHorizontalLine::sizeHint() const {
00119 return minimumSizeHint();
00120 }
00121
00122 QSize KDHorizontalLine::minimumSizeHint() const {
00123 const int w = fontMetrics().width( mTitle, mLenVisible ) +
00124 fontMetrics().width( QChar( ' ' ) );
00125 const int h = fontMetrics().height();
00126 return QSize( QMAX( w, indentHint() ), h ).expandedTo( qApp->globalStrut() );
00127 }
00128
00129 void KDHorizontalLine::paintEvent( QPaintEvent * e ) {
00130 QPainter paint( this );
00131
00132 if ( mLenVisible ) {
00133 const QFontMetrics & fm = paint.fontMetrics();
00134 const int h = fm.height();
00135 const int tw = fm.width( mTitle, mLenVisible ) + fm.width(QChar(' '));
00136 int x;
00137 if ( mAlign & AlignHCenter )
00138 x = frameRect().width()/2 - tw/2;
00139 else if ( mAlign & AlignRight )
00140 x = frameRect().width() - tw;
00141 else if ( mAlign & AlignLeft )
00142 x = 0;
00143 else {
00144 if( QApplication::reverseLayout() )
00145 x = frameRect().width() - tw;
00146 else
00147 x = 0;
00148 }
00149 QRect r( x, 0, tw, h );
00150 int va = style().styleHint( QStyle::SH_GroupBox_TextLabelVerticalAlignment, this );
00151 if ( va & AlignTop )
00152 r.moveBy( 0, fm.descent() );
00153 const QColor pen( (QRgb) style().styleHint( QStyle::SH_GroupBox_TextLabelColor, this ) );
00154 #if QT_VERSION >= 0x030300
00155 if ( !style().styleHint( QStyle::SH_UnderlineAccelerator, this ) )
00156 va |= NoAccel;
00157 #endif
00158 style().drawItem( &paint, r, ShowPrefix | AlignHCenter | va, colorGroup(),
00159 isEnabled(), 0, mTitle, -1, ownPalette() ? 0 : &pen );
00160 paint.setClipRegion( e->region().subtract( r ) );
00161 }
00162 drawFrame( &paint );
00163 drawContents( &paint );
00164 }
00165
00166
00167 int KDHorizontalLine::indentHint() {
00168 return 30;
00169 }
00170
00171 #include "kdhorizontalline.moc"