41 #define YUILogComponent "ncurses-pkg"
46 #include "NCPkgTable.h"
48 #include "NCPopupInfo.h"
49 #include "NCPkgStrings.h"
51 #include "NCPkgPopupDiskspace.h"
52 #include "NCPackageSelector.h"
53 #include <zypp/ui/Selectable.h>
70 NCPkgTableTag::NCPkgTableTag( ZyppObj objPtr, ZyppSel selPtr,
74 , dataPointer( objPtr )
75 , selPointer( selPtr )
77 setLabel( statusToString(stat) );
80 std::string NCPkgTableTag::statusToString( ZyppStatus stat )
const
120 NCPkgTable::NCPkgTable( YWidget * parent, YTableHeader * tableHeader )
121 : NCTable( parent, tableHeader )
124 , tableType ( T_Packages )
125 , haveInstalledVersion ( false )
126 , visibleInfo( I_Technical )
128 yuiDebug() <<
"NCPkgTable created" << endl;
140 NCPkgTable::~NCPkgTable()
142 delete statusStrategy;
157 const std::vector<std::string> & elements,
161 YTableItem *tabItem =
new YTableItem();
164 tabItem->addCell(
new NCPkgTableTag( objPtr, slbPtr, stat ));
167 for (
unsigned i = 1; i < elements.size()+1; ++i ) {
168 tabItem->addCell( elements[i-1] );
172 addItem(tabItem,
true);
186 return NCTable::deleteAllItems();
200 return NCTable::cellChanged( index, colnum, newtext );
213 const ZyppSel & slbPtr,
218 if ( !packager || !slbPtr )
223 bool license_confirmed =
true;
224 ZyppPkg pkgPtr = NULL;
227 int cols = NCurses::cols();
228 int lines = NCurses::lines();
237 notify = objPtr->delnotify();
238 yuiMilestone() <<
"DELETE message: " << notify << endl;
239 header = NCPkgStrings::WarningLabel();
247 notify = objPtr->insnotify();
248 yuiMilestone() <<
"NOTIFY message: " << notify << endl;
249 header = NCPkgStrings::NotifyLabel();
257 license = objPtr->licenseToConfirm();
258 license_confirmed = slbPtr->hasLicenceConfirmed();
265 std::string pkgName = slbPtr->name();
267 if ( !license.empty() )
269 if ( !license_confirmed )
274 if ( !license_confirmed )
286 newstatus = S_Protected;
295 yuiMilestone() <<
"User confirmed license agreement for " << pkgName << endl;
296 slbPtr->setLicenceConfirmed (
true);
300 if ( ok && !notify.empty() )
302 std::string html_text = packager->InfoText()->createHtmlText( notify );
303 NCPopupInfo * info =
new NCPopupInfo( wpos( (lines * 35)/100, (cols * 25)/100),
305 "<i>" + pkgName +
"</i><br><br>" + html_text
307 info->setPreferredSize( (NCurses::cols() * 50)/100, (NCurses::lines() * 30)/100);
308 info->showInfoPopup( );
310 YDialog::deleteTopmostDialog();
316 if ( ok && singleChange )
351 if ( tableType == T_Availables || tableType == T_MultiVersion )
372 unsigned int index = 0;
375 while ( index < size )
378 NCTableLine * cl = myPad()->ModifyLine( index );
386 YTableItem *it =
dynamic_cast<YTableItem*
> (cl->origItem() );
387 YTableCell *tcell = it->cell(0);
399 ZyppStatus newstatus = S_NoInst;
400 if ( slbPtr && objPtr)
402 if ( tableType == T_Availables && !slbPtr->multiversionInstall() )
404 std::string isCandidate =
" ";
405 if ( objPtr == slbPtr->candidateObj() )
408 cl->AddCol( 2,
new NCTableCol( isCandidate ) );
418 cc->setStatus( newstatus );
419 cellChanged( index, 0, cc->statusToString (newstatus) );
437 static bool slbHasInstalledObj (
const ZyppSel & slb)
439 return ! slb->installedEmpty ();
450 std::vector<std::string> header;
456 bool haveInstalledPkgs = find_if (zyppPkgBegin (), zyppPkgEnd (),
457 slbHasInstalledObj) != zyppPkgEnd ();
460 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
461 header.push_back(
"L" + NCPkgStrings::PkgName() );
462 header.push_back(
"L" + NCPkgStrings::PkgSummary() );
463 if ( haveInstalledPkgs > 0 )
465 header.push_back(
"L" + NCPkgStrings::PkgVersionNew() );
466 header.push_back(
"L" + NCPkgStrings::PkgVersionInst() );
467 haveInstalledVersion =
true;
471 header.push_back(
"L" + NCPkgStrings::PkgVersion() );
473 header.push_back(
"L" + NCPkgStrings::PkgSize() );
476 header.push_back(
"L" + NCPkgStrings::PkgSource() );
482 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
483 header.push_back(
"L" + NCPkgStrings::PkgName() );
484 header.push_back(
"L" + NCPkgStrings::PkgVersionNew() );
485 header.push_back(
"L" + NCPkgStrings::PkgVersionInst() );
486 header.push_back(
"L" + NCPkgStrings::PkgSummary() );
487 header.push_back(
"L" + NCPkgStrings::PkgSize() );
492 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
493 header.push_back(
"L" + NCPkgStrings::PkgName() );
494 header.push_back(
"L" + NCPkgStrings::PkgSummary() );
495 header.push_back(
"L" + NCPkgStrings::PatchKind() );
496 header.push_back(
"L" + NCPkgStrings::PkgVersion() );
502 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
503 header.push_back(
"L" + NCPkgStrings::PatternsLabel() );
508 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
509 header.push_back(
"L" + NCPkgStrings::LangCode() );
510 header.push_back(
"L" + NCPkgStrings::LangName() );
515 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
516 header.push_back(
"L" + NCPkgStrings::PkgName() );
517 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
518 header.push_back(
"L" + NCPkgStrings::PkgVersion() );
519 header.push_back(
"L" + NCPkgStrings::PkgInstSource() );
520 header.push_back(
"L" + NCPkgStrings::PkgSize() );
521 header.push_back(
"L" + NCPkgStrings::PkgArch() );
524 case T_MultiVersion: {
526 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
527 header.push_back(
"L" + NCPkgStrings::PkgName() );
528 header.push_back(
"L" + NCPkgStrings::PkgVersion() );
529 header.push_back(
"L" + NCPkgStrings::PkgInstSource() );
530 header.push_back(
"L" + NCPkgStrings::PkgSize() );
531 header.push_back(
"L" + NCPkgStrings::PkgArch() );
536 header.push_back(
"L" + NCPkgStrings::PkgStatus() );
537 header.push_back(
"L" + NCPkgStrings::PkgName() );
538 header.push_back(
"L" + NCPkgStrings::PkgSummary() );
552 std::vector<std::string> pkgLine;
555 if ( !pkgPtr || !slbPtr )
557 yuiError() <<
"No valid package available" << endl;
562 pkgLine.push_back( slbPtr->name() );
564 std::string instVersion =
"";
565 std::string version =
"";
572 if ( ! slbPtr->installedEmpty() )
574 instVersion = slbPtr->installedObj()->edition().asString();
577 if ( slbPtr->hasCandidateObj() )
579 version = slbPtr->candidateObj()->edition().asString();
583 version = pkgPtr->edition().asString();
585 pkgLine.push_back( version );
589 pkgLine.push_back( instVersion );
591 pkgLine.push_back( pkgPtr->summary() );
593 status = slbPtr->status();
594 yuiMilestone() <<
"Status of " << slbPtr->name() <<
": " << status << endl;
595 zypp::ByteCount size = pkgPtr->installSize();
596 pkgLine.push_back( size.asString( 8 ) );
601 std::string isCandidate =
" ";
602 if ( pkgPtr == slbPtr->candidateObj() )
604 pkgLine.push_back( isCandidate );
606 version = pkgPtr->edition().asString();
607 pkgLine.push_back( version );
609 pkgLine.push_back( pkgPtr->repository().info().name() );
613 zypp::ui::Selectable::installed_iterator it = slbPtr->installedBegin();
615 while ( it != slbPtr->installedEnd() )
617 if ( pkgPtr->edition() == (*it)->edition() &&
618 pkgPtr->arch() == (*it)->arch() &&
619 pkgPtr->vendor() == (*it)->vendor() )
621 status = S_KeepInstalled;
626 zypp::ByteCount size = pkgPtr->installSize();
627 pkgLine.push_back( size.asString( 8 ) );
628 pkgLine.push_back( pkgPtr->arch().asString());
632 case T_MultiVersion: {
633 version = pkgPtr->edition().asString();
634 pkgLine.push_back( version );
636 pkgLine.push_back( pkgPtr->repository().info().name() );
638 zypp::PoolItem itemPtr( pkgPtr->satSolvable() );
639 status = slbPtr->pickStatus( itemPtr );
640 yuiMilestone() <<
"Multi version: status of " << version <<
": " << status << endl;
642 zypp::ByteCount size = pkgPtr->installSize();
643 pkgLine.push_back( size.asString( 8 ) );
644 pkgLine.push_back( pkgPtr->arch().asString());
649 pkgLine.push_back( pkgPtr->summary() );
650 if ( ! slbPtr->installedEmpty() )
652 instVersion = slbPtr->installedObj()->edition().version();
655 if ( slbPtr->hasCandidateObj() )
657 version = slbPtr->candidateObj()->edition().version();
662 version = pkgPtr->edition().version();
664 pkgLine.push_back( version );
666 if ( haveInstalledVersion )
668 pkgLine.push_back( instVersion );
671 status = slbPtr->status();
673 zypp::ByteCount size = pkgPtr->installSize();
674 pkgLine.push_back( size.asString( 8 ) );
678 if ( slbPtr->source_install() )
680 pkgLine.push_back(
" x " );
685 pkgLine.push_back(
" " );
706 std::vector<std::string> pkgLine;
709 pkgLine.push_back( text );
725 std::vector<std::string> pkgLine;
728 if ( !patchPtr || !slb )
730 yuiError() <<
"No valid patch available" << endl;
734 pkgLine.push_back( slb->name() );
736 if ( !patchPtr->summary().empty() )
737 pkgLine.push_back( patchPtr->summary() );
739 pkgLine.push_back( slb->name() );
741 pkgLine.push_back( patchPtr->category() );
742 pkgLine.push_back( patchPtr->edition().asString() );
774 if (objPtr && slbPtr)
776 updateInfo( objPtr, slbPtr, VisibleInfo() );
777 packager->PackageLabel()->setLabel( slbPtr->name() );
782 if (objPtr && slbPtr )
783 updateInfo( objPtr, slbPtr, VisibleInfo() );
803 NCursesEvent ret = NCursesEvent::none;
808 if ( packager->isTestMode() )
810 if ( packager->diskSpacePopup() )
811 packager->diskSpacePopup()->setDiskSpace( key );
835 NCTable::wHandleInput( key);
845 changeObjStatus( key );
852 NCDialog * currentDialog =
static_cast<NCDialog *
>(YDialog::topmostDialog());
854 currentDialog->setStatusLine();
856 return NCursesEvent::handled;
872 return cc->getStatus();
882 return cc->getDataPointer();
892 return cc->getSelPointer();
898 NCTableLine * cl = myPad()->ModifyLine( index );
903 YTableItem *it =
dynamic_cast<YTableItem*
> (cl->origItem() );
904 YTableCell *tcell = it->cell(0);
916 bool NCPkgTable::SourceInstall(
bool install )
918 int index = getCurrentItem();
924 yuiError() <<
"Invalid Pointer" << endl;
927 ZyppSel selPtr = objPtr->getSelectable();
928 NCTableLine * currentLine = myPad()->ModifyLine( index );
930 if ( !selPtr || !currentLine )
932 yuiError() <<
"Invalid Selectable" << endl;
936 NCTableCol * currentCol = currentLine->GetCol( currentLine->Cols()-1 );
938 if ( install && selPtr->providesSources() )
940 ok = selPtr->set_source_install(
true );
941 yuiMilestone() <<
"Set source install returns: " << (ok?
"true":
"false") << endl;
943 currentCol->SetLabel( NClabel(
" x " ) );
945 else if ( !install && selPtr->source_install() )
947 ok = selPtr->set_source_install(
false );
948 yuiMilestone() <<
"ReSet source install returns: " << (ok?
"true":
"false") << endl;
950 currentCol->SetLabel( NClabel(
" " ) );
962 bool NCPkgTable::toggleObjStatus( )
970 ZyppStatus newStatus;
972 bool ok = statusStrategy->
toggleStatus( slbPtr, objPtr, newStatus );
987 bool NCPkgTable::changeObjStatus(
int key )
996 ZyppStatus newStatus;
998 bool ok = statusStrategy->
keyToStatus( key, slbPtr, objPtr, newStatus );
1012 bool NCPkgTable::changeListObjStatus( NCPkgTableListAction type )
1014 ZyppStatus newStatus;
1016 unsigned int index = 0;
1018 while ( index < size )
1029 if ( slbPtr->status() == S_NoInst )
1030 ok = statusStrategy->
keyToStatus(
'+', slbPtr, objPtr, newStatus );
1034 if ( slbPtr->installedObj() && slbPtr->status() != S_Protected )
1035 ok = statusStrategy->
keyToStatus(
'-', slbPtr, objPtr, newStatus );
1038 case A_UpdateNewer: {
1040 if ( slbPtr->installedObj() && slbPtr->status() != S_Protected && slbPtr->updateCandidateObj() )
1042 slbPtr->setOnSystem( slbPtr->updateCandidateObj() );
1043 ok = statusStrategy->
keyToStatus(
'>', slbPtr, objPtr, newStatus );
1048 if ( slbPtr->installedObj() && slbPtr->status() != S_Protected )
1049 ok = statusStrategy->
keyToStatus(
'>', slbPtr, objPtr, newStatus );
1053 if ( slbPtr->status() == S_Install
1054 || slbPtr->status() == S_AutoInstall
1055 || slbPtr->status() == S_Update
1056 || slbPtr->status() == S_AutoUpdate )
1057 ok = statusStrategy->
keyToStatus(
'<', slbPtr, objPtr, newStatus );
1058 else if ( slbPtr->status() == S_Del
1059 || slbPtr->status() == S_AutoDel )
1060 ok = statusStrategy->
keyToStatus(
'+', slbPtr, objPtr, newStatus );
1064 yuiError() <<
"Unknown list action" << endl;
1088 bool NCPkgTable::fillAvailableList ( ZyppSel slb )
1092 yuiError() <<
"Package pointer not valid" << endl;
1100 NCPkgTableType type;
1102 if ( slb->multiversionInstall() )
1104 type = T_MultiVersion;
1106 yuiMilestone() <<
"Multi version package " << slb->name() << endl;
1110 type = T_Availables;
1118 zypp::ui::Selectable::picklist_iterator it = slb->picklistBegin();
1119 while ( it != slb->picklistEnd() )
1128 zypp::ui::Selectable::installed_iterator it = slb->installedBegin();
1129 while ( it != slb->installedEnd() )
1137 zypp::ui::Selectable::available_iterator it = slb->availableBegin();
1138 while ( it != slb->availableEnd() )
1151 setCurrentItem( 0 );
1157 bool NCPkgTable::fillSummaryList( NCPkgTable::NCPkgTableListType type )
1163 std::list<ZyppSel> pkgList( zyppPkgBegin (), zyppPkgEnd () );
1164 pkgList.sort( sortByName );
1167 std::list<ZyppSel>::iterator listIt;
1179 for ( listIt = pkgList.begin(); listIt != pkgList.end(); ++listIt )
1181 ZyppSel selectable = *listIt;
1182 ZyppPkg pkg = tryCastToZyppPkg (selectable->theObj ());
1186 case NCPkgTable::L_Changes: {
1187 if ( selectable->status() != S_NoInst
1188 && selectable->status() != S_KeepInstalled )
1194 case NCPkgTable::L_Installed: {
1195 if ( selectable->status() == S_KeepInstalled )
1212 void NCPkgTable::updateInfo( ZyppObj pkgPtr, ZyppSel slbPtr, NCPkgTableInfoType mode )
1217 if ( packager->InfoText() )
1218 packager->InfoText()->longDescription( pkgPtr );
1221 if ( packager->InfoText() )
1222 packager->InfoText()->technicalData( pkgPtr, slbPtr );
1225 if ( packager->InfoText() )
1226 packager->InfoText()->fileList( slbPtr );
1229 if ( packager->InfoText() )
1230 packager->InfoText()->dependencyList( pkgPtr, slbPtr );
1233 if ( packager->VersionsList() )
1234 packager->VersionsList()->fillAvailableList( slbPtr );
1237 if ( packager->InfoText() )
1238 packager->InfoText()->patchDescription( pkgPtr, slbPtr );
1241 if ( packager->PatchPkgs() )
1244 case I_PatchPkgsVersions:
1245 if ( packager->PatchPkgsVersions() )