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 / dialogs.ycp < prev    next >
Text File  |  2006-11-29  |  10KB  |  385 lines

  1. /**
  2.  * File:
  3.  *      include/bootloader/routines/ui.ycp
  4.  *
  5.  * Module:
  6.  *      Bootloader installation and configuration
  7.  *
  8.  * Summary:
  9.  *      User interface for bootloader installation/configuration
  10.  *
  11.  * Authors:
  12.  *      Jiri Srain <jsrain@suse.cz>
  13.  *
  14.  * $Id: dialogs.ycp 31102 2006-05-22 16:54:46Z jplack $
  15.  *
  16.  */
  17.  
  18.  
  19. {
  20. textdomain "bootloader";
  21.  
  22. import "BootCommon";
  23. import "CWM";
  24. import "Label";
  25. import "Mode";
  26. import "Popup";
  27. import "Wizard";
  28. import "Bootloader";
  29. import "Stage";
  30.  
  31. include "bootloader/routines/popups.ycp";
  32. include "bootloader/routines/section_widgets.ycp";
  33. include "bootloader/routines/global_widgets.ycp";
  34.  
  35. /**
  36.  * Test for abort.
  37.  * @return true if abort was pressed
  38.  */
  39. boolean testAbort () {
  40.     if (Mode::commandline ())
  41.     return false;
  42.     if (`abort == UI::PollInput ())
  43.     {
  44.     if (! Stage::initial ())
  45.         UI::CloseDialog ();
  46.     return true;
  47.     }
  48.     return false;
  49. }
  50.  
  51. /**
  52.  * Read settings dialog
  53.  * @return `abort if aborted and `next otherwise
  54.  */
  55. symbol ReadDialog() {
  56.     Bootloader::test_abort = testAbort;
  57.     Wizard::RestoreHelp (getInitProgressHelp ());
  58.     boolean ret = Bootloader::Read();
  59.     return ret ? `next : `abort;
  60. }
  61.  
  62. /**
  63.  * Write settings dialog
  64.  * @return `abort if aborted and `next otherwise
  65.  */
  66. symbol WriteDialog() {
  67.     if (! Stage::initial ())
  68.     Bootloader::test_abort = testAbort;
  69.     Wizard::RestoreHelp (getSaveProgressHelp ());
  70.     boolean ret = Bootloader::Write();
  71.     return ret ? `next : `abort;
  72. }
  73.  
  74.  
  75. string return_tab = "sections";
  76.  
  77. /**
  78.  * Run dialog for kernel section editation
  79.  * @return symbol for wizard sequencer
  80.  */
  81. symbol MainDialog () {
  82.     y2milestone ("Running Main Dialog");
  83.  
  84.     term contents = `VBox (
  85.     "tab",
  86.     `Right ("adv_button")
  87.     );
  88.  
  89.     list<string> widget_names = ["tab", "adv_button"];
  90.     map<string,map<string,any> > widget_descr = (map<string,map<string,any> >)
  91.     union (CommonGlobalWidgets (), Bootloader::blWidgetMaps ());
  92.     widget_descr["tab"] = CWMTab::CreateWidget($[
  93.     "tab_order": ["sections", "installation"],
  94.     "tabs": TabsDescr (),
  95.     "widget_descr": widget_descr,
  96.     "initial_tab" : return_tab,
  97.     ]);
  98.     widget_descr["tab", "no_help"] = "";
  99.  
  100.     // dialog caption
  101.     string caption = _("Boot Loader Settings");
  102.     symbol ret = CWM::ShowAndRun ($[
  103.     "widget_descr" : widget_descr,
  104.     "widget_names" : widget_names,
  105.     "contents" : contents,
  106.     "caption" : caption,
  107.     "back_button" : Label::BackButton (),
  108.     "abort_button" : Label::AbortButton (),
  109.     "next_button" : Label::FinishButton (),
  110.     "fallback_functions" : global_handlers,
  111.     ]);
  112.     if (ret != `back && ret != `abort && ret != `cancel)
  113.     {
  114.     return_tab = CWMTab::CurrentTab ();
  115.     // TODO store current tab here
  116.     }
  117.     return ret;
  118. }
  119.  
  120. /**
  121.  * Run dialog with detailed settings
  122.  * @param type string specification of the type of detail settings
  123.  * @return symbol for wizard sequencer
  124.  */
  125. symbol DetailsDialog (string type) {
  126.     map<string,symbol()> dialogs = Bootloader::blDialogs ();
  127.     if (! haskey (dialogs, type))
  128.     {
  129.     Report::Message (
  130.         // message
  131.         _("There are no options to set for the current boot loader."));
  132.     return `back;
  133.     }
  134.     symbol () dialog = (symbol())dialogs[type]:nil;
  135.     return dialog ();
  136. }
  137.  
  138. /**
  139.  * Run dialog for kernel section editation
  140.  * @return symbol for wizard sequencer
  141.  */
  142. symbol KernelSectionDialog () {
  143.     y2milestone ("Running kernel section dialog");
  144.  
  145.     term contents = `HBox (`HSpacing (2), `VBox (
  146.         `VStretch (),
  147.     // heading
  148.         `Left (`Heading (_("Kernel Section"))),
  149.     `VSpacing (1),
  150.     "name",
  151.         `VStretch (),
  152.     // frame
  153.         `Frame (_("Section Settings"), `HBox (`HSpacing (2), `VBox (
  154.             `VSpacing (1),
  155.         "kernel",
  156.             `VSpacing (1),
  157.         "initrd",
  158.             `VSpacing (1),
  159.             `HBox (
  160.         `HWeight (1, "root"),
  161.         `HWeight (1, "vga")
  162.         ),
  163.             `VSpacing (1),
  164.         "append",
  165.             `VSpacing (1)
  166.         ), `HSpacing (2))),
  167.         `VStretch ()
  168.     ), `HSpacing (2));
  169.  
  170.     list<string> widget_names = ["name", "kernel", "initrd", "root", "vga", "append"];
  171.     map<string,map<string,any> > widget_descr = (map<string,map<string,any> >)
  172.     union (CommonSectionWidgets (), Bootloader::blWidgetMaps ());
  173.    // dialog caption
  174.     string caption = _("Boot Loader Settings: Section Management");
  175.     return CWM::ShowAndRun ($[
  176.     "widget_descr" : widget_descr,
  177.     "widget_names" : widget_names,
  178.     "contents" : contents,
  179.     "caption" : caption,
  180.     "back_button" : Label::BackButton (),
  181.     "abort_button" : Label::AbortButton (),
  182.     "next_button" : Label::OKButton (),
  183.     "fallback_functions" : section_handlers,
  184.     ]);
  185. }
  186.  
  187. /**
  188.  * Run dialog for kernel section editation
  189.  * @return symbol for wizard sequencer
  190.  */
  191. symbol ChainloaderSectionDialog () {
  192.     y2milestone ("Running chainloader section dialog");
  193.  
  194.     term contents = `HBox (`HSpacing (4), `VBox (
  195.     // label
  196.         `Left (`Heading (_("Other System Section"))),
  197.         `VSpacing (2),
  198.     "name",
  199.         `VStretch (),
  200.         // part two - section settings
  201.         `HBox (
  202.     // frame
  203.         `Frame (_("Section Settings"), `HBox (`HSpacing (2), `VBox (
  204.             `VSpacing (2),
  205.             `HBox (
  206.                 `HSpacing (4),
  207.         "chainloader",
  208.                 `HSpacing (4)
  209.             ),
  210.             `VSpacing (2)
  211.         ), `HSpacing (2)))),
  212.         `VStretch ()
  213.     ), `HSpacing (4));
  214.  
  215.     list<string> widget_names = ["name", "chainloader"];
  216.     map<string,map<string,any> > widget_descr = (map<string,map<string,any> >)
  217.     union (CommonSectionWidgets (), Bootloader::blWidgetMaps ());
  218.     // dialog caption
  219.     string caption = _("Boot Loader Settings: Section Management");
  220.     return CWM::ShowAndRun ($[
  221.     "widget_descr" : widget_descr,
  222.     "widget_names" : widget_names,
  223.     "contents" : contents,
  224.     "caption" : caption,
  225.     "back_button" : Label::BackButton (),
  226.     "abort_button" : Label::AbortButton (),
  227.     "next_button" : Label::OKButton (),
  228.     "fallback_functions" : section_handlers,
  229.     ]);
  230. }
  231.  
  232. /**
  233.  * Run dialog for kernel section editation
  234.  * @return symbol for wizard sequencer
  235.  */
  236. symbol AddNewSectionDialog () {
  237.     y2milestone ("Running new section dialog");
  238.  
  239.     term contents = `HBox (`HStretch (), `VBox (
  240.     `VStretch (),
  241.     "section_type",
  242.     `VStretch ()
  243.     ), `HStretch ());
  244.  
  245.     list<string> widget_names = ["section_type"];
  246.     map<string,map<string,any> > widget_descr = (map<string,map<string,any> >)
  247.     union (CommonSectionWidgets (), Bootloader::blWidgetMaps ());
  248.     // dialog caption
  249.     string caption = _("Boot Loader Settings: Section Management");
  250.     return CWM::ShowAndRun ($[
  251.     "widget_descr" : widget_descr,
  252.     "widget_names" : widget_names,
  253.     "contents" : contents,
  254.     "caption" : caption,
  255.     "back_button" : Label::BackButton (),
  256.     "abort_button" : Label::AbortButton (),
  257.     "next_button" : Label::NextButton (),
  258.     ]);
  259. }
  260.  
  261. /**
  262.  * Switch the section type to be edited
  263.  * @return symbol for wizard sequencer to determine which dialog to show
  264.  */
  265. symbol EditSectionSwitch () {
  266.     string type = BootCommon::current_section["type"]:"";
  267.     if (type == "chainloader")
  268.     return `chainloader;
  269.  
  270.     else
  271.     return `kernel;
  272. }
  273.  
  274. /**
  275.  * Store the modified section
  276.  * @return symbol always `next
  277.  */
  278. symbol StoreSection () {
  279.     BootCommon::current_section["__changed"] = true;
  280.     if (BootCommon::current_section["type"]:"" == "xen")
  281.     {
  282.        BootCommon::current_section = (map<string,any>)union (
  283.            $[
  284.                "xen" : BootCommon::UsingXenPae() ? "/boot/xen-pae.gz" : "/boot/xen.gz",
  285.                "xen_append" : "",
  286.            ],
  287.            BootCommon::current_section);
  288.     }
  289.     y2milestone ("Storing section: index:  %1, contents: %2",
  290.     BootCommon::current_section_index,
  291.     BootCommon::current_section);
  292.     if (BootCommon::current_section_index == -1)
  293.     {
  294.     BootCommon::sections
  295.         = add (BootCommon::sections, BootCommon::current_section);
  296.     }
  297.     else
  298.     {
  299.     BootCommon::sections[BootCommon::current_section_index]
  300.         = BootCommon::current_section;
  301.     }
  302.     return `next;
  303. }
  304.  
  305.     /**
  306.       * Run dialog
  307.       * @return symbol for wizard sequencer
  308.       */
  309.     symbol runEditFilesDialog () ``{
  310.     Bootloader::blSave (false, false, false);
  311.     map<string,string> files = BootCommon::GetFilesContents ();
  312.     string defaultv = files["default"]:"";
  313.     files = filter (string k, string v, files, ``(k != "default"));
  314.         list filenames = [];
  315.         foreach (string k, string v, files, ``{
  316.             filenames = add (filenames, k);
  317.         });
  318.     term cb = nil;
  319.     if (size (files) > 1)
  320.         cb = `ComboBox (`id (`filename), `opt (`notify, `hstretch),
  321.         // combobox label
  322.         _("&Filename"), filenames);
  323.     else
  324.         // label. %1 is name of file (eg. /etc/lilo.conf
  325.         cb = `Left (`Label (sformat (_("Filename: %1"), filenames[0]:"")));
  326.  
  327.     term contents = `HBox (`HSpacing (2), `VBox (
  328.             `VSpacing (2),
  329.         cb,
  330.             `VSpacing (2),
  331.             `MultiLineEdit (`id (`file), `opt (`hstretch, `vstretch),
  332.         // multiline edit header
  333.                 _("Fi&le Contents")),
  334.             `VSpacing (2)
  335.     ), `HSpacing (2));
  336.  
  337.     // dialog caption
  338.         string caption = _("Expert Manual Configuration");
  339.         string help = getExpertManualHelp ();
  340.  
  341.         list exits = [`back, `next, `abort, `ok, `apply, `accept];
  342.  
  343.         Wizard::SetContentsButtons (caption, contents, help,
  344.             Label::BackButton (), Label::OKButton ());
  345.  
  346.     Wizard::RestoreBackButton ();
  347.     Wizard::RestoreAbortButton ();
  348.  
  349.     string filename = filenames[0]:"";
  350.     if (defaultv != "")
  351.         filename = defaultv;
  352.     if (size (files) > 1)
  353.         UI::ChangeWidget (`id (`filename), `Value, filename);
  354.     UI::ChangeWidget (`id (`file), `Value, files[filename]:"");
  355.  
  356.         any ret = nil;
  357.         while (ret == nil || ! contains (exits, ret))
  358.         {
  359.             ret = UI::UserInput ();
  360.         if (ret == `filename)
  361.         {
  362.         files[filename] = (string)UI::QueryWidget (`id (`file), `Value);
  363.         filename = (string)UI::QueryWidget (`id (`filename), `Value);
  364.         UI::ChangeWidget (`id (`file), `Value, files[filename]:"");
  365.         }
  366.         if (ret == `next)
  367.         {
  368.         files[filename] = (string)UI::QueryWidget (`id (`file), `Value);
  369.         BootCommon::SetFilesContents (files);
  370.         Bootloader::blRead (false);
  371.         BootCommon::changed = true;
  372.         BootCommon::location_changed = true;
  373.         }
  374.         if (ret == `abort)
  375.         {
  376.         if (! confirmAbortPopup ())
  377.             ret = nil;
  378.         }
  379.         }
  380.         return (symbol)ret;
  381.     }
  382.  
  383.  
  384. }
  385.