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/browser/actions.cpp

765 lines
25 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>
*
* 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 "browser/actions.h"
#include "browser/view.h"
#include "browser/detailsview.h"
#include "browser/propsplugin.h"
#include "browser/filterwidget.h"
#include "widgets/quickconnect.h"
#include "widgets/popupmessage.h"
#include "kftpbookmarks.h"
#include "kftpqueue.h"
#include "kftpapi.h"
#include "kftpsession.h"
#include "verifier.h"
#include "mainactions.h"
#include "misc.h"
#include "misc/kftpconfig.h"
#include "misc/filter.h"
#include "misc/customcommands/manager.h"
#include <tdeglobal.h>
#include <kcharsets.h>
#include <tdeapplication.h>
#include <tdemainwindow.h>
#include <tdelocale.h>
#include <tdemessagebox.h>
#include <tdepopupmenu.h>
#include <kinputdialog.h>
#include <kpropertiesdialog.h>
#include <tdeio/job.h>
#include <kshred.h>
#include <klineedit.h>
#include <tdefiledialog.h>
#include <kstandarddirs.h>
#include <ntqdir.h>
#include <ntqclipboard.h>
using namespace KFTPGrabberBase;
using namespace KFTPEngine;
using namespace KFTPCore;
using namespace KFTPCore::Filter;
namespace KFTPWidgets {
namespace Browser {
Actions::Actions(View *parent)
: TQObject(parent),
m_view(parent)
{
}
void Actions::initActions()
{
m_actionCollection = new TDEActionCollection(m_view, this);
// Create all the actions
m_goUpAction = KStdAction::up(this, SLOT(slotGoUp()), m_actionCollection, "go_up");
m_goBackAction = KStdAction::back(this, SLOT(slotGoBack()), m_actionCollection, "go_back");
m_goForwardAction = KStdAction::forward(this, SLOT(slotGoForward()), m_actionCollection, "go_forward");
m_goHomeAction = KStdAction::home(this, SLOT(slotGoHome()), m_actionCollection, "go_home");
m_reloadAction = KStdAction::redisplay(this, SLOT(slotReload()), m_actionCollection, "reload");
m_reloadAction->setText(i18n("&Reload"));
m_reloadAction->setShortcut(TDEShortcut(TQt::Key_F5));
m_abortAction = new TDEAction(i18n("&Abort"), "process-stop", TDEShortcut(), this, SLOT(slotAbort()), m_actionCollection, "abort");
m_toggleTreeViewAction = new TDEToggleAction(i18n("&Show Tree View"), "view_tree", TDEShortcut(), this, SLOT(slotShowHideTree()), m_actionCollection, "toggle_tree_view");
m_toggleFilterAction = new TDEToggleAction(i18n("Show &Filter"), "filter", TDEShortcut(), this, SLOT(slotShowHideFilter()), m_actionCollection, "toggle_filter");
m_renameAction = new TDEAction(i18n("&Rename"), TDEShortcut(TQt::Key_F2), this, SLOT(slotRename()), m_actionCollection, "edit_rename");
m_deleteAction = new TDEAction(i18n("&Delete"), "edit-delete", TDEShortcut(TQt::Key_Delete), this, SLOT(slotDelete()), m_actionCollection, "edit_delete");
m_propsAction = new TDEAction(i18n("&Properties"), TDEShortcut(), this, SLOT(slotProps()), m_actionCollection, "edit_properties");
m_shredAction = new TDEAction(i18n("&Shred"), "editshred", TDEShortcut(), this, SLOT(slotShred()), m_actionCollection, "edit_shred");
m_copyAction = KStdAction::copy(this, SLOT(slotCopy()), m_actionCollection, "edit_copy");
m_pasteAction = KStdAction::paste(this, SLOT(slotPaste()), m_actionCollection, "edit_paste");
m_filterActions = new TDEActionMenu(i18n("&Filter Options"), "", m_actionCollection, "edit_filter_options");
m_alwaysSkipAction = new TDEAction(i18n("Always &skip this file when queuing"), TDEShortcut(), this, SLOT(slotAlwaysSkip()), m_actionCollection);
m_topPriorityAction = new TDEAction(i18n("Make this file &top priority"), TDEShortcut(), this, SLOT(slotTopPriority()), m_actionCollection);
m_lowPriorityAction = new TDEAction(i18n("Make this file &lowest priority"), TDEShortcut(), this, SLOT(slotLowPriority()), m_actionCollection);
m_filterActions->insert(m_alwaysSkipAction);
m_filterActions->insert(m_topPriorityAction);
m_filterActions->insert(m_lowPriorityAction);
m_transferAction = new TDEAction(i18n("&Transfer"), TDEShortcut(), this, SLOT(slotTransfer()), m_actionCollection, "transfer");
m_queueTransferAction = new TDEAction(i18n("&Queue Transfer"), "queue", TDEShortcut(), this, SLOT(slotQueueTransfer()), m_actionCollection, "queue_transfer");
m_createDirAction = new TDEAction(i18n("&Create Directory..."), "folder-new", TDEShortcut(), this, SLOT(slotCreateDir()), m_actionCollection, "create_dir");
m_fileEditAction = new TDEAction(i18n("&Open file"), "document-open", TDEShortcut(), this, SLOT(slotFileEdit()), m_actionCollection, "open_file");
m_verifyAction = new TDEAction(i18n("&Verify..."), "ok", TDEShortcut(), this, SLOT(slotVerify()), m_actionCollection, "verify");
populateEncodings();
m_moreActions = new TDEActionMenu(i18n("&More Actions"), "configure", this);
m_rawCmdAction = new TDEAction(i18n("&Manual Command Entry..."), "openterm", TDEShortcut(), this, SLOT(slotRawCmd()), m_actionCollection, "send_raw_cmd");
m_exportListingAction = new TDEAction(i18n("&Export Directory Listing..."), "", TDEShortcut(), this, SLOT(slotExportListing()), m_actionCollection, "export_listing");
m_showHiddenFilesAction = new TDEToggleAction(i18n("Show &Hidden Files && Directories"), TDEShortcut(), this, SLOT(slotShowHiddenFiles()), m_actionCollection, "show_hidden");
m_openExternalAction = new TDEAction(i18n("Open current directory in &Konqueror..."), "konqueror", TDEShortcut(), this, SLOT(slotOpenExternal()), m_actionCollection, "open_konqi");
m_markItemsAction = new TDEAction(i18n("Compare &selected items"), "", TDEShortcut(TQt::Key_Space), this, SLOT(slotMarkItems()), m_actionCollection, "compare_selected");
m_compareAction = new TDEAction(i18n("Compare &directories"), "", TDEShortcut(), this, SLOT(slotCompare()), m_actionCollection, "compare_dirs");
m_showHiddenFilesAction->setChecked(KFTPCore::Config::showHiddenFiles());
m_rawCommandsMenu = CustomCommands::Manager::self()->categories(i18n("Send &Raw Command"), m_view->getSession());
m_rawCommandsMenu->insert(m_rawCmdAction, 0);
m_rawCommandsMenu->popupMenu()->insertSeparator(1);
m_moreActions->insert(m_rawCommandsMenu);
m_moreActions->insert(m_changeEncodingAction);
m_moreActions->popupMenu()->insertSeparator();
m_moreActions->insert(m_exportListingAction);
m_moreActions->insert(m_openExternalAction);
m_moreActions->insert(m_markItemsAction);
m_moreActions->insert(m_compareAction);
m_moreActions->popupMenu()->insertSeparator();
m_moreActions->insert(m_showHiddenFilesAction);
m_moreActions->setStickyMenu(true);
m_moreActions->setDelayed(false);
m_siteChangeAction = new TDEActionMenu(i18n("&Change Site"), "goto", this);
m_quickConnectAction = new TDEAction(i18n("&Quick Connect..."), "connect_creating", TDEShortcut(), this, SLOT(slotQuickConnect()), m_actionCollection, "quick_connect");
m_connectAction = new TDEActionMenu(i18n("&Connect To"), this);
m_disconnectAction = new TDEAction(i18n("&Disconnect"), "connect_no", TDEShortcut(), this, SLOT(slotDisconnect()), m_actionCollection, "disconnect");
m_siteChangeAction->insert(m_quickConnectAction);
m_siteChangeAction->insert(m_connectAction);
m_siteChangeAction->insert(m_disconnectAction);
m_siteChangeAction->setStickyMenu(true);
m_siteChangeAction->setDelayed(false);
// Populate bookmarks
KFTPBookmarks::Manager::self()->guiPopulateBookmarksMenu(m_connectAction, TQDomNode(), false, m_view->m_session);
}
void Actions::populateEncodings()
{
// Charsets
m_changeEncodingAction = new TDEActionMenu(i18n("Change Remote &Encoding"), "charset", m_actionCollection, "changeremoteencoding");
m_changeEncodingAction->setDelayed(false);
TDEPopupMenu *menu = m_changeEncodingAction->popupMenu();
menu->clear();
TQStringList charsets = TDEGlobal::charsets()->descriptiveEncodingNames();
int count = 0;
for (TQStringList::iterator i = charsets.begin(); i != charsets.end(); ++i)
menu->insertItem(*i, this, SLOT(slotCharsetChanged(int)), 0, ++count);
menu->insertSeparator();
menu->insertItem(i18n("Default"), this, SLOT(slotCharsetReset(int)), 0, ++count);
menu->setItemChecked(count, true);
m_defaultCharsetOption = count;
m_curCharsetOption = count;
}
void Actions::updateActions()
{
m_goUpAction->setEnabled(m_view->url().upURL() != m_view->url());
// History
int index = 0;
const TQValueList<LocationNavigator::Element> list = m_view->history(index);
m_goBackAction->setEnabled(index < static_cast<int>(list.count()) - 1);
m_goForwardAction->setEnabled(index > 0);
m_abortAction->setEnabled(m_view->m_ftpClient->socket()->isBusy());
m_toggleTreeViewAction->setEnabled(true);
m_toggleFilterAction->setEnabled(true);
m_quickConnectAction->setEnabled(m_view->url().isLocalFile());
m_connectAction->setEnabled(true);
m_disconnectAction->setEnabled(m_view->m_ftpClient->socket()->isConnected());
const KFileItemList *selectedItems = m_view->selectedItems();
if (selectedItems->count() == 1) {
m_fileEditAction->setEnabled(!selectedItems->getFirst()->isDir());
m_verifyAction->setEnabled(selectedItems->getFirst()->isLocalFile() && selectedItems->getFirst()->name(true).right(3) == "sfv");
} else {
m_fileEditAction->setEnabled(false);
m_verifyAction->setEnabled(false);
}
// Check if we can transfer anything
KFTPSession::Session *session = m_view->m_session;
KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
m_renameAction->setEnabled(session->isConnected());
m_deleteAction->setEnabled(session->isConnected());
m_propsAction->setEnabled(true);
m_shredAction->setEnabled(!session->isRemote());
m_copyAction->setEnabled(true);
m_pasteAction->setEnabled(true);
if ((!session->isRemote() && !opposite->isRemote()) ||
(
(session->isRemote() && opposite->isRemote()) &&
(
session->getClient()->socket()->protocolName() != opposite->getClient()->socket()->protocolName() ||
!(session->getClient()->socket()->features() & SF_FXP_TRANSFER)
)
)
) {
m_queueTransferAction->setEnabled(false);
m_transferAction->setEnabled(false);
} else {
m_queueTransferAction->setEnabled(true);
m_transferAction->setEnabled(true);
}
if (!session->isRemote() || session->getClient()->socket()->isConnected())
m_createDirAction->setEnabled(true);
else
m_createDirAction->setEnabled(false);
m_changeEncodingAction->setEnabled(session->isRemote());
m_rawCmdAction->setEnabled(!m_view->url().isLocalFile() && m_view->m_ftpClient->socket()->features() & SF_RAW_COMMAND);
m_rawCommandsMenu->setEnabled(m_rawCmdAction->isEnabled());
m_openExternalAction->setEnabled(!session->isRemote());
}
void Actions::slotGoUp()
{
m_view->goUp();
}
void Actions::slotGoBack()
{
m_view->goBack();
}
void Actions::slotGoForward()
{
m_view->goForward();
}
void Actions::slotReload()
{
m_view->reload();
}
void Actions::slotGoHome()
{
m_view->goHome();
}
void Actions::slotQuickConnect()
{
// Create/get the new dialog
QuickConnectDialog *quickConnect = new QuickConnectDialog(m_view);
if (quickConnect->exec() == KDialogBase::Accepted) {
// Get the url and connect
if (m_view->m_ftpClient->socket()->isConnected()) {
if (KFTPCore::Config::confirmDisconnects() && KMessageBox::warningYesNo(0, i18n("Do you want to drop current connection?")) == KMessageBox::No)
return;
m_view->m_session->disconnectAllConnections();
}
m_view->m_session->setSite(0);
quickConnect->setupClient(m_view->m_ftpClient);
m_view->m_ftpClient->connect(quickConnect->getUrl());
}
delete quickConnect;
}
void Actions::slotDisconnect()
{
if (m_view->m_ftpClient->socket()->isConnected()) {
if (KFTPCore::Config::confirmDisconnects() && KMessageBox::warningYesNo(0, i18n("Do you want to drop current connection?")) == KMessageBox::No)
return;
m_view->m_session->disconnectAllConnections();
}
}
void Actions::slotShred()
{
// Shred the file
if (KMessageBox::warningContinueCancel(0, i18n("Are you sure you want to SHRED this file?"), i18n("Shred File"),KGuiItem(i18n("&Shred"), "editshred")) == KMessageBox::Cancel)
return;
KShred::shred(m_view->selectedItems()->getFirst()->url().path());
}
void Actions::slotRename()
{
KFTPWidgets::Browser::DetailsView *view = m_view->getDetailsView();
// Rename the first file in the current selection
view->rename(view->TDEListView::selectedItems().at(0), 0);
// Enhanced rename: Don't highlight the file extension. (from Konqueror)
KLineEdit *le = view->renameLineEdit();
if (le) {
const TQString txt = le->text();
TQString pattern;
KMimeType::diagnoseFileName(txt, pattern);
if (!pattern.isEmpty() && pattern.at(0) == '*' && pattern.find('*',1) == -1)
le->setSelection(0, txt.length()-pattern.stripWhiteSpace().length()+1);
else {
int lastDot = txt.findRev('.');
if (lastDot > 0)
le->setSelection(0, lastDot);
}
}
}
void Actions::slotDelete()
{
KFTPSession::Session *session = m_view->getSession();
// Delete a file or directory
KURL::List selection = m_view->selectedURLs();
KURL::List::ConstIterator i = selection.begin();
TQStringList prettyList;
for (; i != selection.end(); ++i) {
prettyList.append((*i).pathOrURL());
}
if (KMessageBox::warningContinueCancelList(0,
i18n("Do you really want to delete this item?", "Do you really want to delete these %n items?", prettyList.count()),
prettyList,
i18n("Delete Files"),
KStdGuiItem::del(),
TQString::null,
KMessageBox::Dangerous) == KMessageBox::Cancel)
return;
// Go trough all files and delete them
if (!session->isRemote()) {
TDEIO::del(selection);
} else {
KURL::List::Iterator end(selection.end());
for (KURL::List::Iterator i(selection.begin()); i != end; ++i) {
if (!(*i).isLocalFile())
session->getClient()->remove(KURL((*i).url()));
}
}
}
void Actions::slotCopy()
{
TQClipboard *cb = TQApplication::clipboard();
cb->setData(m_view->getDetailsView()->dragObject(), TQClipboard::Clipboard);
}
void Actions::slotPaste()
{
// Decode the data and try to init transfer
TDEIO::MetaData p_meta;
KURL::List p_urls;
if (KURLDrag::decode(TQApplication::clipboard()->data(), p_urls, p_meta)) {
// Add destination url and call the QueueManager
p_meta.insert("DestURL", m_view->url().url());
KURLDrag *drag = new KURLDrag(p_urls, p_meta, m_view, name());
KFTPQueue::Manager::self()->insertTransfer(drag);
}
}
void Actions::slotProps()
{
// Show file properties
const KFileItemList *selectedItems = m_view->selectedItems();
KFileItem *item = selectedItems->getFirst();
if (selectedItems->count() == 0) {
if (m_view->url().isLocalFile())
item = new KFileItem(m_view->url(), 0, 0);
else
return;
}
// Show the dialog
KPropertiesDialog *propsDialog;
if (item->isLocalFile()) {
if (selectedItems->count() == 0)
propsDialog = new KPropertiesDialog(item);
else
propsDialog = new KPropertiesDialog(*selectedItems);
} else {
propsDialog = new KPropertiesDialog(item->name());
propsDialog->insertPlugin(new KFTPWidgets::Browser::PropsPlugin(propsDialog, *selectedItems));
propsDialog->insertPlugin(new KFTPWidgets::Browser::PermissionsPropsPlugin(propsDialog, *selectedItems, m_view->getSession()));
}
propsDialog->exec();
}
void Actions::addPriorityItems(int priority)
{
// Add the files to skiplist
KURL::List selection = m_view->selectedURLs();
KURL::List::Iterator end(selection.end());
for (KURL::List::Iterator i(selection.begin()); i != end; ++i) {
Rule *rule = new Rule();
if (priority == 0) {
rule->setName(i18n("Skip '%1'").arg((*i).filename()));
const_cast<ConditionChain*>(rule->conditions())->append(new Condition(Filename, Condition::Is, (*i).filename()));
const_cast<ActionChain*>(rule->actions())->append(new Action(Action::Skip, TQVariant()));
} else {
rule->setName(i18n("Priority '%1'").arg((*i).filename()));
const_cast<ConditionChain*>(rule->conditions())->append(new Condition(Filename, Condition::Is, (*i).filename()));
const_cast<ActionChain*>(rule->actions())->append(new Action(Action::Priority, priority));
}
Filters::self()->append(rule);
}
}
void Actions::slotAlwaysSkip()
{
addPriorityItems(0);
}
void Actions::slotTopPriority()
{
addPriorityItems(1);
}
void Actions::slotLowPriority()
{
addPriorityItems(-1);
}
void Actions::slotTransfer()
{
// Queue a transfer
KFileItemList list(*m_view->selectedItems());
KFileItemListIterator i(list);
KFileItem *item;
KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
KFTPQueue::Transfer *transfer = 0L;
while ((item = i.current()) != 0) {
KURL destinationUrl = opposite->getFileView()->url();
destinationUrl.addPath(item->name());
transfer = KFTPQueue::Manager::self()->spawnTransfer(
item->url(),
destinationUrl,
item->size(),
item->isDir(),
list.count() == 1,
true,
0L,
true
);
++i;
}
// Execute transfer
if (transfer)
static_cast<KFTPQueue::Site*>(transfer->parentObject())->delayedExecute();
}
void Actions::slotQueueTransfer()
{
// Queue a transfer
KFileItemList list(*m_view->selectedItems());
KFileItemListIterator i(list);
KFileItem *item;
KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
while ((item = i.current()) != 0) {
KURL destinationUrl = opposite->getFileView()->url();
destinationUrl.addPath(item->name());
KFTPQueue::Manager::self()->spawnTransfer(
item->url(),
destinationUrl,
item->size(),
item->isDir(),
list.count() == 1,
true,
0L,
list.count() > 1
);
++i;
}
}
void Actions::slotCreateDir()
{
// Create new directory
bool ok;
TQString newDirName = KInputDialog::getText(i18n("Create Directory"), i18n("Directory name:"), "", &ok);
if (ok) {
KURL url = m_view->url();
url.addPath(newDirName);
if (url.isLocalFile())
TDEIO::mkdir(url);
else
m_view->m_ftpClient->mkdir(url);
}
}
void Actions::slotFileEdit()
{
KFileItem *item = m_view->selectedItems()->getFirst();
if (!item->isDir()) {
if (item->isLocalFile()) {
item->run();
} else {
// Create a new transfer to download the file and open it
KFTPQueue::TransferFile *transfer = new KFTPQueue::TransferFile(KFTPQueue::Manager::self());
transfer->setSourceUrl(item->url());
transfer->setDestUrl(KURL(TDEGlobal::dirs()->saveLocation("tmp") + TQString("%1-%2").arg(TDEApplication::randomString(7)).arg(item->name())));
transfer->addSize(item->size());
transfer->setTransferType(KFTPQueue::Download);
transfer->setOpenAfterTransfer(true);
KFTPQueue::Manager::self()->insertTransfer(transfer);
// Execute the transfer
transfer->delayedExecute();
}
}
}
void Actions::slotAbort()
{
KFTPSession::Session *session = KFTPSession::Manager::self()->find(m_view);
// Abort the session
if (session)
session->abort();
}
void Actions::slotRawCmd()
{
bool ok;
TQString rawCmd = KInputDialog::getText(i18n("Send Raw Command"), i18n("Command:"), "", &ok);
if (ok)
m_view->m_ftpClient->raw(rawCmd);
}
void Actions::slotShowHideTree()
{
m_view->setTreeVisible(m_toggleTreeViewAction->isChecked());
}
void Actions::slotShowHideFilter()
{
if (m_toggleFilterAction->isChecked()) {
m_view->m_searchToolBar->show();
m_view->m_searchFilter->clear();
m_view->m_searchFilter->setFocus();
} else {
m_view->m_searchFilter->clear();
m_view->m_searchToolBar->hide();
}
}
void Actions::slotCharsetChanged(int id)
{
if (!m_changeEncodingAction->popupMenu()->isItemChecked(id)) {
TQStringList charsets = TDEGlobal::charsets()->descriptiveEncodingNames();
TQString charset = TDEGlobal::charsets()->encodingForName(charsets[id - 1]);
// Set the current socket's charset
m_view->m_ftpClient->socket()->changeEncoding(charset);
// Update checked items
m_changeEncodingAction->popupMenu()->setItemChecked(id, true);
m_changeEncodingAction->popupMenu()->setItemChecked(m_curCharsetOption, false);
m_curCharsetOption = id;
}
}
void Actions::slotCharsetReset(int id)
{
// Revert to default charset if possible
KFTPBookmarks::Site *site = m_view->m_session->getSite();
if (site) {
// Set the current socket's charset
m_view->m_ftpClient->socket()->changeEncoding(site->getProperty("encoding"));
// Update checked items
m_changeEncodingAction->popupMenu()->setItemChecked(id, true);
m_changeEncodingAction->popupMenu()->setItemChecked(m_curCharsetOption, false);
m_curCharsetOption = id;
}
}
void Actions::slotExportListing()
{
TQString savePath = KFileDialog::getSaveFileName(TQString::null, "*.txt|Directory Dump", 0, i18n("Export Directory Listing"));
if (!savePath.isEmpty()) {
TQFile file(savePath);
if (!file.open(IO_WriteOnly))
return;
TQTextStream stream(&file);
KFileItemList list(*m_view->items());
KFileItemListIterator i(list);
KFileItem *item;
while ((item = i.current()) != 0) {
stream << item->permissionsString() << "\t";
stream << item->user() << "\t" << item->group() << "\t";
stream << item->timeString() << "\t";
stream << item->name() << "\t";
stream << "\n";
++i;
}
file.flush();
file.close();
}
}
void Actions::slotVerify()
{
KFTPWidgets::Verifier *verifier = new KFTPWidgets::Verifier();
verifier->setFile(m_view->selectedItems()->getFirst()->url().path());
verifier->exec();
delete verifier;
}
void Actions::slotShowHiddenFiles()
{
m_view->setShowHidden(m_showHiddenFilesAction->isChecked());
m_view->reload();
}
void Actions::slotOpenExternal()
{
KFileItem *folder = new KFileItem(m_view->url(), "inode/directory", S_IFDIR);
folder->run();
}
void Actions::slotMarkItems()
{
KFileItemList list(*m_view->selectedItems());
KFileItemListIterator i(list);
KFileItem *item;
KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
DetailsView *tView = m_view->getDetailsView();
DetailsView *oView = opposite->getFileView()->getDetailsView();
while ((item = i.current()) != 0) {
tView->markItem(item);
oView->markItem(item->name());
++i;
}
}
void Actions::slotCompare()
{
KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
DetailsView *tView = m_view->getDetailsView();
DetailsView *oView = opposite->getFileView()->getDetailsView();
// All items in the other list view should be visible by default
TQListViewItemIterator j(oView);
while (j.current()) {
KFileItem *oItem = static_cast<KFileListViewItem*>(*j)->fileInfo();
oView->setItemVisibility(oItem, true);
++j;
}
// Compare the two listviews
TQListViewItemIterator i(tView);
while (i.current()) {
KFileItem *tItem = static_cast<KFileListViewItem*>(*i)->fileInfo();
if (tItem) {
KFileItem *oItem = oView->fileItem(tItem->name());
if (oItem && (oItem->size() == tItem->size() || oItem->isDir())) {
tView->setItemVisibility(tItem, false);
oView->setItemVisibility(oItem, false);
} else {
tView->setItemVisibility(tItem, true);
}
}
++i;
}
PopupMessage *popup = new PopupMessage(m_view->getStatusLabel(), m_view);
popup->setText(i18n("Identical files on both sides have been hidden. Only <b>different files</b> are now visible."));
popup->setImage(SmallIcon("application-vnd.tde.info"));
popup->setShowCloseButton(false);
popup->setShowCounter(false);
popup->reposition();
popup->display();
}
}
}
#include "actions.moc"