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.
448 lines
15 KiB
448 lines
15 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) 2004 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 <tqlabel.h>
|
|
#include <tqlayout.h>
|
|
#include <tqpainter.h>
|
|
#include <tqtextedit.h>
|
|
#include <tqtabwidget.h>
|
|
#include <tqhbox.h>
|
|
#include <tqvbox.h>
|
|
#include <tqthread.h>
|
|
|
|
#include <tdeapplication.h>
|
|
#include <tdemdimainfrm.h>
|
|
#include <tdemdichildview.h>
|
|
#include <tdemenubar.h>
|
|
#include <tdepopupmenu.h>
|
|
#include <tdetoolbar.h>
|
|
#include <kiconloader.h>
|
|
#include <kdialogbase.h>
|
|
#include <tdefiledetailview.h>
|
|
#include <tdemessagebox.h>
|
|
#include <klineeditdlg.h>
|
|
#include <kstatusbar.h>
|
|
#include <tdelocale.h>
|
|
#include <tdeio/job.h>
|
|
#include <kpassdlg.h>
|
|
#include <ksslpkcs12.h>
|
|
#include <kstandarddirs.h>
|
|
|
|
#include "misc.h"
|
|
#include "kftpapi.h"
|
|
|
|
// Widgets
|
|
#include "widgets/systemtray.h"
|
|
#include "bookmarks/sidebar.h"
|
|
#include "bookmarks/editor.h"
|
|
#include "bookmarks/listview.h"
|
|
#include "logview.h"
|
|
#include "queueview/queueview.h"
|
|
#include "queueview/threadview.h"
|
|
#include "widgets/quickconnect.h"
|
|
#include "kftpserverlineedit.h"
|
|
#include "browser/view.h"
|
|
#include "kftpzeroconflistview.h"
|
|
#include "trafficgraph.h"
|
|
#include "kftptabwidget.h"
|
|
#include "failedtransfers.h"
|
|
|
|
#include "sidebar.h"
|
|
|
|
// Other KFTPGrabber stuff
|
|
#include "misc/kftpconfig.h"
|
|
#include "misc/customcommands/manager.h"
|
|
|
|
#include "mainwindow.h"
|
|
#include "mainactions.h"
|
|
#include "kftpbookmarks.h"
|
|
#include "kftpqueue.h"
|
|
#include "kftpsession.h"
|
|
#include "kftpqueueconverter.h"
|
|
#include "kftppluginmanager.h"
|
|
#include "engine/thread.h"
|
|
|
|
using namespace KFTPGrabberBase;
|
|
|
|
MainWindow::MainWindow()
|
|
: TDEMainWindow()
|
|
{
|
|
// Init the API
|
|
KFTPAPI::getInstance()->m_mainWindow = this;
|
|
|
|
// Set the shell's ui resource file
|
|
setXMLFile("kftpgrabberui.rc");
|
|
connect(TDEApplication::kApplication(), TQ_SIGNAL(shutDown()), this, TQ_SLOT(appShutdown()));
|
|
|
|
// Restore size and position
|
|
resize(KFTPCore::Config::size());
|
|
move(KFTPCore::Config::position());
|
|
setCaption("KFTPGrabber");
|
|
|
|
KFTPCore::Config::self()->postInit();
|
|
|
|
// Load plugins
|
|
KFTPAPI::getInstance()->pluginManager()->loadPlugins();
|
|
|
|
// Load custom commands
|
|
KFTPCore::CustomCommands::Manager::self()->load();
|
|
|
|
connect(KFTPQueue::Manager::self(), TQ_SIGNAL(queueUpdate()), this, TQ_SLOT(slotUpdateStatusBar()));
|
|
connect(KFTPBookmarks::Manager::self(), TQ_SIGNAL(update()), this, TQ_SLOT(initBookmarkMenu()));
|
|
connect(KFTPCore::Config::self(), TQ_SIGNAL(configChanged()), this, TQ_SLOT(slotConfigChanged()));
|
|
|
|
m_trafficGraph = 0L;
|
|
m_bookmarkMenu = 0L;
|
|
m_zeroconfMenu = 0L;
|
|
m_walletMenu = 0L;
|
|
|
|
// Init the gui system
|
|
initTrafficGraph();
|
|
initMainView();
|
|
initStatusBar();
|
|
initBookmarkMenu();
|
|
|
|
// Create the actions object
|
|
m_actions = new MainActions(this);
|
|
|
|
// Create the systray icon
|
|
new KFTPWidgets::SystemTray(this);
|
|
|
|
// Create base two sessions
|
|
KFTPSession::Manager::self()->spawnLocalSession(KFTPSession::LeftSide);
|
|
KFTPSession::Manager::self()->spawnLocalSession(KFTPSession::RightSide);
|
|
|
|
// Load bookmarks
|
|
TQTimer::singleShot(500, this, TQ_SLOT(slotReadBookmarks()));
|
|
|
|
// Check for the uirc file
|
|
if (TDEGlobal::dirs()->findResource("appdata", xmlFile()) == TQString::null) {
|
|
KMessageBox::error(0, i18n("<qt>Unable to find %1 XML GUI descriptor file. Please check that you have installed the application correctly! If you have any questions please ask on %2.<br><br><b>Warning:</b> Current GUI will be incomplete!</qt>").arg(xmlFile()).arg("irc.freenode.net/#kftpgrabber"));
|
|
}
|
|
|
|
createGUI(0);
|
|
|
|
// Auto-save toolbar/menubar/statusbar settings
|
|
setAutoSaveSettings(TQString::fromLatin1("MainWindow"), false);
|
|
}
|
|
|
|
void MainWindow::slotReadBookmarks()
|
|
{
|
|
// Load bookmarks and custom site commands
|
|
KFTPBookmarks::Manager::self()->load(getStoreDir("bookmarks.xml"));
|
|
|
|
// Load the saved queue
|
|
KFTPQueue::Manager::self()->getConverter()->importQueue(getStoreDir("queue"));
|
|
|
|
// Update the bookmark menu
|
|
initBookmarkMenu();
|
|
}
|
|
|
|
void MainWindow::appShutdown()
|
|
{
|
|
KFTPQueue::Manager::self()->stopAllTransfers();
|
|
KFTPSession::Manager::self()->disconnectAllSessions();
|
|
|
|
// Save the queueview layout
|
|
m_queueView->saveLayout();
|
|
|
|
// Save the config data on shutdown
|
|
KFTPCore::Config::self()->saveConfig();
|
|
|
|
// Save current queue
|
|
KFTPQueue::Manager::self()->getConverter()->exportQueue(getStoreDir("queue"));
|
|
}
|
|
|
|
bool MainWindow::queryClose()
|
|
{
|
|
if(TDEApplication::kApplication()->sessionSaving()) {
|
|
m_actions->m_closeApp = true;
|
|
}
|
|
|
|
if (!KFTPCore::Config::exitOnClose() && KFTPCore::Config::showSystrayIcon() && !m_actions->m_closeApp) {
|
|
/*
|
|
* This code was adopted from the Konversation project
|
|
* copyright: (C) 2003 by Dario Abatianni, Peter Simonsson
|
|
* email: eisfuchs@tigress.com, psn@linux.se
|
|
*/
|
|
|
|
// Compute size and position of the pixmap to be grabbed:
|
|
TQPoint g = KFTPWidgets::SystemTray::self()->mapToGlobal(KFTPWidgets::SystemTray::self()->pos());
|
|
int desktopWidth = kapp->desktop()->width();
|
|
int desktopHeight = kapp->desktop()->height();
|
|
int tw = KFTPWidgets::SystemTray::self()->width();
|
|
int th = KFTPWidgets::SystemTray::self()->height();
|
|
int w = desktopWidth / 4;
|
|
int h = desktopHeight / 9;
|
|
int x = g.x() + tw/2 - w/2; // Center the rectange in the systray icon
|
|
int y = g.y() + th/2 - h/2;
|
|
if ( x < 0 ) x = 0; // Move the rectangle to stay in the desktop limits
|
|
if ( y < 0 ) y = 0;
|
|
if ( x + w > desktopWidth ) x = desktopWidth - w;
|
|
if ( y + h > desktopHeight ) y = desktopHeight - h;
|
|
|
|
// Grab the desktop and draw a circle arround the icon:
|
|
TQPixmap shot = TQPixmap::grabWindow( tqt_xrootwin(), x, y, w, h );
|
|
TQPainter painter( &shot );
|
|
const int MARGINS = 6;
|
|
const int WIDTH = 3;
|
|
int ax = g.x() - x - MARGINS -1;
|
|
int ay = g.y() - y - MARGINS -1;
|
|
painter.setPen( TQPen( TQt::red, WIDTH ) );
|
|
painter.drawArc( ax, ay, tw + 2*MARGINS, th + 2*MARGINS, 0, 16*360 );
|
|
painter.end();
|
|
|
|
// Associate source to image and show the dialog:
|
|
TQMimeSourceFactory::defaultFactory()->setPixmap( "systray_shot", shot );
|
|
KMessageBox::information( this,
|
|
i18n( "<p>Closing the main window will keep KFTPGrabber running in the system tray. "
|
|
"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
|
|
"<p><center><img source=\"systray_shot\"></center></p>" ),
|
|
i18n( "Docking in System Tray" ), "HideMenuBarWarning" );
|
|
hide();
|
|
|
|
return false;
|
|
}
|
|
|
|
if (KFTPCore::Config::confirmExit() && KFTPQueue::Manager::self()->getNumRunning() > 0) {
|
|
if (KMessageBox::questionYesNo(0, i18n("There is currently a transfer running.",
|
|
"There are currently %n transfers running.",
|
|
KFTPQueue::Manager::self()->getNumRunning()) + i18n("\nAre you sure you want to quit?"),
|
|
i18n("Quit")) == KMessageBox::No)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// Save XML bookmarks here, because the user may be prompted for an encryption password
|
|
KFTPBookmarks::Manager::self()->save();
|
|
|
|
return true;
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
delete m_bookmarkMenu;
|
|
delete m_zeroconfMenu;
|
|
delete m_walletMenu;
|
|
}
|
|
|
|
void MainWindow::initTrafficGraph()
|
|
{
|
|
// Setup traffic graph
|
|
m_graphTimer = new TQTimer(this);
|
|
connect(m_graphTimer, TQ_SIGNAL(timeout()), this, TQ_SLOT(slotUpdateTrafficGraph()));
|
|
m_graphTimer->start(1000);
|
|
|
|
// Create and configure the traffic graph
|
|
m_trafficGraph = new KFTPWidgets::TrafficGraph(0, "graph");
|
|
m_trafficGraph->setShowLabels(true);
|
|
|
|
m_trafficGraph->addBeam(TQColor(255, 0, 0));
|
|
m_trafficGraph->addBeam(TQColor(0, 0, 255));
|
|
|
|
m_trafficGraph->repaint();
|
|
}
|
|
|
|
void MainWindow::showBookmarkEditor()
|
|
{
|
|
KFTPWidgets::Bookmarks::BookmarkEditor *bookmarkEditor = new KFTPWidgets::Bookmarks::BookmarkEditor(this, "bookmark editor");
|
|
bookmarkEditor->exec();
|
|
delete bookmarkEditor;
|
|
|
|
// Update the bookmarks globaly
|
|
KFTPBookmarks::Manager::self()->emitUpdate();
|
|
}
|
|
|
|
void MainWindow::initBookmarkMenu()
|
|
{
|
|
// Bookmarks menu
|
|
if (!m_bookmarkMenu)
|
|
m_bookmarkMenu = new TDEActionMenu(i18n("Bookmarks"), 0, actionCollection(), "bookmarks");
|
|
else
|
|
m_bookmarkMenu->popupMenu()->clear();
|
|
|
|
// Zeroconf menu
|
|
if (!m_zeroconfMenu)
|
|
m_zeroconfMenu = new TDEActionMenu(i18n("FTP Sites Near Me"));
|
|
|
|
// Wallet menu
|
|
if (!m_walletMenu)
|
|
m_walletMenu = new TDEActionMenu(i18n("Sites In TDEWallet"), loadSmallIcon("wallet_open"));
|
|
|
|
m_bookmarkMenu->popupMenu()->insertItem(loadSmallIcon("bookmark"), i18n("Edit Bookmarks..."), 1);
|
|
m_bookmarkMenu->popupMenu()->connectItem(1, this, TQ_SLOT(showBookmarkEditor()));
|
|
m_bookmarkMenu->insert(m_zeroconfMenu);
|
|
|
|
if (KFTPCore::Config::showWalletSites())
|
|
m_bookmarkMenu->insert(m_walletMenu);
|
|
|
|
m_bookmarkMenu->popupMenu()->insertSeparator();
|
|
|
|
// Populate the bookmarks and zeroconf menus
|
|
KFTPBookmarks::Manager::self()->guiPopulateBookmarksMenu(m_bookmarkMenu);
|
|
KFTPBookmarks::Manager::self()->guiPopulateZeroconfMenu(m_zeroconfMenu);
|
|
|
|
if (KFTPCore::Config::showWalletSites())
|
|
KFTPBookmarks::Manager::self()->guiPopulateWalletMenu(m_walletMenu);
|
|
}
|
|
|
|
void MainWindow::initStatusBar()
|
|
{
|
|
statusBar()->insertItem(i18n("idle"), 1, 1);
|
|
statusBar()->setItemAlignment(1, TQt::AlignLeft);
|
|
|
|
statusBar()->insertItem(i18n("Download: %1/s").arg(TDEIO::convertSize(KFTPQueue::Manager::self()->getDownloadSpeed())), 2);
|
|
statusBar()->insertItem(i18n("Upload: %1/s").arg(TDEIO::convertSize(KFTPQueue::Manager::self()->getUploadSpeed())), 3);
|
|
}
|
|
|
|
void MainWindow::initSidebars()
|
|
{
|
|
// BEGIN bottom
|
|
m_bottomSidebar = new KFTPWidgets::Sidebar(centralWidget(), KFTPWidgets::Sidebar::Bottom);
|
|
|
|
// Create the queue
|
|
m_queueView = new KFTPWidgets::QueueView(0, "queue");
|
|
|
|
// Create the failed transfers view
|
|
KFTPWidgets::FailedTransfers *failedTransfers = new KFTPWidgets::FailedTransfers(0, "failedtransfers");
|
|
|
|
m_bottomSidebar->addSidebar(m_queueView, i18n("Queue"), "text-x-generic");
|
|
m_bottomSidebar->addSidebar(failedTransfers, i18n("Failed Transfers"), "cancel");
|
|
// END bottom
|
|
|
|
// BEGIN left
|
|
m_leftSidebar = new KFTPWidgets::Sidebar(m_bottomSidebar->content(), KFTPWidgets::Sidebar::Left);
|
|
m_leftSidebar->setVisible(KFTPCore::Config::showLeftSidebar());
|
|
|
|
// Add the bookmarks sidebar
|
|
m_bookmarkSidebar = new KFTPWidgets::Bookmarks::Sidebar(0, "bookmarks");
|
|
|
|
// Add the zeroconf sidebar
|
|
m_zeroconfSidebar = new KFTPZeroConfListView(0, "zeroconf");
|
|
|
|
m_leftSidebar->addSidebar(m_bookmarkSidebar, i18n("Bookmarks"), "bookmark");
|
|
m_leftSidebar->addSidebar(m_zeroconfSidebar, i18n("Sites Near Me"), "lan");
|
|
// END left
|
|
}
|
|
|
|
void MainWindow::initMainView()
|
|
{
|
|
setCentralWidget(new TQWidget(this, "qt_central_widget"));
|
|
|
|
TQHBoxLayout *mainLayout = new TQHBoxLayout(centralWidget(), 0, 0, "tLayout");
|
|
|
|
// Create the sidebars
|
|
initSidebars();
|
|
|
|
mainLayout->addWidget(m_bottomSidebar);
|
|
|
|
TQSplitter *splitter = new TQSplitter(m_leftSidebar->content());
|
|
|
|
// Session layouts
|
|
TQWidget *box_1 = new TQWidget(splitter);
|
|
TQWidget *box_2 = new TQWidget(splitter);
|
|
|
|
TQHBoxLayout *lay_1 = new TQHBoxLayout(box_1);
|
|
TQHBoxLayout *lay_2 = new TQHBoxLayout(box_2);
|
|
|
|
KFTPTabWidget *leftTabs = new KFTPTabWidget(box_1, "TabWidgetLeft");
|
|
KFTPTabWidget *rightTabs = new KFTPTabWidget(box_2, "TabWidgetRight");
|
|
|
|
leftTabs->setHoverCloseButton(true);
|
|
rightTabs->setHoverCloseButton(true);
|
|
|
|
lay_1->addWidget(leftTabs);
|
|
lay_2->addWidget(rightTabs);
|
|
|
|
// Create the session manager
|
|
new KFTPSession::Manager(this, new TQTabWidget(0, "logs"), leftTabs, rightTabs);
|
|
|
|
// Add some sidebars that can't be added before the session manager is created
|
|
m_bottomSidebar->addSidebar(new KFTPWidgets::ThreadView(0, "threads"), i18n("Threads"), "socket");
|
|
m_bottomSidebar->addSidebar(KFTPSession::Manager::self()->getStatTabs(), i18n("Log"), "application-vnd.tde.info");
|
|
m_bottomSidebar->addSidebar(m_trafficGraph, i18n("Traffic"), "share");
|
|
}
|
|
|
|
void MainWindow::slotUpdateStatusBar()
|
|
{
|
|
// Status bar
|
|
statusBar()->changeItem(i18n("Download: %1/s").arg(TDEIO::convertSize(KFTPQueue::Manager::self()->getDownloadSpeed())), 2);
|
|
statusBar()->changeItem(i18n("Upload: %1/s").arg(TDEIO::convertSize(KFTPQueue::Manager::self()->getUploadSpeed())), 3);
|
|
}
|
|
|
|
void MainWindow::slotUpdateTrafficGraph()
|
|
{
|
|
// Update the traffic graph
|
|
if (m_trafficGraph) {
|
|
TQValueList<double> trafficList;
|
|
trafficList.append((double) KFTPQueue::Manager::self()->getDownloadSpeed() / 1024);
|
|
trafficList.append((double) KFTPQueue::Manager::self()->getUploadSpeed() / 1024);
|
|
|
|
m_trafficGraph->addSample(trafficList);
|
|
}
|
|
}
|
|
|
|
void MainWindow::slotQuickConnect(const TQString &title, const TQString &host, int port)
|
|
{
|
|
// Create/get the new dialog
|
|
KFTPWidgets::QuickConnectDialog *quickConnect = new KFTPWidgets::QuickConnectDialog(this);
|
|
|
|
quickConnect->setCaption(title);
|
|
quickConnect->setHost(host);
|
|
quickConnect->setPort(port);
|
|
|
|
if (!host.isEmpty())
|
|
quickConnect->setFocusToUser();
|
|
|
|
if (quickConnect->exec() == KDialogBase::Accepted) {
|
|
// Get the url and connect
|
|
KFTPSession::Session *session = KFTPSession::Manager::self()->spawnRemoteSession(KFTPSession::IgnoreSide, quickConnect->getUrl());
|
|
|
|
// Configure the client socket
|
|
quickConnect->setupClient(session->getClient());
|
|
}
|
|
|
|
delete quickConnect;
|
|
}
|
|
|
|
void MainWindow::slotConfigChanged()
|
|
{
|
|
m_leftSidebar->setVisible(KFTPCore::Config::showLeftSidebar());
|
|
}
|
|
|
|
#include "mainwindow.moc"
|