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 / OSRSummary.ycp < prev    next >
Text File  |  2006-11-29  |  17KB  |  571 lines

  1.  
  2. /**
  3.  *  File:
  4.  *   OSRSummary.ycp
  5.  *
  6.  *  Module:
  7.  *   YaST2 OS Repair
  8.  *
  9.  *  Summary:
  10.  *
  11.  *  Authors:
  12.  *   Johannes Buchhold <jbuch@suse.de>, 2002
  13.  *
  14.  *  Create a unified-looking RichText description of the not configured/configured devices.
  15.  *  This is used in <module_name>_summary.ycp modules.
  16.  *
  17.  * $Id: OSRSummary.ycp 20738 2005-01-12 17:47:48Z jsuchome $
  18.  */
  19. {
  20.   module "OSRSummary";
  21.  
  22.   import "HTML";
  23.   import "Mode";
  24.   import "Stage";
  25.  
  26.   import "OSRLogFile";
  27.   import "OSRStatus";
  28.   import "OSRProgress";
  29.   import "OSRCommon";
  30.  
  31.   textdomain "repair";
  32.  
  33.   /**
  34.    *
  35.    * $["init":[
  36.    *           $["description":"No floppy device found",
  37.    *             "header":"Probing floppy",
  38.    *         "method_name":"", "status":"not_found"],
  39.    *
  40.    *           $["description":"Target system initialised",
  41.    *             "header":"Init target system",
  42.    *             "method_name":"",
  43.    *             "status":"detect_ok"]],
  44.    *
  45.    * "mbr_check":[$[
  46.    *              "description":"One hard disk detected: /dev/hda",
  47.    *              "header":"Searching for hard disks",
  48.    *              "method_name":"find_harddisks",
  49.    *              "status":"detect_ok"]]]
  50.    *
  51.    */
  52.   map summary            = $[];
  53.  
  54.   symbol richtext_widget    = `empty;
  55.   boolean special_widget    = true;
  56.   integer fill_length        = 0;
  57.   string finish_key        = "finish_key";
  58.   string fill_char        = "";
  59.   string summary_header        = "";
  60.  
  61.   global boolean show_details    = true;
  62.  
  63.   // initialize UI-related stuff
  64.   global define void Init () {
  65.  
  66.       if (! UI::HasSpecialWidget(`DownloadProgress))
  67.       {
  68.       fill_char      = ".";
  69.       special_widget = false;
  70.       fill_length     = 40;
  71.       }
  72.   }
  73.  
  74.   global define void Reset() ``{
  75.  
  76.       summary_header = "";
  77.       summary        = $[];
  78.   }
  79.  
  80.   global define term Create( symbol local_richtext_widget, string text ) ``{
  81.  
  82.       richtext_widget = local_richtext_widget;
  83.       return ( `RichText(`id(richtext_widget), `opt(`autoScrollDown),  text ));
  84.   }
  85.  
  86.   /**
  87.    *  Function that creates the shown text in the RichText widget.
  88.    *  "Not detected" will be returned if the list is empty.
  89.    *
  90.    *  API function.
  91.    *
  92.    *  @param list A list of output of the summaryDevice() calls
  93.    *  @return string Th╗e formatted text.
  94.    */
  95.   define string ItemList( list<string> items ) ``{
  96.  
  97.       string text = "";
  98.       foreach (string entry, items, ``{
  99.       text = text + entry;
  100.       });
  101.  
  102.       return text;
  103.   };
  104.  
  105.  
  106.   define string text_width()``{
  107.  
  108.     if (Stage::initial ())
  109.     {
  110.     //map display_info = UI::GetDisplayInfo ();
  111.     //return tointeger( display_info["Width"]:640 / 3 * 2);
  112.     return "450";
  113.     }
  114.     else
  115.     {
  116.     return "450";
  117.     }
  118.   }
  119.  
  120.  
  121.  define string fill(string str, integer  length, string c)``{
  122.       while( size(str) < length ) { str = str +c ;}
  123.       return str;
  124.   }
  125.  
  126.  
  127.   /**
  128.    *  Function that creates the description for one item.
  129.    *
  130.    *  API function.
  131.    *
  132.    *  @param string The name of the item.
  133.    *  @param string Additional description.
  134.    *  @param string The status of the rescue system. Possible values are:
  135.    *                "detect_ok", "detect_error", "detect_problem", "repair_ok", "repair_error", "repair_omit.
  136.    *  @return string The formatted text.
  137.    */
  138.   define string Item(string name, string description, string status) ``{
  139.  
  140.       string  color          = OSRStatus::Color(status);
  141.       string  status_text    = OSRStatus::Text(status);
  142.  
  143.       // Check if the UI is running with ncurses or qt
  144.       if (special_widget )
  145.       {
  146.       return sformat(
  147. "<tr>
  148.     <th width=20 align=left>
  149.     --
  150.     </th>
  151.     <th width=380 align=left>
  152.       %1
  153.     </th>
  154.     <th align=right width=80>
  155.       <font color=%4>
  156.          %2
  157.       </font>
  158.     </th>
  159.   </tr>
  160.   <tr>
  161.     <td width=20 align=left>
  162.     </td>
  163.     <td width=380 align=left>
  164.       %3
  165.    </td>
  166.    <td width=80>
  167.    </td>
  168.  </tr>
  169.  <tr></tr>",
  170. name,
  171. status_text,
  172. description,
  173. color
  174. );
  175.       }
  176.       else
  177.       {
  178.       return sformat("<br><li>%1  <b>%2</b> </li>
  179.                           <br><li>%3            </li>
  180.                           <br><br>",
  181.              fill( name, fill_length , fill_char),
  182.              status_text,
  183.              description
  184.              );
  185.       }
  186.   };
  187.  
  188.   define boolean last_group_entry(string group ) ``{
  189.  
  190.       list t = filter (any g, add(OSRCommon::detect_group_list, finish_key),
  191.     ``(haskey(summary, g)));
  192.  
  193.       if (t [ size (t) - 1 ]:"" == group ) return true;
  194.       else return false;
  195.   }
  196.  
  197.   /**
  198.    *  Updates the contents of the RichText widget.
  199.    *
  200.    *  API function.
  201.    *
  202.    *  @return boolean True if the RichText widget was changed successfully.
  203.    */
  204.   global define boolean Update() {
  205.  
  206.       string  text          = "";
  207.       map     group_text_map  = $[];
  208.  
  209.       //update show_details
  210.       if (!Mode::test() && UI::WidgetExists(`id(`details)))
  211.       show_details = (boolean) UI::QueryWidget(`id(`details), `Value );
  212.  
  213.       foreach (string group, any entries, (map<string,any>)summary, ``{
  214.  
  215.     if (group == finish_key )
  216.     {
  217.         group_text_map[finish_key] = entries;
  218.     }
  219.     else
  220.     {
  221.  
  222.         integer g_priority    = 1;
  223.         map g_entry_map     = OSRCommon::GetGroupMap (group);
  224.         string summary_text    = "";
  225.         list<string> summary_list    = [];
  226.  
  227.         foreach (map entry, (list<map>) entries, ``{
  228.  
  229.         if (g_priority<OSRStatus::Priority(entry["status"]:"detect_ok"))
  230.         {
  231.             g_priority=OSRStatus::Priority(entry["status"]:"detect_ok");
  232.         }
  233.         if (show_details ||
  234.             group == OSRCommon::current_detect_map["group"]:"" )
  235.         {
  236.             // get the formatted summaries as list:
  237.             if (entry["header"]:"" != "")
  238.             {
  239.             summary_list = add (summary_list,
  240.                 Item (entry["header"]:"",
  241.                   entry["description"]:"",
  242.                   entry["status"]:"detect_ok")
  243.             );
  244.             }
  245.         }
  246.         });
  247.  
  248.         summary_text    = ItemList(summary_list);
  249.         string status       = "";
  250.         string status_key   = "";
  251.  
  252.         if (last_group_entry(group ))
  253.         {
  254.         status_key    = "open";
  255.         status        = OSRStatus::Text(status_key);
  256.         }
  257.         else
  258.         {
  259.         status        =  OSRStatus::PriorityStr(g_priority);
  260.         status_key    =  OSRStatus::PriorityKey(g_priority);
  261.         }
  262.  
  263.         string group_status = "";
  264.         if (!show_details)
  265.         {
  266.         group_status    = HTML::Bold (
  267.             HTML::Colorize (status, OSRStatus::Color(status_key)));
  268.         }
  269.  
  270.         string group_header = HTML::Bold (
  271.         fill (g_entry_map["text"]:"",fill_length, fill_char) );
  272.         string header        = "";
  273.  
  274.         if (special_widget)
  275.         {
  276.         header        = sformat("
  277.   <tr><th></th><th></th></tr>
  278.   <tr>
  279.      <th align=left colspan=2 > %1 </th>
  280.      <th align=right>           %2 </th>
  281.   </tr>%3<tr></tr>", group_header, group_status, summary_text );
  282.         }
  283.         else
  284.         {
  285.         header        = sformat("<li>%1 <b>%2</b><br></li>%3",
  286.             group_header, group_status, summary_text );
  287.         }
  288.         group_text_map [group] = HTML::Para (header);
  289.  
  290.     }
  291.       });
  292.  
  293.       // correct order!!!
  294.       y2debug("Update the richtext by detect_group_list %1", OSRCommon::detect_group_list);
  295.       foreach(string g, OSRCommon::detect_group_list, ``{
  296.       text = text + group_text_map[g]:"";
  297.       });
  298.  
  299.       if (special_widget ) {
  300.       text = "<table width=" + text_width() + ">" + text + "</table>";
  301.       }
  302.  
  303.       WFM::Write(.local.ycp, OSRLogFile::GetTmpDir()+"/summary" , summary );
  304.  
  305.       return Mode::test () || UI::ChangeWidget(`id(richtext_widget), `Value, text);
  306.   };
  307.  
  308.   /**
  309.    *  Changes the summary of the specified module in the RichText widget.
  310.    *
  311.    *  For internal use only.
  312.    *
  313.    *  @param string The name of the module which summary is to be changed.
  314.    *  @param string The first line of the new text.
  315.    *  @param string The second line of the new text.
  316.    *  @param string The status of the rescue-system, possible values are:
  317.    *                "detect_ok", "detect_error", "detect_problem", "repair_ok", "repair_error" and "repair_omit"
  318.    *  @return boolean True if the RichText widget was updated successfully.
  319.    */
  320.   define boolean change_summary(string header, string description  ) ``{
  321.  
  322.     map current_detect_map = OSRCommon::current_detect_map;
  323.  
  324.     list summary_entries = summary [current_detect_map["group"]:""]:[];
  325.     summary_entries = filter (map<string,any> entry, (list<map<string,any> >)summary_entries, ``(
  326.     entry["header"]:"" != header ));
  327.  
  328.     /**
  329.      * possible values for the key "status" are:
  330.      * "detect_ok", "detect_error", "detect_problem", "repair_ok",
  331.      * "repair_error" and "repair_omit"
  332.      */
  333.     map entry = $[
  334.             "header"        : header,
  335.             "description"    : description,
  336.             "status"        : OSRStatus::status,
  337.             "method_name"    : current_detect_map["name"]:""
  338.     ];
  339.  
  340.     summary_entries                = add (summary_entries, entry);
  341.     summary [current_detect_map["group"]:""]    = summary_entries;
  342.  
  343.     return Update();
  344.   };
  345.  
  346.  
  347.   global define void PrepareNewEntry( map step ) ``{
  348.  
  349.       summary_header = step["summary"]:"";
  350.  
  351.       OSRProgress::SetFile(`module_progress_bar   , OSRLogFile::GetTmpDir()+"/"+ OSRCommon::current_module_name );
  352.       OSRProgress::SetLength(`module_progress_bar,( step["progress"]:100 *10 ) );
  353.       OSRProgress::SetLabel(`module_progress_bar, summary_header );
  354.  
  355.       OSRStatus::Open();
  356.       change_summary(summary_header, "");
  357.   }
  358.  
  359.  
  360.   global define void FinishNewEntry()``{
  361.       OSRProgress::Fill(`module_progress_bar);
  362.   }
  363.  
  364.  
  365.  
  366.   global define void Finish() ``{
  367.       summary[finish_key] =  _("Finish");
  368.   }
  369.  
  370.   /**
  371.    *  Changes the summary of the specified module in the RichText widget. Shows that
  372.    *  the rescue system has found no error. Blue font is used for the headline.
  373.    *
  374.    *  API function.
  375.    *
  376.    *  @param string The name of the module which summary is to be changed.
  377.    *  @param string The first line of the new text.
  378.    *  @param string The second line of the new text.
  379.    *  @return boolean True if the RichText widget was updated successfully.
  380.    */
  381.   global define boolean DetectOK( string header, string description) ``{
  382.       if (OSRCommon::current_module_name == "" ) return true;
  383.       
  384.       if (header == "") header = summary_header;
  385.   
  386.       OSRStatus::DetectOK();
  387.       OSRProgress::SetLabel(`module_progress_bar, header );
  388.       OSRLogFile::Add("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "O.k." + "\n" + description + "\n");
  389.       
  390.       return (change_summary(header, description ));
  391.  
  392.   }
  393.  
  394.   /**
  395.    *  Changes the summary of the specified module in the RichText widget. Shows that
  396.    *  the rescue system has found no error. Blue font is used for the headline.
  397.    *
  398.    *  API function.
  399.    *
  400.    *  @param string The name of the module which summary is to be changed.
  401.    *  @param string The first line of the new text.
  402.    *  @param string The second line of the new text.
  403.    *  @return boolean True if the RichText widget was updated successfully.
  404.    */
  405.   global define boolean DetectOmit( string header, string description) ``{
  406.       if (OSRCommon::current_module_name == "" ) return true;
  407.       
  408.       if (header == "") header = summary_header;
  409.   
  410.       OSRStatus::DetectOmit();
  411.       OSRProgress::SetLabel(`module_progress_bar, header );
  412.       OSRLogFile::Add("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "Omitted." + "\n" + description + "\n");
  413.       
  414.       return (change_summary(header, description ));
  415.  
  416.   }
  417.  
  418.   
  419.   /**
  420.    *  Changes the summary of the specified module in the RichText widget. Shows that
  421.    *  the rescue system has detected an error. Red font is used for the headline.
  422.    *
  423.    *  API function.
  424.    *
  425.    *  @param string The name of the module which summary is to be changed.
  426.    *  @param string The first line of the new text.
  427.    *  @param string The second line of the new text.
  428.    *  @return boolean True if the RichText widget was updated successfully.
  429.    */
  430.   global define boolean DetectError(string header, string description) ``{
  431.       if (OSRCommon::current_module_name == "" ) return true;
  432.       
  433.       if (header == "") header = summary_header;
  434.       OSRStatus::DetectError();
  435.       OSRProgress::SetLabel(`module_progress_bar, header );
  436.       OSRLogFile::Add("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "Error" + "\n" + description + "\n");
  437.       
  438.       return (change_summary( header, description ));
  439.   }
  440.  
  441.   /**
  442.    *  Changes the summary of the specified module in the RichText widget. Shows that
  443.    *  the rescue system has detected a potential problem. Red font is used for the headline.
  444.    *
  445.    *  API function.
  446.    *
  447.    *  @param string The name of the module which summary is to be changed.
  448.    *  @param string The first line of the new text.
  449.    *  @param string The second line of the new text.
  450.    *  @return boolean True if the RichText widget was updated successfully.
  451.    */
  452.   global define boolean DetectProblem(string header, string description) ``{
  453.       if (OSRCommon::current_module_name == "" ) return true;
  454.       
  455.       if (header == "") header = summary_header;
  456.       OSRStatus::DetectProblem();
  457.       OSRProgress::SetLabel(`module_progress_bar, header );
  458.       OSRLogFile::Add("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "Problem" + "\n" + description + "\n");
  459.       
  460.       return (change_summary(header, description ));
  461.   }
  462.  
  463.   /**
  464.    *  Changes the summary of the specified module in the RichText widget. Shows that
  465.    *  the rescue system repaired the detected error. ??? font is used for the headline.
  466.    *
  467.    *  API function.
  468.    *
  469.    *  @param string The name of the module which summary is to be changed.
  470.    *  @param string The first line of the new text.
  471.    *  @param string The second line of the new text.
  472.    *  @return boolean True if the RichText widget was updated successfully.
  473.    */
  474.   global define boolean RepairOK(string header, string description) ``{
  475.       if (OSRCommon::current_module_name == "" ) return true;
  476.  
  477.       if (header == "") header = summary_header;
  478.       OSRStatus::RepairOK();
  479.       OSRProgress::SetLabel(`module_progress_bar, header );
  480.       OSRLogFile::Add("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "Repair succeeded" + "\n" + description + "\n");
  481.       
  482.       return (change_summary( header, description ));
  483.   }
  484.  
  485.   /**
  486.    *  Changes the summary of the specified module in the RichText widget. Shows that
  487.    *  an error occurred during the repair-process. ??? font is used for the headline.
  488.    *
  489.    *  API function.
  490.    *
  491.    *  @param string The name of the module which summary is to be changed.
  492.    *  @param string The first line of the new text.
  493.    *  @param string The second line of the new text.
  494.    *  @return boolean True if the RichText widget was updated successfully.
  495.    */
  496.   global define boolean RepairError(string header, string description) ``{
  497.       if (OSRCommon::current_module_name == "" ) return true;
  498.  
  499.       if (header == "") header = summary_header;
  500.       OSRStatus::RepairError();
  501.       OSRProgress::SetLabel(`module_progress_bar, header );
  502.  
  503.       OSRLogFile::Add("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "Repair failed" + "\n" + description + "\n");
  504.  
  505.       return (change_summary( header, description ));
  506.   }
  507.  
  508.   global define boolean NotFound(string header, string description )``{
  509.       if (OSRCommon::current_module_name == "" ) return true;
  510.       
  511.       if (header == "") header = summary_header;
  512.       OSRStatus::NotFound();
  513.       OSRProgress::SetLabel(`module_progress_bar, header );
  514.  
  515.       OSRLogFile::Add("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "Not found" + "\n" + description + "\n");
  516.       return (change_summary( header, description ));
  517.   }
  518.   
  519.   /**
  520.    *  Changes the summary of the specified module in the RichText widget. Shows that
  521.    *  the repair process was omitted by the user.
  522.    *
  523.    *  API function.
  524.    *
  525.    *  @param string The name of the module which summary is to be changed.
  526.    *  @param string The first line of the new text.
  527.    *  @param string The second line of the new text.
  528.    *  @return boolean True if the RichText widget was updated successfully.
  529.    */
  530.   global define boolean RepairOmit( string header, string description) ``{
  531.       if (OSRCommon::current_module_name == "" ) return true;
  532.  
  533.       if (header == "") header = summary_header;
  534.       OSRStatus::RepairOmit();
  535.       OSRProgress::SetLabel(`module_progress_bar, header );
  536.  
  537.       OSRLogFile::Add ("Module: " + OSRCommon::current_module_name + "\n" + header + "\t" + "Repair omitted" + "\n" + description + "\n");
  538.  
  539.       return (change_summary( header, description ));
  540.   };
  541.  
  542.  
  543.  
  544.   global define void SetRepairSummary( symbol repair_ret, string repair_header,
  545.                        string detect_ok_message,
  546.                        string detect_cancel_message,
  547.                        string detect_error_message ) {
  548.  
  549.     if (OSRCommon::current_module_name == "" ) return;
  550.  
  551.     if (repair_ret == `cancel || repair_ret == `abort || repair_ret == `back )
  552.     {
  553.     RepairOmit (repair_header, detect_cancel_message );
  554.     }
  555.     else if (repair_ret == `ok || repair_ret == `next )
  556.     {
  557.     RepairOK (repair_header, detect_ok_message );
  558.     }
  559.     else if (repair_ret == `error )
  560.     {
  561.     RepairError (repair_header, detect_error_message);
  562.     }
  563.     else
  564.     {
  565.     y2error ("Not supported repair return symbol %1",repair_ret);
  566.     RepairError (repair_header, detect_error_message);
  567.     }
  568.   };
  569.  
  570. }//EOF
  571.