~ubuntu-branches/ubuntu/gutsy/kde4libs/gutsy

« back to all changes in this revision

Viewing changes to kio/kio/renamedialog.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2007-02-21 11:00:12 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20070221110012-6kw8khr9knv6lmg1
Tags: 3.80.3-0ubuntu1
New upstream unstable release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* This file is part of the KDE libraries
 
2
    Copyright (C) 2000 Stephan Kulow <coolo@kde.org>
 
3
                       David Faure <faure@kde.org>
 
4
                  2001,2006 Holger Freyther <freyther@kde.org>
 
5
 
 
6
    This library is free software; you can redistribute it and/or
 
7
    modify it under the terms of the GNU Library General Public
 
8
    License as published by the Free Software Foundation; either
 
9
    version 2 of the License, or (at your option) any later version.
 
10
 
 
11
    This library is distributed in the hope that it will be useful,
 
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
14
    Library General Public License for more details.
 
15
 
 
16
    You should have received a copy of the GNU Library General Public License
 
17
    along with this library; see the file COPYING.LIB.  If not, write to
 
18
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 
19
    Boston, MA 02110-1301, USA.
 
20
*/
 
21
 
 
22
#include "kio/renamedialog.h"
 
23
#include "kio/renamedialogplugin.h"
 
24
#include <stdio.h>
 
25
#include <assert.h>
 
26
 
 
27
#include <qdatetime.h>
 
28
#include <qfileinfo.h>
 
29
#include <qlabel.h>
 
30
#include <qlayout.h>
 
31
#include <qlineedit.h>
 
32
#include <qdir.h>
 
33
 
 
34
#include <kmessagebox.h>
 
35
#include <kpushbutton.h>
 
36
#include <kio/global.h>
 
37
#include <kmimetypetrader.h>
 
38
#include <klibloader.h>
 
39
#include <kdialog.h>
 
40
#include <klocale.h>
 
41
#include <kglobal.h>
 
42
#include <kdebug.h>
 
43
#include <kurl.h>
 
44
#include <kmimetype.h>
 
45
#include <kseparator.h>
 
46
#include <kstringhandler.h>
 
47
#include <kstandardguiitem.h>
 
48
#include <kguiitem.h>
 
49
#include <ksqueezedtextlabel.h>
 
50
 
 
51
using namespace KIO;
 
52
 
 
53
/** @internal */
 
54
class RenameDialog::RenameDialogPrivate
 
55
{
 
56
 public:
 
57
  RenameDialogPrivate(){
 
58
    bCancel = 0;
 
59
    bRename = bSkip = bAutoSkip = bOverwrite = bOverwriteAll = 0;
 
60
    bResume = bResumeAll = bSuggestNewName = 0;
 
61
    m_pLineEdit = 0;
 
62
  }
 
63
  KPushButton *bCancel;
 
64
  QPushButton *bRename;
 
65
  QPushButton *bSkip;
 
66
  QPushButton *bAutoSkip;
 
67
  QPushButton *bOverwrite;
 
68
  QPushButton *bOverwriteAll;
 
69
  QPushButton *bResume;
 
70
  QPushButton *bResumeAll;
 
71
  QPushButton *bSuggestNewName;
 
72
  QLineEdit* m_pLineEdit;
 
73
  KUrl src;
 
74
  KUrl dest;
 
75
  QString mimeSrc;
 
76
  QString mimeDest;
 
77
  bool plugin;
 
78
};
 
79
 
 
80
RenameDialog::RenameDialog(QWidget *parent, const QString & _caption,
 
81
                     const KUrl &_src, const KUrl &_dest,
 
82
                     RenameDialog_Mode _mode,
 
83
                     KIO::filesize_t sizeSrc,
 
84
                     KIO::filesize_t sizeDest,
 
85
                     time_t ctimeSrc,
 
86
                     time_t ctimeDest,
 
87
                     time_t mtimeSrc,
 
88
                     time_t mtimeDest)
 
89
  : QDialog ( parent ), d(new RenameDialogPrivate)
 
