]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h
Refine the save action for the browser.
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / FormDisplay.h
1 /** @file
2 FormDiplay protocol to show Form
3
4 Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials are licensed and made available under
6 the terms and conditions of the BSD License that accompanies this distribution.
7 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 #ifndef __FORM_DISPLAY_H__
16 #define __FORM_DISPLAY_H__
17
18
19 #include <Library/UefiBootServicesTableLib.h>
20 #include <Library/DebugLib.h>
21 #include <Library/BaseMemoryLib.h>
22 #include <Library/BaseLib.h>
23 #include <Library/HiiLib.h>
24 #include <Library/MemoryAllocationLib.h>
25 #include <Library/PrintLib.h>
26 #include <Library/CustomizedDisplayLib.h>
27
28 #include <Protocol/FormBrowserEx2.h>
29 #include <Protocol/SimpleTextIn.h>
30 #include <Protocol/DisplayProtocol.h>
31
32 #include <Guid/MdeModuleHii.h>
33
34 //
35 // This is the generated header file which includes whatever needs to be exported (strings + IFR)
36 //
37 extern UINT8 DisplayEngineStrings[];
38 extern EFI_SCREEN_DESCRIPTOR gStatementDimensions;
39 extern USER_INPUT *gUserInput;
40 extern FORM_DISPLAY_ENGINE_FORM *gFormData;
41 extern EFI_HII_HANDLE gHiiHandle;
42 extern UINT16 gDirection;
43 extern LIST_ENTRY gMenuOption;
44
45 //
46 // Browser Global Strings
47 //
48 extern CHAR16 *gSaveFailed;
49 extern CHAR16 *gPromptForData;
50 extern CHAR16 *gPromptForPassword;
51 extern CHAR16 *gPromptForNewPassword;
52 extern CHAR16 *gConfirmPassword;
53 extern CHAR16 *gConfirmError;
54 extern CHAR16 *gPassowordInvalid;
55 extern CHAR16 *gPressEnter;
56 extern CHAR16 *gEmptyString;
57 extern CHAR16 *gMiniString;
58 extern CHAR16 *gOptionMismatch;
59 extern CHAR16 *gFormSuppress;
60 extern CHAR16 *gProtocolNotFound;
61
62 extern CHAR16 gPromptBlockWidth;
63 extern CHAR16 gOptionBlockWidth;
64 extern CHAR16 gHelpBlockWidth;
65 extern CHAR16 *mUnknownString;
66
67 //
68 // Screen definitions
69 //
70
71 #define LEFT_SKIPPED_COLUMNS 3
72 #define SCROLL_ARROW_HEIGHT 1
73 #define POPUP_PAD_SPACE_COUNT 5
74 #define POPUP_FRAME_WIDTH 2
75
76 #define UPPER_LOWER_CASE_OFFSET 0x20
77
78 //
79 // Display definitions
80 //
81 #define LEFT_ONEOF_DELIMITER L'<'
82 #define RIGHT_ONEOF_DELIMITER L'>'
83
84 #define LEFT_NUMERIC_DELIMITER L'['
85 #define RIGHT_NUMERIC_DELIMITER L']'
86
87 #define LEFT_CHECKBOX_DELIMITER L'['
88 #define RIGHT_CHECKBOX_DELIMITER L']'
89
90 #define CHECK_ON L'X'
91 #define CHECK_OFF L' '
92
93 #define TIME_SEPARATOR L':'
94 #define DATE_SEPARATOR L'/'
95
96 #define SUBTITLE_INDENT 2
97
98 //
99 // This is the Input Error Message
100 //
101 #define INPUT_ERROR 1
102
103 //
104 // This is the NV RAM update required Message
105 //
106 #define NV_UPDATE_REQUIRED 2
107 //
108 // Time definitions
109 //
110 #define ONE_SECOND 10000000
111
112 //
113 // It take 23 characters including the NULL to print a 64 bits number with "[" and "]".
114 // pow(2, 64) = [18446744073709551616]
115 //
116 #define MAX_NUMERIC_INPUT_WIDTH 23
117
118 #define EFI_HII_EXPRESSION_INCONSISTENT_IF 0
119 #define EFI_HII_EXPRESSION_NO_SUBMIT_IF 1
120 #define EFI_HII_EXPRESSION_GRAY_OUT_IF 2
121 #define EFI_HII_EXPRESSION_SUPPRESS_IF 3
122 #define EFI_HII_EXPRESSION_DISABLE_IF 4
123
124 //
125 // Character definitions
126 //
127 #define CHAR_SPACE 0x0020
128
129 #define FORM_DISPLAY_DRIVER_SIGNATURE SIGNATURE_32 ('F', 'D', 'D', 'V')
130 typedef struct {
131 UINT32 Signature;
132
133 EFI_HANDLE Handle;
134
135 //
136 // Produced protocol
137 //
138 EDKII_FORM_DISPLAY_ENGINE_PROTOCOL FromDisplayProt;
139 } FORM_DISPLAY_DRIVER_PRIVATE_DATA;
140
141
142 typedef enum {
143 UiNoOperation,
144 UiSelect,
145 UiUp,
146 UiDown,
147 UiLeft,
148 UiRight,
149 UiReset,
150 UiPrevious,
151 UiPageUp,
152 UiPageDown,
153 UiHotKey,
154 UiMaxOperation
155 } UI_SCREEN_OPERATION;
156
157 typedef enum {
158 CfInitialization,
159 CfCheckSelection,
160 CfRepaint,
161 CfRefreshHighLight,
162 CfUpdateHelpString,
163 CfPrepareToReadKey,
164 CfReadKey,
165 CfScreenOperation,
166 CfUiSelect,
167 CfUiReset,
168 CfUiLeft,
169 CfUiRight,
170 CfUiUp,
171 CfUiPageUp,
172 CfUiPageDown,
173 CfUiDown,
174 CfUiDefault,
175 CfUiNoOperation,
176 CfExit,
177 CfUiHotKey,
178 CfMaxControlFlag
179 } UI_CONTROL_FLAG;
180
181 typedef enum {
182 UIEventNone,
183 UIEventKey,
184 UIEventTimeOut,
185 UIEventDriver
186 } UI_EVENT_TYPE;
187
188 typedef struct {
189 UINT16 ScanCode;
190 UI_SCREEN_OPERATION ScreenOperation;
191 } SCAN_CODE_TO_SCREEN_OPERATION;
192
193 typedef struct {
194 UI_SCREEN_OPERATION ScreenOperation;
195 UI_CONTROL_FLAG ControlFlag;
196 } SCREEN_OPERATION_T0_CONTROL_FLAG;
197
198 typedef struct {
199 EFI_HII_HANDLE HiiHandle;
200 EFI_QUESTION_ID QuestionId;
201 EFI_IFR_OP_HEADER *OpCode;
202 UINT16 DisplayRow;
203 UINT16 SkipValue;
204 } DISPLAY_HIGHLIGHT_MENU_INFO;
205
206 typedef struct {
207 EFI_EVENT SyncEvent;
208 UINT8 *TimeOut;
209 CHAR16 *ErrorInfo;
210 } WARNING_IF_CONTEXT;
211
212 #define UI_MENU_OPTION_SIGNATURE SIGNATURE_32 ('u', 'i', 'm', 'm')
213
214 typedef struct {
215 UINTN Signature;
216 LIST_ENTRY Link;
217
218 EFI_HII_HANDLE Handle;
219 FORM_DISPLAY_ENGINE_STATEMENT *ThisTag;
220 UINT16 EntryNumber;
221
222 UINTN Row;
223 UINTN Col;
224 UINTN OptCol;
225 CHAR16 *Description;
226 UINTN Skip; // Number of lines
227
228 //
229 // Display item sequence for date/time
230 // Date: Month/Day/Year
231 // Sequence: 0 1 2
232 //
233 // Time: Hour : Minute : Second
234 // Sequence: 0 1 2
235 //
236 //
237 UINTN Sequence;
238
239 BOOLEAN GrayOut;
240 BOOLEAN ReadOnly;
241
242 //
243 // Whether user could change value of this item
244 //
245 BOOLEAN IsQuestion;
246 BOOLEAN NestInStatement;
247 } UI_MENU_OPTION;
248
249 #define MENU_OPTION_FROM_LINK(a) CR (a, UI_MENU_OPTION, Link, UI_MENU_OPTION_SIGNATURE)
250
251 /**
252 Print Question Value according to it's storage width and display attributes.
253
254 @param Question The Question to be printed.
255 @param FormattedNumber Buffer for output string.
256 @param BufferSize The FormattedNumber buffer size in bytes.
257
258 @retval EFI_SUCCESS Print success.
259 @retval EFI_BUFFER_TOO_SMALL Buffer size is not enough for formatted number.
260
261 **/
262 EFI_STATUS
263 PrintFormattedNumber (
264 IN FORM_DISPLAY_ENGINE_STATEMENT *Question,
265 IN OUT CHAR16 *FormattedNumber,
266 IN UINTN BufferSize
267 );
268
269 /**
270 Set value of a data element in an Array by its Index.
271
272 @param Array The data array.
273 @param Type Type of the data in this array.
274 @param Index Zero based index for data in this array.
275 @param Value The value to be set.
276
277 **/
278 VOID
279 SetArrayData (
280 IN VOID *Array,
281 IN UINT8 Type,
282 IN UINTN Index,
283 IN UINT64 Value
284 );
285
286 /**
287 Return data element in an Array by its Index.
288
289 @param Array The data array.
290 @param Type Type of the data in this array.
291 @param Index Zero based index for data in this array.
292
293 @retval Value The data to be returned
294
295 **/
296 UINT64
297 GetArrayData (
298 IN VOID *Array,
299 IN UINT8 Type,
300 IN UINTN Index
301 );
302
303 /**
304 Search an Option of a Question by its value.
305
306 @param Question The Question
307 @param OptionValue Value for Option to be searched.
308
309 @retval Pointer Pointer to the found Option.
310 @retval NULL Option not found.
311
312 **/
313 DISPLAY_QUESTION_OPTION *
314 ValueToOption (
315 IN FORM_DISPLAY_ENGINE_STATEMENT *Question,
316 IN EFI_HII_VALUE *OptionValue
317 );
318
319 /**
320 Compare two Hii value.
321
322 @param Value1 Expression value to compare on left-hand.
323 @param Value2 Expression value to compare on right-hand.
324 @param Result Return value after compare.
325 retval 0 Two operators equal.
326 return Positive value if Value1 is greater than Value2.
327 retval Negative value if Value1 is less than Value2.
328 @param HiiHandle Only required for string compare.
329
330 @retval other Could not perform compare on two values.
331 @retval EFI_SUCCESS Compare the value success.
332
333 **/
334 EFI_STATUS
335 CompareHiiValue (
336 IN EFI_HII_VALUE *Value1,
337 IN EFI_HII_VALUE *Value2,
338 OUT INTN *Result,
339 IN EFI_HII_HANDLE HiiHandle OPTIONAL
340 );
341
342 /**
343 Draw a pop up windows based on the dimension, number of lines and
344 strings specified.
345
346 @param RequestedWidth The width of the pop-up.
347 @param NumberOfLines The number of lines.
348 @param ... A series of text strings that displayed in the pop-up.
349
350 **/
351 VOID
352 EFIAPI
353 CreateMultiStringPopUp (
354 IN UINTN RequestedWidth,
355 IN UINTN NumberOfLines,
356 ...
357 );
358
359 /**
360 Will copy LineWidth amount of a string in the OutputString buffer and return the
361 number of CHAR16 characters that were copied into the OutputString buffer.
362 The output string format is:
363 Glyph Info + String info + '\0'.
364
365 In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.
366
367 @param InputString String description for this option.
368 @param LineWidth Width of the desired string to extract in CHAR16
369 characters
370 @param GlyphWidth The glyph width of the begin of the char in the string.
371 @param Index Where in InputString to start the copy process
372 @param OutputString Buffer to copy the string into
373
374 @return Returns the number of CHAR16 characters that were copied into the OutputString
375 buffer, include extra glyph info and '\0' info.
376
377 **/
378 UINT16
379 GetLineByWidth (
380 IN CHAR16 *InputString,
381 IN UINT16 LineWidth,
382 IN OUT UINT16 *GlyphWidth,
383 IN OUT UINTN *Index,
384 OUT CHAR16 **OutputString
385 );
386
387
388 /**
389 Get the string based on the StringId and HII Package List Handle.
390
391 @param Token The String's ID.
392 @param HiiHandle The Hii handle for this string package.
393
394 @return The output string.
395
396 **/
397 CHAR16 *
398 GetToken (
399 IN EFI_STRING_ID Token,
400 IN EFI_HII_HANDLE HiiHandle
401 );
402
403 /**
404 Count the storage space of a Unicode string.
405
406 This function handles the Unicode string with NARROW_CHAR
407 and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR
408 does not count in the resultant output. If a WIDE_CHAR is
409 hit, then 2 Unicode character will consume an output storage
410 space with size of CHAR16 till a NARROW_CHAR is hit.
411
412 If String is NULL, then ASSERT ().
413
414 @param String The input string to be counted.
415
416 @return Storage space for the input string.
417
418 **/
419 UINTN
420 GetStringWidth (
421 IN CHAR16 *String
422 );
423
424 /**
425 This routine reads a numeric value from the user input.
426
427 @param MenuOption Pointer to the current input menu.
428
429 @retval EFI_SUCCESS If numerical input is read successfully
430 @retval EFI_DEVICE_ERROR If operation fails
431
432 **/
433 EFI_STATUS
434 GetNumericInput (
435 IN UI_MENU_OPTION *MenuOption
436 );
437
438 /**
439 Get string or password input from user.
440
441 @param MenuOption Pointer to the current input menu.
442 @param Prompt The prompt string shown on popup window.
443 @param StringPtr Old user input and destination for use input string.
444
445 @retval EFI_SUCCESS If string input is read successfully
446 @retval EFI_DEVICE_ERROR If operation fails
447
448 **/
449 EFI_STATUS
450 ReadString (
451 IN UI_MENU_OPTION *MenuOption,
452 IN CHAR16 *Prompt,
453 IN OUT CHAR16 *StringPtr
454 );
455
456 /**
457 Draw a pop up windows based on the dimension, number of lines and
458 strings specified.
459
460 @param RequestedWidth The width of the pop-up.
461 @param NumberOfLines The number of lines.
462 @param Marker The variable argument list for the list of string to be printed.
463
464 **/
465 VOID
466 CreateSharedPopUp (
467 IN UINTN RequestedWidth,
468 IN UINTN NumberOfLines,
469 IN VA_LIST Marker
470 );
471
472 /**
473 Wait for a key to be pressed by user.
474
475 @param Key The key which is pressed by user.
476
477 @retval EFI_SUCCESS The function always completed successfully.
478
479 **/
480 EFI_STATUS
481 WaitForKeyStroke (
482 OUT EFI_INPUT_KEY *Key
483 );
484
485 /**
486 Get selection for OneOf and OrderedList (Left/Right will be ignored).
487
488 @param MenuOption Pointer to the current input menu.
489
490 @retval EFI_SUCCESS If Option input is processed successfully
491 @retval EFI_DEVICE_ERROR If operation fails
492
493 **/
494 EFI_STATUS
495 GetSelectionInputPopUp (
496 IN UI_MENU_OPTION *MenuOption
497 );
498
499 /**
500 Process the help string: Split StringPtr to several lines of strings stored in
501 FormattedString and the glyph width of each line cannot exceed gHelpBlockWidth.
502
503 @param StringPtr The entire help string.
504 @param FormattedString The oupput formatted string.
505 @param EachLineWidth The max string length of each line in the formatted string.
506 @param RowCount TRUE: if Question is selected.
507
508 **/
509 UINTN
510 ProcessHelpString (
511 IN CHAR16 *StringPtr,
512 OUT CHAR16 **FormattedString,
513 OUT UINT16 *EachLineWidth,
514 IN UINTN RowCount
515 );
516
517 /**
518 Process a Question's Option (whether selected or un-selected).
519
520 @param MenuOption The MenuOption for this Question.
521 @param Selected TRUE: if Question is selected.
522 @param OptionString Pointer of the Option String to be displayed.
523 @param SkipErrorValue Whether need to return when value without option for it.
524
525 @retval EFI_SUCCESS Question Option process success.
526 @retval Other Question Option process fail.
527
528 **/
529 EFI_STATUS
530 ProcessOptions (
531 IN UI_MENU_OPTION *MenuOption,
532 IN BOOLEAN Selected,
533 OUT CHAR16 **OptionString,
534 IN BOOLEAN SkipErrorValue
535 );
536
537 /**
538 Set Buffer to Value for Size bytes.
539
540 @param Buffer Memory to set.
541 @param Size Number of bytes to set
542 @param Value Value of the set operation.
543
544 **/
545 VOID
546 SetUnicodeMem (
547 IN VOID *Buffer,
548 IN UINTN Size,
549 IN CHAR16 Value
550 );
551
552 /**
553 Display one form, and return user input.
554
555 @param FormData Form Data to be shown.
556 @param UserInputData User input data.
557
558 @retval EFI_SUCCESS Form Data is shown, and user input is got.
559 **/
560 EFI_STATUS
561 EFIAPI
562 FormDisplay (
563 IN FORM_DISPLAY_ENGINE_FORM *FormData,
564 OUT USER_INPUT *UserInputData
565 );
566
567 /**
568 Clear Screen to the initial state.
569 **/
570 VOID
571 EFIAPI
572 DriverClearDisplayPage (
573 VOID
574 );
575
576 /**
577 Exit Display and Clear Screen to the original state.
578
579 **/
580 VOID
581 EFIAPI
582 ExitDisplay (
583 VOID
584 );
585
586 /**
587 Process nothing.
588
589 @param Event The Event need to be process
590 @param Context The context of the event.
591
592 **/
593 VOID
594 EFIAPI
595 EmptyEventProcess (
596 IN EFI_EVENT Event,
597 IN VOID *Context
598 );
599
600 /**
601 Process for the refresh interval statement.
602
603 @param Event The Event need to be process
604 @param Context The context of the event.
605
606 **/
607 VOID
608 EFIAPI
609 RefreshTimeOutProcess (
610 IN EFI_EVENT Event,
611 IN VOID *Context
612 );
613
614 #endif