You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gwenview/src/gvcore/fileopobject.cpp

348 lines
9.4 KiB

// vim: set tabstop=4 shiftwidth=4 noexpandtab
/*
Gwenview - A simple image viewer for KDE
Copyright 2000-2004 Aur<75>ien G<>eau
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// Qt
#include <qfile.h>
#include <qstylesheet.h>
#include <qwidget.h>
// KDE
#include <kdeversion.h>
#include <kfiledialog.h>
#include <kfilefiltercombo.h>
#include <kglobalsettings.h>
#include <klineedit.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kstandarddirs.h>
#include <kurlcombobox.h>
// Local
#include "deletedialog.h"
#include "fileoperation.h"
#include "fileopobject.moc"
#include "fileoperationconfig.h"
#include "inputdialog.h"
namespace Gwenview {
/**
* A tweaked KFileDialog used to select an existing directory. More efficient
* than KDirSelectDialog, since it provides access to bookmarks and let you
* create a dir.
*/
class DirSelectDialog : public KFileDialog {
public:
DirSelectDialog(const QString& startDir, QWidget* parent)
: KFileDialog(startDir, QString::null, parent, "dirselectdialog", true) {
locationEdit->setEnabled(false);
filterWidget->setEnabled(false);
setMode(KFile::Directory | KFile::ExistingOnly);
// Cast to avoid gcc being confused
setPreviewWidget(static_cast<KPreviewWidgetBase*>(0));
}
};
//-FileOpObject--------------------------------------------------------------------
FileOpObject::FileOpObject(const KURL& url,QWidget* parent)
: mParent(parent)
{
mURLList.append(url);
}
FileOpObject::FileOpObject(const KURL::List& list,QWidget* parent)
: mParent(parent), mURLList(list)
{}
void FileOpObject::slotResult(KIO::Job* job) {
if (job->error()) {
job->showErrorDialog(mParent);
}
emit success();
// Let's shoot ourself in the foot...
delete this;
}
void FileOpObject::polishJob(KIO::Job* job) {
job->setWindow(mParent->topLevelWidget());
connect( job, SIGNAL( result(KIO::Job*) ),
this, SLOT( slotResult(KIO::Job*) ) );
}
//-FileOpCopyToObject--------------------------------------------------------------
void FileOpCopyToObject::operator()() {
KURL destURL;
if (FileOperationConfig::confirmCopy()) {
QString destDir = FileOperationConfig::destDir();
if( !destDir.isEmpty()) {
destDir += "/";
}
if (mURLList.size()==1) {
destURL=KFileDialog::getSaveURL(destDir + mURLList.first().fileName(),
QString::null, mParent, i18n("Copy File"));
} else {
DirSelectDialog dialog(destDir, mParent);
dialog.setCaption(i18n("Select Folder Where Files Will be Copied"));
dialog.exec();
destURL=dialog.selectedURL();
}
} else {
destURL.setPath(FileOperationConfig::destDir());
}
if (destURL.isEmpty()) return;
// Copy the file
KIO::Job* job=KIO::copy(mURLList,destURL,true);
polishJob(job);
}
//-FileOpCopyToObject--------------------------------------------------------------
void FileOpLinkToObject::operator()() {
KURL destURL;
if (FileOperationConfig::confirmCopy()) {
QString destDir = FileOperationConfig::destDir();
if( !destDir.isEmpty()) {
destDir += "/";
}
if (mURLList.size()==1) {
destURL=KFileDialog::getSaveURL(destDir + mURLList.first().fileName(),
QString::null, mParent, i18n("Link File"));
} else {
DirSelectDialog dialog(destDir, mParent);
dialog.setCaption(i18n("Select Folder Where the Files Will be Linked"));
dialog.exec();
destURL=dialog.selectedURL();
}
} else {
destURL.setPath(FileOperationConfig::destDir());
}
if (destURL.isEmpty()) return;
// Copy the file
KIO::Job* job=KIO::link(mURLList,destURL,true);
polishJob(job);
}
//-FileOpMoveToObject--------------------------------------------------------------
void FileOpMoveToObject::operator()() {
KURL destURL;
if (FileOperationConfig::confirmMove()) {
QString destDir = FileOperationConfig::destDir();
if( !destDir.isEmpty()) {
destDir += "/";
}
if (mURLList.size()==1) {
destURL=KFileDialog::getSaveURL(destDir + mURLList.first().fileName(),
QString::null, mParent, i18n("Move File"));
} else {
DirSelectDialog dialog(destDir, mParent);
dialog.setCaption(i18n("Select Folder Where Files Will be Moved"));
dialog.exec();
destURL=dialog.selectedURL();
}
} else {
destURL.setPath(FileOperationConfig::destDir());
}
if (destURL.isEmpty()) return;
// Move the file
KIO::Job* job=KIO::move(mURLList,destURL,true);
polishJob(job);
}
//-FileOpMakeDirObject-------------------------------------------------------------
void FileOpMakeDirObject::operator()() {
InputDialog dlg(mParent);
dlg.setCaption( i18n("Creating Folder") );
dlg.setLabel( i18n("Enter the name of the new folder:") );
dlg.setButtonOK( KGuiItem(i18n("Create Folder"), "folder_new") );
if (!dlg.exec()) return;
QString newDir = dlg.lineEdit()->text();
KURL newURL(mURLList.first());
newURL.addPath(newDir);
KIO::Job* job=KIO::mkdir(newURL);
polishJob(job);
}
static KIO::Job* createTrashJob(KURL::List lst) {
KURL trashURL("trash:/");
// Go do it
if (lst.count()==1) {
// If there's only one file, KIO::move will think we want to overwrite
// the trash dir with the file to trash, so we add the file name
trashURL.addPath(lst.first().fileName());
}
return KIO::move(lst, trashURL);
}
static KIO::Job* createDeleteJob(KURL::List lst) {
return KIO::del(lst, false, true);
}
//-FileOpDelObject-----------------------------------------------------------------
void FileOpDelObject::operator()() {
bool shouldDelete;
if (FileOperationConfig::confirmDelete()) {
DeleteDialog dlg(mParent);
dlg.setURLList(mURLList);
if (!dlg.exec()) return;
shouldDelete = dlg.shouldDelete();
} else {
shouldDelete = not FileOperationConfig::deleteToTrash();
}
KIO::Job* job;
if (shouldDelete) {
job = createDeleteJob(mURLList);
} else {
job = createTrashJob(mURLList);
}
polishJob(job);
}
//-FileOpTrashObject---------------------------------------------------------------
void FileOpTrashObject::operator()() {
// Confirm operation
if (FileOperationConfig::confirmDelete()) {
int response;
if (mURLList.count()>1) {
QStringList fileList;
KURL::List::ConstIterator it=mURLList.begin();
for (; it!=mURLList.end(); ++it) {
fileList.append((*it).filename());
}
response=KMessageBox::warningContinueCancelList(mParent,
i18n("Do you really want to trash these files?"),fileList,i18n("Trash used as a verb", "Trash Files"),KGuiItem(i18n("Trash used as a verb", "&Trash"),"edittrash"));
} else {
QString filename=QStyleSheet::escape(mURLList.first().filename());
response=KMessageBox::warningContinueCancel(mParent,
i18n("<p>Do you really want to move <b>%1</b> to the trash?</p>").arg(filename),i18n("Trash used as a verb", "Trash File"),KGuiItem(i18n("Trash used as a verb", "&Trash"),"edittrash"));
}
if (response!=KMessageBox::Continue) return;
}
KIO::Job* job = createTrashJob(mURLList);
polishJob(job);
}
//-FileOpRealDeleteObject----------------------------------------------------------
void FileOpRealDeleteObject::operator()() {
// Confirm operation
if (FileOperationConfig::confirmDelete()) {
int response;
if (mURLList.count()>1) {
QStringList fileList;
KURL::List::ConstIterator it=mURLList.begin();
for (; it!=mURLList.end(); ++it) {
fileList.append((*it).filename());
}
response=KMessageBox::warningContinueCancelList(mParent,
i18n("Do you really want to delete these files?"),fileList,
i18n("Delete Files"),
KStdGuiItem::del()
);
} else {
QString filename=QStyleSheet::escape(mURLList.first().filename());
response=KMessageBox::warningContinueCancel(mParent,
i18n("<p>Do you really want to delete <b>%1</b>?</p>").arg(filename),
i18n("Delete File"),
KStdGuiItem::del()
);
}
if (response!=KMessageBox::Continue) return;
}
// Delete the file
KIO::Job* job = createDeleteJob(mURLList);
polishJob(job);
}
//-FileOpRenameObject--------------------------------------------------------------
void FileOpRenameObject::operator()() {
KURL srcURL=mURLList.first();
// Prompt for the new filename
QString filename = srcURL.filename();
InputDialog dlg(mParent);
dlg.setCaption(i18n("Renaming File"));
dlg.setLabel(i18n("<p>Rename file <b>%1</b> to:</p>").arg(QStyleSheet::escape(filename)));
dlg.setButtonOK( KGuiItem(i18n("&Rename"), "edit") );
dlg.lineEdit()->setText(filename);
int extPos = filename.findRev('.');
if (extPos != -1) {
if (filename.mid(extPos - 4, 4) == ".tar") {
// Special case: *.tar.*
extPos -= 4;
}
dlg.lineEdit()->setSelection(0, extPos);
}
if (!dlg.exec()) return;
mNewFilename = dlg.lineEdit()->text();
// Rename the file
KURL destURL=srcURL;
destURL.setFileName(mNewFilename);
KIO::Job* job=KIO::move(srcURL,destURL);
polishJob(job);
}
void FileOpRenameObject::slotResult(KIO::Job* job) {
if (job->error()) {
job->showErrorDialog(mParent);
}
emit success();
emit renamed(mNewFilename);
// Let's shoot ourself in the foot...
delete this;
}
} // namespace