kio Library API Documentation

passdlg.cpp

00001 /* This file is part of the KDE libraries
00002    Copyright (C) 2000 David Faure <faure@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License version 2 as published by the Free Software Foundation.
00007 
00008    This library is distributed in the hope that it will be useful,
00009    but WITHOUT ANY WARRANTY; without even the implied warranty of
00010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011    Library General Public License for more details.
00012 
00013    You should have received a copy of the GNU Library General Public License
00014    along with this library; see the file COPYING.LIB.  If not, write to
00015    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00016    Boston, MA 02111-1307, USA.
00017 */
00018 
00019 #include <qpushbutton.h>
00020 #include <qcheckbox.h>
00021 #include <qlabel.h>
00022 #include <qlayout.h>
00023 #include <qaccel.h>
00024 #include <qhbox.h>
00025 #include <qsimplerichtext.h>
00026 #include <qstylesheet.h>
00027 
00028 #include <kapplication.h>
00029 #include <klineedit.h>
00030 #include <kconfig.h>
00031 #include <kiconloader.h>
00032 #include <klocale.h>
00033 #include <kbuttonbox.h>
00034 #include <kstandarddirs.h>
00035 #include <kseparator.h>
00036 
00037 #include "passdlg.h"
00038 
00039 using namespace KIO;
00040 
00041 struct PasswordDialog::PasswordDialogPrivate
00042 {
00043     QGridLayout *layout;
00044     KLineEdit* userEdit;
00045     KLineEdit* passEdit;
00046     QLabel* prompt;
00047     QCheckBox* keepCheckBox;
00048 
00049     bool keep;
00050     short unsigned int nRow;
00051 };
00052 
00053 PasswordDialog::PasswordDialog( const QString& prompt, const QString& user,
00054                                 bool enableKeep, bool modal, QWidget* parent,
00055                                 const char* name )
00056                :KDialogBase( parent, name, modal, i18n("Password"), Ok|Cancel, Ok, true)
00057 {
00058     init ( prompt, user, enableKeep );
00059 }
00060 
00061 PasswordDialog::~PasswordDialog()
00062 {
00063     delete d;
00064 }
00065 
00066 void PasswordDialog::init( const QString& prompt, const QString& user,
00067                            bool enableKeep  )
00068 {
00069     QWidget *main = makeMainWidget();
00070 
00071     d = new PasswordDialogPrivate;
00072     d->keep = false;
00073     d->nRow = 0;
00074     d->keepCheckBox = 0;
00075 
00076     KConfig* cfg = KGlobal::config();
00077     KConfigGroupSaver saver( cfg, "Passwords" );
00078 
00079     d->layout = new QGridLayout( main, 9, 3, spacingHint(), marginHint());
00080     d->layout->addColSpacing(1, 5);
00081 
00082     // Row 0: pixmap  prompt
00083     QLabel* lbl;
00084     QPixmap pix( KGlobal::iconLoader()->loadIcon( "password", KIcon::NoGroup, KIcon::SizeHuge, 0, 0, true));
00085     if ( !pix.isNull() )
00086     {
00087         lbl = new QLabel( main );
00088         lbl->setPixmap( pix );
00089         lbl->setAlignment( Qt::AlignLeft|Qt::AlignVCenter );
00090         lbl->setFixedSize( lbl->sizeHint() );
00091         d->layout->addWidget( lbl, 0, 0, Qt::AlignLeft );
00092     }
00093     d->prompt = new QLabel( main );
00094     d->prompt->setAlignment( Qt::AlignLeft|Qt::AlignVCenter|Qt::WordBreak );
00095     d->layout->addWidget( d->prompt, 0, 2, Qt::AlignLeft );
00096     if ( prompt.isEmpty() )
00097         setPrompt( i18n( "You need to supply a username and a password" ) );
00098     else
00099         setPrompt( prompt );
00100 
00101     // Row 1: Row Spacer
00102     d->layout->addRowSpacing( 1, 7 );
00103 
00104     // Row 2-3: Reserved for an additional comment
00105 
00106     // Row 4: Username field
00107     lbl = new QLabel( i18n("&Username:"), main );
00108     lbl->setAlignment( Qt::AlignVCenter | Qt::AlignLeft );
00109     lbl->setFixedSize( lbl->sizeHint() );
00110     QHBox* hbox = new QHBox( main );
00111     d->userEdit = new KLineEdit( hbox );
00112     lbl->setBuddy( d->userEdit );
00113     QSize s = d->userEdit->sizeHint();
00114     d->userEdit->setFixedHeight( s.height() );
00115     d->userEdit->setMinimumWidth( s.width() );
00116     lbl->setBuddy( d->userEdit );
00117     d->layout->addWidget( lbl, 4, 0 );
00118     d->layout->addWidget( hbox, 4, 2 );
00119 
00120     // Row 5: Row spacer
00121     d->layout->addRowSpacing( 5, 4 );
00122 
00123     // Row 6: Password field
00124     lbl = new QLabel( i18n("&Password:"), main );
00125     lbl->setAlignment( Qt::AlignVCenter | Qt::AlignLeft );
00126     lbl->setFixedSize( lbl->sizeHint() );
00127     hbox = new QHBox( main );
00128     d->passEdit = new KLineEdit( hbox );
00129     if ( cfg->readEntry("EchoMode", "OneStar") == "NoEcho" )
00130         d->passEdit->setEchoMode( QLineEdit::NoEcho );
00131     else
00132         d->passEdit->setEchoMode( QLineEdit::Password );
00133     lbl->setBuddy( d->passEdit );
00134     s = d->passEdit->sizeHint();
00135     d->passEdit->setFixedHeight( s.height() );
00136     d->passEdit->setMinimumWidth( s.width() );
00137     lbl->setBuddy( d->passEdit );
00138     d->layout->addWidget( lbl, 6, 0 );
00139     d->layout->addWidget( hbox, 6, 2 );
00140 
00141     if ( enableKeep )
00142     {
00143         // Row 7: Add spacer
00144         d->layout->addRowSpacing( 7, 4 );
00145         // Row 8: Keep Password
00146         hbox = new QHBox( main );
00147         d->keepCheckBox = new QCheckBox( i18n("&Keep password"), hbox );
00148         d->keepCheckBox->setFixedSize( d->keepCheckBox->sizeHint() );
00149         d->keep = cfg->readBoolEntry("Keep", false );
00150         d->keepCheckBox->setChecked( d->keep );
00151         connect(d->keepCheckBox, SIGNAL(toggled( bool )), SLOT(slotKeep( bool )));
00152         d->layout->addWidget( hbox, 8, 2 );
00153     }
00154 
00155     // Configure necessary key-bindings and connect necessar slots and signals
00156     connect( d->userEdit, SIGNAL(returnPressed()), d->passEdit, SLOT(setFocus()) );
00157     connect( d->passEdit, SIGNAL(returnPressed()), SLOT(slotOk()) );
00158 
00159     if ( !user.isEmpty() )
00160     {
00161         d->userEdit->setText( user );
00162         d->passEdit->setFocus();
00163     }
00164     else
00165         d->userEdit->setFocus();
00166 
00167 //    setFixedSize( sizeHint() );
00168 }
00169 
00170 QString PasswordDialog::username() const
00171 {
00172     return d->userEdit->text();
00173 }
00174 
00175 QString PasswordDialog::password() const
00176 {
00177     return d->passEdit->text();
00178 }
00179 
00180 void PasswordDialog::setKeepPassword( bool b )
00181 {
00182     if ( d->keepCheckBox )
00183         d->keepCheckBox->setChecked( b );
00184 }
00185 
00186 bool PasswordDialog::keepPassword() const
00187 {
00188     return d->keep;
00189 }
00190 
00191 static void calculateLabelSize(QLabel *label)
00192 {
00193    QString qt_text = label->text();
00194 
00195    int pref_width = 0;
00196    int pref_height = 0;
00197    // Calculate a proper size for the text.
00198    {
00199        QSimpleRichText rt(qt_text, label->font());
00200        QRect d = KGlobalSettings::desktopGeometry(label->topLevelWidget());
00201 
00202        pref_width = d.width() / 4;
00203        rt.setWidth(pref_width-10);
00204        int used_width = rt.widthUsed();
00205        pref_height = rt.height();
00206        if (used_width <= pref_width)
00207        {
00208           while(true)
00209           {
00210              int new_width = (used_width * 9) / 10;
00211              rt.setWidth(new_width-10);
00212              int new_height = rt.height();
00213              if (new_height > pref_height)
00214                 break;
00215              used_width = rt.widthUsed();
00216              if (used_width > new_width)
00217                 break;
00218           }
00219           pref_width = used_width;
00220        }
00221        else
00222        {
00223           if (used_width > (pref_width *2))
00224              pref_width = pref_width *2;
00225           else
00226              pref_width = used_width;
00227        }
00228     }
00229     label->setFixedSize(QSize(pref_width+10, pref_height));
00230 }
00231 
00232 void PasswordDialog::addCommentLine( const QString& label,
00233                                      const QString comment )
00234 {
00235     if (d->nRow > 0)
00236         return;
00237 
00238     QWidget *main = mainWidget();
00239 
00240     QLabel* lbl = new QLabel( label, main);
00241     lbl->setAlignment( Qt::AlignVCenter|Qt::AlignRight );
00242     lbl->setFixedSize( lbl->sizeHint() );
00243     d->layout->addWidget( lbl, d->nRow+2, 0, Qt::AlignLeft );
00244     lbl = new QLabel( comment, main);
00245     lbl->setAlignment( Qt::AlignVCenter|Qt::AlignLeft|Qt::WordBreak );
00246     calculateLabelSize(lbl);
00247     d->layout->addWidget( lbl, d->nRow+2, 2, Qt::AlignLeft );
00248     d->layout->addRowSpacing( 3, 10 ); // Add a spacer
00249     d->nRow++;
00250 }
00251 
00252 void PasswordDialog::slotKeep( bool keep )
00253 {
00254     d->keep = keep;
00255 }
00256 
00257 static QString qrichtextify( const QString& text )
00258 {
00259   if ( text.isEmpty() || text[0] == '<' )
00260     return text;
00261 
00262   QStringList lines = QStringList::split('\n', text);
00263   for(QStringList::Iterator it = lines.begin(); it != lines.end(); ++it)
00264   {
00265     *it = QStyleSheet::convertFromPlainText( *it, QStyleSheetItem::WhiteSpaceNormal );
00266   }
00267 
00268   return lines.join(QString::null);
00269 }
00270 
00271 void PasswordDialog::setPrompt(const QString& prompt)
00272 {
00273     QString text = qrichtextify(prompt);
00274     d->prompt->setText(text);
00275     calculateLabelSize(d->prompt);
00276 }
00277 
00278 void PasswordDialog::setPassword(const QString &p)
00279 {
00280     d->passEdit->setText(p);
00281 }
00282 
00283 void PasswordDialog::setUserReadOnly( bool readOnly )
00284 {
00285     d->userEdit->setReadOnly( readOnly );
00286     if ( readOnly && d->userEdit->hasFocus() )
00287         d->passEdit->setFocus();
00288 }
00289 
00290 int PasswordDialog::getNameAndPassword( QString& user, QString& pass, bool* keep,
00291                                         const QString& prompt, bool readOnly,
00292                                         const QString& caption,
00293                                         const QString& comment,
00294                                         const QString& label )
00295 {
00296     PasswordDialog* dlg;
00297     if( keep )
00298         dlg = new PasswordDialog( prompt, user, (*keep) );
00299     else
00300         dlg = new PasswordDialog( prompt, user );
00301 
00302     if ( !caption.isEmpty() )
00303         dlg->setPlainCaption( caption );
00304     else
00305         dlg->setPlainCaption( i18n("Authorization Dialog") );
00306 
00307     if ( !comment.isEmpty() )
00308         dlg->addCommentLine( label, comment );
00309 
00310     if ( readOnly )
00311         dlg->setUserReadOnly( readOnly );
00312 
00313     int ret = dlg->exec();
00314     if ( ret == Accepted )
00315     {
00316         user = dlg->username();
00317         pass = dlg->password();
00318         if ( keep ) { (*keep) = dlg->keepPassword(); }
00319     }
00320     delete dlg;
00321     return ret;
00322  }
00323 
00324 void PasswordDialog::virtual_hook( int id, void* data )
00325 { KDialogBase::virtual_hook( id, data ); }
00326 
00327 
00328 #include "passdlg.moc"
KDE Logo
This file is part of the documentation for kio Library Version 3.3.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Feb 18 15:10:44 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003