/* * This file is part of the KFTPGrabber project * * Copyright (C) 2003-2004 by the KFTPGrabber developers * Copyright (C) 2003-2004 Jernej Kos * Copyright (C) 2004 Markus Brueffer * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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/config.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(), SIGNAL(shutDown()), this, 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(), SIGNAL(queueUpdate()), this, SLOT(slotUpdateStatusBar())); connect(KFTPBookmarks::Manager::self(), SIGNAL(update()), this, SLOT(initBookmarkMenu())); connect(KFTPCore::Config::self(), SIGNAL(configChanged()), this, 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, SLOT(slotReadBookmarks())); // Check for the uirc file if (TDEGlobal::dirs()->findResource("appdata", xmlFile()) == TQString::null) { KMessageBox::error(0, i18n("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.

Warning: Current GUI will be incomplete!
").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( "

Closing the main window will keep KFTPGrabber running in the system tray. " "Use Quit from the KFTPGrabber menu to quit the application.

" "

" ), 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, SIGNAL(timeout()), this, 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, 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"), "document"); 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"), "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 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"