26 #include <QApplication>
30 #include <QtCore/QTimer>
33 #include <QListWidgetItem>
34 #include <KColorScheme>
36 #include <KFileDialog>
37 #include <KWindowSystem>
45 m_existingTransfer(0),
47 m_overWriteSingle(false)
50 setCaption(i18n(
"New Download"));
51 showButtonSeparator(
true);
55 setMainWidget(widget);
57 enableButtonOk(
false);
60 m_timer =
new QTimer(
this);
61 m_timer->setInterval(350);
62 m_timer->setSingleShot(
true);
63 connect(m_timer, SIGNAL(timeout()),
this, SLOT(checkInput()));
65 const KColorScheme scheme = KColorScheme(QPalette::Active, KColorScheme::View);
66 m_existingFileBackground = scheme.background(KColorScheme::NeutralBackground);
67 m_normalBackground = scheme.background();
71 ui.destRequester->comboBox()->setDuplicatesEnabled(
false);
72 ui.destRequester->comboBox()->setUrlDropsEnabled(
true);
73 ui.destRequester->comboBox()->setEditable(
true);
74 ui.destRequester->fileDialog()->setKeepLocation(
true);
76 ui.errorWidget->setCloseButtonVisible(
false);
78 connect(ui.groupComboBox, SIGNAL(currentIndexChanged(
int)),
this, SLOT(setDefaultDestination()));
80 connect(ui.urlRequester, SIGNAL(textChanged(QString)),
this, SLOT(setDefaultDestination()));
81 connect(ui.destRequester, SIGNAL(textChanged(QString)),
this, SLOT(inputTimer()));
82 connect(ui.urlRequester, SIGNAL(textChanged(QString)),
this, SLOT(inputTimer()));
83 connect(ui.listWidget, SIGNAL(itemChanged(QListWidgetItem*)),
this, SLOT(inputTimer()));
84 connect(
this, SIGNAL(finished(
int)),
this, SLOT(slotFinished(
int)));
91 void NewTransferDialog::setMultiple(
bool useMultiple)
93 m_multiple = useMultiple;
95 const Qt::Alignment alignment = Qt::AlignLeft | (m_multiple ? Qt::AlignTop : Qt::AlignVCenter);
96 ui.urlLabel->setAlignment(alignment);
97 ui.urlRequester->setVisible(!m_multiple);
98 ui.listWidget->setVisible(m_multiple);
99 ui.destRequester->setMode(m_multiple ? KFile::Directory : KFile::File);
102 void NewTransferDialog::clear()
104 ui.urlRequester->clear();
105 ui.urlRequester->setFocus();
106 ui.listWidget->clear();
107 ui.destRequester->comboBox()->clear();
108 ui.destRequester->clear();
109 m_destination.clear();
111 m_existingTransfer = 0;
112 m_overWriteSingle =
false;
117 if (!downloadPath.isEmpty()) {
118 if (!downloadPath.endsWith(
'/')) {
119 downloadPath.append(
'/');
121 list << downloadPath;
125 if (!folder.isEmpty()) {
126 list << (folder.endsWith(
'/') ? folder : folder +
'/');
130 list.removeDuplicates();
131 ui.destRequester->comboBox()->insertItems(0, list);
134 ui.groupComboBox->clear();
136 ui.groupComboBox->addItem(KIcon(group->
iconName()), group->
name());
139 if (ui.groupComboBox->currentIndex() == -1) {
140 ui.groupComboBox->setCurrentIndex(0);
144 ui.groupComboBox->setVisible(multipleGroups);
145 ui.groupLabel->setVisible(multipleGroups);
148 void NewTransferDialog::setSource(
const KUrl::List &sources)
150 if (sources.isEmpty()) {
154 if (sources.count() == 1) {
155 KUrl m_srcUrl = sources.first().url();
156 ui.urlRequester->clear();
157 if (m_srcUrl.isEmpty()) {
158 m_srcUrl = KUrl(QApplication::clipboard()->text(QClipboard::Clipboard).trimmed());
162 ui.urlRequester->insert(m_srcUrl.prettyUrl());
165 foreach (
const KUrl &sourceUrl, sources) {
166 if (sourceUrl.url() != KUrl(sourceUrl.url()).fileName()) {
167 kDebug(5001) <<
"Insert" << sourceUrl;
168 QListWidgetItem *newItem =
new QListWidgetItem(sourceUrl.pathOrUrl(), ui.listWidget);
169 newItem->setCheckState(Qt::Checked);
175 if (!groups.isEmpty()) {
176 ui.groupComboBox->setCurrentIndex(ui.groupComboBox->findText(groups.first()->name()));
180 void NewTransferDialog::setDestinationFileName(
const QString &filename)
182 ui.destRequester->setUrl(QString(ui.destRequester->url().path(KUrl::AddTrailingSlash) + filename));
185 void NewTransferDialog::setDestination()
188 QString group = ui.groupComboBox->currentText();
191 if (handler->
name() == group) {
199 if (groupFolder.isEmpty()) {
202 if (!groupFolder.endsWith(
'/')) {
203 groupFolder.append(
'/');
205 ui.destRequester->comboBox()->setCurrentItem(groupFolder,
true);
209 void NewTransferDialog::showDialog(KUrl::List list,
const QString &suggestedFileName)
219 const int size = m_sources.size();
220 kDebug(5001) <<
"SET SOURCES " << m_sources <<
" MULTIPLE " << (size > 1);
221 setMultiple(size > 1);
224 if (size == 1 && !suggestedFileName.isEmpty()) {
225 setDestinationFileName(suggestedFileName);
228 setSource(m_sources);
241 const KUrl url(ui.urlRequester->text().trimmed());
243 QFileInfo(ui.destRequester->url().toLocalFile()).isDir()) {
244 setDestinationFileName(url.fileName());
249 void NewTransferDialog::prepareDialog()
252 KWindowInfo info = KWindowSystem::windowInfo(m_window->winId(), NET::WMDesktop, NET::WMDesktop);
253 KWindowSystem::setCurrentDesktop(info.desktop());
254 KWindowSystem::forceActiveWindow(m_window->winId());
257 kDebug(5001) <<
"Show the dialog!";
261 bool NewTransferDialog::isEmpty()
263 return (m_multiple ? !ui.listWidget->count() : ui.urlRequester->text().trimmed().isEmpty());
266 void NewTransferDialog::inputTimer()
268 enableButtonOk(
false);
272 void NewTransferDialog::checkInput()
274 KUrl source = KUrl(ui.urlRequester->text().trimmed());
275 const KUrl dest = ui.destRequester->url();
280 bool destinationValid =
false;
291 m_destination = dest;
300 if (!m_multiple && !sourceValid) {
305 bool filesChecked =
false;
306 if (m_multiple && folderValid) {
307 KListWidget *list = ui.listWidget;
310 for (
int i = 0; i < list->count(); ++i) {
311 QListWidgetItem *item = list->item(i);
312 if (item->checkState() == Qt::Checked) {
318 infoText = i18n(
"Select at least one source url.");
323 bool existingFile =
false;
324 for (
int i = 0; i < list->count(); ++i) {
325 QListWidgetItem *item = list->item(i);
326 const KUrl source = KUrl(item->text());
329 item->setBackground(m_existingFileBackground);
332 item->setBackground(m_normalBackground);
336 warningText = i18n(
"Files that exist already in the current folder have been marked.");
343 if (!m_multiple && sourceValid && (folderValid || destinationValid)) {
347 if (m_existingTransfer) {
351 if (m_existingTransfer) {
357 m_overWriteSingle =
true;
358 if (!warningText.isEmpty()) {
363 m_overWriteSingle =
false;
367 if (!infoText.isEmpty()) {
368 setInformation(infoText);
369 }
else if (!warningText.isEmpty()) {
370 setWarning(warningText);
372 ui.errorWidget->hide();
377 enableButtonOk(folderValid && filesChecked);
379 enableButtonOk((folderValid || destinationValid) && sourceValid);
382 kDebug(5001) << source << source.fileName() << dest << dest.fileName();
385 void NewTransferDialog::slotFinished(
int resultCode)
387 if (resultCode == KDialog::Accepted) {
393 void NewTransferDialog::dialogAccepted()
395 kDebug(5001) <<
"Dialog accepted.";
398 if (m_existingTransfer) {
399 kDebug(5001) <<
"Removing existing transfer:" << m_existingTransfer;
404 QString dir = m_destination.toLocalFile();
405 if (!QFileInfo(dir).isDir()) {
406 dir = m_destination.directory();
411 const QString group = ui.groupComboBox->currentText();
414 QList<KGet::TransferData> data;
416 if (m_overWriteSingle) {
417 kDebug(5001) <<
"Removing existing file:" << m_destination;
424 const KUrl sourceUrl = KUrl(ui.urlRequester->text().trimmed());
425 kDebug(5001) <<
"Downloading" << sourceUrl <<
"to" << m_destination;
429 for (
int i = 0; i != ui.listWidget->count(); ++i) {
430 QListWidgetItem *item = ui.listWidget->item(i);
433 if (item->checkState() == Qt::Checked) {
435 const KUrl sourceUrl = KUrl(item->text().trimmed());
437 kDebug(5001) <<
"Downloading" << sourceUrl <<
"to" << destUrl;
440 if (item->background() == m_existingFileBackground) {
441 kDebug(5001) <<
"Removing existing file:" << destUrl;
452 if (!data.isEmpty()) {
454 KGet::createTransfers(data);
458 void NewTransferDialog::setInformation(
const QString &information)
460 ui.errorWidget->setMessageType(KMessageWidget::Information);
461 ui.errorWidget->setText(information);
462 ui.errorWidget->setVisible(!information.isEmpty());
465 void NewTransferDialog::setWarning(
const QString &warning)
467 ui.errorWidget->setMessageType(KMessageWidget::Warning);
468 ui.errorWidget->setText(warning);
469 ui.errorWidget->setVisible(!warning.isEmpty());
500 if (urls.isEmpty()) {
501 newTransferDialogHandler->createDialog(urls, QString());
505 QHash<int, UrlData>::iterator itUrls = newTransferDialogHandler->m_urls.insert(newTransferDialogHandler->m_nextJobId, UrlData());
507 QString suggestedFileName;
510 if (urls.count() == 2) {
511 const KUrl lastUrl = urls.last();
512 QDir dir(lastUrl.toLocalFile());
515 if (lastUrl.isLocalFile()) {
516 if (QDir::isAbsolutePath(lastUrl.toLocalFile())) {
519 folder = lastUrl.path(KUrl::AddTrailingSlash);
522 folder = lastUrl.directory(KUrl::AppendTrailingSlash);
523 suggestedFileName = lastUrl.fileName();
528 suggestedFileName = lastUrl.fileName(KUrl::ObeyTrailingSlash);
531 }
else if (!lastUrl.isValid() || (lastUrl.scheme().isEmpty() && lastUrl.directory().isEmpty())) {
533 suggestedFileName = lastUrl.url();
539 if (urls.count() > 2 && urls.last().isLocalFile()) {
549 folder = urls.last().path(KUrl::AddTrailingSlash);
555 if (!folder.isEmpty() && KGet::isValidDestDirectory(folder)) {
556 (*itUrls).folder = folder;
558 if (!suggestedFileName.isEmpty()) {
559 (*itUrls).suggestedFileName = KUrl(suggestedFileName).pathOrUrl();
562 newTransferDialogHandler->m_numJobs[newTransferDialogHandler->m_nextJobId] = urls.count();
563 foreach (
const KUrl &url, urls) {
566 job->setProperty(
"jobId", (newTransferDialogHandler->m_nextJobId));
567 connect(job, SIGNAL(result(
KJob*)), newTransferDialogHandler, SLOT(slotMostLocalUrlResult(
KJob*)));
571 ++(newTransferDialogHandler->m_nextJobId);
574 void NewTransferDialogHandler::slotMostLocalUrlResult(
KJob *j)
577 const int jobId = job->property(
"jobId").toInt();
580 kWarning(5001) <<
"An error happened for" << job->
url();
586 if (m_numJobs[jobId] <= 0) {
591 void NewTransferDialogHandler::handleUrls(
const int jobId)
593 QHash<int, UrlData>::iterator itUrls = m_urls.find(jobId);
594 if (itUrls == m_urls.end()) {
595 kWarning(5001) <<
"JobId" << jobId <<
"was not defined, could not handle urls for it.";
599 KUrl::List urls = (*itUrls).urls;
602 QString folder = (*itUrls).folder;
607 const QString suggestedFileName = (*itUrls).suggestedFileName;
609 const KUrl folderUrl = KUrl(folder);
614 check.displayErrorMessages();
615 check.existingTransfers();
616 urls = check.correctUrls();
618 QList<KGet::TransferData> data;
621 if (!suggestedFileName.isEmpty() && (urls.count() == 1)) {
622 const KUrl sourceUrl = urls.first();
624 const QString groupName = (groups.isEmpty() ? QString() : groups.first()->name());
625 QString defaultFolder;
626 if (groups.isEmpty()) {
629 defaultFolder = groups.first()->defaultFolder();
632 if (!folder.isEmpty()) {
634 newDest = check.checkExistingFile(sourceUrl, destUrl);
635 if (!newDest.isEmpty()) {
641 const KUrl destUrl =
UrlChecker::destUrl(KUrl(defaultFolder), sourceUrl, suggestedFileName);
642 newDest = check.checkExistingFile(sourceUrl, destUrl);
643 if (!newDest.isEmpty()) {
651 if (!folder.isEmpty()) {
655 if (urls.isEmpty()) {
659 const QString groupName = group->
name();
660 const QStringList patterns = group->
regExp().pattern().split(
',');
663 KUrl::List::iterator it = urls.begin();
664 while (it != urls.end()) {
665 const KUrl sourceUrl = *it;
668 newDest = check.checkExistingFile(sourceUrl, destUrl);
669 if (!newDest.isEmpty()) {
680 foreach (
const KUrl &sourceUrl, urls) {
682 newDest = check.checkExistingFile(sourceUrl, destUrl);
683 if (!newDest.isEmpty()) {
695 kDebug(5001) <<
"No, Directories not as suggestion";
700 if (urls.isEmpty()) {
709 const QString groupName = group->
name();
710 const QStringList patterns = group->
regExp().pattern().split(
',');
712 KUrl::List::iterator it = urls.begin();
713 while (it != urls.end()) {
714 const KUrl sourceUrl = *it;
717 newDest = check.checkExistingFile(sourceUrl, destUrl);
718 if (!newDest.isEmpty()) {
733 const QString dir = KGlobalSettings::downloadPath();
734 if (!dir.isEmpty()) {
735 KUrl::List::iterator it = urls.begin();
736 while (it != urls.end()) {
737 const KUrl sourceUrl = *it;
739 newDest = check.checkExistingFile(sourceUrl, destUrl);
740 if (!newDest.isEmpty()) {
750 if (!data.isEmpty()) {
751 KGet::createTransfers(data);
755 if ((!m_dialog || m_dialog->isEmpty()) && urls.count() == 1) {
756 KUrl url = urls.first();
757 QPointer<KDialog> dialog;
762 KWindowInfo info = KWindowSystem::windowInfo(KGet::m_mainWindow->winId(), NET::WMDesktop, NET::WMDesktop);
763 KWindowSystem::setCurrentDesktop(info.desktop());
764 KWindowSystem::forceActiveWindow(KGet::m_mainWindow->winId());
772 m_numJobs.remove(jobId);
773 m_urls.erase(itUrls);
776 if (!urls.isEmpty()) {
777 createDialog(urls, suggestedFileName);
781 void NewTransferDialogHandler::createDialog(
const KUrl::List &urls,
const QString &suggestedFileName)
787 m_dialog->m_window = KGet::m_mainWindow;
788 m_dialog->showDialog(urls, suggestedFileName);
791 #include "newtransferdialog.moc"
This class provides static methods to check if urls are valid, and if not provides enums to see what ...
static QString generalDestDir(bool preferXDGDownloadDir=false)
Returns a download directory.
void setDefaultDestination()
Called when the transfer group or the urlREquester changed, the dialog sets the default destination f...
static QStringList transferGroupNames()
virtual KDialog * createNewTransferDialog(const KUrl &srcUrl, const QString &suggestedFileName=QString(), TransferGroupHandler *defaultGroup=0)
static bool directoriesAsSuggestion()
Get DirectoriesAsSuggestion.
static UrlError checkDestination(const KUrl &destination, bool showNotification=false)
Convenience method of checkUrl.
KUrl mostLocalUrl(const KUrl &url)
Synchronous.
static bool matchesExceptions(const KUrl &sourceUrl, const QStringList &patterns)
Returns true if sourceUrl matches any of the patterns.
MostLocalUrlJob * mostLocalUrlJob(const KUrl &url)
Asynchronous.
static QList< TransferGroupHandler * > allTransferGroups()
Gets all transfer-groups.
static KJob * deleteFile(const KUrl &dest, QObject *receiver=0, const char *method=0)
Starts the deletion of dest and emits KJob::finished once done.
static KUrl destUrl(const KUrl &destOrFolder, const KUrl &source, const QString &fileName=QString())
Takes an url to a source and an url to either the destination or a folder and returns a destination u...
KUrl mostLocalUrl() const
Call this in the slot connected to result.
Dialog to allow add one or more transfers to kget.
Job for asynchronously getting the most local url, do not use directly, but use mostLocalUrlJob inste...
NewTransferDialogHandler(QObject *parent=0)
NOTE some checks in this class might seem redundant, though target is to display as few dialogs...
static QString message(const KUrl &url, const UrlType type, const UrlError error)
Get a describing message for UrlError.
static TransferHandler * existingTransfer(const KUrl &url, const UrlType type, UrlWarning *warning=0)
Checks if there is an existing transfer for url with type.
static bool askForDestination()
Get AskForDestination.
static QList< TransferGroupHandler * > groupsFromExceptions(const KUrl &filename)
static UrlError checkSource(const KUrl &source, bool showNotification=false)
Convenience method of checkUrl.
static QString lastGroup()
Get LastGroup.
static void removeDuplicates(KUrl::List &urls)
Removes duplicates of a list of urls.
static void showNewTransferDialog(const KUrl &url=KUrl())
static void setLastGroup(const QString &v)
Set LastGroup.
~NewTransferDialogHandler()
TransferData(const KUrl &src, const KUrl &dest, const QString &groupName=QString(), bool start=false, const QDomElement *e=0)
static UrlError checkFolder(const KUrl &folder, bool showNotification=false)
Convenience method of checkUrl.
static QList< TransferFactory * > factories()
static bool wouldOverwrite(const KUrl &source, const KUrl &dest)
Checks if source is local and exists already.
static void setLastDirectory(const QString &v)
Set LastDirectory.
static bool delTransfer(TransferHandler *transfer, DeleteMode mode=AutoDelete)
Removes a transfer from the KGet.