libyui-ncurses-pkg  2.43.4
 All Classes Functions
NCPkgTable.cc
1 /****************************************************************************
2 |
3 | Copyright (c) [2002-2011] Novell, Inc.
4 | All Rights Reserved.
5 |
6 | This program is free software; you can redistribute it and/or
7 | modify it under the terms of version 2 of the GNU General Public License as
8 | published by the Free Software Foundation.
9 |
10 | This program is distributed in the hope that it will be useful,
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | GNU General Public License for more details.
14 |
15 | You should have received a copy of the GNU General Public License
16 | along with this program; if not, contact Novell, Inc.
17 |
18 | To contact Novell about this file by physical or electronic mail,
19 | you may find current contact information at www.novell.com
20 |
21 |***************************************************************************/
22 
23 
24 /*---------------------------------------------------------------------\
25 | |
26 | __ __ ____ _____ ____ |
27 | \ \ / /_ _/ ___|_ _|___ \ |
28 | \ V / _` \___ \ | | __) | |
29 | | | (_| |___) || | / __/ |
30 | |_|\__,_|____/ |_| |_____| |
31 | |
32 | core system |
33 | (C) SuSE GmbH |
34 \----------------------------------------------------------------------/
35 
36  File: NCPkgTable.cc
37 
38  Author: Gabriele Strattner <gs@suse.de>
39 
40 /-*/
41 #define YUILogComponent "ncurses-pkg"
42 #include <YUILog.h>
43 #include <YDialog.h>
44 
45 #include "NCurses.h"
46 #include "NCPkgTable.h"
47 #include "NCTable.h"
48 #include "NCPopupInfo.h"
49 #include "NCPkgStrings.h"
50 #include "NCi18n.h"
51 #include "NCPkgPopupDiskspace.h"
52 #include "NCPackageSelector.h"
53 #include <zypp/ui/Selectable.h>
54 #include "NCZypp.h"
55 
56 using std::endl;
57 
58 /*
59  Textdomain "ncurses-pkg"
60 */
61 
62 ///////////////////////////////////////////////////////////////////
63 //
64 //
65 // METHOD NAME : NCPkgTableTag::NCPkgTableTag
66 // METHOD TYPE : Constructor
67 //
68 // DESCRIPTION :
69 //
70 NCPkgTableTag::NCPkgTableTag( ZyppObj objPtr, ZyppSel selPtr,
71  ZyppStatus stat )
72  : YTableCell( " " )
73  , status ( stat )
74  , dataPointer( objPtr )
75  , selPointer( selPtr )
76 {
77  setLabel( statusToString(stat) );
78 }
79 
80 std::string NCPkgTableTag::statusToString( ZyppStatus stat ) const
81 {
82  // convert ZyppStatus to std::string
83  switch ( stat )
84  {
85  case S_NoInst: // Is not installed and will not be installed
86  return " ";
87  case S_KeepInstalled: // Is installed - keep this version
88  return " i ";
89  case S_Install: // Will be installed
90  return " + ";
91  case S_Del: // Will be deleted
92  return " - ";
93  case S_Update: // Will be updated
94  return " > ";
95  case S_AutoInstall: // Will be automatically installed
96  return " a+ ";
97  case S_AutoDel: // Will be automatically deleted
98  return " a- ";
99  case S_AutoUpdate: // Will be automatically updated
100  return " a> ";
101  case S_Taboo: // Never install this
102  return " ---";
103  case S_Protected: // always keep installed version
104  return " -i-";
105  default:
106  return "####";
107  }
108 
109  return " ";
110 }
111 
112 ///////////////////////////////////////////////////////////////////
113 //
114 //
115 // METHOD NAME : NCPkgTable::NCPkgTable
116 // METHOD TYPE : Constructor
117 //
118 // DESCRIPTION :
119 //
120 NCPkgTable::NCPkgTable( YWidget * parent, YTableHeader * tableHeader )
121  : NCTable( parent, tableHeader )
122  , packager ( 0 )
123  , statusStrategy( new PackageStatStrategy ) // default strategy: packages
124  , tableType ( T_Packages ) // default type: packages
125  , haveInstalledVersion ( false )
126  , visibleInfo( I_Technical )
127 {
128  yuiDebug() << "NCPkgTable created" << endl;
129 }
130 
131 
132 ///////////////////////////////////////////////////////////////////
133 //
134 //
135 // METHOD NAME : NCPkgTable::~NCPkgTable
136 // METHOD TYPE : Destructor
137 //
138 // DESCRIPTION :
139 //
140 NCPkgTable::~NCPkgTable()
141 {
142  delete statusStrategy;
143  yuiDebug() << endl;
144 }
145 
146 
147 
148 ///////////////////////////////////////////////////////////////////
149 //
150 //
151 // METHOD NAME : NCPkgTable::addLine
152 // METHOD TYPE : void
153 //
154 // DESCRIPTION :
155 //
156 void NCPkgTable::addLine( ZyppStatus stat,
157  const std::vector<std::string> & elements,
158  ZyppObj objPtr,
159  ZyppSel slbPtr )
160 {
161  YTableItem *tabItem = new YTableItem();
162 
163  // fill first column (containing the status information and the package pointers)
164  tabItem->addCell( new NCPkgTableTag( objPtr, slbPtr, stat ));
165 
166 
167  for ( unsigned i = 1; i < elements.size()+1; ++i ) {
168  tabItem->addCell( elements[i-1] );
169  }
170 
171  // use all-at-once insertion mode - DrawPad() is called only after the loop
172  addItem(tabItem, true);
173 
174 }
175 
176 ///////////////////////////////////////////////////////////////////
177 //
178 //
179 // METHOD NAME : NCPkgTable::deleteAllItems
180 // METHOD TYPE : void
181 //
182 // DESCRIPTION :
183 //
185 {
186  return NCTable::deleteAllItems();
187 }
188 
189 
190 ///////////////////////////////////////////////////////////////////
191 //
192 //
193 // METHOD NAME : NCPkgTable::cellChanged
194 // METHOD TYPE : void
195 //
196 // DESCRIPTION :
197 //
198 void NCPkgTable::cellChanged( int index, int colnum, const std::string & newtext )
199 {
200  return NCTable::cellChanged( index, colnum, newtext );
201 }
202 
203 ///////////////////////////////////////////////////////////////////
204 //
205 //
206 // METHOD NAME : NCPkgTable::changeStatus
207 // METHOD TYPE : bool
208 //
209 // DESCRIPTION : sets the new status in first column of the package table
210 // and informs the package manager
211 //
212 bool NCPkgTable::changeStatus( ZyppStatus newstatus,
213  const ZyppSel & slbPtr,
214  // objPtr is candidatePtr or what the user selected instead of it.
215  ZyppObj objPtr,
216  bool singleChange )
217 {
218  if ( !packager || !slbPtr )
219  return false;
220 
221  std::string notify;
222  std::string license;
223  bool license_confirmed = true;
224  ZyppPkg pkgPtr = NULL;
225  std::string header;
226  bool ok = true;
227  int cols = NCurses::cols();
228  int lines = NCurses::lines();
229 
230  switch ( newstatus )
231  {
232  case S_Del:
233  case S_NoInst:
234  case S_Taboo:
235  if ( objPtr )
236  {
237  notify = objPtr->delnotify();
238  yuiMilestone() << "DELETE message: " << notify << endl;
239  header = NCPkgStrings::WarningLabel();
240  }
241  break;
242  //display notify msg only if we mark pkg for installation
243  //disregard update, to be consistent with Qt (#308410)
244  case S_Install:
245  if ( objPtr )
246  {
247  notify = objPtr->insnotify();
248  yuiMilestone() << "NOTIFY message: " << notify << endl;
249  header = NCPkgStrings::NotifyLabel();
250  }
251  case S_Update:
252  case S_AutoInstall:
253  case S_AutoUpdate:
254  if ( objPtr )
255  {
256  // check license of packages and patches in case of S_Install/S_Update/S_AutoInstall/S_AutoUpdate
257  license = objPtr->licenseToConfirm();
258  license_confirmed = slbPtr->hasLicenceConfirmed();
259  }
260  break;
261 
262  default: break;
263  }
264 
265  std::string pkgName = slbPtr->name();
266 
267  if ( !license.empty() )
268  {
269  if ( !license_confirmed )
270  {
271  license_confirmed = packager->showLicensePopup( pkgName, license);
272  }
273 
274  if ( !license_confirmed )
275  {
276  // make sure the package won't be installed
277  switch ( newstatus )
278  {
279  case S_Install:
280  case S_AutoInstall:
281  newstatus = S_Taboo;
282  break;
283 
284  case S_Update:
285  case S_AutoUpdate:
286  newstatus = S_Protected;
287  break;
288 
289  default:
290  break;
291  }
292 
293  ok = false;
294  } else {
295  yuiMilestone() << "User confirmed license agreement for " << pkgName << endl;
296  slbPtr->setLicenceConfirmed (true);
297  }
298  }
299 
300  if ( ok && !notify.empty() )
301  {
302  std::string html_text = packager->InfoText()->createHtmlText( notify );
303  NCPopupInfo * info = new NCPopupInfo( wpos( (lines * 35)/100, (cols * 25)/100),
304  header,
305  "<i>" + pkgName + "</i><br><br>" + html_text
306  );
307  info->setPreferredSize( (NCurses::cols() * 50)/100, (NCurses::lines() * 30)/100);
308  info->showInfoPopup( );
309 
310  YDialog::deleteTopmostDialog();
311  }
312 
313  // inform the package manager
314  ok = statusStrategy->setObjectStatus( newstatus, slbPtr, objPtr );
315 
316  if ( ok && singleChange )
317  {
318  switch ( tableType )
319  {
320  case T_Packages:
321  case T_PatchPkgs:
322  case T_Update:
323  // check/show dependencies of packages
324  packager->showPackageDependencies( false ); // only check if automatic check is ON
325  // show the required diskspace
326  packager->showDiskSpace();
327  break;
328  case T_Availables:
329  // check/show dependencies of packages
330  packager->showPackageDependencies( false );
331  // don't show diskspace (type T_Availables is also used in YOU mode)
332  break;
333  case T_Selections:
334  // check/show dependencies of selections
335  packager->showSelectionDependencies();
336  packager->showDiskSpace();
337  break;
338 
339  case T_Patches:
340  // show the download size for all selected patches
341  packager->showDownloadSize();
342  packager->showPackageDependencies( false );
343  break;
344 
345  default:
346  break;
347  }
348  // update this list to show the status changes
349  updateTable();
350 
351  if ( tableType == T_Availables )
352  {
353  // additionally update the package list
354  packager->updatePackageList();
355  }
356  }
357 
358  return ok;
359 }
360 
361 ///////////////////////////////////////////////////////////////////
362 //
363 //
364 // METHOD NAME : NCPkgTable::updateTable
365 // METHOD TYPE : bool
366 //
367 // DESCRIPTION : set the new status info if status has changed
368 //
370 {
371  unsigned int size = getNumLines();
372  unsigned int index = 0;
373  bool ret = true;
374 
375  while ( index < size )
376  {
377  // get the table line
378  NCTableLine * cl = myPad()->ModifyLine( index );
379  if ( !cl )
380  {
381  ret = false;
382  break;
383  }
384 
385  // get first column (the column containing the status info)
386  YTableItem *it = dynamic_cast<YTableItem*> (cl->origItem() );
387  YTableCell *tcell = it->cell(0);
388  NCPkgTableTag * cc = static_cast<NCPkgTableTag*>( tcell );
389  // get the object pointer
390  ZyppSel slbPtr = getSelPointer( index );
391  ZyppObj objPtr = getDataPointer( index );
392 
393  if ( !cc )
394  {
395  ret = false;
396  break;
397  }
398 
399  ZyppStatus newstatus = S_NoInst;
400  if ( slbPtr && objPtr)
401  {
402  if ( tableType == T_Availables )
403  {
404  std::string isCandidate = " ";
405  if ( objPtr == slbPtr->candidateObj() )
406  isCandidate = " x ";
407 
408  cl->AddCol( 2, new NCTableCol( isCandidate ) );
409  }
410  else
411  {
412  // get the new status and replace old status
413  newstatus = statusStrategy->getPackageStatus( slbPtr, objPtr );
414 
415  // set new status (if status has changed)
416  if ( getStatus(index) != newstatus )
417  {
418  cc->setStatus( newstatus );
419  cellChanged( index, 0, cc->statusToString (newstatus) );
420  }
421  }
422  }
423  index++;
424  }
425 
426  DrawPad();
427 
428  return ret;
429 }
430 
431 ///////////////////////////////////////////////////////////////////
432 //
433 // slbHasInstalledObj
434 //
435 // a helper to call a method
436 //
437 static bool slbHasInstalledObj (const ZyppSel & slb)
438 {
439  return ! slb->installedEmpty ();
440 }
441 
442 ///////////////////////////////////////////////////////////////////
443 //
444 // fillHeader
445 //
446 // Fillup the column headers of the package table
447 //
449 {
450  std::vector<std::string> header;
451 
452  switch ( tableType )
453  {
454  case T_Packages:
455  case T_Update: {
456  bool haveInstalledPkgs = find_if (zyppPkgBegin (), zyppPkgEnd (),
457  slbHasInstalledObj) != zyppPkgEnd ();
458 
459  header.reserve(7);
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 )
464  {
465  header.push_back( "L" + NCPkgStrings::PkgVersionNew() );
466  header.push_back( "L" + NCPkgStrings::PkgVersionInst() );
467  haveInstalledVersion = true;
468  }
469  else
470  {
471  header.push_back( "L" + NCPkgStrings::PkgVersion() );
472  }
473  header.push_back( "L" + NCPkgStrings::PkgSize() );
474 // installation of source rpms is not possible
475 #ifdef FIXME
476  header.push_back( "L" + NCPkgStrings::PkgSource() );
477 #endif
478  break;
479  }
480  case T_PatchPkgs: {
481  header.reserve(7);
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() );
488  break;
489  }
490  case T_Patches: {
491  header.reserve(6);
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() );
497  // header.push_back( "L" + NCPkgStrings::PkgSize() );
498  break;
499  }
500  case T_Selections: {
501  header.reserve(3);
502  header.push_back( "L" + NCPkgStrings::PkgStatus() );
503  header.push_back( "L" + NCPkgStrings::PatternsLabel() );
504  break;
505  }
506  case T_Languages: {
507  header.reserve(4);
508  header.push_back( "L" + NCPkgStrings::PkgStatus() );
509  header.push_back( "L" + NCPkgStrings::LangCode() );
510  header.push_back( "L" + NCPkgStrings::LangName() );
511  break;
512  }
513  case T_Availables: {
514  header.reserve(6);
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() );
522  break;
523  }
524  default: {
525  header.reserve(4);
526  header.push_back( "L" + NCPkgStrings::PkgStatus() );
527  header.push_back( "L" + NCPkgStrings::PkgName() );
528  header.push_back( "L" + NCPkgStrings::PkgSummary() );
529  break;
530  }
531  }
532  setHeader( header );
533 }
534 
535 ///////////////////////////////////////////////////////////////////
536 //
537 // createListEntry
538 //
539 //
540 bool NCPkgTable::createListEntry ( ZyppPkg pkgPtr, ZyppSel slbPtr )
541 {
542  std::vector<std::string> pkgLine;
543  pkgLine.reserve(6);
544 
545  if ( !pkgPtr || !slbPtr )
546  {
547  yuiError() << "No valid package available" << endl;
548  return false;
549  }
550 
551  // add the package name
552  pkgLine.push_back( slbPtr->name() );
553 
554  std::string instVersion = "";
555  std::string version = "";
556  ZyppStatus status;
557 
558  switch( tableType )
559  {
560  case T_PatchPkgs: {
561  // if the package is installed, get the installed version
562  if ( ! slbPtr->installedEmpty() )
563  {
564  instVersion = slbPtr->installedObj()->edition().asString();
565  }
566  // if a candidate is available, get the candidate version
567  if ( slbPtr->hasCandidateObj() )
568  {
569  version = slbPtr->candidateObj()->edition().asString();
570  }
571  else
572  {
573  version = pkgPtr->edition().asString();
574  }
575  pkgLine.push_back( version );
576 
577  // in case of YOU there are always installed packages
578  // => always add installed version (or empty column)
579  pkgLine.push_back( instVersion );
580 
581  pkgLine.push_back( pkgPtr->summary() ); // short description
582 
583  status = slbPtr->status(); // the package status
584  yuiMilestone() << "Status of " << slbPtr->name() << ": " << status << endl;
585  zypp::ByteCount size = pkgPtr->installSize(); // installed size
586  pkgLine.push_back( size.asString( 8 ) ); // format size
587 
588  break;
589  }
590  case T_Availables: {
591  std::string isCandidate = " ";
592  if ( pkgPtr == slbPtr->candidateObj() )
593  isCandidate = " x ";
594  pkgLine.push_back( isCandidate );
595 
596  version = pkgPtr->edition().asString();
597  pkgLine.push_back( version );
598 
599  // show the repository (the installation source)
600  pkgLine.push_back( pkgPtr->repository().info().alias() );
601 
602  // set package status either to S_NoInst or S_KeepInstalled
603  status = S_NoInst;
604  if ( ! slbPtr->installedEmpty() )
605  {
606  if ( pkgPtr->edition() == slbPtr->installedObj()->edition() &&
607  pkgPtr->arch() == slbPtr->installedObj()->arch() )
608  {
609  status = S_KeepInstalled;
610  }
611  }
612 
613  zypp::ByteCount size = pkgPtr->installSize(); // installed size
614  pkgLine.push_back( size.asString( 8 ) ); // format size
615  pkgLine.push_back( pkgPtr->arch().asString()); // architecture
616 
617  break;
618  }
619  default: {
620  // version() was edition.version. but what about edition.release?
621 
622  // if the package is installed, get the installed version
623  pkgLine.push_back( pkgPtr->summary() ); // short description
624  if ( ! slbPtr->installedEmpty() )
625  {
626  instVersion = slbPtr->installedObj()->edition().version();
627 
628  // if a candidate is available, get the candidate version
629  if ( slbPtr->hasCandidateObj() )
630  {
631  version = slbPtr->candidateObj()->edition().version();
632  }
633  }
634  else
635  {
636  version = pkgPtr->edition().version();
637  }
638  pkgLine.push_back( version ); // the available version (the candidate)
639 
640  if ( haveInstalledVersion )
641  {
642  pkgLine.push_back( instVersion ); // installed version
643  }
644 
645  status = slbPtr->status(); // the package status
646 
647  zypp::ByteCount size = pkgPtr->installSize(); // installed size
648  pkgLine.push_back( size.asString( 8 ) ); // format size
649 
650 // Selectable does not have source_install
651 #ifdef FIXME
652  if ( slbPtr->source_install() )
653  {
654  pkgLine.push_back( " x " );
655  }
656  else
657 #endif
658  {
659  pkgLine.push_back( " " );
660  }
661  }
662  }
663 
664  addLine( status, // the package status
665  pkgLine, // the package data
666  pkgPtr, // the corresponding package pointer
667  slbPtr
668  );
669 
670  return true;
671 }
672 
673 ///////////////////////////////////////////////////////////////////
674 //
675 // createInfoEntry
676 //
677 //
678 bool NCPkgTable::createInfoEntry ( std::string text )
679 {
680  std::vector<std::string> pkgLine;
681  pkgLine.reserve(2);
682 
683  pkgLine.push_back( text );
684  addLine( S_NoInst, // use status NoInst
685  pkgLine,
686  ZyppObj(),
687  ZyppSel()); // null pointer
688 
689  return true;
690 }
691 
692 ///////////////////////////////////////////////////////////////////
693 //
694 // createPatchEntry
695 //
696 //
697 bool NCPkgTable::createPatchEntry ( ZyppPatch patchPtr, ZyppSel slb )
698 {
699  std::vector<std::string> pkgLine;
700  pkgLine.reserve(5);
701 
702  if ( !patchPtr || !slb )
703  {
704  yuiError() << "No valid patch available" << endl;
705  return false;
706  }
707 
708  pkgLine.push_back( slb->name() ); // show the patch name
709 
710  if ( !patchPtr->summary().empty() )
711  pkgLine.push_back( patchPtr->summary() ); // short description
712  else
713  pkgLine.push_back( slb->name() ); // name
714 
715  pkgLine.push_back( patchPtr->category() ); // patch kind
716  pkgLine.push_back( patchPtr->edition().asString() ); // patch version
717 
718  // zypp::ByteCount size = patchPtr->size();
719  // pkgLine.push_back( size.asString( 8 ) );
720 
721 
722  addLine( slb->status(), // get the status
723  pkgLine,
724  patchPtr,
725  slb ); // the corresponding pointer
726 
727  return true;
728 }
729 
730 ///////////////////////////////////////////////////////////////////
731 //
732 // showInformation
733 //
734 //
736 {
737  ZyppObj objPtr = getDataPointer( getCurrentItem() );
738  ZyppSel slbPtr = getSelPointer( getCurrentItem() );
739 
740  if ( !packager )
741  return false;
742 
743  switch ( tableType )
744  {
745  case T_Packages:
746  case T_Update:
747  // show the required package info
748  if (objPtr && slbPtr)
749  {
750  updateInfo( objPtr, slbPtr, VisibleInfo() );
751  packager->PackageLabel()->setLabel( slbPtr->name() );
752  }
753  break;
754  case T_Patches:
755  // show the patch info
756  if (objPtr && slbPtr )
757  updateInfo( objPtr, slbPtr, VisibleInfo() );
758  break;
759  default:
760  break;
761  }
762 
763  return true;
764 }
765 
766 
767 ///////////////////////////////////////////////////////////////////
768 //
769 //
770 // METHOD NAME : NCPkgTable::wHandleInput
771 // METHOD TYPE : NCursesEvent
772 //
773 // DESCRIPTION :
774 //
775 NCursesEvent NCPkgTable::wHandleInput( wint_t key )
776 {
777  NCursesEvent ret = NCursesEvent::none;
778 
779  // call handleInput of NCPad
780  handleInput( key );
781 
782  if ( packager->isTestMode() )
783  {
784  if ( packager->diskSpacePopup() )
785  packager->diskSpacePopup()->setDiskSpace( key );
786  return ret;
787  }
788 
789  switch ( key )
790  {
791  case KEY_UP:
792  case KEY_DOWN:
793  case KEY_NPAGE:
794  case KEY_PPAGE:
795  case KEY_END:
796  case KEY_HOME: {
797  // show the corresponding information
798  showInformation( );
799  break;
800  }
801  case KEY_SPACE:
802  case KEY_RETURN: {
803  // toggle status
804  toggleObjStatus( );
805  break;
806  }
807  //from the parent class, to enable sorting
808  case CTRL('o'): {
809  NCTable::wHandleInput( key);
810  break;
811  }
812  case '-':
813  case '+':
814  case '>':
815  case '<':
816  case '!':
817  case '*': {
818  // set the new status
819  changeObjStatus( key );
820  }
821  default: {
822  break;
823  }
824  }
825 
826  NCDialog * currentDialog = static_cast<NCDialog *>(YDialog::topmostDialog());
827  if ( currentDialog )
828  currentDialog->setStatusLine();
829 
830  return NCursesEvent::handled;
831 }
832 
833 ///////////////////////////////////////////////////////////////////
834 //
835 // NCPkgTable::getStatus()
836 //
837 // Gets the status of the package of selected line
838 //
839 ZyppStatus NCPkgTable::getStatus( int index )
840 {
841  // get the tag
842  NCPkgTableTag * cc = getTag( index);
843  if ( !cc )
844  return S_NoInst;
845 
846  return cc->getStatus();
847 }
848 
849 ZyppObj NCPkgTable::getDataPointer( int index )
850 {
851  // get the tag
852  NCPkgTableTag *cc = getTag( index );
853  if ( !cc )
854  return ZyppObj( );
855 
856  return cc->getDataPointer();
857 }
858 
859 ZyppSel NCPkgTable::getSelPointer( int index )
860 {
861  // get the tag
862  NCPkgTableTag *cc = getTag( index );
863  if ( !cc )
864  return ZyppSel( );
865 
866  return cc->getSelPointer();
867 }
868 
869 NCPkgTableTag * NCPkgTable::getTag( const int & index )
870 {
871  // get the table line
872  NCTableLine * cl = myPad()->ModifyLine( index );
873  if ( !cl )
874  return 0;
875 
876  // get first column (the column containing the status info)
877  YTableItem *it = dynamic_cast<YTableItem*> (cl->origItem() );
878  YTableCell *tcell = it->cell(0);
879  NCPkgTableTag * cc = static_cast<NCPkgTableTag *>( tcell );
880 
881  return cc;
882 }
883 
884 #ifdef FIXME
885 ///////////////////////////////////////////////////////////////////
886 //
887 // NCPkgTable::SourceInstall()
888 //
889 //
890 bool NCPkgTable::SourceInstall( bool install )
891 {
892  int index = getCurrentItem();
893  ZyppObj objPtr = getDataPointer( index );
894  bool ok;
895 
896  if ( !objPtr )
897  {
898  yuiError() << "Invalid Pointer" << endl;
899  return false;
900  }
901  ZyppSel selPtr = objPtr->getSelectable();
902  NCTableLine * currentLine = myPad()->ModifyLine( index );
903 
904  if ( !selPtr || !currentLine )
905  {
906  yuiError() << "Invalid Selectable" << endl;
907  return false;
908  }
909 
910  NCTableCol * currentCol = currentLine->GetCol( currentLine->Cols()-1 );
911 
912  if ( install && selPtr->providesSources() )
913  {
914  ok = selPtr->set_source_install( true );
915  yuiMilestone() << "Set source install returns: " << (ok?"true":"false") << endl;
916  if ( currentCol )
917  currentCol->SetLabel( NClabel( " x " ) );
918  }
919  else if ( !install && selPtr->source_install() )
920  {
921  ok = selPtr->set_source_install( false );
922  yuiMilestone() << "ReSet source install returns: " << (ok?"true":"false") << endl;
923  if ( currentCol )
924  currentCol->SetLabel( NClabel( " " ) );
925  }
926 
927  return true;
928 }
929 #endif
930 
931 ///////////////////////////////////////////////////////////////////
932 //
933 // NCPkgTable::toggleObjStatus()
934 //
935 //
936 bool NCPkgTable::toggleObjStatus( )
937 {
938  ZyppSel slbPtr = getSelPointer( getCurrentItem() );
939  ZyppObj objPtr = getDataPointer( getCurrentItem() );
940 
941  if ( !slbPtr )
942  return false;
943 
944  ZyppStatus newStatus;
945 
946  bool ok = statusStrategy->toggleStatus( slbPtr, objPtr, newStatus );
947 
948  if ( ok )
949  {
950  changeStatus( newStatus, slbPtr, objPtr, true );
951  }
952 
953  return true;
954 }
955 
956 ///////////////////////////////////////////////////////////////////
957 //
958 // NCPkgTable::changeObjStatus()
959 //
960 //
961 bool NCPkgTable::changeObjStatus( int key )
962 {
963  ZyppSel slbPtr = getSelPointer( getCurrentItem() );
964  ZyppObj objPtr = getDataPointer( getCurrentItem() );
965 
966  if ( !slbPtr )
967  {
968  return false;
969  }
970  ZyppStatus newStatus;
971 
972  bool ok = statusStrategy->keyToStatus( key, slbPtr, objPtr, newStatus );
973 
974  if ( ok )
975  {
976  changeStatus( newStatus, slbPtr, objPtr, true );
977  }
978  return true;
979 }
980 
981 ///////////////////////////////////////////////////////////////////
982 //
983 // NCPkgTable::changeListObjStatus()
984 //
985 //
986 bool NCPkgTable::changeListObjStatus( NCPkgTableListAction type )
987 {
988  ZyppStatus newStatus;
989  unsigned int size = getNumLines();
990  unsigned int index = 0;
991 
992  while ( index < size )
993  {
994  // get the object pointer
995  ZyppSel slbPtr = getSelPointer( index );
996  ZyppObj objPtr = getDataPointer( index );
997  bool ok = false;
998 
999  if ( slbPtr )
1000  {
1001  switch ( type ) {
1002  case A_Install: {
1003  if ( slbPtr->status() == S_NoInst )
1004  ok = statusStrategy->keyToStatus( '+', slbPtr, objPtr, newStatus );
1005  break;
1006  }
1007  case A_Delete: {
1008  if ( slbPtr->installedObj() && slbPtr->status() != S_Protected )
1009  ok = statusStrategy->keyToStatus( '-', slbPtr, objPtr, newStatus );
1010  break;
1011  }
1012  case A_UpdateNewer: {
1013  // set status to update respecting "vendor change" settings
1014  if ( slbPtr->installedObj() && slbPtr->status() != S_Protected && slbPtr->updateCandidateObj() )
1015  {
1016  slbPtr->setOnSystem( slbPtr->updateCandidateObj() );
1017  ok = statusStrategy->keyToStatus( '>', slbPtr, objPtr, newStatus );
1018  }
1019  break;
1020  }
1021  case A_Update: {
1022  if ( slbPtr->installedObj() && slbPtr->status() != S_Protected )
1023  ok = statusStrategy->keyToStatus( '>', slbPtr, objPtr, newStatus );
1024  break;
1025  }
1026  case A_Keep: {
1027  if ( slbPtr->status() == S_Install
1028  || slbPtr->status() == S_AutoInstall
1029  || slbPtr->status() == S_Update
1030  || slbPtr->status() == S_AutoUpdate )
1031  ok = statusStrategy->keyToStatus( '<', slbPtr, objPtr, newStatus );
1032  else if ( slbPtr->status() == S_Del
1033  || slbPtr->status() == S_AutoDel )
1034  ok = statusStrategy->keyToStatus( '+', slbPtr, objPtr, newStatus );
1035  break;
1036  }
1037  default:
1038  yuiError() << "Unknown list action" << endl;
1039  }
1040 
1041  if ( ok )
1042  {
1043  changeStatus( newStatus,
1044  slbPtr,
1045  objPtr,
1046  false ); // do not do the updates with every change
1047  }
1048  }
1049 
1050  index++;
1051  }
1052 
1053  // do the updates now
1054  packager->showPackageDependencies( false );
1055  packager->showDiskSpace();
1056 
1057  updateTable();
1058 
1059  return true;
1060 }
1061 
1062 bool NCPkgTable::fillAvailableList ( ZyppSel slb )
1063 {
1064  bool addInstalled = true;
1065  if ( !slb )
1066  {
1067  yuiError() << "Package pointer not valid" << endl;
1068  return false;
1069  }
1070 
1071  // clear the package table
1072  itemsCleared ();
1073 
1074  yuiDebug() << "Number of available packages: " << slb->availableSize() << endl;
1075 
1076  // show all availables
1077  zypp::ui::Selectable::available_iterator
1078  b = slb->availableBegin (),
1079  e = slb->availableEnd (),
1080  it;
1081  for (it = b; it != e; ++it)
1082  {
1083 
1084  if ( slb->installedObj() &&
1085  slb->installedObj()->edition() == (*it)->edition() &&
1086  slb->installedObj()->arch() == (*it)->arch() )
1087  // FIXME: In future releases, also the vendor will make a difference
1088  {
1089  addInstalled = false;
1090  }
1091  createListEntry( tryCastToZyppPkg (*it), slb );
1092  }
1093  if ( (! slb->installedEmpty()) && addInstalled )
1094  {
1095  createListEntry( tryCastToZyppPkg (slb->installedObj()), slb );
1096  }
1097 
1098  // show the package list
1099  drawList();
1100 
1101  if ( getNumLines() > 0 )
1102  {
1103  setCurrentItem( 0 );
1104  }
1105  return true;
1106 
1107 }
1108 
1109 bool NCPkgTable::fillSummaryList( NCPkgTable::NCPkgTableListType type )
1110 {
1111  // clear the package table
1112  itemsCleared ();
1113 
1114  // get the package list and sort it
1115  std::list<ZyppSel> pkgList( zyppPkgBegin (), zyppPkgEnd () );
1116  pkgList.sort( sortByName );
1117 
1118  // fill the package table
1119  std::list<ZyppSel>::iterator listIt;
1120  ZyppPkg pkgPtr;
1121 
1122  // If the dependency check is off, the dependencies will not be solved for
1123  // the installation summary.
1124  // This is not necessary because the dependencies will be solved and the
1125  // "Automatic Changes" list will be shown if the OK button is pressed.
1126  //if ( !autoCheck )
1127  //{
1128  // showPackageDependencies( true );
1129  //}
1130 
1131  for ( listIt = pkgList.begin(); listIt != pkgList.end(); ++listIt )
1132  {
1133  ZyppSel selectable = *listIt;
1134  ZyppPkg pkg = tryCastToZyppPkg (selectable->theObj ());
1135  // show all matching packages
1136  switch ( type )
1137  {
1138  case NCPkgTable::L_Changes: {
1139  if ( selectable->status() != S_NoInst
1140  && selectable->status() != S_KeepInstalled )
1141  {
1142  createListEntry( pkg, selectable );
1143  }
1144  break;
1145  }
1146  case NCPkgTable::L_Installed: {
1147  if ( selectable->status() == S_KeepInstalled )
1148  {
1149  createListEntry( pkg, selectable );
1150  }
1151  break;
1152  }
1153  default:
1154  break;
1155  }
1156  }
1157 
1158  // show the package list
1159  drawList();
1160 
1161  return true;
1162 }
1163 
1164 void NCPkgTable::updateInfo( ZyppObj pkgPtr, ZyppSel slbPtr, NCPkgTableInfoType mode )
1165 {
1166  switch (mode)
1167  {
1168  case I_Descr:
1169  if ( packager->InfoText() )
1170  packager->InfoText()->longDescription( pkgPtr );
1171  break;
1172  case I_Technical:
1173  if ( packager->InfoText() )
1174  packager->InfoText()->technicalData( pkgPtr, slbPtr );
1175  break;
1176  case I_Files:
1177  if ( packager->InfoText() )
1178  packager->InfoText()->fileList( slbPtr );
1179  break;
1180  case I_Deps:
1181  if ( packager->InfoText() )
1182  packager->InfoText()->dependencyList( pkgPtr, slbPtr );
1183  break;
1184  case I_Versions:
1185  if ( packager->VersionsList() )
1186  packager->VersionsList()->fillAvailableList( slbPtr );
1187  break;
1188  case I_PatchDescr:
1189  if ( packager->InfoText() )
1190  packager->InfoText()->patchDescription( pkgPtr, slbPtr );
1191  break;
1192  case I_PatchPkgs:
1193  if ( packager->PatchPkgs() )
1194  packager->fillPatchPackages( packager->PatchPkgs(), pkgPtr );
1195  break;
1196  case I_PatchPkgsVersions:
1197  if ( packager->PatchPkgsVersions() )
1198  packager->fillPatchPackages( packager->PatchPkgsVersions(), pkgPtr, true );
1199  break;
1200  // Intentionally omitting 'default' branch so the compiler can
1201  // catch unhandled enum states
1202  }
1203 }