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);
833 _optionsMenu->addSection( _(
"Options for this run only..." ) );
835 _cleanDepsOnRemoveAction = _optionsMenu->addAction( _(
"&Cleanup when deleting packages" ),
836 this, SLOT( pkgCleanDepsOnRemoveChanged(
bool ) ) );
837 _cleanDepsOnRemoveAction->setCheckable(
true);
839 _allowVendorChangeAction = _optionsMenu->addAction( _(
"&Allow vendor change" ),
840 this, SLOT( pkgAllowVendorChangeChanged(
bool ) ) );
841 _allowVendorChangeAction->setCheckable(
true);
849 _extrasMenu =
new QMenu( _menuBar );
850 YUI_CHECK_NEW( _extrasMenu );
851 action = _menuBar->addMenu( _extrasMenu );
852 action->setText(_(
"E&xtras" ));
854 _extrasMenu->addAction( _(
"Show &Products" ),
this, SLOT(
showProducts() ) );
855 _extrasMenu->addAction( _(
"Show P&ackage Changes" ),
this, SLOT(
showAutoPkgList() ), Qt::CTRL + Qt::Key_A );
856 _extrasMenu->addAction( _(
"Show &History" ),
this, SLOT(
showHistory() ) );
858 _extrasMenu->addSeparator();
860 #if BRAINDEAD_LIB_NAMING_SCHEME 864 _extrasMenu->addAction( _(
"Install All Matching -&devel Packages" ),
this, SLOT(
installDevelPkgs() ) );
868 _extrasMenu->addAction( _(
"Install All Matching -de&buginfo Packages" ),
this, SLOT(
installDebugInfoPkgs() ) );
871 _extrasMenu->addAction( _(
"Install All Matching -debug&source Packages" ),
this, SLOT(
installDebugSourcePkgs() ) );
873 _extrasMenu->addAction( _(
"Install All Matching &Recommended Packages" ),
876 _extrasMenu->addSeparator();
878 if ( _pkgConflictDialog )
879 _extrasMenu->addAction( _(
"Generate Dependency Resolver &Test Case" ),
880 _pkgConflictDialog, SLOT( askCreateSolverTestCase() ) );
882 if ( _actionResetIgnoredDependencyProblems )
883 _extrasMenu->addAction(_actionResetIgnoredDependencyProblems);
887 _extrasMenu->addAction(_patchList->actionShowRawPatchInfo);
895 _helpMenu =
new QMenu( _menuBar );
896 YUI_CHECK_NEW( _helpMenu );
897 _menuBar->addSeparator();
898 action = _menuBar->addMenu( _helpMenu );
899 action->setText(_(
"&Help" ));
905 _helpMenu->addAction( _(
"&Overview" ),
this, SLOT(
help() ), Qt::Key_F1 );
908 _helpMenu->addAction( _(
"&Symbols" ),
this, SLOT(
symbolHelp() ), Qt::SHIFT + Qt::Key_F1 );
911 _helpMenu->addAction( _(
"&Keys" ),
this, SLOT(
keyboardHelp() ) );
918 bool hasUpdateSignal )
920 if ( ! filter )
return;
921 if ( ! pkgList )
return;
925 connect( _filters, SIGNAL( currentChanged(QWidget *) ),
926 filter, SLOT ( filterIfVisible() ) );
929 connect(
this, SIGNAL(
refresh() ),
930 filter, SLOT ( filterIfVisible() ) );
932 connect( filter, SIGNAL( filterStart() ),
933 pkgList, SLOT ( clear() ) );
935 connect( filter, SIGNAL( filterStart() ),
938 connect( filter, SIGNAL( filterMatch( ZyppSel, ZyppPkg ) ),
939 pkgList, SLOT ( addPkgItem ( ZyppSel, ZyppPkg ) ) );
941 connect( filter, SIGNAL( filterFinished() ),
942 pkgList, SLOT ( resort() ) );
944 connect( filter, SIGNAL( filterFinished() ),
945 pkgList, SLOT ( selectSomething() ) );
947 connect( filter, SIGNAL( filterFinished() ),
948 pkgList, SLOT ( logExcludeStatistics() ) );
950 connect( filter, SIGNAL( filterFinished() ),
951 pkgList, SLOT ( setFocus() ) );
953 connect( filter, SIGNAL( filterFinished() ),
959 connect( filter, SIGNAL( updatePackages() ),
960 pkgList, SLOT ( updateItemStates() ) );
964 connect( filter, SIGNAL( updatePackages() ),
979 connectFilter( _packageKitGroupsFilterView, _pkgList,
false );
986 if ( _searchFilterView && _pkgList )
988 connect( _searchFilterView, SIGNAL( message(
const QString & ) ),
989 _pkgList, SLOT ( message(
const QString & ) ) );
992 if ( _repoFilterView && _pkgList )
994 connect( _repoFilterView, SIGNAL( filterNearMatch ( ZyppSel, ZyppPkg ) ),
995 _pkgList, SLOT ( addPkgItemDimmed ( ZyppSel, ZyppPkg ) ) );
998 if ( _serviceFilterView && _pkgList )
1000 connect( _serviceFilterView, SIGNAL( filterNearMatch ( ZyppSel, ZyppPkg ) ),
1001 _pkgList, SLOT ( addPkgItemDimmed ( ZyppSel, ZyppPkg ) ) );
1007 connect( _pkgList, SIGNAL( statusChanged() ),
1019 if ( _pkgConflictDialog )
1023 connect( _pkgConflictDialog, SIGNAL( updatePackages() ),
1024 _pkgList, SLOT ( updateItemStates() ) );
1029 connect( _pkgConflictDialog, SIGNAL( updatePackages() ),
1030 _patternList, SLOT ( updateItemStates() ) );
1036 connect( _pkgConflictDialog, SIGNAL( updatePackages() ),
1046 if ( _pkgVersionsView && _pkgList )
1048 connect( _pkgVersionsView, SIGNAL( candidateChanged( ZyppObj ) ),
1049 _pkgList, SLOT ( updateItemData() ) );
1051 connect( _pkgVersionsView, SIGNAL( statusChanged() ),
1052 _pkgList, SLOT ( updateItemData() ) );
1061 YUI_CHECK_NEW( accel );
1067 if ( _pkgMenu && _pkgList )
1069 connect( _pkgMenu, SIGNAL( aboutToShow() ),
1070 _pkgList, SLOT ( updateActions() ) );
1073 if ( _patchMenu && _patchList )
1075 connect( _patchMenu, SIGNAL( aboutToShow() ),
1076 _patchList, SLOT ( updateActions() ) );
1084 if ( _autoDependenciesAction && ! _autoDependenciesAction->isChecked() )
1094 if ( ! _pkgConflictDialog )
1096 yuiError() <<
"No package conflict dialog existing" << std::endl;
1097 return QDialog::Accepted;
1104 #if DEPENDENCY_FEEDBACK_IF_OK 1106 if ( result == QDialog::Accepted )
1108 QMessageBox::information(
this,
"",
1109 _(
"All package dependencies are OK." ),
1121 if ( ! _patchFilterView )
1124 YUI_CHECK_NEW( _patchFilterView );
1125 _filters->
addPage( _(
"P&atches" ), _patchFilterView,
"patches" );
1127 _patchList = _patchFilterView->
patchList();
1128 YUI_CHECK_PTR( _patchList );
1138 if ( ! _patchFilterView )
1140 yuiMilestone() <<
"Activating patches filter view" << std::endl;
1145 _filters->
showPage( _patchFilterView );
1151 _filters->
showPage( _patchFilterView );
1159 if ( _pkgList && _patchList )
1163 connect( _patchList, SIGNAL( filterMatch (
const QString &,
const QString &, FSize ) ),
1164 _pkgList, SLOT ( addPassiveItem(
const QString &,
const QString &, FSize ) ) );
1166 connect( _patchList, SIGNAL( statusChanged() ),
1169 if ( _pkgConflictDialog )
1171 connect( _pkgConflictDialog,SIGNAL( updatePackages() ),
1172 _patchList, SLOT ( updateItemStates() ) );
1175 connect(
this, SIGNAL(
refresh() ),
1176 _patchList, SLOT ( updateItemStates() ) );
1185 QString filename = YQApplication::askForSaveFileName( QString( DEFAULT_EXPORT_FILE_NAME ),
1186 QString(
"*.xml;;*" ),
1187 _(
"Save Package List" ) );
1189 if ( ! filename.isEmpty() )
1191 zypp::syscontent::Writer writer;
1192 const zypp::ResPool & pool = zypp::getZYpp()->pool();
1196 for_each( pool.begin(), pool.end(),
1197 boost::bind( &zypp::syscontent::Writer::addIf,
1198 boost::ref( writer ),
1210 std::ofstream exportFile( toUTF8( filename ).c_str() );
1211 exportFile.exceptions( std::ios_base::badbit | std::ios_base::failbit );
1212 exportFile << writer;
1214 yuiMilestone() <<
"Package list exported to " << filename << std::endl;
1216 catch ( std::exception & exception )
1218 yuiWarning() <<
"Error exporting package list to " << filename << std::endl;
1222 QFile::remove(filename);
1225 QMessageBox::warning(
this,
1227 _(
"Error exporting package list to %1" ).arg( filename ),
1228 QMessageBox::Ok | QMessageBox::Default,
1239 QString filename = QFileDialog::getOpenFileName(
this, _(
"Load Package List" ), DEFAULT_EXPORT_FILE_NAME,
1243 if ( ! filename.isEmpty() )
1245 yuiMilestone() <<
"Importing package list from " << filename << std::endl;
1249 std::ifstream importFile( toUTF8( filename ).c_str() );
1250 zypp::syscontent::Reader reader( importFile );
1256 typedef zypp::syscontent::Reader::Entry ZyppReaderEntry;
1257 typedef std::pair<string, ZyppReaderEntry> ImportMapPair;
1259 map<string, ZyppReaderEntry> importPkg;
1260 map<string, ZyppReaderEntry> importPatterns;
1262 for ( zypp::syscontent::Reader::const_iterator it = reader.begin();
1266 string kind = it->kind();
1268 if ( kind ==
"package" ) importPkg.insert ( ImportMapPair( it->name(), *it ) );
1269 else if ( kind ==
"pattern" ) importPatterns.insert( ImportMapPair( it->name(), *it ) );
1272 yuiDebug() <<
"Found " << importPkg.size()
1273 <<
" packages and " << importPatterns.size()
1274 <<
" patterns in " << filename
1282 for ( ZyppPoolIterator it = zyppPatternsBegin();
1283 it != zyppPatternsEnd();
1286 ZyppSel selectable = *it;
1287 importSelectable( *it, importPatterns.find( selectable->name() ) != importPatterns.end(),
"pattern" );
1290 for ( ZyppPoolIterator it = zyppPkgBegin();
1294 ZyppSel selectable = *it;
1295 importSelectable( *it, importPkg.find( selectable->name() ) != importPkg.end(),
"package" );
1305 if ( _statusFilterView )
1309 _filters->
showPage( _statusFilterView );
1310 _statusFilterView->
filter();
1314 catch (
const zypp::Exception & exception )
1316 yuiWarning() <<
"Error reading package list from " << filename << std::endl;
1319 QMessageBox::warning(
this,
1321 _(
"Error loading package list from %1" ).arg( filename ),
1322 QMessageBox::Ok | QMessageBox::Default,
1323 QMessageBox::NoButton,
1324 QMessageBox::NoButton );
1335 ZyppStatus oldStatus = selectable->status();
1336 ZyppStatus newStatus = oldStatus;
1344 switch ( oldStatus )
1348 case S_KeepInstalled:
1352 newStatus = oldStatus;
1357 newStatus = S_KeepInstalled;
1358 yuiDebug() <<
"Keeping " << kind <<
" " << selectable->name() << std::endl;
1364 if ( selectable->hasCandidateObj() )
1366 newStatus = S_Install;
1367 yuiDebug() <<
"Adding " << kind <<
" " << selectable->name() << std::endl;
1371 yuiDebug() <<
"Can't add " << kind <<
" " << selectable->name()
1372 <<
": No candidate" << std::endl;
1383 switch ( oldStatus )
1387 case S_KeepInstalled:
1392 yuiDebug() <<
"Deleting " << kind <<
" " << selectable->name() << std::endl;
1399 newStatus = oldStatus;
1404 if ( oldStatus != newStatus )
1405 selectable->setStatus( newStatus );
1417 yuiMilestone() << count <<
" pkgs found for update" << std::endl;
1419 if ( count >= GLOBAL_UPDATE_CONFIRMATION_THRESHOLD )
1421 if ( QMessageBox::question(
this,
"",
1423 _(
"%1 packages will be updated" ).arg( count ),
1424 _(
"&Continue" ), _(
"C&ancel" ),
1436 if ( _statusFilterView )
1438 _filters->
showPage( _statusFilterView );
1439 _statusFilterView->
clear();
1441 _statusFilterView->
filter();
1448 zypp::ResPool::repository_iterator it;
1449 _repoUpgradeLabel->setText(
"");
1450 _repoUpgradingLabel->setText(
"");
1454 for ( it = zypp::getZYpp()->pool().knownRepositoriesBegin();
1455 it != zypp::getZYpp()->pool().knownRepositoriesEnd();
1458 zypp::Repository repo(*it);
1461 if ( zypp::getZYpp()->resolver()->upgradingRepo(repo) )
1463 _repoUpgradingLabel->setText(_repoUpgradingLabel->text() + _(
"<p><small><a href=\"repoupgraderemove:///%1\">Cancel switching</a> system packages to versions in repository %2</small></p>")
1464 .arg(fromUTF8(repo.alias().c_str()))
1465 .arg(fromUTF8(repo.name().c_str()))
1470 for ( it = zypp::getZYpp()->pool().knownRepositoriesBegin();
1471 it != zypp::getZYpp()->pool().knownRepositoriesEnd();
1474 zypp::Repository repo(*it);
1478 if ( ! zypp::getZYpp()->resolver()->upgradingRepo(repo) &&
1479 ! repo.isSystemRepo() &&
1482 _repoUpgradeLabel->setText(_repoUpgradeLabel->text() + _(
"<p><a href=\"repoupgradeadd:///%1\">Switch system packages</a> to the versions in this repository (%2)</p>")
1483 .arg(fromUTF8(repo.alias().c_str()))
1484 .arg(fromUTF8(repo.name().c_str()))
1488 _repoUpgradeLabel->setVisible(!_repoUpgradeLabel->text().isEmpty() &&
1489 _repoFilterView->isVisible() );
1490 _repoUpgradingLabel->setVisible(!_repoUpgradingLabel->text().isEmpty());
1496 yuiDebug() <<
"link " << link <<
" clicked on label" << std::endl;
1499 if (url.scheme() ==
"repoupgradeadd")
1501 yuiDebug() <<
"looking for repo " << url.path() << std::endl;
1502 std::string alias(url.path().remove(0,1).toStdString());
1503 zypp::Repository repo(zypp::getZYpp()->pool().reposFind(alias));
1504 yuiDebug() << repo << std::endl;
1506 if ( repo != zypp::Repository::noRepository )
1507 zypp::getZYpp()->resolver()->addUpgradeRepo(repo);
1509 else if (url.scheme() ==
"repoupgraderemove")
1511 std::string alias(url.path().remove(0,1).toStdString());
1512 zypp::Repository repo(zypp::getZYpp()->pool().reposFind(alias));
1514 if ( repo != zypp::Repository::noRepository )
1515 zypp::getZYpp()->resolver()->removeUpgradeRepo(repo);
1518 yuiDebug() <<
"unknown link operation " << url.scheme() << std::endl;
1561 zypp::getZYpp()->resolver()->setIgnoreAlreadyRecommended(
false );
1564 if ( _filters && _statusFilterView )
1566 _filters->
showPage( _statusFilterView );
1567 _statusFilterView->
filter();
1571 _(
"Added Subpackages:" ),
1574 YQPkgChangesDialog::FilterAutomatic,
1575 YQPkgChangesDialog::OptionNone );
1582 if ( _optionsMenu && _pkgList )
1584 if ( _excludeDebugInfoPkgs )
1585 _excludeDebugInfoPkgs->
enable( ! on );
1593 YQPackageSelector::pkgExcludeDevelChanged(
bool on )
1595 if ( _optionsMenu && _pkgList )
1597 if ( _excludeDevelPkgs )
1598 _excludeDevelPkgs->
enable( ! on );
1606 YQPackageSelector::pkgVerifySytemModeChanged(
bool on )
1608 zypp::getZYpp()->resolver()->setSystemVerification( on );
1612 YQPackageSelector::pkgInstallRecommendedChanged(
bool on )
1614 zypp::getZYpp()->resolver()->setOnlyRequires( !on );
1619 YQPackageSelector::pkgCleanDepsOnRemoveChanged(
bool on )
1621 zypp::getZYpp()->resolver()->setCleandepsOnRemove( on );
1627 YQPackageSelector::pkgAllowVendorChangeChanged(
bool on )
1629 zypp::getZYpp()->resolver()->setAllowVendorChange( on );
1640 QMap<QString, ZyppSel> subPkgs;
1642 for ( ZyppPoolIterator it = zyppPkgBegin();
1646 QString name = (*it)->name().c_str();
1648 if ( name.endsWith( suffix ) || name.endsWith( suffix +
"-32bit" ) )
1650 subPkgs[ name ] = *it;
1652 yuiDebug() <<
"Found subpackage: " << name << std::endl;
1659 for ( ZyppPoolIterator it = zyppPkgBegin();
1663 QString name = (*it)->name().c_str();
1665 if ( subPkgs.contains( name + suffix ) )
1667 QString subPkgName( name + suffix );
1668 ZyppSel subPkg = subPkgs[ subPkgName ];
1670 switch ( (*it)->status() )
1678 yuiMilestone() <<
"Ignoring unwanted subpackage " << subPkgName << std::endl;
1683 case S_KeepInstalled:
1687 if ( ! subPkg->installedObj() )
1689 subPkg->setStatus( S_Install );
1690 yuiMilestone() <<
"Installing subpackage " << subPkgName << std::endl;
1700 if ( ! subPkg->installedObj() )
1702 subPkg->setStatus( S_Install );
1703 yuiMilestone() <<
"Installing subpackage " << subPkgName << std::endl;
1707 subPkg->setStatus( S_Update );
1708 yuiMilestone() <<
"Updating subpackage " << subPkgName << std::endl;
1719 if ( _filters && _statusFilterView )
1721 _filters->
showPage( _statusFilterView );
1722 _statusFilterView->
filter();
1726 _(
"Added Subpackages:" ),
1727 QRegExp(
".*" + suffix +
"$" ),
1730 YQPkgChangesDialog::FilterAutomatic,
1731 YQPkgChangesDialog::OptionNone );
1737 QString settingsName =
"YQPackageSelector";
1738 if ( onlineUpdateMode() ) settingsName =
"YQOnlineUpdate";
1739 if ( updateMode() ) settingsName =
"YQSystemUpdate";
1741 QSettings settings( QSettings::UserScope, SETTINGS_DIR, settingsName );
1743 _showDevelAction->setChecked(settings.value(
"Options/showDevelPackages",
true).toBool());
1744 pkgExcludeDevelChanged(_showDevelAction->isChecked());
1746 _showDebugAction->setChecked(settings.value(
"Options/showDebugPackages",
true).toBool());
1749 loadCommonSettings();
1753 YQPackageSelector::loadCommonSettings()
1755 map<string, string> sysconfig = zypp::base::sysconfig::read(PATH_TO_YAST_SYSCONFIG);
1757 bool auto_check = AUTO_CHECK_DEPENDENCIES_DEFAULT;
1758 auto it = sysconfig.find(OPTION_AUTO_CHECK);
1759 if (it != sysconfig.end())
1761 auto_check = it->second ==
"yes";
1763 _autoDependenciesAction->setChecked(auto_check);
1765 bool verify_system = zypp::getZYpp()->resolver()->systemVerification();
1766 it = sysconfig.find(OPTION_VERIFY);
1767 if (it != sysconfig.end())
1769 verify_system = it->second ==
"yes";
1771 _verifySystemModeAction->setChecked(verify_system);
1772 pkgVerifySytemModeChanged(verify_system);
1774 bool install_recommended = ! zypp::getZYpp()->resolver()->onlyRequires();
1775 it = sysconfig.find(OPTION_RECOMMENDED);
1776 if (it != sysconfig.end())
1778 install_recommended = it->second ==
"yes";
1780 _installRecommendedAction->setChecked(install_recommended);
1781 pkgInstallRecommendedChanged(install_recommended);
1783 bool allow_vendor_change = zypp::getZYpp()->resolver()->allowVendorChange();
1784 _allowVendorChangeAction->setChecked(allow_vendor_change);
1785 pkgAllowVendorChangeChanged(allow_vendor_change);
1787 bool clean_deps_on_remove = zypp::getZYpp()->resolver()->cleandepsOnRemove();
1788 _cleanDepsOnRemoveAction->setChecked(clean_deps_on_remove);
1789 pkgCleanDepsOnRemoveChanged(clean_deps_on_remove);
1795 QString settingsName =
"YQPackageSelector";
1796 if ( onlineUpdateMode() ) settingsName =
"YQOnlineUpdate";
1797 if ( updateMode() ) settingsName =
"YQSystemUpdate";
1799 QSettings settings( QSettings::UserScope, SETTINGS_DIR, settingsName );
1801 settings.setValue(
"Options/showDevelPackages", _showDevelAction->isChecked() );
1802 settings.setValue(
"Options/showDebugPackages", _showDebugAction->isChecked() );
1804 saveCommonSettings();
1808 YQPackageSelector::saveCommonSettings()
1812 zypp::base::sysconfig::writeStringVal(
1813 PATH_TO_YAST_SYSCONFIG,
1815 ( _autoDependenciesAction->isChecked() ?
"yes" :
"no"),
1816 "Automatic dependency checking");
1817 zypp::base::sysconfig::writeStringVal(
1818 PATH_TO_YAST_SYSCONFIG,
1820 (_verifySystemModeAction->isChecked() ?
"yes" :
"no"),
1821 "System verification mode");
1822 zypp::base::sysconfig::writeStringVal(
1823 PATH_TO_YAST_SYSCONFIG,
1825 (_installRecommendedAction->isChecked() ?
"yes" :
"no"),
1826 "Install recommended packages");
1828 catch(
const std::exception &e )
1830 yuiError() <<
"Writing " << PATH_TO_YAST_SYSCONFIG <<
" failed" << std::endl;
1836 YQUI::ui()->busyCursor();
1841 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.