90
{
 
91
    setObjectName( "KIO::RenameDialog" );
 
92
 
 
93
    d->src = _src;
 
94
    d->dest = _dest;
 
95
    d->plugin = false;
 
96
 
 
97
    setWindowTitle( _caption );
 
98
 
 
99
    d->bCancel = new KPushButton( KStandardGuiItem::cancel(), this );
 
100
    connect(d->bCancel, SIGNAL(clicked()), this, SLOT(cancelPressed()));
 
101
 
 
102
    if ( ! (_mode & M_NORENAME ) ) {
 
103
        d->bRename = new QPushButton( i18n( "&Rename" ), this );
 
104
        d->bRename->setEnabled(false);
 
105
        d->bSuggestNewName = new QPushButton( i18n( "Suggest New &Name" ), this );
 
106
        connect(d->bSuggestNewName, SIGNAL(clicked()), this, SLOT(suggestNewNamePressed()));
 
107
        connect(d->bRename, SIGNAL(clicked()), this, SLOT(renamePressed()));
 
108
    }
 
109
 
 
110
    if ( ( _mode & M_MULTI ) && ( _mode & M_SKIP ) ) {
 
111
        d->bSkip = new QPushButton( i18n( "&Skip" ), this );
 
112
        connect(d->bSkip, SIGNAL(clicked()), this, SLOT(skipPressed()));
 
113
 
 
114
        d->bAutoSkip = new QPushButton( i18n( "&Auto Skip" ), this );
 
115
        connect(d->bAutoSkip, SIGNAL(clicked()), this, SLOT(autoSkipPressed()));
 
116
    }
 
117
 
 
118
    if ( _mode & M_OVERWRITE ) {
 
119
        d->bOverwrite = new QPushButton( i18n( "&Overwrite" ), this );
 
120
        connect(d->bOverwrite, SIGNAL(clicked()), this, SLOT(overwritePressed()));
 
121
 
 
122
        if ( _mode & M_MULTI ) {
 
123
            d->bOverwriteAll = new QPushButton( i18n( "O&verwrite All" ), this );
 
124
            connect(d->bOverwriteAll, SIGNAL(clicked()), this, SLOT(overwriteAllPressed()));
 
125
        }
 
126
    }
 
127
 
 
128
    if ( _mode & M_RESUME ) {
 
129
        d->bResume = new QPushButton( i18n( "&Resume" ), this );
 
130
        connect(d->bResume, SIGNAL(clicked()), this, SLOT(resumePressed()));
 
131
 
 
132
        if ( _mode & M_MULTI )
 
133
        {
 
134
            d->bResumeAll = new QPushButton( i18n( "R&esume All" ), this );
 
135
            connect(d->bResumeAll, SIGNAL(clicked()), this, SLOT(resumeAllPressed()));
 
136
        }
 
137
    }
 
138
 
 
139
    QVBoxLayout* pLayout = new QVBoxLayout( this );
 
140
    pLayout->setMargin( KDialog::marginHint() );
 
141
    pLayout->setSpacing( KDialog::spacingHint() );
 
142
    pLayout->addStrut( 360 );   // makes dlg at least that wide
 
143
 
 
144
    // User tries to overwrite a file with itself ?
 
145
    if ( _mode & M_OVERWRITE_ITSELF ) {
 
146
        QLabel *lb = new QLabel( i18n( "This action would overwrite '%1' with itself.\n"
 
147
                                       "Please enter a new file name:" ,  KStringHandler::csqueeze( d->src.pathOrUrl(),100 ) ), this );
 
148
        d->bRename->setText(i18n("C&ontinue"));
 
149
        pLayout->addWidget( lb );
 
150
    }
 
151
    else if ( _mode & M_OVERWRITE ) {
 
152
 
 
153
        // Figure out the mimetype and load one plugin
 
154
        // (This is the only mode that is handled by plugins)
 
155
        pluginHandling();
 
156
        KService::List plugin_offers;
 
157
        if( d->mimeSrc != KMimeType::defaultMimeType()   ){
 
158
            plugin_offers = KMimeTypeTrader::self()->query(d->mimeSrc, "RenameDialog/Plugin");
 
159
 
 
160
        }else if(d->mimeDest != KMimeType::defaultMimeType() ) {
 
161
            plugin_offers = KMimeTypeTrader::self()->query(d->mimeDest, "RenameDialog/Plugin");
 
162
        }
 
163
        if(!plugin_offers.isEmpty() ){
 
164
            RenameDialogPlugin::FileItem src( _src, d->mimeSrc, sizeSrc, ctimeSrc, mtimeSrc );
 
165
            RenameDialogPlugin::FileItem dst( _dest,d->mimeDest, sizeDest, ctimeDest, mtimeDest );
 
166
            kDebug(7024) << "Offers" << endl;
 
167
            KService::List::ConstIterator it = plugin_offers.begin();
 
168
            const KService::List::ConstIterator end = plugin_offers.end();
 
169
            for( ; it != end; ++it ){
 
170
                RenameDialogPlugin *plugin = KLibLoader::createInstance<RenameDialogPlugin>( (*it)->library().toLocal8Bit(), this );
 
171
                if( !plugin )
 
172
                    continue;
 
173
 
 
174
                plugin->setObjectName( (*it)->name() );
 
175
                if( plugin->wantToHandle( _mode, src, dst ) ) {
 
176
                    d->plugin = true;
 
177
                    plugin->handle( _mode, src, dst );
 
178
                    pLayout->addWidget(plugin );
 
179
                    kDebug(7024) << "RenameDialogPlugin" << endl;
 
180
                    break;
 
181
                } else {
 
182
                    delete plugin;
 
183
                }
 
184
            }
 
185
 
 
186
        }
 
187
 
 
188
        if( !d->plugin ){
 
189
            // No plugin found, build default dialog
 
190
            QGridLayout * gridLayout = new QGridLayout();
 
191
            gridLayout->setMargin( KDialog::marginHint() );
 
192
            gridLayout->setSpacing( KDialog::spacingHint() );
 
193
            pLayout->addLayout(gridLayout);
 
194
            gridLayout->setColumnStretch(0,0);
 
195
            gridLayout->setColumnStretch(1,10);
 
196
 
 
197
            QString sentence1;
 
198
            if (mtimeDest < mtimeSrc)
 
199
                sentence1 = i18n("An older item named '%1' already exists.", d->dest.pathOrUrl());
 
200
            else if (mtimeDest == mtimeSrc)
 
201
                sentence1 = i18n("A similar file named '%1' already exists.", d->dest.pathOrUrl());
 
202
            else
 
203
                sentence1 = i18n("A newer item named '%1' already exists.", d->dest.pathOrUrl());
 
204
 
 
205
            QLabel * lb1 = new KSqueezedTextLabel( sentence1, this );
 
206
            gridLayout->addWidget( lb1, 0, 0, 1, 2 ); // takes the complete first line
 
207
 
 
208
            lb1 = new QLabel( this );
 
209
            lb1->setPixmap( KIO::pixmapForUrl( d->dest ) );
 
210
            gridLayout->addWidget( lb1, 1, 0, 3, 1 ); // takes the first column on rows 1-3
 
211
 
 
212
            int row = 1;
 
213
            if ( sizeDest != (KIO::filesize_t)-1 )
 
214
            {
 
215
                QLabel * lb = new QLabel( i18n("size %1",  KIO::convertSize(sizeDest) ), this );
 
216
                gridLayout->addWidget( lb, row, 1 );
 
217
                row++;
 
218
 
 
219
            }
 
220
            if ( ctimeDest != (time_t)-1 )
 
221
            {
 
222
                QDateTime dctime; dctime.setTime_t( ctimeDest );
 
223
                QLabel * lb = new QLabel( i18n("created on %1",  KGlobal::locale()->formatDateTime(dctime) ), this );
 
224
                gridLayout->addWidget( lb, row, 1 );
 
225
                row++;
 
226
            }
 
227
            if ( mtimeDest != (time_t)-1 )
 
228
            {
 
229
                QDateTime dmtime; dmtime.setTime_t( mtimeDest );
 
230
                QLabel * lb = new QLabel( i18n("modified on %1",  KGlobal::locale()->formatDateTime(dmtime) ), this );
 
231
                gridLayout->addWidget( lb, row, 1 );
 
232
                row++;
 
233
            }
 
234
 
 
235
            if ( !d->src.isEmpty() )
 
236
            {
 
237
                // rows 1 to 3 are the details (size/ctime/mtime), row 4 is empty
 
238
 
 
239
                QLabel * lb2 = new KSqueezedTextLabel( i18n("The source file is '%1'", d->src.pathOrUrl()), this );
 
240
                gridLayout->addWidget( lb2, 5, 0, 1, 2 ); // takes the complete first line
 
241
 
 
242
                lb2 = new QLabel( this );
 
243
                lb2->setPixmap( KIO::pixmapForUrl( d->src ) );
 
244
                gridLayout->addWidget( lb2, 6, 0, 3, 1 ); // takes the first column on rows 6-8
 
245
 
 
246
                row = 6;
 
247
 
 
248
                if ( sizeSrc != (KIO::filesize_t)-1 )
 
249
                {
 
250
                    QLabel * lb = new QLabel( i18n("size %1",  KIO::convertSize(sizeSrc) ), this );
 
251
                    gridLayout->addWidget( lb, row, 1 );
 
252
                    row++;
 
253
                }
 
254
                if ( ctimeSrc != (time_t)-1 )
 
255
                {
 
256
                    QDateTime dctime; dctime.setTime_t( ctimeSrc );
 
257
                    QLabel * lb = new QLabel( i18n("created on %1",  KGlobal::locale()->formatDateTime(dctime) ), this );
 
258
                    gridLayout->addWidget( lb, row, 1 );
 
259
                    row++;
 
260
                }
 
261
                if ( mtimeSrc != (time_t)-1 )
 
262
                {
 
263
                    QDateTime dmtime; dmtime.setTime_t( mtimeSrc );
 
264
                    QLabel * lb = new QLabel( i18n("modified on %1",  KGlobal::locale()->formatDateTime(dmtime) ), this );
 
265
                    gridLayout->addWidget( lb, row, 1 );
 
266
                    row++;
 
267
                }
 
268
            }
 
269
        }
 
270
    }
 
271
    else
 
272
    {
 
273
        // This is the case where we don't want to allow overwriting, the existing
 
274
        // file must be preserved (e.g. when renaming).
 
275
        QString sentence1;
 
276
        if (mtimeDest < mtimeSrc)
 
277
            sentence1 = i18n("An older item named '%1' already exists.", d->dest.pathOrUrl());
 
278
        else if (mtimeDest == mtimeSrc)
 
279
            sentence1 = i18n("A similar file named '%1' already exists.", d->dest.pathOrUrl());
 
280
        else
 
281
            sentence1 = i18n("A newer item named '%1' already exists.", d->dest.pathOrUrl());
 
282
 
 
283
        QLabel *lb = new KSqueezedTextLabel( sentence1, this );
 
284
        pLayout->addWidget(lb);
 
285
    }
 
286
    QHBoxLayout* layout2 = new QHBoxLayout();
 
287
    pLayout->addLayout( layout2 );
 
288
 
 
289
    d->m_pLineEdit = new QLineEdit( this );
 
290
    layout2->addWidget( d->m_pLineEdit );
 
291
    QString fileName = d->dest.fileName();
 
292
    d->m_pLineEdit->setText( KIO::decodeFileName( fileName ) );
 
293
    if ( d->bRename || d->bOverwrite )
 
294
        connect(d->m_pLineEdit, SIGNAL(textChanged(const QString &)),
 
295
                SLOT(enableRenameButton(const QString &)));
 
296
    if ( d->bSuggestNewName )
 
297
    {
 
298
        layout2->addWidget( d->bSuggestNewName );
 
299
        setTabOrder( d->m_pLineEdit, d->bSuggestNewName );
 
300
    }
 
301
 
 
302
    KSeparator* separator = new KSeparator( this );
 
303
    pLayout->addWidget( separator );
 
304
 
 
305
    QHBoxLayout* layout = new QHBoxLayout();
 
306
    pLayout->addLayout( layout );
 
307
 
 
308
    layout->addStretch(1);
 
309
 
 
310
    if ( d->bRename )
 
311
    {
 
312
        layout->addWidget( d->bRename );
 
313
        setTabOrder( d->bRename, d->bCancel );
 
314
    }
 
315
    if ( d->bSkip )
 
316
    {
 
317
        layout->addWidget( d->bSkip );
 
318
        setTabOrder( d->bSkip, d->bCancel );
 
319
    }
 
320
    if ( d->bAutoSkip )
 
321
    {
 
322
        layout->addWidget( d->bAutoSkip );
 
323
        setTabOrder( d->bAutoSkip, d->bCancel );
 
324
    }
 
325
    if ( d->bOverwrite )
 
326
    {
 
327
        layout->addWidget( d->bOverwrite );
 
328
        setTabOrder( d->bOverwrite, d->bCancel );
 
329
    }
 
330
    if ( d->bOverwriteAll )
 
331
    {
 
332
        layout->addWidget( d->bOverwriteAll );
 
333
        setTabOrder( d->bOverwriteAll, d->bCancel );
 
334
    }
 
335
    if ( d->bResume )
 
336
    {
 
337
        layout->addWidget( d->bResume );
 
338
        setTabOrder( d->bResume, d->bCancel );
 
339
    }
 
340
    if ( d->bResumeAll )
 
341
    {
 
342
        layout->addWidget( d->bResumeAll );
 
343
        setTabOrder( d->bResumeAll, d->bCancel );
 
344
    }
 
345
 
 
346
    d->bCancel->setDefault( true );
 
347
    layout->addWidget( d->bCancel );
 
348
 
 
349
    resize( sizeHint() );
 
350
}
 
