815 lines
20 KiB
C
815 lines
20 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1999 Intel Corporation
|
||
|
|
||
|
Module Name:
|
||
|
libMenuBar.c
|
||
|
|
||
|
Abstract:
|
||
|
Definition of the Menu Bar for the text editor
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#ifndef _LIB_MENU_BAR
|
||
|
#define _LIB_MENU_BAR
|
||
|
|
||
|
#include "libMisc.h"
|
||
|
|
||
|
STATIC EFI_STATUS MenuInit (VOID);
|
||
|
STATIC EFI_STATUS MenuCleanup (VOID);
|
||
|
STATIC EFI_STATUS MenuRefresh (VOID);
|
||
|
STATIC EFI_STATUS MenuHandleInput (EFI_INPUT_KEY*);
|
||
|
STATIC EFI_STATUS MenuHide(VOID);
|
||
|
STATIC EFI_STATUS NewFile (VOID);
|
||
|
STATIC EFI_STATUS OpenFile(VOID);
|
||
|
STATIC EFI_STATUS CloseFile(VOID);
|
||
|
STATIC EFI_STATUS SaveFile(VOID);
|
||
|
STATIC EFI_STATUS SaveFileAs(VOID);
|
||
|
STATIC EFI_STATUS ExitEditor(VOID);
|
||
|
|
||
|
STATIC EFI_STATUS CutLine(VOID);
|
||
|
STATIC EFI_STATUS PasteLine(VOID);
|
||
|
|
||
|
STATIC EFI_STATUS SearchFind(VOID);
|
||
|
STATIC EFI_STATUS SearchReplace(VOID);
|
||
|
STATIC EFI_STATUS GotoLine(VOID);
|
||
|
|
||
|
STATIC EFI_STATUS SetupColors(VOID);
|
||
|
STATIC EFI_STATUS SetupScreen(VOID);
|
||
|
STATIC EFI_STATUS FileType(VOID);
|
||
|
|
||
|
EFI_EDITOR_MENU_ITEM MainMenuItems[] = {
|
||
|
{ L"Open File", L"F1", OpenFile },
|
||
|
{ L"Save File", L"F2", SaveFile },
|
||
|
{ L"Exit", L"F3", ExitEditor },
|
||
|
|
||
|
{ L"Cut Line", L"F4", CutLine },
|
||
|
{ L"Paste Line", L"F5", PasteLine },
|
||
|
{ L"Go To Line", L"F6", GotoLine },
|
||
|
|
||
|
{ L"Search", L"F7", SearchFind },
|
||
|
{ L"Search/Replace", L"F8", SearchReplace },
|
||
|
{ L"File Type", L"F9", FileType },
|
||
|
|
||
|
{ L"", L"", NULL }
|
||
|
};
|
||
|
|
||
|
EFI_EDITOR_MENU_BAR MainMenuBar = {
|
||
|
MainMenuItems,
|
||
|
MenuInit,
|
||
|
MenuCleanup,
|
||
|
MenuRefresh,
|
||
|
MenuHide,
|
||
|
MenuHandleInput
|
||
|
};
|
||
|
|
||
|
extern EFI_STATUS FileBufferRefreshDown(VOID);
|
||
|
extern EFI_STATUS FileBufferHome (VOID);
|
||
|
|
||
|
#define FileIsModified() \
|
||
|
MainEditor.FileModified
|
||
|
|
||
|
STATIC BOOLEAN EditorIsExiting;
|
||
|
#define IS_EDITOR_EXITING (EditorIsExiting == TRUE)
|
||
|
|
||
|
STATIC EFI_EDITOR_LINE *MenuCutLine;
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
MenuInit (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
EditorIsExiting = FALSE;
|
||
|
MenuCutLine = NULL;
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
MenuCleanup (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
MenuRefresh (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
EFI_EDITOR_MENU_ITEM *Item;
|
||
|
UINTN Col = 0;
|
||
|
UINTN Row = MENU_BAR_LOCATION;
|
||
|
UINTN Width;
|
||
|
|
||
|
MenuHide();
|
||
|
|
||
|
for (Item = MainMenuBar.MenuItems;Item->Function;Item++) {
|
||
|
|
||
|
Width = max((StrLen(Item->Name)+6),20);
|
||
|
if (((Col + Width) >= MAX_TEXT_COLUMNS)) {
|
||
|
Row++;
|
||
|
Col = 0;
|
||
|
}
|
||
|
PrintAt(Col,Row,L"%E%s%N %H%s%N ",Item->FunctionKey,Item->Name);
|
||
|
Col += Width;
|
||
|
}
|
||
|
|
||
|
MainEditor.FileBuffer->RestorePosition();
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
MenuHandleInput (
|
||
|
EFI_INPUT_KEY *Key
|
||
|
)
|
||
|
{
|
||
|
EFI_EDITOR_MENU_ITEM *Item;
|
||
|
EFI_STATUS Status;
|
||
|
UINTN i = 0;
|
||
|
UINTN NumItems = 0;
|
||
|
|
||
|
|
||
|
NumItems = sizeof(MainMenuItems)/sizeof(EFI_EDITOR_MENU_ITEM) - 1;
|
||
|
|
||
|
Item = MainMenuBar.MenuItems;
|
||
|
|
||
|
i = Key->ScanCode - SCAN_CODE_F1;
|
||
|
|
||
|
if (i > (NumItems - 1)) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
Item = &MainMenuBar.MenuItems[i];
|
||
|
|
||
|
Status = Item->Function();
|
||
|
MenuRefresh();
|
||
|
return (IS_EDITOR_EXITING) ? EFI_LOAD_ERROR : EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
OpenFile (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||
|
CHAR16 *Filename;
|
||
|
|
||
|
MainEditor.InputBar->SetPrompt(L"File Name to Open: ");
|
||
|
MainEditor.InputBar->SetStringSize (125);
|
||
|
Status = MainEditor.InputBar->Refresh ();
|
||
|
if ( EFI_ERROR(Status) ) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
Filename = MainEditor.InputBar->ReturnString;
|
||
|
|
||
|
if ( Filename == NULL ) {
|
||
|
MainEditor.StatusBar->SetStatusString(L"Filename was NULL");
|
||
|
return EFI_SUCCESS;
|
||
|
|
||
|
}
|
||
|
Status = MainEditor.FileImage->SetFilename (Filename);
|
||
|
if ( EFI_ERROR(Status) ) {
|
||
|
EditorError(Status,L"Could Not Set Filename");
|
||
|
return EFI_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
Status = MainEditor.FileImage->OpenFile ();
|
||
|
if ( EFI_ERROR(Status) ) {
|
||
|
EditorError(Status,L"Could Not Open File");
|
||
|
return EFI_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
|
||
|
Status = MainEditor.FileImage->ReadFile ();
|
||
|
if ( EFI_ERROR(Status) ) {
|
||
|
EditorError(Status,L"Could Not Read File");
|
||
|
return EFI_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
Status = MainEditor.FileBuffer->Refresh();
|
||
|
if ( EFI_ERROR(Status) ) {
|
||
|
EditorError(Status,L"Could Not Refresh");
|
||
|
return EFI_NOT_FOUND;
|
||
|
}
|
||
|
|
||
|
MainEditor.FileBuffer->SetPosition(TEXT_START_ROW,TEXT_START_COLUMN);
|
||
|
|
||
|
MainEditor.TitleBar->SetTitleString(Filename);
|
||
|
|
||
|
MainEditor.Refresh();
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
CloseFile (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
EFI_INPUT_KEY Key;
|
||
|
EFI_STATUS Status;
|
||
|
BOOLEAN Done = FALSE;
|
||
|
|
||
|
|
||
|
if (FileIsModified()) {
|
||
|
MenuHide();
|
||
|
PrintAt(0,MENU_BAR_LOCATION,L"%EY%H Yes%N %EN%N %HNo%N %EQ%N %HCancel%N");
|
||
|
MainEditor.StatusBar->SetStatusString(L"File Modified. Save? ");
|
||
|
|
||
|
while (!Done) {
|
||
|
WaitForSingleEvent(In->WaitForKey,0);
|
||
|
Status = In->ReadKeyStroke(In,&Key);
|
||
|
if ( EFI_ERROR(Status) || Key.ScanCode != 0 ) {
|
||
|
continue;
|
||
|
}
|
||
|
switch (Key.UnicodeChar) {
|
||
|
case 'q':
|
||
|
case 'Q':
|
||
|
Status = EFI_NOT_READY;
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
case 'n':
|
||
|
case 'N':
|
||
|
Status = EFI_SUCCESS;
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
case 'y':
|
||
|
case 'Y':
|
||
|
Status = SaveFile();
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
MenuRefresh();
|
||
|
}
|
||
|
if (!EFI_ERROR(Status)) {
|
||
|
MainEditor.FileImage->CloseFile();
|
||
|
MainEditor.FileBuffer->Refresh ();
|
||
|
MainEditor.TitleBar->SetTitleString(L"");
|
||
|
} else {
|
||
|
EditorIsExiting = FALSE;
|
||
|
}
|
||
|
|
||
|
MainEditor.StatusBar->Refresh();
|
||
|
MenuRefresh();
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
SaveFile (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *Output;
|
||
|
EFI_STATUS Status;
|
||
|
|
||
|
if (!MainEditor.FileModified) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
Output = PoolPrint (L"File To Save: [%s]",MainEditor.FileImage->FileName);
|
||
|
|
||
|
MainEditor.InputBar->SetPrompt(Output);
|
||
|
MainEditor.InputBar->SetStringSize(100);
|
||
|
|
||
|
Status = MainEditor.InputBar->Refresh();
|
||
|
FreePool(Output);
|
||
|
|
||
|
if (!EFI_ERROR(Status)) {
|
||
|
if (MainEditor.InputBar->StringSize > 0) {
|
||
|
MainEditor.FileImage->SetFilename(MainEditor.InputBar->ReturnString);
|
||
|
FreePool(MainEditor.InputBar->ReturnString);
|
||
|
}
|
||
|
Status = MainEditor.FileImage->WriteFile();
|
||
|
}
|
||
|
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
ExitEditor (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
EditorIsExiting = TRUE;
|
||
|
CloseFile();
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
MenuHide (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
MainEditor.FileBuffer->ClearLine (MENU_BAR_LOCATION);
|
||
|
MainEditor.FileBuffer->ClearLine (MENU_BAR_LOCATION+1);
|
||
|
MainEditor.FileBuffer->ClearLine (MENU_BAR_LOCATION+2);
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
CutLine (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
LIST_ENTRY *Link;
|
||
|
LIST_ENTRY *Next;
|
||
|
LIST_ENTRY *Prev;
|
||
|
EFI_EDITOR_LINE *Line;
|
||
|
|
||
|
|
||
|
Link = MainEditor.FileBuffer->CurrentLine;
|
||
|
|
||
|
if (Link == MainEditor.FileImage->ListHead->Blink) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
if (MenuCutLine) {
|
||
|
FreePool(MenuCutLine);
|
||
|
}
|
||
|
Line = CR(Link,EFI_EDITOR_LINE,Link,EFI_EDITOR_LINE_LIST);
|
||
|
|
||
|
MenuCutLine = LineDup(Line);
|
||
|
|
||
|
Next = Link->Flink;
|
||
|
Prev = Link->Blink;
|
||
|
Prev->Flink = Next;
|
||
|
Next->Blink = Prev;
|
||
|
|
||
|
Link->Flink = Link;
|
||
|
Link->Blink = Link;
|
||
|
|
||
|
MainEditor.FileImage->NumLines--;
|
||
|
MainEditor.FileBuffer->CurrentLine = Next;
|
||
|
FileBufferHome();
|
||
|
|
||
|
FileBufferRefreshDown();
|
||
|
|
||
|
FreePool(Line);
|
||
|
|
||
|
if (!FileIsModified()) {
|
||
|
MainEditor.FileModified = TRUE;
|
||
|
MainEditor.TitleBar->Refresh();
|
||
|
}
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
PasteLine (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
LIST_ENTRY *Link;
|
||
|
EFI_EDITOR_LINE *Line;
|
||
|
|
||
|
if (!MenuCutLine) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
Line = LineDup(MenuCutLine);
|
||
|
|
||
|
Link = MainEditor.FileBuffer->CurrentLine;
|
||
|
Line->Link.Blink = Link->Blink;
|
||
|
Line->Link.Flink = Link;
|
||
|
|
||
|
Link->Blink->Flink = &Line->Link;
|
||
|
Link->Blink = &Line->Link;
|
||
|
|
||
|
MainEditor.FileImage->NumLines++;
|
||
|
MainEditor.FileBuffer->CurrentLine = &Line->Link;
|
||
|
FileBufferHome();
|
||
|
FileBufferRefreshDown();
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
GotoLine (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *Str;
|
||
|
UINTN Row;
|
||
|
UINTN Current;
|
||
|
UINTN RowRange;
|
||
|
BOOLEAN Refresh = FALSE;
|
||
|
|
||
|
MenuHide ();
|
||
|
Str = PoolPrint(L"Go To Line: ");
|
||
|
MainEditor.InputBar->SetPrompt(Str);
|
||
|
FreePool(Str);
|
||
|
MainEditor.InputBar->SetStringSize(5);
|
||
|
MainEditor.InputBar->Refresh();
|
||
|
|
||
|
if (MainEditor.InputBar->StringSize > 0 ) {
|
||
|
Row = Atoi(MainEditor.InputBar->ReturnString);
|
||
|
}
|
||
|
if ( Row > MainEditor.FileImage->NumLines ) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
Current = MainEditor.FileBuffer->FilePosition.Row;
|
||
|
RowRange = MainEditor.FileBuffer->MaxVisibleRows;
|
||
|
|
||
|
if (Row == Current ) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
if (Row < Current) {
|
||
|
LineRetreat(Current-Row);
|
||
|
if ( Row < MainEditor.FileBuffer->LowVisibleRange.Row ) {
|
||
|
MainEditor.FileBuffer->LowVisibleRange.Row = Row-1;
|
||
|
MainEditor.FileBuffer->HighVisibleRange.Row = min(Row+RowRange-1,MainEditor.FileImage->NumLines);
|
||
|
Refresh = TRUE;
|
||
|
}
|
||
|
} else {
|
||
|
LineAdvance(Row - Current);
|
||
|
if ( Row > MainEditor.FileBuffer->HighVisibleRange.Row ) {
|
||
|
MainEditor.FileBuffer->LowVisibleRange.Row = Row - 1;
|
||
|
MainEditor.FileBuffer->HighVisibleRange.Row = min(Row+RowRange-1,MainEditor.FileImage->NumLines);
|
||
|
Refresh = TRUE;
|
||
|
}
|
||
|
}
|
||
|
if (MainEditor.FileBuffer->LowVisibleRange.Column > TEXT_START_COLUMN ) {
|
||
|
MainEditor.FileBuffer->LowVisibleRange.Column = TEXT_START_COLUMN;
|
||
|
MainEditor.FileBuffer->HighVisibleRange.Column = MAX_TEXT_COLUMNS;
|
||
|
Refresh = TRUE;
|
||
|
}
|
||
|
|
||
|
Current = MainEditor.FileBuffer->LowVisibleRange.Row;
|
||
|
|
||
|
MainEditor.FileBuffer->FilePosition.Row = Row;
|
||
|
|
||
|
MainEditor.FileBuffer->SetPosition(Row-Current+TEXT_START_ROW,TEXT_START_COLUMN);
|
||
|
MainEditor.StatusBar->SetPosition(Row,TEXT_START_COLUMN+1);
|
||
|
|
||
|
if ( Refresh = TRUE ) {
|
||
|
MainEditor.FileBuffer->Refresh();
|
||
|
}
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
SearchFind (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *Str;
|
||
|
UINTN Pos;
|
||
|
EFI_EDITOR_LINE *Line;
|
||
|
UINTN LineNumber;
|
||
|
UINTN MaxRows;
|
||
|
UINTN NumLines;
|
||
|
BOOLEAN Refresh = FALSE;
|
||
|
BOOLEAN Found = FALSE;
|
||
|
|
||
|
Str = PoolPrint(L"Enter Search String: ");
|
||
|
MainEditor.InputBar->SetPrompt(Str);
|
||
|
FreePool(Str);
|
||
|
MainEditor.InputBar->SetStringSize(50);
|
||
|
MainEditor.InputBar->Refresh();
|
||
|
|
||
|
if (MainEditor.InputBar->StringSize == 0) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
Str = PoolPrint(L"%s\0",MainEditor.InputBar->ReturnString);
|
||
|
|
||
|
Line = LineCurrent();
|
||
|
|
||
|
MaxRows = MainEditor.FileBuffer->MaxVisibleRows;
|
||
|
NumLines = MainEditor.FileImage->NumLines;
|
||
|
LineNumber = MainEditor.FileBuffer->FilePosition.Row;
|
||
|
|
||
|
while (TRUE) {
|
||
|
Pos = 0;
|
||
|
if (StrLen(Line->Buffer) != 0) {
|
||
|
Pos = StrStr (Line->Buffer,Str);
|
||
|
}
|
||
|
|
||
|
if (Pos == 0) {
|
||
|
if (LineNumber == MainEditor.FileImage->NumLines) {
|
||
|
break;
|
||
|
} else {
|
||
|
LineNumber++;
|
||
|
}
|
||
|
Line = LineNext();
|
||
|
continue;
|
||
|
}
|
||
|
MainEditor.FileBuffer->FilePosition.Row = LineNumber;
|
||
|
MainEditor.FileBuffer->FilePosition.Column = Pos;
|
||
|
MainEditor.StatusBar->SetPosition(LineNumber,Pos);
|
||
|
LineAdvance(LineNumber-MainEditor.FileBuffer->FilePosition.Row);
|
||
|
|
||
|
if (LineNumber > MainEditor.FileBuffer->HighVisibleRange.Row ||
|
||
|
LineNumber < MainEditor.FileBuffer->LowVisibleRange.Row) {
|
||
|
MainEditor.FileBuffer->LowVisibleRange.Row = LineNumber - 1;
|
||
|
MainEditor.FileBuffer->HighVisibleRange.Row = min(LineNumber+MaxRows-2,NumLines);
|
||
|
Refresh = TRUE;
|
||
|
}
|
||
|
if (Pos > MainEditor.FileBuffer->HighVisibleRange.Column ||
|
||
|
Pos < MainEditor.FileBuffer->LowVisibleRange.Column) {
|
||
|
MainEditor.FileBuffer->LowVisibleRange.Column = Pos - 1;
|
||
|
MainEditor.FileBuffer->HighVisibleRange.Column = Pos + MAX_TEXT_COLUMNS - 1;
|
||
|
Refresh = TRUE;
|
||
|
}
|
||
|
Pos = Pos - MainEditor.FileBuffer->LowVisibleRange.Column - 1;
|
||
|
LineNumber = LineNumber - MainEditor.FileBuffer->LowVisibleRange.Row;
|
||
|
MainEditor.FileBuffer->SetPosition(LineNumber+TEXT_START_ROW,Pos+TEXT_START_COLUMN);
|
||
|
|
||
|
if (Refresh) {
|
||
|
MainEditor.FileBuffer->Refresh();
|
||
|
}
|
||
|
|
||
|
Found = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!Found) {
|
||
|
MainEditor.StatusBar->SetStatusString(L"Search String Not Found");
|
||
|
}
|
||
|
FreePool(Str);
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
BOOLEAN
|
||
|
CheckReplace (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
EFI_INPUT_KEY Key;
|
||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||
|
BOOLEAN Done = FALSE;
|
||
|
|
||
|
MenuHide();
|
||
|
PrintAt(0,MENU_BAR_LOCATION,L"%EY%N%H Yes%N %EN%N %HNo%N %EQ%N %HCancel%N");
|
||
|
MainEditor.StatusBar->SetStatusString(L"Replace? ");
|
||
|
|
||
|
while (!Done) {
|
||
|
WaitForSingleEvent(In->WaitForKey,0);
|
||
|
Status = In->ReadKeyStroke(In,&Key);
|
||
|
if (EFI_ERROR(Status) || Key.ScanCode != 0) {
|
||
|
continue;
|
||
|
}
|
||
|
switch (Key.UnicodeChar) {
|
||
|
case 'y':
|
||
|
case 'Y':
|
||
|
Status = EFI_SUCCESS;
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
case 'q':
|
||
|
case 'Q':
|
||
|
Status = EFI_NOT_READY;
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
case 'n':
|
||
|
case 'N':
|
||
|
Status = EFI_NOT_READY;
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
MenuRefresh();
|
||
|
|
||
|
MainEditor.StatusBar->SetStatusString(L" ");
|
||
|
|
||
|
return (Status == EFI_SUCCESS);
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
BOOLEAN
|
||
|
GetInputStrings (
|
||
|
OUT CHAR16 **Search,
|
||
|
OUT CHAR16 **Replace
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *Str;
|
||
|
|
||
|
Str = PoolPrint(L"Enter Search String: ");
|
||
|
MainEditor.InputBar->SetPrompt(Str);
|
||
|
FreePool(Str);
|
||
|
MainEditor.InputBar->SetStringSize(50);
|
||
|
MainEditor.InputBar->Refresh();
|
||
|
|
||
|
if ( MainEditor.InputBar->StringSize == 0 ) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
*Search = PoolPrint(L"%s",MainEditor.InputBar->ReturnString);
|
||
|
|
||
|
|
||
|
Str = PoolPrint(L"Replace With: ");
|
||
|
MainEditor.InputBar->SetPrompt(Str);
|
||
|
FreePool(Str);
|
||
|
MainEditor.InputBar->SetStringSize(50);
|
||
|
MainEditor.InputBar->Refresh();
|
||
|
|
||
|
*Replace = PoolPrint(L"%s",MainEditor.InputBar->ReturnString);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
SearchReplace (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *Search;
|
||
|
CHAR16 *Replacement;
|
||
|
UINTN SearchLength;
|
||
|
UINTN ReplaceLength;
|
||
|
UINTN LinePos;
|
||
|
UINTN Pos;
|
||
|
EFI_EDITOR_LINE *Line;
|
||
|
UINTN LineNumber;
|
||
|
UINTN MaxRows;
|
||
|
BOOLEAN Refresh = FALSE;
|
||
|
BOOLEAN Found = FALSE;
|
||
|
|
||
|
if (!GetInputStrings(&Search,&Replacement)) {
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
Line = LineCurrent();
|
||
|
|
||
|
MaxRows = MainEditor.FileBuffer->MaxVisibleRows;
|
||
|
|
||
|
SearchLength = StrLen(Search);
|
||
|
ReplaceLength = StrLen(Replacement);
|
||
|
|
||
|
Pos = MainEditor.FileBuffer->FilePosition.Column - 1;
|
||
|
|
||
|
LineNumber = MainEditor.FileBuffer->FilePosition.Row - 1;
|
||
|
while (TRUE) {
|
||
|
LinePos = StrStr (Line->Buffer+Pos,Search);
|
||
|
if (LinePos == 0) {
|
||
|
if (LineNumber == MainEditor.FileImage->NumLines) {
|
||
|
break;
|
||
|
} else {
|
||
|
LineNumber++;
|
||
|
}
|
||
|
Line = LineNext();
|
||
|
Pos = 0;
|
||
|
continue;
|
||
|
}
|
||
|
Pos += LinePos;
|
||
|
|
||
|
LinePos = Pos + SearchLength - 1;
|
||
|
MainEditor.FileBuffer->FilePosition.Row = LineNumber;
|
||
|
MainEditor.FileBuffer->FilePosition.Column = Pos;
|
||
|
|
||
|
if (LineNumber > MainEditor.FileBuffer->HighVisibleRange.Row ||
|
||
|
LineNumber < MainEditor.FileBuffer->LowVisibleRange.Row) {
|
||
|
MainEditor.FileBuffer->LowVisibleRange.Row = LineNumber - 1;
|
||
|
MainEditor.FileBuffer->HighVisibleRange.Row = min(LineNumber+MaxRows-2,MainEditor.FileImage->NumLines+1);
|
||
|
Refresh = TRUE;
|
||
|
}
|
||
|
if (Pos > MainEditor.FileBuffer->HighVisibleRange.Column ||
|
||
|
Pos < MainEditor.FileBuffer->LowVisibleRange.Column) {
|
||
|
MainEditor.FileBuffer->LowVisibleRange.Column = Pos - 1;
|
||
|
MainEditor.FileBuffer->HighVisibleRange.Column = Pos + MAX_TEXT_COLUMNS - 1;
|
||
|
Refresh = TRUE;
|
||
|
}
|
||
|
Pos = Pos - MainEditor.FileBuffer->LowVisibleRange.Column - 1;
|
||
|
MainEditor.FileBuffer->SetPosition(LineNumber-MainEditor.FileBuffer->LowVisibleRange.Row+TEXT_START_ROW,Pos+TEXT_START_COLUMN);
|
||
|
|
||
|
if (Refresh) {
|
||
|
MainEditor.FileBuffer->Refresh();
|
||
|
}
|
||
|
|
||
|
Found = TRUE;
|
||
|
if (!CheckReplace()) {
|
||
|
break;
|
||
|
}
|
||
|
{
|
||
|
CHAR16 *Tail;
|
||
|
UINTN Size = Line->Size*2;
|
||
|
INTN Diff = ReplaceLength - SearchLength;
|
||
|
|
||
|
if (Diff > 0) {
|
||
|
Line->Buffer = ReallocatePool(Line->Buffer,Size,Size+2*Diff);
|
||
|
}
|
||
|
|
||
|
Tail = PoolPrint(L"%s%s",Replacement,Line->Buffer+LinePos);
|
||
|
|
||
|
Size = LinePos - SearchLength;
|
||
|
StrCpy(Line->Buffer+Size,Tail);
|
||
|
|
||
|
FreePool(Tail);
|
||
|
Line->Size += Diff;
|
||
|
Pos = LinePos + Diff;
|
||
|
}
|
||
|
if (!MainEditor.FileModified) {
|
||
|
MainEditor.FileModified = TRUE;
|
||
|
MainEditor.TitleBar->Refresh();
|
||
|
}
|
||
|
MainEditor.FileBuffer->RefreshCurrentLine();
|
||
|
}
|
||
|
|
||
|
if (!Found) {
|
||
|
MainEditor.StatusBar->SetStatusString(L"Search String Not Found");
|
||
|
}
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
STATIC
|
||
|
EFI_STATUS
|
||
|
FileType (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
CHAR16 *FT;
|
||
|
CHAR16 *NewType;
|
||
|
CHAR16 *A = L"ASCII";
|
||
|
CHAR16 *U = L"UNICODE";
|
||
|
EFI_INPUT_KEY Key;
|
||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||
|
BOOLEAN Done = FALSE;
|
||
|
BOOLEAN Choice;
|
||
|
|
||
|
Choice = MainEditor.FileImage->FileType;
|
||
|
|
||
|
if (Choice == ASCII_FILE) {
|
||
|
NewType = A;
|
||
|
} else {
|
||
|
NewType = U;
|
||
|
}
|
||
|
FT = PoolPrint(L"File is %s",NewType);
|
||
|
MainEditor.StatusBar->SetStatusString(FT);
|
||
|
FreePool(FT);
|
||
|
|
||
|
MenuHide();
|
||
|
PrintAt(0,MENU_BAR_LOCATION,L"%E U %N%H Set as UNICODE File %N %E A %N %HSet As ASCII File%N %EQ%N %HCancel%N");
|
||
|
|
||
|
while (!Done) {
|
||
|
WaitForSingleEvent(In->WaitForKey,0);
|
||
|
Status = In->ReadKeyStroke(In,&Key);
|
||
|
if (EFI_ERROR(Status) || Key.ScanCode != 0) {
|
||
|
continue;
|
||
|
}
|
||
|
switch (Key.UnicodeChar) {
|
||
|
case 'u':
|
||
|
case 'U':
|
||
|
Choice = UNICODE_FILE;
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
case 'a':
|
||
|
case 'A':
|
||
|
Choice = ASCII_FILE;
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
case 'q':
|
||
|
case 'Q':
|
||
|
Done = TRUE;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
MenuRefresh();
|
||
|
|
||
|
if (Choice != MainEditor.FileImage->FileType) {
|
||
|
MainEditor.FileImage->FileType = Choice;
|
||
|
NewType = (Choice == ASCII_FILE) ? A : U;
|
||
|
FT = PoolPrint(L"File Type Changed to %s",NewType);
|
||
|
MainEditor.StatusBar->SetStatusString(FT);
|
||
|
FreePool(FT);
|
||
|
}
|
||
|
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|
||
|
#endif /* _LIB_MENU_BAR */
|