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 / include / bootloader / generic / widget_funcs.ycp < prev    next >
Text File  |  2006-11-29  |  12KB  |  443 lines

  1. /**
  2.  * File:
  3.  *      include/bootloader/generic/widget_funcs.ycp
  4.  *
  5.  * Module:
  6.  *      Bootloader installation and configuration
  7.  *
  8.  * Summary:
  9.  *      Functions to generate generic widgets
  10.  *
  11.  * Authors:
  12.  *      Joachim Plack <jplack@suse.de>
  13.  *
  14.  * $Id: widget_funcs.ycp 34415 2006-11-15 14:28:49Z jplack $
  15.  *
  16.  */
  17.  
  18.  
  19. {
  20. textdomain "bootloader";
  21.  
  22. string generic_Help (string widget_name) {
  23.     string arch_widget_name = Arch::arch_short() + "_" + widget_name;
  24.  
  25.     if ( haskey( BootCommon::help_messages, arch_widget_name ) )
  26.         return(BootCommon::help_messages[arch_widget_name]:"" );
  27.     return(BootCommon::help_messages[widget_name]:"" );
  28. }
  29.  
  30. string generic_Description (string widget_name, string fallback) {
  31.     string arch_widget_name = Arch::arch_short() + "_" + widget_name;
  32.  
  33.     if ( haskey( BootCommon::descriptions, arch_widget_name ) )
  34.         return(BootCommon::descriptions[arch_widget_name]:"" );
  35.     if ( haskey( BootCommon::descriptions, widget_name ) )
  36.         return(BootCommon::descriptions[widget_name]:"" );
  37.     return( dgettext( "base", fallback ) );
  38. }
  39.  
  40. map<string,any> generic_Term (map<string,any> options, string type) {
  41.     // type is any of 'check', 'radio', or else
  42.     term option_term = `VBox (`VSpacing (0.4));
  43.     list<string> __events = [];
  44.     string help = "";
  45.     term def_opt = `opt (`notify, `autoShortcut);
  46.  
  47.     // TODO: evaluate the proposal to omit the radio button if size of options
  48.     // is one and type==radio. Possible implementation:
  49.     //          if sizeof(options) == 1 then type:=normal
  50.  
  51.     foreach (string key, any value, options, {
  52.     list<string> val = splitstring((string)value, ":");
  53.     string desc = generic_Description( key, val[1]:key );
  54.  
  55.     if (val[0]:"undef" != "bool")
  56.         continue;
  57.  
  58.     if (type == "radio") {
  59.         option_term = add(option_term,
  60.         `Left(`RadioButton (`id (key), def_opt, desc ))
  61.         );    
  62.     }
  63.     else  {
  64.         option_term = add(option_term,
  65.         `Left(`CheckBox (`id (key), def_opt, desc ))
  66.         );    
  67.     }
  68.  
  69.     __events = add(__events, key); 
  70.     help = help + generic_Help(key);
  71.     });
  72.  
  73.     add(option_term, `VSpacing (0.4));
  74.  
  75.     foreach (string key, any value, options, {
  76.     list<string> val = splitstring((string)value, ":");
  77.     value = val[0]:"undef";
  78.     if (value == "bool") continue;
  79.     string key_e = key + "_enabled";
  80.     string desc = generic_Description( key, val[1]:key );
  81.     string defval = val[2]:"" ;
  82.  
  83.     term new = nil;
  84.     term enable_widget = (type == "radio") ?
  85.         `RadioButton(`id(key_e), def_opt, desc) :
  86.         `CheckBox(`id(key + "_enabled"), def_opt, desc);
  87.  
  88.     val[0] = nil; val[1] = nil; val[2] = nil;
  89.     val = filter(string v, val, ``(v!=nil) );
  90.  
  91.     if (value == "string") {
  92.         if ( type == "radio" || type == "check") {
  93.         new = `Left(`HBox (
  94.             enable_widget,
  95.             `TextEntry(`id( key ), "")
  96.         ));
  97.         }
  98.         else  {
  99.             new = `TextEntry(`id( key ), desc);
  100.         }
  101.     }
  102.     else if (value == "password") {
  103.             new = `Frame (desc, `VBox (
  104.             `VSpacing (0.4),
  105.             `HBox (
  106.             `HSpacing (2),
  107.             // text entry
  108.             `Password (`id (key + "_pw1"), _("&Password")),
  109.             // text entry
  110.             `Password (`id (key + "_pw2"), _("Re&type Password")),
  111.             `HSpacing (2)
  112.             ),
  113.             `VSpacing (0.4)
  114.         ));
  115.         if ( type == "radio" || type == "check") {
  116.         new = `Left(`HBox (
  117.             enable_widget,
  118.             new
  119.         ));
  120.         }
  121.         else  {
  122.         }
  123.     }
  124.     // FIXME:        menu
  125.     // FIXME:     ordered list
  126.     else if (value == "path") {
  127.         if ( type == "radio" || type == "check") {
  128.         new = `HBox (
  129.             enable_widget,
  130.             `ComboBox (`id (key), add(add(def_opt, `editable), `hstretch), "", val),
  131.             `PushButton (`id (key + "_browse"),
  132.                 Label::BrowseButton ()
  133.             )
  134.             );
  135.         }
  136.         else  {
  137.         new = `HBox (
  138.             `ComboBox (`id (key), `opt (`editable, `hstretch), desc, val),
  139.             `VBox (
  140.                 `Label (""),
  141.             `PushButton (`id (key + "_browse"),
  142.                 Label::BrowseButton ()
  143.             )
  144.             )
  145.             );
  146.         }
  147.     }
  148.     else if (value == "multi") {
  149.         if ( type == "radio" || type == "check") {
  150.         new = `Left(`HBox (
  151.             enable_widget,
  152.             `MultiSelectionBox (`id (key), def_opt, "",
  153.                 maplist(string v, val, ``( `item(`id(v), v ) ))
  154.                 )
  155.                ));
  156.         }
  157.         else  {
  158.             new = `Left(`MultiSelectionBox (`id (key), def_opt,
  159.             desc, maplist(string v, val, ``( `item(`id(v), v) ) )
  160.             ));
  161.         }
  162.     }
  163.     else if (value == "select") {
  164.         if ( type == "radio" || type == "check") {
  165.         new = `Left(`HBox (
  166.             enable_widget,
  167.             `ComboBox (`id (key), def_opt, "",
  168.                 maplist(string v, val, ``( `item(`id(v), v) ) )
  169.                 )
  170.                ));
  171.         }
  172.         else  {
  173.             new = `Left(`ComboBox (`id (key), add(def_opt, `editable), desc,
  174.             maplist(string v, val, ``( `item(`id(v), v) ) )
  175.             ));
  176.         }
  177.     }
  178.     else if (value == "selectdevice") {
  179.         // FIXME right now this type visualization is just a copy of the
  180.         // "select" type code
  181.         // Idea: add some radio buttons in a rb-group: "Identify by:"
  182.         // <RB> Name <RB> UUID <RB> Label <RB> id <RB> path <RB> EDD
  183.         // and change the list (string representation of devices)
  184.         // dynamically due to the selected identification type. 
  185.         if ( type == "radio" || type == "check") {
  186.         new = `Left(`HBox (
  187.             enable_widget,
  188.             `ComboBox (`id (key), def_opt, "",
  189.                 maplist(string v, val, ``( `item(`id(v), v) ) )
  190.                 )
  191.                ));
  192.         }
  193.         else  {
  194.             new = `Left(`ComboBox (`id (key), add(def_opt, `editable), desc,
  195.             maplist(string v, val, ``( `item(`id(v), v) ) )
  196.             ));
  197.         }
  198.     }
  199.     else if (value == "int") {
  200.         // integer field
  201.         if ( type == "radio" || type == "check") {
  202.         new = `Left(`HBox (
  203.             enable_widget,
  204.                 `IntField (`id (key), "",
  205.                  tointeger(val[0]:"0"),    // min
  206.                  tointeger(val[1]:"1000"), // max
  207.                   tointeger(defval)      // default
  208.             )
  209.             ));
  210.         }
  211.         else {
  212.             new = `IntField (`id (key), desc,
  213.                 tointeger(val[0]:"0"),    // min
  214.                 tointeger(val[1]:"1000"), // max
  215.                  tointeger(defval)          // default
  216.             );
  217.         }
  218.     }
  219.     else { 
  220.         y2error("Unknown option type %1 for %2. Ignored\n", value, key);
  221.         continue;
  222.     }
  223.     if (new == nil) {
  224.         y2error("Could not create widget for option %1. Ignored\n", key);
  225.         continue;
  226.     }
  227.  
  228.     __events = add(__events, key); 
  229.     if ( type == "radio" || type == "check")
  230.         __events = add(__events, key_e); 
  231.  
  232.     option_term = add(option_term, new);    
  233.     help = help + generic_Help(key);
  234.     });
  235.  
  236.     option_term = add(option_term, `VSpacing (0.4));
  237.  
  238.     return $[ "term":option_term, "events":__events, "help":help ];
  239. }
  240.  
  241.  
  242. void generic_Init (
  243.     string widget,
  244.     map<string,any>options,
  245.     map<string,any>data
  246. ) {
  247.     foreach (string key, any value, options, {
  248.     list<string> val = splitstring((string)value, ":");
  249.     value = val[0]:"undef";
  250.     string key_e = key + "_enabled";
  251.     boolean enabled_exists = UI::WidgetExists(`id(key_e));
  252.  
  253.     if (contains(["multi", "select", "selectdevice"],
  254.              (string)value)) {
  255.         val[0] = nil; val[1] = nil; val[2] = nil;
  256.         val = filter(string v, val, ``(v!=nil) );
  257.         // add current value to list if needed
  258.         if (!contains(val, (string)data[key]:"")) {
  259.             val = add(val, (string)data[key]:"");
  260.         }            
  261.         // update list of possible selections
  262.         UI::ChangeWidget (`id (key), `Items,
  263.             maplist(string v, val, ``( `item(`id(v), v ) ))
  264.         );
  265.     }
  266.  
  267.     if (!haskey (data, key)) {
  268.         if (enabled_exists) {
  269.         UI::ChangeWidget (`id (key_e), `Value, false);
  270.         }
  271.         continue;
  272.     }
  273.  
  274.     if (enabled_exists)
  275.         UI::ChangeWidget (`id (key_e), `Value, true);
  276.  
  277.     if (value == "bool") {
  278.         UI::ChangeWidget (`id (key), `Value,
  279.         data[key]:"" == "true" ? true : false);
  280.     }
  281.     else if (contains(["string", "path", "select", "selectdevice"],
  282.               (string)value)) {
  283.         UI::ChangeWidget (`id (key), `Value, data[key]:"");
  284.     }
  285.     else if (value == "password") {
  286.         UI::ChangeWidget (`id (key + "_pw1"), `Value, "**********");
  287.         UI::ChangeWidget (`id (key + "_pw2"), `Value, "**********");
  288.     }
  289.     else if (value == "multi") {
  290.         list<string> selections = maplist(string s,
  291.         splitstring(data[key]:"", ","),
  292.         { return substring(s,0,1)==" " ? substring(s,1) : s; }
  293.         );
  294.         UI::ChangeWidget (`id (key), `SelectedItems, selections);
  295.     }
  296.     else if (value == "int") {
  297.         UI::ChangeWidget (`id (key), `Value, tointeger(data[key]:"0"));
  298.     }
  299.     });
  300. }
  301.  
  302.  
  303. /**
  304.  * Generic store function of a generic widget
  305.  * @param widget string widget key
  306.  * @param event map event that caused the operation
  307.  * @param options map names of keys to store with storeData() from widgets with same name
  308.  * @param storeData function storage function that takes a key/value pair
  309.  */
  310. void generic_Store(
  311.     string widget,
  312.     map event,
  313.     map<string,any>options,
  314.     void(string, string)storeData
  315. ) {
  316.     foreach (string key, any value, options, {
  317.     list val = splitstring((string)value, ":");
  318.     value = val[0]:"undef";
  319.  
  320.     string newval = "";
  321.  
  322.     // if widget for this key is disabled, delete the key in globals
  323.     if (UI::WidgetExists(`id(key + "_enabled")) &&
  324.         (boolean)UI::QueryWidget(`id(key + "_enabled"), `Value) == false)
  325.     {
  326.         storeData(key, nil);
  327.         continue;
  328.     }
  329.  
  330.     if (value == "multi") {
  331.         newval = mergestring(
  332.         (list<string>) UI::QueryWidget(`id(key), `SelectedItems),
  333.         ", "
  334.         );
  335.     }
  336.     else if (value == "password") {
  337.         string password = (string)UI::QueryWidget (`id (key + "_pw1"), `Value);
  338.         if (password == "**********") {
  339.             // do not do anything on unchanged value
  340.             continue;
  341.         }
  342.         if (password == "") {
  343.             newval = nil;
  344.         }
  345.         else {
  346.             string(string) f = (string(string))
  347.           BootCommon::current_bootloader_attribs["update_passwd"]:nil;
  348.         newval = f (password);
  349.         }
  350.     }
  351.     else {
  352.         newval = sformat("%1", UI::QueryWidget (`id(key), `Value));
  353.     }
  354.  
  355.     // if widget type of generic widget is known, simply store the value of
  356.     // the widget
  357.     if (contains(["bool", "int", "multi", "string", "path", "select",
  358.               "selectdevice", "password"], (string)value))
  359.     {
  360.         storeData(key, newval);
  361.     }
  362.     });
  363. }
  364.  
  365.  
  366. boolean generic_Validate(
  367.     string widget,
  368.     map event,
  369.     map<string,any>options,
  370.     void(string, string)storeData
  371. ) {
  372.     foreach (string key, any value, options, {
  373.     list val = splitstring((string)value, ":");
  374.     value = val[0]:"undef";
  375.  
  376.     string newval = "";
  377.  
  378.     if (UI::WidgetExists(`id(key + "_enabled")) &&
  379.         (boolean)UI::QueryWidget(`id(key + "_enabled"), `Value) == false)
  380.     {
  381.         // Widget not enabled, so this is always valid
  382.         continue;
  383.     }
  384.  
  385.     if (value == "password") {
  386.         if (UI::QueryWidget (`id (key + "_pw1"), `Value) !=
  387.         UI::QueryWidget (`id (key + "_pw2"), `Value))
  388.         {
  389.             passwdMissmatchPopup ();
  390.             return false;
  391.         }
  392.     }
  393.     });
  394.     return true;
  395. }
  396.  
  397.  
  398. integer __last_event = -1;
  399.  
  400. symbol generic_Handle (string key, map event) {
  401.     string id = event["ID"]:"";
  402.     string reason = event["EventReason"]:"";
  403.  
  404.     // for unknown reason some event get duplicated so lets filter them out
  405.     if (event["EventSerialNo"]:-1 == __last_event)
  406.     return nil;
  407.  
  408.     __last_event = event["EventSerialNo"]:-1;
  409.  
  410.     if (substring(id, size(id)-size("_browse")) == "_browse") {
  411.     string base_id = substring(id, 0, size(id)-size("_browse"));
  412.     string file_name = UI::AskForExistingFile(
  413.         (string)UI::QueryWidget(`id(base_id), `Value), "*",
  414.         "Select a file name");
  415.     if (file_name != "" && file_name != nil) {
  416.         UI::ChangeWidget(`id(base_id), `Value, file_name);
  417.         reason = "ValueChanged";
  418.         id = base_id;
  419.     }
  420.     }
  421.  
  422.     if (reason == "ValueChanged") {
  423.     term id_e = `id(id + "_enabled");
  424.     if (UI::WidgetExists(id_e)) {
  425.         UI::ChangeWidget(id_e, `Value, true);
  426.     }
  427.     }
  428.  
  429.     return nil;
  430. }
  431.  
  432. } // include end
  433.  
  434. /*
  435.  * Local variables:
  436.  *     mode: ycp
  437.  *     mode: font-lock
  438.  *     mode: auto-fill
  439.  *     indent-level: 4
  440.  *     fill-column: 78
  441.  * End:
  442.  */
  443.