351
 
 
352
RenameDialog::~RenameDialog()
 
353
{
 
354
  delete d;
 
355
  // no need to delete Pushbuttons,... qt will do this
 
356
}
 
357
 
 
358
void RenameDialog::enableRenameButton(const QString &newDest)
 
359
{
 
360
  if ( newDest != KIO::decodeFileName( d->dest.fileName() ) && !newDest.isEmpty() )
 
361
  {
 
362
    d->bRename->setEnabled( true );
 
363
    d->bRename->setDefault( true );
 
364
    if ( d->bOverwrite )
 
365
        d->bOverwrite->setEnabled( false ); // prevent confusion (#83114)
 
366
  }
 
367
  else
 
368
  {
 
369
    d->bRename->setEnabled( false );
 
370
    if ( d->bOverwrite )
 
371
        d->bOverwrite->setEnabled( true );
 
372
  }
 
373
}
 
374
 
 
375
KUrl RenameDialog::newDestUrl()
 
376
{
 
377
  KUrl newDest( d->dest );
 
378
  QString fileName = d->m_pLineEdit->text();
 
379
  newDest.setFileName( KIO::encodeFileName( fileName ) );
 
380
  return newDest;
 
381
}
 
382
 
 
383
void RenameDialog::cancelPressed()
 
