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.
kftpgrabber/kftpgrabber/src/widgets/queueview/queueview.cpp

889 lines
29 KiB

/*
* This file is part of the KFTPGrabber project
*
* Copyright (C) 2003-2004 by the KFTPGrabber developers
* Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
* Copyright (C) 2005 Markus Brueffer <markus@brueffer.de>
*
* 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
* is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
* NON-INFRINGEMENT. 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 Steet, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
#include "misc.h"
#include "listview.h"
#include "queueview.h"
#include "kftpqueue.h"
#include "kftpapi.h"
#include "queueeditor.h"
#include "widgets/searchdialog.h"
#include "misc/kftpconfig.h"
#include <tdeapplication.h>
#include <tdefiledialog.h>
#include <kiconloader.h>
#include <tdeio/job.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <kmimetype.h>
#include <tdepopupmenu.h>
#include <tdelistviewsearchline.h>
#include <kdebug.h>
#include <tqspinbox.h>
#include <tqtooltip.h>
using namespace KFTPGrabberBase;
using namespace KFTPCore;
namespace KFTPWidgets {
QueueViewItem::QueueViewItem(QueueView *view, KFTPQueue::QueueObject *object, TQListView *parent)
: TQListViewItem(parent),
m_lastChild(0),
m_queueObject(object),
m_queueView(view),
m_queueId(object->getId())
{
init();
}
QueueViewItem::QueueViewItem(QueueView *view, KFTPQueue::QueueObject *object, TQListViewItem *parent)
: TQListViewItem(parent, static_cast<QueueViewItem*>(parent)->lastChild()),
m_lastChild(0),
m_queueObject(object),
m_queueView(view),
m_queueId(object->getId())
{
init();
}
QueueViewItem::~QueueViewItem()
{
m_queueView->m_queuedItems.remove(m_queueId);
}
void QueueViewItem::insertItem(TQListViewItem *newChild)
{
TQListViewItem::insertItem(newChild);
m_lastChild = newChild;
}
void QueueViewItem::takeItem(TQListViewItem *item)
{
if (item == m_lastChild) {
TQListViewItem *above = item->itemAbove();
if (above->parent() == m_lastChild->parent())
m_lastChild = above;
else
m_lastChild = 0;
}
TQListViewItem::takeItem(item);
}
void QueueViewItem::moveUp()
{
TQListViewItem *above = itemAbove();
if (above && above->parent() == TQListViewItem::parent()) {
TQListViewItem *previous = above->itemAbove();
if (previous && previous->parent() == TQListViewItem::parent()) {
QueueViewItem *parent = static_cast<QueueViewItem*>(TQListViewItem::parent());
moveItem(previous);
if (parent && this == parent->lastChild())
parent->m_lastChild = above;
} else {
moveToTop();
}
}
}
void QueueViewItem::moveDown()
{
QueueViewItem *parent = static_cast<QueueViewItem*>(TQListViewItem::parent());
QueueViewItem *next = static_cast<QueueViewItem*>(nextSibling());
if (next) {
moveItem(next);
if (parent && parent->lastChild() == next)
parent->m_lastChild = this;
}
}
void QueueViewItem::moveToTop()
{
QueueViewItem *parent = static_cast<QueueViewItem*>(TQListViewItem::parent());
// Just reinsert the item
if (parent) {
if (this == parent->lastChild())
parent->m_lastChild = itemAbove();
parent->TQListViewItem::takeItem(this);
parent->TQListViewItem::insertItem(this);
} else {
ListView *view = m_queueView->m_queue;
view->TQListView::takeItem(this);
view->TQListView::insertItem(this);
}
}
void QueueViewItem::moveToBottom()
{
QueueViewItem *parent = static_cast<QueueViewItem*>(TQListViewItem::parent());
// Just reinsert the item
if (parent) {
TQListViewItem *last = parent->lastChild();
parent->takeItem(this);
parent->insertItem(this);
moveItem(last);
} else {
ListView *view = m_queueView->m_queue;
view->takeItem(this);
view->insertItem(this);
}
}
void QueueViewItem::paintCell(TQPainter *p, const TQColorGroup &cg, int column, int width, int alignment)
{
TQColorGroup _cg(cg);
TQColor c = _cg.text();
TQColor n_color;
if (m_queueObject && m_queueObject->isTransfer()) {
switch (m_queueObject->getStatus()) {
case KFTPQueue::Transfer::Running: n_color.setRgb(255, 0, 0); break;
case KFTPQueue::Transfer::Connecting: n_color.setRgb(0, 0, 255); break;
case KFTPQueue::Transfer::Waiting: n_color.setRgb(0, 0, 255); break;
case KFTPQueue::Transfer::Locked: n_color.setRgb(0, 150, 0); break;
default: break;
}
}
if (n_color.isValid())
_cg.setColor(TQColorGroup::Text, n_color);
TQListViewItem::paintCell(p, _cg, column, width, alignment);
_cg.setColor(TQColorGroup::Text, c);
}
void QueueViewItem::init()
{
if (m_queueObject->isTransfer()) {
KFTPQueue::Transfer *transfer = static_cast<KFTPQueue::Transfer*>(getObject());
setText(0, transfer->getSourceUrl().fileName());
setText(1, TDEIO::convertSize(transfer->getActualSize()));
setText(2, transfer->getSourceUrl().pathOrURL());
setText(3, transfer->getDestUrl().pathOrURL());
// Icon
TQString iconText;
if (transfer->isDir()) {
iconText = "folder";
} else {
KMimeType::Ptr theType = KMimeType::findByURL("/" + transfer->getSourceUrl().path(), 0, false, true);
iconText = theType->icon(TQString::null, false);
}
setPixmap(0, loadSmallPixmap(iconText));
} else if (m_queueObject->getType() == KFTPQueue::QueueObject::Site) {
KFTPQueue::Site *site = static_cast<KFTPQueue::Site*>(getObject());
setText(0, TQString("%1:%2").arg(site->getUrl().host()).arg(site->getUrl().port()));
setText(1, TDEIO::convertSize(site->getActualSize()));
// Set the pixmap
setPixmap(0, loadSmallPixmap("server"));
}
}
void QueueViewItem::refresh()
{
if (!m_queueObject)
return;
if (m_queueObject->isTransfer()) {
KFTPQueue::Transfer *transfer = static_cast<KFTPQueue::Transfer*>(getObject());
// Speed
bool noSpeed = transfer->getStatus() == KFTPQueue::Transfer::Waiting || transfer->getStatus() == KFTPQueue::Transfer::Connecting;
TQString speed;
if ((!transfer->isDir() || !isOpen()) && transfer->isRunning() && !noSpeed) {
speed.sprintf( "%lld B/s", (transfer->getSpeed()) );
if (transfer->getSpeed() > 1024)
speed.sprintf( "%lld KB/s", (transfer->getSpeed() / 1024) );
if (transfer->getSpeed() > 1024*1024)
speed.sprintf("%lld MB/s", (transfer->getSpeed() / 1024) / 1024);
if (transfer->getSpeed() == 0 && transfer->getTransferType() != KFTPQueue::FXP)
speed = i18n("stalled");
if (transfer->getSpeed() == 0 && transfer->getTransferType() == KFTPQueue::FXP)
speed = i18n("running");
}
// ETA
TQString eta;
if (transfer->isRunning() && transfer->getSpeed() > 0) {
eta = TDEIO::convertSeconds(TDEIO::calculateRemainingSeconds(transfer->getSize(),
transfer->getCompleted(),
transfer->getSpeed()));
} else {
eta = TQString::null;
}
// Set the columns
setText(0, transfer->getSourceUrl().fileName());
setText(1, TDEIO::convertSize(transfer->getActualSize()));
setText(2, transfer->getSourceUrl().pathOrURL());
setText(3, transfer->getDestUrl().pathOrURL());
setText(5, speed);
setText(6, eta);
// Don't show the file:// for local src/dest
if (transfer->getSourceUrl().isLocalFile()) {
setText(2, transfer->getSourceUrl().path());
} else if (transfer->getDestUrl().isLocalFile()) {
setText(3, transfer->getDestUrl().path());
}
// Progress
int progress;
int r_progress;
if (transfer->getSize() == 0)
progress = 0;
else
progress = transfer->getCompleted()*100/transfer->getSize();
if (transfer->getResumed() == 0)
r_progress = 0;
else
r_progress = transfer->getResumed()*100/transfer->getSize();
if (transfer->getStatus() == KFTPQueue::Transfer::Waiting) {
// Transfer is waiting for a free connection
setText(4, i18n("Waiting for connection..."));
setPixmap(4, NULL);
} else if (transfer->getStatus() == KFTPQueue::Transfer::Connecting) {
// Transfer is not yet connected,
setText(4, i18n("Connecting..."));
setPixmap(4, NULL);
} else if (progress > 0) {
setPixmap(4, createProgressPixmap(progress, r_progress));
TQString progressText;
progressText.sprintf("%d %%", progress);
setText(4, progressText);
} else {
setPixmap(4, NULL);
setText(4, TQString::null);
}
// Icon
TQString iconText;
if (transfer->isDir()) {
iconText = "folder";
} else {
KMimeType::Ptr theType = KMimeType::findByURL("/" + transfer->getSourceUrl().path(), 0, false, true);
iconText = theType->icon(TQString::null, false);
}
setPixmap(0, loadSmallPixmap(iconText));
} else if (m_queueObject->getType() == KFTPQueue::QueueObject::Site) {
KFTPQueue::Site *site = static_cast<KFTPQueue::Site*>(getObject());
// Speed
TQString speed;
speed.sprintf( "%lld B/s", (site->getSpeed()) );
if (site->getSpeed() > 1024)
speed.sprintf( "%lld KB/s", (site->getSpeed() / 1024) );
if (site->getSpeed() > 1024*1024)
speed.sprintf("%lld MB/s", (site->getSpeed() / 1024) / 1024);
if (site->getSpeed() == 0)
speed = TQString::null;
// ETA
TQString eta;
if (site->isRunning() && site->getSpeed() > 0) {
eta = TDEIO::convertSeconds(TDEIO::calculateRemainingSeconds(site->getSize(),
site->getCompleted(),
site->getSpeed()));
} else {
eta = "";
}
// Progress
if (site->isRunning()) {
int progress = 0;
if (site->getSize() > 0)
progress = site->getCompleted()*100/site->getSize();
setPixmap(4, createProgressPixmap(progress, 0));
TQString progressText;
progressText.sprintf("%d %%", progress);
setText(4, progressText);
} else {
setPixmap(4, NULL);
setText(4, TQString::null);
}
// Set the columns
setText(0, TQString("%1:%2").arg(site->getUrl().host()).arg(site->getUrl().port()));
setText(1, TDEIO::convertSize(site->getActualSize()));
setText(5, speed);
setText(6, eta);
// Set the pixmap
setPixmap(0, loadSmallPixmap("server"));
}
}
QueueListView::QueueListView(TQWidget *parent)
: ListView(parent)
{
}
void QueueListView::insertItem(TQListViewItem *item)
{
TQListViewItem *last = lastChild();
TQListView::insertItem(item);
if (last)
item->moveItem(last);
}
QueueView::QueueView(TQWidget *parent, const char *name)
: TQWidget(parent, name)
{
TQVBoxLayout *layout = new TQVBoxLayout(this);
m_toolBar = new TDEToolBar(this, "queueToolBar");
m_toolBar->setIconSize(16);
layout->addWidget(m_toolBar);
m_searchToolBar = new TDEToolBar(this, "searchToolBar");
m_searchToolBar->setEnableContextMenu(false);
m_searchToolBar->setMovingEnabled(false);
m_searchToolBar->setFullSize(true);
// Create the erase button
m_searchToolBar->insertButton(TQApplication::reverseLayout() ? "clear_left" :"locationbar_erase", 0, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotSearchEraseClicked()), true);
// Create the labels
TQLabel *searchLabel = new TQLabel(i18n("Filter: "), m_searchToolBar);
m_searchToolBar->insertWidget(1, 35, searchLabel);
// Create the list view
m_queue = new QueueListView(this);
// Create the search field
m_searchField = new TDEListViewSearchLine(m_searchToolBar, m_queue);
// Do some more stuff
m_searchToolBar->setItemAutoSized(1, true);
m_searchToolBar->setStretchableWidget(m_searchField);
m_searchToolBar->updateRects(true);
m_searchToolBar->hide();
layout->addWidget(m_searchToolBar);
// Create the columns
m_queue->addColumn(i18n("Name"), 150);
m_queue->addColumn(i18n("Size"), 75);
m_queue->addColumn(i18n("Source"), 250);
m_queue->addColumn(i18n("Destination"), 250);
m_queue->addColumn(i18n("Progress"), 140);
m_queue->addColumn(i18n("Speed"), 70);
m_queue->addColumn(i18n("ETA"), 80);
// Text when there is nothing queued
m_queue->setEmptyListText(i18n("You do not have any files in the queue."));
// Multi-select
m_queue->setSelectionModeExt(TDEListView::FileManager);
m_queue->setAllColumnsShowFocus(true);
m_queue->setRootIsDecorated(true);
m_queue->TQListView::setSorting(-1);
m_queue->TQListView::setSortColumn(-1);
layout->addWidget(m_queue);
// The signals
connect(m_queue, TQ_SIGNAL(contextMenu(TDEListView*, TQListViewItem*, const TQPoint&)), this,
TQ_SLOT(contextMenuRequested(TDEListView*, TQListViewItem*, const TQPoint&)));
connect(m_queue, TQ_SIGNAL(selectionChanged()), this, TQ_SLOT(updateActions()));
// Let us be up-to-date
connect(KFTPQueue::Manager::self(), TQ_SIGNAL(transferRemoved(long)), this, TQ_SLOT(slotObjectRemoved(long)));
connect(KFTPQueue::Manager::self(), TQ_SIGNAL(siteRemoved(long)), this, TQ_SLOT(slotObjectRemoved(long)));
connect(KFTPQueue::Manager::self(), TQ_SIGNAL(newTransfer(KFTPQueue::Transfer*)), this, TQ_SLOT(slotTransferAdded(KFTPQueue::Transfer*)));
connect(KFTPQueue::Manager::self(), TQ_SIGNAL(newSite(KFTPQueue::Site*)), this, TQ_SLOT(slotSiteAdded(KFTPQueue::Site*)));
connect(KFTPQueue::Manager::self(), TQ_SIGNAL(queueUpdate()), this, TQ_SLOT(updateActions()));
// Load the listview layout
loadLayout();
// Create the context menu actions
initActions();
initToolBar();
updateActions();
setMinimumHeight(150);
}
void QueueView::saveLayout()
{
m_queue->saveLayout(kapp->config(), "queueViewLayout");
}
void QueueView::loadLayout()
{
m_queue->restoreLayout(kapp->config(), "queueViewLayout");
}
void QueueView::initToolBar()
{
// Plug all actions
m_loadAction->plug(m_toolBar);
m_saveAction->plug(m_toolBar);
m_toolBar->insertSeparator();
m_startAction->plug(m_toolBar);
m_pauseAction->plug(m_toolBar);
m_stopAction->plug(m_toolBar);
m_toolBar->insertSeparator();
m_addAction->plug(m_toolBar);
m_removeAction->plug(m_toolBar);
m_searchAction->plug(m_toolBar);
m_toolBar->insertSeparator();
m_filterAction->plug(m_toolBar);
// Create speed control widgets
m_toolBar->insertSeparator();
TQSpinBox *downloadSpeed = new TQSpinBox(0, 10240, 1, m_toolBar);
TQToolTip::add(downloadSpeed, i18n("Limit download transfer speed"));
m_toolBar->insertWidget(1, 35, new TQLabel(i18n("Down: "), m_toolBar));
m_toolBar->insertWidget(2, 35, downloadSpeed);
downloadSpeed->setValue(Config::downloadSpeedLimit());
connect(downloadSpeed, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotDownloadLimitChanged(int)));
m_toolBar->insertSeparator();
TQSpinBox *uploadSpeed = new TQSpinBox(0, 10240, 1, m_toolBar);
TQToolTip::add(uploadSpeed, i18n("Limit upload transfer speed"));
m_toolBar->insertWidget(3, 35, new TQLabel(i18n("Up: "), m_toolBar));
m_toolBar->insertWidget(4, 35, uploadSpeed);
uploadSpeed->setValue(Config::uploadSpeedLimit());
connect(uploadSpeed, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotUploadLimitChanged(int)));
// Create thread count control widget
m_toolBar->insertSeparator();
TQSpinBox *threadCount = new TQSpinBox(1, 10, 1, m_toolBar);
TQToolTip::add(threadCount, i18n("Per-session transfer thread count"));
m_toolBar->insertWidget(5, 35, new TQLabel(i18n("Threads: "), m_toolBar));
m_toolBar->insertWidget(6, 35, threadCount);
threadCount->setValue(Config::threadCount());
connect(threadCount, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(slotThreadCountChanged(int)));
}
void QueueView::slotDownloadLimitChanged(int value)
{
Config::setDownloadSpeedLimit(value);
Config::self()->emitChange();
}
void QueueView::slotUploadLimitChanged(int value)
{
Config::setUploadSpeedLimit(value);
Config::self()->emitChange();
}
void QueueView::slotThreadCountChanged(int value)
{
Config::setThreadCount(value);
Config::self()->emitChange();
}
void QueueView::initActions()
{
m_actionCollection = new TDEActionCollection(this, this);
// Create all the actions
m_launchAction = new TDEAction(i18n("&Start Transfer"), "launch", TDEShortcut(), this, TQ_SLOT(slotLaunch()), m_actionCollection, "launch");
m_abortAction = new TDEAction(i18n("&Abort Transfer"), TDEShortcut(), this, TQ_SLOT(slotAbort()), m_actionCollection, "abort");
m_removeAction = new TDEAction(i18n("&Remove"), "edit-delete", TDEShortcut(TQt::Key_Delete), this, TQ_SLOT(slotRemove()), m_actionCollection, "remove");
m_removeAllAction = new TDEAction(i18n("Remove &All"), TDEShortcut(), this, TQ_SLOT(slotRemoveAll()), m_actionCollection, "removeAll");
m_moveUpAction = new TDEAction(i18n("Move &Up"), "go-up", TDEShortcut(), this, TQ_SLOT(slotMoveUp()), m_actionCollection, "moveUp");
m_moveDownAction = new TDEAction(i18n("Move &Down"), "go-down", TDEShortcut("del"), this, TQ_SLOT(slotMoveDown()), m_actionCollection, "moveDown");
m_moveTopAction = new TDEAction(i18n("Move To &Top"), "go-top", TDEShortcut(), this, TQ_SLOT(slotMoveTop()), m_actionCollection, "moveTop");
m_moveBottomAction = new TDEAction(i18n("Move To &Bottom"), "go-bottom", TDEShortcut(), this, TQ_SLOT(slotMoveBottom()), m_actionCollection, "moveBottom");
m_editAction = new TDEAction(i18n("&Change Transfer Info"), TDEShortcut(), this, TQ_SLOT(slotEdit()), m_actionCollection, "changeTransfer");
// Create the toolbar actions
m_loadAction = new TDEAction(i18n("&Load Queue From File"), "document-open", TDEShortcut(), this, TQ_SLOT(slotLoad()), m_actionCollection, "load");
m_saveAction = new TDEAction(i18n("&Save Queue to File"), "document-save-as", TDEShortcut(), this, TQ_SLOT(slotSave()), m_actionCollection, "save");
m_startAction = new TDEAction(i18n("S&tart"), "media-playback-start", TDEShortcut(), this, TQ_SLOT(slotStart()), m_actionCollection, "start");
m_pauseAction = new TDEAction(i18n("&Pause"), "media-playback-pause", TDEShortcut(), this, TQ_SLOT(slotPause()), m_actionCollection, "pause");
m_stopAction = new TDEAction(i18n("St&op"), "media-playback-stop", TDEShortcut(), this, TQ_SLOT(slotStop()), m_actionCollection, "stop");
m_addAction = new TDEAction(i18n("&Add Transfer..."), "document-new", TDEShortcut(), this, TQ_SLOT(slotAdd()), m_actionCollection, "add");
m_searchAction = new TDEAction(i18n("&Search && Replace..."), "edit-find", TDEShortcut(), this, TQ_SLOT(slotSearch()), m_actionCollection, "search");
m_filterAction = new TDEToggleAction(i18n("Show &Filter"), "filter", TDEShortcut(), this, TQ_SLOT(slotFilter()), m_actionCollection, "filter");
m_saveAction->setEnabled( false );
m_startAction->setEnabled(false);
m_pauseAction->setEnabled(false);
m_stopAction->setEnabled(false);
m_addAction->setEnabled(false);
m_removeAction->setEnabled(false);
m_searchAction->setEnabled(false);
m_filterAction->setEnabled(true);
}
void QueueView::updateActions()
{
m_startAction->setEnabled(!KFTPQueue::Manager::self()->isProcessing() && KFTPQueue::Manager::self()->topLevelObject()->hasChildren() && !KFTPQueue::Manager::self()->getNumRunning());
m_stopAction->setEnabled(KFTPQueue::Manager::self()->isProcessing());
m_removeAllAction->setEnabled(!KFTPQueue::Manager::self()->isProcessing());
TQPtrList<TQListViewItem> selection = m_queue->selectedItems();
QueueViewItem *firstItem = static_cast<QueueViewItem*>(selection.first());
m_removeAction->setEnabled((bool) firstItem);
if (!firstItem || !firstItem->getObject())
return;
bool locked = firstItem->getObject()->isLocked();
bool parentRunning = false;
if (firstItem->getObject()->hasParentObject())
parentRunning = firstItem->getObject()->parentObject()->isRunning();
m_launchAction->setEnabled(!firstItem->getObject()->isRunning() && !KFTPQueue::Manager::self()->isProcessing() && !locked);
m_abortAction->setEnabled(firstItem->getObject()->isRunning() && !KFTPQueue::Manager::self()->isProcessing());
m_removeAction->setEnabled(!firstItem->getObject()->isRunning() && !KFTPQueue::Manager::self()->isProcessing() && !locked);
m_editAction->setEnabled(!firstItem->getObject()->isRunning() && firstItem->getObject()->parentObject()->getType() == KFTPQueue::QueueObject::Site && !locked);
// Only allow moving of multi selections if they have the same parent
bool allowMove = true;
for (TQListViewItem *i = selection.first(); i; i = selection.next()) {
if (i->parent() != static_cast<TQListViewItem*>(firstItem)->parent()) {
allowMove = false;
break;
}
}
m_moveUpAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedUp(firstItem->getObject()) && !locked);
m_moveDownAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedDown(static_cast<QueueViewItem*>(selection.last())->getObject()) && !locked);
m_moveTopAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedUp(firstItem->getObject()) && !locked);
m_moveBottomAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedDown(static_cast<QueueViewItem*>(selection.last())->getObject()) && !locked);
}
void QueueView::slotSiteAdded(KFTPQueue::Site *site)
{
// The site should be inserted top-level
m_queuedItems.insert(site->getId(), new QueueViewItem(this, site, m_queue));
connect(site, TQ_SIGNAL(objectUpdated()), this, TQ_SLOT(slotObjectUpdated()));
}
void QueueView::slotTransferAdded(KFTPQueue::Transfer *transfer)
{
// This transfer should be inserted under some other transfer
QueueViewItem *parent = m_queuedItems.find(transfer->parentObject()->getId());
if (parent) {
m_queuedItems.insert(transfer->getId(), new QueueViewItem(this, transfer, parent));
connect(transfer, TQ_SIGNAL(objectUpdated()), this, TQ_SLOT(slotObjectUpdated()));
}
// Update actions
m_saveAction->setEnabled(true);
m_removeAllAction->setEnabled(true);
m_searchAction->setEnabled(true);
}
void QueueView::slotObjectRemoved(long id)
{
// Delete the transfer
QueueViewItem *item = m_queuedItems.find(id);
if (item)
delete item;
// Update actions
bool empty = (m_queue->childCount() == 0);
m_saveAction->setEnabled(!empty);
if (empty) m_removeAction->setEnabled(false);
m_removeAllAction->setEnabled(!empty);
m_searchAction->setEnabled(!empty);
}
void QueueView::slotObjectUpdated()
{
KFTPQueue::QueueObject *object = (KFTPQueue::QueueObject*) TQObject::sender();
if (object) {
QueueViewItem *item = m_queuedItems.find(object->getId());
if (item)
item->refresh();
}
}
void QueueView::contextMenuRequested(TDEListView*, TQListViewItem* item, const TQPoint& p)
{
if (!item)
return;
QueueViewItem *firstItem = static_cast<QueueViewItem*>(m_queue->selectedItems().first());
TDEPopupMenu *contextMenu = new TDEPopupMenu(m_queue);
// Populate context menu
if (firstItem->getObject()->isTransfer()) {
contextMenu->insertTitle(item->text(0) + ((m_queue->selectedItems().count() > 1) ? "..." : "" ));
m_launchAction->plug(contextMenu);
m_abortAction->plug(contextMenu);
contextMenu->insertSeparator();
m_removeAction->plug(contextMenu);
m_removeAllAction->plug(contextMenu);
contextMenu->insertSeparator();
m_moveTopAction->plug(contextMenu);
m_moveUpAction->plug(contextMenu);
m_moveDownAction->plug(contextMenu);
m_moveBottomAction->plug(contextMenu);
contextMenu->insertSeparator();
m_editAction->plug(contextMenu);
} else if (firstItem->getObject()->getType() == KFTPQueue::QueueObject::Site) {
contextMenu->insertTitle(i18n("Site"));
m_launchAction->plug(contextMenu);
m_abortAction->plug(contextMenu);
contextMenu->insertSeparator();
m_moveUpAction->plug(contextMenu);
m_moveDownAction->plug(contextMenu);
}
// Update the actions
updateActions();
// Show the context menu
contextMenu->exec(p);
}
void QueueView::slotLaunch()
{
// Reset a possible preconfigured default action
KFTPQueue::Manager::self()->setDefaultFileExistsAction();
static_cast<QueueViewItem*>(m_queue->selectedItems().first())->getObject()->execute();
}
void QueueView::slotAbort()
{
static_cast<QueueViewItem*>(m_queue->selectedItems().first())->getObject()->abort();
}
void QueueView::slotRemove()
{
if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove queued file(s)?")) == KMessageBox::Yes) {
KFTPQueue::Manager::self()->setEmitUpdate(false);
TQPtrList<TQListViewItem> selection = m_queue->selectedItems();
for (TQListViewItem *item = selection.first(); item; item = selection.next()) {
if (item && static_cast<QueueViewItem*>(item)->getObject())
KFTPQueue::Manager::self()->removeTransfer(static_cast<KFTPQueue::Transfer*>(static_cast<QueueViewItem*>(item)->getObject()));
}
KFTPQueue::Manager::self()->setEmitUpdate(true);
KFTPQueue::Manager::self()->doEmitUpdate();
}
}
void QueueView::slotRemoveAll()
{
if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove ALL queued files?")) == KMessageBox::Yes) {
KFTPQueue::Manager::self()->clearQueue();
}
}
void QueueView::slotMoveUp()
{
TQPtrList<TQListViewItem> selection = m_queue->selectedItems();
for (TQListViewItem *item = selection.first(); item; item = selection.next()) {
QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
// Move the transfer
KFTPQueue::Manager::self()->moveTransferUp(queueItem->getObject());
queueItem->moveUp();
}
}
void QueueView::slotMoveDown()
{
TQPtrList<TQListViewItem> selection = m_queue->selectedItems();
for (TQListViewItem *item = selection.last(); item; item = selection.prev()) {
QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
// Move the transfer
KFTPQueue::Manager::self()->moveTransferDown(queueItem->getObject());
queueItem->moveDown();
}
}
void QueueView::slotMoveTop()
{
TQPtrList<TQListViewItem> selection = m_queue->selectedItems();
for (TQListViewItem *item = selection.last(); item; item = selection.prev()) {
QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
// Move the transfer
KFTPQueue::Manager::self()->moveTransferTop(queueItem->getObject());
queueItem->moveToTop();
}
}
void QueueView::slotMoveBottom()
{
TQPtrList<TQListViewItem> selection = m_queue->selectedItems();
for (TQListViewItem *item = selection.first(); item; item = selection.next()) {
QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
// Move the transfer
KFTPQueue::Manager::self()->moveTransferBottom(queueItem->getObject());
queueItem->moveToBottom();
}
}
void QueueView::slotEdit()
{
QueueEditor *editor = new QueueEditor(this);
QueueViewItem* item = static_cast<QueueViewItem*>(m_queue->selectedItems().first());
editor->setData(static_cast<KFTPQueue::Transfer*>(item->getObject()));
// Show the queue editor
if (editor->exec() == TQDialog::Accepted) {
editor->saveData();
KFTPQueue::Manager::self()->revalidateTransfer(static_cast<KFTPQueue::Transfer*>(item->getObject()));
KFTPQueue::Manager::self()->doEmitUpdate();
item->refresh();
}
}
void QueueView::slotSearch()
{
SearchDialog *dialog = new SearchDialog();
dialog->exec();
delete dialog;
}
void QueueView::slotLoad()
{
if (m_queue->childCount() && KMessageBox::warningContinueCancel(0L, i18n("Loading a new queue will overwrite the existing one; are you sure you want to continue?"), i18n("Load Queue")) == KMessageBox::Cancel)
return;
TQString loadPath = KFileDialog::getOpenFileName();
if (!loadPath.isEmpty()) {
KFTPQueue::Manager::self()->getConverter()->importQueue(loadPath);
}
}
void QueueView::slotSave()
{
TQString savePath = KFileDialog::getSaveFileName();
if (!savePath.isEmpty()) {
KFTPQueue::Manager::self()->getConverter()->exportQueue(savePath);
}
}
void QueueView::slotStart()
{
// Begin queue processing
KFTPQueue::Manager::self()->start();
}
void QueueView::slotPause()
{
}
void QueueView::slotStop()
{
// Abort queue processing
KFTPQueue::Manager::self()->abort();
}
void QueueView::slotAdd()
{
}
void QueueView::slotSearchEraseClicked()
{
m_searchField->clear();
}
void QueueView::slotFilter()
{
if (m_filterAction->isChecked())
m_searchToolBar->show();
else
m_searchToolBar->hide();
}
}
#include "queueview.moc"