/** @file | |
Implements titlebar interface functions. | |
(C) Copyright 2013 Hewlett-Packard Development Company, L.P.<BR> | |
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 "EditTitleBar.h" | |
#include "UefiShellDebug1CommandsLib.h" | |
CHAR16 *Title = NULL; | |
/** | |
Initialize a title bar. | |
@param[in] Prompt The prompt to print in the title bar. | |
@retval EFI_SUCCESS The initialization was successful. | |
@retval EFI_OUT_OF_RESOURCES A memory allocation failed. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
MainTitleBarInit ( | |
CONST CHAR16 *Prompt | |
) | |
{ | |
SHELL_FREE_NON_NULL (Title); | |
if (Prompt == NULL) { | |
Title = CatSPrint (NULL, L""); | |
} else { | |
// | |
// set Title | |
// | |
Title = CatSPrint (NULL, L"%s", Prompt); | |
} | |
if (Title == NULL) { | |
return EFI_OUT_OF_RESOURCES; | |
} | |
return EFI_SUCCESS; | |
} | |
/** | |
Clean up the memory used. | |
**/ | |
VOID | |
EFIAPI | |
MainTitleBarCleanup ( | |
VOID | |
) | |
{ | |
SHELL_FREE_NON_NULL (Title); | |
Title = NULL; | |
} | |
typedef struct { | |
UINT32 Foreground : 4; | |
UINT32 Background : 4; | |
} TITLE_BAR_COLOR_ATTRIBUTES; | |
typedef union { | |
TITLE_BAR_COLOR_ATTRIBUTES Colors; | |
UINTN Data; | |
} TITLE_BAR_COLOR_UNION; | |
/** | |
Refresh function for MainTitleBar | |
@param[in] FileName The open file's name (or NULL). | |
@param[in] FileType The type fo the file. | |
@param[in] ReadOnly TRUE if the file is read only. FALSE otherwise. | |
@param[in] Modified TRUE if the file was modified. FALSE otherwise. | |
@param[in] LastCol The last printable column. | |
@param[in] LastRow The last printable row. | |
@param[in] Offset The offset into the file. (only for mem/disk) | |
@param[in] Size The file's size. (only for mem/disk) | |
@retval EFI_SUCCESS The operation was successful. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
MainTitleBarRefresh ( | |
IN CONST CHAR16 *FileName OPTIONAL, | |
IN CONST EDIT_FILE_TYPE FileType, | |
IN CONST BOOLEAN ReadOnly, | |
IN CONST BOOLEAN Modified, | |
IN CONST UINTN LastCol, | |
IN CONST UINTN LastRow, | |
IN CONST UINTN Offset, | |
IN CONST UINTN Size | |
) | |
{ | |
TITLE_BAR_COLOR_UNION Orig; | |
TITLE_BAR_COLOR_UNION New; | |
CONST CHAR16 *FileNameTmp; | |
INTN TempInteger; | |
// | |
// backup the old 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->SetAttribute (gST->ConOut, New.Data & 0x7F); | |
// | |
// clear the title line | |
// | |
EditorClearLine (1, LastCol, LastRow); | |
if (Title != NULL) { | |
// | |
// print the new title bar prefix | |
// | |
ShellPrintEx ( | |
0, | |
0, | |
L"%s ", | |
Title | |
); | |
} | |
if (FileName == NULL) { | |
gST->ConOut->SetAttribute (gST->ConOut, Orig.Data); | |
return EFI_SUCCESS; | |
} | |
// | |
// First Extract the FileName from fullpath | |
// | |
FileNameTmp = FileName; | |
for (TempInteger = StrLen (FileNameTmp) - 1; TempInteger >= 0; TempInteger--) { | |
if (FileNameTmp[TempInteger] == L'\\') { | |
break; | |
} | |
} | |
FileNameTmp = FileNameTmp + TempInteger + 1; | |
// | |
// the space for file name is 20 characters | |
// | |
if (StrLen (FileNameTmp) <= 20) { | |
ShellPrintEx (-1,-1, L"%s ", FileNameTmp); | |
for (TempInteger = StrLen (FileNameTmp); TempInteger < 20; TempInteger++) { | |
ShellPrintEx (-1,-1, L" "); | |
} | |
} else { | |
for (TempInteger = 0; TempInteger < 17; TempInteger++) { | |
ShellPrintEx (-1,-1, L"%c", FileNameTmp[TempInteger]); | |
} | |
// | |
// print "..." | |
// | |
ShellPrintEx (-1,-1, L"... "); | |
} | |
// | |
// print file type field | |
// | |
switch (FileType){ | |
case FileTypeAscii: | |
case FileTypeUnicode: | |
if (FileType == FileTypeAscii){ | |
ShellPrintEx (-1,-1, L" ASCII "); | |
} else { | |
ShellPrintEx (-1,-1, L" UNICODE "); | |
} | |
// | |
// print read-only field for text files | |
// | |
if (ReadOnly) { | |
ShellPrintEx (-1,-1, L"ReadOnly "); | |
} else { | |
ShellPrintEx (-1,-1, L" "); | |
} | |
break; | |
case FileTypeDiskBuffer: | |
case FileTypeMemBuffer: | |
// | |
// Print the offset. | |
// | |
ShellPrintEx (-1,-1, L"Offset %X | Size %X", Offset, Size); | |
case FileTypeFileBuffer: | |
break; | |
default: | |
break; | |
} | |
// | |
// print modified field | |
// | |
if (Modified) { | |
ShellPrintEx (-1,-1, L"Modified"); | |
} | |
// | |
// restore the old attribute | |
// | |
gST->ConOut->SetAttribute (gST->ConOut, Orig.Data); | |
return EFI_SUCCESS; | |
} |