384
{
 
385
  done( 0 );
 
386
}
 
387
 
 
388
// Rename
 
389
void RenameDialog::renamePressed()
 
390
{
 
391
  if ( d->m_pLineEdit->text().isEmpty() )
 
392
    return;
 
393
 
 
394
  KUrl u = newDestUrl();
 
395
  if ( !u.isValid() )
 
396
  {
 
397
    KMessageBox::error( this, i18n( "Malformed URL\n%1" ,  u.url() ) );
 
398
    return;
 
399
  }
 
400
 
 
401
  done( 1 );
 
402
}
 
403
 
 
404
QString RenameDialog::suggestName(const KUrl& baseURL, const QString& oldName)
 
405
{
 
406
  QString dotSuffix, suggestedName;
 
407
  QString basename = oldName;
 
408
 
 
409
  int index = basename.indexOf( '.' );
 
410
  if ( index != -1 ) {
 
411
    dotSuffix = basename.mid( index );
 
412
    basename.truncate( index );
 
413
  }
 
414
 
 
415
  int pos = basename.lastIndexOf( '_' );
 
416
  if(pos != -1 ){
 
417
    QString tmp = basename.mid( pos+1 );
 
418
    bool ok;
 
419
    int number = tmp.toInt( &ok );
 
420
    if ( !ok ) {// ok there is no number
 
421
      suggestedName = basename + '1' + dotSuffix;
 
422
    }
 
423
    else {
 
424
     // yes there's already a number behind the _ so increment it by one
 
425
      basename.replace( pos+1, tmp.length(), QString::number(number+1) );
 
426
      suggestedName = basename + dotSuffix;
 
427
    }
 
428
  }
 
429
  else // no underscore yet
 
430
    suggestedName = basename + "_1" + dotSuffix ;
 
431
 
 
432
  // Check if suggested name already exists
 
433
  bool exists = false;
 
434
  // TODO: network transparency. However, using NetAccess from a modal dialog
 
435
  // could be a problem, no? (given that it uses a modal widget itself....)
 
436
  if ( baseURL.isLocalFile() )
 
437
    exists = QFileInfo( baseURL.path(KUrl::AddTrailingSlash) + suggestedName ).exists();
 
438
 
 
439
  if ( !exists )
 
440
    return suggestedName;
 
441
  else // already exists -> recurse
 
442
    return suggestName( baseURL, suggestedName );
 
443
}
 
