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 / modules / CWMTab.ycp < prev    next >
Text File  |  2006-11-29  |  9KB  |  334 lines

  1. /**
  2.  * File:    modules/CWMTab.ycp
  3.  * Package:    Common widget manipulation
  4.  * Summary:    Routines for tab widget handling
  5.  * Authors:    Jiri Srain <jsrain@suse.cz>
  6.  *
  7.  * $Id: CWMTab.ycp 26967 2006-01-11 16:14:51Z mvidner $
  8.  *
  9.  */
  10.  
  11. {
  12.  
  13. module "CWMTab";
  14. textdomain "base";
  15.  
  16. import "CWM";
  17. import "Wizard";
  18.  
  19.  
  20. // local constants
  21.  
  22. /**
  23.  * Empty tab (just to be used as fallback constant)
  24.  */
  25. const term empty_tab = `VBox (`VStretch (), `HStretch ());
  26.  
  27. /**
  28.  * Fallback label for a tab if no is defined
  29.  */
  30. const string default_tab_header = _("Tab");
  31.  
  32. // local variables
  33.  
  34. /**
  35.  * ID of the currently displayed tab
  36.  */
  37. string current_tab_id = nil;
  38.  
  39. /**
  40.  * ID of previously selected tab
  41.  */
  42. string previous_tab_id = nil;
  43.  
  44. /**
  45.  * description map of the currently selected tab
  46.  */
  47. map<string,any> current_tab_map = $[];
  48.  
  49. /**
  50.  * description map of the currently selected tab
  51.  */
  52. map<string,any> previous_tab_map = $[];
  53.  
  54. // local functions
  55.  
  56. /**
  57.  * Initialize the widgets in the tab
  58.  * @param tab a map describing the tab
  59.  */
  60. define void TabInit (map<string,any> tab) {
  61.     list<map<string,any> > widgets = tab["widgets"]:[];
  62.     CWM::initWidgets (widgets);
  63. }
  64.  
  65. /**
  66.  * Clean up the widgets in the tab
  67.  * @param tab a map describing the tab
  68.  */
  69. define void TabCleanup (map<string,any> tab) {
  70.     list<map<string,any> > widgets = tab["widgets"]:[];
  71.     CWM::cleanupWidgets (widgets);
  72. }
  73.  
  74. /**
  75.  * Handle events on the widgets inside the tab
  76.  * @param tab a map describing the tab
  77.  * @param event map event that caused the event handling
  78.  * @return symbol for wizard sequencer or nil
  79.  */
  80. define symbol TabHandle (map<string,any> tab, map event) {
  81.     list<map<string,any> > widgets = tab["widgets"]:[];
  82.     return CWM::handleWidgets (widgets, event);
  83. }
  84.  
  85. /**
  86.  * Store settings of all widgets inside the tab
  87.  * @param tab a map describing the tab
  88.  * @param event map event that caused the saving process
  89.  */
  90. define void TabStore (map<string,any> tab, map event) {
  91.     list<map<string,any> > widgets = tab["widgets"]:[];
  92.     return CWM::saveWidgets (widgets, event);
  93. }
  94.  
  95. /**
  96.  * Validate settings of all widgets inside the tab
  97.  * @param tab a map describing the tab
  98.  * @param event map event that caused the validation process
  99.  * @return boolean true if validation succeeded
  100.  */
  101. define boolean TabValidate (map<string,any> tab, map event) {
  102.     list<map<string,any> > widgets = tab["widgets"]:[];
  103.     return CWM::validateWidgets (widgets, event);
  104. }
  105.  
  106. /**
  107.  * Redraw the whole tab
  108.  * @param tab a map describing the tab
  109.  */
  110. define void RedrawTab (map<string,any> tab) {
  111.     term contents = tab["contents"]:empty_tab;
  112.     UI::ReplaceWidget (`_cwm_tab_contents_rp, contents);
  113. }
  114.  
  115. /**
  116.  * Redraw the part of the help related to the tab widget
  117.  * @param widget a map of the tab widget
  118.  * @param tab a map describing the tab
  119.  */
  120. define void RedrawHelp (map<string,any> widget, map<string,any> tab) {
  121.     string help = widget["tab_help"]:"" + tab["help"]:"";
  122.     CWM::ReplaceWidgetHelp (widget["_cwm_key"]:"", help);
  123. }
  124.  
  125. /**
  126.  * Make the currently selected tab be displayed a separate way
  127.  */
  128. define void MarkCurrentTab () {
  129.     if (UI::HasSpecialWidget (`DumbTab))
  130.     {
  131.     UI::ChangeWidget (`id (`_cwm_tab), `CurrentItem, current_tab_id);
  132.     }
  133.     else
  134.     {
  135.     if (previous_tab_id != nil)
  136.     {
  137.         UI::ChangeWidget ( `id (previous_tab_id), `Label,
  138.         previous_tab_map["header"]:default_tab_header);
  139.     }
  140.     UI::ChangeWidget ( `id (current_tab_id), `Label,
  141.         UI::Glyph (`BulletArrowRight) + "  "
  142.         + current_tab_map["header"]:default_tab_header);
  143.     }
  144. }
  145.  
  146. /**
  147.  * Switch to a new tab
  148.  * @param new_tab_it id of the new tab
  149.  * @param widget tab set description
  150.  */
  151. define void InitNewTab (string new_tab_id, map<string,any> widget) {
  152.     previous_tab_id = current_tab_id;
  153.     previous_tab_map = current_tab_map;
  154.     current_tab_id = new_tab_id;
  155.     current_tab_map = widget["tabs", current_tab_id]:$[];
  156.     MarkCurrentTab ();
  157.     RedrawTab (current_tab_map);
  158.     RedrawHelp (widget, current_tab_map);
  159.     TabInit (current_tab_map);
  160.     // allow a handler to enabled/disable widgets before the first real
  161.     // UserInput takes place
  162.     UI::FakeUserInput ($["ID": "_cwm_tab_wakeup"]);
  163. }
  164.  
  165. // public functions
  166.  
  167. /**
  168.  * Init function of the widget
  169.  * @param map widget a widget description map
  170.  * @param key strnig the widget key
  171.  */
  172. global define void Init (map<string,any> widget, string key) {
  173.     InitNewTab (widget["initial_tab"]:"", widget);
  174. }
  175.  
  176. /**
  177.  * Clean up function of the widget
  178.  * @param key the widget key (ignored)
  179.  */
  180. global define void CleanUp (string key) {
  181.     TabCleanup (current_tab_map);
  182. }
  183.  
  184. /**
  185.  * Handle function of the widget
  186.  * @param map widget a widget description map
  187.  * @param key strnig the widget key
  188.  * @param event map event to be handled
  189.  * @return symbol for wizard sequencer or nil
  190.  */
  191. global define symbol Handle (map<string,any> widget, string key, map event) {
  192.     list<string> all_tabs = widget["tabs_list"]:[];
  193.     symbol h_ret = TabHandle (current_tab_map, event);
  194.     if (h_ret != nil)
  195.     return h_ret;
  196.     any ret = event["ID"]:nil;
  197.     if (is (ret, string) && contains (all_tabs, (string)ret) &&
  198.     // At initialization, qt thinks it has switched to the same tab
  199.     // So prevent unnecessary double initialization
  200.     ret != current_tab_id)
  201.     {
  202.     if (! TabValidate (current_tab_map, event))
  203.     {
  204.         MarkCurrentTab ();
  205.         return nil;
  206.     }
  207.     TabStore (current_tab_map, event);
  208.  
  209.     InitNewTab ((string) ret, widget);
  210.     }
  211.     return nil;
  212. }
  213.  
  214. /**
  215.  * Store function of the widget
  216.  * @param key strnig the widget key
  217.  * @param event map that caused widget data storing
  218.  */
  219. global define void Store (string key, map event) {
  220.     TabStore (current_tab_map, event);
  221. }
  222.  
  223. /**
  224.  * Init function of the widget
  225.  * @param key strnig the widget key
  226.  */
  227. global define void InitWrapper (string key) {
  228.     Init (CWM::GetProcessedWidget (), key);
  229. }
  230.  
  231. /**
  232.  * Get the ID of the currently displayed tab
  233.  * @return string the ID of the currently displayed tab
  234.  */
  235. global string CurrentTab () {
  236.     return current_tab_id;
  237. }
  238.  
  239. /**
  240.  * Handle function of the widget
  241.  * @param map widget a widget description map
  242.  * @param key strnig the widget key
  243.  * @param event map event to be handled
  244.  * @return symbol for wizard sequencer or nil
  245.  */
  246. global define symbol HandleWrapper (string key, map event) {
  247.     return Handle (CWM::GetProcessedWidget (), key, event);
  248. }
  249.  
  250. /**
  251.  * Validate function of the widget
  252.  * @param key strnig the widget key
  253.  * @param event map that caused widget data storing
  254.  */
  255. global define boolean Validate (string key, map event) {
  256.     return TabValidate (current_tab_map, event);
  257. }
  258.  
  259. /**
  260.  * Get the widget description map
  261.  * @param tab_order a list of the IDs of the tabs
  262.  * @param tabs a map of all tabs (key is tab ID, value is a map describing
  263.  *  the tab
  264.  * @param initial_tab string the tab tha will be displayed as the first
  265.  * @param widget_descr description map of all widgets that are present
  266.  *  in any of the tabs
  267.  * @param tab_help strign general help to the tab widget
  268.  * @return map the widget description map
  269.  */
  270. global define map<string,any> CreateWidget (map settings) {
  271.     list<string> tab_order = settings["tab_order"]:[];
  272.     map<string,map<string,any> > tabs = settings["tabs"]:$[];
  273.     string initial_tab = settings["initial_tab"]:"";
  274.     map<string,map<string,any> > widget_descr = settings["widget_descr"]:$[];
  275.     string tab_help = settings["tab_help"]:"";
  276.  
  277.     term widget = nil;
  278.     term rp = `ReplacePoint (`id (`_cwm_tab_contents_rp), empty_tab);
  279.  
  280.     // widget
  281.     if (UI::HasSpecialWidget (`DumbTab))
  282.     {
  283.     list<term> panes = maplist (string t, tab_order, {
  284.         string label = tabs[t, "header"]:default_tab_header;
  285.         return `item (`id (t), label, t == initial_tab);
  286.     });
  287.     widget = `DumbTab (`id (`_cwm_tab), panes, rp);
  288.     }
  289.     else
  290.     {
  291.     term tabbar = `HBox ();
  292.     foreach (string t, tab_order, {
  293.         string label = tabs[t, "header"]:default_tab_header;
  294.         tabbar = add (tabbar, `PushButton (`id (t), label));
  295.     });
  296.     widget = `VBox (`Left(tabbar), `Frame( "", rp));
  297.     }
  298.  
  299.     tabs = mapmap (string k, map<string,any> v, tabs, {
  300.     term contents = v["contents"]:`VBox();
  301.     list<string> widget_names = v["widget_names"]:CWM::StringsOfTerm (contents);
  302.     // second arg wins
  303.     map<any, any> fallback = union (settings["fallback_functions"]:$[], v["fallback_functions"]:$[]);
  304.     list<map <string, any> > w
  305.         = CWM::CreateWidgets (widget_names, widget_descr);
  306.     w = CWM::mergeFunctions (w, fallback);
  307.     string help = CWM::MergeHelps (w);
  308.     contents = CWM::PrepareDialog (contents, w);
  309.  
  310.     v["widgets"] = w;
  311.     v["help"] = help;
  312.     v["contents"] = contents;
  313.     return $[k : v];
  314.     });
  315.  
  316.     return $[
  317.     "widget" : `custom,
  318.     "custom_widget" : widget,
  319.     "init" : InitWrapper,
  320.     "store" : Store,
  321.     "clean_up" : CleanUp,
  322.     "handle" : HandleWrapper,
  323.     "validate_type": `function,
  324.     "validate_function": Validate,
  325.     "initial_tab" : initial_tab,
  326.     "tabs" : tabs,
  327.     "tabs_list" : tab_order,
  328.     "tab_help" : tab_help,
  329.     ];
  330. }
  331.  
  332. // EOF
  333. }
  334.