~ubuntu-branches/ubuntu/precise/gwenview/precise-proposed

« back to all changes in this revision

Viewing changes to app/fileoperations.cpp

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2011-12-15 14:17:54 UTC
  • mto: This revision was merged to the branch mainline in revision 12.
  • Revision ID: package-import@ubuntu.com-20111215141754-z043hyx69dulbggf
Tags: upstream-4.7.90
ImportĀ upstreamĀ versionĀ 4.7.90

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// vim: set tabstop=4 shiftwidth=4 noexpandtab:
 
1
// vim: set tabstop=4 shiftwidth=4 expandtab:
2
2
/*
3
3
Gwenview: an image viewer
4
4
Copyright 2007 AurĆ©lien GĆ¢teau <agateau@kde.org>
40
40
#include <lib/document/documentfactory.h>
41
41
#include <lib/thumbnailloadjob.h>
42
42
 
43
 
namespace Gwenview {
44
 
 
45
 
namespace FileOperations {
46
 
 
47
 
static void copyMoveOrLink(KonqOperations::Operation operation, const KUrl::List& urlList, QWidget* parent) {
48
 
        Q_ASSERT(urlList.count() > 0);
49
 
 
50
 
        KFileDialog dialog(
51
 
                KUrl("kfiledialog:///<copyMoveOrLink>"),
52
 
                QString() /* filter */,
53
 
                parent);
54
 
        dialog.setOperationMode(KFileDialog::Saving);
55
 
        switch (operation) {
56
 
        case KonqOperations::COPY:
57
 
                dialog.setCaption(i18nc("@title:window", "Copy To"));
58
 
                dialog.okButton()->setText(i18nc("@action:button", "Copy"));
59
 
                break;
60
 
        case KonqOperations::MOVE:
61
 
                dialog.setCaption(i18nc("@title:window", "Move To"));
62
 
                dialog.okButton()->setText(i18nc("@action:button", "Move"));
63
 
                break;
64
 
        case KonqOperations::LINK:
65
 
                dialog.setCaption(i18nc("@title:window", "Link To"));
66
 
                dialog.okButton()->setText(i18nc("@action:button", "Link"));
67
 
                break;
68
 
        default:
69
 
                Q_ASSERT(0);
70
 
        }
71
 
        if (urlList.count() == 1) {
72
 
                dialog.setMode(KFile::File);
73
 
                dialog.setSelection(urlList[0].fileName());
74
 
        } else {
75
 
                dialog.setMode(KFile::ExistingOnly | KFile::Directory);
76
 
        }
77
 
        if (!dialog.exec()) {
78
 
                return;
79
 
        }
80
 
 
81
 
        KUrl destUrl = dialog.selectedUrl();
82
 
        KonqOperations::copy(parent, operation, urlList, destUrl);
83
 
}
84
 
 
85
 
 
86
 
static void delOrTrash(KonqOperations::Operation operation, const KUrl::List& urlList, QWidget* parent) {
87
 
        Q_ASSERT(urlList.count() > 0);
88
 
 
89
 
        if (!KonqOperations::askDeleteConfirmation(urlList, operation, KonqOperations::DEFAULT_CONFIRMATION, parent)) {
90
 
                return;
91
 
        }
92
 
 
93
 
        KIO::Job* job = 0;
94
 
        // KonqOperations::delOrTrash() handles the confirmation and does not provide
95
 
        // a way to know if the deletion has been accepted.
96
 
        // We need to know about the confirmation so that DocumentFactory can forget
97
 
        // about the deleted urls. That's why we can't use KonqOperations::delOrTrash()
98
 
        switch (operation) {
99
 
        case KonqOperations::TRASH:
100
 
                job = KIO::trash(urlList);
101
 
                break;
102
 
 
103
 
        case KonqOperations::DEL:
104
 
                job = KIO::del(urlList);
105
 
                break;
106
 
 
107
 
        default:
108
 
                kWarning() << "Unknown operation" << operation;
109
 
                return;
110
 
        }
111
 
        Q_ASSERT(job);
112
 
        job->ui()->setWindow(parent);
113
 
 
114
 
        Q_FOREACH(const KUrl& url, urlList) {
115
 
                DocumentFactory::instance()->forget(url);
116
 
        }
117
 
}
118
 
 
119
 
 
120
 
void copyTo(const KUrl::List& urlList, QWidget* parent) {
121
 
        copyMoveOrLink(KonqOperations::COPY, urlList, parent);
122
 
}
123
 
 
124
 
 
125
 
void moveTo(const KUrl::List& urlList, QWidget* parent) {
126
 
        copyMoveOrLink(KonqOperations::MOVE, urlList, parent);
127
 
}
128
 
 
129
 
 
130
 
void linkTo(const KUrl::List& urlList, QWidget* parent) {
131
 
        copyMoveOrLink(KonqOperations::LINK, urlList, parent);
132
 
}
133
 
 
134
 
 
135
 
void trash(const KUrl::List& urlList, QWidget* parent) {
136
 
        delOrTrash(KonqOperations::TRASH, urlList, parent);
137
 
}
138
 
 
139
 
 
140
 