444
 
 
445
// Propose button clicked
 
446
void RenameDialog::suggestNewNamePressed()
 
447
{
 
448
  /* no name to play with */
 
449
  if ( d->m_pLineEdit->text().isEmpty() )
 
450
    return;
 
451
 
 
452
  KUrl destDirectory( d->dest );
 
453
  destDirectory.setPath( destDirectory.directory() );
 
454
  d->m_pLineEdit->setText( suggestName( destDirectory, d->m_pLineEdit->text() ) );
 
455
  return;
 
456
}
 
457
 
 
458
void RenameDialog::skipPressed()
 
459
{
 
460
  done( 2 );
 
461
}
 
462
 
 
463
void RenameDialog::autoSkipPressed()
 
464
{
 
465
  done( 3 );
 
466
}
 
467
 
 
468
void RenameDialog::overwritePressed()
 
469
{
 
470
  done( 4 );
 
471
}
 
472
 
 
473
void RenameDialog::overwriteAllPressed()
 
474
{
 
475
  done( 5 );
 
476
}
 
477
 
 
478
void RenameDialog::resumePressed()
 
479
{
 
480
  done( 6 );
 
481
}
 
482
 
 
483
void RenameDialog::resumeAllPressed()
 
484
{
 
485
  done( 7 );
 
486
}
 
