| # kio Library API Documentation
Overview | Class Hierarchy | Classes | Classes (annotated) | Members | Source Files

# renamedlg.cpp

    00001 /* This file is part of the KDE libraries
    00002     Copyright (C) 2000 Stephan Kulow <coolo@kde.org>
    00003                        David Faure <faure@kde.org>
    00004                   2001 Holger Freyther <freyther@kde.org>
    00005
    00006     This library is free software; you can redistribute it and/or
    00007     modify it under the terms of the GNU Library General Public
    00008     License as published by the Free Software Foundation; either
    00009     version 2 of the License, or (at your option) any later version.
    00010
    00011     This library is distributed in the hope that it will be useful,
    00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00014     Library General Public License for more details.
    00015
    00016     You should have received a copy of the GNU Library General Public License
    00017     along with this library; see the file COPYING.LIB.  If not, write to
    00018     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    00019     Boston, MA 02111-1307, USA.
    00020 */
    00021
    00022 #include "kio/renamedlg.h"
    00023 #include "kio/renamedlgplugin.h"
    00024 #include <stdio.h>
    00025 #include <assert.h>
    00026
    00027 #include <qfileinfo.h>
    00028 #include <qlabel.h>
    00029 #include <qlayout.h>
    00030 #include <qlineedit.h>
    00031
    00032 #include <kmessagebox.h>
    00033 #include <kpushbutton.h>
    00034 #include <kapplication.h>
    00035 #include <kio/global.h>
    00036 #include <ktrader.h>
    00037 #include <klibloader.h>
    00038 #include <kdialog.h>
    00039 #include <klocale.h>
    00040 #include <kglobal.h>
    00041 #include <kdebug.h>
    00042 #include <kurl.h>
    00043 #include <kmimetype.h>
    00044 #include <kwin.h>
    00045 #include <kstringhandler.h>
    00046 #include <kstdguiitem.h>
    00047 #include <kguiitem.h>
    00048
    00049 using namespace KIO;
    00050
    00051 class RenameDlg::RenameDlgPrivate
    00052 {
    00053  public:
    00054   RenameDlgPrivate(){
    00055     b0 = 0L;
    00056     b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = 0L;
    00057     m_pLineEdit=0L;
    00058     m_pLayout=0L;
    00059   }
    00060   KPushButton *b0;
    00061   QPushButton *b1;
    00062   QPushButton *b2;
    00063   QPushButton *b3;
    00064   QPushButton *b4;
    00065   QPushButton *b5;
    00066   QPushButton *b6;
    00067   QPushButton *b7;
    00068   QPushButton *b8; //why isn't it an array
    00069   QLineEdit* m_pLineEdit;
    00070   QVBoxLayout* m_pLayout; // ### doesn't need to be here
    00071   QString src;
    00072   QString dest;
    00073   QString mimeSrc;
    00074   QString mimeDest;
    00075   bool modal;
    00076   bool plugin;
    00077 };
    00078
    00079 RenameDlg::RenameDlg(QWidget *parent, const QString & _caption,
    00080                      const QString &_src, const QString &_dest,
    00081                      RenameDlg_Mode _mode,
    00082                      KIO::filesize_t sizeSrc,
    00083                      KIO::filesize_t sizeDest,
    00084                      time_t ctimeSrc,
    00085                      time_t ctimeDest,
    00086                      time_t mtimeSrc,
    00087                      time_t mtimeDest,
    00088                      bool _modal)
    00089   : QDialog ( parent, "KIO::RenameDialog" , _modal )
    00090 {
    00091     d = new RenameDlgPrivate( );
    00092     d->modal = _modal;
    00093     // Set "StaysOnTop", because this dialog is typically used in kio_uiserver,
    00094     // i.e. in a separate process.
    00095     // ####### This isn't the case anymore - remove?
    00096 #ifndef Q_WS_QWS //FIXME(E): Implement for QT Embedded
    00097     if (d->modal)
    00098         KWin::setState( winId(), NET::StaysOnTop );
    00099 #endif
    00100
    00101     d->src = _src;
    00102     d->dest = _dest;
    00103     d->plugin = false;
    00104
    00105
    00106     setCaption( _caption );
    00107
    00108     d->b0 = new KPushButton( KStdGuiItem::cancel(), this );
    00109     connect(d->b0, SIGNAL(clicked()), this, SLOT(b0Pressed()));
    00110
    00111     if ( ! (_mode & M_NORENAME ) ) {
    00112         d->b1 = new QPushButton( i18n( "&Rename" ), this );
    00113         d->b1->setEnabled(false);
    00114         d->b8 = new QPushButton( i18n( "&Propose" ), this );
    00115         connect(d->b8, SIGNAL(clicked()), this, SLOT(b8Pressed()));
    00116         connect(d->b1, SIGNAL(clicked()), this, SLOT(b1Pressed()));
    00117     }
    00118
    00119     if ( ( _mode & M_MULTI ) && ( _mode & M_SKIP ) ) {
    00120         d->b2 = new QPushButton( i18n( "&Skip" ), this );
    00121         connect(d->b2, SIGNAL(clicked()), this, SLOT(b2Pressed()));
    00122
    00123         d->b3 = new QPushButton( i18n( "&Auto Skip" ), this );
    00124         connect(d->b3, SIGNAL(clicked()), this, SLOT(b3Pressed()));
    00125     }
    00126
    00127     if ( _mode & M_OVERWRITE ) {
    00128         d->b4 = new QPushButton( i18n( "&Overwrite" ), this );
    00129         connect(d->b4, SIGNAL(clicked()), this, SLOT(b4Pressed()));
    00130
    00131         if ( _mode & M_MULTI ) {
    00132             d->b5 = new QPushButton( i18n( "O&verwrite All" ), this );
    00133             connect(d->b5, SIGNAL(clicked()), this, SLOT(b5Pressed()));
    00134         }
    00135     }
    00136
    00137     if ( _mode & M_RESUME ) {
    00138         d->b6 = new QPushButton( i18n( "&Resume" ), this );
    00139         connect(d->b6, SIGNAL(clicked()), this, SLOT(b6Pressed()));
    00140
    00141         if ( _mode & M_MULTI )
    00142         {
    00143             d->b7 = new QPushButton( i18n( "R&esume All" ), this );
    00144             connect(d->b7, SIGNAL(clicked()), this, SLOT(b7Pressed()));
    00145         }
    00146     }
    00147
    00148     d->m_pLayout = new QVBoxLayout( this, KDialog::marginHint(),
    00149                                     KDialog::spacingHint() );
    00150     d->m_pLayout->addStrut( 360 );      // makes dlg at least that wide
    00151
    00152     // User tries to overwrite a file with itself ?
    00153     if ( _mode & M_OVERWRITE_ITSELF ) {
    00154         QLabel *lb = new QLabel( i18n( "This action would overwrite '%1' with itself.\n"
    00155                                        "Do you want to rename it instead?" ).arg( KStringHandler::csqueeze( d->src,100 ) ), this );
    00156         d->m_pLayout->addWidget( lb );
    00157     }
    00158     else if ( _mode & M_OVERWRITE ) {
    00159
    00160         // Figure out the mimetype and load one plugin
    00161         // (This is the only mode that is handled by plugins)
    00162         pluginHandling();
    00163         KTrader::OfferList plugin_offers;
    00164         if( d->mimeSrc != KMimeType::defaultMimeType()   ){
    00165             plugin_offers = KTrader::self()->query(d->mimeSrc, "'RenameDlg/Plugin' in ServiceTypes");
    00166
    00167         }else if(d->mimeDest != KMimeType::defaultMimeType() ) {
    00168             plugin_offers = KTrader::self()->query(d->mimeDest, "'RenameDlg/Plugin' in ServiceTypes");
    00169         }
    00170         if(!plugin_offers.isEmpty() ){
    00171             kdDebug(7024) << "Offers" << endl;
    00172             KTrader::OfferList::ConstIterator it = plugin_offers.begin();
    00173             KTrader::OfferList::ConstIterator end = plugin_offers.end();
    00174             for( ; it != end; ++it ){
    00175                 QString libName = (*it)->library();
    00176                 if( libName.isEmpty() ){
    00177                     kdDebug(7024) << "lib is empty" << endl;
    00178                     continue;
    00179                 }
    00180                 KLibrary *lib = KLibLoader::self()->library(libName.local8Bit() );
    00181                 if(!lib) {
    00182                     continue;
    00183                 }
    00184                 KLibFactory *factory = lib->factory();
    00185                 if(!factory){
    00186                     lib->unload();
    00187                     continue;
    00188                 }
    00189                 QObject *obj = factory->create( this, (*it)->name().latin1() );
    00190                 if(!obj) {
    00191                     lib->unload();
    00192                     continue;
    00193                 }
    00194                 RenameDlgPlugin *plugin = static_cast<RenameDlgPlugin *>(obj);
    00195                 if(!plugin ){
    00196                     delete obj;
    00197                     continue;
    00198                 }
    00199                 if( plugin->initialize( _mode, _src, _dest, d->mimeSrc,
    00200                                         d->mimeDest, sizeSrc, sizeDest,
    00201                                         ctimeSrc, ctimeDest,
    00202                                         mtimeSrc, mtimeDest ) ) {
    00203                     d->plugin = true;
    00204                     d->m_pLayout->addWidget(plugin );
    00205                     kdDebug(7024) << "RenameDlgPlugin" << endl;
    00206                     break;
    00207                 } else {
    00208                     delete obj;
    00209                 }
    00210             }
    00211
    00212         }
    00213
    00214         if( !d->plugin ){
    00215             // No plugin found, build default dialog
    00216             QGridLayout * gridLayout = new QGridLayout( 0L, 9, 2, KDialog::marginHint(),
    00217                                                         KDialog::spacingHint() );
    00218             d->m_pLayout->addLayout(gridLayout);
    00219             gridLayout->setColStretch(0,0);
    00220             gridLayout->setColStretch(1,10);
    00221
    00222             QString sentence1;
    00223             if (mtimeDest < mtimeSrc)
    00224                 sentence1 = i18n("An older item named '%1' already exists.");
    00225             else if (mtimeDest == mtimeSrc)
    00226                 sentence1 = i18n("A similar file named '%1' already exists.");
    00227             else
    00228                 sentence1 = i18n("A newer item named '%1' already exists.");
    00229             QLabel * lb1 = new QLabel( sentence1.arg(KStringHandler::csqueeze(d->dest,100)), this );
    00230             gridLayout->addMultiCellWidget( lb1, 0, 0, 0, 1 ); // takes the complete first line
    00231
    00232             lb1 = new QLabel( this );
    00233             lb1->setPixmap( KMimeType::pixmapForURL( d->dest ) );
    00234             gridLayout->addMultiCellWidget( lb1, 1, 3, 0, 0 ); // takes the first column on rows 1-3
    00235
    00236             int row = 1;
    00237             if ( sizeDest != (KIO::filesize_t)-1 )
    00238             {
    00239                 QLabel * lb = new QLabel( i18n("size %1").arg( KIO::convertSize(sizeDest) ), this );
    00240                 gridLayout->addWidget( lb, row, 1 );
    00241                 row++;
    00242
    00243             }
    00244             if ( ctimeDest != (time_t)-1 )
    00245             {
    00246                 QDateTime dctime; dctime.setTime_t( ctimeDest );
    00247                 QLabel * lb = new QLabel( i18n("created on %1").arg( KGlobal::locale()->formatDateTime(dctime) ), this );
    00248                 gridLayout->addWidget( lb, row, 1 );
    00249                 row++;
    00250             }
    00251             if ( mtimeDest != (time_t)-1 )
    00252             {
    00253                 QDateTime dmtime; dmtime.setTime_t( mtimeDest );
    00254                 QLabel * lb = new QLabel( i18n("modified on %1").arg( KGlobal::locale()->formatDateTime(dmtime) ), this );
    00255                 gridLayout->addWidget( lb, row, 1 );
    00256                 row++;
    00257             }
    00258
    00259             if ( !d->src.isEmpty() )
    00260             {
    00261                 // rows 1 to 3 are the details (size/ctime/mtime), row 4 is empty
    00262                 gridLayout->addRowSpacing( 4, 20 );
    00263
    00264                 QLabel * lb2 = new QLabel( i18n("The source file is '%1'").arg(d->src), this );
    00265                 gridLayout->addMultiCellWidget( lb2, 5, 5, 0, 1 ); // takes the complete first line
    00266
    00267                 lb2 = new QLabel( this );
    00268                 lb2->setPixmap( KMimeType::pixmapForURL( d->src ) );
    00269                 gridLayout->addMultiCellWidget( lb2, 6, 8, 0, 0 ); // takes the first column on rows 6-8
    00270
    00271                 row = 6;
    00272
    00273                 if ( sizeSrc != (KIO::filesize_t)-1 )
    00274                 {
    00275                     QLabel * lb = new QLabel( i18n("size %1").arg( KIO::convertSize(sizeSrc) ), this );
    00276                     gridLayout->addWidget( lb, row, 1 );
    00277                     row++;
    00278                 }
    00279                 if ( ctimeSrc != (time_t)-1 )
    00280                 {
    00281                     QDateTime dctime; dctime.setTime_t( ctimeSrc );
    00282                     QLabel * lb = new QLabel( i18n("created on %1").arg( KGlobal::locale()->formatDateTime(dctime) ), this );
    00283                     gridLayout->addWidget( lb, row, 1 );
    00284                     row++;
    00285                 }
    00286                 if ( mtimeSrc != (time_t)-1 )
    00287                 {
    00288                     QDateTime dmtime; dmtime.setTime_t( mtimeSrc );
    00289                     QLabel * lb = new QLabel( i18n("modified on %1").arg( KGlobal::locale()->formatDateTime(dmtime) ), this );
    00290                     gridLayout->addWidget( lb, row, 1 );
    00291                     row++;
    00292                 }
    00293             }
    00294         }
    00295     }
    00296     else
    00297     {
    00298         // I wonder when this happens. And 'dest' isn't shown at all here...
    00299         // Sounds like the case where we don't want to allow overwriting, the existing
    00300         // file must be preserved. This doesn't happen in KIO though. (David)
    00301         QString sentence1;
    00302         if (mtimeDest < mtimeSrc)
    00303             sentence1 = i18n("An older item than '%1' already exists.\n").arg(d->src);
    00304         else if (mtimeDest == mtimeSrc)
    00305             sentence1 = i18n("A similar file named '%1' already exists.").arg(d->src);
    00306         else
    00307             sentence1 = i18n("A newer item than '%1' already exists.\n").arg(d->src);
    00308
    00309         QLabel *lb = new QLabel( sentence1 + i18n("Do you want to use another file name?"), this );
    00310         d->m_pLayout->addWidget(lb);
    00311     }
    00312     d->m_pLineEdit = new QLineEdit( this );
    00313     d->m_pLayout->addWidget( d->m_pLineEdit );
    00314     QString fileName = KURL(d->dest).fileName();
    00315     d->m_pLineEdit->setText( KIO::decodeFileName( fileName ) );
    00316     if (d->b1)
    00317         connect(d->m_pLineEdit, SIGNAL(textChanged(const QString &)),
    00318                 SLOT(enableRenameButton(const QString &)));
    00319
    00320     d->m_pLayout->addSpacing( 10 );
    00321
    00322     QHBoxLayout* layout = new QHBoxLayout();
    00323     d->m_pLayout->addLayout( layout );
    00324
    00325     layout->addStretch(1);
    00326
    00327     if ( d->b1 )
    00328         layout->addWidget( d->b1 );
    00329     if( d->b8 )
    00330         layout->addWidget( d->b8 );
    00331     if ( d->b2 )
    00332         layout->addWidget( d->b2 );
    00333     if ( d->b3 )
    00334         layout->addWidget( d->b3 );
    00335     if ( d->b4 )
    00336         layout->addWidget( d->b4 );
    00337     if ( d->b5 )
    00338         layout->addWidget( d->b5 );
    00339     if ( d->b6 )
    00340         layout->addWidget( d->b6 );
    00341     if ( d->b7 )
    00342         layout->addWidget( d->b7 );
    00343
    00344
    00345     d->b0->setDefault( true );
    00346     layout->addWidget( d->b0 );
    00347
    00348     resize( sizeHint() );
    00349 }
    00350
    00351 RenameDlg::~RenameDlg()
    00352 {
    00353   delete d;
    00354   // no need to delete Pushbuttons,... qt will do this
    00355 }
    00356
    00357 void RenameDlg::enableRenameButton(const QString &newDest)
    00358 {
    00359   if (newDest != d->dest)
    00360   {
    00361     d->b1->setEnabled(true);
    00362     d->b1->setDefault(true);
    00363   }
    00364   else
    00365     d->b1->setEnabled(false);
    00366 }
    00367
    00368 KURL RenameDlg::newDestURL()
    00369 {
    00370   KURL newDest( d->dest );
    00371   QString fileName = d->m_pLineEdit->text();
    00372   newDest.setFileName( KIO::encodeFileName( fileName ) );
    00373   return newDest;
    00374 }
    00375
    00376 void RenameDlg::b0Pressed()
    00377 {
    00378   done( 0 );
    00379 }
    00380
    00381 // Rename
    00382 void RenameDlg::b1Pressed()
    00383 {
    00384   if ( d->m_pLineEdit->text()  == "" )
    00385     return;
    00386
    00387   KURL u = newDestURL();
    00388   if ( u.isMalformed() )
    00389   {
    00390     KMessageBox::error( this, i18n( "Malformed URL\n%1" ).arg( u.prettyURL() ) );
    00391     return;
    00392   }
    00393
    00394   done( 1 );
    00395 }
    00396 // Propose button clicked
    00397 void RenameDlg::b8Pressed()
    00398 {
    00399   int pos;
    00400
    00401   /* no name to play with */
    00402   if ( d->m_pLineEdit->text().isEmpty() )
    00403     return;
    00404
    00405   QString basename, dotSuffix, tmp;
    00406   QFileInfo info ( d->m_pLineEdit->text() );
    00407   basename = info.baseName();
    00408   dotSuffix = info.extension();
    00409
    00410   if ( !dotSuffix.isEmpty() )
    00411     dotSuffix = '.' + dotSuffix;
    00412
    00413   pos = basename.findRev('_' );
    00414   if(pos != -1 ){
    00415     bool ok;
    00416     tmp = basename.right( basename.length() - (pos + 1) );
    00417     int number = tmp.toInt( &ok, 10 );
    00418     if ( !ok ) {// ok there is no number
    00419       basename.append("_1" );
    00420       d->m_pLineEdit->setText(basename + dotSuffix );
    00421       return;
    00422     }
    00423     else {
    00424      // yes there's allready a number behind the _ so increment it by one
    00425       QString tmp2 = QString::number ( number + 1 );
    00426       basename.replace( pos+1, tmp.length() ,tmp2);
    00427       d->m_pLineEdit->setText( basename + dotSuffix );
    00428       return;
    00429     }
    00430   }
    00431   else // no underscore yet
    00432   {
    00433     d->m_pLineEdit->setText( basename + "_1" + dotSuffix );
    00434     return;
    00435
    00436   }
    00437   return; // we should never return from here jic
    00438 }
    00439
    00440 void RenameDlg::b2Pressed()
    00441 {
    00442   done( 2 );
    00443 }
    00444
    00445 void RenameDlg::b3Pressed()
    00446 {
    00447   done( 3 );
    00448 }
    00449
    00450 void RenameDlg::b4Pressed()
    00451 {
    00452   done( 4 );
    00453 }
    00454
    00455 void RenameDlg::b5Pressed()
    00456 {
    00457   done( 5 );
    00458 }
    00459
    00460 void RenameDlg::b6Pressed()
    00461 {
    00462   done( 6 );
    00463 }
    00464
    00465 void RenameDlg::b7Pressed()
    00466 {
    00467   done( 7 );
    00468 }
    00475 void RenameDlg::pluginHandling()
    00476 {
    00477   d->mimeSrc = mime( d->src );
    00478   d->mimeDest = mime(d->dest );
    00479
    00480   kdDebug(7024) << "Source Mimetype: "<< d->mimeSrc << endl;
    00481   kdDebug(7024) << "Dest Mimetype: "<< d->mimeDest << endl;
    00482 }
    00483 QString RenameDlg::mime( const QString &src )
    00484 {
    00485   KMimeType::Ptr type = KMimeType::findByURL(src );
    00486   //if( type->name() == KMimeType::defaultMimeType() ){ // ok no mimetype
    00487     //    QString ty = KIO::NetAccess::mimetype(d->src );
    00488     // return ty;
    00489     return type->name();
    00490 }
    00491
    00492
    00493 RenameDlg_Result KIO::open_RenameDlg( const QString & _caption,
    00494                                       const QString & _src, const QString & _dest,
    00495                                       RenameDlg_Mode _mode,
    00496                                       QString& _new,
    00497                                       KIO::filesize_t sizeSrc,
    00498                                       KIO::filesize_t sizeDest,
    00499                                       time_t ctimeSrc,
    00500                                       time_t ctimeDest,
    00501                                       time_t mtimeSrc,
    00502                                       time_t mtimeDest)
    00503 {
    00504   Q_ASSERT(kapp);
    00505
    00506   RenameDlg dlg( 0L, _caption, _src, _dest, _mode,
    00507                  sizeSrc, sizeDest, ctimeSrc, ctimeDest, mtimeSrc, mtimeDest,
    00508                  true /*modal*/ );
    00509   int i = dlg.exec();
    00510   _new = dlg.newDestURL().path();
    00511
    00512   return (RenameDlg_Result)i;
    00513 }
    00514
    00515 #include "renamedlg.moc"
    00516
    00517
    00518
    00519
    00520

This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Wed Jan 28 13:14:37 2004 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001