/* * This file is part of the KDE Libraries * Copyright (C) 1999-2001 Mirko Boehm and * Espen Sand * * This library 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. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //MOC_SKIP_BEGIN template class TQPtrList; //MOC_SKIP_END #define WORKTEXT_IDENTATION 16 #define Grid 3 // ############################################################## // MOC OUTPUT FILES: #include "tdeaboutdialog.moc" #include "kaboutdialog_private.moc" // ############################################################## class TDEAboutTabWidget : public TQTabWidget { public: TDEAboutTabWidget( TQWidget* parent ) : TQTabWidget( parent ) {} TQSize sizeHint() const { return TQTabWidget::sizeHint().expandedTo( tabBar()->sizeHint() + TQSize(4,4) ); } }; TDEAboutContributor::TDEAboutContributor( TQWidget *_parent, const char *wname, const TQString &_name,const TQString &_email, const TQString &_url, const TQString &_work, bool showHeader, bool showFrame, bool showBold ) : TQFrame( _parent, wname ), mShowHeader(showHeader), mShowBold(showBold), d(0) { if( showFrame ) { setFrameStyle(TQFrame::Panel | TQFrame::Raised); } mLabel[0] = new TQLabel( this ); mLabel[1] = new TQLabel( this ); mLabel[2] = new TQLabel( this ); mLabel[3] = new TQLabel( this ); mText[0] = new TQLabel( this ); mText[1] = new KURLLabel( this ); mText[2] = new KURLLabel( this ); mText[3] = new TQLabel( this ); setName( _name, i18n("Author"), false ); setEmail( _email, i18n("Email"), false ); setURL( _url, i18n("Homepage"), false ); setWork( _work, i18n("Task"), false ); KURLLabel *kurl = static_cast(mText[1]); kurl->setFloat(true); kurl->setUnderline(true); kurl->setMargin(0); connect(kurl, TQT_SIGNAL(leftClickedURL(const TQString &)), TQT_SLOT(emailClickedSlot(const TQString &))); kurl = static_cast(mText[2]); kurl->setFloat(true); kurl->setUnderline(true); kurl->setMargin(0); connect(kurl, TQT_SIGNAL(leftClickedURL(const TQString &)), TQT_SLOT(urlClickedSlot(const TQString &))); mLabel[3]->setAlignment( AlignTop ); fontChange( font() ); updateLayout(); } void TDEAboutContributor::setName( const TQString &_text, const TQString &_header, bool _update ) { mLabel[0]->setText(_header); mText[0]->setText(_text); if( _update ) { updateLayout(); } } void TDEAboutContributor::setEmail( const TQString &_text, const TQString &_header, bool _update ) { mLabel[1]->setText(_header); KURLLabel* const kurl = static_cast(mText[1]); kurl->setText(_text); kurl->setURL(_text); if( _update ) { updateLayout(); } } void TDEAboutContributor::setURL( const TQString &_text, const TQString &_header, bool _update ) { mLabel[2]->setText(_header); KURLLabel* const kurl = static_cast(mText[2]); kurl->setText(_text); kurl->setURL(_text); if( _update ) { updateLayout(); } } void TDEAboutContributor::setWork( const TQString &_text, const TQString &_header, bool _update ) { mLabel[3]->setText(_header); mText[3]->setText(_text); if( _update ) { updateLayout(); } } TQString TDEAboutContributor::getName( void ) const { return mText[0]->text(); } TQString TDEAboutContributor::getEmail( void ) const { return mText[1]->text(); } TQString TDEAboutContributor::getURL( void ) const { return mText[2]->text(); } TQString TDEAboutContributor::getWork( void ) const { return mText[3]->text(); } void TDEAboutContributor::updateLayout( void ) { delete layout(); int row = 0; if( !mText[0]->text().isEmpty() ) { ++row; } if( !mText[1]->text().isEmpty() ) { ++row; } if( !mText[2]->text().isEmpty() ) { ++row; } if( !mText[3]->text().isEmpty() ) { ++row; } TQGridLayout *gbox; if( row == 0 ) { gbox = new TQGridLayout( this, 1, 1, 0 ); for( int i=0; i<4; ++i ) { mLabel[i]->hide(); mText[i]->hide(); } } else { if( mText[0]->text().isEmpty() && !mShowHeader ) { gbox = new TQGridLayout( this, row, 1, frameWidth()+1, 2 ); } else { gbox = new TQGridLayout( this, row, 2, frameWidth()+1, 2 ); if( !mShowHeader ) { gbox->addColSpacing( 0, KDialog::spacingHint()*2 ); } gbox->setColStretch( 1, 10 ); } for( int i=0, r=0; i<4; ++i ) { mLabel[i]->setFixedHeight( fontMetrics().lineSpacing() ); if( i != 3 ) { mText[i]->setFixedHeight( fontMetrics().lineSpacing() ); } if( !mText[i]->text().isEmpty() ) { if( mShowHeader ) { gbox->addWidget( TQT_TQWIDGET(mLabel[i]), r, 0, (TQ_Alignment)AlignLeft ); gbox->addWidget( TQT_TQWIDGET(mText[i]), r, 1, (TQ_Alignment)AlignLeft ); mLabel[i]->show(); mText[i]->show(); } else { mLabel[i]->hide(); if( !i ) { gbox->addMultiCellWidget( TQT_TQWIDGET(mText[i]), r, r, 0, 1, (TQ_Alignment)AlignLeft ); } else { gbox->addWidget( TQT_TQWIDGET(mText[i]), r, 1, (TQ_Alignment)AlignLeft ); } mText[i]->show(); } ++r; } else { mLabel[i]->hide(); mText[i]->hide(); } } } gbox->activate(); setMinimumSize( sizeHint() ); } void TDEAboutContributor::fontChange( const TQFont &/*oldFont*/ ) { if( mShowBold ) { TQFont f( font() ); f.setBold( true ); mText[0]->setFont( f ); } update(); } TQSize TDEAboutContributor::sizeHint( void ) const { return minimumSizeHint(); } void TDEAboutContributor::urlClickedSlot( const TQString &u ) { emit openURL(u); } void TDEAboutContributor::emailClickedSlot( const TQString &e ) { emit sendEmail( mText[0]->text(), e ) ; } // // Internal widget for the TDEAboutDialog class. // TDEAboutContainerBase::TDEAboutContainerBase( int layoutType, TQWidget *_parent, char *_name ) : TQWidget( _parent, _name ), mImageLabel(0), mTitleLabel(0), mIconLabel(0),mVersionLabel(0), mAuthorLabel(0), mImageFrame(0),mPageTab(0),mPlainSpace(0),d(0) { mTopLayout = new TQVBoxLayout( this, 0, KDialog::spacingHint() ); if( !mTopLayout ) { return; } if( layoutType & AbtImageOnly ) { layoutType &= ~(AbtImageLeft|AbtImageRight|AbtTabbed|AbtPlain); } if( layoutType & AbtImageLeft ) { layoutType &= ~AbtImageRight; } if( layoutType & AbtTitle ) { mTitleLabel = new TQLabel( this, "title" ); mTitleLabel->setAlignment(AlignCenter); mTopLayout->addWidget( mTitleLabel ); mTopLayout->addSpacing( KDialog::spacingHint() ); } if( layoutType & AbtProduct ) { TQWidget* const productArea = new TQWidget( this, "area" ); mTopLayout->addWidget( productArea, 0, TQApplication::reverseLayout() ? AlignRight : AlignLeft ); TQHBoxLayout* const hbox = new TQHBoxLayout(productArea,0,KDialog::spacingHint()); if( !hbox ) { return; } mIconLabel = new TQLabel( productArea ); hbox->addWidget( mIconLabel, 0, AlignLeft|AlignHCenter ); TQVBoxLayout* const vbox = new TQVBoxLayout(); if( !vbox ) { return; } hbox->addLayout( vbox ); mVersionLabel = new TQLabel( productArea, "version" ); mAuthorLabel = new TQLabel( productArea, "author" ); vbox->addWidget( mVersionLabel ); vbox->addWidget( mAuthorLabel ); hbox->activate(); mTopLayout->addSpacing( KDialog::spacingHint() ); } TQHBoxLayout* const hbox = new TQHBoxLayout(); if( !hbox ) { return; } mTopLayout->addLayout( hbox, 10 ); if( layoutType & AbtImageLeft ) { TQVBoxLayout* vbox = new TQVBoxLayout(); hbox->addLayout(vbox); vbox->addSpacing(1); mImageFrame = new TQFrame( this ); setImageFrame( true ); vbox->addWidget( mImageFrame ); vbox->addSpacing(1); vbox = new TQVBoxLayout( mImageFrame, 1 ); mImageLabel = new KImageTrackLabel( mImageFrame ); connect( mImageLabel, TQT_SIGNAL(mouseTrack( int, const TQMouseEvent * )), TQT_SLOT( slotMouseTrack( int, const TQMouseEvent * )) ); vbox->addStretch(10); vbox->addWidget( mImageLabel ); vbox->addStretch(10); vbox->activate(); } if( layoutType & AbtTabbed ) { mPageTab = new TDEAboutTabWidget( this ); if( !mPageTab ) { return; } hbox->addWidget( mPageTab, 10 ); } else if( layoutType & AbtImageOnly ) { mImageFrame = new TQFrame( this ); setImageFrame( true ); hbox->addWidget( mImageFrame, 10 ); TQGridLayout* const gbox = new TQGridLayout(mImageFrame, 3, 3, 1, 0 ); gbox->setRowStretch( 0, 10 ); gbox->setRowStretch( 2, 10 ); gbox->setColStretch( 0, 10 ); gbox->setColStretch( 2, 10 ); mImageLabel = new KImageTrackLabel( mImageFrame ); connect( mImageLabel, TQT_SIGNAL(mouseTrack( int, const TQMouseEvent * )), TQT_SLOT( slotMouseTrack( int, const TQMouseEvent * )) ); gbox->addWidget( mImageLabel, 1, 1 ); gbox->activate(); } else { mPlainSpace = new TQFrame( this ); if( !mPlainSpace ) { return; } hbox->addWidget( mPlainSpace, 10 ); } if( layoutType & AbtImageRight ) { TQVBoxLayout *vbox = new TQVBoxLayout(); hbox->addLayout(vbox); vbox->addSpacing(1); mImageFrame = new TQFrame( this ); setImageFrame( true ); vbox->addWidget( mImageFrame ); vbox->addSpacing(1); vbox = new TQVBoxLayout( mImageFrame, 1 ); mImageLabel = new KImageTrackLabel( mImageFrame ); connect( mImageLabel, TQT_SIGNAL(mouseTrack( int, const TQMouseEvent * )), TQT_SLOT( slotMouseTrack( int, const TQMouseEvent * )) ); vbox->addStretch(10); vbox->addWidget( mImageLabel ); vbox->addStretch(10); vbox->activate(); } fontChange( font() ); } void TDEAboutContainerBase::show( void ) { TQWidget::show(); } TQSize TDEAboutContainerBase::sizeHint( void ) const { return minimumSize().expandedTo( TQSize( TQWidget::sizeHint().width(), 0 ) ); } void TDEAboutContainerBase::fontChange( const TQFont &/*oldFont*/ ) { if( mTitleLabel ) { TQFont f( TDEGlobalSettings::generalFont() ); f.setBold( true ); int fs = f.pointSize(); if (fs == -1) fs = TQFontInfo(f).pointSize(); f.setPointSize( fs+2 ); // Lets not make it too big mTitleLabel->setFont(f); } if( mVersionLabel ) { TQFont f( TDEGlobalSettings::generalFont() ); f.setBold( true ); mVersionLabel->setFont(f); mAuthorLabel->setFont(f); mVersionLabel->parentWidget()->layout()->activate(); } update(); } TQFrame *TDEAboutContainerBase::addTextPage( const TQString &title, const TQString &text, bool richText, int numLines ) { TQFrame* const page = addEmptyPage( title ); if( !page ) { return 0; } if( numLines <= 0 ) { numLines = 10; } TQVBoxLayout* const vbox = new TQVBoxLayout( page, KDialog::spacingHint() ); if( richText ) { KTextBrowser* const browser = new KTextBrowser( page, "browser" ); browser->setHScrollBarMode( TQScrollView::AlwaysOff ); browser->setText( text ); browser->setMinimumHeight( fontMetrics().lineSpacing()*numLines ); vbox->addWidget(browser); connect(browser, TQT_SIGNAL(urlClick(const TQString &)), TQT_SLOT(slotUrlClick(const TQString &))); connect(browser, TQT_SIGNAL(mailClick(const TQString &,const TQString &)), TQT_SLOT(slotMailClick(const TQString &,const TQString &))); } else { KTextEdit* const textEdit = new KTextEdit( page, "text" ); textEdit->setReadOnly( true ); textEdit->setMinimumHeight( fontMetrics().lineSpacing()*numLines ); textEdit->setWordWrap( TQTextEdit::NoWrap ); vbox->addWidget( textEdit ); } return page; } TQFrame *TDEAboutContainerBase::addLicensePage( const TQString &title, const TQString &text, int numLines) { TQFrame* const page = addEmptyPage( title ); if( !page ) { return 0; } if( numLines <= 0 ) { numLines = 10; } TQVBoxLayout* const vbox = new TQVBoxLayout( page, KDialog::spacingHint() ); KTextEdit* const textEdit = new KTextEdit( page, "license" ); textEdit->setFont( TDEGlobalSettings::fixedFont() ); textEdit->setReadOnly( true ); textEdit->setWordWrap( TQTextEdit::NoWrap ); textEdit->setText( text ); textEdit->setMinimumHeight( fontMetrics().lineSpacing()*numLines ); vbox->addWidget( textEdit ); return page; } TDEAboutContainer *TDEAboutContainerBase::addContainerPage( const TQString &title, int childAlignment, int innerAlignment ) { if( !mPageTab ) { kdDebug(291) << "addPage: " << "Invalid layout" << endl; return 0; } TDEAboutContainer* const container = new TDEAboutContainer( mPageTab, "container", KDialog::spacingHint(), KDialog::spacingHint(), childAlignment, innerAlignment ); mPageTab->addTab( container, title ); connect(container, TQT_SIGNAL(urlClick(const TQString &)), TQT_SLOT(slotUrlClick(const TQString &))); connect(container, TQT_SIGNAL(mailClick(const TQString &,const TQString &)), TQT_SLOT(slotMailClick(const TQString &,const TQString &))); return container; } TDEAboutContainer *TDEAboutContainerBase::addScrolledContainerPage( const TQString &title, int childAlignment, int innerAlignment ) { if( !mPageTab ) { kdDebug(291) << "addPage: " << "Invalid layout" << endl; return 0; } TQFrame* const page = addEmptyPage( title ); TQVBoxLayout* const vbox = new TQVBoxLayout( page, KDialog::spacingHint() ); TQScrollView* const scrollView = new TQScrollView( page ); scrollView->viewport()->setBackgroundMode( PaletteBackground ); vbox->addWidget( scrollView ); TDEAboutContainer* const container = new TDEAboutContainer( scrollView, "container", KDialog::spacingHint(), KDialog::spacingHint(), childAlignment, innerAlignment ); scrollView->addChild( container ); connect(container, TQT_SIGNAL(urlClick(const TQString &)), TQT_SLOT(slotUrlClick(const TQString &))); connect(container, TQT_SIGNAL(mailClick(const TQString &,const TQString &)), TQT_SLOT(slotMailClick(const TQString &,const TQString &))); return container; } TQFrame *TDEAboutContainerBase::addEmptyPage( const TQString &title ) { if( !mPageTab ) { kdDebug(291) << "addPage: " << "Invalid layout" << endl; return 0; } TQFrame* const page = new TQFrame( mPageTab, title.latin1() ); page->setFrameStyle( TQFrame::NoFrame ); mPageTab->addTab( page, title ); return page; } TDEAboutContainer *TDEAboutContainerBase::addContainer( int childAlignment, int innerAlignment ) { TDEAboutContainer* const container = new TDEAboutContainer( this, "container", 0, KDialog::spacingHint(), childAlignment, innerAlignment ); mTopLayout->addWidget( container, 0, childAlignment ); connect(container, TQT_SIGNAL(urlClick(const TQString &)), TQT_SLOT(slotUrlClick(const TQString &))); connect(container, TQT_SIGNAL(mailClick(const TQString &,const TQString &)), TQT_SLOT(slotMailClick(const TQString &,const TQString &))); return container; } void TDEAboutContainerBase::setTitle( const TQString &title ) { if( !mTitleLabel ) { kdDebug(291) << "setTitle: " << "Invalid layout" << endl; return; } mTitleLabel->setText(title); } void TDEAboutContainerBase::setImage( const TQString &fileName ) { if( !mImageLabel ) { kdDebug(291) << "setImage: " << "Invalid layout" << endl; return; } if( fileName.isNull() ) { return; } const TQPixmap logo( fileName ); if( !logo.isNull() ) mImageLabel->setPixmap( logo ); mImageFrame->layout()->activate(); } void TDEAboutContainerBase::setProgramLogo( const TQString &fileName ) { if( fileName.isNull() ) { return; } const TQPixmap logo( fileName ); setProgramLogo( logo ); } void TDEAboutContainerBase::setProgramLogo( const TQPixmap &pixmap ) { if( !mIconLabel ) { kdDebug(291) << "setProgramLogo: " << "Invalid layout" << endl; return; } if( !pixmap.isNull() ) { mIconLabel->setPixmap( pixmap ); } } void TDEAboutContainerBase::setImageBackgroundColor( const TQColor &color ) { if( mImageFrame ) { mImageFrame->setBackgroundColor( color ); } } void TDEAboutContainerBase::setImageFrame( bool state ) { if( mImageFrame ) { if( state ) { mImageFrame->setFrameStyle( TQFrame::Panel | TQFrame::Sunken ); mImageFrame->setLineWidth(1); } else { mImageFrame->setFrameStyle( TQFrame::NoFrame ); mImageFrame->setLineWidth(0); } } } void TDEAboutContainerBase::setProduct( const TQString &appName, const TQString &version, const TQString &author, const TQString &year ) { if( !mIconLabel ) { kdDebug(291) << "setProduct: " << "Invalid layout" << endl; return; } if ( kapp ) { mIconLabel->setPixmap( kapp->icon() ); kdDebug(291) << "setPixmap (iconName): " << kapp->iconName() << endl; } else kdDebug(291) << "no kapp" << endl; const TQString msg1 = i18n("%1 %2 (Using Trinity %3)").arg(appName).arg(version). arg(TQString::fromLatin1(TDE_VERSION_STRING)); const TQString msg2 = !year.isEmpty() ? i18n("%1 %2, %3").arg('©').arg(year). arg(author) : TQString::fromLatin1(""); //if (!year.isEmpty()) // msg2 = i18n("%1 %2, %3").arg('©').arg(year).arg(author); mVersionLabel->setText( msg1 ); mAuthorLabel->setText( msg2 ); if( msg2.isEmpty() ) { mAuthorLabel->hide(); } mIconLabel->parentWidget()->layout()->activate(); } void TDEAboutContainerBase::slotMouseTrack( int mode, const TQMouseEvent *e ) { emit mouseTrack( mode, e ); } void TDEAboutContainerBase::slotUrlClick( const TQString &url ) { emit urlClick( url ); } void TDEAboutContainerBase::slotMailClick( const TQString &_name, const TQString &_address ) { emit mailClick( _name, _address ); } TDEAboutContainer::TDEAboutContainer( TQWidget *_parent, const char *_name, int _margin, int _spacing, int childAlignment, int innerAlignment ) : TQFrame( _parent, _name ), d(0) { mAlignment = innerAlignment; TQGridLayout* const gbox = new TQGridLayout( this, 3, 3, _margin, _spacing ); if( childAlignment & AlignHCenter ) { gbox->setColStretch( 0, 10 ); gbox->setColStretch( 2, 10 ); } else if( childAlignment & AlignRight ) { gbox->setColStretch( 0, 10 ); } else { gbox->setColStretch( 2, 10 ); } if( childAlignment & AlignVCenter ) { gbox->setRowStretch( 0, 10 ); gbox->setRowStretch( 2, 10 ); } else if( childAlignment & AlignRight ) { gbox->setRowStretch( 0, 10 ); } else { gbox->setRowStretch( 2, 10 ); } mVbox = new TQVBoxLayout( _spacing ); gbox->addLayout( mVbox, 1, 1 ); gbox->activate(); } void TDEAboutContainer::childEvent( TQChildEvent *e ) { if( !e->inserted() || !e->child()->isWidgetType() ) { return; } TQWidget* const w = static_cast(e->child()); mVbox->addWidget( w, 0, mAlignment ); const TQSize s( sizeHint() ); setMinimumSize( s ); TQObjectList const l = childrenListObject(); // silence please TQObjectListIterator itr( l ); TQObject * o; while ( (o = itr.current()) ) { ++itr; if( o->isWidgetType() ) { TQT_TQWIDGET(o)->setMinimumWidth( s.width() ); } } } TQSize TDEAboutContainer::sizeHint( void ) const { // // The size is computed by adding the sizeHint().height() of all // widget children and taking the width of the widest child and adding // layout()->margin() and layout()->spacing() // TQSize total_size; int numChild = 0; TQObjectList const l = childrenListObject(); // silence please TQObjectListIterator itr( l ); TQObject * o; while ( (o = itr.current()) ) { ++itr; if( o->isWidgetType() ) { ++numChild; TQWidget* const w= TQT_TQWIDGET(o); TQSize s = w->minimumSize(); if( s.isEmpty() ) { s = w->minimumSizeHint(); if( s.isEmpty() ) { s = w->sizeHint(); if( s.isEmpty() ) { s = TQSize( 100, 100 ); // Default size } } } total_size.setHeight( total_size.height() + s.height() ); if( s.width() > total_size.width() ) { total_size.setWidth( s.width() ); } } } if( numChild > 0 ) { // // Seems I have to add 1 to the height to properly show the border // of the last entry if layout()->margin() is 0 // total_size.setHeight( total_size.height() + layout()->spacing()*(numChild-1) ); total_size += TQSize( layout()->margin()*2, layout()->margin()*2 + 1 ); } else { total_size = TQSize( 1, 1 ); } return total_size; } TQSize TDEAboutContainer::minimumSizeHint( void ) const { return sizeHint(); } void TDEAboutContainer::addWidget( TQWidget *widget ) { widget->reparent( this, 0, TQPoint(0,0) ); } void TDEAboutContainer::addPerson( const TQString &_name, const TQString &_email, const TQString &_url, const TQString &_task, bool showHeader, bool showFrame,bool showBold) { TDEAboutContributor* const cont = new TDEAboutContributor( this, "pers", _name, _email, _url, _task, showHeader, showFrame, showBold ); connect( cont, TQT_SIGNAL( openURL(const TQString&)), this, TQT_SIGNAL( urlClick(const TQString &))); connect( cont, TQT_SIGNAL( sendEmail(const TQString &, const TQString &)), this, TQT_SIGNAL( mailClick(const TQString &, const TQString &))); } void TDEAboutContainer::addTitle( const TQString &title, int alignment, bool showFrame, bool showBold ) { TQLabel* const label = new TQLabel( title, this, "title" ); if( showBold ) { TQFont labelFont( font() ); labelFont.setBold( true ); label->setFont( labelFont ); } if( showFrame ) { label->setFrameStyle(TQFrame::Panel | TQFrame::Raised); } label->setAlignment( alignment ); } void TDEAboutContainer::addImage( const TQString &fileName, int alignment ) { if( fileName.isNull() ) { return; } KImageTrackLabel* const label = new KImageTrackLabel( this, "image" ); const TQImage logo( fileName ); if( !logo.isNull() ) { TQPixmap pix; pix = logo; label->setPixmap( pix ); } label->setAlignment( alignment ); } #if 0 //MOC_SKIP_BEGIN /** Every person displayed is stored in a TDEAboutContributor object. * Every contributor, the author and/or the maintainer of the application are * stored in objects of this local class. Every single field may be empty. * To add a contributor, create a TDEAboutContributor object as a child of your * @ref TDEAboutDialog, set its contents and add it using add addContributor. */ class TDEAboutContributor : public QFrame { // ############################################################################ Q_OBJECT // ---------------------------------------------------------------------------- public: /** The Qt constructor. */ TDEAboutContributor(TQWidget* parent=0, const char* name=0); /** Set the name (a literal string). */ void setName(const TQString&); /** Get the name. */ TQString getName(); /** The email address (dito). */ void setEmail(const TQString&); /** Get the email address. */ TQString getEmail(); /** The URL (dito). */ void setURL(const TQString&); /** Get the URL. */ TQString getURL(); /** The tasks the person worked on (a literal string). More than one line is * possible, but very long texts might look ugly. */ void setWork(const TQString&); /** The size hint. Very important here, since TDEAboutWidget relies on it for * geometry management. */ TQSize sizeHint(); TQSize minimumSizeHint(void); virtual void show( void ); // ---------------------------------------------------------------------------- protected: // events: /** The resize event. */ void resizeEvent(TQResizeEvent*); /** The paint event. */ void paintEvent(TQPaintEvent*); /** The label showing the program version. */ TQLabel *name; /** The clickable URL label showing the email address. It is only visible if * its text is not empty. */ KURLLabel *email; /** Another interactive part that displays the homepage URL. */ KURLLabel *url; /** The description of the contributions of the person. */ TQString work; // ---------------------------------------------------------------------------- protected slots: /** The homepage URL has been clicked. */ void urlClickedSlot(const TQString&); /** The email address has been clicked. */ void emailClickedSlot(const TQString& emailaddress); // ---------------------------------------------------------------------------- signals: /** The email address has been clicked. */ void sendEmail(const TQString& name, const TQString& email); /** The URL has been clicked. */ void openURL(const TQString& url); // ############################################################################ }; TDEAboutContributor::TDEAboutContributor(TQWidget* parent, const char* n) : TQFrame(parent, n), name(new TQLabel(this)), email(new KURLLabel(this)), url(new KURLLabel(this)) { // ############################################################ if(name==0 || email==0) { // this will nearly never happen (out of memory in about box?) kdDebug() << "TDEAboutContributor::TDEAboutContributor: Out of memory." << endl; tqApp->quit(); } setFrameStyle(TQFrame::Panel | TQFrame::Raised); // ----- connect(email, TQT_SIGNAL(leftClickedURL(const TQString&)), TQT_SLOT(emailClickedSlot(const TQString&))); connect(url, TQT_SIGNAL(leftClickedURL(const TQString&)), TQT_SLOT(urlClickedSlot(const TQString&))); // ############################################################ } void TDEAboutContributor::setName(const TQString& n) { // ############################################################ name->setText(n); // ############################################################ } QString TDEAboutContributor::getName() { // ########################################################### return name->text(); // ########################################################### } void TDEAboutContributor::setURL(const TQString& u) { // ########################################################### url->setText(u); // ########################################################### } QString TDEAboutContributor::getURL() { // ########################################################### return url->text(); // ########################################################### } void TDEAboutContributor::setEmail(const TQString& e) { // ########################################################### email->setText(e); // ########################################################### } QString TDEAboutContributor::getEmail() { // ########################################################### return email->text(); // ########################################################### } void TDEAboutContributor::emailClickedSlot(const TQString& e) { // ########################################################### kdDebug() << "TDEAboutContributor::emailClickedSlot: called." << endl; emit(sendEmail(name->text(), e)); // ########################################################### } void TDEAboutContributor::urlClickedSlot(const TQString& u) { // ########################################################### kdDebug() << "TDEAboutContributor::urlClickedSlot: called." << endl; emit(openURL(u)); // ########################################################### } void TDEAboutContributor::setWork(const TQString& w) { // ########################################################### work=w; // ########################################################### } #endif #if 0 QSize TDEAboutContributor::sizeHint() { // ############################################################################ const int FrameWidth=frameWidth(); const int WorkTextWidth=200; int maxx, maxy; TQRect rect; // ----- first calculate name and email width: maxx=name->sizeHint().width(); maxx=TQMAX(maxx, email->sizeHint().width()+WORKTEXT_IDENTATION); // ----- now determine "work" text rectangle: if(!work.isEmpty()) // save time { rect=fontMetrics().boundingRect (0, 0, WorkTextWidth, 32000, WordBreak | AlignLeft, work); } if(maxxsizeHint().width()+WORKTEXT_IDENTATION); // ----- maxy=2*(name->sizeHint().height()+Grid); // need a space above the KURLLabels maxy+=/* email */ name->sizeHint().height(); maxy+=rect.height(); // ----- maxx+=2*FrameWidth; maxy+=2*FrameWidth; return TQSize(maxx, maxy); // ############################################################################ } TQSize TDEAboutContributor::minimumSizeHint(void) { return( sizeHint() ); } void TDEAboutContributor::show( void ) { TQFrame::show(); setMinimumSize( sizeHint() ); } void TDEAboutContributor::resizeEvent(TQResizeEvent*) { // the widgets are simply aligned from top to bottom, since the parent is // expected to respect the size hint // ############################################################################ int framewidth=frameWidth(), childwidth=width()-2*framewidth; int cy=framewidth; // ----- name->setGeometry (framewidth, framewidth, childwidth, name->sizeHint().height()); cy=name->height()+Grid; email->setGeometry (framewidth+WORKTEXT_IDENTATION, cy, childwidth-WORKTEXT_IDENTATION, /* email */ name->sizeHint().height()); cy+=name->height()+Grid; url->setGeometry (framewidth+WORKTEXT_IDENTATION, cy, childwidth-WORKTEXT_IDENTATION, /* url */ name->sizeHint().height()); // the work text is drawn in the paint event // ############################################################################ } void TDEAboutContributor::paintEvent(TQPaintEvent* e) { // the widgets are simply aligned from top to bottom, since the parent is // expected to respect the size hint (the widget is only used locally by now) // ############################################################################ int cy=frameWidth()+name->height()+email->height()+Grid+url->height()+Grid; int h=height()-cy-frameWidth(); int w=width()-WORKTEXT_IDENTATION-2*frameWidth(); // ----- TQFrame::paintEvent(e); if(work.isEmpty()) return; TQPainter paint(this); // construct painter only if there is something to draw // ----- paint.drawText(WORKTEXT_IDENTATION, cy, w, h, AlignLeft | WordBreak, work); // ############################################################################ } // MOC_SKIP_END #endif #if 0 TQSize TDEAboutContributor::sizeHint( void ) { int s = KDialog::spacingHint(); int h = fontMetrics().lineSpacing()*3 + 2*s; int m = frameWidth(); int w = name->sizeHint().width(); w = TQMAX( w, email->sizeHint().width()+s); w = TQMAX( w, url->sizeHint().width()+s); if( work.isEmpty() == false ) { const int WorkTextWidth=200; TQRect r = fontMetrics().boundingRect (0, 0, WorkTextWidth, 32000, WordBreak | AlignLeft, work); if( w < r.width() ) { w = TQMAX( w, WorkTextWidth+s ); } h += TQMAX( fontMetrics().lineSpacing(), r.height() ) + s; } return( TQSize( w + 2*m, h + 2*m ) ); /* int s = 3; int m = frameWidth() + KDialog::spacingHint(); int h = ls * 3 + s * 2; int w = name->sizeHint().width(); w = TQMAX( w, email->sizeHint().width()+WORKTEXT_IDENTATION); w = TQMAX( w, url->sizeHint().width()+WORKTEXT_IDENTATION); if( work.isEmpty() == false ) { const int WorkTextWidth=200; TQRect r = fontMetrics().boundingRect (0, 0, WorkTextWidth, 32000, WordBreak | AlignLeft, work); if( w < r.width() ) { w = TQMAX( w, WorkTextWidth + WORKTEXT_IDENTATION ); } h += r.height() + s; } return( TQSize( w + 2*m, h + 2*m ) ); */ } // // The widgets are simply aligned from top to bottom, since the parent is // expected to respect the size hint // void TDEAboutContributor::resizeEvent(TQResizeEvent*) { int x = frameWidth(); int s = KDialog::spacingHint(); int h = fontMetrics().lineSpacing(); int w = width() - 2*x; int y = x; name->setGeometry( x, y, w, h ); y += h + s; email->setGeometry( x+s, y, w-s, h ); y += h + s; url->setGeometry( x+s, y, w-s, h ); /* int x = frameWidth() + KDialog::spacingHint(); int y = x; int w = width() - 2*x; int h = name->sizeHint().height(); int s = 3; name->setGeometry( x, y, w, h ); y += h + s; email->setGeometry( x+WORKTEXT_IDENTATION, y, w-WORKTEXT_IDENTATION, h ); y += h + s; url->setGeometry( x+WORKTEXT_IDENTATION, y, w-WORKTEXT_IDENTATION, h ); // // the work text is drawn in the paint event // */ } void TDEAboutContributor::paintEvent( TQPaintEvent *e ) { TQFrame::paintEvent(e); if(work.isEmpty()) return; int x = frameWidth() + KDialog::spacingHint(); int h = fontMetrics().lineSpacing(); int y = height() - frameWidth() - fontMetrics().lineSpacing(); int w = width() - frameWidth()*2 - KDialog::spacingHint(); TQPainter paint( this ); paint.drawText( x, y, w, h, AlignLeft | WordBreak, work ); /* int s = 3; int x = frameWidth() + KDialog::spacingHint() + WORKTEXT_IDENTATION; int w = width()-WORKTEXT_IDENTATION-2*(frameWidth()+KDialog::spacingHint()); int y = frameWidth()+KDialog::spacingHint()+(name->sizeHint().height()+s)*3; int h = height()-y-frameWidth(); TQPainter paint( this ); paint.drawText( x, y, w, h, AlignLeft | WordBreak, work ); */ } #endif TDEAboutWidget::TDEAboutWidget(TQWidget *_parent, const char *_name) : TQWidget(_parent, _name), version(new TQLabel(this)), cont(new TQLabel(this)), logo(new TQLabel(this)), author(new TDEAboutContributor(this)), maintainer(new TDEAboutContributor(this)), showMaintainer(false), d(0) { // ################################################################# if( !version || !cont || !logo || !author || !maintainer ) { // this will nearly never happen (out of memory in about box?) kdDebug() << "TDEAboutWidget::TDEAboutWidget: Out of memory." << endl; tqApp->quit(); } // ----- cont->setText(i18n("Other Contributors:")); logo->setText(i18n("(No logo available)")); logo->setFrameStyle(TQFrame::Panel | TQFrame::Raised); version->setAlignment(AlignCenter); // ----- connect(author, TQT_SIGNAL(sendEmail(const TQString&, const TQString&)), TQT_SLOT(sendEmailSlot(const TQString&, const TQString&))); connect(author, TQT_SIGNAL(openURL(const TQString&)), TQT_SLOT(openURLSlot(const TQString&))); connect(maintainer, TQT_SIGNAL(sendEmail(const TQString&, const TQString&)), TQT_SLOT(sendEmailSlot(const TQString&, const TQString&))); connect(maintainer, TQT_SIGNAL(openURL(const TQString&)), TQT_SLOT(openURLSlot(const TQString&))); // ################################################################# } void TDEAboutWidget::adjust() { // ################################################################# int cx, cy, tempx; int maintWidth, maintHeight; TQSize total_size; // ----- if(showMaintainer) { total_size=maintainer->sizeHint(); maintWidth=total_size.width(); maintHeight=total_size.height(); } else { maintWidth=0; maintHeight=0; } total_size=author->sizeHint(); logo->adjustSize(); cy=version->sizeHint().height()+Grid; cx=logo->width(); tempx=TQMAX(total_size.width(), maintWidth); cx+=Grid+tempx; cx=TQMAX(cx, version->sizeHint().width()); cy+=TQMAX(logo->height(), total_size.height()+(showMaintainer ? Grid+maintHeight : 0)); // ----- if(!contributors.isEmpty()) { cx=TQMAX(cx, cont->sizeHint().width()); cy+=cont->sizeHint().height()+Grid; TQPtrListIterator _pos(contributors); TDEAboutContributor* currEntry; while ( (currEntry = _pos.current()) ) { ++_pos; cy+=currEntry->sizeHint().height(); } } // ----- setMinimumSize(cx, cy); // ################################################################# } void TDEAboutWidget::setLogo(const TQPixmap& i) { // ############################################################################ logo->setPixmap(i); // ############################################################################ } void TDEAboutWidget::sendEmailSlot(const TQString &_name, const TQString &_email) { emit(sendEmail(_name, _email)); } void TDEAboutWidget::openURLSlot(const TQString& _url) { emit(openURL(_url)); } void TDEAboutWidget::setAuthor(const TQString &_name, const TQString &_email, const TQString &_url, const TQString &_w) { // ############################################################################ author->setName(_name); author->setEmail(_email); author->setURL(_url); author->setWork(_w); // ############################################################################ } void TDEAboutWidget::setMaintainer(const TQString &_name, const TQString &_email, const TQString &_url, const TQString &_w) { // ############################################################################ maintainer->setName(_name); maintainer->setEmail(_email); maintainer->setWork(_w); maintainer->setURL(_url); showMaintainer=true; // ############################################################################ } void TDEAboutWidget::addContributor(const TQString &_name, const TQString &_email, const TQString &_url, const TQString &_w) { // ############################################################################ TDEAboutContributor* const c=new TDEAboutContributor(this); // ----- c->setName(_name); c->setEmail(_email); c->setURL(_url); c->setWork(_w); contributors.append(c); connect(c, TQT_SIGNAL(sendEmail(const TQString&, const TQString&)), TQT_SLOT(sendEmailSlot(const TQString&, const TQString&))); connect(c, TQT_SIGNAL(openURL(const TQString&)), TQT_SLOT(openURLSlot(const TQString&))); // ############################################################################ } void TDEAboutWidget::setVersion(const TQString &_name) { // ############################################################################ version->setText(_name); // ############################################################################ } void TDEAboutWidget::resizeEvent(TQResizeEvent*) { // ############################################################################ int _x=0, _y, cx, tempx, tempy; // ----- set version label geometry: version->setGeometry(0, 0, width(), version->sizeHint().height()); _y=version->height()+Grid; // ----- move logo to correct position: logo->adjustSize(); logo->move(0, _y); // ----- move author and maintainer right to it: tempx=logo->width()+Grid; cx=width()-tempx; author->setGeometry (tempx, _y, cx, author->sizeHint().height()); maintainer->setGeometry (tempx, _y+author->height()+Grid, cx, maintainer->sizeHint().height()); _y+=TQMAX(logo->height(), author->height()+(showMaintainer ? Grid+maintainer->height() : 0)); // ----- if(!contributors.isEmpty()) { tempy=cont->sizeHint().height(); cont->setGeometry(0, _y, width(), tempy); cont->show(); _y+=tempy+Grid; } else { cont->hide(); } TQPtrListIterator _pos(contributors); TDEAboutContributor* currEntry; while( (currEntry = _pos.current()) ) { ++_pos; tempy=currEntry->sizeHint().height(); // y+=Grid; currEntry->setGeometry(_x, _y, width(), tempy); _y+=tempy; } if(showMaintainer) { maintainer->show(); } else { maintainer->hide(); } // ############################################################################ } TDEAboutDialog::TDEAboutDialog(TQWidget *_parent, const char *_name, bool modal) : KDialogBase(_parent, _name, modal, TQString::null, Ok, Ok ), about(new TDEAboutWidget(this)), mContainerBase(0), d(0) { // ################################################################# if(!about) { // this will nearly never happen (out of memory in about box?) kdDebug() << "TDEAboutDialog::TDEAboutDialog: Out of memory." << endl; tqApp->quit(); } setMainWidget(about); connect(about, TQT_SIGNAL(sendEmail(const TQString&, const TQString&)), TQT_SLOT(sendEmailSlot(const TQString&, const TQString&))); connect(about, TQT_SIGNAL(openURL(const TQString&)), TQT_SLOT(openURLSlot(const TQString&))); // ################################################################# } TDEAboutDialog::TDEAboutDialog( int layoutType, const TQString &_caption, int buttonMask, ButtonCode defaultButton, TQWidget *_parent, const char *_name, bool modal, bool separator, const TQString &user1, const TQString &user2, const TQString &user3 ) :KDialogBase( _parent, _name, modal, TQString::null, buttonMask, defaultButton, separator, user1, user2, user3 ), about(0), d(0) { setPlainCaption( i18n("About %1").arg(_caption) ); mContainerBase = new TDEAboutContainerBase( layoutType, this ); setMainWidget(mContainerBase); connect( mContainerBase, TQT_SIGNAL(urlClick(const TQString &)), this, TQT_SLOT(openURLSlot(const TQString &))); connect( mContainerBase, TQT_SIGNAL(mailClick(const TQString &,const TQString &)), this, TQT_SLOT(sendEmailSlot(const TQString &,const TQString &))); connect( mContainerBase, TQT_SIGNAL(mouseTrack(int, const TQMouseEvent *)), this, TQT_SLOT(mouseTrackSlot(int, const TQMouseEvent *))); } void TDEAboutDialog::show( void ) { adjust(); if( mContainerBase ) { mContainerBase->show(); } TQDialog::show(); } void TDEAboutDialog::show( TQWidget * /*centerParent*/ ) { adjust(); if( mContainerBase ) { mContainerBase->show(); } TQDialog::show(); } void TDEAboutDialog::adjust() { if( !about ) { return; } about->adjust(); //initializeGeometry(); resize( sizeHint() ); } void TDEAboutDialog::setLogo(const TQPixmap& i) { if( !about ) { return; } about->setLogo(i); } void TDEAboutDialog::setMaintainer(const TQString &_name, const TQString &_email, const TQString &_url, const TQString &_w) { // ################################################################# if( !about ) { return; } about->setMaintainer(_name, _email, _url, _w); // ################################################################# } void TDEAboutDialog::setAuthor(const TQString &_name, const TQString &_email, const TQString &_url, const TQString &_work) { // ################################################################# if( !about ) { return; } about->setAuthor(_name, _email, _url, _work); // ################################################################# } void TDEAboutDialog::addContributor(const TQString &_name, const TQString &_email, const TQString &_url, const TQString &_w) { // ################################################################# if( !about ) { return; } about->addContributor(_name, _email, _url, _w); // ################################################################# } void TDEAboutDialog::setVersion(const TQString &_name) { // ################################################################# if( !about ) { return; } about->setVersion(_name); // ################################################################# } void TDEAboutDialog::sendEmailSlot(const TQString& /*name*/, const TQString& email) { if ( kapp ) kapp->invokeMailer( email, TQString::null ); /* kdDebug() << "TDEAboutDialog::sendEmailSlot: request to send an email to " << name << ", " << email << endl; emit(sendEmail(name, email)); */ } void TDEAboutDialog::openURLSlot(const TQString& url) { if ( kapp ) kapp->invokeBrowser( url ); //kdDebug() << "TDEAboutDialog::openURLSlot: request to open URL " << url << endl; //emit(openURL(url)); } void TDEAboutDialog::mouseTrackSlot( int /*mode*/, const TQMouseEvent * /*e*/ ) { // By default we do nothing. This method must be reimplemented. } TQFrame *TDEAboutDialog::addTextPage( const TQString &title, const TQString &text, bool richText, int numLines ) { if( !mContainerBase ) { return 0; } return mContainerBase->addTextPage( title, text, richText, numLines ); } TQFrame *TDEAboutDialog::addLicensePage( const TQString &title, const TQString &text, int numLines ) { if( !mContainerBase ) { return 0; } return mContainerBase->addLicensePage( title, text, numLines ); } TDEAboutContainer *TDEAboutDialog::addContainerPage( const TQString &title, int childAlignment, int innerAlignment ) { if( !mContainerBase ) { return 0; } return mContainerBase->addContainerPage( title, childAlignment, innerAlignment); } TDEAboutContainer *TDEAboutDialog::addScrolledContainerPage( const TQString &title, int childAlignment, int innerAlignment ) { if( !mContainerBase ) { return 0; } return mContainerBase->addScrolledContainerPage( title, childAlignment, innerAlignment); } TQFrame *TDEAboutDialog::addPage( const TQString &title ) { if( !mContainerBase ) { return 0; } return mContainerBase->addEmptyPage( title ); } TDEAboutContainer *TDEAboutDialog::addContainer( int childAlignment, int innerAlignment ) { if( !mContainerBase ) { return 0; } return mContainerBase->addContainer( childAlignment, innerAlignment ); } void TDEAboutDialog::setTitle( const TQString &title ) { if( !mContainerBase ) { return; } mContainerBase->setTitle( title ); } void TDEAboutDialog::setImage( const TQString &fileName ) { if( !mContainerBase ) { return; } mContainerBase->setImage( fileName ); } // KDE4: remove void TDEAboutDialog::setIcon( const TQString &fileName ) { if( !mContainerBase ) { return; } mContainerBase->setProgramLogo( fileName ); } void TDEAboutDialog::setProgramLogo( const TQString &fileName ) { if( !mContainerBase ) { return; } mContainerBase->setProgramLogo( fileName ); } void TDEAboutDialog::setProgramLogo( const TQPixmap &pixmap ) { if( !mContainerBase ) { return; } mContainerBase->setProgramLogo( pixmap ); } void TDEAboutDialog::setImageBackgroundColor( const TQColor &color ) { if( !mContainerBase ) { return; } mContainerBase->setImageBackgroundColor( color ); } void TDEAboutDialog::setImageFrame( bool state ) { if( !mContainerBase ) { return; } mContainerBase->setImageFrame( state ); } void TDEAboutDialog::setProduct( const TQString &appName, const TQString &version, const TQString &author, const TQString &year ) { if( !mContainerBase ) { return; } mContainerBase->setProduct( appName, version, author, year ); } void TDEAboutDialog::imageURL( TQWidget *_parent, const TQString &_caption, const TQString &_path, const TQColor &_imageColor, const TQString &_url ) { TDEAboutDialog a( AbtImageOnly, TQString::null, Close, Close, _parent, "image", true ); a.setPlainCaption( _caption ); a.setImage( _path ); a.setImageBackgroundColor( _imageColor ); TDEAboutContainer* const c = a.addContainer( AlignCenter, AlignCenter ); if( c ) { c->addPerson( TQString::null, TQString::null, _url, TQString::null ); } a.exec(); } // // A class that can can monitor mouse movements on the image // KImageTrackLabel::KImageTrackLabel( TQWidget *_parent, const char *_name, WFlags f ) : TQLabel( _parent, _name, f ) { setText( i18n("Image missing")); } void KImageTrackLabel::mousePressEvent( TQMouseEvent *e ) { emit mouseTrack( MousePress, e ); } void KImageTrackLabel::mouseReleaseEvent( TQMouseEvent *e ) { emit mouseTrack( MouseRelease, e ); } void KImageTrackLabel::mouseDoubleClickEvent( TQMouseEvent *e ) { emit mouseTrack( MouseDoubleClick, e ); } void KImageTrackLabel::mouseMoveEvent ( TQMouseEvent *e ) { emit mouseTrack( MouseDoubleClick, e ); } void TDEAboutDialog::virtual_hook( int id, void* data ) { KDialogBase::virtual_hook( id, data ); }