libyui-ncurses-pkg  2.50.8
NCPkgMenuDeps.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: NCPkgMenuDeps.cc
37 
38  Author: Hedgehog Painter <kmachalkova@suse.cz>
39 
40 /-*/
41 #define YUILogComponent "ncurses-pkg"
42 #include <YUILog.h>
43 
44 #include "NCPkgMenuDeps.h"
45 #include "NCPackageSelector.h"
46 
47 #define CHECK_BOX "[ ] "
48 #define NO_CHECK_BOX " "
49 
50 using std::endl;
51 
52 /*
53  Textdomain "ncurses-pkg"
54 */
55 
56 NCPkgMenuDeps::NCPkgMenuDeps (YWidget *parent, std::string label, NCPackageSelector *pkger )
57  : NCMenuButton( parent, label)
58  , pkg (pkger)
59 {
60  createLayout();
61 }
62 
63 NCPkgMenuDeps::~NCPkgMenuDeps()
64 {
65 
66 }
67 
68 void NCPkgMenuDeps::setSelected( YMenuItem *item, bool selected)
69 {
70  std::string oldLabel = item->label();
71  char sel = 'x';
72 
73  if ( item == cleanDepsOnRemove || item == allowVendorChange )
74  sel = '+';
75 
76  std::string newLabel = oldLabel.replace(1, 1, 1, selected ? sel : ' ');
77 
78  item->setLabel( newLabel);
79 }
80 
81 void NCPkgMenuDeps::createLayout()
82 {
83 
84  autoCheckDeps = new YMenuItem( CHECK_BOX + _( "&Automatic Dependency Check" ) );
85  items.push_back( autoCheckDeps );
86  setSelected( autoCheckDeps, pkg->AutoCheck() );
87 
88  checkNow = new YMenuItem( NO_CHECK_BOX + _( "&Check Dependencies Now" ) );
89  items.push_back( checkNow );
90 
91  verifySystemOpt = new YMenuItem( CHECK_BOX + _( "&System Verification Mode" ) );
92  items.push_back( verifySystemOpt );
93  setSelected( verifySystemOpt, pkg->VerifySystem() );
94 
95  verifySystem = new YMenuItem( NO_CHECK_BOX + _( "&Verify System Now" ) );
96  items.push_back( verifySystem );
97 
98  installRecommendedOpt = new YMenuItem( CHECK_BOX + _( "Install &Recommended Packages" ) );
99  items.push_back( installRecommendedOpt );
100  setSelected( installRecommendedOpt, pkg->InstallRecommended() );
101 
102  installRecommendedNow = new YMenuItem( NO_CHECK_BOX + _( "&Install Recommended Packages for Already Installed Packages Now" ) );
103  items.push_back( installRecommendedNow );
104 
105  cleanDepsOnRemove = new YMenuItem( CHECK_BOX + _( "Cleanup when &Deleting Packages (Temporary Change)" ));
106  items.push_back ( cleanDepsOnRemove );
107  setSelected( cleanDepsOnRemove, pkg->isCleanDepsOnRemove() );
108 
109  allowVendorChange = new YMenuItem( CHECK_BOX + _( "Allow &Vendor Change (Temporary Change)" ) );
110  items.push_back ( allowVendorChange );
111  setSelected( allowVendorChange, pkg->isAllowVendorChange() );
112 
113  testCase = new YMenuItem( NO_CHECK_BOX + _( "&Generate Dependency Solver Testcase" ) );
114  items.push_back( testCase );
115 
116  addItems( items );
117 }
118 
119 bool NCPkgMenuDeps::handleEvent( const NCursesEvent & event)
120 {
121  if (!event.selection)
122  return false;
123 
124  if (event.selection == checkNow )
125  return checkDependencies();
126  else if (event.selection == autoCheckDeps)
127  return setAutoCheck();
128  else if (event.selection == verifySystem)
129  return verify();
130  else if (event.selection == verifySystemOpt )
131  return setVerifySystem();
132  else if (event.selection == cleanDepsOnRemove )
133  return setCleanDepsOnRemove();
134  else if (event.selection == installRecommendedOpt )
135  return setInstallRecommended();
136  else if (event.selection == installRecommendedNow )
137  return doInstallRecommended();
138  else if (event.selection == allowVendorChange )
139  return setAllowVendorChange();
140  else if (event.selection == testCase)
141  return generateTestcase();
142  return true;
143 }
144 
145 static
146 void popupInfo(const wsze size, const std::string & text)
147 {
148  wpos pos((NCurses::lines() - size.H) / 2, (NCurses::cols() - size.W) / 2);
149  NCPopupInfo * info = new NCPopupInfo( pos,
150  "", text,
152  info->setPreferredSize(size.W, size.H);
153  info->showInfoPopup();
154  YDialog::deleteTopmostDialog();
155 }
156 
157 bool NCPkgMenuDeps::checkDependencies()
158 {
159  bool ok = false;
160 
161  if ( pkg->DepsPopup() )
162  {
163  yuiMilestone() << "Checking dependencies" << endl;
164  pkg->checkNow ( &ok );
165  }
166 
167  if ( ok )
168  {
169  popupInfo(wsze(5, 35), _( "All package dependencies are OK." ));
170  }
171 
172  // update the package list and the disk space info
173  pkg->updatePackageList();
174  pkg->showDiskSpace();
175 
176  return true;
177 }
178 
179 bool NCPkgMenuDeps::doInstallRecommended()
180 {
181  bool ok = false;
182 
183  yuiMilestone() << "Adding recommended packages" << endl;
184 
185  pkg->saveState();
186  pkg->doInstallRecommended ( &ok );
187 
188  // display the popup with automatic changes
189  NCPkgPopupTable * autoChangePopup =
190  new NCPkgPopupTable( wpos( 3, 8 ), pkg,
191  // headline of a popup with packages
192  _("Automatic Changes"),
193  // part 1 of a text explaining the list of packages which follow
194  _("Being recommended by already installed packages, the following"),
195  // part 2 of the text
196  _("packages have been automatically selected for installation:")
197  );
198 
199  NCursesEvent input = autoChangePopup->showInfoPopup();
200  if ( input == NCursesEvent::cancel )
201  {
202  // user clicked on Cancel
203  pkg->restoreState();
204  }
205  YDialog::deleteTopmostDialog(); // delete NCPopupInfo dialog
206 
207  // update the package list and the disk space info
208  pkg->updatePackageList();
209  pkg->showDiskSpace();
210 
211  return true;
212 }
213 
214 
215 bool NCPkgMenuDeps::generateTestcase()
216 {
217  std::string testCaseDir = "/var/log/YaST2/solverTestcase";
218 
219  yuiMilestone() << "Generating solver test case START" << endl;
220  bool success = zypp::getZYpp()->resolver()->createSolverTestcase( testCaseDir );
221  yuiMilestone() << "Generating solver test case END" << endl;
222 
223  if ( success )
224  {
225  popupInfo(wsze(8, 40),
226  _( "Dependency resolver test case written to " ) + "<br>"
227  + testCaseDir
228  );
229  }
230  return success;
231 
232 }
233 
234 bool NCPkgMenuDeps::setAutoCheck()
235 {
236  pkg->setAutoCheck( !pkg->AutoCheck() );
237  setSelected( autoCheckDeps, pkg->AutoCheck() );
238 
239  return true;
240 }
241 
242 bool NCPkgMenuDeps::setVerifySystem()
243 {
244  pkg->setVerifySystem( !pkg->VerifySystem() );
245  setSelected( verifySystemOpt, pkg->VerifySystem() );
246 
247  return true;
248 }
249 
250 bool NCPkgMenuDeps::setCleanDepsOnRemove()
251 {
252  pkg->setCleanDepsOnRemove( !pkg->isCleanDepsOnRemove() );
253  setSelected( cleanDepsOnRemove, pkg->isCleanDepsOnRemove() );
254 
255  return true;
256 }
257 
258 bool NCPkgMenuDeps::setInstallRecommended()
259 {
260  pkg->setInstallRecommended( !pkg->InstallRecommended() );
261  setSelected( installRecommendedOpt, pkg->InstallRecommended() );
262 
263  return true;
264 }
265 
266 
267 bool NCPkgMenuDeps::setAllowVendorChange()
268 {
269  pkg->setAllowVendorChange( !pkg->isAllowVendorChange() );
270  setSelected( allowVendorChange, pkg->isAllowVendorChange() );
271 
272  return true;
273 }
274 
275 bool NCPkgMenuDeps::verify()
276 {
277  bool ok = false;
278 
279  yuiMilestone() << "Verifying system" << endl;
280 
281  pkg->saveState();
282  // call the solver (with S_Verify it displays no popup)
283  pkg->systemVerification( &ok );
284 
285  // display the popup with automatic changes
286  NCPkgPopupTable * autoChangePopup =
287  new NCPkgPopupTable( wpos( 3, 8 ), pkg,
288  // headline of a popup with packages
289  _("Automatic Changes"),
290  // part 1 of a text explaining the list of packages which follow
291  _("To fulfill the dependencies of already installed packages following"),
292  // part 2 of the text
293  _("packages have been automatically selected for installation:")
294  );
295  NCursesEvent input = autoChangePopup->showInfoPopup();
296 
297  if ( input == NCursesEvent::cancel )
298  {
299  // user clicked on Cancel
300  pkg->restoreState();
301  }
302  if ( ok && input == NCursesEvent::button )
303  {
304  // dependencies OK, no automatic changes/the user has accepted the changes
305  popupInfo(wsze(5, 35), _( "System dependencies verify OK." ));
306  }
307 
308  YDialog::deleteTopmostDialog(); // delete NCPopupInfo dialog
309 
310  pkg->updatePackageList();
311  pkg->showDiskSpace();
312  // the verify call sets the option verify to true
313  setSelected( verifySystemOpt, true );
314  return true;
315 }
void showDiskSpace()
Calls the package mananager (updateDu()) and shows the required disk space.
void updatePackageList()
Updates the status in list of packages.
void saveState()
Check for changes.
static const std::string OKLabel()
The label of the OK button.