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 / clients / menu.ycp < prev    next >
Text File  |  2006-11-29  |  7KB  |  292 lines

  1. /**
  2.  * File:    clients/menu.ycp
  3.  * Module:    yast2
  4.  * Summary:    NCurses Control Center
  5.  * Authors:    Michal Svec <msvec@suse.cz>
  6.  *
  7.  * $Id: menu.ycp 30245 2006-04-19 13:11:14Z jsuchome $
  8.  *
  9.  * Provides a list of available yast2 modules. This module is inteded for use
  10.  * with ncurses, for X the yast2 control center should be used.
  11.  */
  12.  
  13. {
  14.  
  15. textdomain "base";
  16.  
  17. import "Desktop";
  18. import "Directory";
  19. import "FileUtils";
  20. import "Label";
  21. import "Popup";
  22.  
  23. map Groups = $[];
  24. map Modules = $[];
  25.  
  26. string restart_file    = Directory::vardir + "/restart_menu";
  27.  
  28. /**
  29.  */
  30. define void DisplaySplash() {
  31.     UI::OpenDialog(`opt(`defaultsize), `VBox(
  32.     `VStretch (),
  33.     /* Message shown while loading modules information */
  34.     `Label (_("Loading modules, please wait ...")),
  35.     `VStretch ()
  36.     ));
  37. }
  38.  
  39. /**
  40.  */
  41. define void OpenMenu() {
  42.     UI::OpenDialog(`opt(`defaultsize), `VBox(
  43.     `HBox(
  44.         `HSpacing(1),
  45.         `Frame( "", `VBox(
  46.         `VSpacing(0.4),
  47.         `HBox(
  48.             `HSpacing(2),
  49.             /* Heading for NCurses Control Center */
  50.             `HCenter(`Heading( _("YaST2 Control Center")) ),
  51.             `HSpacing(2)
  52.         ),
  53.         `VSpacing(0.4)
  54.         )),
  55.         `HSpacing(1.5)
  56.     ),
  57.  
  58.     `VSpacing(1.0),
  59.     `HBox(
  60.         `HSpacing(1),
  61.         `HWeight( 30, `ReplacePoint(`id(`groups_rep),
  62.             `SelectionBox(`id(`groups), `opt(`notify, `immediate, `keyEvents), "", [])
  63.         )),
  64.         `HSpacing(1),
  65.         `HWeight( 70, `ReplacePoint( `id(`progs_rep),
  66.             `SelectionBox(`id(`progs), `opt(`notify, `keyEvents), "", [])
  67.         )),
  68.     `HSpacing(1)
  69.     ),
  70.  
  71.     `VSpacing(1.0),
  72.     `HBox(
  73.         `HSpacing(2),
  74.         `Left(`PushButton(`id(`help), `opt(`key_F1), Label::HelpButton())),
  75.         `Right(`PushButton(`id(`quit), `opt(`key_F9), Label::QuitButton())),
  76.         `HSpacing(2)
  77.     ),
  78.     `VSpacing(1)
  79.     ));
  80. }
  81.  
  82. /**
  83.  * @return boolean true if control center is to be resatrted
  84.  */
  85. define boolean Launch(string modul) {
  86.     string function = Modules[modul, "X-SuSE-YaST-Call"]:"";
  87.     list arguments = splitstring(Modules[modul, "X-SuSE-YaST-Argument"]:"", " ");
  88.     y2debug("Calling: %1 (%2)", function, arguments);
  89.  
  90.     if(function != "") {
  91.  
  92.     any ret = WFM::CallFunction (function, arguments);
  93.     y2debug("WFM::CallFunction (%1, %2) returns: %3", function, arguments, ret);
  94.     if ((function == "online_update" && ret == -42) || ret == `restart_menu)
  95.     {
  96.         y2milestone ("yast needs to be restarted - exiting...");
  97.         SCR::Execute (.target.bash, sformat ("touch %1", restart_file));
  98.         return true;
  99.     }
  100.     }
  101.     return false;
  102. }
  103.  
  104. /**
  105.  */
  106. define void ShowNcursesHelp() {
  107.  
  108.     /* NCurses (textmode) Control Center headline */
  109.     string headline = _("Controlling YaST2 ncurses with the Keyboard");
  110.  
  111.     /* NCurses Control Center help 1/ */
  112.     string help = _("<p>1) <i>General</i><br>
  113. Navigate through the dialog elements with [TAB] to go to
  114. the next element and [SHIFT] (or [ALT]) + [TAB] to move backwards.
  115. Select or activate elements with [SPACE] or [ENTER].
  116. Some elements use arrow keys (e.g., to scroll in lists).</p>") +
  117.  
  118.     /* NCurses Control Center help 2/9 */
  119.     _("<p>Buttons are equipped with shortcut keys (the highlighted
  120. letter). Use [ALT] and the letter to activate the button.</p>") +
  121.  
  122.    /* NCurses Control Center help 3/9 */
  123.     _("<p>Press [ESC] to close selection pop-ups (e.g., from
  124. menu buttons) without choosing anything.</p>
  125. ") +
  126.  
  127.     /* NCurses Control Center help 4/9 */
  128.     _("<p>2) <i>Substitution of Keystrokes</i><br>
  129. <p>Because the environment can affect the use of the keyboard,
  130. there is more than one way to navigate the dialog pages.
  131. If [TAB] and [SHIFT] (or [ALT]) + [TAB] do not work,
  132. move focus forward with [CTRL] + [F] and backward with [CTRL] + [B].</p>") +
  133.  
  134.     /* NCurses Control Center help 5/9 */
  135.     _("<p>If [ALT] + [letter] does not work,
  136. try [ESC] + [letter]. Example: [ESC] + [H] for [ALT] + [H].
  137. [ESC] + [TAB] is also a substitute for [ALT] + [TAB].</p>") +
  138.  
  139.     /* NCurses Control Center help 6/9 */
  140.     _("<p>3) <i>Function Keys</i><br>
  141. F keys provide a quick access to main functions.
  142. Press F1 to get the function key bindings for the current dialog.</p>") +
  143.  
  144.     /* NCurses Control Center help 7/9 */
  145.     _("<p>The F keys are usually connected to a certain action:</p>") +
  146.  
  147.     /* NCurses Control Center help 8/9 */
  148.     _("F1  = Help<br>
  149. F2  = Info or Description<br>
  150. F3  = Add<br>
  151. F4  = Edit or Configure<br>
  152. F5  = Delete<br>
  153. F6  = Test<br>
  154. F7  = Expert or Advanced<br>
  155. F8  = Back<br>
  156. F9  = Abort or Cancel<br>
  157. F10 = OK, Next, Finish, or Accept<br>") +
  158.  
  159.     /* NCurses Control Center help 9/9 */
  160.     _("<p>In some environments, all or some
  161. F keys are not available.</p>");
  162.  
  163.     Popup::LongText(headline, `RichText(help), 60, 20);
  164.  
  165. }
  166.  
  167. DisplaySplash();
  168.  
  169. list<string> Values = [
  170.     "Name",
  171.     // not required: "GenericName",
  172.     "X-SuSE-YaST-Argument",
  173.     "X-SuSE-YaST-Call",
  174.     "X-SuSE-YaST-Group",
  175.     "X-SuSE-YaST-SortKey",
  176.     "Hidden",
  177. ];
  178.  
  179. Desktop::Read(Values);
  180. Groups = Desktop::Groups;
  181. Modules = Desktop::Modules;
  182. y2debug("Groups=%1", Groups);
  183. y2debug("Modules=%1", Modules);
  184.  
  185. if (FileUtils::Exists (restart_file))
  186. {
  187.     SCR::Execute (.target.remove, restart_file);
  188. }
  189.  
  190. UI::CloseDialog ();
  191.  
  192. OpenMenu();
  193.  
  194. list<term> GroupList = Desktop::GroupList();
  195. /* GroupList = [`item (`id ("Software"), "Software"), ...] */
  196. UI::ReplaceWidget(`id(`groups_rep), `SelectionBox(`id (`groups), `opt(`notify, `immediate, `keyEvents), "", GroupList));
  197. y2debug("GroupList=%1", GroupList);
  198.  
  199. /* precache groups (#38363) */
  200. list<string> groups = maplist(term gr, GroupList, ``{
  201.     return (string) gr[0,0]:nil;
  202. });
  203. y2debug("groups=%1", groups);
  204.  
  205. map<string,list<term> > modules = listmap(string gr, groups, ``{
  206.     return $[ gr : Desktop::ModuleList(gr) ];
  207. });
  208. y2debug("modules=%1", modules);
  209.  
  210. string first = groups[0]:nil;
  211. y2debug("first=%1", first);
  212.  
  213. /**
  214.  */
  215. define void ReplaceModuleList(string group) {
  216.     // y2debug too costly: y2debug("group=%1", group);
  217.     UI::ReplaceWidget(`id (`progs_rep), `SelectionBox( `id (`progs), `opt (`notify, `keyEvents), "", modules[group]:[]));
  218. }
  219.  
  220. ReplaceModuleList(first);
  221. UI::SetFocus(`id(`groups));
  222.  
  223. while(true) {
  224.  
  225.     map event = UI::WaitForEvent();
  226.     any eventid = event["ID"]:nil;
  227.     // y2debug too constly: y2debug("event=%1", event);
  228.  
  229.     if ( is(eventid, symbol) )
  230.     {
  231.  
  232.     if ( eventid == `groups
  233.          && event["EventReason"]:"" == "SelectionChanged" )
  234.     {
  235.         string id = (string) UI::QueryWidget(`id(`groups), `CurrentItem);
  236.         // ReplaceModuleList(id);
  237.         UI::ReplaceWidget(`id (`progs_rep), `SelectionBox( `id (`progs), `opt (`notify, `keyEvents), "", modules[id]:[]));
  238.         continue;
  239.     }
  240.     else if (  eventid == `progs
  241.           && event["EventReason"]:"" == "Activated" )
  242.     {
  243.         string program = (string) UI::QueryWidget(`id(`progs), `CurrentItem);
  244.         if (Launch(program))
  245.         break;
  246.     }
  247.     else if ( eventid == `groups
  248.           && event["EventReason"]:"" == "Activated" )
  249.     {
  250.         UI::SetFocus ( `id(`progs) );
  251.     }
  252.     else if ( eventid == `help )
  253.     {
  254.         ShowNcursesHelp();
  255.     }
  256.     else if( eventid == `quit || eventid == `cancel)
  257.     {
  258.         break;
  259.     }
  260.     else
  261.     {
  262.         y2warning ( "Event or widget ID not handled: %1", event );
  263.     }
  264.     }
  265.     else if( is(eventid, string) )
  266.     {
  267.     if ( event["FocusWidgetID"]:`none == `groups
  268.           && eventid == "CursorRight" )
  269.     {
  270.         UI::SetFocus ( `id(`progs) );
  271.     }
  272.     else if ( event["FocusWidgetID"]:`none == `progs
  273.           && eventid == "CursorLeft" )
  274.     {
  275.         UI::SetFocus ( `id(`groups) );
  276.     }
  277.     else
  278.     {
  279.         y2warning ( "Event or widget ID not handled: %1", event );
  280.     }
  281.     }
  282.     else
  283.     {
  284.     y2warning ( "Event or widget ID not handled: %1", event );
  285.     }
  286. }
  287.  
  288. UI::CloseDialog ();
  289.  
  290. /* EOF */
  291. }
  292.