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 / timezone / dialogs.ycp
Text File  |  2006-11-29  |  13KB  |  486 lines

  1. /**
  2.  * File:
  3.  *    timezone/dialogs.ycp
  4.  *
  5.  * Authors:
  6.  *    Klaus   KΣmpf <kkaempf@suse.de>
  7.  *    Michael Hager <mike@suse.de>
  8.  *    Stefan  Hundhammer <sh@suse.de>
  9.  *    Jiri Suchomel <jsuchome@suse.cz>
  10.  *
  11.  * Summary:
  12.  *    Dialogs for timezone and time configuration.
  13.  *
  14.  * $Id: dialogs.ycp 34195 2006-11-09 11:41:43Z jsuchome $
  15.  */
  16. {
  17.   textdomain "country";
  18.  
  19.   import "Arch";
  20.   import "Label";
  21.   import "Language";
  22.   import "Mode";
  23.   import "Popup";
  24.   import "Stage";
  25.   import "Timezone";
  26.   import "Wizard";
  27.  
  28.   symbol hwclock_s_initial = `none;
  29.  
  30.   define void SetTimezone (symbol hwclock, string timezone, boolean really,
  31.                boolean changed_time)
  32.   {
  33.  
  34.     y2milestone( "SetTimezone hw %1, tz %2 really %3 tchanged %4 initial:%5",
  35.                  hwclock, timezone, really, changed_time, hwclock_s_initial );
  36.  
  37.     // simulate the time change
  38.     if (!really && hwclock != hwclock_s_initial)
  39.     Timezone::diff = (hwclock==`hwclock_utc)?1:-1;
  40.     else
  41.     Timezone::diff = 0;
  42.  
  43.     y2milestone( "SetTimezone diff %1", Timezone::diff );
  44.  
  45.     Timezone::hwclock = (hwclock == `hwclock_utc) ? "-u" : "--localtime";
  46.     Timezone::Set (timezone, really);
  47.  
  48.     // Redisplay date/time.
  49.     //
  50.     UI::ChangeWidget(`id(`date), `Value, Timezone::GetDateTime (really, false));
  51.   };
  52.  
  53.   /**
  54.    * Dialog for setinge system date and time
  55.    */
  56.   define boolean SetTimeDialog() {
  57.  
  58.     // help text
  59.     string htext = _("<p>The current system time and date are displayed. Change them to the correct values and press 
  60. <b>Apply</b>.</p>
  61. ");
  62.  
  63.     map val = Timezone::GetDateTimeMap();
  64.  
  65.     string hour        = val["hour"]:"";
  66.     string minute    = val["minute"]:"";
  67.     string second    = val["second"]:"";
  68.     string day        = val["day"]:"";
  69.     string month    = val["month"]:"";
  70.     string year        = val["year"]:"";
  71.  
  72.     term dateterm    = `VBox (
  73.     `HBox (
  74.         `HSpacing(1),
  75.         // label text, do not change "DD-MM-YYYY"
  76.         `Left (`Label(_("Current Date in DD-MM-YYYY Format")))
  77.     ),
  78.     `HBox (
  79.         `HSpacing(10),
  80.         `TextEntry( `id(`day), `opt(`shrinkable), "", day),
  81.         `HSpacing (),
  82.         `TextEntry( `id(`month), `opt(`shrinkable), "", month),
  83.         `HSpacing (),
  84.         `TextEntry( `id(`year), `opt(`shrinkable), "", year),
  85.         `HSpacing(30)
  86.     )
  87.     );
  88.     term timeterm    = `VBox (
  89.     `HBox (
  90.         `HSpacing (1),
  91.         // label text, do not change "HH:MM:SS"
  92.         `Left (`Label (_("Current Time in HH:MM:SS Format")))
  93.     ),
  94.     `HBox (
  95.         `HSpacing(10),
  96.         `TextEntry (`id(`hour), `opt(`shrinkable), "", hour),
  97.         `HSpacing (),
  98.         `TextEntry (`id(`minute), `opt(`shrinkable), "", minute),
  99.         `HSpacing (),
  100.         `TextEntry (`id(`second), `opt(`shrinkable), "", second),
  101.         `HSpacing(30)
  102.     )
  103.     );
  104.     boolean dt_widgets = false;
  105.     if (UI::HasSpecialWidget (`Date) && UI::HasSpecialWidget (`Time))
  106.     {
  107.     dateterm    = `HBox (
  108.         // label text
  109.         `Date (`id(`date), _("Current Date"),
  110.         sformat ("%1-%2-%3", year, month, day)
  111.         )
  112.     );
  113.     timeterm = `HBox (
  114.         // label text
  115.         `Time (`id(`time), _("Current Time"),
  116.         sformat ("%1:%2:%3", hour, minute, second)
  117.         )
  118.     );
  119.     dt_widgets    = true;
  120.     }
  121.  
  122.     UI::OpenDialog( `opt(`decorated),
  123.     `HBox(
  124.         `HWeight(30, `RichText( htext )),
  125.         `HStretch(),
  126.         `HSpacing(1),
  127.         `HWeight(70,
  128.         `VBox (
  129.             `HBox (`HSpacing(55)),
  130.             // heading text
  131.             `Heading( _("Change System Date and Time") ),
  132.             `VSpacing(2),
  133.             `VStretch(),
  134.             timeterm,
  135.             `VSpacing(),
  136.             `VStretch(),
  137.             dateterm,
  138.             `VSpacing(2),
  139.             `VStretch(),
  140.             `HBox(
  141.                 // button text
  142.             `PushButton(`id(`apply), `opt(`default), _("&Apply")),
  143.             `PushButton(`id(`cancel), Label::CancelButton() )
  144.             ),
  145.             `VSpacing()
  146.         )
  147.         )
  148.     ));
  149.  
  150.  
  151.     if (!dt_widgets)
  152.     {
  153.     foreach (symbol widget, [`hour, `minute, `second, `day, `month, `year],{
  154.         UI::ChangeWidget (`id(widget), `ValidChars, "0123456789");
  155.         UI::ChangeWidget (`id(widget), `InputMaxLength,
  156.         widget == `year ? 4 : 2);
  157.     });
  158.     }
  159.     any ret = `cancel;
  160.     repeat
  161.     {
  162.     ret = UI::UserInput();
  163.     y2debug ("UserInput ret:%1", ret );
  164.     if (ret == `apply)
  165.     {
  166.         if (dt_widgets)
  167.         {
  168.         list datel    = splitstring (
  169.             (string) UI::QueryWidget (`id(`date), `Value), "-");
  170.         year    = datel[0]:"";
  171.         month    = datel[1]:"";
  172.         day    = datel[2]:"";
  173.         list timel    = splitstring (
  174.             (string) UI::QueryWidget (`id(`time), `Value), ":");
  175.         hour    = timel[0]:"";
  176.         minute    = timel[1]:"";
  177.         second    = timel[2]:"";
  178.         }
  179.         else
  180.         {
  181.         hour    = (string) UI::QueryWidget(`id(`hour), `Value );
  182.         minute    = (string) UI::QueryWidget(`id(`minute), `Value );
  183.         second    = (string) UI::QueryWidget(`id(`second), `Value );
  184.         day    = (string) UI::QueryWidget(`id(`day), `Value );
  185.         month    = (string) UI::QueryWidget(`id(`month), `Value );
  186.         year    = (string) UI::QueryWidget(`id(`year), `Value );
  187.         }
  188.         if (!Timezone::CheckTime (hour, minute, second))
  189.         {
  190.         string tmp = sformat( "%1:%2:%3", hour, minute, second );
  191.         // popup text, %1 is entered value
  192.         tmp = sformat( _("Invalid time (HH:MM:SS) %1.
  193. Enter the correct time.
  194. "), tmp );
  195.         Popup::Error( tmp );
  196.         ret = `retry;
  197.         }
  198.         else if( !Timezone::CheckDate( day, month, year ))
  199.         {
  200.         string tmp = sformat( "%1-%2-%3", day, month, year );
  201.         // popup text, %1 is entered value
  202.         tmp = sformat( _("Invalid date (DD-MM-YYYY) %1.
  203. Enter the correct date.
  204. "), tmp );
  205.         Popup::Error( tmp );
  206.         ret = `retry;
  207.         }
  208.         else
  209.         {
  210.         Timezone::SetTime( year, month, day, hour, minute, second );
  211.         }
  212.     }
  213.     }
  214.     until( ret==`apply || ret==`cancel );
  215.     UI::CloseDialog();
  216.     return( ret==`apply );
  217.   };
  218.  
  219.   /**
  220.    * Main dialog for time zone configuration
  221.    * @param args arguments passwd from the called (back/next buttons etc.)
  222.    */
  223.   define symbol TimezoneDialog (map args) {
  224.  
  225.     boolean first_run = args["first_run"]:"no" == "yes";
  226.     // inst_timezone as a part of installation sequence
  227.     if (first_run && Stage::initial ())
  228.     {
  229.     import "Storage";
  230.     if (size (Storage::GetWinPrimPartitions(Storage::GetTargetMap()))>0)
  231.     {
  232.         Timezone::windows_partition = true;
  233.         y2milestone ("windows partition found: assuming local time");
  234.     }
  235.  
  236.     if (Timezone::ProposeLocaltime ())
  237.     {
  238.         Timezone::hwclock = "--localtime";
  239.     }
  240.     }
  241.  
  242.     // get current timezone and clock setting
  243.     //
  244.     boolean changed_time = false;
  245.     string timezone    = Timezone::timezone;
  246.     string timezone_old = timezone;
  247.     string hwclock    = Timezone::hwclock;
  248.  
  249.     y2milestone ( "timezone_old %1", timezone_old );
  250.  
  251.     timezone        = Timezone::UpdateTimezone (timezone);
  252.  
  253.     // Initially set the current timezone to establish a consistent state.
  254.     //
  255.     integer sel = Timezone::Set (timezone, true);
  256.  
  257.     boolean utc_only = Timezone::utc_only ();
  258.     y2milestone( "utc_only %1", utc_only );
  259.  
  260.     Timezone::PushVal();
  261.  
  262.     /* ----------------------------------------------------------------------
  263.      * Build dialog
  264.      * ----------------------------------------------------------------------*/
  265.  
  266.     // Assign system date and time.
  267.     //
  268.     string date = Timezone::GetDateTime(true, false);
  269.  
  270.     // build up timezone selection box
  271.     //
  272.     term timezonesel = `ReplacePoint (`id(`tzsel),
  273.     // title for selection box 'timezone'
  274.     `SelectionBox (`id (`timezone), `opt(`notify), _("Time &Zone")));
  275.  
  276.     term region = `SelectionBox (
  277.     // label text
  278.     `id(`region),`opt(`notify,`immediate), _("&Region"),Timezone::Region());
  279.  
  280.     term settime = `Empty();
  281.  
  282.     if (!Arch::s390 () && !Mode::config ())
  283.     {
  284.     // button text
  285.     settime = `PushButton (`id(`settime), _("Cha&nge..."));
  286.     }
  287.  
  288.     boolean textmode    = Language::GetTextMode ();
  289.  
  290.     term contents = `MarginBox (
  291.     `leftMargin (2), `rightMargin (2), `topMargin (0), `bottomMargin (0.2),
  292.     `VBox (
  293.         `HBox (
  294.         region,
  295.         `HSpacing (),
  296.         timezonesel
  297.         ),
  298.         `VSpacing (0.2),
  299.         `VSquash (`HBox (
  300.         `HWeight (1,
  301.             utc_only ? `Empty () : `VBox (
  302.             `ComboBox (
  303.             `id (`hwclock), `opt(`hstretch, `notify),
  304.                 // combo box label
  305.                 _("&Hardware Clock Set To"),
  306.                 [
  307.                 // ComboBox entry: clock set to local time
  308.                 `item (`id (`hwclock_localtime), _("Local Time"),
  309.                 (hwclock == "--localtime")),
  310.  
  311.                 // ComboBox entry: clock set UTC
  312.                 `item (`id(`hwclock_utc ), _("UTC"),
  313.                 (hwclock == "-u"))
  314.                 ]
  315.             ), textmode ? `Label ("") : `Empty ())
  316.         ),
  317.         `HSpacing (1),
  318.         // frame label
  319.         `HWeight (1, `Frame (_("Time and Date"), `MarginBox (
  320.             `leftMargin (1.2), `rightMargin (1),
  321.             `topMargin (0.2), `bottomMargin (0.2),
  322.             textmode ?
  323.             `VBox (
  324.             `Label (`id(`date), `opt(`outputField,`hstretch), date),
  325.             `Right (settime)
  326.             ) :
  327.             `HBox (
  328.             `Label (`id(`date), `opt(`outputField,`hstretch), date),
  329.             `HStretch(),
  330.             `Right (settime)
  331.             )
  332.         )))
  333.         ))
  334.     )
  335.     );
  336.  
  337.     // help for timezone screen
  338.     string help_text = _("
  339. <p><b><big>Time Zone and Clock Settings</big></b></p>") +
  340.  
  341.     // help for timezone screen
  342.     _("<p>
  343. To select the time zone to use in your system, first select the <b>Region</b>.
  344. In <b>Time Zone</b>, then select the appropriate time zone, country, or 
  345. region from those available.
  346. </p>
  347. ");
  348.  
  349.     if (!utc_only)
  350.     {
  351.     // help for time calculation basis:
  352.     // hardware clock references local time or UTC?
  353.     help_text = help_text + _("<p>
  354. Specify whether your machine is set to local time or UTC in <b>Hardware Clock Set To</b>.
  355. Most PCs that also have other operating systems installed (such as Microsoft
  356. Windows) use local time.
  357. Machines that have only Linux installed are usually
  358. set to Universal Time Coordinated (UTC).
  359. If the hardware clock is set to UTC, your system can switch from standard time
  360. to daylight saving time and back automatically.
  361. </p>
  362. ");
  363.     }
  364.  
  365.  
  366.     // general help trailer
  367.     help_text = help_text + _("<p>
  368. If the current time is not correct, use <b>Change</b> to adjust it.
  369. </p>");
  370.  
  371.     // Screen title for timezone screen
  372.     Wizard::SetContents (_("Clock and Time Zone"), contents,
  373.     help_text, args["enable_back"]:true, args["enable_next"]:true);
  374.  
  375.     Wizard::SetDesktopIcon ("timezone");
  376.     if ( Stage::initial () || Stage::firstboot ())
  377.     {
  378.     Wizard::SetTitleIcon ("yast-timezone");
  379.     }
  380.  
  381.     symbol hwclock_s = (hwclock=="-u") ? `hwclock_utc : `hwclock_localtime;
  382.     symbol hwclock_s_old = hwclock_s;
  383.     hwclock_s_initial = hwclock_s;
  384.  
  385.     UI::ChangeWidget (`id(`region), `CurrentItem, sel);
  386.     UI::ReplaceWidget (`id(`tzsel),
  387.     `SelectionBox ( `id(`timezone), `opt(`notify),
  388.         // label text
  389.         _("Time &Zone"), Timezone::Selection (sel))
  390.     );
  391.     UI::ChangeWidget (`id(`timezone), `CurrentItem, Timezone::timezone);
  392.  
  393.     UI::SetFocus (`id(`region));
  394.  
  395.     symbol ret = nil;
  396.  
  397.     repeat
  398.     {
  399.     ret = (symbol) Wizard::UserInput();
  400.  
  401.     y2debug( "ret %1", ret );
  402.  
  403.     if (!Mode::config () && ret == `abort && Popup::ConfirmAbort(`painless))
  404.     {
  405.         break;
  406.     }
  407.     if (ret == `region)
  408.     {
  409.         integer num = (integer)UI::QueryWidget( `id(`region), `CurrentItem);
  410.         y2milestone ("selected region %1", num);
  411.         UI::ReplaceWidget (`id(`tzsel),
  412.         `SelectionBox ( `id(`timezone), `opt(`notify),
  413.             // label text
  414.             _("Time &Zone"), Timezone::Selection (num))
  415.         );
  416.         if (num == sel)
  417.         {
  418.         UI::ChangeWidget (`id(`timezone), `CurrentItem, timezone);
  419.         }
  420.     }
  421.     else if (ret == `settime)
  422.     {
  423.         if (SetTimeDialog())
  424.         {
  425.         Timezone::diff = 0;
  426.         UI::ChangeWidget(`id(`date), `Value,
  427.             Timezone::GetDateTime (false, false));
  428.         changed_time = true;
  429.         }
  430.     }
  431.     else if (ret == `next || ret == `timezone || ret == `hwclock)
  432.     {
  433.         // Get current settings.
  434.         // UTC vs. localtime, only if needed
  435.         //
  436.         hwclock_s = `hwclock_utc;
  437.         if (!utc_only)
  438.         {
  439.         hwclock_s = (symbol)UI::QueryWidget( `id(`hwclock), `Value );
  440.         }
  441.         if (ret == `timezone)
  442.         {
  443.         sel = (integer)UI::QueryWidget( `id(`region), `CurrentItem );
  444.         }
  445.  
  446.         timezone = (string)UI::QueryWidget( `id(`timezone ), `CurrentItem );
  447.  
  448.         if (timezone == nil || size(timezone) == 0)
  449.         {
  450.             // popup text
  451.         Popup::Error( _("Select a valid time zone.") );
  452.         ret = `again;
  453.         timezone = timezone_old;
  454.         }
  455.         y2milestone ("timezone %1 ret %2", timezone, ret);
  456.  
  457.         if (timezone != timezone_old || hwclock_s != hwclock_s_old || ret == `next)
  458.         {
  459.         if (timezone != timezone_old)
  460.         {
  461.             changed_time = true;
  462.         }
  463.         timezone_old    = timezone;
  464.         hwclock_s_old    = hwclock_s;
  465.         SetTimezone (hwclock_s, timezone, ret==`next, changed_time);
  466.         }
  467.  
  468.         if (ret == `next)
  469.         {
  470.         // User wants to keep his changes.
  471.         // Set user_decision flag in timezone module.
  472.         //
  473.         Timezone::user_decision    = true;
  474.         Timezone::user_hwclock    = true;
  475.         }
  476.     }
  477.     } until ( ret == `next || ret == `back || ret == `cancel );
  478.  
  479.     if (ret != `next)
  480.     {
  481.     Timezone::PopVal();
  482.     }
  483.     return ret;
  484.   }
  485. }
  486.