void del(const KUrl::List& urlList, QWidget* parent) {
141
 
        delOrTrash(KonqOperations::DEL, urlList, parent);
142
 
}
143
 
 
144
 
 
145
 
void showMenuForDroppedUrls(QWidget* parent, const KUrl::List& urlList, const KUrl& destUrl) {
146
 
        if (urlList.isEmpty()) {
147
 
                kWarning() << "urlList is empty!";
148
 
                return;
149
 
        }
150
 
 
151
 
        if (!destUrl.isValid()) {
152
 
                kWarning() << "destUrl is not valid!";
153
 
                return;
154
 
        }
155
 
 
156
 
        KMenu menu(parent);
157
 
        QAction* moveAction = menu.addAction(
158
 
                KIcon("go-jump"),
159
 
                i18n("Move Here"));
160
 
        QAction* copyAction = menu.addAction(
161
 
                KIcon("edit-copy"),
162
 
                i18n("Copy Here"));
163
 
        QAction* linkAction = menu.addAction(
164
 
                KIcon("edit-link"),
165
 
                i18n("Link Here"));
166
 
        menu.addSeparator();
167
 
        menu.addAction(
168
 
                KIcon("process-stop"),
169
 
                i18n("Cancel"));
170
 
 
171
 
        QAction* action = menu.exec(QCursor::pos());
172
 
 
173
 
        KIO::Job* job = 0;
174
 
        if (action == moveAction) {
175
 
                job = KIO::move(urlList, destUrl);
176
 
        } else if (action == copyAction) {
177
 
                job = KIO::copy(urlList, destUrl);
178
 
        } else if (action == linkAction) {
179
 
                job = KIO::link(urlList, destUrl);
180
 
        } else {
181
 
                return;
182
 
        }
183
 
        Q_ASSERT(job);
184
 
        job->ui()->setWindow(parent);
185
 
}
186
 
 
187
 
 
188
 
void rename(const KUrl& oldUrl, QWidget* parent) {
189
 
        QString name = KInputDialog::getText(
190
 
                i18nc("@title:window", "Rename") /* caption */,
191
 
                i18n("Rename <filename>%1</filename> to:", oldUrl.fileName()) /* label */,
192
 
                oldUrl.fileName() /* value */,
193
 
                0 /* ok */,
194
 
                parent
195
 
                );
196
 
        if (name.isEmpty() || name == oldUrl.fileName()) {
197
 
                return;
198
 
        }
199
 
 
200
 
        KUrl newUrl = oldUrl;
201
 
        newUrl.setFileName(name);
202
 
        KIO::SimpleJob* job = KIO::rename(oldUrl, newUrl, KIO::HideProgressInfo);
203
 
        if (!KIO::NetAccess::synchronousRun(job, parent)) {
204
 
                job->ui()->showErrorMessage();
205
 
                return;
206
 
        }
207
 
        ThumbnailLoadJob::moveThumbnail(oldUrl, newUrl);
208
 
}
209
 
 
 
43
namespace Gwenview
 
