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 / routines / section_widgets.ycp < prev    next >
Text File  |  2006-11-29  |  12KB  |  449 lines

  1. /**
  2.  * File:
  3.  *      include/bootloader/routines/widgets.ycp
  4.  *
  5.  * Module:
  6.  *      Bootloader installation and configuration
  7.  *
  8.  * Summary:
  9.  *      Common widgets for being used by several bootloaders
  10.  *
  11.  * Authors:
  12.  *      Jiri Srain <jsrain@suse.cz>
  13.  *
  14.  * $Id: section_widgets.ycp 30358 2006-04-21 17:22:43Z odabrunz $
  15.  *
  16.  */
  17.  
  18.  
  19. {
  20.  
  21. textdomain "bootloader";
  22.  
  23. import "CWM";
  24. import "Initrd";
  25. import "Label";
  26. import "Mode";
  27. import "Storage";
  28. import "StorageDevices";
  29. import "TablePopup";
  30.  
  31. include "bootloader/routines/helps.ycp";
  32.  
  33. /**
  34.  * Init function for widget value
  35.  * @param widget any id of the widget
  36.  */
  37. void SectionOptionInit (string widget) {
  38.     UI::ChangeWidget (`id (widget), `Value,
  39.     BootCommon::current_section[widget]:"");
  40. }
  41.  
  42. /**
  43.  * Store function of a widget
  44.  * @param widget any widget key
  45.  * @param event map event description of event that occured
  46.  */
  47. void SectionOptionStore (string widget, map event) {
  48.     BootCommon::current_section[widget]
  49.     = UI::QueryWidget (`id (widget), `Value);
  50. }
  51.  
  52. /**
  53.  * Map of fallback handlers for events on sections
  54.  */
  55. map<string,any> section_handlers = $[
  56.     "init" : SectionOptionInit,
  57.     "store" : SectionOptionStore,
  58. ];
  59.  
  60.  
  61. /**
  62.  * Validate function of the name widget
  63.  * @param widget any widget key
  64.  * @param event map event description of event that occured
  65.  * @return boolean true if widget settings ok
  66.  */
  67. boolean SectionNameValidate (string widget, map event) {
  68.     list<string> existing = [];
  69.     foreach (map<string,any> s, BootCommon::sections, {
  70.     existing = add (existing, s["name"]:"");
  71.     });
  72.     existing = (list<string>)filter (string l, existing, {
  73.     return l != BootCommon::current_section_name;
  74.     });
  75.     existing = (list<string>)add (existing, "");
  76.     string new = (string)UI::QueryWidget (`id (widget), `Value);
  77.  
  78.     if (contains (existing, new))
  79.     {
  80.     usedNameErrorPopup ();
  81.     return false;
  82.     }
  83.     return true;
  84. }
  85.  
  86. /**
  87.  * Store function of the name widget
  88.  * @param widget any widget key
  89.  * @param event map event description of event that occured
  90.  */
  91. void SectionNameStore (string widget, map event) {
  92.     string value = (string)UI::QueryWidget (`id (widget), `Value);
  93.     if (Bootloader::getLoaderType () != "grub")
  94.     {
  95.     value = BootCommon::replaceAll (value, " ", "_");
  96.     if (size (value) > 15)
  97.         value = substring (value, 0, 15);
  98.     }
  99.     BootCommon::current_section[widget] = value;
  100. }
  101.  
  102. /**
  103.  * Init function of widget
  104.  * @param widget any id of the widget
  105.  */
  106. void KernelImageInit (string widget) {
  107.     list<string> available = (list<string>)SCR::Read (.target.dir, "/boot");
  108.     available = filter (string f, available, {
  109.     return substring (f, 0, 13) == "/boot/vmlinuz";
  110.     });
  111.     if (size (available) == 0)
  112.     available = ["/boot/vmlinuz"];
  113.     UI::ChangeWidget (`id (widget), `Items, available);
  114.     SectionOptionInit (widget);
  115. }
  116.  
  117. /**
  118.  * Handle function of a widget
  119.  * @param widget any widget key
  120.  * @param event map event description of event that occured
  121.  * @return symbol to return to wizard sequencer, or nil
  122.  */
  123. symbol KernelImageHandle (string widget, map event) {
  124.     string current = (string)UI::QueryWidget (`id (widget), `Value);
  125.     // file open popup caption
  126.     current = UI::AskForExistingFile (current, "*", _("Kernel Image"));
  127.     if (current != nil)
  128.     UI::ChangeWidget (`id (widget), `Value, current);
  129.     return nil;
  130. }
  131.  
  132. /**
  133.  * Init function of widget
  134.  * @param widget any id of the widget
  135.  */
  136. void InitrdInit (string widget) {
  137.     list<string> available = (list<string>)SCR::Read (.target.dir, "/boot");
  138.     available = filter (string f, available, {
  139.     return substring (f, 0, 12) == "/boot/initrd";
  140.     });
  141.     if (size (available) == 0)
  142.     available = ["/boot/initrd"];
  143.     UI::ChangeWidget (`id (widget), `Items, available);
  144.     SectionOptionInit (widget);
  145. }
  146.  
  147. /**
  148.  * Handle function of the initrd widget
  149.  * @param widget any widget key
  150.  * @param event map event description of event that occured
  151.  * @return symbol to return to wizard sequencer, or nil
  152.  */
  153. symbol InitrdHandle (string widget, map event) {
  154.     string current = (string)UI::QueryWidget (`id (widget), `Value);
  155.     // file open popup caption
  156.     current = UI::AskForExistingFile (current, "*", _("Initial RAM Disk"));
  157.     if (current != nil)
  158.     UI::ChangeWidget (`id (widget), `Value, current);
  159.     return nil;
  160. }
  161.  
  162.  
  163. /**
  164.  * Init function of the root device widget
  165.  * @param widget any id of the widget
  166.  */
  167. void RootDeviceInit (string widget) {
  168.     y2milestone ("RootDeviceInit: %1", widget);
  169.     list<string> available = BootCommon::getPartitionList (`root);
  170.     // if we mount any of these devices by id, label etc., we add a hint to
  171.     // that effect to the item
  172.     y2milestone ("RootDeviceInit: getHintedPartitionList for %1", available);
  173.     available = BootCommon::getHintedPartitionList (available);
  174.     UI::ChangeWidget (`id (widget), `Items, available);
  175.     UI::ChangeWidget (`id (widget), `Value,
  176.     (BootCommon::getHintedPartitionList ([BootCommon::current_section[widget]:""]))[0]:"");
  177. }
  178.  
  179. /**
  180.  * Store function of the root device widget
  181.  * @param widget any widget key
  182.  * @param event map event description of event that occured
  183.  */
  184. void RootDeviceStore (string widget, map event) {
  185.     BootCommon::current_section[widget]
  186.     = (splitstring( (string)UI::QueryWidget (`id (widget), `Value), " "))[0]:"";
  187. }
  188.  
  189. /**
  190.  * Handle function of the root device widget
  191.  * @param widget any widget key
  192.  * @param event map event description of event that occured
  193.  * @return symbol to return to wizard sequencer, or nil
  194.  */
  195. symbol RootDeviceHandle (string widget, map event) {
  196.     if (event["EventReason"]:nil != "ValueChanged")
  197.     return nil;
  198.     // append hint string when user changed root device
  199.     string current
  200.     = (splitstring( (string)UI::QueryWidget (`id (widget), `Value), " "))[0]:"";
  201.     // check against the list of existing partitions
  202.     list<string> available = BootCommon::getPartitionList (`root);
  203.     if (contains(available, current))
  204.     UI::ChangeWidget (`id (widget), `Value,
  205.         (BootCommon::getHintedPartitionList ([current]))[0]:"");
  206.     return nil;
  207. }
  208.  
  209. /**
  210.  * Init function of widget
  211.  * @param widget any id of the widget
  212.  */
  213. void VgaModeInit (string widget) {
  214.     list<map> vga_modes = Initrd::VgaModes ();
  215.     list items = maplist (map m, vga_modes, {
  216.     return `item (`id (sformat ("%1", m["mode"]:0)),
  217.         // combo box item
  218.         // %1 is X resolution (width) in pixels
  219.         // %2 is Y serolution (height) in pixels
  220.         // %3 is color depth (usually one of 8, 16, 24, 32)
  221.         // %4 is the VGA mode ID (hexadecimal number)
  222.         sformat (_("%1x%2, %3 bits (mode %4)"),
  223.         m["width"]:0, m["height"]:0, m["color"]:0, m["mode"]:0));
  224.     });
  225.     // item of a combo box
  226.     items = prepend (items, `item (`id ("normal"), _("Text Mode")));
  227.     UI::ChangeWidget (`id (widget), `Items, items);
  228.     SectionOptionInit (widget);
  229. }
  230.  
  231. /**
  232.  * Init function of widget
  233.  * @param widget any id of the widget
  234.  */
  235. void ChainloaderInit (string widget) {
  236.     list<string> available = BootCommon::getPartitionList (`boot_other);
  237.     UI::ChangeWidget (`id (widget), `Items, available);
  238.     SectionOptionInit (widget);
  239. }
  240.  
  241. /**
  242.  * Handle function of the chainloader widget
  243.  * @param widget any widget key
  244.  * @param event map event description of event that occured
  245.  * @return symbol to return to wizard sequencer, or nil
  246.  */
  247. symbol ChainloaderHandle (string widget, map event) {
  248.     string current = (string)UI::QueryWidget (`id (widget), `Value);
  249.     // file open popup caption
  250.     current = UI::AskForExistingFile (current, "*", _("Device to Boot"));
  251.     if (current != nil)
  252.     UI::ChangeWidget (`id (widget), `Value, current);
  253.     return nil;
  254. }
  255.  
  256. /**
  257.  * Widget for selecting section type
  258.  * @return term widget
  259.  */
  260. term SectionTypesWidget () {
  261.     integer count = 0;
  262.     term contents = `VBox ();
  263.     if (BootCommon::current_section_name != "")
  264.     {
  265.     contents = add (contents, `Left (`RadioButton (`id ("clone"),
  266.         // radio button
  267.         _("Clone Selected Section"), true)));
  268.     count = count + 1;
  269.     }
  270.     list<string> section_types = ["image", "xen", "chainloader"];
  271.     map<string,string> section_types_descr = $[
  272.     // radio button
  273.     "image" : _("Kernel (Linux)"),
  274.     // radio button
  275.     "xen" : _("Kernel via XEN"),
  276.     // radio button (don't translate 'chainloader')
  277.     "chainloader" : _("Other System (Chainloader)"),
  278.     ];
  279.     foreach (string t, section_types, {
  280.     if (count > 0)
  281.         contents = add (contents, `VSpacing (0.4));
  282.     count = count + 1;
  283.     contents = add (contents, `Left (`RadioButton (`id (t),
  284.         section_types_descr[t]:t, count == 1)));
  285.     });
  286.     // frame
  287.     contents = `Frame (_("Section Type"), `VBox (
  288.     `VSpacing (1),
  289.     `HBox (
  290.         `HSpacing (2),
  291.         `RadioButtonGroup (`id (`sect_type), contents),
  292.         `HSpacing (2)
  293.     ),
  294.     `VSpacing (1)
  295.     ));
  296.     return contents;
  297. }
  298.  
  299. /**
  300.  * Handle function of a widget
  301.  * @param widget string widget key
  302.  * @param event map event description of event that occured
  303.  * @return symbol to return to wizard sequencer, or nil
  304.  */
  305. symbol SectionTypeHandle (string widget, map event) {
  306.     if (event["ID"]:nil != `next)
  307.     return nil;
  308.     string selected = (string)
  309.     UI::QueryWidget (`id (`sect_type), `CurrentButton);
  310.     if (selected != "clone")
  311.     {
  312.     BootCommon::current_section = $[
  313.         "type" : selected,
  314.     ];
  315.     }
  316.     else
  317.     {
  318.     BootCommon::current_section["name"] = "";
  319.     BootCommon::current_section["original_name"] = "";
  320.     BootCommon::current_section["lines_cache_id"] = "";
  321.     }
  322.     y2milestone ("Added section template: %1", BootCommon::current_section);
  323.     return nil;
  324. }
  325.  
  326. /**
  327.  * Cache for CommonSectionWidgets
  328.  */
  329. map<string,map<string,any> > _common_section_widgets = nil;
  330.  
  331. /**
  332.  * Get common widgets for loader sections
  333.  * @return a map describing common loader section related widgets
  334.  */
  335. map<string,map<string,any> > CommonSectionWidgets () {
  336.     if (_common_section_widgets == nil)
  337.     {
  338.       _common_section_widgets = $[
  339.         "name" : $[
  340.         // text entry
  341.         "label" : _("Section &Name"),
  342.         "widget" : `textentry,
  343.         "validate_type" : `function,
  344.         "validate_function" : SectionNameValidate,
  345.         "store" : SectionNameStore,
  346.         "help" : SectionNameHelp (),
  347.         ],
  348.         "kernel" : $[
  349.         "widget" : `custom,
  350.         "custom_widget" : Stage::initial ()
  351.             ? `TextEntry (`id ("kernel"), `opt (`hstretch),
  352.             // text entry
  353.             _("&Kernel"))
  354.             : `HBox (
  355.             `ComboBox (`id ("kernel"), `opt (`editable, `hstretch),
  356.                 // combo box
  357.                 _("&Kernel"),
  358.                 []),
  359.             `VBox (
  360.                 `Label (""),
  361.                 `PushButton (`id (`kernel_browse),
  362.                 Label::BrowseButton ())
  363.             )
  364.             ),
  365.         "init" : KernelImageInit,
  366.         "help" : KernelHelp (),
  367.         "handle" : KernelImageHandle,
  368.         "handle_events" : [ `kernel_browse ],
  369.         ],
  370.         "initrd" : $[
  371.         "widget" : `custom,
  372.         "custom_widget" : Stage::initial ()
  373.             ? `TextEntry (`id ("initrd"), `opt (`hstretch),
  374.             // text entry
  375.             _("&Initial RAM Disk"))
  376.             : `HBox (
  377.             `ComboBox (`id ("initrd"), `opt (`editable, `hstretch),
  378.                 // combo box
  379.                 _("&Initial RAM Disk"),
  380.                 []),
  381.             `VBox (
  382.                 `Label (""),
  383.                 `PushButton (`id (`initrd_browse),
  384.                 Label::BrowseButton ())
  385.             )
  386.             ),
  387.         "init" : InitrdInit,
  388.         "handle" : InitrdHandle,
  389.         "handle_events" : [ `initrd_browse ],
  390.         "help" : InitrdHelp (),
  391.         ],
  392.         "root" : $[
  393.         "widget" : `combobox,
  394.         // combo box
  395.         "label" : _("Root &Device"),
  396.         "opt" : [ `editable, `hstretch, `notify ],
  397.         "init" : RootDeviceInit,
  398.         "handle" : RootDeviceHandle,
  399.         "store" : RootDeviceStore,
  400.         "help" : RootDeviceHelp (),
  401.         ],
  402.         "vga" : $[
  403.         "widget" : `combobox,
  404.         // combo box
  405.         "label" : _("&VGA Mode"),
  406.         "opt" : [ `editable, `hstretch ],
  407.         "init" : VgaModeInit,
  408.         "help" : VgaModeHelp (),
  409.         ],
  410.         "append" : $[
  411.         // text entry
  412.         "label" : _("Other Kernel &Parameters"),
  413.         "widget" : `textentry,
  414.         "help" : AppendHelp (),
  415.         ],
  416.         "chainloader" : $[
  417.         "widget" : `custom,
  418.         "custom_widget" : `HBox (
  419.             `ComboBox (`id ("chainloader"),
  420.                 `opt (`editable, `hstretch),
  421.                 // combo box
  422.                 _("&Device"),
  423.                 []),
  424.             Stage::initial ()
  425.                 ? `VBox ()
  426.                 : `VBox (
  427.                 `Label (""),
  428.                 `PushButton (`id (`chainloader_browse),
  429.                     Label::BrowseButton ())
  430.                 )
  431.             ),
  432.         "init" : ChainloaderInit,
  433.         "handle" : ChainloaderHandle,
  434.         "handle_events" : [ `chainloader_browse ],
  435.         "help" : ChainloaderHelp (),
  436.         ],
  437.         "section_type" : $[
  438.         "widget" : `func,
  439.         "widget_func" : SectionTypesWidget,
  440.         "handle" : SectionTypeHandle,
  441.         "help" : SectionTypeHelp (),
  442.         ],
  443.     ];
  444.     }
  445.     return _common_section_widgets;
  446. }
  447.  
  448. } // include end
  449.