summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/defaultprogress.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdeio/defaultprogress.cpp')
-rw-r--r--tdeio/tdeio/defaultprogress.cpp507
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"