Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Chen A Chen <chen.a.chen@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com> Reviewed-by: Ruiyu Ni <Ruiyu.ni@intel.com>
		
			
				
	
	
		
			231 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Implements statusbar interface functions.
 | |
| 
 | |
|   Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved. <BR>
 | |
|   This program and the accompanying materials
 | |
|   are licensed and made available under the terms and conditions of the BSD License
 | |
|   which accompanies this distribution.  The full text of the license may be found at
 | |
|   http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "EditStatusBar.h"
 | |
| #include "UefiShellDebug1CommandsLib.h"
 | |
| 
 | |
| CHAR16  *StatusString;
 | |
| BOOLEAN StatusBarNeedRefresh;
 | |
| BOOLEAN StatusStringChanged;
 | |
| 
 | |
| /**
 | |
|   Initialization function for Status Bar.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The operation was successful.
 | |
|   @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.
 | |
|   @sa StatusBarSetStatusString
 | |
| **/
 | |
| EFI_STATUS
 | |
| StatusBarInit (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   //
 | |
|   // initialize the statusbar
 | |
|   //
 | |
|   StatusString         = NULL;
 | |
|   StatusBarNeedRefresh = TRUE;
 | |
|   StatusStringChanged  = FALSE;
 | |
| 
 | |
|   //
 | |
|   // status string set to ""
 | |
|   //
 | |
|   return (StatusBarSetStatusString (L""));
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Cleanup function for the status bar.
 | |
| **/
 | |
| VOID
 | |
| StatusBarCleanup (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   //
 | |
|   // free the status string and backvar's status string
 | |
|   //
 | |
|   SHELL_FREE_NON_NULL (StatusString);
 | |
| }
 | |
| 
 | |
| typedef struct {
 | |
|   UINT32  Foreground : 4;
 | |
|   UINT32  Background : 3;
 | |
| } STATUS_BAR_COLOR_ATTRIBUTES;
 | |
| 
 | |
| typedef union {
 | |
|   STATUS_BAR_COLOR_ATTRIBUTES  Colors;
 | |
|   UINTN                       Data;
 | |
| } STATUS_BAR_COLOR_UNION;
 | |
| 
 | |
| /**
 | |
|   Cause the status bar to refresh it's printing on the screen.
 | |
| 
 | |
|   @param[in] EditorFirst      TRUE to indicate the first launch of the editor.  
 | |
|                               FALSE otherwise.
 | |
|   @param[in] LastRow          LastPrintable row.
 | |
|   @param[in] LastCol          Last printable column.
 | |
|   @param[in] FileRow          Row in the file.
 | |
|   @param[in] FileCol          Column in the file.
 | |
|   @param[in] InsertMode       TRUE to indicate InsertMode.  FALSE otherwise.
 | |
| 
 | |
|   @retval EFI_SUCCESS         The operation was successful.
 | |
| **/
 | |
| EFI_STATUS
 | |
| StatusBarRefresh (
 | |
|   IN BOOLEAN  EditorFirst,
 | |
|   IN UINTN    LastRow,
 | |
|   IN UINTN    LastCol,
 | |
|   IN UINTN    FileRow,
 | |
|   IN UINTN    FileCol,
 | |
|   IN BOOLEAN  InsertMode
 | |
|   )
 | |
| {
 | |
|   STATUS_BAR_COLOR_UNION  Orig;
 | |
|   STATUS_BAR_COLOR_UNION  New;
 | |
| 
 | |
|   if (!StatusStringChanged && StatusBarNeedRefresh) {
 | |
|     StatusBarSetStatusString (L"\0");
 | |
|   }
 | |
|   //
 | |
|   // when it's called first time after editor launch, so refresh is mandatory
 | |
|   //
 | |
|   if (!StatusBarNeedRefresh && !StatusStringChanged) {
 | |
|     return EFI_SUCCESS;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // back up the screen attributes
 | |
|   //
 | |
|   Orig.Data             = gST->ConOut->Mode->Attribute;
 | |
|   New.Data              = 0;
 | |
|   New.Colors.Foreground = Orig.Colors.Background & 0xF;
 | |
|   New.Colors.Background = Orig.Colors.Foreground & 0x7;
 | |
| 
 | |
|   gST->ConOut->EnableCursor (gST->ConOut, FALSE);
 | |
|   gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);
 | |
| 
 | |
|   //
 | |
|   // clear status bar
 | |
|   //
 | |
|   EditorClearLine (LastRow, LastCol, LastRow);
 | |
| 
 | |
|   //
 | |
|   // print row, column fields
 | |
|   //
 | |
|   if (FileRow != (UINTN)(-1) && FileCol != (UINTN)(-1)) {
 | |
|     ShellPrintEx (
 | |
|       0,
 | |
|       (INT32)(LastRow) - 1,
 | |
|       L" %d,%d       %s",
 | |
|       FileRow,
 | |
|       FileCol,
 | |
|       StatusString
 | |
|       );
 | |
|   } else {
 | |
|     ShellPrintEx (
 | |
|       0,
 | |
|       (INT32)(LastRow) - 1,
 | |
|       L"  %s",
 | |
|       StatusString
 | |
|       );
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // print insert mode field
 | |
|   //
 | |
|   if (InsertMode) {
 | |
|     ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s|   Help: Ctrl-E", L"INS");
 | |
|   } else {
 | |
|     ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s|   Help: Ctrl-E", L"OVR");
 | |
|   }
 | |
|   //
 | |
|   // restore the old screen attributes
 | |
|   //
 | |
|   gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);
 | |
| 
 | |
|   //
 | |
|   // restore position in edit area
 | |
|   //
 | |
|   gST->ConOut->EnableCursor (gST->ConOut, TRUE);
 | |
| 
 | |
|   StatusBarNeedRefresh  = FALSE;
 | |
|   StatusStringChanged   = FALSE;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Set the status string text part.
 | |
| 
 | |
|   @param[in] Str                The string to use.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The operation was successful.
 | |
|   @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.
 | |
| **/
 | |
| EFI_STATUS
 | |
| StatusBarSetStatusString (
 | |
|   IN CHAR16 *Str
 | |
|   )
 | |
| {
 | |
|   StatusStringChanged = TRUE;
 | |
| 
 | |
|   //
 | |
|   // free the old status string
 | |
|   //
 | |
|   SHELL_FREE_NON_NULL (StatusString);
 | |
|   StatusString = CatSPrint (NULL, L"%s", Str);
 | |
|   if (StatusString == NULL) {
 | |
|     return EFI_OUT_OF_RESOURCES;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Function to retrieve the current status string.
 | |
| 
 | |
|   @return The string that is used.
 | |
| **/
 | |
| CONST CHAR16*
 | |
| StatusBarGetString (
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   return (StatusString);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Function to set the need refresh boolean to TRUE.
 | |
| **/
 | |
| VOID
 | |
| StatusBarSetRefresh(
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   StatusBarNeedRefresh = TRUE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Function to get the need refresh boolean to TRUE.
 | |
| 
 | |
|   @retval TRUE    The status bar needs to be refreshed.
 | |
| **/
 | |
| BOOLEAN
 | |
| StatusBarGetRefresh(
 | |
|   VOID
 | |
|   )
 | |
| {
 | |
|   return (StatusBarNeedRefresh);
 | |
| }
 |