00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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 <klocale.h>
00032 #include <kbuttonbox.h>
00033 #include <kstandarddirs.h>
00034 #include <kseparator.h>
00035
00036 #include "passdlg.h"
00037
00038 using namespace KIO;
00039
00040 struct PasswordDialog::PasswordDialogPrivate
00041 {
00042 QGridLayout *layout;
00043 KLineEdit* userEdit;
00044 KLineEdit* passEdit;
00045 QLabel* prompt;
00046 QCheckBox* keepCheckBox;
00047
00048 bool keep;
00049 short unsigned int nRow;
00050 };
00051
00052 PasswordDialog::PasswordDialog( const QString& prompt, const QString& user,
00053 bool enableKeep, bool modal, QWidget* parent,
00054 const char* name )
00055 :KDialogBase( parent, name, modal, i18n("Password"), Ok|Cancel, Ok, true)
00056 {
00057 init ( prompt, user, enableKeep );
00058 }
00059
00060 PasswordDialog::~PasswordDialog()
00061 {
00062 delete d;
00063 }
00064
00065 void PasswordDialog::init( const QString& prompt, const QString& user,
00066 bool enableKeep )
00067 {
00068 QWidget *main = makeMainWidget();
00069
00070 d = new PasswordDialogPrivate;
00071 d->keep = false;
00072 d->nRow = 0;
00073 d->keepCheckBox = 0;
00074
00075 KConfig* cfg = KGlobal::config();
00076 KConfigGroupSaver saver( cfg, "Passwords" );
00077
00078 d->layout = new QGridLayout( main, 9, 3, spacingHint(), marginHint());
00079 d->layout->addColSpacing(1, 5);
00080
00081
00082 QLabel* lbl;
00083 QPixmap pix(locate("data", QString::fromLatin1("kdeui/pics/keys.png")));
00084 if ( !pix.isNull() )
00085 {
00086 lbl = new QLabel( main );
00087 lbl->setPixmap( pix );
00088 lbl->setAlignment( Qt::AlignLeft|Qt::AlignVCenter );
00089 lbl->setFixedSize( lbl->sizeHint() );
00090 d->layout->addWidget( lbl, 0, 0, Qt::AlignLeft );
00091 }
00092 d->prompt = new QLabel( main );
00093 d->prompt->setAlignment( Qt::AlignLeft|Qt::AlignVCenter|Qt::WordBreak );
00094 d->layout->addWidget( d->prompt, 0, 2, Qt::AlignLeft );
00095 if ( prompt.isEmpty() )
00096 setPrompt( i18n( "You need to supply a username and a password" ) );
00097 else
00098 setPrompt( prompt );
00099
00100
00101 d->layout->addRowSpacing( 1, 7 );
00102
00103
00104
00105
00106 lbl = new QLabel( i18n("&Username:"), main );
00107 lbl->setAlignment( Qt::AlignVCenter | Qt::AlignLeft );
00108 lbl->setFixedSize( lbl->sizeHint() );
00109 QHBox* hbox = new QHBox( main );
00110 d->userEdit = new KLineEdit( hbox );
00111 lbl->setBuddy( d->userEdit );
00112 QSize s = d->userEdit->sizeHint();
00113 d->userEdit->setFixedHeight( s.height() );
00114 d->userEdit->setMinimumWidth( s.width() );
00115 lbl->setBuddy( d->userEdit );
00116 d->layout->addWidget( lbl, 4, 0 );
00117 d->layout->addWidget( hbox, 4, 2 );
00118
00119
00120 d->layout->addRowSpacing( 5, 4 );
00121
00122
00123 lbl = new QLabel( i18n("&Password:"), main );
00124 lbl->setAlignment( Qt::AlignVCenter | Qt::AlignLeft );
00125 lbl->setFixedSize( lbl->sizeHint() );
00126 hbox = new QHBox( main );
00127 d->passEdit = new KLineEdit( hbox );
00128 if ( cfg->readEntry("EchoMode", "OneStar") == "NoEcho" )
00129 d->passEdit->setEchoMode( QLineEdit::NoEcho );
00130 else
00131 d->passEdit->setEchoMode( QLineEdit::Password );
00132 lbl->setBuddy( d->passEdit );
00133 s = d->passEdit->sizeHint();
00134 d->passEdit->setFixedHeight( s.height() );
00135 d->passEdit->setMinimumWidth( s.width() );
00136 lbl->setBuddy( d->passEdit );
00137 d->layout->addWidget( lbl, 6, 0 );
00138 d->layout->addWidget( hbox, 6, 2 );
00139
00140 if ( enableKeep )
00141 {
00142
00143 d->layout->addRowSpacing( 7, 4 );
00144
00145 hbox = new QHBox( main );
00146 d->keepCheckBox = new QCheckBox( i18n("&Keep password"), hbox );
00147 d->keepCheckBox->setFixedSize( d->keepCheckBox->sizeHint() );
00148 d->keep = cfg->readBoolEntry("Keep", false );
00149 d->keepCheckBox->setChecked( d->keep );
00150 connect(d->keepCheckBox, SIGNAL(toggled( bool )), SLOT(slotKeep( bool )));
00151 d->layout->addWidget( hbox, 8, 2 );
00152 }
00153
00154
00155 connect( d->userEdit, SIGNAL(returnPressed()), d->passEdit, SLOT(setFocus()) );
00156 connect( d->passEdit, SIGNAL(returnPressed()), SLOT(slotOk()) );
00157
00158 if ( !user.isEmpty() )
00159 {
00160 d->userEdit->setText( user );
00161 d->passEdit->setFocus();
00162 }
00163 else
00164 d->userEdit->setFocus();
00165
00166
00167 }
00168
00169 QString PasswordDialog::username() const
00170 {
00171 return d->userEdit->text();
00172 }
00173
00174 QString PasswordDialog::password() const
00175 {
00176 return d->passEdit->text();
00177 }
00178
00179 void PasswordDialog::setKeepPassword( bool b )
00180 {
00181 if ( d->keepCheckBox )
00182 d->keepCheckBox->setChecked( b );
00183 }
00184
00185 bool PasswordDialog::keepPassword() const
00186 {
00187 return d->keep;
00188 }
00189
00190 static void calculateLabelSize(QLabel *label)
00191 {
00192 QString qt_text = label->text();
00193
00194 int pref_width = 0;
00195 int pref_height = 0;
00196
00197 {
00198 QSimpleRichText rt(qt_text, label->font());
00199 QRect d = KGlobalSettings::desktopGeometry(label->topLevelWidget());
00200
00201 pref_width = d.width() / 4;
00202 rt.setWidth(pref_width-10);
00203 int used_width = rt.widthUsed();
00204 pref_height = rt.height();
00205 if (used_width <= pref_width)
00206 {
00207 while(true)
00208 {
00209 int new_width = (used_width * 9) / 10;
00210 rt.setWidth(new_width-10);
00211 int new_height = rt.height();
00212 if (new_height > pref_height)
00213 break;
00214 used_width = rt.widthUsed();
00215 if (used_width > new_width)
00216 break;
00217 }
00218 pref_width = used_width;
00219 }
00220 else
00221 {
00222 if (used_width > (pref_width *2))
00223 pref_width = pref_width *2;
00224 else
00225 pref_width = used_width;
00226 }
00227 }
00228 label->setFixedSize(QSize(pref_width+10, pref_height));
00229 }
00230
00231 void PasswordDialog::addCommentLine( const QString& label,
00232 const QString comment )
00233 {
00234 if (d->nRow > 0)
00235 return;
00236
00237 QWidget *main = mainWidget();
00238
00239 QLabel* lbl = new QLabel( label, main);
00240 lbl->setAlignment( Qt::AlignVCenter|Qt::AlignRight );
00241 lbl->setFixedSize( lbl->sizeHint() );
00242 d->layout->addWidget( lbl, d->nRow+2, 0, Qt::AlignLeft );
00243 lbl = new QLabel( comment, main);
00244 lbl->setAlignment( Qt::AlignVCenter|Qt::AlignLeft|Qt::WordBreak );
00245 calculateLabelSize(lbl);
00246 d->layout->addWidget( lbl, d->nRow+2, 2, Qt::AlignLeft );
00247 d->layout->addRowSpacing( 3, 10 );
00248 d->nRow++;
00249 }
00250
00251 void PasswordDialog::slotKeep( bool keep )
00252 {
00253 d->keep = keep;
00254 }
00255
00256 static QString qrichtextify( const QString& text )
00257 {
00258 if ( text.isEmpty() || text[0] == '<' )
00259 return text;
00260
00261 QStringList lines = QStringList::split('\n', text);
00262 for(QStringList::Iterator it = lines.begin(); it != lines.end(); ++it)
00263 {
00264 *it = QStyleSheet::convertFromPlainText( *it, QStyleSheetItem::WhiteSpaceNormal );
00265 }
00266
00267 return lines.join(QString::null);
00268 }
00269
00270 void PasswordDialog::setPrompt(const QString& prompt)
00271 {
00272 QString text = qrichtextify(prompt);
00273 d->prompt->setText(text);
00274 calculateLabelSize(d->prompt);
00275 }
00276
00277 void PasswordDialog::setPassword(const QString &p)
00278 {
00279 d->passEdit->setText(p);
00280 }
00281
00282 void PasswordDialog::setUserReadOnly( bool readOnly )
00283 {
00284 d->userEdit->setReadOnly( readOnly );
00285 if ( readOnly && d->userEdit->hasFocus() )
00286 d->passEdit->setFocus();
00287 }
00288
00289 int PasswordDialog::getNameAndPassword( QString& user, QString& pass, bool* keep,
00290 const QString& prompt, bool readOnly,
00291 const QString& caption,
00292 const QString& comment,
00293 const QString& label )
00294 {
00295 PasswordDialog* dlg;
00296 if( keep )
00297 dlg = new PasswordDialog( prompt, user, (*keep) );
00298 else
00299 dlg = new PasswordDialog( prompt, user );
00300
00301 if ( !caption.isEmpty() )
00302 dlg->setPlainCaption( caption );
00303 else
00304 dlg->setPlainCaption( i18n("Authorization Dialog") );
00305
00306 if ( !comment.isEmpty() )
00307 dlg->addCommentLine( label, comment );
00308
00309 if ( readOnly )
00310 dlg->setUserReadOnly( readOnly );
00311
00312 int ret = dlg->exec();
00313 if ( ret == Accepted )
00314 {
00315 user = dlg->username();
00316 pass = dlg->password();
00317 if ( keep ) { (*keep) = dlg->keepPassword(); }
00318 }
00319 delete dlg;
00320 return ret;
00321 }
00322
00323 void PasswordDialog::virtual_hook( int id, void* data )
00324 { KDialogBase::virtual_hook( id, data ); }
00325
00326
00327 #include "passdlg.moc"