00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <qtimer.h>
00020 #include <qlayout.h>
00021 #include <qtooltip.h>
00022 #include <qdatetime.h>
00023 #include <qcheckbox.h>
00024
00025 #include <kapplication.h>
00026 #include <kdebug.h>
00027 #include <kdialog.h>
00028 #include <kstringhandler.h>
00029 #include <kglobal.h>
00030 #include <klocale.h>
00031 #include <kiconloader.h>
00032 #include <kprocess.h>
00033 #include <kpushbutton.h>
00034 #include <kstandarddirs.h>
00035 #include <kstdguiitem.h>
00036 #include <klineedit.h>
00037 #include <kwin.h>
00038
00039 #include "jobclasses.h"
00040 #include "defaultprogress.h"
00041
00042 namespace KIO {
00043
00044 class DefaultProgress::DefaultProgressPrivate
00045 {
00046 public:
00047 bool keepOpenChecked;
00048 bool noCaptionYet;
00049 KPushButton *cancelClose;
00050 KPushButton *openFile;
00051 KPushButton *openLocation;
00052 QCheckBox *keepOpen;
00053 KURL location;
00054 QTime startTime;
00055 };
00056
00057 DefaultProgress::DefaultProgress( bool showNow )
00058 : ProgressBase( 0 ),
00059 m_iTotalSize(0), m_iTotalFiles(0), m_iTotalDirs(0),
00060 m_iProcessedSize(0), m_iProcessedDirs(0), m_iProcessedFiles(0)
00061 {
00062 init();
00063
00064 if ( showNow ) {
00065 show();
00066 }
00067 }
00068
00069 DefaultProgress::DefaultProgress( QWidget* parent, const char* )
00070 : ProgressBase( parent ),
00071 m_iTotalSize(0), m_iTotalFiles(0), m_iTotalDirs(0),
00072 m_iProcessedSize(0), m_iProcessedDirs(0), m_iProcessedFiles(0)
00073 {
00074 init();
00075 }
00076
00077 bool DefaultProgress::keepOpen() const
00078 {
00079 return d->keepOpenChecked;
00080 }
00081
00082 void DefaultProgress::init()
00083 {
00084 d = new DefaultProgressPrivate;
00085
00086 #ifdef Q_WS_X11 //FIXME(E): Remove once all the KWin::foo calls have been ported to QWS
00087
00088 KWin::setIcons( winId(),
00089 KGlobal::iconLoader()->loadIcon( "filesave", KIcon::NoGroup, 32 ),
00090 KGlobal::iconLoader()->loadIcon( "filesave", KIcon::NoGroup, 16 ) );
00091 #endif
00092
00093 QVBoxLayout *topLayout = new QVBoxLayout( this, KDialog::marginHint(),
00094 KDialog::spacingHint() );
00095 topLayout->addStrut( 360 );
00096
00097 QGridLayout *grid = new QGridLayout( 2, 3 );
00098 topLayout->addLayout(grid);
00099 grid->addColSpacing(1, KDialog::spacingHint());
00100
00101 grid->addWidget(new QLabel(i18n("Source:"), this), 0, 0);
00102
00103 sourceEdit = new KLineEdit(this);
00104 sourceEdit->setReadOnly (true);
00105 grid->addWidget(sourceEdit, 0, 2);
00106
00107 destInvite = new QLabel(i18n("Destination:"), this);
00108 grid->addWidget(destInvite, 1, 0);
00109
00110 destEdit = new KLineEdit(this);
00111 destEdit->setReadOnly (true);
00112 grid->addWidget(destEdit, 1, 2);
00113
00114 m_pProgressBar = new KProgress(this);
00115 topLayout->addWidget( m_pProgressBar );
00116
00117
00118 QHBoxLayout *hBox = new QHBoxLayout();
00119 topLayout->addLayout(hBox);
00120
00121 sizeLabel = new QLabel(this);
00122 hBox->addWidget(sizeLabel);
00123
00124 resumeLabel = new QLabel(this);
00125 hBox->addWidget(resumeLabel);
00126
00127 progressLabel = new QLabel( this );
00128
00129
00130 progressLabel->setAlignment( QLabel::AlignRight );
00131 hBox->addWidget( progressLabel );
00132
00133 hBox = new QHBoxLayout();
00134 topLayout->addLayout(hBox);
00135
00136 speedLabel = new QLabel(this);
00137 hBox->addWidget(speedLabel, 1);
00138
00139 QFrame *line = new QFrame( this );
00140 line->setFrameShape( QFrame::HLine );
00141 line->setFrameShadow( QFrame::Sunken );
00142 topLayout->addWidget( line );
00143
00144 d->keepOpen = new QCheckBox( i18n("&Keep this window open after transfer is complete"), this);
00145 connect( d->keepOpen, SIGNAL( toggled(bool) ), SLOT( slotKeepOpenToggled(bool) ) );
00146 topLayout->addWidget(d->keepOpen);
00147 d->keepOpen->hide();
00148
00149 hBox = new QHBoxLayout();
00150 topLayout->addLayout(hBox);
00151
00152 d->openFile = new KPushButton( i18n("Open &File"), this );
00153 connect( d->openFile, SIGNAL( clicked() ), SLOT( slotOpenFile() ) );
00154 hBox->addWidget( d->openFile );
00155 d->openFile->setEnabled(false);
00156 d->openFile->hide();
00157
00158 d->openLocation = new KPushButton( i18n("Open &Destination"), this );
00159 connect( d->openLocation, SIGNAL( clicked() ), SLOT( slotOpenLocation() ) );
00160 hBox->addWidget( d->openLocation );
00161 d->openLocation->hide();
00162
00163 hBox->addStretch(1);
00164
00165 d->cancelClose = new KPushButton( KStdGuiItem::cancel(), this );
00166 connect( d->cancelClose, SIGNAL( clicked() ), SLOT( slotStop() ) );
00167 hBox->addWidget( d->cancelClose );
00168
00169 resize( sizeHint() );
00170 setMaximumHeight(sizeHint().height());
00171
00172 d->keepOpenChecked = false;
00173 d->noCaptionYet = true;
00174 setCaption(i18n("Progress Dialog"));
00175 }
00176
00177 DefaultProgress::~DefaultProgress()
00178 {
00179 delete d;
00180 }
00181
00182 void DefaultProgress::slotTotalSize( KIO::Job*, KIO::filesize_t bytes )
00183 {
00184 m_iTotalSize = bytes;
00185 if (d->startTime.isNull())
00186 d->startTime.start();
00187 }
00188
00189
00190 void DefaultProgress::slotTotalFiles( KIO::Job*, unsigned long files )
00191 {
00192 m_iTotalFiles = files;
00193 showTotals();
00194 }
00195
00196
00197 void DefaultProgress::slotTotalDirs( KIO::Job*, unsigned long dirs )
00198 {
00199 m_iTotalDirs = dirs;
00200 showTotals();
00201 }
00202
00203 void DefaultProgress::showTotals()
00204 {
00205
00206
00207
00208 if ( m_iProcessedFiles == 0 && m_iProcessedDirs == 0 )
00209 {
00210 QString tmps;
00211 if ( m_iTotalDirs > 1 )
00212
00213 tmps = i18n("%n folder", "%n folders", m_iTotalDirs) + " ";
00214 tmps += i18n("%n file", "%n files", m_iTotalFiles);
00215 progressLabel->setText( tmps );
00216 }
00217 }
00218
00219 void DefaultProgress::slotPercent( KIO::Job*, unsigned long percent )
00220 {
00221 QString tmp(i18n( "%1% of %2 ").arg( percent ).arg( KIO::convertSize(m_iTotalSize)));
00222 m_pProgressBar->setValue( percent );
00223 switch(mode) {
00224 case Copy:
00225 tmp.append(i18n(" (Copying)"));
00226 break;
00227 case Move:
00228 tmp.append(i18n(" (Moving)"));
00229 break;
00230 case Delete:
00231 tmp.append(i18n(" (Deleting)"));
00232 break;
00233 case Create:
00234 tmp.append(i18n(" (Creating)"));
00235 break;
00236 }
00237
00238 setCaption( tmp );
00239 d->noCaptionYet = false;
00240 }
00241
00242
00243 void DefaultProgress::slotInfoMessage( KIO::Job*, const QString & msg )
00244 {
00245 speedLabel->setText( msg );
00246 speedLabel->setAlignment( speedLabel->alignment() & ~Qt::WordBreak );
00247 }
00248
00249
00250 void DefaultProgress::slotProcessedSize( KIO::Job*, KIO::filesize_t bytes ) {
00251 m_iProcessedSize = bytes;
00252
00253 QString tmp;
00254 tmp = i18n( "%1 of %2 complete").arg( KIO::convertSize(bytes) ).arg( KIO::convertSize(m_iTotalSize));
00255 sizeLabel->setText( tmp );
00256 }
00257
00258
00259 void DefaultProgress::slotProcessedDirs( KIO::Job*, unsigned long dirs )
00260 {
00261 m_iProcessedDirs = dirs;
00262
00263 QString tmps;
00264 tmps = i18n("%1 / %n folder", "%1 / %n folders", m_iTotalDirs).arg( m_iProcessedDirs );
00265 tmps += " ";
00266 tmps += i18n("%1 / %n file", "%1 / %n files", m_iTotalFiles).arg( m_iProcessedFiles );
00267 progressLabel->setText( tmps );
00268 }
00269
00270
00271 void DefaultProgress::slotProcessedFiles( KIO::Job*, unsigned long files )
00272 {
00273 m_iProcessedFiles = files;
00274
00275 QString tmps;
00276 if ( m_iTotalDirs > 1 ) {
00277 tmps = i18n("%1 / %n folder", "%1 / %n folders", m_iTotalDirs).arg( m_iProcessedDirs );
00278 tmps += " ";
00279 }
00280 tmps += i18n("%1 / %n file", "%1 / %n files", m_iTotalFiles).arg( m_iProcessedFiles );
00281 progressLabel->setText( tmps );
00282 }
00283
00284
00285 void DefaultProgress::slotSpeed( KIO::Job*, unsigned long bytes_per_second )
00286 {
00287 if ( bytes_per_second == 0 ) {
00288 speedLabel->setText( i18n( "Stalled") );
00289 } else {
00290 QTime remaining = KIO::calculateRemaining( m_iTotalSize, m_iProcessedSize, bytes_per_second );
00291 speedLabel->setText( i18n( "%1/s ( %2 remaining )").arg( KIO::convertSize( bytes_per_second )).arg( remaining.toString() ) );
00292 }
00293 }
00294
00295
00296 void DefaultProgress::slotCopying( KIO::Job*, const KURL& from, const KURL& to )
00297 {
00298 if ( d->noCaptionYet ) {
00299 setCaption(i18n("Copy File(s) Progress"));
00300 d->noCaptionYet = false;
00301 }
00302 mode = Copy;
00303 sourceEdit->setSqueezedText(from.prettyURL());
00304 sourceEdit->home (false);
00305 setDestVisible( true );
00306 checkDestination( to );
00307 destEdit->setSqueezedText(to.prettyURL());
00308 destEdit->home (false);
00309 }
00310
00311
00312 void DefaultProgress::slotMoving( KIO::Job*, const KURL& from, const KURL& to )
00313 {
00314 if ( d->noCaptionYet ) {
00315 setCaption(i18n("Move File(s) Progress"));
00316 d->noCaptionYet = false;
00317 }
00318 mode = Move;
00319 sourceEdit->setSqueezedText(from.prettyURL());
00320 sourceEdit->home (false);
00321 setDestVisible( true );
00322 checkDestination( to );
00323 destEdit->setSqueezedText(to.prettyURL());
00324 destEdit->home (false);
00325 }
00326
00327
00328 void DefaultProgress::slotCreatingDir( KIO::Job*, const KURL& dir )
00329 {
00330 if ( d->noCaptionYet ) {
00331 setCaption(i18n("Creating Folder"));
00332 d->noCaptionYet = false;
00333 }
00334 mode = Create;
00335 sourceEdit->setSqueezedText(dir.prettyURL());
00336 sourceEdit->home (false);
00337 setDestVisible( false );
00338 }
00339
00340
00341 void DefaultProgress::slotDeleting( KIO::Job*, const KURL& url )
00342 {
00343 if ( d->noCaptionYet ) {
00344 setCaption(i18n("Delete File(s) Progress"));
00345 d->noCaptionYet = false;
00346 }
00347 mode = Delete;
00348 sourceEdit->setSqueezedText(url.prettyURL());
00349 sourceEdit->home (false);
00350 setDestVisible( false );
00351 }
00352
00353 void DefaultProgress::slotTransferring( KIO::Job*, const KURL& url )
00354 {
00355 if ( d->noCaptionYet ) {
00356 setCaption(i18n("Loading Progress"));
00357 d->noCaptionYet = false;
00358 }
00359 sourceEdit->setSqueezedText(url.prettyURL());
00360 sourceEdit->home (false);
00361 setDestVisible( false );
00362 }
00363
00364 void DefaultProgress::slotStating( KIO::Job*, const KURL& url )
00365 {
00366 setCaption(i18n("Examining File Progress"));
00367 sourceEdit->setSqueezedText(url.prettyURL());
00368 sourceEdit->home (false);
00369 setDestVisible( false );
00370 }
00371
00372 void DefaultProgress::slotMounting( KIO::Job*, const QString & dev, const QString & point )
00373 {
00374 setCaption(i18n("Mounting %1").arg(dev));
00375 sourceEdit->setSqueezedText(point);
00376 sourceEdit->home (false);
00377 setDestVisible( false );
00378 }
00379
00380 void DefaultProgress::slotUnmounting( KIO::Job*, const QString & point )
00381 {
00382 setCaption(i18n("Unmounting"));
00383 sourceEdit->setSqueezedText(point);
00384 sourceEdit->home (false);
00385 setDestVisible( false );
00386 }
00387
00388 void DefaultProgress::slotCanResume( KIO::Job*, KIO::filesize_t resume )
00389 {
00390 if ( resume ) {
00391 resumeLabel->setText( i18n("Resuming from %1").arg(KIO::number(resume)) );
00392 } else {
00393 resumeLabel->setText( i18n("Not resumable") );
00394 }
00395 }
00396
00397 void DefaultProgress::setDestVisible( bool visible )
00398 {
00399
00400
00401 if (visible)
00402 {
00403 destInvite->show();
00404 destEdit->show();
00405
00406 destInvite->setText( i18n("Destination:") );
00407 }
00408 else
00409 {
00410 destInvite->hide();
00411 destEdit->hide();
00412 destInvite->setText( QString::null );
00413 destEdit->setText( QString::null );
00414 }
00415 }
00416
00417 void DefaultProgress::slotClean() {
00418 if (d->keepOpenChecked) {
00419 slotPercent(0, 100);
00420 d->cancelClose->setGuiItem( KStdGuiItem::close() );
00421 d->openFile->setEnabled(true);
00422 slotProcessedSize(0, m_iTotalSize);
00423 d->keepOpen->setEnabled(false);
00424 if (!d->startTime.isNull()) {
00425 int s = d->startTime.elapsed();
00426 if (!s)
00427 s = 1;
00428 speedLabel->setText(i18n("%1/s (done)").arg(KIO::convertSize(1000 * m_iTotalSize / s)));
00429 }
00430 setOnlyClean(false);
00431 }
00432 else
00433 hide();
00434 }
00435
00436 void DefaultProgress::slotKeepOpenToggled(bool keepopen)
00437 {
00438 d->keepOpenChecked=keepopen;
00439 }
00440
00441 void DefaultProgress::checkDestination(const KURL& dest) {
00442 bool ok = true;
00443 if ( dest.isLocalFile() ) {
00444 QString path = dest.path( -1 );
00445 QStringList tmpDirs = KGlobal::dirs()->resourceDirs( "tmp" );
00446 for ( QStringList::Iterator it = tmpDirs.begin() ; ok && it != tmpDirs.end() ; ++it )
00447 if ( path.contains( *it ) )
00448 ok = false;
00449 }
00450
00451 if ( ok ) {
00452 d->openFile->show();
00453 d->openLocation->show();
00454 d->keepOpen->show();
00455 d->location=dest;
00456 }
00457 }
00458
00459 void DefaultProgress::slotOpenFile()
00460 {
00461 KProcess proc;
00462 proc << "konqueror" << d->location.prettyURL();
00463 proc.start(KProcess::DontCare);
00464 }
00465
00466 void DefaultProgress::slotOpenLocation()
00467 {
00468 KProcess proc;
00469 d->location.setFileName("");
00470 proc << "konqueror" << d->location.prettyURL();
00471 proc.start(KProcess::DontCare);
00472 }
00473
00474 void DefaultProgress::virtual_hook( int id, void* data )
00475 { ProgressBase::virtual_hook( id, data ); }
00476
00477 }
00478
00479 #include "defaultprogress.moc"