44
{
 
45
 
 
46
namespace FileOperations
 
47
{
 
48
 
 
49
static void copyMoveOrLink(KonqOperations::Operation operation, const KUrl::List& urlList, QWidget* parent)
 
50
{
 
51
    Q_ASSERT(urlList.count() > 0);
 
52
 
 
53
    KFileDialog dialog(
 
54
        KUrl("kfiledialog:///<copyMoveOrLink>"),
 
55
        QString() /* filter */,
 
56
        parent);
 
57
    dialog.setOperationMode(KFileDialog::Saving);
 
58
    switch (operation) {
 
59
    case KonqOperations::COPY:
 
60
        dialog.setCaption(i18nc("@title:window", "Copy To"));
 
61
        dialog.okButton()->setText(i18nc("@action:button", "Copy"));
 
62
        break;
 
63
    case KonqOperations::MOVE:
 
64
        dialog.setCaption(i18nc("@title:window", "Move To"));
 
65
        dialog.okButton()->setText(i18nc("@action:button", "Move"));
 
66
        break;
 
67
    case KonqOperations::LINK:
 
68
        dialog.setCaption(i18nc("@title:window", "Link To"));
 
69
        dialog.okButton()->setText(i18nc("@action:button", "Link"));
 
70
        break;
 
71
    default:
 
72
        Q_ASSERT(0);
 
73
    }
 
74
    if (urlList.count() == 1) {
 
75
        dialog.setMode(KFile::File);
 
76
        dialog.setSelection(urlList[0].fileName());
 
77
    } else {
 
78
        dialog.setMode(KFile::ExistingOnly | KFile::Directory);
 
79
    }
 
80
    if (!dialog.exec()) {
 
81
        return;
 
82
    }
 
83
 
 
84
    KUrl destUrl = dialog.selectedUrl();
 
85
    KonqOperations::copy(parent, operation, urlList, destUrl);
 
86
}
 
87
 
 
88
static void delOrTrash(KonqOperations::Operation operation, const KUrl::List& urlList, QWidget* parent)
 
89
{
 
90
    Q_ASSERT(urlList.count() > 0);
 
91
 
 
92
    if (!KonqOperations::askDeleteConfirmation(urlList, operation, KonqOperations::DEFAULT_CONFIRMATION, parent)) {
 
93
        return;
 
94
    }
 
95
 
 
96
    KIO::Job* job = 0;
 
97
    // KonqOperations::delOrTrash() handles the confirmation and does not provide
 
98
    // a way to know if the deletion has been accepted.
 
99
    // We need to know about the confirmation so that DocumentFactory can forget
 
100
    // about the deleted urls. That's why we can't use KonqOperations::delOrTrash()
 
101
    switch (operation) {
 
102
    case KonqOperations::TRASH:
 
103
        job = KIO::trash(urlList);
 
104
        break;
 
105
 
 
106
    case KonqOperations::DEL:
 
107
        job = KIO::del(urlList);
 
108
        break;
 
109
 
 
110
    default:
 
111
        kWarning() << "Unknown operation" << operation;
 
112
        return;
 
113
    }
 
114
    Q_ASSERT(job);
 
115
    job->ui()->setWindow(parent);
 
116
 
 
117
    Q_FOREACH(const KUrl & url, urlList) {
 
118
        DocumentFactory::instance()->forget(url);
 
119
    }
 
120
}
 
121
 
 
122
void copyTo(const KUrl::List& urlList, QWidget* parent)
 
123
{
 
124
    copyMoveOrLink(KonqOperations::COPY, urlList, parent);
 
125
}
 
126
 
 
127
void moveTo(const KUrl::List& urlList, QWidget* parent)
 
128
{
 
129
    copyMoveOrLink(KonqOperations::MOVE, urlList, parent);
 
130
}
 
131
 
 
132
void linkTo(const KUrl::List& urlList, QWidget* parent)
 
133
{
 
134
    copyMoveOrLink(KonqOperations::LINK, urlList, parent);
 
135
}
 
136
 
 
137
void trash(const KUrl::List& urlList, QWidget* parent)
 
138
{
 
139
    delOrTrash(KonqOperations::TRASH, urlList, parent);
 
140
}
 
141
 
 
142
void del(const KUrl::List& urlList, QWidget* parent)
 
143
{
 
144
    delOrTrash(KonqOperations::DEL, urlList, parent);
 
145
}
 
146
 
 
147
void showMenuForDroppedUrls(QWidget* parent, const KUrl::List& urlList, const KUrl& destUrl)
 
148
{
 
149
    if (urlList.isEmpty()) {
 
150
        kWarning() << "urlList is empty!";
 
151
        return;
 
152
    }
 
153
 
 
154
    if (!destUrl.isValid()) {
 
155
        kWarning() << "destUrl is not valid!";
 
156
        return;
 
157
    }
 
158
 
 
159
    KMenu menu(parent);
 
160
    QAction* moveAction = menu.addAction(
 
161
                              KIcon("go-jump"),
 
162
                              i18n("Move Here"));
 
163
    QAction* copyAction = menu.addAction(
 
164
                              KIcon("edit-copy"),
 
165
                              i18n("Copy Here"));
 
166
    QAction* linkAction = menu.addAction(
 
167
                              KIcon("edit-link"),
 
168
                              i18n("Link Here"));
 
169
    menu.addSeparator();
 
170
    menu.addAction(
 
171
        KIcon("process-stop"),
 
172
        i18n("Cancel"));
 
173
 
 
174
    QAction* action = menu.exec(QCursor::pos());
 
175
 
 
176
    KIO::Job* job = 0;
 
177
    if (action == moveAction) {
 
178
        job = KIO::move(urlList, destUrl);
 
179
    } else if (action == copyAction) {
 
180
        job = KIO::copy(urlList, destUrl);
 
181
    } else if (action == linkAction) {
 
182
        job = KIO::link(urlList, destUrl);
 
183
    } else {
 
184
        return;
 
185
    }
 
186
    Q_ASSERT(job);
 
187
    job->ui()->setWindow(parent);
 
188
}
 
189
 
 
190
void rename(const KUrl& oldUrl, QWidget* parent)
 
191
{
 
192
    QString name = KInputDialog::getText(
 
193
                       i18nc("@title:window", "Rename") /* caption */,
 
194
                       i18n("Rename <filename>%1</filename> to:", oldUrl.fileName()) /* label */,
 
195
                       oldUrl.fileName() /* value */,
 
196
                       0 /* ok */,
 
197
                       parent
 
198
                   );
 
199
    if (name.isEmpty() || name == oldUrl.fileName()) {
 
200
        return;
 
201
    }
 
202
 
 
203
    KUrl newUrl = oldUrl;
 
204
    newUrl.setFileName(name);
 
205
    KIO::SimpleJob* job = KIO::rename(oldUrl, newUrl, KIO::HideProgressInfo);
 
206
    if (!KIO::NetAccess::synchronousRun(job, parent)) {
 
207
        job->ui()->showErrorMessage();
 
208
        return;
 
209
    }
 
210
    ThumbnailLoadJob::moveThumbnail(oldUrl, newUrl);
 
211
}
210
212
 
211
213
} // namespace
212
214