-rw-r--r-- | noncore/settings/aqpkg/aqpkg.pro | 4 | ||||
-rw-r--r-- | noncore/settings/aqpkg/mainwin.cpp | 893 | ||||
-rw-r--r-- | noncore/settings/aqpkg/mainwin.h | 64 | ||||
-rw-r--r-- | noncore/settings/aqpkg/networkpkgmgr.cpp | 870 | ||||
-rw-r--r-- | noncore/settings/aqpkg/networkpkgmgr.h | 100 | ||||
-rw-r--r-- | noncore/settings/aqpkg/progresswidget.cpp | 66 | ||||
-rw-r--r-- | noncore/settings/aqpkg/progresswidget.h | 54 |
7 files changed, 909 insertions, 1142 deletions
diff --git a/noncore/settings/aqpkg/aqpkg.pro b/noncore/settings/aqpkg/aqpkg.pro index b69bae4..fc1f53d 100644 --- a/noncore/settings/aqpkg/aqpkg.pro +++ b/noncore/settings/aqpkg/aqpkg.pro @@ -1,51 +1,47 @@ TEMPLATE = app CONFIG = qt warn_on release HEADERS = global.h \ mainwin.h \ datamgr.h \ settingsimpl.h \ ipkg.h \ - networkpkgmgr.h \ package.h \ - progresswidget.h \ installdlgimpl.h \ instoptionsimpl.h \ destination.h \ utils.h \ server.h \ helpwindow.h \ letterpushbutton.h \ inputdlg.h \ categoryfilterimpl.h SOURCES = mainwin.cpp \ datamgr.cpp \ mem.cpp \ settingsimpl.cpp \ ipkg.cpp \ - networkpkgmgr.cpp \ main.cpp \ package.cpp \ - progresswidget.cpp \ installdlgimpl.cpp \ instoptionsimpl.cpp \ destination.cpp \ utils.cpp \ server.cpp \ helpwindow.cpp \ letterpushbutton.cpp \ inputdlg.cpp \ version.cpp \ categoryfilterimpl.cpp INTERFACES = settings.ui \ install.ui \ instoptions.ui \ categoryfilter.ui TARGET = aqpkg INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopie -lstdc++ DESTDIR = $(OPIEDIR)/bin include ( ../../../include.pro ) diff --git a/noncore/settings/aqpkg/mainwin.cpp b/noncore/settings/aqpkg/mainwin.cpp index d79673f..c9963bc 100644 --- a/noncore/settings/aqpkg/mainwin.cpp +++ b/noncore/settings/aqpkg/mainwin.cpp @@ -1,124 +1,148 @@ /*************************************************************************** mainwin.cpp - description ------------------- begin : Mon Aug 26 13:32:30 BST 2002 copyright : (C) 2002 by Andy Qua email : andy.qua@blueyonder.co.uk ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ +#include <unistd.h> + +#include <qpe/qcopenvelope_qws.h> #include <qpe/qpemenubar.h> +#include <qpe/qpeapplication.h> #include <qpe/qpetoolbar.h> +#include <qpe/config.h> #include <qpe/resource.h> #include <qaction.h> +#include <qcombobox.h> +#include <qfile.h> +#include <qlabel.h> +#include <qlayout.h> #include <qlineedit.h> +#include <qlistview.h> #include <qmenubar.h> #include <qmessagebox.h> #include <qpopupmenu.h> +#include <qprogressbar.h> #include <qtimer.h> #include <qwhatsthis.h> #include <qwidgetstack.h> -#include "mainwin.h" -#include "progresswidget.h" +#include "categoryfilterimpl.h" #include "datamgr.h" -#include "networkpkgmgr.h" -#include "settingsimpl.h" +#include "global.h" #include "helpwindow.h" +#include "inputdlg.h" +#include "installdlgimpl.h" +#include "letterpushbutton.h" +#include "mainwin.h" +#include "settingsimpl.h" #include "utils.h" -#include "global.h" + +extern int compareVersions( const char *v1, const char *v2 ); MainWindow :: MainWindow() : QMainWindow( 0x0, 0x0, WStyle_ContextHelp ) { setCaption( tr( "AQPkg - Package Manager" ) ); - // Create UI widgets - progressWindow = new ProgressWidget( this ); - networkPkgWindow = new NetworkPackageManager( this ); +#ifdef QWS + // read download directory from config file + Config cfg( "aqpkg" ); + cfg.setGroup( "settings" ); + currentlySelectedServer = cfg.readEntry( "selectedServer", "local" ); + showJumpTo = cfg.readBoolEntry( "showJumpTo", "true" ); + +#endif + // Create UI widgets + initMainWidget(); + initProgressWidget(); + // Build menu and tool bars setToolBarsMovable( FALSE ); QPEToolBar *bar = new QPEToolBar( this ); bar->setHorizontalStretchable( TRUE ); QPEMenuBar *mb = new QPEMenuBar( bar ); mb->setMargin( 0 ); bar = new QPEToolBar( this ); // Find toolbar findBar = new QPEToolBar( this ); addToolBar( findBar, QMainWindow::Top, true ); findBar->setHorizontalStretchable( true ); findEdit = new QLineEdit( findBar ); QWhatsThis::add( findEdit, tr( "Type the text to search for here." ) ); findBar->setStretchableWidget( findEdit ); connect( findEdit, SIGNAL( textChanged( const QString & ) ), this, SLOT( findPackage( const QString & ) ) ); // Packages menu QPopupMenu *popup = new QPopupMenu( this ); QAction *a = new QAction( tr( "Update lists" ), Resource::loadPixmap( "aqpkg/update" ), QString::null, 0, this, 0 ); a->setWhatsThis( tr( "Click here to update package lists from servers." ) ); - connect( a, SIGNAL( activated() ), networkPkgWindow, SLOT( updateServer() ) ); + connect( a, SIGNAL( activated() ), this, SLOT( updateServer() ) ); a->addTo( popup ); a->addTo( bar ); actionUpgrade = new QAction( tr( "Upgrade" ), Resource::loadPixmap( "aqpkg/upgrade" ), QString::null, 0, this, 0 ); actionUpgrade->setWhatsThis( tr( "Click here to upgrade all installed packages if a newer version is available." ) ); - connect( actionUpgrade, SIGNAL( activated() ), networkPkgWindow, SLOT( upgradePackages() ) ); + connect( actionUpgrade, SIGNAL( activated() ), this, SLOT( upgradePackages() ) ); actionUpgrade->addTo( popup ); actionUpgrade->addTo( bar ); iconDownload = Resource::loadPixmap( "aqpkg/download" ); iconRemove = Resource::loadPixmap( "aqpkg/remove" ); actionDownload = new QAction( tr( "Download" ), iconDownload, QString::null, 0, this, 0 ); actionDownload->setWhatsThis( tr( "Click here to download the currently selected package(s)." ) ); - connect( actionDownload, SIGNAL( activated() ), networkPkgWindow, SLOT( downloadPackage() ) ); + connect( actionDownload, SIGNAL( activated() ), this, SLOT( downloadPackage() ) ); actionDownload->addTo( popup ); actionDownload->addTo( bar ); a = new QAction( tr( "Apply changes" ), Resource::loadPixmap( "aqpkg/apply" ), QString::null, 0, this, 0 ); a->setWhatsThis( tr( "Click here to install, remove or upgrade currently selected package(s)." ) ); - connect( a, SIGNAL( activated() ), networkPkgWindow, SLOT( applyChanges() ) ); + connect( a, SIGNAL( activated() ), this, SLOT( applyChanges() ) ); a->addTo( popup ); a->addTo( bar ); mb->insertItem( tr( "Actions" ), popup ); // View menu popup = new QPopupMenu( this ); actionUninstalled = new QAction( tr( "Show packages not installed" ), QString::null, 0, this, 0 ); actionUninstalled->setToggleAction( TRUE ); actionUninstalled->setWhatsThis( tr( "Click here to show packages available which have not been installed." ) ); connect( actionUninstalled, SIGNAL( activated() ), this, SLOT( filterUninstalledPackages() ) ); actionUninstalled->addTo( popup ); actionInstalled = new QAction( tr( "Show installed packages" ), QString::null, 0, this, 0 ); actionInstalled->setToggleAction( TRUE ); actionInstalled->setWhatsThis( tr( "Click here to show packages currently installed on this device." ) ); connect( actionInstalled, SIGNAL( activated() ), this, SLOT( filterInstalledPackages() ) ); actionInstalled->addTo( popup ); actionUpdated = new QAction( tr( "Show updated packages" ), QString::null, 0, this, 0 ); actionUpdated->setToggleAction( TRUE ); actionUpdated->setWhatsThis( tr( "Click here to show packages currently installed on this device which have a newer version available." ) ); connect( actionUpdated, SIGNAL( activated() ), this, SLOT( filterUpgradedPackages() ) ); actionUpdated->addTo( popup ); popup->insertSeparator(); actionFilter = new QAction( tr( "Filter by category" ), Resource::loadPixmap( "aqpkg/filter" ), QString::null, 0, this, 0 ); actionFilter->setToggleAction( TRUE ); actionFilter->setWhatsThis( tr( "Click here to list packages belonging to one category." ) ); connect( actionFilter, SIGNAL( activated() ), this, SLOT( filterCategory() ) ); @@ -146,193 +170,986 @@ MainWindow :: MainWindow() mb->insertItem( tr( "View" ), popup ); // Options menu popup = new QPopupMenu( this ); a = new QAction( tr( "Configure" ), Resource::loadPixmap( "aqpkg/config" ), QString::null, 0, this, 0 ); a->setWhatsThis( tr( "Click here to configure this application." ) ); connect( a, SIGNAL( activated() ), this, SLOT( displaySettings() ) ); a->addTo( popup ); popup->insertSeparator(); a = new QAction( tr( "Help" ), Resource::loadPixmap( "help_icon" ), QString::null, 0, this, 0 ); a->setWhatsThis( tr( "Click here for help." ) ); connect( a, SIGNAL( activated() ), this, SLOT( displayHelp() ) ); a->addTo( popup ); a = new QAction( tr( "About" ), Resource::loadPixmap( "UtilsIcon" ), QString::null, 0, this, 0 ); a->setWhatsThis( tr( "Click here for software version information." ) ); connect( a, SIGNAL( activated() ), this, SLOT( displayAbout() ) ); a->addTo( popup ); mb->insertItem( tr( "Options" ), popup ); // Finish find toolbar creation a = new QAction( QString::null, Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); a->setWhatsThis( tr( "Click here to hide the find toolbar." ) ); connect( a, SIGNAL( activated() ), this, SLOT( hideFindBar() ) ); a->addTo( findBar ); findBar->hide(); - // Create widget stack and add UI widgets stack = new QWidgetStack( this ); stack->addWidget( progressWindow, 2 ); stack->addWidget( networkPkgWindow, 1 ); setCentralWidget( stack ); stack->raiseWidget( progressWindow ); // Delayed call to finish initialization QTimer::singleShot( 100, this, SLOT( init() ) ); } MainWindow :: ~MainWindow() { delete mgr; } +void MainWindow :: initMainWidget() +{ + networkPkgWindow = new QWidget( this ); + + QLabel *l = new QLabel( tr( "Servers:" ), networkPkgWindow ); + + serversList = new QComboBox( networkPkgWindow ); + connect( serversList, SIGNAL( activated( int ) ), this, SLOT( serverSelected( int ) ) ); + QWhatsThis::add( serversList, tr( "Click here to select a package feed." ) ); + + installedIcon = Resource::loadPixmap( "aqpkg/installed" ); + updatedIcon = Resource::loadPixmap( "aqpkg/updated" ); + + packagesList = new QListView( networkPkgWindow ); + packagesList->addColumn( tr( "Packages" ), 225 ); + QWhatsThis::add( packagesList, tr( "This is a listing of all packages for the server feed selected above.\n\nA blue dot next to the package name indicates that the package is currently installed.\n\nA blue dot with a star indicates that a newer version of the package is available from the server feed.\n\nClick inside the box at the left to select a package." ) ); + + QVBoxLayout *vbox = new QVBoxLayout( networkPkgWindow, 0, -1 ); + QHBoxLayout *hbox1 = new QHBoxLayout( vbox, -1 ); + hbox1->addWidget( l ); + hbox1->addWidget( serversList ); + + + QHBoxLayout *hbox3 = new QHBoxLayout( vbox, -1 ); + QHBoxLayout *hbox4 = new QHBoxLayout( vbox, -1 ); + + if ( showJumpTo ) + { + char text[2]; + text[1] = '\0'; + for ( int i = 0 ; i < 26 ; ++i ) + { + text[0] = 'A' + i; + LetterPushButton *b = new LetterPushButton( text, networkPkgWindow ); + connect( b, SIGNAL( released( QString ) ), this, SLOT( letterPushed( QString ) ) ); + if ( i < 13 ) + hbox3->addWidget( b ); + else + hbox4->addWidget( b ); + } + } + + vbox->addWidget( packagesList ); + + downloadEnabled = TRUE; +} + +void MainWindow :: initProgressWidget() +{ + progressWindow = new QWidget( this ); + + QVBoxLayout *layout = new QVBoxLayout( progressWindow, 4, 4 ); + + m_status = new QLabel( progressWindow ); + m_status->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + layout->addWidget( m_status ); + + m_progress = new QProgressBar( progressWindow ); + layout->addWidget( m_progress ); +} + void MainWindow :: init() { stack->raiseWidget( progressWindow ); mgr = new DataManager(); - connect( mgr, SIGNAL( progressSetSteps( int ) ), progressWindow, SLOT( setSteps( int ) ) ); - connect( mgr, SIGNAL( progressSetMessage( const QString & ) ), - progressWindow, SLOT( setMessage( const QString & ) ) ); - connect( mgr, SIGNAL( progressUpdate( int ) ), progressWindow, SLOT( update( int ) ) ); + connect( mgr, SIGNAL( progressSetSteps( int ) ), this, SLOT( setProgressSteps( int ) ) ); + connect( mgr, SIGNAL( progressSetMessage( const QString & ) ), + this, SLOT( setProgressMessage( const QString & ) ) ); + connect( mgr, SIGNAL( progressUpdate( int ) ), this, SLOT( updateProgress( int ) ) ); mgr->loadServers(); - networkPkgWindow->setDataManager( mgr ); - networkPkgWindow->updateData(); - connect( networkPkgWindow, SIGNAL( appRaiseMainWidget() ), this, SLOT( raiseMainWidget() ) ); - connect( networkPkgWindow, SIGNAL( appRaiseProgressWidget() ), this, SLOT( raiseProgressWidget() ) ); - connect( networkPkgWindow, SIGNAL( appEnableUpgrade( bool ) ), this, SLOT( enableUpgrade( bool ) ) ); - connect( networkPkgWindow, SIGNAL( appEnableDownload( bool ) ), this, SLOT( enableDownload( bool ) ) ); - connect( networkPkgWindow, SIGNAL( progressSetSteps( int ) ), progressWindow, SLOT( setSteps( int ) ) ); - connect( networkPkgWindow, SIGNAL( progressSetMessage( const QString & ) ), - progressWindow, SLOT( setMessage( const QString & ) ) ); - connect( networkPkgWindow, SIGNAL( progressUpdate( int ) ), progressWindow, SLOT( update( int ) ) ); + showUninstalledPkgs = false; + showInstalledPkgs = false; + showUpgradedPkgs = false; + categoryFilterEnabled = false; + + updateData(); stack->raiseWidget( networkPkgWindow ); } void MainWindow :: setDocument( const QString &doc ) { // Remove path from package QString package = Utils::getPackageNameFromIpkFilename( doc ); // std::cout << "Selecting package " << package << std::endl; - networkPkgWindow->selectLocalPackage( package ); + + // First select local server + for ( int i = 0 ; i < serversList->count() ; ++i ) + { + if ( serversList->text( i ) == LOCAL_IPKGS ) + { + serversList->setCurrentItem( i ); + break; + } + } + serverSelected( 0 ); + + // Now set the check box of the selected package + for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + item != 0 ; + item = (QCheckListItem *)item->nextSibling() ) + { + if ( item->text().startsWith( package ) ) + { + item->setOn( true ); + break; + } + } } void MainWindow :: displaySettings() { SettingsImpl *dlg = new SettingsImpl( mgr, this, "Settings", true ); if ( dlg->showDlg( 0 ) ) - networkPkgWindow->updateData(); + updateData(); delete dlg; } void MainWindow :: displayHelp() { HelpWindow *dlg = new HelpWindow( this ); dlg->exec(); delete dlg; } void MainWindow :: displayFindBar() { findBar->show(); findEdit->setFocus(); } void MainWindow :: repeatFind() { - networkPkgWindow->searchForPackage( findEdit->text() ); + searchForPackage( findEdit->text() ); } void MainWindow :: findPackage( const QString &text ) { actionFindNext->setEnabled( !text.isEmpty() ); - networkPkgWindow->searchForPackage( text ); + searchForPackage( text ); } void MainWindow :: hideFindBar() { findBar->hide(); } void MainWindow :: displayAbout() { QMessageBox::about( this, tr( "About AQPkg" ), tr( VERSION_TEXT ) ); } void MainWindow :: filterUninstalledPackages() { - networkPkgWindow->showOnlyUninstalledPackages( actionUninstalled->isOn() ); + showUninstalledPkgs = actionUninstalled->isOn(); + if ( showUninstalledPkgs ) + { + showInstalledPkgs = FALSE; + showUpgradedPkgs = FALSE; + } + serverSelected( -1 ); + actionInstalled->setOn( FALSE ); actionUpdated->setOn( FALSE ); } void MainWindow :: filterInstalledPackages() { + showInstalledPkgs = actionInstalled->isOn(); + if ( showInstalledPkgs ) + { + showUninstalledPkgs = FALSE; + showUpgradedPkgs = FALSE; + } + serverSelected( -1 ); + actionUninstalled->setOn( FALSE ); - networkPkgWindow->showOnlyInstalledPackages( actionInstalled->isOn() ); actionUpdated->setOn( FALSE ); } void MainWindow :: filterUpgradedPackages() { + showUpgradedPkgs = actionUpdated->isOn(); + if ( showUpgradedPkgs ) + { + showUninstalledPkgs = FALSE; + showInstalledPkgs = FALSE; + } + serverSelected( -1 ); + actionUninstalled->setOn( FALSE ); actionInstalled->setOn( FALSE ); - networkPkgWindow->showUpgradedPackages( actionUpdated->isOn() ); } -void MainWindow :: setFilterCategory() +bool MainWindow :: setFilterCategory() { - if ( networkPkgWindow->setFilterCategory() ) + // Get categories; + CategoryFilterImpl dlg( DataManager::getAvailableCategories(), categoryFilter, this ); + if ( dlg.exec() == QDialog::Accepted ) + { + categoryFilter = dlg.getSelectedFilter(); + + if ( categoryFilter == "" ) + return false; + + categoryFilterEnabled = true; + serverSelected( -1 ); actionFilter->setOn( TRUE ); + return true; + } + + return false; } void MainWindow :: filterCategory() { if ( !actionFilter->isOn() ) { - networkPkgWindow->filterByCategory( FALSE ); + filterByCategory( FALSE ); } else { - actionFilter->setOn( networkPkgWindow->filterByCategory( TRUE ) ); + actionFilter->setOn( filterByCategory( TRUE ) ); + } +} + +bool MainWindow :: filterByCategory( bool val ) +{ + if ( val ) + { + if ( categoryFilter == "" ) + { + if ( !setFilterCategory() ) + return false; + } + + categoryFilterEnabled = true; + serverSelected( -1 ); + return true; + } + else + { + // Turn off filter + categoryFilterEnabled = false; + serverSelected( -1 ); + return false; } } void MainWindow :: raiseMainWidget() { stack->raiseWidget( networkPkgWindow ); } void MainWindow :: raiseProgressWidget() { stack->raiseWidget( progressWindow ); } void MainWindow :: enableUpgrade( bool enabled ) { actionUpgrade->setEnabled( enabled ); } void MainWindow :: enableDownload( bool enabled ) { if ( enabled ) { actionDownload->setIconSet( iconDownload ); actionDownload->setText( tr( "Download" ) ); actionDownload->setWhatsThis( tr( "Click here to download the currently selected package(s)." ) ); } else { actionDownload->setIconSet( iconRemove ); actionDownload->setText( tr( "Remove" ) ); actionDownload->setWhatsThis( tr( "Click here to uninstall the currently selected package(s)." ) ); } } + +void MainWindow :: setProgressSteps( int numsteps ) +{ + m_progress->setTotalSteps( numsteps ); +} + +void MainWindow :: setProgressMessage( const QString &msg ) +{ + m_status->setText( msg ); +} + +void MainWindow :: updateProgress( int progress ) +{ + m_progress->setProgress( progress ); +} + +void MainWindow :: updateData() +{ + m_progress->setTotalSteps( mgr->getServerList().size() ); + + serversList->clear(); + packagesList->clear(); + + vector<Server>::iterator it; + int activeItem = -1; + int i; + QString serverName; + for ( i = 0, it = mgr->getServerList().begin() ; it != mgr->getServerList().end() ; ++it, ++i ) + { + serverName = it->getServerName(); + m_status->setText( tr( "Building server list:\n\t%1" ).arg( serverName ) ); + m_progress->setProgress( i ); + qApp->processEvents(); + +// cout << "Adding " << it->getServerName() << " to combobox" << endl; + if ( !it->isServerActive() ) + { +// cout << serverName << " is not active" << endl; + i--; + continue; + } + + serversList->insertItem( serverName ); + if ( serverName == currentlySelectedServer ) + activeItem = i; + } + + // set selected server to be active server + if ( activeItem != -1 ) + serversList->setCurrentItem( activeItem ); + serverSelected( 0, FALSE ); +} + +void MainWindow :: serverSelected( int index ) +{ + serverSelected( index, TRUE ); +} + +void MainWindow :: serverSelected( int, bool raiseProgress ) +{ + QPixmap nullIcon( installedIcon.size() ); + nullIcon.fill( colorGroup().base() ); + + // display packages + QString serverName = serversList->currentText(); + currentlySelectedServer = serverName; + + vector<Server>::iterator s = mgr->getServer( serverName ); + + vector<Package> &list = s->getPackageList(); + vector<Package>::iterator it; + + // Display progress widget while loading list + bool doProgress = ( list.size() > 200 ); + if ( doProgress ) + { + if ( raiseProgress ) + { + stack->raiseWidget( progressWindow ); + } + m_progress->setTotalSteps( list.size() ); + m_status->setText( tr( "Building package list for:\n\t%1" ).arg( serverName ) ); + } + + packagesList->clear(); + +#ifdef QWS + // read download directory from config file + Config cfg( "aqpkg" ); + cfg.setGroup( "settings" ); + cfg.writeEntry( "selectedServer", currentlySelectedServer ); +#endif + + int i = 0; + for ( it = list.begin() ; it != list.end() ; ++it ) + { + // Update progress after every 100th package (arbitrary value, seems to give good balance) + i++; + if ( ( i % 100 ) == 0 ) + { + if ( doProgress ) + { + m_progress->setProgress( i ); + } + qApp->processEvents(); + } + + QString text = ""; + + // Apply show only uninstalled packages filter + if ( showUninstalledPkgs && it->isInstalled() ) + continue; + + // Apply show only installed packages filter + if ( showInstalledPkgs && !it->isInstalled() ) + continue; + + // Apply show only new installed packages filter + if ( showUpgradedPkgs ) + { + if ( !it->isInstalled() || + compareVersions( it->getInstalledVersion(), it->getVersion() ) != 1 ) + continue; + } + + // Apply the section filter + if ( categoryFilterEnabled && categoryFilter != "" ) + { + if ( it->getSection() == "" || categoryFilter.find( it->getSection().lower() ) == -1 ) + continue; + } + + // If the local server, only display installed packages + if ( serverName == LOCAL_SERVER && !it->isInstalled() ) + continue; + + + QCheckListItem *item = new QCheckListItem( packagesList, it->getPackageName(), QCheckListItem::CheckBox ); + + if ( it->isInstalled() ) + { + // If a different version of package is available, show update available icon + // Otherwise, show installed icon + if ( it->getVersion() != it->getInstalledVersion() && + compareVersions( it->getInstalledVersion(), it->getVersion() ) == 1) + { + + item->setPixmap( 0, updatedIcon ); + } + else + { + item->setPixmap( 0, installedIcon ); + } + + QString destName = ""; + if ( it->getLocalPackage() ) + { + if ( it->getLocalPackage()->getInstalledTo() ) + destName = it->getLocalPackage()->getInstalledTo()->getDestinationName(); + } + else + { + if ( it->getInstalledTo() ) + destName = it->getInstalledTo()->getDestinationName(); + } + if ( destName != "" ) + new QCheckListItem( item, QString( tr( "Installed To - %1" ).arg( destName ) ) ); + } + else + { + item->setPixmap( 0, nullIcon ); + } + + if ( !it->isPackageStoredLocally() ) + { + new QCheckListItem( item, QString( tr( "Description - %1" ).arg( it->getDescription() ) ) ); + new QCheckListItem( item, QString( tr( "Size - %1" ).arg( it->getPackageSize() ) ) ); + new QCheckListItem( item, QString( tr( "Section - %1" ).arg( it->getSection() ) ) ); + } + else + new QCheckListItem( item, QString( tr( "Filename - %1" ).arg( it->getFilename() ) ) ); + + if ( serverName == LOCAL_SERVER ) + { + new QCheckListItem( item, QString( tr( "V. Installed - %1" ).arg( it->getVersion() ) ) ); + } + else + { + new QCheckListItem( item, QString( tr( "V. Available - %1" ).arg( it->getVersion() ) ) ); + if ( it->getLocalPackage() ) + { + if ( it->isInstalled() ) + new QCheckListItem( item, QString( tr( "V. Installed - %1" ).arg( it->getInstalledVersion() ) ) ); + } + } + + packagesList->insertItem( item ); + } + + // If the local server or the local ipkgs server disable the download button + if ( serverName == LOCAL_SERVER ) + { + downloadEnabled = TRUE; + actionUpgrade->setEnabled( FALSE ); + } + else if ( serverName == LOCAL_IPKGS ) + { + downloadEnabled = FALSE; + actionUpgrade->setEnabled( FALSE ); + } + else + { + downloadEnabled = TRUE; + actionUpgrade->setEnabled( TRUE ); + } + enableDownload( downloadEnabled ); + + // Display this widget once everything is done + if ( doProgress && raiseProgress ) + { + stack->raiseWidget( networkPkgWindow ); + } +} + +void MainWindow :: searchForPackage( const QString &text ) +{ + if ( !text.isEmpty() ) + { +// cout << "searching for " << text << endl; + // look through package list for text startng at current position + vector<InstallData> workingPackages; + QCheckListItem *start = (QCheckListItem *)packagesList->currentItem(); + if ( start != 0 ) + start = (QCheckListItem *)start->nextSibling(); + + if ( start == 0 ) + start = (QCheckListItem *)packagesList->firstChild(); + + for ( QCheckListItem *item = start; item != 0 ; + item = (QCheckListItem *)item->nextSibling() ) + { +// cout << "checking " << item->text().lower() << endl; + if ( item->text().lower().find( text ) != -1 ) + { +// cout << "matched " << item->text() << endl; + packagesList->ensureItemVisible( item ); + packagesList->setCurrentItem( item ); + break; + } + } + } +} + +void MainWindow :: updateServer() +{ + QString serverName = serversList->currentText(); + + // Update the current server + // Display dialog + + // Disable buttons to stop silly people clicking lots on them :) + + // First, write out ipkg_conf file so that ipkg can use it + mgr->writeOutIpkgConf(); + + Ipkg ipkg; + ipkg.setOption( "update" ); + + InstallDlgImpl dlg( &ipkg, tr( "Refreshing server package lists" ), this, tr( "Upgrade" ), true ); + dlg.showDlg(); + + // Reload data + mgr->reloadServerData(); + serverSelected(-1); +// delete progDlg; +} + +void MainWindow :: upgradePackages() +{ + // We're gonna do an upgrade of all packages + // First warn user that this isn't recommended + // TODO - ODevice???? + QString text = tr( "WARNING: Upgrading while\nOpie/Qtopia is running\nis NOT recommended!\n\nAre you sure?\n" ); + QMessageBox warn( tr( "Warning" ), text, QMessageBox::Warning, + QMessageBox::Yes, + QMessageBox::No | QMessageBox::Escape | QMessageBox::Default , + 0, this ); + warn.adjustSize(); + + if ( warn.exec() == QMessageBox::Yes ) + { + // First, write out ipkg_conf file so that ipkg can use it + mgr->writeOutIpkgConf(); + + // Now run upgrade + Ipkg ipkg; + ipkg.setOption( "upgrade" ); + + InstallDlgImpl dlg( &ipkg, tr( "Upgrading installed packages" ), this, tr( "Upgrade" ), true ); + dlg.showDlg(); + + // Reload data + mgr->reloadServerData(); + serverSelected(-1); + } +} + void MainWindow :: downloadPackage() +{ + bool doUpdate = true; + if ( downloadEnabled ) + { + // See if any packages are selected + bool found = false; + if ( serversList->currentText() != LOCAL_SERVER ) + { + for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + item != 0 && !found; + item = (QCheckListItem *)item->nextSibling() ) + { + if ( item->isOn() ) + found = true; + } + } + + // If user selected some packages then download the and store the locally + // otherwise, display dialog asking user what package to download from an http server + // and whether to install it + if ( found ) + downloadSelectedPackages(); + else + downloadRemotePackage(); + + } + else + { + doUpdate = false; + for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + item != 0 ; + item = (QCheckListItem *)item->nextSibling() ) + { + if ( item->isOn() ) + { + QString name = item->text(); + int pos = name.find( "*" ); + name.truncate( pos ); + + // if (there is a (installed), remove it + pos = name.find( "(installed)" ); + if ( pos > 0 ) + name.truncate( pos - 1 ); + + Package *p = mgr->getServer( serversList->currentText() )->getPackage( name ); + + QString msgtext; + msgtext = tr( "Are you sure you wish to delete\n%1?" ).arg( (const char *)p->getPackageName() ); + if ( QMessageBox::information( this, tr( "Are you sure?" ), + msgtext, tr( "No" ), tr( "Yes" ) ) == 1 ) + { + doUpdate = true; + QFile f( p->getFilename() ); + f.remove(); + } + } + } + } + + if ( doUpdate ) + { + mgr->reloadServerData(); + serverSelected( -1 ); + } +} + +void MainWindow :: downloadSelectedPackages() +{ + // First, write out ipkg_conf file so that ipkg can use it + mgr->writeOutIpkgConf(); + + // Display dialog to user asking where to download the files to + bool ok = FALSE; + QString dir = ""; +#ifdef QWS + // read download directory from config file + Config cfg( "aqpkg" ); + cfg.setGroup( "settings" ); + dir = cfg.readEntry( "downloadDir", "/home/root/Documents/application/ipkg" ); +#endif + + QString text = InputDialog::getText( tr( "Download to where" ), tr( "Enter path to download to" ), dir, &ok, this ); + if ( ok && !text.isEmpty() ) + dir = text; // user entered something and pressed ok + else + return; // user entered nothing or pressed cancel + +#ifdef QWS + // Store download directory in config file + cfg.writeEntry( "downloadDir", dir ); +#endif + + // Get starting directory + char initDir[PATH_MAX]; + getcwd( initDir, PATH_MAX ); + + // Download each package + Ipkg ipkg; + connect( &ipkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &))); + + ipkg.setOption( "download" ); + ipkg.setRuntimeDirectory( dir ); + for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + item != 0 ; + item = (QCheckListItem *)item->nextSibling() ) + { + if ( item->isOn() ) + { + ipkg.setPackage( item->text() ); + ipkg.runIpkg( ); + } + } +} + +void MainWindow :: downloadRemotePackage() +{ + // Display dialog + bool ok; + QString package = InputDialog::getText( tr( "Install Remote Package" ), tr( "Enter package location" ), "http://", &ok, this ); + if ( !ok || package.isEmpty() ) + return; +// DownloadRemoteDlgImpl dlg( this, "Install", true ); +// if ( dlg.exec() == QDialog::Rejected ) +// return; + + // grab details from dialog +// QString package = dlg.getPackageLocation(); + + InstallData item; + item.option = "I"; + item.packageName = package; + vector<InstallData> workingPackages; + workingPackages.push_back( item ); + + InstallDlgImpl dlg2( workingPackages, mgr, this, "Install", true ); + dlg2.showDlg(); + + // Reload data + mgr->reloadServerData(); + serverSelected(-1); + +#ifdef QWS + // Finally let the main system update itself + QCopEnvelope e("QPE/System", "linkChanged(QString)"); + QString lf = QString::null; + e << lf; +#endif +} + + +void MainWindow :: applyChanges() +{ + stickyOption = ""; + + // First, write out ipkg_conf file so that ipkg can use it + mgr->writeOutIpkgConf(); + + // Now for each selected item + // deal with it + + vector<InstallData> workingPackages; + for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); + item != 0 ; + item = (QCheckListItem *)item->nextSibling() ) + { + if ( item->isOn() ) + { + InstallData data = dealWithItem( item ); + workingPackages.push_back( data ); + } + } + + if ( workingPackages.size() == 0 ) + { + // Nothing to do + QMessageBox::information( this, tr( "Nothing to do" ), + tr( "No packages selected" ), tr( "OK" ) ); + + return; + } + + // do the stuff + InstallDlgImpl dlg( workingPackages, mgr, this, "Install", true ); + dlg.showDlg(); + + // Reload data + mgr->reloadServerData(); + serverSelected(-1); + +#ifdef QWS + // Finally let the main system update itself + QCopEnvelope e("QPE/System", "linkChanged(QString)"); + QString lf = QString::null; + e << lf; +#endif +} + +// decide what to do - either remove, upgrade or install +// Current rules: +// If not installed - install +// If installed and different version available - upgrade +// If installed and version up to date - remove +InstallData MainWindow :: dealWithItem( QCheckListItem *item ) +{ + QString name = item->text(); + + // Get package + vector<Server>::iterator s = mgr->getServer( serversList->currentText() ); + Package *p = s->getPackage( name ); + + // If the package has a filename then it is a local file + if ( p->isPackageStoredLocally() ) + name = p->getFilename(); + + QString option; + QString dest = "root"; + if ( !p->isInstalled() ) + { + InstallData item; + item.option = "I"; + item.packageName = name; + return item; + } + else + { + InstallData item; + item.option = "D"; + if ( !p->isPackageStoredLocally() ) + item.packageName = p->getInstalledPackageName(); + else + item.packageName = name; + + if ( p->getInstalledTo() ) + { + item.destination = p->getInstalledTo(); +// cout << "dest - " << p->getInstalledTo()->getDestinationName() << endl; +// cout << "dest - " << p->getInstalledTo()->getDestinationPath() << endl; + } + else + { + item.destination = p->getLocalPackage()->getInstalledTo(); + } + + // Now see if version is newer or not + int val = compareVersions( p->getInstalledVersion(), p->getVersion() ); + + // If the version requested is older and user selected a local ipk file, then reinstall the file + if ( p->isPackageStoredLocally() && val == -1 ) + val = 0; + + if ( val == -2 ) + { + // Error - should handle + } + else if ( val == -1 ) + { + // Version available is older - remove only + item.option = "D"; + } + else + { + QString caption; + QString text; + QString secondButton; + QString secondOption; + if ( val == 0 ) + { + // Version available is the same - option to remove or reinstall + caption = tr( "Do you wish to remove or reinstall\n%1?" ); + text = tr( "Remove or ReInstall" ); + secondButton = tr( "ReInstall" ); + secondOption = tr( "R" ); + } + else if ( val == 1 ) + { + // Version available is newer - option to remove or upgrade + caption = tr( "Do you wish to remove or upgrade\n%1?" ); + text = tr( "Remove or Upgrade" ); + secondButton = tr( "Upgrade" ); + secondOption = tr( "U" ); + } + + // Sticky option not implemented yet, but will eventually allow + // the user to say something like 'remove all' + if ( stickyOption == "" ) + { + QString msgtext; + msgtext = caption.arg( ( const char * )name ); + switch( QMessageBox::information( this, text, + msgtext, tr( "Remove" ), secondButton ) ) + { + case 0: // Try again or Enter + // option 0 = Remove + item.option = "D"; + break; + case 1: // Quit or Escape + item.option = secondOption; + break; + } + } + else + { +// item.option = stickyOption; + } + } + + + // Check if we are reinstalling the same version + if ( item.option != "R" ) + item.recreateLinks = true; + else + item.recreateLinks = false; + + // User hit cancel (on dlg - assume remove) + return item; + } +} + +void MainWindow :: letterPushed( QString t ) +{ + QCheckListItem *top = (QCheckListItem *)packagesList->firstChild(); + QCheckListItem *start = (QCheckListItem *)packagesList->currentItem(); + if ( packagesList->firstChild() == 0 ) + return; + + QCheckListItem *item; + if ( start == 0 ) + { + item = (QCheckListItem *)packagesList->firstChild(); + start = top; + } + else + item = (QCheckListItem *)start->nextSibling(); + + if ( item == 0 ) + item = (QCheckListItem *)packagesList->firstChild(); + do + { + if ( item->text().lower().startsWith( t.lower() ) ) + { + packagesList->setSelected( item, true ); + packagesList->ensureItemVisible( item ); + break; + } + + item = (QCheckListItem *)item->nextSibling(); + if ( !item ) + item = (QCheckListItem *)packagesList->firstChild(); + } while ( item != start); +} diff --git a/noncore/settings/aqpkg/mainwin.h b/noncore/settings/aqpkg/mainwin.h index ef67cc9..46b5fae 100644 --- a/noncore/settings/aqpkg/mainwin.h +++ b/noncore/settings/aqpkg/mainwin.h @@ -1,89 +1,133 @@ /*************************************************************************** mainwin.h - description ------------------- begin : Mon Aug 26 13:32:30 BST 2002 copyright : (C) 2002 by Andy Qua email : andy.qua@blueyonder.co.uk ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifndef MAINWIN_H #define MAINWIN_H #include <qmainwindow.h> #include <qpixmap.h> -class QWidgetStack; -class QPEToolBar; -class QLineEdit; -class QAction; -class ProgressWidget; -class NetworkPackageManager; class DataManager; +class InstallData; + +class QAction; +class QCheckListItem; +class QComboBox; +class QLabel; +class QLineEdit; +class QListView; +class QPEToolBar; +class QProgressBar; +class QWidgetStack; class MainWindow :public QMainWindow { Q_OBJECT public: MainWindow(); ~MainWindow(); private: DataManager *mgr; QWidgetStack *stack; QPEToolBar *findBar; QLineEdit *findEdit; QAction *actionFindNext; QAction *actionFilter; QAction *actionUpgrade; QAction *actionDownload; QAction *actionUninstalled; QAction *actionInstalled; QAction *actionUpdated; QPixmap iconDownload; QPixmap iconRemove; - NetworkPackageManager *networkPkgWindow; - ProgressWidget *progressWindow; - int mnuShowUninstalledPkgsId; int mnuShowInstalledPkgsId; int mnuShowUpgradedPkgsId; int mnuFilterByCategory; int mnuSetFilterCategory; + // Main package list widget + QWidget *networkPkgWindow; + QComboBox *serversList; + QListView *packagesList; + QPixmap installedIcon; + QPixmap updatedIcon; + QString currentlySelectedServer; + QString categoryFilter; + QString stickyOption; + + bool categoryFilterEnabled; + bool showJumpTo; + bool showUninstalledPkgs; + bool showInstalledPkgs; + bool showUpgradedPkgs; + bool downloadEnabled; + + void initMainWidget(); + void updateData(); + void serverSelected( int index, bool showProgress ); + void searchForPackage( const QString & ); + bool filterByCategory( bool val ); + void downloadSelectedPackages(); + void downloadRemotePackage(); + InstallData dealWithItem( QCheckListItem *item ); + + // Progress widget + QWidget *progressWindow; + QLabel *m_status; + QProgressBar *m_progress; + + void initProgressWidget(); + public slots: void setDocument( const QString &doc ); void displayHelp(); void displayFindBar(); void repeatFind(); void findPackage( const QString & ); void hideFindBar(); void displayAbout(); void displaySettings(); void filterUninstalledPackages(); void filterInstalledPackages(); void filterUpgradedPackages(); void filterCategory(); - void setFilterCategory(); + bool setFilterCategory(); void raiseMainWidget(); void raiseProgressWidget(); void enableUpgrade( bool ); void enableDownload( bool ); private slots: void init(); + void setProgressSteps( int ); + void setProgressMessage( const QString & ); + void updateProgress( int ); + void serverSelected( int index ); + void updateServer(); + void upgradePackages(); + void downloadPackage(); + void applyChanges(); + void letterPushed( QString t ); }; #endif diff --git a/noncore/settings/aqpkg/networkpkgmgr.cpp b/noncore/settings/aqpkg/networkpkgmgr.cpp deleted file mode 100644 index b4b6475..0000000 --- a/noncore/settings/aqpkg/networkpkgmgr.cpp +++ b/dev/null @@ -1,870 +0,0 @@ -/*************************************************************************** - networkpkgmgr.cpp - description - ------------------- - begin : Mon Aug 26 13:32:30 BST 2002 - copyright : (C) 2002 by Andy Qua - email : andy.qua@blueyonder.co.uk - ***************************************************************************/ - -/*************************************************************************** - * * - * 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. * - * * - ***************************************************************************/ - -#include <unistd.h> - -#ifdef QWS -#include <qpe/qpeapplication.h> -#include <qpe/qcopenvelope_qws.h> -#include <qpe/config.h> -#include <qpe/resource.h> -#else -#include <qapplication.h> -#endif -#include <qlabel.h> -#include <qfile.h> -#include <qmessagebox.h> -#include <qwhatsthis.h> - -#include "datamgr.h" -#include "networkpkgmgr.h" -#include "installdlgimpl.h" -#include "ipkg.h" -#include "inputdlg.h" -#include "letterpushbutton.h" -#include "categoryfilterimpl.h" - -#include "global.h" - -extern int compareVersions( const char *v1, const char *v2 ); - -NetworkPackageManager::NetworkPackageManager( QWidget *parent, const char *name ) - : QWidget(parent, name) -{ - -#ifdef QWS - // read download directory from config file - Config cfg( "aqpkg" ); - cfg.setGroup( "settings" ); - currentlySelectedServer = cfg.readEntry( "selectedServer", "local" ); - showJumpTo = cfg.readBoolEntry( "showJumpTo", "true" ); - -#endif - - showUninstalledPkgs = false; - showInstalledPkgs = false; - showUpgradedPkgs = false; - categoryFilterEnabled = false; - - initGui(); -} - -NetworkPackageManager::~NetworkPackageManager() -{ -} - -void NetworkPackageManager :: setDataManager( DataManager *dm ) -{ - dataMgr = dm; -} - -void NetworkPackageManager :: updateData() -{ - emit progressSetSteps( dataMgr->getServerList().size() ); - - serversList->clear(); - packagesList->clear(); - - vector<Server>::iterator it; - int activeItem = -1; - int i; - QString serverName; - for ( i = 0, it = dataMgr->getServerList().begin() ; it != dataMgr->getServerList().end() ; ++it, ++i ) - { - serverName = it->getServerName(); - emit progressSetMessage( tr( "Building server list:\n\t%1" ).arg( serverName ) ); - emit progressUpdate( i ); - qApp->processEvents(); - -// cout << "Adding " << it->getServerName() << " to combobox" << endl; - if ( !it->isServerActive() ) - { -// cout << serverName << " is not active" << endl; - i--; - continue; - } - - serversList->insertItem( serverName ); - if ( serverName == currentlySelectedServer ) - activeItem = i; - } - - // set selected server to be active server - if ( activeItem != -1 ) - serversList->setCurrentItem( activeItem ); - serverSelected( 0, FALSE ); -} - -void NetworkPackageManager :: selectLocalPackage( const QString &pkg ) -{ - // First select local server - for ( int i = 0 ; i < serversList->count() ; ++i ) - { - if ( serversList->text( i ) == LOCAL_IPKGS ) - { - serversList->setCurrentItem( i ); - break; - } - } - serverSelected( 0 ); - - // Now set the check box of the selected package - for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); - item != 0 ; - item = (QCheckListItem *)item->nextSibling() ) - { - if ( item->text().startsWith( pkg ) ) - { - item->setOn( true ); - break; - } - } -} - - -void NetworkPackageManager :: initGui() -{ - QLabel *l = new QLabel( tr( "Servers" ), this ); - serversList = new QComboBox( this ); - connect( serversList, SIGNAL(activated( int )), this, SLOT(serverSelected( int ))); - QWhatsThis::add( serversList, tr( "Click here to select a package feed." ) ); - - installedIcon = Resource::loadPixmap( "aqpkg/installed" ); - updatedIcon = Resource::loadPixmap( "aqpkg/updated" ); - - packagesList = new QListView( this ); - packagesList->addColumn( tr( "Packages" ), 225 ); - QWhatsThis::add( packagesList, tr( "This is a listing of all packages for the server feed selected above.\n\nA blue dot next to the package name indicates that the package is currently installed.\n\nA blue dot with a star indicates that a newer version of the package is available from the server feed.\n\nClick inside the box at the left to select a package." ) ); - - QVBoxLayout *vbox = new QVBoxLayout( this, 0, -1 ); - QHBoxLayout *hbox1 = new QHBoxLayout( vbox, -1 ); - hbox1->addWidget( l ); - hbox1->addWidget( serversList ); - - QHBoxLayout *hbox3 = new QHBoxLayout( vbox, -1 ); - QHBoxLayout *hbox4 = new QHBoxLayout( vbox, -1 ); - - - if ( showJumpTo ) - { - char text[2]; - text[1] = '\0'; - for ( int i = 0 ; i < 26 ; ++i ) - { - text[0] = 'A' + i; - LetterPushButton *b = new LetterPushButton( text, this ); - connect( b, SIGNAL( released( QString ) ), this, SLOT( letterPushed( QString ) ) ); - if ( i < 13 ) - hbox3->addWidget( b ); - else - hbox4->addWidget( b ); - } - } - - vbox->addWidget( packagesList ); - - downloadEnabled = TRUE; -} - -void NetworkPackageManager :: serverSelected( int index ) -{ - serverSelected( index, TRUE ); -} - -void NetworkPackageManager :: serverSelected( int, bool raiseProgress ) -{ - QPixmap nullIcon( installedIcon.size() ); - nullIcon.fill( colorGroup().base() ); - - // display packages - QString serverName = serversList->currentText(); - currentlySelectedServer = serverName; - - vector<Server>::iterator s = dataMgr->getServer( serverName ); - - vector<Package> &list = s->getPackageList(); - vector<Package>::iterator it; - - // Display progress widget while loading list - bool doProgress = ( list.size() > 200 ); - if ( doProgress ) - { - if ( raiseProgress ) - { - emit appRaiseProgressWidget(); - } - emit progressSetSteps( list.size() ); - emit progressSetMessage( tr( "Building package list for:\n\t%1" ).arg( serverName ) ); - } - - packagesList->clear(); - -#ifdef QWS - // read download directory from config file - Config cfg( "aqpkg" ); - cfg.setGroup( "settings" ); - cfg.writeEntry( "selectedServer", currentlySelectedServer ); -#endif - - int i = 0; - for ( it = list.begin() ; it != list.end() ; ++it ) - { - // Update progress after every 100th package (arbitrary value, seems to give good balance) - i++; - if ( ( i % 100 ) == 0 ) - { - if ( doProgress ) - { - emit progressUpdate( i ); - } - qApp->processEvents(); - } - - QString text = ""; - - // Apply show only uninstalled packages filter - if ( showUninstalledPkgs && it->isInstalled() ) - continue; - - // Apply show only installed packages filter - if ( showInstalledPkgs && !it->isInstalled() ) - continue; - - // Apply show only new installed packages filter - if ( showUpgradedPkgs ) - { - if ( !it->isInstalled() || - compareVersions( it->getInstalledVersion(), it->getVersion() ) != 1 ) - continue; - } - - // Apply the section filter - if ( categoryFilterEnabled && categoryFilter != "" ) - { - if ( it->getSection() == "" || categoryFilter.find( it->getSection().lower() ) == -1 ) - continue; - } - - // If the local server, only display installed packages - if ( serverName == LOCAL_SERVER && !it->isInstalled() ) - continue; - - - QCheckListItem *item = new QCheckListItem( packagesList, it->getPackageName(), QCheckListItem::CheckBox ); - - if ( it->isInstalled() ) - { - // If a different version of package is available, show update available icon - // Otherwise, show installed icon - if ( it->getVersion() != it->getInstalledVersion() && - compareVersions( it->getInstalledVersion(), it->getVersion() ) == 1) - { - - item->setPixmap( 0, updatedIcon ); - } - else - { - item->setPixmap( 0, installedIcon ); - } - - QString destName = ""; - if ( it->getLocalPackage() ) - { - if ( it->getLocalPackage()->getInstalledTo() ) - destName = it->getLocalPackage()->getInstalledTo()->getDestinationName(); - } - else - { - if ( it->getInstalledTo() ) - destName = it->getInstalledTo()->getDestinationName(); - } - if ( destName != "" ) - new QCheckListItem( item, QString( tr( "Installed To - %1" ).arg( destName ) ) ); - } - else - { - item->setPixmap( 0, nullIcon ); - } - - if ( !it->isPackageStoredLocally() ) - { - new QCheckListItem( item, QString( tr( "Description - %1" ).arg( it->getDescription() ) ) ); - new QCheckListItem( item, QString( tr( "Size - %1" ).arg( it->getPackageSize() ) ) ); - new QCheckListItem( item, QString( tr( "Section - %1" ).arg( it->getSection() ) ) ); - } - else - new QCheckListItem( item, QString( tr( "Filename - %1" ).arg( it->getFilename() ) ) ); - - if ( serverName == LOCAL_SERVER ) - { - new QCheckListItem( item, QString( tr( "V. Installed - %1" ).arg( it->getVersion() ) ) ); - } - else - { - new QCheckListItem( item, QString( tr( "V. Available - %1" ).arg( it->getVersion() ) ) ); - if ( it->getLocalPackage() ) - { - if ( it->isInstalled() ) - new QCheckListItem( item, QString( tr( "V. Installed - %1" ).arg( it->getInstalledVersion() ) ) ); - } - } - - packagesList->insertItem( item ); - } - - // If the local server or the local ipkgs server disable the download button - if ( serverName == LOCAL_SERVER ) - { - downloadEnabled = TRUE; - emit appEnableUpgrade( FALSE ); - } - else if ( serverName == LOCAL_IPKGS ) - { - downloadEnabled = FALSE; - emit appEnableUpgrade( FALSE ); - } - else - { - downloadEnabled = TRUE; - emit appEnableUpgrade( TRUE ); - } - emit appEnableDownload( downloadEnabled ); - - // Display this widget once everything is done - if ( doProgress && raiseProgress ) - { - emit appRaiseMainWidget(); - } -} - -void NetworkPackageManager :: updateServer() -{ - QString serverName = serversList->currentText(); - - // Update the current server - // Display dialog - - // Disable buttons to stop silly people clicking lots on them :) - - // First, write out ipkg_conf file so that ipkg can use it - dataMgr->writeOutIpkgConf(); - - Ipkg ipkg; - ipkg.setOption( "update" ); - - InstallDlgImpl dlg( &ipkg, tr( "Refreshing server package lists" ), this, tr( "Upgrade" ), true ); - dlg.showDlg(); - - // Reload data - dataMgr->reloadServerData(); - serverSelected(-1); -// delete progDlg; -} - -void NetworkPackageManager :: upgradePackages() -{ - // We're gonna do an upgrade of all packages - // First warn user that this isn't recommended - // TODO - ODevice???? - QString text = tr( "WARNING: Upgrading while\nOpie/Qtopia is running\nis NOT recommended!\n\nAre you sure?\n" ); - QMessageBox warn( tr( "Warning" ), text, QMessageBox::Warning, - QMessageBox::Yes, - QMessageBox::No | QMessageBox::Escape | QMessageBox::Default , - 0, this ); - warn.adjustSize(); - - if ( warn.exec() == QMessageBox::Yes ) - { - // First, write out ipkg_conf file so that ipkg can use it - dataMgr->writeOutIpkgConf(); - - // Now run upgrade - Ipkg ipkg; - ipkg.setOption( "upgrade" ); - - InstallDlgImpl dlg( &ipkg, tr( "Upgrading installed packages" ), this, tr( "Upgrade" ), true ); - dlg.showDlg(); - - // Reload data - dataMgr->reloadServerData(); - serverSelected(-1); - } -} - - -void NetworkPackageManager :: downloadPackage() -{ - bool doUpdate = true; - if ( downloadEnabled ) - { - // See if any packages are selected - bool found = false; - if ( serversList->currentText() != LOCAL_SERVER ) - { - for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); - item != 0 && !found; - item = (QCheckListItem *)item->nextSibling() ) - { - if ( item->isOn() ) - found = true; - } - } - - // If user selected some packages then download the and store the locally - // otherwise, display dialog asking user what package to download from an http server - // and whether to install it - if ( found ) - downloadSelectedPackages(); - else - downloadRemotePackage(); - - } - else - { - doUpdate = false; - for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); - item != 0 ; - item = (QCheckListItem *)item->nextSibling() ) - { - if ( item->isOn() ) - { - QString name = item->text(); - int pos = name.find( "*" ); - name.truncate( pos ); - - // if (there is a (installed), remove it - pos = name.find( "(installed)" ); - if ( pos > 0 ) - name.truncate( pos - 1 ); - - Package *p = dataMgr->getServer( serversList->currentText() )->getPackage( name ); - - QString msgtext; - msgtext = tr( "Are you sure you wish to delete\n%1?" ).arg( (const char *)p->getPackageName() ); - if ( QMessageBox::information( this, tr( "Are you sure?" ), - msgtext, tr( "No" ), tr( "Yes" ) ) == 1 ) - { - doUpdate = true; - QFile f( p->getFilename() ); - f.remove(); - } - } - } - } - - if ( doUpdate ) - { - dataMgr->reloadServerData(); - serverSelected( -1 ); - } -} - -void NetworkPackageManager :: downloadSelectedPackages() -{ - // First, write out ipkg_conf file so that ipkg can use it - dataMgr->writeOutIpkgConf(); - - // Display dialog to user asking where to download the files to - bool ok = FALSE; - QString dir = ""; -#ifdef QWS - // read download directory from config file - Config cfg( "aqpkg" ); - cfg.setGroup( "settings" ); - dir = cfg.readEntry( "downloadDir", "/home/root/Documents/application/ipkg" ); -#endif - - QString text = InputDialog::getText( tr( "Download to where" ), tr( "Enter path to download to" ), dir, &ok, this ); - if ( ok && !text.isEmpty() ) - dir = text; // user entered something and pressed ok - else - return; // user entered nothing or pressed cancel - -#ifdef QWS - // Store download directory in config file - cfg.writeEntry( "downloadDir", dir ); -#endif - - // Get starting directory - char initDir[PATH_MAX]; - getcwd( initDir, PATH_MAX ); - - // Download each package - Ipkg ipkg; - connect( &ipkg, SIGNAL(outputText(const QString &)), this, SLOT(displayText(const QString &))); - - ipkg.setOption( "download" ); - ipkg.setRuntimeDirectory( dir ); - for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); - item != 0 ; - item = (QCheckListItem *)item->nextSibling() ) - { - if ( item->isOn() ) - { - ipkg.setPackage( item->text() ); - ipkg.runIpkg( ); - } - } -} - -void NetworkPackageManager :: downloadRemotePackage() -{ - // Display dialog - bool ok; - QString package = InputDialog::getText( tr( "Install Remote Package" ), tr( "Enter package location" ), "http://", &ok, this ); - if ( !ok || package.isEmpty() ) - return; -// DownloadRemoteDlgImpl dlg( this, "Install", true ); -// if ( dlg.exec() == QDialog::Rejected ) -// return; - - // grab details from dialog -// QString package = dlg.getPackageLocation(); - - InstallData item; - item.option = "I"; - item.packageName = package; - vector<InstallData> workingPackages; - workingPackages.push_back( item ); - - InstallDlgImpl dlg2( workingPackages, dataMgr, this, "Install", true ); - dlg2.showDlg(); - - // Reload data - dataMgr->reloadServerData(); - serverSelected(-1); - -#ifdef QWS - // Finally let the main system update itself - QCopEnvelope e("QPE/System", "linkChanged(QString)"); - QString lf = QString::null; - e << lf; -#endif -} - - -void NetworkPackageManager :: applyChanges() -{ - stickyOption = ""; - - // First, write out ipkg_conf file so that ipkg can use it - dataMgr->writeOutIpkgConf(); - - // Now for each selected item - // deal with it - - vector<InstallData> workingPackages; - for ( QCheckListItem *item = (QCheckListItem *)packagesList->firstChild(); - item != 0 ; - item = (QCheckListItem *)item->nextSibling() ) - { - if ( item->isOn() ) - { - InstallData data = dealWithItem( item ); - workingPackages.push_back( data ); - } - } - - if ( workingPackages.size() == 0 ) - { - // Nothing to do - QMessageBox::information( this, tr( "Nothing to do" ), - tr( "No packages selected" ), tr( "OK" ) ); - - return; - } - - // do the stuff - InstallDlgImpl dlg( workingPackages, dataMgr, this, "Install", true ); - dlg.showDlg(); - - // Reload data - dataMgr->reloadServerData(); - serverSelected(-1); - -#ifdef QWS - // Finally let the main system update itself - QCopEnvelope e("QPE/System", "linkChanged(QString)"); - QString lf = QString::null; - e << lf; -#endif -} - -// decide what to do - either remove, upgrade or install -// Current rules: -// If not installed - install -// If installed and different version available - upgrade -// If installed and version up to date - remove -InstallData NetworkPackageManager :: dealWithItem( QCheckListItem *item ) -{ - QString name = item->text(); - - // Get package - vector<Server>::iterator s = dataMgr->getServer( serversList->currentText() ); - Package *p = s->getPackage( name ); - - // If the package has a filename then it is a local file - if ( p->isPackageStoredLocally() ) - name = p->getFilename(); - - QString option; - QString dest = "root"; - if ( !p->isInstalled() ) - { - InstallData item; - item.option = "I"; - item.packageName = name; - return item; - } - else - { - InstallData item; - item.option = "D"; - if ( !p->isPackageStoredLocally() ) - item.packageName = p->getInstalledPackageName(); - else - item.packageName = name; - - if ( p->getInstalledTo() ) - { - item.destination = p->getInstalledTo(); -// cout << "dest - " << p->getInstalledTo()->getDestinationName() << endl; -// cout << "dest - " << p->getInstalledTo()->getDestinationPath() << endl; - } - else - { - item.destination = p->getLocalPackage()->getInstalledTo(); - } - - // Now see if version is newer or not - int val = compareVersions( p->getInstalledVersion(), p->getVersion() ); - - // If the version requested is older and user selected a local ipk file, then reinstall the file - if ( p->isPackageStoredLocally() && val == -1 ) - val = 0; - - if ( val == -2 ) - { - // Error - should handle - } - else if ( val == -1 ) - { - // Version available is older - remove only - item.option = "D"; - } - else - { - QString caption; - QString text; - QString secondButton; - QString secondOption; - if ( val == 0 ) - { - // Version available is the same - option to remove or reinstall - caption = tr( "Do you wish to remove or reinstall\n%1?" ); - text = tr( "Remove or ReInstall" ); - secondButton = tr( "ReInstall" ); - secondOption = tr( "R" ); - } - else if ( val == 1 ) - { - // Version available is newer - option to remove or upgrade - caption = tr( "Do you wish to remove or upgrade\n%1?" ); - text = tr( "Remove or Upgrade" ); - secondButton = tr( "Upgrade" ); - secondOption = tr( "U" ); - } - - // Sticky option not implemented yet, but will eventually allow - // the user to say something like 'remove all' - if ( stickyOption == "" ) - { - QString msgtext; - msgtext = caption.arg( ( const char * )name ); - switch( QMessageBox::information( this, text, - msgtext, tr( "Remove" ), secondButton ) ) - { - case 0: // Try again or Enter - // option 0 = Remove - item.option = "D"; - break; - case 1: // Quit or Escape - item.option = secondOption; - break; - } - } - else - { -// item.option = stickyOption; - } - } - - - // Check if we are reinstalling the same version - if ( item.option != "R" ) - item.recreateLinks = true; - else - item.recreateLinks = false; - - // User hit cancel (on dlg - assume remove) - return item; - } -} - -void NetworkPackageManager :: displayText( const QString &/*t*/ ) -{ -// cout << t << endl; -} - - -void NetworkPackageManager :: letterPushed( QString t ) -{ - QCheckListItem *top = (QCheckListItem *)packagesList->firstChild(); - QCheckListItem *start = (QCheckListItem *)packagesList->currentItem(); - if ( packagesList->firstChild() == 0 ) - return; - - QCheckListItem *item; - if ( start == 0 ) - { - item = (QCheckListItem *)packagesList->firstChild(); - start = top; - } - else - item = (QCheckListItem *)start->nextSibling(); - - if ( item == 0 ) - item = (QCheckListItem *)packagesList->firstChild(); - do - { - if ( item->text().lower().startsWith( t.lower() ) ) - { - packagesList->setSelected( item, true ); - packagesList->ensureItemVisible( item ); - break; - } - - item = (QCheckListItem *)item->nextSibling(); - if ( !item ) - item = (QCheckListItem *)packagesList->firstChild(); - } while ( item != start); -} - - -void NetworkPackageManager :: searchForPackage( const QString &text ) -{ - if ( !text.isEmpty() ) - { -// cout << "searching for " << text << endl; - // look through package list for text startng at current position - vector<InstallData> workingPackages; - QCheckListItem *start = (QCheckListItem *)packagesList->currentItem(); - if ( start != 0 ) - start = (QCheckListItem *)start->nextSibling(); - - if ( start == 0 ) - start = (QCheckListItem *)packagesList->firstChild(); - - for ( QCheckListItem *item = start; item != 0 ; - item = (QCheckListItem *)item->nextSibling() ) - { -// cout << "checking " << item->text().lower() << endl; - if ( item->text().lower().find( text ) != -1 ) - { -// cout << "matched " << item->text() << endl; - packagesList->ensureItemVisible( item ); - packagesList->setCurrentItem( item ); - break; - } - } - } -} - -void NetworkPackageManager :: showOnlyUninstalledPackages( bool val ) -{ - showUninstalledPkgs = val; - if ( val ) - { - showInstalledPkgs = FALSE; - showUpgradedPkgs = FALSE; - } - serverSelected( -1 ); -} - -void NetworkPackageManager :: showOnlyInstalledPackages( bool val ) -{ - showInstalledPkgs = val; - if ( val ) - { - showUninstalledPkgs = FALSE; - showUpgradedPkgs = FALSE; - } - serverSelected( -1 ); -} - -void NetworkPackageManager :: showUpgradedPackages( bool val ) -{ - showUpgradedPkgs = val; - if ( val ) - { - showUninstalledPkgs = FALSE; - showInstalledPkgs = FALSE; - } - serverSelected( -1 ); -} - -bool NetworkPackageManager :: filterByCategory( bool val ) -{ - if ( val ) - { - if ( categoryFilter == "" ) - { - if ( !setFilterCategory() ) - return false; - } - - categoryFilterEnabled = true; - serverSelected( -1 ); - return true; - } - else - { - // Turn off filter - categoryFilterEnabled = false; - serverSelected( -1 ); - return false; - } -} - -bool NetworkPackageManager :: setFilterCategory( ) -{ - // Get categories; - CategoryFilterImpl dlg( DataManager::getAvailableCategories(), categoryFilter, this ); - if ( dlg.exec() == QDialog::Accepted ) - { - categoryFilter = dlg.getSelectedFilter(); - - if ( categoryFilter == "" ) - return false; - - categoryFilterEnabled = true; - serverSelected( -1 ); - return true; - } - - return false; -} diff --git a/noncore/settings/aqpkg/networkpkgmgr.h b/noncore/settings/aqpkg/networkpkgmgr.h deleted file mode 100644 index 99eff2e..0000000 --- a/noncore/settings/aqpkg/networkpkgmgr.h +++ b/dev/null @@ -1,100 +0,0 @@ -/*************************************************************************** - networkpkgmgr.h - description - ------------------- - begin : Mon Aug 26 13:32:30 BST 2002 - copyright : (C) 2002 by Andy Qua - email : andy.qua@blueyonder.co.uk - ***************************************************************************/ - -/*************************************************************************** - * * - * 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. * - * * - ***************************************************************************/ - -#ifndef NETWORKPKGMGR_H -#define NETWORKPKGMGR_H - -#include <qlayout.h> -#include <qpixmap.h> -#include <qpushbutton.h> -#include <qwidget.h> -#include <qcombobox.h> -#include <qlistview.h> - -#include "datamgr.h" - -class InstallData; - -/** NetworkPackageManager is the base class of the project */ -class NetworkPackageManager : public QWidget -{ - Q_OBJECT -public: - /** construtor */ - NetworkPackageManager( QWidget* parent=0, const char *name=0 ); - /** destructor */ - ~NetworkPackageManager(); - - void setDataManager( DataManager *dm ); - void selectLocalPackage( const QString &pkg ); - void updateData(); - void searchForPackage( const QString & ); - void showOnlyUninstalledPackages( bool val ); - void showOnlyInstalledPackages( bool val ); - void showUpgradedPackages( bool val ); - bool filterByCategory( bool val ); - bool setFilterCategory(); - -private: - DataManager *dataMgr; - - QComboBox *serversList; - QListView *packagesList; - - QPixmap installedIcon; - QPixmap updatedIcon; - - QString currentlySelectedServer; - QString categoryFilter; - - bool categoryFilterEnabled; - bool showJumpTo; - bool showUninstalledPkgs; - bool showInstalledPkgs; - bool showUpgradedPkgs; - - bool downloadEnabled; - - void initGui(); - void showProgressDialog( char *initialText ); - void downloadSelectedPackages(); - void downloadRemotePackage(); - void serverSelected( int index, bool showProgress ); - - InstallData dealWithItem( QCheckListItem *item ); - QString stickyOption; - -signals: - void appRaiseMainWidget(); - void appRaiseProgressWidget(); - void appEnableUpgrade( bool ); - void appEnableDownload( bool ); - void progressSetSteps( int ); - void progressSetMessage( const QString & ); - void progressUpdate( int ); - -public slots: - void applyChanges(); - void upgradePackages(); - void downloadPackage(); - void updateServer(); - void displayText( const QString &t ); - void letterPushed( QString t ); - void serverSelected( int index ); -}; - -#endif diff --git a/noncore/settings/aqpkg/progresswidget.cpp b/noncore/settings/aqpkg/progresswidget.cpp deleted file mode 100644 index bbafcac..0000000 --- a/noncore/settings/aqpkg/progresswidget.cpp +++ b/dev/null @@ -1,66 +0,0 @@ -/* - This file is part of the OPIE Project - =. - .=l. Copyright (c) 2002 Dan Williams <drw@handhelds.org> - .>+-= - _;:, .> :=|. This file is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This file is distributed in the hope that - + . -:. = it will be useful, but WITHOUT ANY WARRANTY; - : .. .:, . . . without even the implied warranty of - =_ + =;=|` MERCHANTABILITY or FITNESS FOR A - _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General -..}^=.= = ; Public License for more details. -++= -. .` .: - : = ...= . :.=- You should have received a copy of the GNU - -. .:....=;==+<; General Public License along with this file; - -_. . . )=. = see the file COPYING. If not, write to the - -- :-=` Free Software Foundation, Inc., - 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - -*/ - -#include "progresswidget.h" - -#include <qlabel.h> -#include <qlayout.h> -#include <qprogressbar.h> - -ProgressWidget::ProgressWidget( QWidget *parent, const char *name, WFlags f ) - : QWidget( parent, name, f ) -{ - QVBoxLayout *layout = new QVBoxLayout( this, 4, 4 ); - - m_status = new QLabel( this ); - m_status->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - layout->addWidget( m_status ); - - m_progress = new QProgressBar( this ); - layout->addWidget( m_progress ); -} - -ProgressWidget::~ProgressWidget() -{ -} - -void ProgressWidget::setSteps( int numsteps ) -{ - m_progress->setTotalSteps( numsteps ); -} - -void ProgressWidget::setMessage( const QString &msg ) -{ - m_status->setText( msg ); -} - -void ProgressWidget::update( int progress ) -{ - m_progress->setProgress( progress ); -} - diff --git a/noncore/settings/aqpkg/progresswidget.h b/noncore/settings/aqpkg/progresswidget.h deleted file mode 100644 index 7d99978..0000000 --- a/noncore/settings/aqpkg/progresswidget.h +++ b/dev/null @@ -1,54 +0,0 @@ -/* - This file is part of the OPIE Project - =. - .=l. Copyright (c) 2002 Dan Williams <drw@handhelds.org> - .>+-= - _;:, .> :=|. This file is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This file is distributed in the hope that - + . -:. = it will be useful, but WITHOUT ANY WARRANTY; - : .. .:, . . . without even the implied warranty of - =_ + =;=|` MERCHANTABILITY or FITNESS FOR A - _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU General -..}^=.= = ; Public License for more details. -++= -. .` .: - : = ...= . :.=- You should have received a copy of the GNU - -. .:....=;==+<; General Public License along with this file; - -_. . . )=. = see the file COPYING. If not, write to the - -- :-=` Free Software Foundation, Inc., - 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - -*/ - -#ifndef PROGRESSWIDGET_H -#define PROGRESSWIDGET_H - -#include <qwidget.h> - -class QLabel; -class QProgressBar; - -class ProgressWidget : public QWidget -{ - Q_OBJECT -public: - ProgressWidget( QWidget * = 0, const char * = 0, WFlags = 0 ); - ~ProgressWidget(); - -private: - QLabel *m_status; - QProgressBar *m_progress; - -public slots: - void setSteps( int ); - void setMessage( const QString & ); - void update( int ); -}; - -#endif |