1 /* This file is part of the KDE project
3 Copyright (C) 2002 by Patrick Charbonnier <pch@freeshell.org>
4 Based On Caitoo v.0.7.3 (c) 1998 - 2000, Matej Koss
5 Copyright (C) 2002 Carsten Pfeiffer <pfeiffer@kde.org>
6 Copyright (C) 2006, 2007 Urs Wolfer <uwolfer @ kde.org>
7 Copyright (C) 2006 Dario Massarin <nekkar@libero.it>
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public
11 License as published by the Free Software Foundation; either
12 version 2 of the License, or (at your option) any later version.
18 #include <kapplication.h>
19 #include <kstandarddirs.h>
20 #include <kmessagebox.h>
21 #include <kkeydialog.h>
22 #include <kedittoolbar.h>
23 #include <knotifyconfigwidget.h>
24 #include <kfiledialog.h>
25 #include <ktoolinvocation.h>
27 #include <kiconloader.h>
28 #include <kstandardaction.h>
31 #include <kactionmenu.h>
33 #include "mainwindow.h"
34 #include "core/kget.h"
35 #include "core/transferhandler.h"
37 #include "conf/preferencesdialog.h"
39 #include "ui/viewscontainer.h"
41 #include "ui/droptarget.h"
42 #include "ui/groupseditdialog.h"
44 MainWindow::MainWindow( QWidget
* parent
)
45 : KMainWindow( parent
),
54 createGUI("kgetui.rc");
56 m_viewsContainer
= new ViewsContainer(this);
58 setCentralWidget(m_viewsContainer
);
60 // restore position, size and visibility
61 move( Settings::mainPosition() );
62 setAutoSaveSettings();
63 setPlainCaption(i18n("KGet"));
65 if ( Settings::showMain() )
70 //Some of the widgets are initialized in slotDelayedInit()
71 QTimer::singleShot( 0, this, SLOT(slotDelayedInit()) );
74 MainWindow::~MainWindow()
76 //Save the user's transfers
80 delete clipboardTimer
;
83 // reset konqueror integration (necessary if user enabled / disabled temporarily integration from tray)
84 slotKonquerorIntegration( Settings::konquerorIntegration() );
85 // the following call saves options set in above dtors
86 Settings::writeConfig();
90 void MainWindow::setupActions()
92 QAction
*newDownloadAction
= actionCollection()->addAction("new_download");
93 newDownloadAction
->setText(i18n("&New Download..."));
94 newDownloadAction
->setIcon(KIcon("document-new"));
95 newDownloadAction
->setShortcuts(KShortcut("Ctrl+N"));
96 connect(newDownloadAction
, SIGNAL(triggered()), SLOT(slotNewTransfer()));
98 QAction
*openAction
= actionCollection()->addAction("open");
99 openAction
->setText(i18n("&Open..."));
100 openAction
->setIcon(KIcon("document-open"));
101 openAction
->setShortcuts(KShortcut("Ctrl+O"));
102 connect(openAction
, SIGNAL(triggered()), SLOT(slotOpen()));
104 QAction
*exportAction
= actionCollection()->addAction("export_downloads");
105 exportAction
->setText(i18n("&Export Transfers List..."));
106 exportAction
->setIcon(KIcon("fileexport"));
107 exportAction
->setShortcuts(KShortcut("Ctrl+E"));
108 connect(exportAction
, SIGNAL(triggered()), SLOT(slotExportTransfers()));
110 QAction
*editGroupAction
= actionCollection()->addAction("edit_groups");
111 editGroupAction
->setText(i18n("Edit Groups.."));
112 editGroupAction
->setIcon(KIcon("todolist"));
113 connect(editGroupAction
, SIGNAL(triggered()), SLOT(slotEditGroups()));
115 m_autoPasteAction
= new KToggleAction(KIcon("klipper"),
116 i18n("Auto-Paste Mode"), actionCollection());
117 actionCollection()->addAction("auto_paste", m_autoPasteAction
);
118 m_autoPasteAction
->setChecked(Settings::autoPaste());
119 m_autoPasteAction
->setWhatsThis(i18n("<b>Auto paste</b> button toggles the auto-paste mode "
120 "on and off.\nWhen set, KGet will periodically scan "
121 "the clipboard for URLs and paste them automatically."));
122 connect(m_autoPasteAction
, SIGNAL(triggered()), SLOT(slotToggleAutoPaste()));
124 KToggleAction
*m_konquerorIntegration
= new KToggleAction(KIcon("konqueror"),
125 i18n("Use KGet as Konqueror Download Manager"),
127 actionCollection()->addAction("konqueror_integration", m_konquerorIntegration
);
128 connect(m_konquerorIntegration
, SIGNAL(triggered()), SLOT(slotTrayKonquerorIntegration()));
129 m_konquerorIntegration
->setChecked(Settings::konquerorIntegration());
131 // local - Destroys all sub-windows and exits
132 QAction
*quitAction
= KStandardAction::quit(this, SLOT(slotQuit()), actionCollection());
133 actionCollection()->addAction("quit", quitAction
);
134 // local - Standard configure actions
135 QAction
*preferencesAction
= KStandardAction::preferences(this, SLOT(slotPreferences()), actionCollection());
136 actionCollection()->addAction("preferences", preferencesAction
);
137 QAction
*configToolbarAction
= KStandardAction::configureToolbars(this, SLOT(slotConfigureToolbars()), actionCollection());
138 actionCollection()->addAction("configure_toolbars", configToolbarAction
);
139 QAction
*keyBindingsAction
= KStandardAction::keyBindings(this, SLOT(slotConfigureKeys()), actionCollection());
140 actionCollection()->addAction("configure_keys", keyBindingsAction
);
141 QAction
*cinfigNotifyAction
= KStandardAction::configureNotifications(this, SLOT(slotConfigureNotifications()), actionCollection());
142 actionCollection()->addAction("configure_notifications", cinfigNotifyAction
);
143 m_menubarAction
= KStandardAction::showMenubar(this, SLOT(slotShowMenubar()), actionCollection());
144 m_menubarAction
->setChecked(!menuBar()->isHidden());
145 actionCollection()->addAction("settings_showmenubar", m_menubarAction
);
147 // Transfer related actions
148 QAction
*deleteSelectedAction
= actionCollection()->addAction("delete_selected_download");
149 deleteSelectedAction
->setText(i18n("Delete Selected"));
150 deleteSelectedAction
->setIcon(KIcon("edit-delete"));
151 deleteSelectedAction
->setShortcuts(KShortcut("Del"));
152 connect(deleteSelectedAction
, SIGNAL(triggered()), SLOT(slotDeleteSelected()));
154 QAction
*startAllAction
= actionCollection()->addAction("start_all_download");
155 startAllAction
->setText(i18n("Start / Resume All"));
156 startAllAction
->setIcon(KIcon("media-seek-forward"));
157 connect(startAllAction
, SIGNAL(triggered()), SLOT(slotStartAllDownload()));
159 QAction
*startSelectedAction
= actionCollection()->addAction("start_selected_download");
160 startSelectedAction
->setText(i18n("Start / Resume Selected"));
161 startSelectedAction
->setIcon(KIcon("media-playback-start"));
162 connect(startSelectedAction
, SIGNAL(triggered()), SLOT(slotStartSelectedDownload()));
164 QAction
*stopAllAction
= actionCollection()->addAction("stop_all_download");
165 stopAllAction
->setText(i18n("Stop All"));
166 stopAllAction
->setIcon(KIcon("media-playback-pause"));
167 connect(stopAllAction
, SIGNAL(triggered()), SLOT(slotStopAllDownload()));
169 QAction
*stopSelectedAction
= actionCollection()->addAction("stop_selected_download");
170 stopSelectedAction
->setText(i18n("Stop Selected"));
171 stopSelectedAction
->setIcon(KIcon("media-playback-pause"));
172 connect(stopSelectedAction
, SIGNAL(triggered()), SLOT(slotStopSelectedDownload()));
174 KActionMenu
*startActionMenu
= new KActionMenu(KIcon("media-playback-start"), i18n("Start / Resume"),
176 actionCollection()->addAction("start_menu", startActionMenu
);
177 startActionMenu
->setDelayed(true);
178 startActionMenu
->addAction(startAllAction
);
179 startActionMenu
->addAction(startSelectedAction
);
180 connect(startActionMenu
, SIGNAL(triggered()), SLOT(slotStartDownload()));
182 KActionMenu
*stopActionMenu
= new KActionMenu(KIcon("media-playback-pause"), i18n("Stop"),
184 actionCollection()->addAction("stop_menu", stopActionMenu
);
185 stopActionMenu
->setDelayed(true);
186 stopActionMenu
->addAction(stopAllAction
);
187 stopActionMenu
->addAction(stopSelectedAction
);
188 connect(stopActionMenu
, SIGNAL(triggered()), SLOT(slotStopDownload()));
190 QAction
*openDestAction
= actionCollection()->addAction("transfer_open_dest");
191 openDestAction
->setText(i18n("Open Destination"));
192 openDestAction
->setIcon(KIcon("folder"));
193 connect(openDestAction
, SIGNAL(triggered()), SLOT(slotTransfersOpenDest()));
195 QAction
*showDetailsAction
= actionCollection()->addAction("transfer_show_details");
196 showDetailsAction
->setText(i18n("Show Details"));
197 showDetailsAction
->setIcon(KIcon("configure"));
198 connect(showDetailsAction
, SIGNAL(triggered()), SLOT(slotTransfersShowDetails()));
200 QAction
*copyUrlAction
= actionCollection()->addAction("transfer_copy_source_url");
201 copyUrlAction
->setText(i18n("Copy URL to Clipboard"));
202 copyUrlAction
->setIcon(KIcon("klipper"));
203 connect(copyUrlAction
, SIGNAL(triggered()), SLOT(slotTransfersCopySourceUrl()));
206 void MainWindow::slotDelayedInit()
208 //Here we import the user's transfers.
209 KGet::load( KStandardDirs::locateLocal("appdata", "transfers.kgt") );
212 m_drop
= new DropTarget(this);
214 if ( Settings::showDropTarget() || Settings::firstRun() )
215 m_drop
->setVisible(true);
218 m_dock
= new Tray(this);
222 setAcceptDrops(true);
224 // enable hide toolbar
225 setStandardToolBarMenuEnabled(true);
227 // session management stuff
228 connect(kapp
, SIGNAL(saveYourself()), SLOT(slotSaveMyself()));
230 // set auto-resume in kioslaverc (is there a cleaner way?)
231 KConfig
cfg("kioslaverc", KConfig::NoGlobals
);
232 cfg
.group(QString()).writeEntry("AutoResume", true);
235 // immediately start downloading if configured this way
236 if ( Settings::downloadAtStartup() )
239 // reset the FirstRun config option
240 Settings::setFirstRun(false);
243 lastClipboard
= QApplication::clipboard()->text( QClipboard::Clipboard
).trimmed();
244 clipboardTimer
= new QTimer(this);
245 connect(clipboardTimer
, SIGNAL(timeout()), SLOT(slotCheckClipboard()));
246 if ( Settings::autoPaste() )
247 clipboardTimer
->start(1000);
250 void MainWindow::slotNewTransfer()
252 KGet::addTransfer(KUrl());
255 void MainWindow::slotOpen()
257 QString filename
= KFileDialog::getOpenFileName
259 "*.kgt *.torrent *.metalink|" + i18n("All openable files") + " (*.kgt *.torrent *.metalink)",
264 if(filename
.endsWith(".kgt"))
266 KGet::load(filename
);
270 if(filename
.endsWith(".metalink"))
272 KGet::addMetaLink( KUrl( filename
) );
276 if(!filename
.isEmpty())
277 KGet::addTransfer( KUrl( filename
) );
280 void MainWindow::slotQuit()
282 // if (m_scheduler->countRunningJobs() > 0)
284 // if (KMessageBox::warningYesNo(this,
285 // i18n("Some transfers are still running.\n"
286 // "Are you sure you want to close KGet?"),
287 // i18n("Warning"), KStdGuiItem::yes(), KStdGuiItem::no(),
288 // "ExitWithActiveTransfers") == KMessageBox::No)
292 Settings::writeConfig();
296 void MainWindow::slotPreferences()
298 // an instance the dialog could be already created and could be cached,
299 // in which case you want to display the cached dialog
300 if ( PreferencesDialog::showDialog( "preferences" ) )
303 // we didn't find an instance of this dialog, so lets create it
304 PreferencesDialog
* dialog
= new PreferencesDialog( this, Settings::self() );
305 KGet::setPluginsSettingsWidget( dialog
->pluginsWidget() );
306 // keep us informed when the user changes settings
307 connect( dialog
, SIGNAL(settingsChanged(const QString
&)),
308 this, SLOT(slotNewConfig()) );
313 void MainWindow::slotExportTransfers()
315 QString filename
= KFileDialog::getSaveFileName
317 "*.kgt|" + i18n("KGet transfer list") + " (*.kgt)",
319 i18n("Export transfers")
322 if(!filename
.isEmpty())
323 KGet::save(filename
);
326 void MainWindow::slotEditGroups()
328 GroupsEditDialog
dialog(this);
333 void MainWindow::slotStartDownload()
335 if(KGet::selectedTransfers().size() == 0)
336 slotStartAllDownload();
338 slotStartSelectedDownload();
341 void MainWindow::slotStartAllDownload()
343 m_dock
->setDownloading(true);
345 KGet::setSchedulerRunning(true);
348 void MainWindow::slotStartSelectedDownload()
350 m_dock
->setDownloading(true);
352 foreach(TransferHandler
* it
, KGet::selectedTransfers())
356 void MainWindow::slotStopDownload()
358 if(KGet::selectedTransfers().size() == 0)
359 slotStopAllDownload();
361 slotStopSelectedDownload();
364 void MainWindow::slotStopAllDownload()
366 m_dock
->setDownloading(false);
368 KGet::setSchedulerRunning(false);
371 void MainWindow::slotStopSelectedDownload()
373 m_dock
->setDownloading(false);
375 foreach(TransferHandler
* it
, KGet::selectedTransfers())
379 void MainWindow::slotDeleteSelected()
381 foreach(TransferHandler
* it
, KGet::selectedTransfers())
384 KGet::delTransfer(it
);
388 void MainWindow::slotTransfersOpenDest()
390 QStringList openedDirs
;
391 foreach(TransferHandler
* it
, KGet::selectedTransfers())
393 QString directory
= it
->dest().directory();
394 if( !openedDirs
.contains( directory
) )
396 KToolInvocation::invokeBrowser( directory
);
397 openedDirs
.append( directory
);
402 void MainWindow::slotTransfersShowDetails()
404 foreach(TransferHandler
* it
, KGet::selectedTransfers())
406 m_viewsContainer
->showTransferDetails(it
);
410 void MainWindow::slotTransfersCopySourceUrl()
412 foreach(TransferHandler
* it
, KGet::selectedTransfers())
414 QString sourceurl
= it
->source().url();
415 QClipboard
*cb
= QApplication::clipboard();
416 cb
->setText(sourceurl
, QClipboard::Selection
);
417 cb
->setText(sourceurl
, QClipboard::Clipboard
);
421 void MainWindow::slotConfigureNotifications()
423 KNotifyConfigWidget::configure(this);
426 void MainWindow::slotConfigureKeys()
428 KKeyDialog::configure(actionCollection());
431 void MainWindow::slotConfigureToolbars()
433 KEditToolbar
edit( "kget_toolbar", actionCollection() );
434 connect(&edit
, SIGNAL( newToolbarConfig() ), this, SLOT( slotNewToolbarConfig() ));
439 void MainWindow::slotSaveMyself()
441 // save last parameters ..
442 Settings::setMainPosition( pos() );
443 // .. and write config to disk
444 Settings::writeConfig();
447 void MainWindow::slotNewToolbarConfig()
452 void MainWindow::slotNewConfig()
454 // Update here properties modified in the config dialog and not
455 // parsed often by the code. When clicking Ok or Apply of
456 // PreferencesDialog, this function is called.
458 m_drop
->setVisible(Settings::showDropTarget(), false);
460 slotKonquerorIntegration(Settings::konquerorIntegration());
462 if (Settings::autoPaste())
463 clipboardTimer
->start(1000);
465 clipboardTimer
->stop();
466 m_autoPasteAction
->setChecked(Settings::autoPaste());
469 void MainWindow::slotToggleAutoPaste()
471 bool autoPaste
= !Settings::autoPaste();
472 Settings::setAutoPaste( autoPaste
);
475 clipboardTimer
->start(1000);
477 clipboardTimer
->stop();
478 m_autoPasteAction
->setChecked(autoPaste
);
481 void MainWindow::slotCheckClipboard()
483 QString clipData
= QApplication::clipboard()->text( QClipboard::Clipboard
).trimmed();
485 if (clipData
!= lastClipboard
)
487 lastClipboard
= clipData
;
488 if (lastClipboard
.isEmpty())
491 KUrl url
= KUrl(lastClipboard
);
493 if (url
.isValid() && !url
.isLocalFile())
494 KGet::addTransfer( url
);
498 void MainWindow::slotTrayKonquerorIntegration()
500 static bool tempIntegration
= Settings::konquerorIntegration();
501 tempIntegration
= !tempIntegration
;
502 slotKonquerorIntegration(tempIntegration
);
503 if (!tempIntegration
&& Settings::konquerorIntegration() && !Settings::expertMode())
505 KMessageBox::information(this,
506 i18n("KGet has been temporarily disabled as download manager for Konqueror. "
507 "If you want to disable it forever, go to Settings->Advanced and disable \"Use "
508 "as download manager for Konqueror\"."),
509 i18n("Konqueror Integration disabled"),
510 "KonquerorIntegrationDisabled");
514 void MainWindow::slotKonquerorIntegration(bool konquerorIntegration
)
516 KConfig
cfgKonqueror("konquerorrc", KConfig::NoGlobals
);
517 cfgKonqueror
.group("HTML Settings").writeEntry("DownloadManager",
518 QString(konquerorIntegration
? "kget" : QString()));
522 void MainWindow::slotShowMenubar()
524 if(m_menubarAction
->isChecked())
532 void MainWindow::closeEvent( QCloseEvent
* e
)
538 void MainWindow::dragEnterEvent(QDragEnterEvent
* event
)
540 event
->setAccepted(KUrl::List::canDecode(event
->mimeData())
541 || event
->mimeData()->hasText());
544 void MainWindow::dropEvent(QDropEvent
* event
)
546 KUrl::List list
= KUrl::List::fromMimeData(event
->mimeData());
550 KGet::addTransfer(list
);
553 str
= event
->mimeData()->text();
554 KGet::addTransfer(KUrl(str
));
559 /** DBUS interface */
561 void MainWindow::addTransfers(const QString
& src
, const QString
& dest
)
563 // split src for the case it is a QStringList (e.g. from konqueror plugin)
564 KGet::addTransfer(src
.split(";"), dest
);
567 bool MainWindow::isDropTargetVisible() const
569 return m_drop
->isVisible();
572 void MainWindow::setDropTargetVisible( bool setVisible
)
574 if ( setVisible
!= Settings::showDropTarget() )
575 m_drop
->setVisible( setVisible
);
578 void MainWindow::setOfflineMode( bool offline
)
581 //TODO Re-enable this
582 // schedRequestOperation( offline ? OpStop : OpRun );
585 bool MainWindow::isOfflineMode() const
587 //TODO Re-enable this
588 // return scheduler->isRunning();
592 #include "mainwindow.moc"