41 #define YUILogComponent "ncurses-pkg"
44 #include <boost/format.hpp>
47 #include "NCPkgTable.h"
49 #include "NCPopupInfo.h"
50 #include "NCPkgStrings.h"
52 #include "NCPkgPopupDiskspace.h"
53 #include "NCPackageSelector.h"
54 #include <zypp/ui/Selectable.h>
57 #define SOURCE_INSTALL_SUPPORTED 0
68 NCPkgTableTag::NCPkgTableTag( ZyppObj objPtr, ZyppSel selPtr, ZyppStatus stat )
71 , dataPointer( objPtr )
72 , selPointer( selPtr )
74 setLabel( statusToString(stat) );
78 string NCPkgTableTag::statusToString( ZyppStatus stat )
const
121 NCPkgTable::NCPkgTable( YWidget * parent, YTableHeader * tableHeader )
122 : NCTable( parent, tableHeader )
125 , tableType( T_Packages )
126 , haveInstalledVersion( false )
127 , visibleInfo( I_Technical )
129 yuiDebug() <<
"NCPkgTable created" << endl;
133 NCPkgTable::~NCPkgTable()
135 delete statusStrategy;
141 const vector<string> & elements,
145 YTableItem *tabItem =
new YTableItem();
148 tabItem->addCell(
new NCPkgTableTag( objPtr, slbPtr, stat ));
150 for (
const string& s: elements )
151 tabItem->addCell( s );
154 addItem( tabItem,
true );
160 return NCTable::deleteAllItems();
168 const ZyppSel & slbPtr,
172 if ( !packager || !slbPtr )
175 yuiMilestone() <<
"Changing status of " << slbPtr->name() << endl;
179 bool confirmed =
true;
180 ZyppPkg pkgPtr = NULL;
191 notify = objPtr->delnotify();
192 yuiMilestone() <<
"DELETE message: " << notify << endl;
193 header = NCPkgStrings::WarningLabel();
202 notify = objPtr->insnotify();
203 yuiMilestone() <<
"NOTIFY message: " << notify << endl;
204 header = NCPkgStrings::NotifyLabel();
212 if ( objPtr->isRetracted() )
216 license = objPtr->licenseToConfirm();
223 string pkgName = slbPtr->name();
225 if ( ! license.empty() )
227 if ( ! slbPtr->hasLicenceConfirmed() )
232 yuiMilestone() <<
"User confirmed license agreement for " << pkgName << endl;
233 slbPtr->setLicenceConfirmed (
true);
249 newstatus = S_Protected;
259 if ( ok && ! notify.empty() )
261 int cols = NCurses::cols();
262 int lines = NCurses::lines();
264 string html_text = packager->InfoText()->createHtmlText( notify );
265 NCPopupInfo * info =
new NCPopupInfo( wpos( (lines * 35)/100, (cols * 25)/100),
267 "<i>" + pkgName +
"</i><br><br>" + html_text );
268 info->setPreferredSize( (cols * 50)/100, (lines * 30)/100);
269 info->showInfoPopup();
271 YDialog::deleteTopmostDialog();
277 if ( ok && singleChange )
315 if ( tableType == T_Availables || tableType == T_MultiVersion )
332 unsigned int index = 0;
335 while ( index < size )
338 NCTableLine * cl = myPad()->ModifyLine( index );
347 YTableItem *it =
dynamic_cast<YTableItem*
> (cl->origItem() );
348 YTableCell *tcell = it->cell(0);
360 ZyppStatus newstatus = S_NoInst;
361 if ( slbPtr && objPtr)
363 if ( tableType == T_Availables && !slbPtr->multiversionInstall() )
365 string isCandidate =
" ";
366 if ( objPtr == slbPtr->candidateObj() )
369 cl->AddCol( 2,
new NCTableCol( isCandidate ) );
379 cc->setStatus( newstatus );
380 setCell( index, 0, cc->statusToString (newstatus) );
393 static bool slbHasInstalledObj (
const ZyppSel & slb)
395 return ! slb->installedEmpty();
404 vector<string> header;
411 bool haveInstalledPkgs = find_if (zyppPkgBegin(), zyppPkgEnd(),
412 slbHasInstalledObj) != zyppPkgEnd();
415 header.push_back( NCPkgStrings::PkgStatus() );
416 header.push_back( NCPkgStrings::PkgName() );
417 header.push_back( NCPkgStrings::PkgSummary() );
419 if ( haveInstalledPkgs > 0 )
421 header.push_back( NCPkgStrings::PkgVersionNew() );
422 header.push_back( NCPkgStrings::PkgVersionInst() );
423 haveInstalledVersion =
true;
427 header.push_back( NCPkgStrings::PkgVersion() );
430 header.push_back( NCPkgStrings::PkgSize() );
432 #if SOURCE_INSTALL_SUPPORTED
433 header.push_back( NCPkgStrings::PkgSource() );
440 header.push_back( NCPkgStrings::PkgStatus() );
441 header.push_back( NCPkgStrings::PkgName() );
442 header.push_back( NCPkgStrings::PkgVersionNew() );
443 header.push_back( NCPkgStrings::PkgVersionInst() );
444 header.push_back( NCPkgStrings::PkgSummary() );
445 header.push_back( NCPkgStrings::PkgSize() );
451 header.push_back( NCPkgStrings::PkgStatus() );
452 header.push_back( NCPkgStrings::PkgName() );
453 header.push_back( NCPkgStrings::PatchKind() );
454 header.push_back( NCPkgStrings::PkgSummary() );
455 header.push_back( NCPkgStrings::PkgVersion() );
462 header.push_back( NCPkgStrings::PkgStatus() );
463 header.push_back( NCPkgStrings::PatternsLabel() );
469 header.push_back( NCPkgStrings::PkgStatus() );
470 header.push_back( NCPkgStrings::LangCode() );
471 header.push_back( NCPkgStrings::LangName() );
477 header.push_back( NCPkgStrings::PkgStatus() );
478 header.push_back( NCPkgStrings::PkgName() );
479 header.push_back( NCPkgStrings::PkgStatus() );
480 header.push_back( NCPkgStrings::PkgVersion() );
481 header.push_back( NCPkgStrings::PkgInstSource() );
482 header.push_back( NCPkgStrings::PkgSize() );
483 header.push_back( NCPkgStrings::PkgArch() );
489 header.push_back( NCPkgStrings::PkgStatus() );
490 header.push_back( NCPkgStrings::PkgName() );
491 header.push_back( NCPkgStrings::PkgVersion() );
492 header.push_back( NCPkgStrings::PkgInstSource() );
493 header.push_back( NCPkgStrings::PkgSize() );
494 header.push_back( NCPkgStrings::PkgArch() );
499 header.push_back( NCPkgStrings::PkgStatus() );
500 header.push_back( NCPkgStrings::PkgName() );
501 header.push_back( NCPkgStrings::PkgSummary() );
511 vector<string> pkgLine;
514 if ( !pkgPtr || !slbPtr )
516 yuiError() <<
"No valid package available" << endl;
521 pkgLine.push_back( slbPtr->name() );
523 string instVersion =
"";
532 if ( ! slbPtr->installedEmpty() )
534 instVersion = slbPtr->installedObj()->edition().asString();
538 if ( slbPtr->hasCandidateObj() )
540 version = slbPtr->candidateObj()->edition().asString();
544 version = pkgPtr->edition().asString();
546 pkgLine.push_back( version );
550 pkgLine.push_back( instVersion );
552 pkgLine.push_back( pkgPtr->summary() );
554 status = slbPtr->status();
555 yuiMilestone() <<
"Status of " << slbPtr->name() <<
": " << status << endl;
556 FSize size(zypp::ByteCount::SizeType(pkgPtr->installSize()));
557 pkgLine.push_back( size.form( 8 ) );
564 string isCandidate =
" ";
565 if ( pkgPtr == slbPtr->candidateObj() )
567 pkgLine.push_back( isCandidate );
569 version = pkgPtr->edition().asString();
571 if ( pkgPtr->isRetracted() )
574 pkgLine.push_back( version );
576 pkgLine.push_back( pkgPtr->repository().info().name() );
580 zypp::ui::Selectable::installed_iterator it = slbPtr->installedBegin();
582 while ( it != slbPtr->installedEnd() )
584 if ( pkgPtr->edition() == (*it)->edition() &&
585 pkgPtr->arch() == (*it)->arch() &&
586 pkgPtr->vendor() == (*it)->vendor() )
588 status = S_KeepInstalled;
593 FSize size(zypp::ByteCount::SizeType(pkgPtr->installSize()));
594 pkgLine.push_back( size.form( 8 ) );
595 pkgLine.push_back( pkgPtr->arch().asString());
602 version = pkgPtr->edition().asString();
604 if ( pkgPtr->isRetracted() )
607 pkgLine.push_back( version );
609 pkgLine.push_back( pkgPtr->repository().info().name() );
611 zypp::PoolItem itemPtr( pkgPtr->satSolvable() );
612 status = slbPtr->pickStatus( itemPtr );
613 yuiMilestone() <<
"Multi version: status of " << version <<
": " << status << endl;
615 FSize size(zypp::ByteCount::SizeType(pkgPtr->installSize()));
616 pkgLine.push_back( size.form( 8 ) );
617 pkgLine.push_back( pkgPtr->arch().asString());
624 pkgLine.push_back( pkgPtr->summary() );
626 if ( ! slbPtr->installedEmpty() )
628 instVersion = slbPtr->installedObj()->edition().version();
631 if ( slbPtr->hasCandidateObj() )
633 version = slbPtr->candidateObj()->edition().version();
638 version = pkgPtr->edition().version();
640 pkgLine.push_back( version );
642 if ( haveInstalledVersion )
644 pkgLine.push_back( instVersion );
647 status = slbPtr->status();
649 FSize size(zypp::ByteCount::SizeType(pkgPtr->installSize()));
650 pkgLine.push_back( size.form( 8 ) );
652 #if SOURCE_INSTALL_SUPPORTED
653 if ( slbPtr->source_install() )
655 pkgLine.push_back(
" x " );
660 pkgLine.push_back(
" " );
676 vector<string> pkgLine;
679 pkgLine.push_back( text );
691 vector<string> pkgLine;
694 if ( !patchPtr || !slb )
696 yuiError() <<
"No valid patch available" << endl;
700 pkgLine.push_back( slb->name() );
702 pkgLine.push_back( patchPtr->category() );
704 if ( !patchPtr->summary().empty() )
705 pkgLine.push_back( patchPtr->summary() );
707 pkgLine.push_back( slb->name() );
709 pkgLine.push_back( patchPtr->edition().asString() );
726 if ( getCurrentItem() == -1 )
728 yuiWarning() <<
"no selected package" << endl;
735 if ( !packager || !objPtr || !slbPtr )
738 yuiMilestone() <<
"show information for " << slbPtr->name() << endl;
745 updateInfo( objPtr, slbPtr, VisibleInfo() );
746 packager->PackageLabel()->setLabel( slbPtr->name() );
751 updateInfo( objPtr, slbPtr, VisibleInfo() );
764 NCursesEvent ret = NCursesEvent::none;
769 if ( packager->isTestMode() )
771 if ( packager->diskSpacePopup() )
772 packager->diskSpacePopup()->setDiskSpace( key );
794 NCTable::wHandleInput( key);
804 changeObjStatus( key );
810 NCDialog * currentDialog =
static_cast<NCDialog *
>(YDialog::topmostDialog());
812 currentDialog->setStatusLine();
814 return NCursesEvent::handled;
827 return cc->getStatus();
837 return cc->getDataPointer();
847 return cc->getSelPointer();
853 NCTableLine * cl = myPad()->ModifyLine( index );
858 YTableItem *it =
dynamic_cast<YTableItem*
> (cl->origItem() );
859 YTableCell *tcell = it->cell(0);
866 #if SOURCE_INSTALL_SUPPORTED
868 bool NCPkgTable::SourceInstall(
bool install )
870 int index = getCurrentItem();
876 yuiError() <<
"Invalid Pointer" << endl;
879 ZyppSel selPtr = objPtr->getSelectable();
880 NCTableLine * currentLine = myPad()->ModifyLine( index );
882 if ( !selPtr || !currentLine )
884 yuiError() <<
"Invalid Selectable" << endl;
888 NCTableCol * currentCol = currentLine->GetCol( currentLine->Cols()-1 );
890 if ( install && selPtr->providesSources() )
892 ok = selPtr->set_source_install(
true );
893 yuiMilestone() <<
"Set source install returns: " << ( ok ?
"true" :
"false" ) << endl;
895 currentCol->SetLabel( NClabel(
" x " ) );
897 else if ( !install && selPtr->source_install() )
899 ok = selPtr->set_source_install(
false );
900 yuiMilestone() <<
"ReSet source install returns: " << ( ok ?
"true" :
"false" ) << endl;
902 currentCol->SetLabel( NClabel(
" " ) );
910 bool NCPkgTable::cycleObjStatus()
918 ZyppStatus newStatus;
920 bool ok = statusStrategy->
cycleStatus( slbPtr, objPtr, newStatus );
931 bool NCPkgTable::changeObjStatus(
int key )
939 ZyppStatus newStatus;
941 bool ok = statusStrategy->
keyToStatus( key, slbPtr, objPtr, newStatus );
950 bool NCPkgTable::changeListObjStatus( NCPkgTableListAction type )
952 ZyppStatus newStatus;
954 unsigned int index = 0;
956 while ( index < size )
969 if ( slbPtr->status() == S_NoInst )
970 ok = statusStrategy->
keyToStatus(
'+', slbPtr, objPtr, newStatus );
976 if ( slbPtr->installedObj() && slbPtr->status() != S_Protected )
977 ok = statusStrategy->
keyToStatus(
'-', slbPtr, objPtr, newStatus );
984 if ( slbPtr->installedObj() && slbPtr->status() != S_Protected && slbPtr->updateCandidateObj() )
986 slbPtr->setOnSystem( slbPtr->updateCandidateObj() );
987 ok = statusStrategy->
keyToStatus(
'>', slbPtr, objPtr, newStatus );
994 if ( slbPtr->installedObj() && slbPtr->status() != S_Protected )
995 ok = statusStrategy->
keyToStatus(
'>', slbPtr, objPtr, newStatus );
1001 if ( slbPtr->status() == S_Install
1002 || slbPtr->status() == S_AutoInstall
1003 || slbPtr->status() == S_Update
1004 || slbPtr->status() == S_AutoUpdate )
1005 ok = statusStrategy->
keyToStatus(
'<', slbPtr, objPtr, newStatus );
1006 else if ( slbPtr->status() == S_Del
1007 || slbPtr->status() == S_AutoDel )
1008 ok = statusStrategy->
keyToStatus(
'+', slbPtr, objPtr, newStatus );
1013 yuiError() <<
"Unknown list action" << endl;
1038 bool NCPkgTable::fillAvailableList( ZyppSel slb )
1042 yuiError() <<
"Package pointer not valid" << endl;
1050 NCPkgTableType type;
1052 if ( slb->multiversionInstall() || slb->installedSize() > 1 )
1059 type = T_MultiVersion;
1061 yuiMilestone() <<
"Multi version package " << slb->name() << endl;
1065 type = T_Availables;
1073 zypp::ui::Selectable::picklist_iterator it = slb->picklistBegin();
1074 while ( it != slb->picklistEnd() )
1082 scrollToFirstItem();
1089 bool NCPkgTable::fillSummaryList( NCPkgTable::NCPkgTableListType type )
1095 std::list<ZyppSel> pkgList( zyppPkgBegin(), zyppPkgEnd() );
1096 pkgList.sort( sortByName );
1099 std::list<ZyppSel>::iterator listIt;
1112 for ( listIt = pkgList.begin(); listIt != pkgList.end(); ++listIt )
1114 ZyppSel selectable = *listIt;
1115 ZyppPkg pkg = tryCastToZyppPkg( selectable->theObj() );
1119 case NCPkgTable::L_Changes:
1120 if ( selectable->status() != S_NoInst
1121 && selectable->status() != S_KeepInstalled )
1127 case NCPkgTable::L_Installed:
1128 if ( selectable->status() == S_KeepInstalled )
1146 void NCPkgTable::updateInfo( ZyppObj pkgPtr, ZyppSel slbPtr, NCPkgTableInfoType mode )
1151 if ( packager->InfoText() )
1152 packager->InfoText()->longDescription( pkgPtr );
1156 if ( packager->InfoText() )
1157 packager->InfoText()->technicalData( pkgPtr, slbPtr );
1161 if ( packager->InfoText() )
1162 packager->InfoText()->fileList( slbPtr );
1166 if ( packager->InfoText() )
1167 packager->InfoText()->dependencyList( pkgPtr, slbPtr );
1171 if ( packager->VersionsList() )
1172 packager->VersionsList()->fillAvailableList( slbPtr );
1176 if ( packager->InfoText() )
1177 packager->InfoText()->patchDescription( pkgPtr, slbPtr );
1181 if ( packager->PatchPkgs() )
1193 yuiMilestone() <<
"Retracted object " << sel->name() <<
" " << pkg->edition() << endl;
1196 string heading = _(
"Please confirm" );
1198 std::ostringstream msg;
1200 msg << boost::format( _(
"<p>Really install a retracted version of \"%s\" ?</p>" ) ) % sel->name();
1201 int width = msg.str().size() + 2;
1204 NCPopupInfo * info =
new NCPopupInfo( wpos( ( NCurses::lines() - height ) / 2,
1205 ( NCurses::cols() - width ) / 2 ),
1210 info->setPreferredSize( width, height );
1211 NCursesEvent
event = info->showInfoPopup();
1212 YDialog::deleteTopmostDialog();
1213 bool confirmed = (
event != NCursesEvent::cancel );
1215 yuiMilestone() <<
"User " << ( confirmed ?
"confirmed" :
"rejected" )
1216 <<
" retracted object " << sel->name() <<
" " << pkg->edition()