add Edit and Hexedit shared features.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11437 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
200
ShellPkg/Library/UefiShellDebug1CommandsLib/EditTitleBar.c
Normal file
200
ShellPkg/Library/UefiShellDebug1CommandsLib/EditTitleBar.c
Normal file
@ -0,0 +1,200 @@
|
||||
/** @file
|
||||
Implements titlebar interface functions.
|
||||
|
||||
Copyright (c) 2005 - 2011, 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.
|
||||
|
||||
@retval EFI_SUCCESS The operation was successful.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MainTitleBarRefresh (
|
||||
IN CONST CHAR16 *FileName OPTIONAL,
|
||||
IN CONST EDIT_FILE_TYPE FileType,
|
||||
IN BOOLEAN ReadOnly,
|
||||
IN BOOLEAN Modified,
|
||||
IN UINTN LastCol,
|
||||
IN UINTN LastRow
|
||||
)
|
||||
{
|
||||
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.Colors.Foreground = Orig.Colors.Background;
|
||||
New.Colors.Background = Orig.Colors.Foreground;
|
||||
|
||||
gST->ConOut->SetAttribute (gST->ConOut, New.Data);
|
||||
|
||||
//
|
||||
// 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" 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.
|
||||
//
|
||||
ASSERT(FALSE);
|
||||
case FileTypeFileBuffer:
|
||||
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;
|
||||
}
|
Reference in New Issue
Block a user