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

  1. /**
  2.  * File:    modules/DialogTree.ycp
  3.  * Package:    Common widget manipulation
  4.  * Summary:    Routines for handling the dialog with tree on the left side
  5.  * Authors:    Jiri Srain <jsrain@suse.cz>
  6.  *
  7.  * $Id: DialogTree.ycp 33164 2006-09-27 08:42:24Z jsrain $
  8.  *
  9.  */
  10.  
  11. {
  12.  
  13.  module "DialogTree";
  14. textdomain "base";
  15.  
  16. import "CWM";
  17. import "Label";
  18. import "Wizard";
  19.  
  20.  
  21. // local data
  22.  
  23. /**
  24.  * Currently selected item in the tree
  25.  */
  26. string selected_screen = nil;
  27.  
  28. /**
  29.  * Previously selected item in the tree
  30.  */
  31. string previous_screen = nil;
  32.  
  33.  
  34. // virtual DialogTree widget
  35.  
  36. /**
  37.  * Init function of virtual DialogTree widget
  38.  * @param key string widget key
  39.  */
  40. define void DialogTreeInit (string key) {
  41.     if (UI::WidgetExists(`id(`wizardTree)))
  42.     {
  43.     UI::ChangeWidget(`id(`wizardTree), `CurrentItem, selected_screen);
  44.     UI::SetFocus (`id (`wizardTree));
  45.     }
  46.     else
  47.     {
  48.     UI::WizardCommand(`SelectTreeItem(selected_screen));
  49.     }
  50. }
  51.  
  52. /**
  53.  * Handle function of virtual DialogTree widget
  54.  * @param key string widget key
  55.  * @param event map event that caused handler call
  56.  * @return symbol for wizard sequencer or nil
  57.  */
  58. define symbol DialogTreeHandle (string key, map event) {
  59.     any ret = event["ID"]:nil;
  60.  
  61.     if (ret == `wizardTree)
  62.     {
  63.     ret = (string)UI::QueryWidget (`id (`wizardTree), `CurrentItem);
  64.     }
  65.     previous_screen = selected_screen;
  66.     selected_screen = (string)ret;
  67.     return `_cwm_internal_tree_handle;
  68. }
  69.  
  70. /**
  71.  * Get the map of the virtal left tree widget
  72.  * @param ids a list of widget ids of all tree items
  73.  * @return map tree of the widget
  74.  */
  75. define map<string,any> GetVirtualDialogTreeWidget (list<string> ids) {
  76.     list handle_events = ids;
  77.     handle_events = add (handle_events, `wizardTree);
  78.     return $[
  79.     "init" : DialogTreeInit,
  80.     "handle_events" : handle_events,
  81.     "handle" : DialogTreeHandle,
  82.     ];
  83. }
  84.  
  85. // internal functions
  86.  
  87. /**
  88.  * Draw the screen related to the particular tree item
  89.  * @param current_screen a map describing the current screen
  90.  * @param widget_descr a map describing all widgets that may be present in the
  91.  *  screen
  92.  * extra_widget a map of the additional widget to be added at the end
  93.  *  of the list of widgets
  94.  * @return a list of preprocessed widgets that appear in this dialog
  95.  */
  96. define list<map<string,any> > DrawScreen (map<string,any> current_screen,
  97.     map<string,map<string,any> > widget_descr, map<string,any> extra_widget)
  98. {
  99.     list<string> widget_names = current_screen["widget_names"]:[];
  100.     term contents = current_screen["contents"]:`VBox ();
  101.     string caption = current_screen["caption"]:"";
  102.  
  103.     list<map<string,any> > w = CWM::CreateWidgets (widget_names, widget_descr);
  104.     string help = CWM::MergeHelps (w);
  105.     contents = CWM::PrepareDialog (contents, w);
  106.     Wizard::SetContents (caption, contents, help, true, true);
  107.  
  108.     // add virtual widget
  109.     w = add (w, extra_widget);
  110.  
  111.     // return widgets of the dialog for further usage
  112.     return w;
  113. }
  114.  
  115. /**
  116.  * Draw the dialog with the flat tree (only single level of the tree entries)
  117.  * @param ids_order a list of IDs in the same order as they are expected to be
  118.  *  in the left menu
  119.  * @param screens map of all screens (key is screen ID, value is screen
  120.  *  description map
  121.  */
  122. global define void ShowFlat (
  123.     list<string> ids_order,
  124.     map<string,map<string,any> > screens
  125. )
  126. {
  127.     Wizard::OpenTreeNextBackDialog();
  128.     list<map> tree = [];
  129.     foreach (string i, ids_order,{
  130.     tree = Wizard::AddTreeItem (tree, "",
  131.         screens[i, "tree_item_label"]:screens[i, "caption"]:"" ,i);
  132.     });
  133.     Wizard::CreateTree(tree, "");
  134. }
  135.  
  136. /**
  137.  * Draw the dialog with multi-level tree
  138.  * @param tree_handler a callback to a function that creates the tree using
  139.  *  Wizard::AddTreeItem and returns the resulting tree
  140.  */
  141. global define void ShowTree (list<map>() tree_handler) {
  142.     Wizard::OpenTreeNextBackDialog();
  143.     list<map> tree = tree_handler ();
  144.     Wizard::CreateTree(tree, "");
  145. }
  146.  
  147. /**
  148.  * Adjust buttons at the bottom of the dialog
  149.  * @param buttons a map with keys "abort_button", "back_button" and
  150.  *  "next_button" adn values labels of appropriate buttons
  151.  */
  152. global define void AdjustButtons (map<string,string> buttons) {
  153.     CWM::AdjustButtons (
  154.     buttons["next_button"]:Label::NextButton (),
  155.     buttons["back_button"]:Label::BackButton (),
  156.     buttons["abort_button"]:Label::AbortButton (),
  157.     Label::HelpButton ()
  158.     );
  159. }
  160.  
  161. /**
  162.  * Adjust buttons at the bottom of the dialog
  163.  * @param buttons a map with keys "abort_button", "back_button" and
  164.  *  "next_button" adn values labels of appropriate buttons, other keys
  165.  *  with values of other types are possible
  166.  */
  167. global define void AdjustButtonsAny (map<string,any> buttons) {
  168.     map<string,string> buttons2 = (map<string,string>)filter (string k, any v,
  169.     buttons,
  170.     {
  171.     return issubstring (k, "_button");
  172.     });
  173.     AdjustButtons (buttons2);
  174. }
  175.  
  176. /**
  177.  * Generic function to create dialog and handle it's events.
  178.  * Run the event loop over the dialog with the left tree.
  179.  * @param setttings a map of settings of the dialog
  180.  * <pre>
  181.  * "screens" : map<string,map<string,any>> of all screens
  182.  *             (key is screen ID, value is screen description map)
  183.  * "widget_descr" : map<string,map<string,any>> description map of all widgets
  184.  * "initial_screen" : string the id of the screen that should be displayed
  185.  *                    as the first
  186.  * "fallback" : map<any,any> initialize/save/handle fallbacks if not specified
  187.  *              with the widgets, to be passed to CWM
  188.  * </pre>
  189.  * @return symbol wizard sequencer symbol
  190.  */
  191. global define symbol Run (map<string,any> settings) {
  192.     map<string,map<string,any> > screens = settings["screens"]:$[];
  193.     map<string,map<string,any> > widget_descr = settings["widget_descr"]:$[];
  194.     string initial_screen = settings["initial_screen"]:"";
  195.     map<any, any> functions = settings["functions"]:$[];
  196.  
  197.     if (initial_screen == nil)
  198.     initial_screen = "";
  199.     if (initial_screen == "")
  200.     {
  201.     foreach (string k, map<string,any> v, screens, {
  202.         if (initial_screen == "")
  203.         initial_screen = k;
  204.     });
  205.     }
  206.  
  207.     selected_screen = initial_screen;
  208.     list<string> ids = maplist (string k, map<string,any> v, screens, ``(k));
  209.     map<string,any> extra_widget = GetVirtualDialogTreeWidget (ids);
  210.     list<map<string,any> > w
  211.     = DrawScreen (screens[selected_screen]:$[], widget_descr, extra_widget);
  212.  
  213.     symbol ret = nil;
  214.     while (ret == nil)
  215.     {
  216.     ret = CWM::Run (w, functions);
  217.     // switching scrren, dialog was validated and stored
  218.     if (ret == `_cwm_internal_tree_handle)
  219.     {
  220.         symbol(string) toEval = (symbol(string))
  221.         screens[selected_screen, "init"]:nil;
  222.         symbol tab_init = nil;
  223.         if (toEval != nil)
  224.         tab_init = toEval (selected_screen);
  225.         if (tab_init == nil) // everything OK
  226.         {
  227.         w = DrawScreen (screens[selected_screen]:$[], widget_descr,
  228.             extra_widget);
  229.         ret = nil;
  230.         }
  231.         else if (tab_init == `refuse_display) // do not display this screen
  232.         {
  233.         selected_screen = previous_screen;
  234.         ret = nil;
  235.         }
  236.         else // exit dialog
  237.         {
  238.         ret = tab_init;
  239.         }
  240.     }
  241.     }
  242.     return ret;
  243. }
  244.  
  245. /**
  246.  * Run the event loop over the dialog with the left tree. After finished, run
  247.  *  UI::CloseDialog
  248.  * @param setttings a map of settings of the dialog. See @Run for possible keys
  249.  * @return symbol wizard sequencer symbol
  250.  */
  251. global define symbol RunAndHide (map<string,any> settings) {
  252.     symbol ret = Run (settings);
  253.     UI::CloseDialog ();
  254.     return ret;
  255. }
  256.  
  257. /**
  258.  * Display the dialog and run its event loop
  259.  * @param setttings a map of settings of the dialog
  260.  * <pre>
  261.  * "ids_order" : list<string> of IDs in the same order as they are expected
  262.  *               to be in the left menu. Not used if "tree_creator" is defined
  263.  * "tree_creator" : list<map>() a callback to a function that creates
  264.  *                  the tree using Wizard::AddTreeItem and returns the
  265.  *                  resulting tree
  266.  * "back_button" : string label of the back button (optional)
  267.  * "next_button" : string label of the next button (optional)
  268.  * "abort_button" : string label of the abort button (optional)
  269.  * See @RunAndHide for other possible keys in the map
  270.  * </pre>
  271.  * @return symbol wizard sequencer symbol
  272.  */
  273. global define symbol ShowAndRun (map<string,any> settings) {
  274.     list<string> ids_order = settings["ids_order"]:[];
  275.     map<string,map<string,any> > screens = settings["screens"]:$[];
  276.     list<map>() tree_handler = (list<map>())settings["tree_creator"]:nil;
  277.  
  278.     if (tree_handler != nil)
  279.     {
  280.     ShowTree (tree_handler);
  281.     }
  282.     else
  283.     {
  284.     ShowFlat (ids_order, screens);
  285.     if (settings["initial_screen"]:"" == "")
  286.     {
  287.         find (string s, ids_order, {
  288.         settings["initial_screen"] = s;
  289.         return true;
  290.         });
  291.     }
  292.     }
  293.     AdjustButtonsAny (settings);
  294.     return RunAndHide (settings);
  295. }
  296.  
  297. // EOF
  298. }
  299.