1 /** @file 2 implements menubar interface functions. 3 4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include "EditMenuBar.h" 16 #include "UefiShellDebug1CommandsLib.h" 17 #include "EditStatusBar.h" 18 19 EDITOR_MENU_ITEM *MenuItems; 20 MENU_ITEM_FUNCTION *ControlBasedMenuFunctions; 21 UINTN NumItems; 22 23 /** 24 Cleanup function for a menu bar. frees all allocated memory. 25 **/ 26 VOID 27 EFIAPI 28 MenuBarCleanup ( 29 VOID 30 ) 31 { 32 SHELL_FREE_NON_NULL(MenuItems); 33 } 34 35 /** 36 Initialize the menu bar with the specified items. 37 38 @param[in] Items The items to display and their functions. 39 40 @retval EFI_SUCCESS The initialization was correct. 41 @retval EFI_OUT_OF_RESOURCES A memory allocation failed. 42 **/ 43 EFI_STATUS 44 EFIAPI 45 MenuBarInit ( 46 IN CONST EDITOR_MENU_ITEM *Items 47 ) 48 { 49 CONST EDITOR_MENU_ITEM *ItemsWalker; 50 51 for (NumItems = 0, ItemsWalker = Items ; ItemsWalker != NULL && ItemsWalker->Function != NULL ; ItemsWalker++,NumItems++); 52 53 MenuItems = AllocateZeroPool((NumItems+1) * sizeof(EDITOR_MENU_ITEM)); 54 if (MenuItems == NULL) { 55 return EFI_OUT_OF_RESOURCES; 56 } 57 CopyMem(MenuItems, Items, (NumItems+1) * sizeof(EDITOR_MENU_ITEM)); 58 return EFI_SUCCESS; 59 } 60 61 /** 62 Initialize the control hot-key with the specified items. 63 64 @param[in] Items The hot-key functions. 65 66 @retval EFI_SUCCESS The initialization was correct. 67 **/ 68 EFI_STATUS 69 EFIAPI 70 ControlHotKeyInit ( 71 IN MENU_ITEM_FUNCTION *Items 72 ) 73 { 74 ControlBasedMenuFunctions = Items; 75 return EFI_SUCCESS; 76 } 77 /** 78 Refresh function for the menu bar. 79 80 @param[in] LastRow The last printable row. 81 @param[in] LastCol The last printable column. 82 83 @retval EFI_SUCCESS The refresh was successful. 84 **/ 85 EFI_STATUS 86 EFIAPI 87 MenuBarRefresh ( 88 IN CONST UINTN LastRow, 89 IN CONST UINTN LastCol 90 ) 91 { 92 EDITOR_MENU_ITEM *Item; 93 UINTN Col; 94 UINTN Row; 95 UINTN Width; 96 CHAR16 *NameString; 97 CHAR16 *FunctionKeyString; 98 99 // 100 // variable initialization 101 // 102 Col = 1; 103 Row = (LastRow - 2); 104 105 // 106 // clear menu bar rows 107 // 108 EditorClearLine (LastRow - 2, LastCol, LastRow); 109 EditorClearLine (LastRow - 1, LastCol, LastRow); 110 EditorClearLine (LastRow , LastCol, LastRow); 111 112 113 // 114 // print out the menu items 115 // 116 for (Item = MenuItems; Item != NULL && Item->Function != NULL; Item++) { 117 118 119 NameString = HiiGetString(gShellDebug1HiiHandle, Item->NameToken, NULL); 120 121 122 Width = MAX ((StrLen (NameString) + 6), 20); 123 if (((Col + Width) > LastCol)) { 124 Row++; 125 Col = 1; 126 } 127 128 FunctionKeyString = HiiGetString(gShellDebug1HiiHandle, Item->FunctionKeyToken, NULL); 129 130 ShellPrintEx ((INT32)(Col) - 1, (INT32)(Row) - 1, L"%E%s%N %H%s%N ", FunctionKeyString, NameString); 131 132 FreePool (NameString); 133 FreePool (FunctionKeyString); 134 Col += Width; 135 } 136 137 return EFI_SUCCESS; 138 } 139 140 /** 141 Function to dispatch the correct function based on a function key (F1...) 142 143 @param[in] Key The pressed key. 144 145 @retval EFI_NOT_FOUND The key was not a valid function key 146 (an error was sent to the status bar). 147 @return The return value from the called dispatch function. 148 **/ 149 EFI_STATUS 150 EFIAPI 151 MenuBarDispatchFunctionKey ( 152 IN CONST EFI_INPUT_KEY *Key 153 ) 154 { 155 UINTN Index; 156 157 Index = Key->ScanCode - SCAN_F1; 158 159 // 160 // check whether in range 161 // 162 if (Index > (NumItems - 1)) { 163 StatusBarSetStatusString (L"Unknown Command"); 164 return EFI_SUCCESS; 165 } 166 167 return (MenuItems[Index].Function ()); 168 } 169 170 /** 171 Function to dispatch the correct function based on a control-based key (ctrl+o...) 172 173 @param[in] Key The pressed key. 174 175 @retval EFI_NOT_FOUND The key was not a valid control-based key 176 (an error was sent to the status bar). 177 @return EFI_SUCCESS. 178 **/ 179 EFI_STATUS 180 EFIAPI 181 MenuBarDispatchControlHotKey ( 182 IN CONST EFI_INPUT_KEY *Key 183 ) 184 { 185 186 if ((SCAN_CONTROL_Z < Key->UnicodeChar) 187 ||(NULL == ControlBasedMenuFunctions[Key->UnicodeChar])) 188 { 189 return EFI_NOT_FOUND; 190 } 191 192 ControlBasedMenuFunctions[Key->UnicodeChar](); 193 return EFI_SUCCESS; 194 } 195 196 197