mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-21 15:57:42 +01:00
208 lines
5.2 KiB
C
208 lines
5.2 KiB
C
|
/** @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
|
||
|
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
|
||
|
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
|
||
|
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;
|
||
|
}
|