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"