43 #define CHECK_DEPENDENCIES_ON_STARTUP 1 44 #define DEPENDENCY_FEEDBACK_IF_OK 1 45 #define AUTO_CHECK_DEPENDENCIES_DEFAULT true 46 #define ALWAYS_SHOW_PATCHES_VIEW_IF_PATCHES_AVAILABLE 0 47 #define GLOBAL_UPDATE_CONFIRMATION_THRESHOLD 20 48 #define ENABLE_SOURCE_RPMS 0 49 #define BRAINDEAD_LIB_NAMING_SCHEME 1 50 #define MARGIN 6 // around the widget 51 #define SPACING_BELOW_MENU_BAR 4 52 #define SPLITTER_HALF_SPACING 4 57 #include <boost/bind.hpp> 59 #include <QHBoxLayout> 60 #include <QVBoxLayout> 63 #include <QApplication> 66 #include <QFileDialog> 70 #include <QMessageBox> 71 #include <QPushButton> 78 #define YUILogComponent "qt-pkg" 81 #include "QY2LayoutUtils.h" 84 #include "YQPackageSelector.h" 85 #include "YQPkgChangeLogView.h" 86 #include "YQPkgChangesDialog.h" 87 #include "YQPkgConflictDialog.h" 88 #include "YQPkgConflictList.h" 89 #include "YQPkgDependenciesView.h" 90 #include "YQPkgDescriptionView.h" 91 #include "YQPkgDiskUsageList.h" 92 #include "YQPkgDiskUsageWarningDialog.h" 93 #include "YQPkgFileListView.h" 94 #include "YQPkgFilterTab.h" 95 #include "YQPkgHistoryDialog.h" 96 #include "YQPkgLangList.h" 97 #include "YQPkgList.h" 98 #include "YQPkgPackageKitGroupsFilterView.h" 99 #include "YQPkgPatchFilterView.h" 100 #include "YQPkgPatchList.h" 101 #include "YQPkgPatternList.h" 102 #include "YQPkgProductDialog.h" 103 #include "YQPkgRepoFilterView.h" 104 #include "YQPkgRepoList.h" 105 #include "YQPkgSearchFilterView.h" 106 #include "YQPkgServiceFilterView.h" 107 #include "YQPkgStatusFilterView.h" 108 #include "YQPkgTechnicalDetailsView.h" 109 #include "YQPkgTextDialog.h" 110 #include "YQPkgUpdateProblemFilterView.h" 111 #include "YQPkgVersionsView.h" 113 #include "zypp/SysContent.h" 114 #include "zypp/base/String.h" 115 #include "zypp/base/Sysconfig.h" 117 #include "QY2ComboTabWidget.h" 118 #include "YQDialog.h" 119 #include "YQApplication.h" 132 #define DEFAULT_EXPORT_FILE_NAME "user-packages.xml" 133 #define FAST_SOLVER 1 135 #define SETTINGS_DIR "YaST2" 136 #define PATH_TO_YAST_SYSCONFIG "/etc/sysconfig/yast2" 137 #define OPTION_VERIFY "PKGMGR_VERIFY_SYSTEM" 138 #define OPTION_AUTO_CHECK "PKGMGR_AUTO_CHECK" 139 #define OPTION_RECOMMENDED "PKGMGR_RECOMMENDED" 141 YQPackageSelector::YQPackageSelector( YWidget * parent,
145 _showChangesDialog =
true;
146 _autoDependenciesAction = 0;
150 _packageKitGroupsFilterView = 0;
151 _patchFilterView = 0;
154 _pkgChangeLogView = 0;
155 _pkgDependenciesView = 0;
156 _pkgDescriptionView = 0;
157 _pkgFileListView = 0;
159 _pkgTechnicalDetailsView = 0;
160 _pkgVersionsView = 0;
162 _serviceFilterView = 0;
163 _searchFilterView = 0;
164 _statusFilterView = 0;
165 _updateProblemFilterView = 0;
166 _excludeDevelPkgs = 0;
167 _excludeDebugInfoPkgs = 0;
169 yuiMilestone() <<
"This is libyui-qt-pkg " << VERSION << std::endl;
171 if ( onlineUpdateMode() ) yuiMilestone() <<
"Online update mode" << std::endl;
172 if ( updateMode() ) yuiMilestone() <<
"Update mode" << std::endl;
180 _filters->loadSettings();
181 bool pagesRestored = _filters->tabCount() > 0;
186 if ( ! pagesRestored )
188 yuiDebug() <<
"No page configuration saved, using fallbacks" << std::endl;
194 if ( _searchFilterView ) _filters->showPage( _searchFilterView );
196 if ( ! searchMode() && ! summaryMode()
197 && _patternList ) _filters->showPage( _patternList );
199 if ( _statusFilterView ) _filters->showPage( _statusFilterView );
207 if ( _patchFilterView && onlineUpdateMode() )
209 if ( _patchFilterView && _patchList )
211 _filters->showPage( _patchFilterView );
212 _patchList->filter();
215 else if ( _repoFilterView && repoMode() )
219 _filters->showPage( _repoFilterView );
220 _repoFilterView->filter();
223 else if ( _updateProblemFilterView )
225 _filters->showPage( _updateProblemFilterView );
226 _updateProblemFilterView->filter();
228 else if ( searchMode() && _searchFilterView )
230 _filters->showPage( _searchFilterView );
231 _searchFilterView->filter();
232 QTimer::singleShot( 0, _searchFilterView, SLOT( setFocus() ) );
234 else if ( summaryMode() && _statusFilterView )
236 _filters->showPage( _statusFilterView );
237 _statusFilterView->filter();
238 _pkgList->selectNextItem();
240 else if ( _patternList )
242 _filters->showPage( _patternList );
243 _patternList->filter();
247 if ( _filters->diskUsageList() )
248 _filters->diskUsageList()->updateDiskUsage();
250 yuiMilestone() <<
"PackageSelector init done" << std::endl;
253 #if CHECK_DEPENDENCIES_ON_STARTUP 259 QTimer::singleShot( 0,
this, SLOT( resolveDependencies() ) );
267 YQPackageSelector::basicLayout()
269 QVBoxLayout *layout =
new QVBoxLayout();
271 layout->setContentsMargins( MARGIN,
275 layout->setSpacing( SPACING_BELOW_MENU_BAR );
276 layoutMenuBar(
this );
278 QString settingsName =
"YQPackageSelector";
280 if ( onlineUpdateMode() ) settingsName =
"YQOnlineUpdate";
281 if ( updateMode() ) settingsName =
"YQSystemUpdate";
284 YUI_CHECK_NEW( _filters );
286 layout->addWidget( _filters );
287 layoutFilters(
this );
288 layoutRightPane( _filters->
rightPane() );
293 YQPackageSelector::layoutFilters( QWidget *parent )
305 YUI_CHECK_NEW( _updateProblemFilterView );
306 _filters->
addPage( _(
"&Update Problems" ), _updateProblemFilterView,
"update_problems" );
315 if ( onlineUpdateMode()
316 #
if ALWAYS_SHOW_PATCHES_VIEW_IF_PATCHES_AVAILABLE
317 || ! zyppPool().empty<zypp::Patch>()
329 if ( ! zyppPool().empty<zypp::Pattern>() || testMode() )
332 YUI_CHECK_NEW( _patternList );
333 _filters->
addPage( _(
"Patter&ns" ), _patternList,
"patterns" );
335 connect( _patternList, SIGNAL( statusChanged() ),
338 connect(
this, SIGNAL(
refresh() ),
339 _patternList, SLOT ( updateItemStates() ) );
341 if ( _pkgConflictDialog )
343 connect( _pkgConflictDialog, SIGNAL( updatePackages() ),
344 _patternList, SLOT ( updateItemStates() ) );
354 YUI_CHECK_NEW( _packageKitGroupsFilterView );
355 _filters->
addPage( _(
"Package &Groups" ), _packageKitGroupsFilterView,
"package_groups" );
357 connect(
this, SIGNAL(
loadData() ),
358 _packageKitGroupsFilterView, SLOT ( filter() ) );
366 YUI_CHECK_NEW( _langList );
368 _filters->
addPage( _(
"&Languages" ), _langList,
"languages" );
369 _langList->setSizePolicy( QSizePolicy( QSizePolicy::Ignored, QSizePolicy::Ignored ) );
371 connect( _langList, SIGNAL( statusChanged() ),
374 connect(
this, SIGNAL(
refresh() ),
375 _langList, SLOT ( updateItemStates() ) );
383 YUI_CHECK_NEW( _repoFilterView );
384 _filters->
addPage( _(
"&Repositories" ), _repoFilterView,
"repos" );
396 YUI_CHECK_NEW( _serviceFilterView );
399 _filters->
addPage( _(
"&Services" ), _serviceFilterView,
"services" );
407 YUI_CHECK_NEW( _searchFilterView );
408 _filters->
addPage( _(
"S&earch" ), _searchFilterView,
"search" );
415 _filters->
addPage( _(
"&Keywords" ),
new QLabel(
"Keywords\nfilter\n\nfor future use",
this ),
"keywords" );
423 YUI_CHECK_NEW( _statusFilterView );
424 _filters->
addPage( _(
"&Installation Summary" ), _statusFilterView,
"inst_summary" );
428 YQPackageSelector::~YQPackageSelector()
434 YQPackageSelector::layoutRightPane( QWidget *parent )
436 QVBoxLayout *layout =
new QVBoxLayout( parent );
437 YUI_CHECK_NEW( layout );
438 layout->setContentsMargins( SPLITTER_HALF_SPACING,
443 QSplitter * splitter =
new QSplitter( Qt::Vertical, parent );
444 YUI_CHECK_NEW( splitter );
445 layout->addWidget(splitter);
447 layoutPkgList( splitter );
448 layoutDetailsViews( splitter );
449 layoutButtons( parent );
456 YQPackageSelector::layoutPkgList( QWidget *parent )
460 QWidget *_notificationsContainer =
new QWidget(parent);
461 QVBoxLayout *layout =
new QVBoxLayout(_notificationsContainer);
463 _repoUpgradingLabel =
new QLabel(_notificationsContainer);
464 _repoUpgradingLabel->setTextFormat(Qt::RichText);
465 _repoUpgradingLabel->setWordWrap(
true);
466 _repoUpgradingLabel->setVisible(
false);
468 _repoUpgradeLabel =
new QLabel(_notificationsContainer);
469 _repoUpgradeLabel->setTextFormat(Qt::RichText);
470 _repoUpgradeLabel->setWordWrap(
true);
471 _repoUpgradeLabel->setVisible(
false);
472 _repoUpgradeLabel->setObjectName(
"RepoUpgradeLabel");
474 layout->addWidget(_repoUpgradingLabel);
475 layout->addWidget(_repoUpgradeLabel);
481 connect( _repoUpgradeLabel, SIGNAL( linkActivated ( QString ) ),
484 connect(_repoUpgradingLabel, SIGNAL( linkActivated( QString ) ),
490 YUI_CHECK_NEW( _pkgList );
492 connect( _pkgList, SIGNAL( statusChanged() ),
497 YQPackageSelector::layoutDetailsViews( QWidget *parent )
502 _detailsViews =
new QTabWidget( parent );
503 YUI_CHECK_NEW( _detailsViews );
510 YUI_CHECK_NEW( _pkgDescriptionView );
512 _detailsViews->addTab( _pkgDescriptionView, _(
"D&escription" ) );
513 _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
515 connect( _pkgList, SIGNAL( currentItemChanged ( ZyppSel ) ),
516 _pkgDescriptionView, SLOT ( showDetailsIfVisible( ZyppSel ) ) );
523 YUI_CHECK_NEW( _pkgTechnicalDetailsView );
525 _detailsViews->addTab( _pkgTechnicalDetailsView, _(
"&Technical Data" ) );
527 connect( _pkgList, SIGNAL( currentItemChanged ( ZyppSel ) ),
528 _pkgTechnicalDetailsView, SLOT ( showDetailsIfVisible( ZyppSel ) ) );
536 YUI_CHECK_NEW( _pkgDependenciesView );
538 _detailsViews->addTab( _pkgDependenciesView, _(
"Dependencies" ) );
539 _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
541 connect( _pkgList, SIGNAL( currentItemChanged ( ZyppSel ) ),
542 _pkgDependenciesView, SLOT ( showDetailsIfVisible( ZyppSel ) ) );
551 YUI_CHECK_NEW( _pkgVersionsView );
553 _detailsViews->addTab( _pkgVersionsView, _(
"&Versions" ) );
555 connect( _pkgList, SIGNAL( currentItemChanged ( ZyppSel ) ),
556 _pkgVersionsView, SLOT ( showDetailsIfVisible( ZyppSel ) ) );
558 connect( _pkgList, SIGNAL( statusChanged() ),
559 _pkgVersionsView, SIGNAL( statusChanged() ) );
566 if ( haveInstalledPkgs )
569 YUI_CHECK_NEW( _pkgFileListView );
571 _detailsViews->addTab( _pkgFileListView, _(
"File List" ) );
572 _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
574 connect( _pkgList, SIGNAL( currentItemChanged ( ZyppSel ) ),
575 _pkgFileListView, SLOT ( showDetailsIfVisible( ZyppSel ) ) );
583 if ( haveInstalledPkgs )
586 YUI_CHECK_NEW( _pkgChangeLogView );
588 _detailsViews->addTab( _pkgChangeLogView, _(
"Change Log" ) );
589 _detailsViews->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) );
591 connect( _pkgList, SIGNAL( currentItemChanged ( ZyppSel ) ),
592 _pkgChangeLogView, SLOT ( showDetailsIfVisible( ZyppSel ) ) );
598 YQPackageSelector::layoutButtons( QWidget *parent )
600 QWidget * button_box =
new QWidget( parent );
601 YUI_CHECK_NEW( button_box );
602 parent->layout()->addWidget( button_box );
604 QHBoxLayout * layout =
new QHBoxLayout( button_box );
605 YUI_CHECK_NEW( layout );
607 button_box->setLayout( layout );
608 layout->setContentsMargins( 2,
613 layout->addStretch();
615 QPushButton * cancel_button =
new QPushButton( _(
"&Cancel" ), button_box );
616 YUI_CHECK_NEW( cancel_button );
617 layout->addWidget(cancel_button);
619 cancel_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
621 connect( cancel_button, SIGNAL( clicked() ),
622 this, SLOT (
reject() ) );
625 QPushButton * accept_button =
new QPushButton( _(
"&Accept" ), button_box );
626 YUI_CHECK_NEW( accept_button );
627 layout->addWidget(accept_button);
628 accept_button->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
630 connect( accept_button, SIGNAL( clicked() ),
631 this, SLOT (
accept() ) );
633 button_box->setFixedHeight( button_box->sizeHint().height() );
638 YQPackageSelector::layoutMenuBar( QWidget *parent )
640 _menuBar =
new QMenuBar( parent );
641 YUI_CHECK_NEW( _menuBar );
642 parent->layout()->addWidget(_menuBar);
665 _fileMenu =
new QMenu( _menuBar );
666 YUI_CHECK_NEW( _fileMenu );
667 QAction * action = _menuBar->addMenu( _fileMenu );
668 action->setText( _(
"&File" ));
670 _fileMenu->addAction( _(
"&Import..." ),
this, SLOT(
pkgImport() ) );
671 _fileMenu->addAction( _(
"&Export..." ),
this, SLOT(
pkgExport() ) );
673 _fileMenu->addSeparator();
675 _fileMenu->addAction( _(
"E&xit -- Discard Changes" ),
this, SLOT(
reject() ) );
676 _fileMenu->addAction( _(
"&Quit -- Save Changes" ),
this, SLOT(
accept() ) );
685 _pkgMenu =
new QMenu( _menuBar );
686 YUI_CHECK_NEW( _pkgMenu );
687 action = _menuBar->addMenu( _pkgMenu );
688 action->setText(_(
"&Package" ));
690 _pkgMenu->addAction(_pkgList->actionSetCurrentInstall);
691 _pkgMenu->addAction(_pkgList->actionSetCurrentDontInstall);
692 _pkgMenu->addAction(_pkgList->actionSetCurrentKeepInstalled);
693 _pkgMenu->addAction(_pkgList->actionSetCurrentDelete);
694 _pkgMenu->addAction(_pkgList->actionSetCurrentUpdate);
695 _pkgMenu->addAction(_pkgList->actionSetCurrentUpdateForce);
696 _pkgMenu->addAction(_pkgList->actionSetCurrentTaboo);
698 #if ENABLE_SOURCE_RPMS 699 _pkgMenu->addSeparator();
701 _pkgMenu->addAction(_pkgList->actionInstallSourceRpm);
702 _pkgMenu->addAction(_pkgList->actionDontInstallSourceRpm);
705 _pkgMenu->addSeparator();
707 YUI_CHECK_NEW( submenu );
709 #if ENABLE_SOURCE_RPMS 710 submenu->addSeparator();
712 _pkgMenu->addAction(_pkgList->actionInstallListSourceRpms);
713 _pkgMenu->addAction(_pkgList->actionDontInstallListSourceRpms);
720 submenu =
new QMenu( _pkgMenu );
721 YUI_CHECK_NEW( submenu );
726 action = _pkgMenu->addMenu( submenu );
727 action->setText(_(
"All Packages" ));
729 submenu->addAction( _(
"Update if newer version available" ),
732 submenu->addAction( _(
"Update unconditionally" ),
743 _patchMenu =
new QMenu( _menuBar );
744 YUI_CHECK_NEW( _patchMenu );
745 action = _menuBar->addMenu( _patchMenu );
746 action->setText(_(
"&Patch" ));
748 _patchMenu->addAction(_patchList->actionSetCurrentInstall);
749 _patchMenu->addAction(_patchList->actionSetCurrentDontInstall);
750 _patchMenu->addAction(_patchList->actionSetCurrentKeepInstalled);
752 #if ENABLE_DELETING_PATCHES 753 _patchMenu->addAction(_patchList->actionSetCurrentDelete);
755 _patchMenu->addAction(_patchList->actionSetCurrentUpdate);
756 _patchMenu->addAction(_patchList->actionSetCurrentUpdateForce);
757 _patchMenu->addAction(_patchList->actionSetCurrentTaboo);
759 _patchMenu->addSeparator();
768 if ( repoMgrEnabled() )
770 _configMenu =
new QMenu( _menuBar );
771 YUI_CHECK_NEW( _configMenu );
772 action = _menuBar->addMenu( _configMenu );
773 action->setText(_(
"Confi&guration" ));
774 _configMenu->addAction( _(
"&Repositories..." ),
this, SLOT(
repoManager() ), Qt::CTRL + Qt::Key_R );
782 _dependencyMenu =
new QMenu( _menuBar );
783 YUI_CHECK_NEW( _dependencyMenu );
784 action = _menuBar->addMenu( _dependencyMenu );
785 action->setText(_(
"&Dependencies" ));
789 _autoDependenciesAction =
new QAction( _(
"&Autocheck" ),
this );
790 _autoDependenciesAction->setCheckable(
true );
791 _dependencyMenu->addAction( _autoDependenciesAction );
793 _installRecommendedAction = _dependencyMenu->addAction(
794 _(
"Install &Recommended Packages"),
795 this, SLOT (pkgInstallRecommendedChanged(
bool)));
796 _installRecommendedAction->setCheckable(
true );
803 _optionsMenu =
new QMenu( _menuBar );
804 YUI_CHECK_NEW( _optionsMenu );
805 action = _menuBar->addMenu( _optionsMenu );
807 action->setText(_(
"&Options" ));
810 _showDevelAction = _optionsMenu->addAction( _(
"Show -de&vel Packages" ),
811 this, SLOT( pkgExcludeDevelChanged(
bool ) ), Qt::Key_F7 );
812 _showDevelAction->setCheckable(
true);
814 _excludeDevelPkgs =
new YQPkgObjList::ExcludeRule( _pkgList, QRegExp(
".*(\\d+bit)?-devel(-\\d+bit)?$" ), _pkgList->nameCol() );
815 YUI_CHECK_NEW( _excludeDevelPkgs );
816 _excludeDevelPkgs->
enable(
false );
819 _showDebugAction = _optionsMenu->addAction( _(
"Show -&debuginfo/-debugsource Packages" ),
821 _showDebugAction->setCheckable(
true);
822 _excludeDebugInfoPkgs =
new YQPkgObjList::ExcludeRule( _pkgList, QRegExp(
".*(-\\d+bit)?-(debuginfo|debugsource)(-32bit)?$" ), _pkgList->nameCol() );
823 YUI_CHECK_NEW( _excludeDebugInfoPkgs );
824 _excludeDebugInfoPkgs->
enable(
false );
827 _verifySystemModeAction = _optionsMenu->addAction( _(
"&System Verification Mode" ),
828 this, SLOT( pkgVerifySytemModeChanged(
bool ) ) );
829 _verifySystemModeAction->setCheckable(
true);
832 _cleanDepsOnRemoveAction = _optionsMenu->addAction( _(
"&Cleanup when deleting packages" ),
833 this, SLOT( pkgCleanDepsOnRemoveChanged(
bool ) ) );
834 _cleanDepsOnRemoveAction->setCheckable(
true);
836 _allowVendorChangeAction = _optionsMenu->addAction( _(
"&Allow vendor change" ),
837 this, SLOT( pkgAllowVendorChangeChanged(
bool ) ) );
838 _allowVendorChangeAction->setCheckable(
true);
846 _extrasMenu =
new QMenu( _menuBar );
847 YUI_CHECK_NEW( _extrasMenu );
848 action = _menuBar->addMenu( _extrasMenu );
849 action->setText(_(
"E&xtras" ));
851 _extrasMenu->addAction( _(
"Show &Products" ),
this, SLOT(
showProducts() ) );
852 _extrasMenu->addAction( _(
"Show P&ackage Changes" ),
this, SLOT(
showAutoPkgList() ), Qt::CTRL + Qt::Key_A );
853 _extrasMenu->addAction( _(
"Show &History" ),
this, SLOT(
showHistory() ) );
855 _extrasMenu->addSeparator();
857 #if BRAINDEAD_LIB_NAMING_SCHEME 861 _extrasMenu->addAction( _(
"Install All Matching -&devel Packages" ),
this, SLOT(
installDevelPkgs() ) );
865 _extrasMenu->addAction( _(
"Install All Matching -de&buginfo Packages" ),
this, SLOT(
installDebugInfoPkgs() ) );
868 _extrasMenu->addAction( _(
"Install All Matching -debug&source Packages" ),
this, SLOT(
installDebugSourcePkgs() ) );
870 _extrasMenu->addAction( _(
"Install All Matching &Recommended Packages" ),
873 _extrasMenu->addSeparator();
875 if ( _pkgConflictDialog )
876 _extrasMenu->addAction( _(
"Generate Dependency Resolver &Test Case" ),
877 _pkgConflictDialog, SLOT( askCreateSolverTestCase() ) );
879 if ( _actionResetIgnoredDependencyProblems )
880 _extrasMenu->addAction(_actionResetIgnoredDependencyProblems);
884 _extrasMenu->addAction(_patchList->actionShowRawPatchInfo);
892 _helpMenu =
new QMenu( _menuBar );
893 YUI_CHECK_NEW( _helpMenu );
894 _menuBar->addSeparator();
895 action = _menuBar->addMenu( _helpMenu );
896 action->setText(_(
"&Help" ));
902 _helpMenu->addAction( _(
"&Overview" ),
this, SLOT(
help() ), Qt::Key_F1 );
905 _helpMenu->addAction( _(
"&Symbols" ),
this, SLOT(
symbolHelp() ), Qt::SHIFT + Qt::Key_F1 );
908 _helpMenu->addAction( _(
"&Keys" ),
this, SLOT(
keyboardHelp() ) );
915 bool hasUpdateSignal )
917 if ( ! filter )
return;
918 if ( ! pkgList )
return;
922 connect( _filters, SIGNAL( currentChanged(QWidget *) ),
923 filter, SLOT ( filterIfVisible() ) );
926 connect(
this, SIGNAL(
refresh() ),
927 filter, SLOT ( filterIfVisible() ) );
929 connect( filter, SIGNAL( filterStart() ),
930 pkgList, SLOT ( clear() ) );
932 connect( filter, SIGNAL( filterStart() ),
935 connect( filter, SIGNAL( filterMatch( ZyppSel, ZyppPkg ) ),
936 pkgList, SLOT ( addPkgItem ( ZyppSel, ZyppPkg ) ) );
938 connect( filter, SIGNAL( filterFinished() ),
939 pkgList, SLOT ( resort() ) );
941 connect( filter, SIGNAL( filterFinished() ),
942 pkgList, SLOT ( selectSomething() ) );
944 connect( filter, SIGNAL( filterFinished() ),
945 pkgList, SLOT ( logExcludeStatistics() ) );
947 connect( filter, SIGNAL( filterFinished() ),
948 pkgList, SLOT ( setFocus() ) );
950 connect( filter, SIGNAL( filterFinished() ),
956 connect( filter, SIGNAL( updatePackages() ),
957 pkgList, SLOT ( updateItemStates() ) );
961 connect( filter, SIGNAL( updatePackages() ),
976 connectFilter( _packageKitGroupsFilterView, _pkgList,
false );
983 if ( _searchFilterView && _pkgList )
985 connect( _searchFilterView, SIGNAL( message(
const QString & ) ),
986 _pkgList, SLOT ( message(
const QString & ) ) );
989 if ( _repoFilterView && _pkgList )
991 connect( _repoFilterView, SIGNAL( filterNearMatch ( ZyppSel, ZyppPkg ) ),
992 _pkgList, SLOT ( addPkgItemDimmed ( ZyppSel, ZyppPkg ) ) );
995 if ( _serviceFilterView && _pkgList )
997 connect( _serviceFilterView, SIGNAL( filterNearMatch ( ZyppSel, ZyppPkg ) ),
998 _pkgList, SLOT ( addPkgItemDimmed ( ZyppSel, ZyppPkg ) ) );
1004 connect( _pkgList, SIGNAL( statusChanged() ),
1016 if ( _pkgConflictDialog )
1020 connect( _pkgConflictDialog, SIGNAL( updatePackages() ),
1021 _pkgList, SLOT ( updateItemStates() ) );
1026 connect( _pkgConflictDialog, SIGNAL( updatePackages() ),
1027 _patternList, SLOT ( updateItemStates() ) );
1033 connect( _pkgConflictDialog, SIGNAL( updatePackages() ),
1043 if ( _pkgVersionsView && _pkgList )
1045 connect( _pkgVersionsView, SIGNAL( candidateChanged( ZyppObj ) ),
1046 _pkgList, SLOT ( updateItemData() ) );
1048 connect( _pkgVersionsView, SIGNAL( statusChanged() ),
1049 _pkgList, SLOT ( updateItemData() ) );
1058 YUI_CHECK_NEW( accel );
1064 if ( _pkgMenu && _pkgList )
1066 connect( _pkgMenu, SIGNAL( aboutToShow() ),
1067 _pkgList, SLOT ( updateActions() ) );
1070 if ( _patchMenu && _patchList )
1072 connect( _patchMenu, SIGNAL( aboutToShow() ),
1073 _patchList, SLOT ( updateActions() ) );
1081 if ( _autoDependenciesAction && ! _autoDependenciesAction->isChecked() )
1091 if ( ! _pkgConflictDialog )
1093 yuiError() <<
"No package conflict dialog existing" << std::endl;
1094 return QDialog::Accepted;
1101 #if DEPENDENCY_FEEDBACK_IF_OK 1103 if ( result == QDialog::Accepted )
1105 QMessageBox::information(
this,
"",
1106 _(
"All package dependencies are OK." ),
1118 if ( ! _patchFilterView )
1121 YUI_CHECK_NEW( _patchFilterView );
1122 _filters->
addPage( _(
"P&atches" ), _patchFilterView,
"patches" );
1124 _patchList = _patchFilterView->
patchList();
1125 YUI_CHECK_PTR( _patchList );
1135 if ( ! _patchFilterView )
1137 yuiMilestone() <<
"Activating patches filter view" << std::endl;
1142 _filters->
showPage( _patchFilterView );
1148 _filters->
showPage( _patchFilterView );
1156 if ( _pkgList && _patchList )
1160 connect( _patchList, SIGNAL( filterMatch (
const QString &,
const QString &, FSize ) ),
1161 _pkgList, SLOT ( addPassiveItem(
const QString &,
const QString &, FSize ) ) );
1163 connect( _patchList, SIGNAL( statusChanged() ),
1166 if ( _pkgConflictDialog )
1168 connect( _pkgConflictDialog,SIGNAL( updatePackages() ),
1169 _patchList, SLOT ( updateItemStates() ) );
1172 connect(
this, SIGNAL(
refresh() ),
1173 _patchList, SLOT ( updateItemStates() ) );
1182 QString filename = YQApplication::askForSaveFileName( QString( DEFAULT_EXPORT_FILE_NAME ),
1183 QString(
"*.xml;;*" ),
1184 _(
"Save Package List" ) );
1186 if ( ! filename.isEmpty() )
1188 zypp::syscontent::Writer writer;
1189 const zypp::ResPool & pool = zypp::getZYpp()->pool();
1193 for_each( pool.begin(), pool.end(),
1194 boost::bind( &zypp::syscontent::Writer::addIf,
1195 boost::ref( writer ),
1207 std::ofstream exportFile( toUTF8( filename ).c_str() );
1208 exportFile.exceptions( std::ios_base::badbit | std::ios_base::failbit );
1209 exportFile << writer;
1211 yuiMilestone() <<
"Package list exported to " << filename << std::endl;
1213 catch ( std::exception & exception )
1215 yuiWarning() <<
"Error exporting package list to " << filename << std::endl;
1219 QFile::remove(filename);
1222 QMessageBox::warning(
this,
1224 _(
"Error exporting package list to %1" ).arg( filename ),
1225 QMessageBox::Ok | QMessageBox::Default,
1236 QString filename = QFileDialog::getOpenFileName(
this, _(
"Load Package List" ), DEFAULT_EXPORT_FILE_NAME,
1240 if ( ! filename.isEmpty() )
1242 yuiMilestone() <<
"Importing package list from " << filename << std::endl;
1246 std::ifstream importFile( toUTF8( filename ).c_str() );
1247 zypp::syscontent::Reader reader( importFile );
1253 typedef zypp::syscontent::Reader::Entry ZyppReaderEntry;
1254 typedef std::pair<string, ZyppReaderEntry> ImportMapPair;
1256 map<string, ZyppReaderEntry> importPkg;
1257 map<string, ZyppReaderEntry> importPatterns;
1259 for ( zypp::syscontent::Reader::const_iterator it = reader.begin();
1263 string kind = it->kind();
1265 if ( kind ==
"package" ) importPkg.insert ( ImportMapPair( it->name(), *it ) );
1266 else if ( kind ==
"pattern" ) importPatterns.insert( ImportMapPair( it->name(), *it ) );
1269 yuiDebug() <<
"Found " << importPkg.size()
1270 <<
" packages and " << importPatterns.size()
1271 <<
" patterns in " << filename
1279 for ( ZyppPoolIterator it = zyppPatternsBegin();
1280 it != zyppPatternsEnd();
1283 ZyppSel selectable = *it;
1284 importSelectable( *it, importPatterns.find( selectable->name() ) != importPatterns.end(),
"pattern" );
1287 for ( ZyppPoolIterator it = zyppPkgBegin();
1291 ZyppSel selectable = *it;
1292 importSelectable( *it, importPkg.find( selectable->name() ) != importPkg.end(),
"package" );
1302 if ( _statusFilterView )
1306 _filters->
showPage( _statusFilterView );
1307 _statusFilterView->
filter();
1311 catch (
const zypp::Exception & exception )
1313 yuiWarning() <<
"Error reading package list from " << filename << std::endl;
1316 QMessageBox::warning(
this,
1318 _(
"Error loading package list from %1" ).arg( filename ),
1319 QMessageBox::Ok | QMessageBox::Default,
1320 QMessageBox::NoButton,
1321 QMessageBox::NoButton );
1332 ZyppStatus oldStatus = selectable->status();
1333 ZyppStatus newStatus = oldStatus;
1341 switch ( oldStatus )
1345 case S_KeepInstalled:
1349 newStatus = oldStatus;
1354 newStatus = S_KeepInstalled;
1355 yuiDebug() <<
"Keeping " << kind <<
" " << selectable->name() << std::endl;
1361 if ( selectable->hasCandidateObj() )
1363 newStatus = S_Install;
1364 yuiDebug() <<
"Adding " << kind <<
" " << selectable->name() << std::endl;
1368 yuiDebug() <<
"Can't add " << kind <<
" " << selectable->name()
1369 <<
": No candidate" << std::endl;
1380 switch ( oldStatus )
1384 case S_KeepInstalled:
1389 yuiDebug() <<
"Deleting " << kind <<
" " << selectable->name() << std::endl;
1396 newStatus = oldStatus;
1401 if ( oldStatus != newStatus )
1402 selectable->setStatus( newStatus );
1414 yuiMilestone() << count <<
" pkgs found for update" << std::endl;
1416 if ( count >= GLOBAL_UPDATE_CONFIRMATION_THRESHOLD )
1418 if ( QMessageBox::question(
this,
"",
1420 _(
"%1 packages will be updated" ).arg( count ),
1421 _(
"&Continue" ), _(
"C&ancel" ),
1433 if ( _statusFilterView )
1435 _filters->
showPage( _statusFilterView );
1436 _statusFilterView->
clear();
1438 _statusFilterView->
filter();
1445 zypp::ResPool::repository_iterator it;
1446 _repoUpgradeLabel->setText(
"");
1447 _repoUpgradingLabel->setText(
"");
1451 for ( it = zypp::getZYpp()->pool().knownRepositoriesBegin();
1452 it != zypp::getZYpp()->pool().knownRepositoriesEnd();
1455 zypp::Repository repo(*it);
1458 if ( zypp::getZYpp()->resolver()->upgradingRepo(repo) )
1460 _repoUpgradingLabel->setText(_repoUpgradingLabel->text() + _(
"<p><small><a href=\"repoupgraderemove:///%1\">Cancel switching</a> system packages to versions in repository %2</small></p>")
1461 .arg(fromUTF8(repo.alias().c_str()))
1462 .arg(fromUTF8(repo.name().c_str()))
1467 for ( it = zypp::getZYpp()->pool().knownRepositoriesBegin();
1468 it != zypp::getZYpp()->pool().knownRepositoriesEnd();
1471 zypp::Repository repo(*it);
1475 if ( ! zypp::getZYpp()->resolver()->upgradingRepo(repo) &&
1476 ! repo.isSystemRepo() &&
1479 _repoUpgradeLabel->setText(_repoUpgradeLabel->text() + _(
"<p><a href=\"repoupgradeadd:///%1\">Switch system packages</a> to the versions in this repository (%2)</p>")
1480 .arg(fromUTF8(repo.alias().c_str()))
1481 .arg(fromUTF8(repo.name().c_str()))
1485 _repoUpgradeLabel->setVisible(!_repoUpgradeLabel->text().isEmpty() &&
1486 _repoFilterView->isVisible() );
1487 _repoUpgradingLabel->setVisible(!_repoUpgradingLabel->text().isEmpty());
1493 yuiDebug() <<
"link " << link <<
" clicked on label" << std::endl;
1496 if (url.scheme() ==
"repoupgradeadd")
1498 yuiDebug() <<
"looking for repo " << url.path() << std::endl;
1499 std::string alias(url.path().remove(0,1).toStdString());
1500 zypp::Repository repo(zypp::getZYpp()->pool().reposFind(alias));
1501 yuiDebug() << repo << std::endl;
1503 if ( repo != zypp::Repository::noRepository )
1504 zypp::getZYpp()->resolver()->addUpgradeRepo(repo);
1506 else if (url.scheme() ==
"repoupgraderemove")
1508 std::string alias(url.path().remove(0,1).toStdString());
1509 zypp::Repository repo(zypp::getZYpp()->pool().reposFind(alias));
1511 if ( repo != zypp::Repository::noRepository )
1512 zypp::getZYpp()->resolver()->removeUpgradeRepo(repo);
1515 yuiDebug() <<
"unknown link operation " << url.scheme() << std::endl;
1558 zypp::getZYpp()->resolver()->setIgnoreAlreadyRecommended(
false );
1561 if ( _filters && _statusFilterView )
1563 _filters->
showPage( _statusFilterView );
1564 _statusFilterView->
filter();
1568 _(
"Added Subpackages:" ),
1571 YQPkgChangesDialog::FilterAutomatic,
1572 YQPkgChangesDialog::OptionNone );
1579 if ( _optionsMenu && _pkgList )
1581 if ( _excludeDebugInfoPkgs )
1582 _excludeDebugInfoPkgs->
enable( ! on );
1590 YQPackageSelector::pkgExcludeDevelChanged(
bool on )
1592 if ( _optionsMenu && _pkgList )
1594 if ( _excludeDevelPkgs )
1595 _excludeDevelPkgs->
enable( ! on );
1603 YQPackageSelector::pkgVerifySytemModeChanged(
bool on )
1605 zypp::getZYpp()->resolver()->setSystemVerification( on );
1609 YQPackageSelector::pkgInstallRecommendedChanged(
bool on )
1611 zypp::getZYpp()->resolver()->setOnlyRequires( !on );
1616 YQPackageSelector::pkgCleanDepsOnRemoveChanged(
bool on )
1618 zypp::getZYpp()->resolver()->setCleandepsOnRemove( on );
1624 YQPackageSelector::pkgAllowVendorChangeChanged(
bool on )
1626 zypp::getZYpp()->resolver()->setAllowVendorChange( on );
1637 QMap<QString, ZyppSel> subPkgs;
1639 for ( ZyppPoolIterator it = zyppPkgBegin();
1643 QString name = (*it)->name().c_str();
1645 if ( name.endsWith( suffix ) || name.endsWith( suffix +
"-32bit" ) )
1647 subPkgs[ name ] = *it;
1649 yuiDebug() <<
"Found subpackage: " << name << std::endl;
1656 for ( ZyppPoolIterator it = zyppPkgBegin();
1660 QString name = (*it)->name().c_str();
1662 if ( subPkgs.contains( name + suffix ) )
1664 QString subPkgName( name + suffix );
1665 ZyppSel subPkg = subPkgs[ subPkgName ];
1667 switch ( (*it)->status() )
1675 yuiMilestone() <<
"Ignoring unwanted subpackage " << subPkgName << std::endl;
1680 case S_KeepInstalled:
1684 if ( ! subPkg->installedObj() )
1686 subPkg->setStatus( S_Install );
1687 yuiMilestone() <<
"Installing subpackage " << subPkgName << std::endl;
1697 if ( ! subPkg->installedObj() )
1699 subPkg->setStatus( S_Install );
1700 yuiMilestone() <<
"Installing subpackage " << subPkgName << std::endl;
1704 subPkg->setStatus( S_Update );
1705 yuiMilestone() <<
"Updating subpackage " << subPkgName << std::endl;
1716 if ( _filters && _statusFilterView )
1718 _filters->
showPage( _statusFilterView );
1719 _statusFilterView->
filter();
1723 _(
"Added Subpackages:" ),
1724 QRegExp(
".*" + suffix +
"$" ),
1727 YQPkgChangesDialog::FilterAutomatic,
1728 YQPkgChangesDialog::OptionNone );
1734 QString settingsName =
"YQPackageSelector";
1735 if ( onlineUpdateMode() ) settingsName =
"YQOnlineUpdate";
1736 if ( updateMode() ) settingsName =
"YQSystemUpdate";
1738 QSettings settings( QSettings::UserScope, SETTINGS_DIR, settingsName );
1740 _showDevelAction->setChecked(settings.value(
"Options/showDevelPackages",
true).toBool());
1741 pkgExcludeDevelChanged(_showDevelAction->isChecked());
1743 _showDebugAction->setChecked(settings.value(
"Options/showDebugPackages",
true).toBool());
1746 loadCommonSettings();
1750 YQPackageSelector::loadCommonSettings()
1752 map<string, string> sysconfig = zypp::base::sysconfig::read(PATH_TO_YAST_SYSCONFIG);
1754 bool auto_check = AUTO_CHECK_DEPENDENCIES_DEFAULT;
1755 auto it = sysconfig.find(OPTION_AUTO_CHECK);
1756 if (it != sysconfig.end())
1758 auto_check = it->second ==
"yes";
1760 _autoDependenciesAction->setChecked(auto_check);
1762 bool verify_system = zypp::getZYpp()->resolver()->systemVerification();
1763 it = sysconfig.find(OPTION_VERIFY);
1764 if (it != sysconfig.end())
1766 verify_system = it->second ==
"yes";
1768 _verifySystemModeAction->setChecked(verify_system);
1769 pkgVerifySytemModeChanged(verify_system);
1771 bool install_recommended = ! zypp::getZYpp()->resolver()->onlyRequires();
1772 it = sysconfig.find(OPTION_RECOMMENDED);
1773 if (it != sysconfig.end())
1775 install_recommended = it->second ==
"yes";
1777 _installRecommendedAction->setChecked(install_recommended);
1778 pkgInstallRecommendedChanged(install_recommended);
1780 bool allow_vendor_change = zypp::getZYpp()->resolver()->allowVendorChange();
1781 _allowVendorChangeAction->setChecked(allow_vendor_change);
1782 pkgAllowVendorChangeChanged(allow_vendor_change);
1784 bool clean_deps_on_remove = zypp::getZYpp()->resolver()->cleandepsOnRemove();
1785 _cleanDepsOnRemoveAction->setChecked(clean_deps_on_remove);
1786 pkgCleanDepsOnRemoveChanged(clean_deps_on_remove);
1792 QString settingsName =
"YQPackageSelector";
1793 if ( onlineUpdateMode() ) settingsName =
"YQOnlineUpdate";
1794 if ( updateMode() ) settingsName =
"YQSystemUpdate";
1796 QSettings settings( QSettings::UserScope, SETTINGS_DIR, settingsName );
1798 settings.setValue(
"Options/showDevelPackages", _showDevelAction->isChecked() );
1799 settings.setValue(
"Options/showDebugPackages", _showDebugAction->isChecked() );
1801 saveCommonSettings();
1805 YQPackageSelector::saveCommonSettings()
1809 zypp::base::sysconfig::writeStringVal(
1810 PATH_TO_YAST_SYSCONFIG,
1812 ( _autoDependenciesAction->isChecked() ?
"yes" :
"no"),
1813 "Automatic dependency checking");
1814 zypp::base::sysconfig::writeStringVal(
1815 PATH_TO_YAST_SYSCONFIG,
1817 (_verifySystemModeAction->isChecked() ?
"yes" :
"no"),
1818 "System verification mode");
1819 zypp::base::sysconfig::writeStringVal(
1820 PATH_TO_YAST_SYSCONFIG,
1822 (_installRecommendedAction->isChecked() ?
"yes" :
"no"),
1823 "Install recommended packages");
1825 catch(
const std::exception &e )
1827 yuiError() <<
"Writing " << PATH_TO_YAST_SYSCONFIG <<
" failed" << std::endl;
1833 YQUI::ui()->busyCursor();
1838 YQUI::ui()->normalCursor();
Display the description of a ZyppObj derived object along with its name and summary.
void onlineUpdateConfiguration()
Close processing and request start of the online update configuration.
void addPatchFilterView()
Add the "Patches" filter view, if it is not already there.
void showPage(QWidget *page)
Show a page.
int globalSetPkgStatus(ZyppStatus newStatus, bool force, bool countOnly)
Set the status of all packages in the pool to a new value.
void loadData()
Emitted once (!) when the dialog is about to be shown, when all widgets are created and all signal/sl...
void globalUpdatePkg()
Set the status of all installed packages (all in the pool, not only those currently displayed in the ...
void connectFilter(QWidget *filter, QWidget *pkgList, bool hasUpdateSignal=true)
Connect a filter view that provides the usual signals with a package list.
void addPage(const QString &pageLabel, QWidget *pageContent, const QString &internalName)
Add a page with a user-visible "pageLabel", a widget with the page content and an internal name (or I...
void normalCursor()
Show the standard cursor (arrow)
zypp::Repository selectedRepo() const
Current selected repository, or if nothing is selected.
Filter view for PackageKit groups.
static bool any_service()
Is any enabled libzypp service present?
static int countEnabledRepositories()
Returns the number of enabled repositories.
YQPkgPatchList * patchList() const
Returns this view's selections list.
void showProducts()
Show all products in a popup dialog.
void busyCursor()
Show the busy cursor (clock)
Filter view for packages that made problems during update.
void filter()
Filter according to the view's rules and current selection.
Widget for "tabbed browsing" in packages:
static bool haveInstalledPkgs()
Returns 'true' if there are any installed packages.
void importSelectable(ZyppSel selectable, bool isWanted, const char *kind)
Import one selectable: Set its status according to 'isWanted' based on its old status.
void updateRepositoryUpgradeLabel()
hides or shows the repository upgrade message
YQPkgDiskUsageList * diskUsageList() const
Return the disk usage list widget or 0 if there is none.
QWidget * rightPane() const
Return the right pane.
void currentChanged(QWidget *newPageContent)
Emitted when the current page changes.
void saveSettings()
saves settings of the checkboxes in the option menu
int manualResolvePackageDependencies()
Resolve package dependencies manually.
void keyboardHelp()
Display online help about magic keys.
void enable(bool enable=true)
Enable or disable this exclude rule.
void accept()
Close processing and accept changes.
Display a list of zypp::Patch objects and ( below ) details about the currently selected patch...
void slotRepoUpgradeLabelLinkClicked(const QString &link)
a link in the repo upgrade label was clicked
void repoManager()
Close processing and request start of the repository manager.
Display a pkg's file list.
Display a list of zypp::Package objects.
Display a list of zypp::Pattern objects.
Filter view for searching within packages.
void symbolHelp()
Display online help about symbols (package status icons).
void installDebugInfoPkgs()
Install available -debuginfo packages for packages that are installed or marked for installation...
void connectPatchList()
Connect the patch list.
Display technical details (very much like 'rpm -qi') for a ZYPP object - the installed instance...
void clear()
Clears the tree-widgets content, resets the optimal column width values.
void pkgExport()
Export all current selection/package states.
void applyExcludeRules()
Apply all exclude rules of this list to all items, including those that are currently excluded...
Filter view for packages that made problems during update.
void help()
Display (generic) online help.
Package version selector: Display a list of available versions from all the different installation so...
void autoResolveDependencies()
Automatically resolve package dependencies if desired (if the "auto check" checkbox is on)...
static bool haveProblematicPackages()
Check if there are any problematic packages at all, i.e.
void addMenus()
Add pulldown menus to the menu bar.
Display a list of zypp::Selection objects.
void clear()
Reset all check boxes (set them all to "off")
void installDevelPkgs()
Install any -devel package for packages that are installed or marked for installation.
void loadSettings()
loads settings for the checkboxes in the option menu
static void showHistoryDialog(QWidget *parent=0)
Static convenience method: Post a History dialog for pkg 'pkgName'.
A widget to display a libzypp servic filter view.
static bool showChangesDialog(QWidget *parent, const QString &message, const QString &acceptButtonLabel, const QString &rejectButtonLabel=QString::null, Filters f=FilterAutomatic, Options o=OptionAutoAcceptIfEmpty)
Static convenience method: Post a changes dialog with text 'message', a list of changed packages and ...
void showTransactions()
Set up the check boxes so all pending transactions are displayed.
void refresh()
Emitted when the internal data base might have changed and a refresh of all displayed data might be n...
virtual QMenu * addAllInListSubMenu(QMenu *menu)
Add a submenu "All in this list..." to 'menu'.
void installDebugSourcePkgs()
Install available -debugsource packages for packages that are installed or marked for installation...
virtual QMenu * addAllInListSubMenu(QMenu *menu)
Add a submenu "All in this list..." to 'menu'.
Abstract base class for package selectors.
static void showProductDialog(QWidget *parent=0)
Static convenience method: Post a dialog with all products.
void filter()
Filter according to the view's rules and current selection.
void hotkeyInsertPatchFilterView()
Add the "Patches" filter view upon hotkey (F2).
void installSubPkgs(const QString &suffix)
Install any subpackage that ends with 'suffix' for packages that are installed or marked for installa...
void installRecommendedPkgs()
Install recommended packages for packages that are installed.
void makeConnections()
Establish Qt signal / slot connections.
Display technical details ( very much like 'rpm -qi' ) for a zypp::Package object - the installed ins...
void showHistory()
Show dialog for pkgmgr history.
void showAutoPkgList()
Display a list of automatically selected packages (excluding packages contained in any selections tha...
void pkgImport()
Import selection/package states.
bool reject()
Close processing and abandon changes.
int resolveDependencies()
Resolve dependencies (unconditionally) for all resolvables.
void pkgExcludeDebugChanged(bool on)
Enable or disable the package exclude rules (show or suppress -debuginfo or -devel packages) accordin...
int solveAndShowConflicts()
Run the package dependency solver for the current package set and open the conflict dialog if there a...
void globalUpdatePkgForce()
Set the status of all installed packages (all in the pool, not only those currently displayed in the ...
Display a pkg's file list.