487
 
 
488
static QString mime( const KUrl& src )
 
489
{
 
490
  KMimeType::Ptr type = KMimeType::findByUrl( src );
 
491
  //if( type->name() == KMimeType::defaultMimeType() ){ // ok no mimetype
 
492
    //    QString ty = KIO::NetAccess::mimetype(d->src );
 
493
    // return ty;
 
494
    return type->name();
 
495
}
 
496
 
 
497
/** This will figure out the mimetypes and query for a plugin
 
498
 *  Loads it then and asks the plugin if it wants to do the job
 
499
 *  We'll take the first available mimetype
 
500
 *  The scanning for a mimetype will be done in 2 ways
 
501
 *
 
502
 */
 
503
void RenameDialog::pluginHandling()
 
504
{
 
505
  d->mimeSrc = mime( d->src );
 
506
  d->mimeDest = mime(d->dest );
 
507
 
 
508
  kDebug(7024) << "Source Mimetype: "<< d->mimeSrc << endl;
 
509
  kDebug(7024) << "Dest Mimetype: "<< d->mimeDest << endl;
 
510
}
 
511
 
 
512
 
 
513
RenameDialog_Result KIO::open_RenameDialog( const QString & _caption,
 
514
                                      const KUrl & _src, const KUrl & _dest,
 
515
                                      RenameDialog_Mode _mode,
 
516
                                      QString& _new,
 
517
                                      KIO::filesize_t sizeSrc,
 
518
                                      KIO::filesize_t sizeDest,
 
519
                                      time_t ctimeSrc,
 
520
                                      time_t ctimeDest,
 
521
                                      time_t mtimeSrc,
 
522
                                      time_t mtimeDest)
 
523
{
 
524
  RenameDialog dlg( 0, _caption, _src, _dest, _mode,
 
525
                 sizeSrc, sizeDest, ctimeSrc, ctimeDest, mtimeSrc, mtimeDest );
 
526
  int i = dlg.exec();
 
527
  _new = dlg.newDestUrl().path();
 
528
 
 
529
  return (RenameDialog_Result)i;
 
530
}
 
531
 
 
532
#include "renamedialog.moc"