diff options
Diffstat (limited to 'tdeio/tdeio/defaultprogress.cpp')
-rw-r--r-- | tdeio/tdeio/defaultprogress.cpp | 507 |
1 files changed, 507 insertions, 0 deletions
diff --git a/tdeio/tdeio/defaultprogress.cpp b/tdeio/tdeio/defaultprogress.cpp new file mode 100644 index 000000000..a4de9c31b --- /dev/null +++ b/tdeio/tdeio/defaultprogress.cpp @@ -0,0 +1,507 @@ +/* This file is part of the KDE libraries + Copyright (C) 2000 Matej Koss <koss@miesto.sk> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + 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 <tqtimer.h> +#include <tqlayout.h> +#include <tqtooltip.h> +#include <tqdatetime.h> +#include <tqcheckbox.h> + +#include <kapplication.h> +#include <kdebug.h> +#include <kdialog.h> +#include <kstringhandler.h> +#include <kglobal.h> +#include <klocale.h> +#include <kiconloader.h> +#include <kprocess.h> +#include <kpushbutton.h> +#include <kstandarddirs.h> +#include <kstdguiitem.h> +#include <klineedit.h> + +#ifdef Q_WS_X11 +#include <twin.h> +#endif + +#include "jobclasses.h" +#include "defaultprogress.h" + +namespace TDEIO { + +class DefaultProgress::DefaultProgressPrivate +{ +public: + bool keepOpenChecked; + bool noCaptionYet; + KPushButton *cancelClose; + KPushButton *openFile; + KPushButton *openLocation; + TQCheckBox *keepOpen; + KURL location; + TQTime startTime; +}; + +DefaultProgress::DefaultProgress( bool showNow ) + : ProgressBase( 0 ), + m_iTotalSize(0), m_iTotalFiles(0), m_iTotalDirs(0), + m_iProcessedSize(0), m_iProcessedDirs(0), m_iProcessedFiles(0) +{ + init(); + + if ( showNow ) { + show(); + } +} + +DefaultProgress::DefaultProgress( TQWidget* parent, const char* /*name*/ ) + : ProgressBase( parent ), + m_iTotalSize(0), m_iTotalFiles(0), m_iTotalDirs(0), + m_iProcessedSize(0), m_iProcessedDirs(0), m_iProcessedFiles(0) +{ + init(); +} + +bool DefaultProgress::keepOpen() const +{ + return d->keepOpenChecked; +} + +void DefaultProgress::init() +{ + d = new DefaultProgressPrivate; + +#ifdef Q_WS_X11 //FIXME(E): Remove once all the KWin::foo calls have been ported to QWS + // Set a useful icon for this window! + KWin::setIcons( winId(), + TDEGlobal::iconLoader()->loadIcon( "filesave", KIcon::NoGroup, 32 ), + TDEGlobal::iconLoader()->loadIcon( "filesave", KIcon::NoGroup, 16 ) ); +#endif + + TQVBoxLayout *topLayout = new TQVBoxLayout( this, KDialog::marginHint(), + KDialog::spacingHint() ); + topLayout->addStrut( 360 ); // makes dlg at least that wide + + TQGridLayout *grid = new TQGridLayout( 2, 3 ); + topLayout->addLayout(TQT_TQLAYOUT(grid)); + grid->addColSpacing(1, KDialog::spacingHint()); + // filenames or action name + grid->addWidget(new TQLabel(i18n("Source:"), this), 0, 0); + + sourceEdit = new KLineEdit(this); + sourceEdit->setReadOnly(true); + sourceEdit->setEnableSqueezedText(true); + grid->addWidget(sourceEdit, 0, 2); + + destInvite = new TQLabel(i18n("Destination:"), this); + grid->addWidget(destInvite, 1, 0); + + destEdit = new KLineEdit(this); + destEdit->setReadOnly (true); + destEdit->setEnableSqueezedText(true); + grid->addWidget(destEdit, 1, 2); + + m_pProgressBar = new KProgress(this); + topLayout->addWidget( m_pProgressBar ); + + // processed info + TQHBoxLayout *hBox = new TQHBoxLayout(); + topLayout->addLayout(hBox); + + sizeLabel = new TQLabel(this); + hBox->addWidget(sizeLabel); + + resumeLabel = new TQLabel(this); + hBox->addWidget(resumeLabel); + + progressLabel = new TQLabel( this ); +/* progressLabel->setSizePolicy( TQSizePolicy( TQSizePolicy::MinimumExpanding, + TQSizePolicy::Preferred ) );*/ + progressLabel->setAlignment( TQLabel::AlignRight ); + hBox->addWidget( progressLabel ); + + hBox = new TQHBoxLayout(); + topLayout->addLayout(hBox); + + speedLabel = new TQLabel(this); + hBox->addWidget(speedLabel, 1); + + TQFrame *line = new TQFrame( this ); + line->setFrameShape( TQFrame::HLine ); + line->setFrameShadow( TQFrame::Sunken ); + topLayout->addWidget( line ); + + d->keepOpen = new TQCheckBox( i18n("&Keep this window open after transfer is complete"), this); + connect( d->keepOpen, TQT_SIGNAL( toggled(bool) ), TQT_SLOT( slotKeepOpenToggled(bool) ) ); + topLayout->addWidget(d->keepOpen); + d->keepOpen->hide(); + + hBox = new TQHBoxLayout(); + topLayout->addLayout(hBox); + + d->openFile = new KPushButton( i18n("Open &File"), this ); + connect( d->openFile, TQT_SIGNAL( clicked() ), TQT_SLOT( slotOpenFile() ) ); + hBox->addWidget( d->openFile ); + d->openFile->setEnabled(false); + d->openFile->hide(); + + d->openLocation = new KPushButton( i18n("Open &Destination"), this ); + connect( d->openLocation, TQT_SIGNAL( clicked() ), TQT_SLOT( slotOpenLocation() ) ); + hBox->addWidget( d->openLocation ); + d->openLocation->hide(); + + hBox->addStretch(1); + + d->cancelClose = new KPushButton( KStdGuiItem::cancel(), this ); + connect( d->cancelClose, TQT_SIGNAL( clicked() ), TQT_SLOT( slotStop() ) ); + hBox->addWidget( d->cancelClose ); + + resize( sizeHint() ); + setMaximumHeight(sizeHint().height()); + + d->keepOpenChecked = false; + d->noCaptionYet = true; + setCaption(i18n("Progress Dialog")); // show something better than tdeio_uiserver +} + +DefaultProgress::~DefaultProgress() +{ + delete d; +} + +void DefaultProgress::slotTotalSize( TDEIO::Job*, TDEIO::filesize_t size ) +{ + // size is measured in bytes + if ( m_iTotalSize == size ) + return; + m_iTotalSize = size; + if (d->startTime.isNull()) + d->startTime.start(); +} + + +void DefaultProgress::slotTotalFiles( TDEIO::Job*, unsigned long files ) +{ + if ( m_iTotalFiles == files ) + return; + m_iTotalFiles = files; + showTotals(); +} + + +void DefaultProgress::slotTotalDirs( TDEIO::Job*, unsigned long dirs ) +{ + if ( m_iTotalDirs == dirs ) + return; + m_iTotalDirs = dirs; + showTotals(); +} + +void DefaultProgress::showTotals() +{ + // Show the totals in the progress label, if we still haven't + // processed anything. This is useful when the stat'ing phase + // of CopyJob takes a long time (e.g. over networks). + if ( m_iProcessedFiles == 0 && m_iProcessedDirs == 0 ) + { + TQString tmps; + if ( m_iTotalDirs > 1 ) + // that we have a singular to translate looks weired but is only logical + // xgettext: no-c-format + tmps = i18n("%n folder", "%n folders", m_iTotalDirs) + " "; + // xgettext: no-c-format + tmps += i18n("%n file", "%n files", m_iTotalFiles); + progressLabel->setText( tmps ); + } +} + +//static +TQString DefaultProgress::makePercentString( unsigned long percent, + TDEIO::filesize_t totalSize, + unsigned long totalFiles ) +{ + if ( totalSize ) + return i18n( "%1 % of %2 " ).arg( TQString::number(percent) , TDEIO::convertSize( totalSize ) ); + else if ( totalFiles ) + return i18n( "%1 % of 1 file", "%1 % of %n files", totalFiles ).arg( percent ); + else + return i18n( "%1 %" ).arg( percent ); +} + +void DefaultProgress::slotPercent( TDEIO::Job*, unsigned long percent ) +{ + TQString caption = makePercentString( percent, m_iTotalSize, m_iTotalFiles ); + m_pProgressBar->setValue( percent ); + switch(mode) { + case Copy: + caption.append(i18n(" (Copying)")); + break; + case Move: + caption.append(i18n(" (Moving)")); + break; + case Delete: + caption.append(i18n(" (Deleting)")); + break; + case Create: + caption.append(i18n(" (Creating)")); + break; + case Done: + caption.append(i18n(" (Done)")); + break; + } + + setCaption( caption ); + d->noCaptionYet = false; +} + + +void DefaultProgress::slotInfoMessage( TDEIO::Job*, const TQString & msg ) +{ + speedLabel->setText( msg ); + speedLabel->setAlignment( speedLabel->alignment() & ~TQt::WordBreak ); +} + + +void DefaultProgress::slotProcessedSize( TDEIO::Job*, TDEIO::filesize_t bytes ) { + if ( m_iProcessedSize == bytes ) + return; + m_iProcessedSize = bytes; + + TQString tmp = i18n( "%1 of %2 complete") + .arg( TDEIO::convertSize(bytes) ) + .arg( TDEIO::convertSize(m_iTotalSize)); + sizeLabel->setText( tmp ); +} + + +void DefaultProgress::slotProcessedDirs( TDEIO::Job*, unsigned long dirs ) +{ + if ( m_iProcessedDirs == dirs ) + return; + m_iProcessedDirs = dirs; + + TQString tmps; + tmps = i18n("%1 / %n folder", "%1 / %n folders", m_iTotalDirs).arg( m_iProcessedDirs ); + tmps += " "; + tmps += i18n("%1 / %n file", "%1 / %n files", m_iTotalFiles).arg( m_iProcessedFiles ); + progressLabel->setText( tmps ); +} + + +void DefaultProgress::slotProcessedFiles( TDEIO::Job*, unsigned long files ) +{ + if ( m_iProcessedFiles == files ) + return; + m_iProcessedFiles = files; + + TQString tmps; + if ( m_iTotalDirs > 1 ) { + tmps = i18n("%1 / %n folder", "%1 / %n folders", m_iTotalDirs).arg( m_iProcessedDirs ); + tmps += " "; + } + tmps += i18n("%1 / %n file", "%1 / %n files", m_iTotalFiles).arg( m_iProcessedFiles ); + progressLabel->setText( tmps ); +} + + +void DefaultProgress::slotSpeed( TDEIO::Job*, unsigned long speed ) +{ + if ( speed == 0 ) { + speedLabel->setText( i18n( "Stalled") ); + } else { + speedLabel->setText( i18n( "%1/s ( %2 remaining )").arg( TDEIO::convertSize( speed )) + .arg( TDEIO::convertSeconds( TDEIO::calculateRemainingSeconds( m_iTotalSize, m_iProcessedSize, speed ))) ); + } +} + + +void DefaultProgress::slotCopying( TDEIO::Job*, const KURL& from, const KURL& to ) +{ + if ( d->noCaptionYet ) { + setCaption(i18n("Copy File(s) Progress")); + d->noCaptionYet = false; + } + mode = Copy; + sourceEdit->setText(from.prettyURL()); + setDestVisible( true ); + checkDestination( to ); + destEdit->setText(to.prettyURL()); +} + + +void DefaultProgress::slotMoving( TDEIO::Job*, const KURL& from, const KURL& to ) +{ + if ( d->noCaptionYet ) { + setCaption(i18n("Move File(s) Progress")); + d->noCaptionYet = false; + } + mode = Move; + sourceEdit->setText(from.prettyURL()); + setDestVisible( true ); + checkDestination( to ); + destEdit->setText(to.prettyURL()); +} + + +void DefaultProgress::slotCreatingDir( TDEIO::Job*, const KURL& dir ) +{ + if ( d->noCaptionYet ) { + setCaption(i18n("Creating Folder")); + d->noCaptionYet = false; + } + mode = Create; + sourceEdit->setText(dir.prettyURL()); + setDestVisible( false ); +} + + +void DefaultProgress::slotDeleting( TDEIO::Job*, const KURL& url ) +{ + if ( d->noCaptionYet ) { + setCaption(i18n("Delete File(s) Progress")); + d->noCaptionYet = false; + } + mode = Delete; + sourceEdit->setText(url.prettyURL()); + setDestVisible( false ); +} + +void DefaultProgress::slotTransferring( TDEIO::Job*, const KURL& url ) +{ + if ( d->noCaptionYet ) { + setCaption(i18n("Loading Progress")); + d->noCaptionYet = false; + } + sourceEdit->setText(url.prettyURL()); + setDestVisible( false ); +} + +void DefaultProgress::slotStating( TDEIO::Job*, const KURL& url ) +{ + setCaption(i18n("Examining File Progress")); + sourceEdit->setText(url.prettyURL()); + setDestVisible( false ); +} + +void DefaultProgress::slotMounting( TDEIO::Job*, const TQString & dev, const TQString & point ) +{ + setCaption(i18n("Mounting %1").arg(dev)); + sourceEdit->setText(point); + setDestVisible( false ); +} + +void DefaultProgress::slotUnmounting( TDEIO::Job*, const TQString & point ) +{ + setCaption(i18n("Unmounting")); + sourceEdit->setText(point); + setDestVisible( false ); +} + +void DefaultProgress::slotCanResume( TDEIO::Job*, TDEIO::filesize_t resume ) +{ + if ( resume ) { + resumeLabel->setText( i18n("Resuming from %1").arg(TDEIO::number(resume)) ); + } else { + resumeLabel->setText( i18n("Not resumable") ); + } +} + +void DefaultProgress::setDestVisible( bool visible ) +{ + // We can't hide the destInvite/destEdit labels, + // because it screws up the TQGridLayout. + if (visible) + { + destInvite->show(); + destEdit->show(); + + destInvite->setText( i18n("Destination:") ); + } + else + { + destInvite->hide(); + destEdit->hide(); + destInvite->setText( TQString::null ); + destEdit->setText( TQString::null ); + } +} + +void DefaultProgress::slotClean() { + if (d->keepOpenChecked) { + mode = Done; + slotPercent(0, 100); + d->cancelClose->setGuiItem( KStdGuiItem::close() ); + d->openFile->setEnabled(true); + slotProcessedSize(0, m_iTotalSize); + d->keepOpen->setEnabled(false); + if (!d->startTime.isNull()) { + int s = d->startTime.elapsed(); + if (!s) + s = 1; + speedLabel->setText(i18n("%1/s (done)").arg(TDEIO::convertSize(1000 * m_iTotalSize / s))); + } + setOnlyClean(false); + } + else + hide(); +} + +void DefaultProgress::slotKeepOpenToggled(bool keepopen) +{ + d->keepOpenChecked=keepopen; +} + +void DefaultProgress::checkDestination(const KURL& dest) { + bool ok = true; + if ( dest.isLocalFile() ) { + TQString path = dest.path( -1 ); + TQStringList tmpDirs = TDEGlobal::dirs()->resourceDirs( "tmp" ); + for ( TQStringList::Iterator it = tmpDirs.begin() ; ok && it != tmpDirs.end() ; ++it ) + if ( path.contains( *it ) ) + ok = false; // it's in the tmp resource + } + + if ( ok ) { + d->openFile->show(); + d->openLocation->show(); + d->keepOpen->show(); + d->location=dest; + } +} + +void DefaultProgress::slotOpenFile() +{ + TDEProcess proc; + proc << "konqueror" << d->location.prettyURL(); + proc.start(TDEProcess::DontCare); +} + +void DefaultProgress::slotOpenLocation() +{ + TDEProcess proc; + d->location.setFileName(""); + proc << "konqueror" << d->location.prettyURL(); + proc.start(TDEProcess::DontCare); +} + +void DefaultProgress::virtual_hook( int id, void* data ) +{ ProgressBase::virtual_hook( id, data ); } + +} /* namespace */ + +#include "defaultprogress.moc" |