home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / modules / OSRRepairUI.ycp < prev    next >
Text File  |  2006-11-29  |  22KB  |  901 lines

  1. /**
  2.  * File:    OSRRepairUI.ycp
  3.  * Module:    repair
  4.  * Summary:     UI functions
  5.  * Authors:    Johannes Buchhold <jbuch@suse.de>
  6.  *
  7.  * $Id: OSRRepairUI.ycp 33121 2006-09-26 12:43:41Z jsuchome $
  8.  */
  9. {
  10.   module "OSRRepairUI";
  11.  
  12.   import "Arch";
  13.   import "Hotplug";
  14.   import "Label";
  15.   import "Linuxrc";
  16.   import "Mode";
  17.   import "ModuleLoading";
  18.   import "PackageCallbacksInit";
  19.   import "Popup";
  20.   import "Progress";
  21.   import "Report";
  22.   import "Sequencer";
  23.   import "Stage";
  24.   import "StorageDevices";
  25.   import "StorageControllers";
  26.   import "Wizard";
  27.  
  28.   import "OSR";
  29.   import "OSRCommon";
  30.   import "OSRPopup";
  31.   import "OSRMode";
  32.   import "OSRSummary";
  33.   import "OSRDirect";
  34.   import "OSRExecute";
  35.   import "OSRProgress";
  36.   import "OSRStatus";
  37.  
  38.  
  39.   textdomain "repair";
  40.  
  41.   /**
  42.    * detected is true if the scan and requires sequencer is finished and
  43.    * the user is in the last dialog ( EndDialog). Allows to go back to the
  44.    * scan protocol.
  45.    */
  46.   boolean detected        = false;
  47.  
  48.   string exit_label        = Label::FinishButton();
  49.  
  50.   /**
  51.    * Captions ...
  52.    */
  53.   string init_dialog_caption        =  "";
  54.   string start_dialog_caption        =  "";
  55.   string customize_dialog_caption    =  "";
  56.   string scan_dialog_caption        =  "";
  57.   string tool_dialog_caption        =  "";
  58.  
  59.   boolean initialized            = false;
  60.  
  61.   /**
  62.    * Constructor
  63.    */
  64.   global define void OSRRepairUI()``{
  65.  
  66.       // dialog caption, appended to tool name
  67.       init_dialog_caption    = OSRCommon::tool_name +" "+_("Initialization");
  68.       // dialog caption
  69.       start_dialog_caption    = _("Repair Method");
  70.       // dialog caption
  71.       customize_dialog_caption    = _("Custom Repair");
  72.       // dialog caption
  73.       tool_dialog_caption    = _("Repair Tool Box");
  74.       // dialog caption
  75.       scan_dialog_caption    = _("System Check");
  76.   }
  77.  
  78.   /**
  79.    * Reset api modules for the next scan and repair sequence.
  80.    */
  81.   global define void Reset()``{
  82.       OSRSummary::Reset();
  83.       OSRProgress::Reset();
  84.       OSRExecute::Reset();
  85.       OSRStatus::Reset();
  86.       OSR::ResetDetect();
  87.       OSRDirect::Reset();
  88.   }
  89.  
  90.   /**
  91.    * Init Dialog
  92.    */
  93.   global define symbol InitDialog() ``{
  94.  
  95.     if ( initialized )
  96.     return `next;
  97.  
  98.     if ( Stage::initial () )
  99.     {
  100.     Wizard::RestoreAbortButton();
  101.     }
  102.  
  103.     // Set help text
  104.     if (!OSRMode::script) Wizard::RestoreHelp ( "" );
  105.  
  106.     // A callback function for abort
  107.     block<boolean> abort = ``{
  108.     return UI::PollInput () == `abort;
  109.     };
  110.  
  111.     integer no_of_steps = 6;
  112.  
  113.     // We do not set help text here, because it was set outside
  114.     if(!OSRMode::script)
  115.     Progress::New ( init_dialog_caption, " ", no_of_steps,
  116.             // progress stage
  117.                [ _("Load rescue modules"),
  118.             // progress stage
  119.              _("Probe floppy disk devices"),
  120.             // progress stage
  121.              _("Probe hard disk controllers"),
  122.             // progress stage
  123.              _("Load kernel modules for hard disk controllers"),
  124.             // progress stage
  125.              _("Probe hard disks"),
  126.              // progress stage
  127.              _("Probe USB")
  128.              ],
  129.             // progress step
  130.                [ _("Loading rescue modules..."),
  131.             // progress step
  132.              _("Probing floppy disk devices..."),
  133.             // progress step
  134.              _("Probing hard disk controllers..."),
  135.             // progress step
  136.             _("Loading kernel modules for hard disk controllers..."),
  137.             // progress step
  138.              _("Probing hard disks..."),
  139.             // progress step
  140.              _("Probing USB..."),
  141.              // progress step
  142.              _("Finished") ],
  143.                 ""
  144.     );
  145.  
  146.     if (OSR::Init())
  147.     {
  148.     if (!OSRMode::script)
  149.     {
  150.         Progress::NextStage ();
  151.         if ( eval (abort) ) return `abort;
  152.     }
  153.     }
  154.     else
  155.     {
  156.     return `error;
  157.     }
  158.  
  159.     // increase the progress to "finish"
  160.     if( ! OSRMode::script ) Progress::NextStage ();
  161.  
  162.     // Start the client "inst_startup.ycp" if the rescue-system is launched
  163.     // from a running Linux-system, else the module inst_startup.ycp
  164.     // was already launched.
  165.     if (! Mode::test ())
  166.     {
  167.     if (!(Arch::s390 () || Arch::board_iseries ()))
  168.     {
  169.         // give user feedback what's happening
  170.         StorageDevices::FloppyReady ();
  171.         if (! OSRMode::script )
  172.         {
  173.         Progress::NextStage();
  174.         if ( eval (abort) ) return `abort;
  175.         }
  176.     }
  177.     // --------------------------------------------------------------
  178.     //                 Hard disk controllers
  179.     // 1. Probe
  180.     // 2. Initialize (module loading)
  181.     // --------------------------------------------------------------
  182.     if (StorageControllers::Probe() <= 0)
  183.     {
  184.         // error popup
  185.         Popup::Error(_("No hard disks were found.
  186. Check your hardware.
  187. "));
  188.  
  189. //        return `abort;
  190.     }
  191.     else
  192.     {
  193.         if (! OSRMode::script )
  194.         {
  195.             Progress::NextStage();
  196.             if ( eval (abort) ) return `abort;
  197.         }
  198.     }
  199.  
  200.     StorageControllers::Initialize();
  201.     ModuleLoading::Load ("dm-mod", "", "Linux", "DM", Linuxrc::manual (), true);
  202.  
  203.     if (!OSRMode::script)
  204.     {
  205.         Progress::NextStage();
  206.         if ( eval (abort) ) return `abort;
  207.     }
  208.  
  209.     // --------------------------------------------------------------
  210.     //                  Hard disks
  211.     // --------------------------------------------------------------
  212.  
  213.     map targetMap = StorageDevices::Probe (true);
  214.     if (size (targetMap) == 0)
  215.     {
  216.         // error popue
  217.         Popup::Error(_("No hard disks were found.
  218. Check your hardware.
  219. "));
  220.         return `abort;
  221.     }
  222.     else
  223.     {
  224.         if (! OSRMode::script )
  225.         {
  226.             Progress::NextStage();
  227.             if ( eval (abort) ) return `abort;
  228.         }
  229.     }
  230.  
  231.     if (!(Arch::s390 () || Arch::board_iseries ()))
  232.     {
  233.         Hotplug::StartUSB ();
  234.         if (! OSRMode::script )
  235.         {
  236.             Progress::NextStage();
  237.             if ( eval (abort) ) return `abort;
  238.         }
  239.     }
  240.     }
  241.  
  242.     //Probe cdroms and floppy
  243.     if (!Mode::test () )
  244.     {
  245.     StorageDevices::FullProbe();
  246.     }
  247.  
  248.     if (!OSRMode::script)
  249.     {
  250.     Wizard::EnableNextButton();
  251.     Wizard::EnableAbortButton();
  252.     Wizard::EnableBackButton();
  253.     Wizard::SetFocusToNextButton();
  254.     }
  255.  
  256.     PackageCallbacksInit::InitPackageCallbacks();
  257.  
  258.     initialized = true;
  259.     return `next;
  260.   }
  261.  
  262.  
  263.   /**
  264.    * Build (return) a description text for a label in the help_text field.
  265.    * @param label the label
  266.    * @param description the description text for the label.
  267.    * @return the formatted label help text
  268.    */
  269.   define string build_label_description(string label, string description )``{
  270.       return OSRPopup::build_label_description (label, description);
  271.   }
  272.  
  273.   /**
  274.    * Build a selection box with all scan and repair groups.
  275.    * @param mode if all entries should be checked ('Select all')
  276.    */
  277.   define term build_multi_selection_box (boolean mode )``{
  278.  
  279.     return `MultiSelectionBox(`id(`options),
  280.     // MultiSelectionBox label
  281.     _("Scan and Repair &Options"), OSR::GroupItems(mode));
  282.   }
  283.  
  284.   /**
  285.    * Set the wizard button.
  286.    */
  287.   define void set_buttons_enable (boolean pause, boolean back, boolean next) ``{
  288.  
  289.       UI::ChangeWidget(`id(`pause),`Enabled, pause);
  290.  
  291.       if ( back )    Wizard::EnableBackButton();
  292.       else        Wizard::DisableBackButton();
  293.  
  294.       if ( next )    Wizard::EnableNextButton();
  295.       else        Wizard::DisableNextButton();
  296.   }
  297.  
  298.  /**
  299.   * The start dialog let the user select how the system should be analysed.
  300.   * @return symbol for sequencer
  301.   */
  302.   define symbol StartDialog() ``{
  303.  
  304.     detected = false;
  305.  
  306.     // summary help text 1/3
  307.     string help_text    = _("<p>The system repair
  308. can repair some parts of a damaged system. Therefore, the
  309. tool scans the system and reports the errors found.</p>
  310. ") +
  311.  
  312.     // summary help text 2/3
  313. _("<p>After an error was found, select from the suggested
  314. repair method or cancel the repair
  315. process.</p>
  316. ") +
  317.  
  318.     // summary help text 3/3
  319.     _("<p>Nothing will be repaired automatically.
  320. Changes are only made if you accept
  321. the repair propsal.</P>
  322. ");
  323.  
  324.     list<map> start_dialog_entries = [
  325.     $[
  326.         // First entry - automatic analysis (headline)
  327.         "headline"        : _("&Automatic Repair"),
  328.         "symbol"        : `scan_repair,
  329.         // First entry - automatic analysis (description)
  330.         "description"    : _("Automatic analysis with repair
  331. proposals. Fits in most cases.
  332. "),
  333.         // First entry - automatic analysis (additional help text)
  334.         "help_text"        : _("Analyze the entire system automatically and
  335. display repair proposals.")
  336.     ],
  337.     $[
  338.         // Second entry - customise analyse (headline)
  339.         "headline"        : _("&Customized Repair"),
  340.         "symbol"        : `scan_repair_options,
  341.         // Second entry - customise analyse (description)
  342.         "description"    : _("Select the desired system analysis 
  343. procedures. Usable if you already
  344. know a little bit about your problem.
  345. "),
  346.         // Second entry - customise analyse (additional help text)
  347.         "help_text"        : _("For example, deselect a category group, like
  348. the boot loader test, then start analysis."),
  349.  
  350.     ],
  351.     $[
  352.         // Third entry - direct repair tools (headline)
  353.         "headline"        :  _("E&xpert Tools"),
  354.         "symbol"        : `direct_repair,
  355.         // Third entry - direct repair tools (description)
  356.         "description"    : _("Use if the automatic detection
  357. fails or you know the exact type of
  358. problem.
  359. "),
  360.         // Third entry - direct repair tools (additional help text)
  361.         "help_text"        : _("For example, directly recover a lost
  362. partition table or verify the package database.")
  363.     ]
  364.     ];
  365.     // FIXME "help_text" entries are not used...
  366.  
  367.     term left_box  = `VBox(`VSpacing(2));
  368.     term right_box = `VBox(`VSpacing(2));
  369.     foreach (map option, start_dialog_entries, ``{
  370.     left_box  = add (left_box,
  371.         `VWeight(10, `Left(`Label(option["description"]:""))));
  372.         right_box = add (right_box,
  373.         `VWeight(10, `Left(`PushButton(`id(option["symbol"]:`nothing), `opt(`hstretch) , option["headline"]:"" ))));
  374.     });
  375.  
  376.     left_box  = add( left_box,  `VSpacing(2));
  377.     right_box = add( right_box, `VSpacing(2));
  378.  
  379.     term contents = `HBox (
  380.       `HWeight (60, `HBox(`HSpacing(4), left_box)),
  381.       `HWeight (40, `HBox(`Left(right_box), `HSpacing(4)))
  382.     );
  383.  
  384.     Wizard::SetContentsButtons (start_dialog_caption,contents,help_text,
  385.     Label::BackButton(), exit_label );
  386.  
  387.     UI::SetFocus(`id(`scan_repair));
  388.  
  389.     if (!Stage::initial ())
  390.     {
  391.         Wizard::DisableBackButton();
  392.     }
  393.     else
  394.     {
  395.     Wizard::RestoreAbortButton();
  396.     }
  397.  
  398.     symbol ret = (symbol) UI::UserInput();
  399.  
  400.     // set the default scan sequence selection
  401.     if( ( ret == `scan_repair ) ||
  402.         ( ret == `scan_repair_options && OSR::SizeDetectGroupList() == 0 ||
  403.           OSR::DetectGroupList() == nil ))
  404.     {
  405.         OSR::SelectDefaultDetectGroups();
  406.     }
  407.  
  408.     if ( ret == `back && Stage::initial () )
  409.     {
  410.         Wizard::RestoreNextButton();
  411.     }
  412.     return ret;
  413.   }
  414.  
  415.   /**
  416.    * Dialog which let the user select or deselect
  417.    * some scan and repair groups.
  418.    */
  419.   define symbol ScanOptionsDialog()``{
  420.  
  421.     detected = false;
  422.  
  423.     // button label
  424.     string select_all_label    = _("&Select All");
  425.     // button label
  426.     string unselect_all_label    = _("&Deselect All");
  427.  
  428.     // help text for "custom scan" dialog 1/3
  429.     string help_text    = _("<P>The system repair scans a
  430. lot of system parts automatically. Usually, only one
  431. or two scopes, like the boot loader or the file system,
  432. are damaged.</P>
  433. ") +
  434.  
  435.     // help text for "custom scan" dialog 2/3
  436.     _("<P>Therefore, this dialog enables the selection
  437. of system parts that should be scanned.</P>
  438. ") +
  439.  
  440.     // help text for "custom scan" dialog 2/3
  441.     _("Some of the groups shown at the right side of
  442. the dialog need other groups. These dependencies
  443. are resolved automatically.
  444. ") +
  445.     build_label_description (select_all_label,
  446.     // help text for '&Select All' button
  447.     _("Select all entries in the list.")) +
  448.     build_label_description (unselect_all_label,
  449.     // help text for '&Deselect All' button
  450.     _("Deselect all entries in the list."));
  451.  
  452.     term contents  = `HBox (
  453.     `HSpacing(2),
  454.     `VBox (
  455.         `VSpacing(1),
  456.         `ReplacePoint (`id(`rp), build_multi_selection_box(true)),
  457.         `VSpacing(0.5),
  458.         `HBox (
  459.         `Left (`HBox (
  460.             `PushButton (`id(`all_options), select_all_label),
  461.             `PushButton (`id(`no_optins), unselect_all_label)
  462.         )),
  463.         `Right (`PushButton (`id(`help), Label::HelpButton()))
  464.         ),
  465.         `VSpacing(1)
  466.     ),
  467.     `HSpacing(2)
  468.     );
  469.  
  470.     Wizard::SetContentsButtons (customize_dialog_caption,contents,help_text,
  471.     Label::BackButton(), Label::NextButton());
  472.  
  473.     // Select first Item
  474.     UI::SetFocus(`id(`options));
  475.  
  476.     symbol ret = `next;
  477.  
  478.     repeat
  479.     {
  480.     ret = (symbol) UI::UserInput();
  481.  
  482.     OSR::SetDetectGroupList (
  483.         (list<string>) UI::QueryWidget(`id(`options), `SelectedItems));
  484.  
  485.     // user pressed the "select all" or the unselect all button
  486.     if (ret == `all_options || ret == `no_optins)
  487.     {
  488.         OSR::ResetDetectGroupList();
  489.         boolean mode = ( ret == `all_options );
  490.         UI::ReplaceWidget(`id(`rp), build_multi_selection_box (mode));
  491.         UI::SetFocus(`id(`options));
  492.     }
  493.     // user press the help button
  494.     else if (ret == `help)
  495.     {
  496.         string selected = (string)
  497.         UI::QueryWidget(`id(`options), `CurrentItem );
  498.         map item_info   = OSRCommon::GetGroupMap (selected);
  499.  
  500.         Popup::LongText (item_info["text"]:"",
  501.         `RichText(item_info["help"]:""), 60, 15);
  502.         UI::SetFocus(`id(`options));
  503.     }
  504.     else if (ret == `next || ret == `abort || ret == `cancel)
  505.     {
  506.         // not item seleted
  507.         if (ret == `next && OSR::SizeDetectGroupList() == 0)
  508.         {
  509.         // error label (user should select the action to do)
  510.         Popup::Message (_("Select at least one item."));
  511.         ret = `again;
  512.         continue;
  513.         }
  514.         if ( ret == `next )
  515.         {
  516.         list<string> greq = OSR::CheckGroupRequires();
  517.  
  518.         if (size(greq) != 0)
  519.         {
  520.             UI::OpenDialog (`opt(`decorated), `HBox(
  521.             `HSpacing (0.5), `Label(
  522.             // popup label: wait while dependencies are being solved
  523.             _("Resolving the dependencies
  524. between the selected groups...
  525. ")),
  526.             `HSpacing(0.5)));
  527.             sleep (1000);
  528.             UI::CloseDialog();
  529.             UI::ChangeWidget(`id(`options), `SelectedItems,
  530.             union (OSR::DetectGroupList(), greq));
  531.             ret = `again;
  532.         }
  533.         }
  534.     }
  535.     } until ( ret == `next || ret == `abort  || ret == `back || ret == `cancel);
  536.  
  537.     return ret;
  538.   }
  539.  
  540.   /**
  541.    * Repair tool dialog
  542.    */
  543.   define symbol RepairToolsDialog()``{
  544.  
  545.     // help text for "expert tools" dialog 1/2
  546.     string help_text     = _("<P>The repair system allows the
  547. direct repair of damaged system areas with the
  548. tools shown at the right side of the dialog.</P> 
  549. ") +
  550.  
  551.     // help text for "expert tools" dialog 2/2
  552.     _("<P>Each tool has a special functionality.
  553. Read the description of the different options
  554. and select one. If no entry matches your problem,
  555. go back and start the automatic analysis.</P>
  556. ");
  557.  
  558.     term contents = OSRDirect::OptionMenu();
  559.  
  560.     Wizard::SetContentsButtons(tool_dialog_caption, contents, help_text,
  561.     Label::BackButton(), Label::NextButton() );
  562.  
  563.     any ret = `next;
  564.     repeat
  565.     {
  566.     ret = UI::UserInput();
  567.  
  568.     if (is(ret, string))
  569.     {
  570.         symbol rret = OSRDirect::EvalDirectMethod ((string)ret);
  571.  
  572.         // get a abort return from custom_part or a other tool
  573.         if ( rret == `abort ) return `really_abort;
  574.     }
  575.     } until ( ret == `next || ret == `abort  || ret == `back || ret == `cancel);
  576.  
  577.     return (symbol) ret;
  578.   }
  579.  
  580.   /**
  581.    * Init a new automatically analyse sequence.
  582.    */
  583.   define void DetectDialogInit() ``{
  584.  
  585.     if ( OSRMode::script )
  586.     {
  587.     return;
  588.     }
  589.  
  590.     // progress bar label
  591.     string module_check_label    = _("Module Check");
  592.     // progress bar label
  593.     string system_check_label    = _("System Check");
  594.     // button label
  595.     string show_all_label    = _("&Show All Details");
  596.     // button label
  597.     string pause_label        = _("&Pause");
  598.  
  599.     if ( UI::WidgetExists (`id(`local_rich_text_info ))) return;
  600.  
  601.     if ( !detected ) Reset();
  602.  
  603.     // Build window contents
  604.     term module_progress_bar    =
  605.     OSRProgress::Create (`module_progress_bar, module_check_label,10,true);
  606.     term global_progress_bar    =
  607.     OSRProgress::Create (`global_progress_bar, system_check_label,10,false);
  608.  
  609.     term buttons_right          = `Empty();
  610.     term rich_text              = OSRSummary::Create (`local_rich_text_info,"");
  611.     term contents               = `VBox(
  612.     `VSpacing(0.3),
  613.     `HBox (
  614.         rich_text,
  615.         buttons_right
  616.     ),
  617.     module_progress_bar,
  618.     global_progress_bar,
  619.     `VSpacing(0.3),
  620.     `HBox (
  621.         `Left (`PushButton(`id(`pause), pause_label)),
  622.         `Right (`CheckBox(`id(`details), `opt(`notify), show_all_label,
  623.         OSRSummary::show_details))
  624.     ),
  625.     `VSpacing(0.5)
  626.     );
  627.  
  628.     // Help text for automatic check/repair process 1/4 
  629.     string help_text = sformat(_("<p>Now checking your Linux system.</p>
  630. ")) +
  631.  
  632.     // Help text for automatic check/repair process 2/4
  633.     _("<p>Depending on the CPU and the amount of memory, this can
  634. take some time.</p>
  635. ") +
  636.  
  637.     // Help text for automatic check/repair process 3/4
  638.     _("<p>The file system checks with fsck are especially
  639. time consuming.</p>
  640. ") +
  641.  
  642.     // Help text for automatic check/repair process 4/4
  643.     sformat (_("<P>If the scan sequence finds an error, 
  644. one or more repair proposals are made. 
  645. Then select one proposal or cancel the repair. </P>
  646. ")) +
  647.  
  648.     build_label_description (pause_label,
  649.     // help text for '&Pause' button
  650.     _("Pause or continue analyzing the system.")) +
  651.  
  652.     build_label_description (show_all_label,
  653.     // help text for '&Show All Details' button
  654.     _("Activate or disable reporting details."));
  655.  
  656.     Wizard::SetContentsButtons (scan_dialog_caption, contents, help_text,
  657.     Label::BackButton(), Label::OKButton());
  658.  
  659.     set_buttons_enable (false, true ,true);
  660.   };
  661.  
  662.   /**
  663.    *  AbortDialog
  664.    **/
  665.   define symbol AbortDialog() ``{
  666.  
  667.     // popup label
  668.     if (Popup::YesNo (_("Really abort the system repair tool?")))
  669.     return `yes;
  670.     return `back;
  671.   }
  672.  
  673.   /**
  674.    * Controll the user interaction for the scan and repair sequence.
  675.    */
  676.   define symbol DetectDialog() ``{
  677.  
  678.     // button label
  679.     string go_on_label = _("&Continue");
  680.  
  681.     if (OSRMode::script)
  682.     return OSR::Detect();
  683.  
  684.     DetectDialogInit ();
  685.     OSRSummary::Init ();
  686.  
  687.     symbol input = `pause;
  688.  
  689.     // if the detected is true the user can only view the
  690.     // protocol. No scan and repair sequence starts.
  691.     if ( detected )
  692.     {
  693.         set_buttons_enable (false, true, true );
  694.         UI::ChangeWidget(`id( `module_progress_bar), `Enabled, false );
  695.         UI::ChangeWidget(`id( `global_progress_bar), `Enabled, false ); 
  696.         OSRSummary::Update();
  697.         OSRProgress::Update();
  698.     }
  699.  
  700.     repeat
  701.     {
  702.     // only view mode
  703.     if (detected)
  704.     {
  705.         input            = (symbol) UI::UserInput();
  706.         OSRSummary::show_details    = (boolean)
  707.         UI::QueryWidget(`id(`details), `Value);
  708.  
  709.         OSRSummary::Update();
  710.  
  711.         if ( input == `abort || input == `cancel )
  712.         {
  713.         if ( AbortDialog() != `yes )
  714.         {
  715.             input = `again;
  716.         }
  717.         else
  718.         {
  719.             return input;
  720.         }
  721.         }
  722.     }
  723.     // scan and repair sequence
  724.     else if ( input != `error )
  725.     {
  726.         // after view mode after a scan and repair sequence
  727.         // user must press the next or back button to leave
  728.         // the dialog
  729.         if ( input == `detectok )
  730.         {
  731.  
  732.           OSRSummary::Update();
  733.           set_buttons_enable (false, true,true);
  734.           input = (symbol) UI::UserInput();
  735.         }
  736.  
  737.         if ( input == `abort || input == `cancel )
  738.         {
  739.         if ( AbortDialog() != `yes )
  740.         {
  741.             input = `pause;
  742.         }
  743.         else
  744.         {
  745.             OSR::ResetDetectionModules();
  746.             return input;
  747.         }
  748.         }
  749.  
  750.         // switch between detail and overview protocol mode
  751.         if ( input == `details )
  752.         {
  753.         OSRSummary::show_details = (boolean)
  754.             UI::QueryWidget(`id(`details), `Value );
  755.         OSRSummary::Update();
  756.         input = `pause;
  757.         }
  758.  
  759.         // user press the pause button
  760.         // or fist start of the scan and repair sequence
  761.         if ( input == `pause )
  762.         {
  763.         set_buttons_enable( true, false, false );
  764.         UI::ChangeWidget(`id(`pause), `Label, _("&Pause"));
  765.  
  766.         input = OSR::Detect();
  767.  
  768.         if (input == `abort || input == `cancel)
  769.         {
  770.             if ( AbortDialog() != `yes )
  771.             {
  772.                 input = `pause;
  773.                 continue;
  774.             }
  775.             else
  776.             {
  777.                 OSR::ResetDetectionModules();
  778.                 return `abort;
  779.             }
  780.         }
  781.         if ( input == `pause )
  782.         {
  783.             set_buttons_enable( true,true, true );
  784.             UI::ChangeWidget(`id(`pause), `Label,  go_on_label );
  785.  
  786.             // wait in pause mode and let the user change the protocol
  787.             // mode or abort
  788.             // the scan and repair sequence.
  789.             repeat
  790.             {
  791.             input = (symbol) UI::UserInput();
  792.             if ( input == `details )
  793.             {
  794.                 OSRSummary::show_details = (boolean)
  795.                 UI::QueryWidget(`id(`details), `Value );
  796.                 OSRSummary::Update();
  797.             }
  798.             if(  input == `abort || input == `cancel )
  799.             {
  800.                 if ( AbortDialog() != `yes )
  801.                 {
  802.                     continue;
  803.                 }
  804.                 else
  805.                 {
  806.                     OSR::ResetDetectionModules();
  807.                     return `abort;
  808.                 }
  809.             }
  810.             } until (input== `pause || input== `back || input == `next);
  811.         }
  812.           }
  813.       }
  814.     } until (input == `next || input == `back || input == `abort ||
  815.          input == `cancel || input == `error);
  816.  
  817.     // reset the scan and repair sequence
  818.     // e.g. unount mounted partitions.
  819.     if( ! detected ) OSR::ResetDetectionModules();
  820.  
  821.     // reset the hole api
  822.     if ( input == `back ) Reset();
  823.     if ( input == `next ) detected = true;
  824.  
  825.     return input;
  826.   }
  827.  
  828.  
  829.   /**
  830.    *  FinishDialog
  831.    **/
  832.   define symbol FinishDialog() ``{
  833.  
  834.     // popup label
  835.     if (Popup::YesNo (_("Really finish the system repair tool?")))
  836.     return `yes;
  837.  
  838.     return `back;
  839.   }
  840.  
  841.  
  842. /**
  843.  * Main dialog.
  844.  * Manage the sequence of the different dialogs.
  845.  */
  846. global define symbol OsrMainDialog() ``{
  847.  
  848.     map aliases = $[
  849.             "abort"        : ``(AbortDialog() ),
  850.                 "start"        : ``(StartDialog() ),
  851.             "scan_options"    : ``(ScanOptionsDialog()),
  852.             "direct_repair"    : ``(RepairToolsDialog()),
  853.             "detect"        : ``(DetectDialog()),
  854.             "finish"        : ``(FinishDialog() ),
  855.     ];
  856.  
  857.     map sequence = $[
  858.         "ws_start" : "start",
  859.     "start"    : $[
  860.             `abort        : "abort",
  861.             `scan_repair    : "detect",
  862.             `scan_repair_options: "scan_options",
  863.             `direct_repair    : "direct_repair",
  864.             `error        : `error,
  865.             `cancel        : "abort",
  866.             `back        : "abort",
  867.             `next        : "finish"
  868.     ],
  869.     "scan_options" : $[
  870.             `abort        : "abort",
  871.             `next        : "detect",
  872.             `error        : `error,
  873.             `cancel        : "abort"
  874.     ],
  875.     "direct_repair" : $[
  876.             `abort        : "abort",
  877.             `really_abort    : `abort,
  878.             `next        : "start",
  879.             `error        : `error,
  880.             `cancel        : "abort"
  881.     ],
  882.     "detect" : $[
  883.             `abort        : `abort,
  884.             `error        : `error,
  885.             `next        : "start",
  886.             `cancel        : `cancel
  887.         ],
  888.     "abort" : $[
  889.             `yes        : `abort
  890.         ],
  891.     // TODO: does it work in Mode::init?
  892.     "finish": $[
  893.             `yes        : `finish
  894.     ],
  895.     ];
  896.  
  897.     return Sequencer::Run (aliases, sequence);
  898. }
  899.  
  900. }//EOF
  901.