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 / idedma / ui.ycp < prev   
Text File  |  2006-11-29  |  10KB  |  420 lines

  1. /**
  2.  * File:
  3.  *   include/idedma/ui.ycp
  4.  *
  5.  * Package:
  6.  *   Configuration of IDE DMA mode
  7.  *
  8.  * Summary:
  9.  *   User interface functions.
  10.  *
  11.  * Authors:
  12.  *   Ladislav Slezak <lslezak@suse.cz>
  13.  *
  14.  * $Id: ui.ycp 23468 2005-05-18 15:14:37Z lslezak $
  15.  *
  16.  * All user interface functions.
  17.  *
  18.  */
  19.  
  20. {
  21.  
  22. textdomain "tune";
  23.  
  24. import "Wizard";
  25. import "Idedma";
  26.  
  27. import "Popup";
  28. import "Label";
  29. import "Sequencer";
  30.  
  31. include "idedma/helps.ycp";
  32.  
  33. /**
  34.  * String with DMA on status text
  35.  * (For translators: translation can be long - text is used in the table
  36.  * in column "Required DMA mode" and "Current DMA mode")
  37.  */
  38. string dma_on_string = _("On");
  39.  
  40. /**
  41.  * String with DMA off status text
  42.  * (For translators: translation can be long - text is used in the table
  43.  * in column "Required DMA mode" and "Current DMA mode")
  44.  */
  45. string dma_off_string = _("Off");
  46.  
  47. /**
  48.  * String with no change of DMA status text
  49.  * (For translators: translation can be long - text is used in the table
  50.  * in column "Required DMA mode" and "Current DMA mode")
  51.  */
  52. string dma_default_string = _("No change");
  53.  
  54.  
  55. map mode_names = $[
  56.     // DMA status is unknown
  57.     ""      : _("Unknown"),
  58.     // do not change DMA setting
  59.     "nochange"    : dma_default_string,
  60.     // DMA is enabled, but mode is unknown
  61.     "on"    : dma_on_string,
  62.     // DMA is disabled
  63.     "off"   : dma_off_string,
  64.  
  65.     "sdma0" : "SW DMA/2.1",
  66.     "sdma1" : "SW DMA/4.2",
  67.     "sdma2" : "SW DMA/8.3",
  68.  
  69.     "mdma0" : "DMA/4.2",
  70.     "mdma1" : "DMA/13.3",
  71.     "mdma2" : "DMA/16",
  72.  
  73.     "udmaS" : "UltraDMA/13",
  74.     "udma0" : "UltraDMA/16",
  75.     "udma1" : "UltraDMA/22",
  76.     "udma2" : "UltraDMA/33",
  77.     "udma3" : "UltraDMA/44",
  78.     "udma4" : "UltraDMA/66",
  79.     "udma5" : "UltraDMA/100",
  80.     "udma6" : "UltraDMA/133"
  81. ];
  82.  
  83.  
  84. /**
  85.  * Return list of items for table widget
  86.  * @return list List of items
  87.  */
  88. define list get_table_items() ``{
  89.     list<map> ide = Idedma::get_ide_devices();
  90.  
  91.     // prepare table items
  92.     list table_items = [];
  93.     integer id = 0;
  94.  
  95.     foreach(map d, ide, ``{
  96.         string mode = d["dma_setting"]:"";
  97.         string dma = Idedma::mode_names[mode]:(Idedma::dma_default_string);
  98.  
  99.         // current DMA mode is unknown
  100.         string current_dma = d["current_dma"]:"";
  101.         current_dma = Idedma::mode_names[current_dma]:_("Unknown");
  102.  
  103.         // device model name is unknown
  104.         string device_name = d["device"]:_("Unknown device");
  105.         // device file name is unknown
  106.         string device = d["dev_name"]:_("Unknown");
  107.  
  108.         // add scsi device name for ide-scsi devices
  109.         if (d["scsi_name"]:nil != nil)
  110.         {
  111.         // device model name is unknown
  112.         device = sformat("%1 (%2)", device, d["scsi_name"]:_("Unknown device"));
  113.         }
  114.  
  115.         // device type (disk, cdrom,...) is unknown
  116.         string device_type = d["device_type"]:_("Unknown type");
  117.  
  118.         table_items = add(table_items, `item(`id(id), current_dma, device_name, device_type, device, dma));
  119.  
  120.         id = id + 1;
  121.     }
  122.     );
  123.  
  124.     return table_items;
  125. }
  126.  
  127. /**
  128.  * Refresh combo widget content for actual selected device in the table
  129.  */
  130. define void refresh_combo() ``{
  131.     // set DMA status for selected IDE device
  132.     integer curr = (integer) UI::QueryWidget(`id(`device_table), `CurrentItem);
  133.  
  134.     if (curr != nil)
  135.     {
  136.     list<map> ide_devs = Idedma::get_ide_devices();
  137.  
  138.     // get device name from the table
  139.     string dn = (string) (ide_devs[curr, "dev_name"]:nil);
  140.  
  141.     // get current setting
  142.     string current = Idedma::selected_mode(dn);
  143.     y2milestone("current(%2): %1", current, dn);
  144.  
  145.     // get list of supported DMA modes for selected device
  146.     list supported_dma_modes = Idedma::supported_dma_modes(dn);
  147.  
  148.     list combo_list = [
  149.         `item(`id(`nochange), _("No Change"), current == "nochange"),
  150.         `item(`id(`off), _("DMA Off"), current == "off"),
  151.         `item(`id(`on), _("DMA On (default mode)"), current == "on"),
  152.     ];
  153.  
  154.     if (contains(supported_dma_modes, "mdma2"))
  155.     {
  156.         combo_list = add(combo_list, `item(`id(`mdma2), "DMA/16", current == "mdma2"));
  157.     }
  158.     if (contains(supported_dma_modes, "udma0"))
  159.     {
  160.         combo_list = add(combo_list, `item(`id(`udma0), "UltraDMA/16", current == "udma0"));
  161.     }
  162.     if (contains(supported_dma_modes, "udma2"))
  163.     {
  164.         combo_list = add(combo_list, `item(`id(`udma2), "UltraDMA/33", current == "udma2"));
  165.     }
  166.     if (contains(supported_dma_modes, "udma4"))
  167.     {
  168.         combo_list = add(combo_list, `item(`id(`udma4), "UltraDMA/66", current == "udma4"));
  169.     }
  170.     if (contains(supported_dma_modes, "udma5"))
  171.     {
  172.         combo_list = add(combo_list, `item(`id(`udma5), "UltraDMA/100", current == "udma5"));
  173.     }
  174.     if (contains(supported_dma_modes, "udma6"))
  175.     {
  176.         combo_list = add(combo_list, `item(`id(`udma6), "UltraDMA/133", current == "udma6"));
  177.     }
  178.  
  179.     y2milestone("combo: %1", combo_list);
  180.  
  181.     UI::ReplaceWidget(`id(`rp), `ComboBox(`id(`dma_combo), `opt(`notify), _("&DMA Mode"), combo_list));
  182.     }
  183.     else
  184.     {
  185.     UI::ReplaceWidget(`id(`rp), `ComboBox(`id(`dma_combo), _("&DMA Mode"), []));
  186.     }
  187. }
  188.  
  189. /**
  190.  * Main DMA configuration dialog
  191.  * @return any Result from UserInput()
  192.  */
  193. define any DmaConfigDialog () ``{
  194.     // dialog header
  195.     string caption = _("IDE DMA Setup");
  196.     boolean changed = false;
  197.     list items = get_table_items();
  198.  
  199.     term contents = `VBox(
  200.             // table header
  201.             `Table(`id(`device_table), `opt(`notify, `immediate),
  202.                 `header(_("Current DMA Mode"), _("Device Name"), _("Type"),
  203.                 _("Device"), _("Required DMA Mode")), items),
  204.             `ReplacePoint(`id(`rp), `Empty()),
  205.             `VSpacing(0.5)
  206.             );
  207.  
  208.     Wizard::SetContents(caption,
  209.     contents,
  210.     DetectedDialogHelp(),
  211.     false, true
  212.     );
  213.  
  214.     // remove Back button - workflow has only one dialog
  215.     Wizard::HideBackButton();
  216.     Wizard::SetNextButton(`next, Label::FinishButton());
  217.  
  218.     // set combo widget content
  219.     refresh_combo();
  220.  
  221.     list<map> ide_devs = Idedma::get_ide_devices();
  222.  
  223.     any ret = nil;
  224.     while (true)
  225.     {
  226.     ret = UI::UserInput();
  227.  
  228.     y2milestone("ui: %1", ret);
  229.  
  230.     if (ret == `dma_combo)
  231.     {
  232.         y2milestone("Value changed");
  233.  
  234.         // set DMA status for selected IDE device
  235.         integer curr = (integer) UI::QueryWidget(`id(`device_table), `CurrentItem);
  236.  
  237.         y2milestone("curr: %1", curr);
  238.  
  239.         if (curr != nil)
  240.         {
  241.         // get device name
  242.         string dn = (string) (ide_devs[curr, "dev_name"]:nil);
  243.         // get current DMA
  244.         string curr_dma = (string) (ide_devs[curr, "current_dma"]:nil);
  245.  
  246.         y2milestone("dn: %1", dn);
  247.  
  248.         if (dn != nil)
  249.         {
  250.             string new_setting = sformat("%1", UI::QueryWidget(`id(`dma_combo), `Value));
  251.  
  252.             if (size(new_setting) > 1 && substring(new_setting, 0, 1) == "`")
  253.             {
  254.             new_setting = substring(new_setting, 1);
  255.             }
  256.             y2debug("ret: %1, curr_dma: %2, new_setting: %3", ret, curr_dma, new_setting);
  257.  
  258.             // enabling DMA on device with currnet DMA off
  259.             if (ret == `dma_combo && curr_dma == "off" && new_setting != "off" && new_setting != "nochange")
  260.             {
  261.             // warning popup message
  262.             Popup::Warning(_("Enabling DMA on some devices can cause\ndata loss or system lock."));
  263.             }
  264.  
  265.             // convert button identification to DMA boolean value
  266.  
  267.             y2milestone(new_setting);
  268.             // set DMA
  269.             Idedma::set_dma(dn, new_setting);
  270.  
  271.             // refresh value in the table
  272.             UI::ChangeWidget(`id(`device_table), `Item(curr, 4), Idedma::mode_names[new_setting]:_("No change"));
  273.         }
  274.         }
  275.     }
  276.     else if (ret == `next || ret == `abort)
  277.     {
  278.         break;
  279.     }
  280.     else if (ret == `device_table)
  281.     {
  282.         // selected item was changed
  283.         refresh_combo();
  284.     }
  285.     else if (ret == `cancel)
  286.     {
  287.         if (changed == true)
  288.         {
  289.         if (Popup::ReallyAbort(true) == false)
  290.         {
  291.             continue;
  292.         }
  293.         }
  294.         ret = `abort;
  295.         break;
  296.     }
  297.     };
  298.  
  299.     return ret;
  300. }
  301.  
  302. /**
  303.  * Main workflow of the idedma configuration
  304.  * @return any Result from WizardSequencer() function
  305.  */
  306. define any MainSequence () ``{
  307.     map aliases =
  308.     $[
  309.         "dmaconfig"    :   ``( DmaConfigDialog () ),
  310.     ];
  311.  
  312.     map sequence = $[
  313.     "ws_start" : "dmaconfig",
  314.     "dmaconfig" :
  315.     $[
  316.         `abort    : `abort,
  317.         `next    : `next,
  318.     ],
  319.     ];
  320.  
  321.     any ret = Sequencer::Run(aliases, sequence);
  322.  
  323.     return ret;
  324. }
  325.  
  326. /**
  327.  * Read settings dialog
  328.  * @return symbol `abort if configuration read failed
  329.  */
  330. define symbol ReadDialog () ``{
  331.     // Set help text
  332.     Wizard::RestoreHelp (ReadDialogHelp ());
  333.  
  334.     // Read the configuration
  335.     boolean was_ok = Idedma::Read();
  336.  
  337.     return ( was_ok? `next : `abort );
  338. }
  339.  
  340. /**
  341.  * Write settings dialog
  342.  * @return symbol `abort if configuration write failed
  343.  */
  344. define symbol WriteDialog () ``{
  345.     // Set help text
  346.     Wizard::RestoreHelp (WriteDialogHelp ());
  347.  
  348.     // Read the configuration
  349.     boolean was_ok = Idedma::Write();
  350.  
  351.     return ( was_ok? `next : `abort );
  352. }
  353.  
  354. /**
  355.  * Whole configuration of DMA
  356.  * @return any Result from WizardSequencer() function
  357.  */
  358. define any IdedmaSequence() ``{
  359.     map aliases =
  360.     $[
  361.         "read"    : [ ``( ReadDialog () ), true ],
  362.         "main"    :   ``( MainSequence () ),
  363.         "write"    : [ ``( WriteDialog () ), true ]
  364.     ];
  365.  
  366.     map sequence = $[
  367.     "ws_start" : "read",
  368.     "read" :
  369.     $[
  370.         `abort    : `abort,
  371.         `next    : "main"
  372.     ],
  373.     "main" :
  374.     $[
  375.         `abort    : `abort,
  376.         `next    : "write"
  377.     ],
  378.     "write" : $[
  379.         `abort    : `abort,
  380.         `next    : `next
  381.     ]
  382.     ];
  383.  
  384.     Wizard::CreateDialog();
  385.     Wizard::SetDesktopIcon("idedma");
  386.  
  387.     any ret = Sequencer::Run(aliases, sequence);
  388.  
  389.     UI::CloseDialog();
  390.     return ret;
  391. }
  392.  
  393. /**
  394.  * Whole configuration of DMA but without reading and writing.
  395.  * For use with autoinstallation.
  396.  * @return any Result from WizardSequencer() function
  397.  */
  398. define any IdedmaAutoSequence () ``{
  399.     // dialog header
  400.     string caption = _("IDE DMA Setup");
  401.     // progress label
  402.     term contents = `Label (_("Initializing ..."));
  403.  
  404.     Wizard::CreateDialog ();
  405.     Wizard::SetDesktopIcon("idedma");
  406.     Wizard::SetContentsButtons ( caption,
  407.                 contents,
  408.                 "",
  409.                 Label::BackButton (),
  410.                 Label::NextButton ());
  411.  
  412.     // Run the main configuration workflow
  413.     any ret = MainSequence ();
  414.  
  415.     UI::CloseDialog ();
  416.     return ret;
  417. }
  418.  
  419. }
  420.