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

  1. /**
  2.  * File:
  3.  *   OSRPopup.ycp
  4.  *
  5.  * Module:
  6.  *   Popups for the YaST2 system repair tool.
  7.  *
  8.  * Author:
  9.  *   Johannes Buchhold <jbuch@suse.de>
  10.  *
  11.  * $Id: OSRPopup.ycp 23769 2005-06-21 12:18:10Z jsuchome $
  12.  */
  13.  
  14. {
  15.   module "OSRPopup";
  16.  
  17.   import "Label";
  18.   import "Popup";
  19.  
  20.   import "OSRMode";
  21.   import "OSRCommon";
  22.  
  23.   textdomain "repair";
  24.  
  25.   // pushbutton label
  26.   global string skip_label    =  _("&Skip");
  27.   // pushbutton label
  28.   global string repair_label    =  _("&Repair");
  29.   // pushbutton label
  30.   global string recover_label   =  _("&Recover");
  31.   // pushbutton label
  32.   global string ignore_label    =  _("&Ignore");
  33.   global string help_label    =  Label::HelpButton();
  34.  
  35.   // dialog caption: "YaST system repair Help"
  36.   global string help_headline  = OSRCommon::tool_name + " " + _("Help");
  37.  
  38.   /**
  39.    * Sublayout for other layouts.
  40.    */
  41.   define term repair_layout_internal(term center_box, term button_box )``{
  42.       return `HBox(
  43.            `HSpacing(1),
  44.            `HCenter(
  45.                 `HSquash(
  46.                      `VBox(
  47.                        `HCenter(
  48.                             `HSquash(
  49.                                  center_box
  50.                                  )
  51.                             ),
  52.                        `VSpacing(1  ),
  53.                        `HSquash(button_box)
  54.                        )
  55.                      )
  56.                 ),
  57.            `HSpacing(1)
  58.            );
  59.   }
  60.  
  61.   /**
  62.    * Layout for some following dialog.
  63.    */
  64.   define term repair_layout(string headline,  string help_text, term special_contents ) ``{
  65.  
  66.       term help_button   = `Empty();
  67.  
  68.       // enable the help-button if a help-text is specified
  69.       if ( help_text != "" && help_text != "TODO" )
  70.       {
  71.       help_button   = `PushButton(`id(`osr_popup_help), Label::HelpButton() );
  72.       }
  73.       else
  74.       {
  75.       help_button   = `PushButton(`id(`osr_popup_help), `opt(`disabled), Label::HelpButton());
  76.       }
  77.  
  78.       term button_box    = `HBox(
  79.                  `PushButton(`id(`osr_popup_repair), `opt(`default), repair_label ),
  80.                  `PushButton(`id(`osr_popup_skip), skip_label),
  81.                  `HSpacing(2),
  82.                  `Right( help_button )
  83.                  );
  84.  
  85.       // put the window-contents alltogether
  86.       return repair_layout_internal ( `VBox(
  87.                         `Left(`Heading(headline)),
  88.                         special_contents
  89.                         ),
  90.                       button_box
  91.                       );
  92.   }
  93.  
  94.   /**
  95.    * Layout for some following dialogs.
  96.    */
  97.   define term radio_button_popup_layout(string headline, term rb_group , boolean strict ) ``{
  98.  
  99.       term button_box    = `Empty();
  100.       if ( strict )
  101.       {
  102.       button_box    = `HBox(`HWeight(1, `PushButton(`id(`osr_popup_ok), `opt(`default), Label::OKButton())));
  103.       }
  104.       else
  105.       {
  106.       button_box    = `HBox(
  107.                 `HWeight(1, `PushButton(`id(`osr_popup_ok), `opt(`default), Label::OKButton())),
  108.                 `HSpacing(2),
  109.                 `HWeight(1, `PushButton(`id(`osr_popup_cancel), Label::CancelButton()))
  110.                 );
  111.       }
  112.  
  113.       // window contents alltogether
  114.       return repair_layout_internal( `VBox(
  115.                        `Left(`Heading(headline)),
  116.                        `VSpacing(1),
  117.                        `HSquash(rb_group),
  118.                        `VSpacing(1)
  119.                        ),
  120.                      button_box
  121.                      );
  122.  
  123.   }
  124.  
  125.  
  126.   /**
  127.    * Open a dialog with the term r_options in the center.
  128.    */
  129.   global define boolean OpenMainRepairDialog(string headline, string error_text, term r_options ) ``{
  130.  
  131.       // Build the options for the user dialog
  132.       term contents = `HVSquash (
  133.                 `HBox(
  134.                       `HSpacing(2),
  135.                       `VBox(
  136.                         `VSpacing(1),
  137.                         `Left(`Heading( headline)),
  138.                         `VSpacing(1),
  139.                         `Left(`Label(error_text)),
  140.                         `VSpacing(1),
  141.                         `RadioButtonGroup(`id(`rb), r_options),
  142.                         `VSpacing(1),
  143.                         `Bottom( `HSquash(`HBox(
  144.                               `PushButton(`id(`ok), `opt(`default ), Label::OKButton()),
  145.                               `PushButton(`id(`cancel), skip_label),
  146.                               `HSpacing(2),
  147.                               `Right(`PushButton(`id(`help), help_label ))
  148.                               )))
  149.                             ),
  150.                         `HSpacing(2)));
  151.  
  152.       boolean ret = UI::OpenDialog( contents );
  153.       UI::SetFocus(`id(`ok));
  154.       return ret;
  155.   }
  156.  
  157.   /**
  158.    * Open the base dialog to suggest modify.
  159.    */
  160.   global define boolean OpenSuggestDialog(string headline, string message, string help_text, term body, integer hweight )``{
  161.  
  162.       term message_box = `VBox(`Left(`Label(message )),
  163.                    `VSpacing(1)
  164.                    );
  165.  
  166.       integer headline_box_wight = 20;
  167.  
  168.       if ( message == "" )
  169.       {
  170.      message_box = `Empty();
  171.      headline_box_wight = 10;
  172.       }
  173.  
  174.       term contents =
  175.       `HBox(
  176.         `HWeight( 25, `RichText( help_text )),
  177.         `HWeight( 1,  `HSpacing(1)),
  178.         `HWeight( 60, `VBox(
  179.                     `VWeight(headline_box_wight,`VBox(
  180.                               `Left(`Heading(headline )),
  181.                               //`VSpacing(1),
  182.                               message_box
  183.                               )
  184.                          ),    
  185.                     `VWeight(hweight, body ),
  186.                     `VWeight(10,`VBox(
  187.                               //`VSpacing(1),
  188.                               `Bottom(`HBox(
  189.                                     `PushButton(`id(`ok),     repair_label ),
  190.                                     `HSpacing(2),
  191.                                     `PushButton(`id(`cancel), Label::CancelButton())
  192.                                     ))))
  193.                     )),
  194.         `HWeight( 1, `HSpacing(1))
  195.         );
  196.       boolean ret = UI::OpenDialog(contents );
  197.       UI::SetFocus(`id(`ok));
  198.       return ret;
  199.   }
  200.  
  201.   /**
  202.    * Dialog to change one field in the fstab.
  203.    */
  204.   global define string ChangeFieldDialog(string org_value, string description )``{
  205.  
  206.     UI::OpenDialog(
  207.     `VBox(
  208.         `TextEntry(`id(`text) , description,org_value),
  209.         `VSpacing(1),
  210.         `HBox (
  211.         `PushButton(`id(`ok), Label::OKButton()),
  212.         `HSpacing(2),
  213.         `PushButton(`id(`cancel), Label::CancelButton())
  214.         )
  215.     ));
  216.  
  217.     string ret = "";
  218.     if (UI::UserInput() == `ok)
  219.     ret = (string) UI::QueryWidget(`id(`text),`Value );
  220.     else ret = nil;
  221.  
  222.     UI::CloseDialog();
  223.     return ret;
  224. }
  225.  
  226.   /**
  227.    *  This method opens a new popup window that displays the error message.
  228.    *  It provides a repair button, a skip button and a help button.
  229.    *
  230.    *  @param string The headline of the popup window.
  231.    *  @param string The message text to display in the window.
  232.    *  @param string The help text to display when the user presses the help button.
  233.    *                If the help text is empty, no help button will be displayed.
  234.    *  @return boolean True if the repair button was pressed by the user.
  235.    *  @example boolean repair_question = OSRPopup::Repair( "Error detected", error_message, help_text);
  236.    */
  237.   global define boolean Repair(string headline, string message, string help_text ) ``{
  238.  
  239.     // In automatic-mode no window is displayed and true (== Repair)
  240.     // is returned,
  241.     // in detection-mode no window is displayed and false (== Skip)
  242.     // is returned -> only detection, no repair
  243.     if (OSRMode::automatic || OSRMode::detection)
  244.     {
  245.     return true;
  246.     }
  247.  
  248.     term special_contents = `VBox (
  249.                 `VSpacing(0.2),
  250.                 `Left(`Label(message))
  251.     );
  252.     UI::OpenDialog(`opt(`decorated),
  253.     repair_layout( headline,  help_text, special_contents ));
  254.     UI::SetFocus(`id(`osr_popup_repair));
  255.  
  256.     any ret = `next;
  257.  
  258.     // stay into the while-loop until the user presses Skip or Repair
  259.     while ((ret != `osr_popup_skip) && (ret != `osr_popup_repair))
  260.     {
  261.     ret = UI::UserInput();
  262.     if (ret == `osr_popup_help)
  263.     {
  264.         // launch text-popup to display help-text
  265.         Popup::LongText(help_headline , `RichText(help_text), 50, 20);
  266.     }
  267.     }
  268.  
  269.     UI::CloseDialog();
  270.  
  271.     return (ret == `osr_popup_repair);
  272.   };
  273.  
  274.   /**
  275.    *  This method opens a popup window that offers the specified items to the
  276.    *  user. The items can be selected in a RadioButtonGroup. A default item has to
  277.    *  be specified. It is marked as selected from start. If the default is "", the
  278.    *  first item in the list is marked as selected.
  279.    *  It provides an OK button and a Cancel button. If OK is pressed the selected
  280.    *  item is returned as a string, if cancel is pressed, the specified default is
  281.    *  returned.
  282.    *
  283.    *  @param string headline The headline of the popup window.
  284.    *  @param string message The message text to display in the window.
  285.    *  @param list item_list The list of items. This has to be a list of strings.
  286.    *  @param string default The default value to mark as selected.
  287.    *  @param boolean strict If strict is true, only an OK-pushbutton is displayed,
  288.    *         if strict is false both OK- and Cancel-button are displayed.
  289.    *  @return string The selected item, the default if cancel is pressed.
  290.    *  @example string result = OSRPopup::RadioButtonGroup("Test", "This is just a test.", ["a", "b", "c"], "b", true);
  291.    */
  292.   global define string RadioButtonGroup(string headline, string message,
  293.                     list<string> item_list,
  294.                     string default_val, boolean strict) ``{
  295.  
  296.       string result = default_val;
  297.       if (OSRMode::automatic || OSRMode::detection )
  298.       {
  299.       return "";
  300.       }
  301.  
  302.       if (size(item_list) == 0)
  303.       {
  304.       y2error("RadioButtonGroup: empty list as parameter: %1", item_list);
  305.       return "";
  306.       }
  307.  
  308.       term rb_group     = `Empty();
  309.       term rbs          = `VBox( `Left(`Label(message)), `VSpacing(1));
  310.       integer i        = 0;
  311.  
  312.       // create the radio buttons dynamically referring to the item_list
  313.       while (i >= 0 && i < size(item_list))
  314.       {
  315.     string item = item_list[i]:"";
  316.  
  317.     // if the current radio button is the default enable it
  318.     term rb  = `Left (
  319.         `RadioButton (`id(i), item,
  320.         ((item == default_val) || ((default_val == "") && (i == 0)))
  321.     ));
  322.     rbs = add(rbs, rb);
  323.     i   = i + 1;
  324.       }
  325.       // RadioButtonGroup
  326.       rb_group      = `RadioButtonGroup(`id(`rb_group), rbs );
  327.  
  328.       UI::OpenDialog (`opt(`decorated),
  329.     radio_button_popup_layout (headline, rb_group , strict ));
  330.  
  331.       UI::SetFocus(`id(`osr_popup_ok));
  332.  
  333.       // handling of the user-input, return the activatet list-item
  334.       if (  UI::UserInput()  == `osr_popup_ok)
  335.       {
  336.       integer current = (integer)
  337.         UI::QueryWidget(`id(`rb_group), `CurrentButton);
  338.       result      = item_list[current]:default_val;
  339.       }
  340.       else {
  341.       result = "";
  342.       }
  343.  
  344.       UI::CloseDialog();
  345.  
  346.       return result;
  347.   };
  348.  
  349.   /**
  350.    *  This method opens a popup window that offers the specified items to the
  351.    *  user. The items can be selected in a RadioButtonGroup. A default item has to
  352.    *  be specified. It is marked as selected from start. If the default is "", the
  353.    *  first item in the list is marked as selected.
  354.    *  It provides an OK button and a Cancel button. If OK is pressed the selected
  355.    *  item is returned as a string, if cancel is pressed, the specified cancel-value
  356.    *  is returned. 
  357.    *
  358.    *  @param string headline The headline of the popup window.
  359.    *  @param string message The message text to display in the window.
  360.    *  @param list item_list The list of items. This has to be a list of strings.
  361.    *  @param string default The default value to mark as selected.
  362.    *  @param string cancel The value that will be returned when pressing cancel.
  363.    *  @param boolean strict If strict is true, only an OK-pushbutton is displayed,
  364.    *         if strict is false both OK- and Cancel-button are displayed.
  365.    *  @return string The selected item, the default if cancel is pressed.
  366.    *  @example string result = OSRPopup::RadioButtonGroupText("Test",
  367.    *                                                  "This is a test.",
  368.    *                              [["a" , "First choice"], ["b", "Second choice"]],
  369.    *                              "b",
  370.    *                              "cancel",
  371.    *                              true); 
  372.    */
  373.   global define string RadioButtonGroupText(string headline, string message,
  374.                         list<list> item_list,
  375.                         string default_val,
  376.                         string cancel, boolean strict) ``{
  377.  
  378.       string result = default_val;
  379.  
  380.       if (OSRMode::automatic || OSRMode::detection )
  381.       {
  382.       return "";
  383.       }
  384.  
  385.       if (size(item_list) == 0)
  386.       {
  387.       y2error("RadioButtonGroup: empty list as parameter: %1", item_list);
  388.       return "";
  389.       }
  390.       
  391.       term rb_group      = `Empty();
  392.       term rbs           = `VBox(`Left(`Label(message)));
  393.       
  394.       integer i      = 0;
  395.       // create the radio buttons dynamically referring to the item_list
  396.  
  397.       while (i >= 0 && i < size(item_list))
  398.       {
  399.       // an item looks like ["a", "First choice"]
  400.       list   item      = item_list [i]:[];
  401.       string item_key  = item[0]:"";
  402.       string item_text = item[1]:"";
  403.  
  404.       // create a radio button for the current item
  405.       // if the current radio button is the default enable it
  406.       term rb  = `Left(
  407.         `RadioButton (`id(i),
  408.         (item_text == "") ? item_key : item_key + " - " + item_text,
  409.         // enable the specified default
  410.         ((item_key == default_val) || ((default_val == "") && (i == 0)))
  411.         )
  412.       );
  413.  
  414.       // add the current radio button to the radio buttons
  415.       rbs = add(rbs, rb);
  416.       
  417.       // go to the next item in the list
  418.       i   = i + 1;
  419.       }
  420.  
  421.       // RadioButtonGroup
  422.       rb_group      = `RadioButtonGroup(
  423.                     `id(`rb_group),
  424.                     rbs
  425.                     );
  426.  
  427.       UI::OpenDialog ( `opt(`decorated),
  428.     radio_button_popup_layout (headline, rb_group, strict )
  429.       );
  430.  
  431.       // set the focus to the OK button
  432.       UI::SetFocus(`id(`osr_popup_ok));
  433.  
  434.       // handling of the user-input, return the activatet list-item
  435.       any ret = UI::UserInput();
  436.       if (ret == `osr_popup_ok)
  437.       {
  438.       integer current = (integer)
  439.         UI::QueryWidget(`id(`rb_group), `CurrentButton);
  440.  
  441.       // get the chosen item and return its key
  442.       result = item_list [current, 0]:"";
  443.       }
  444.       else if (ret == `osr_popup_cancel)
  445.       {
  446.       result = cancel;
  447.       }
  448.  
  449.       UI::CloseDialog();
  450.       return result;
  451.   };
  452.  
  453.   global define map CheckBoxDialog (string headline, string message,
  454.                     list<list> boxes )``{
  455.  
  456.     term check_group = `VBox (`Left (`Label (message)), `VSpacing (1));
  457.  
  458.     foreach(list box, boxes, ``{
  459.     check_group = add (check_group,
  460.         `Left(`CheckBox(`id( box[0]:""), box[1]:"", box[2]:false ))
  461.     );
  462.     });
  463.  
  464.     UI::OpenDialog (`opt(`decorated),
  465.     radio_button_popup_layout (headline, check_group , true ));
  466.  
  467.     // set the focus to the OK button
  468.     UI::SetFocus(`id(`osr_popup_ok));
  469.  
  470.     // handling of the user-input, return the activatet list-item
  471.     map selected    = $[];
  472.     any ret        = UI::UserInput();
  473.  
  474.     if (ret == `osr_popup_ok)
  475.     {
  476.     foreach (list box, boxes, ``{
  477.         selected [box[0]:""] = UI::QueryWidget(`id(box[0]:"" ), `Value );
  478.     });
  479.     }
  480.  
  481.     UI::CloseDialog();
  482.     return selected;
  483.   }
  484.  
  485.  
  486.   define term build_multi_box(string box_headline, list<list> item_list )``{
  487.  
  488.       list<term> items = [];
  489.       foreach (list item, item_list ,``{
  490.       items = add(items, `item(`id(item[0]:""), item[0]:"", item[1]:true ));
  491.       });
  492.       return `MultiSelectionBox( `id(`selection_box ), box_headline, items );
  493.   }
  494.  
  495.   /**
  496.    * A dialog with to messages and a multi selection box in the center.
  497.    */
  498.   global define list<string> MultiSelectionBox(string     headline,
  499.                            string     message_top,
  500.                            string     message_bottom,
  501.                            string     help_text,
  502.                            string     box_headline,
  503.                            list<list> item_list,
  504.                            list<list> special_buttons_list )``{
  505.  
  506.       term special_buttons = `HBox();
  507.       map  special_symbol_to_action = $[];
  508.       foreach ( list special_button, special_buttons_list, ``{
  509.       special_buttons = add( special_buttons, special_button[0]:`Empty());
  510.       special_symbol_to_action[special_button[1]:`empty] =
  511.         special_button[2]:OSRCommon::EmptyList;
  512.       });
  513.       term multi_box_with_text =  `VBox(`Left(`Label(message_top )),
  514.                     `VSpacing(1),
  515.                     `ReplacePoint(`id(`rp), build_multi_box(box_headline, item_list)),
  516.                     special_buttons,
  517.                     `VSpacing(1),
  518.                     `Left(`Label(message_bottom )),
  519.                     `VSpacing(1));
  520.       UI::OpenDialog(
  521.              `opt(`decorated),
  522.              repair_layout(headline, help_text, multi_box_with_text )
  523.              );
  524.  
  525.       UI::SetFocus(`id(`osr_popup_repair));
  526.  
  527.       list<string> ret_list    = [];
  528.       any ret            = `next;
  529.  
  530.       repeat
  531.       {
  532.       ret = UI::UserInput();
  533.  
  534.       if (ret == `osr_popup_help)
  535.       {
  536.           // launch text-popup to display help-text
  537.           Popup::LongText( help_headline , `RichText(help_text), 50, 20);
  538.       }
  539.       else if ( ret == `osr_popup_repair )
  540.       {
  541.           ret_list = (list<string>)
  542.         UI::QueryWidget(`id(`selection_box), `SelectedItems );
  543.       }
  544.       else
  545.       {
  546.           // eval special button action define.
  547.           if ( haskey( special_symbol_to_action, ret ))
  548.           {
  549.           list () f =special_symbol_to_action[ret]:OSRCommon::EmptyList;
  550.           UI::ReplaceWidget(`id(`rp),
  551.             build_multi_box(box_headline, (list<list>) f()));
  552.           }
  553.       }
  554.       }
  555.       until( ret == `osr_popup_repair || ret  == `osr_popup_skip );
  556.  
  557.       UI::CloseDialog();
  558.  
  559.       return ret_list;
  560.   }
  561.  
  562. // --- moved from OSRRepairUI:
  563.  
  564. /**
  565.  * Build (return) a description text for a label in the help_text field.
  566.  * @param label the label
  567.  * @param description the description text for the label.
  568.  * @return the formatted label help text
  569.  */
  570. global define string build_label_description (string label, string description) ``{
  571.     return sformat ("<P><B>%1</B>: %2</P>",
  572.         mergestring (splitstring (label, "&"), ""), description);
  573. }
  574.  
  575. }//EOF
  576.