Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

946 lines
24 KiB

/*++
Copyright (c) 1999 Intel Corporation
Module Name:
libFileBuffer.c
Abstract:
Defines FileBuffer - the view of the file that is visible at any point,
as well as the event handlers for editing the file
--*/
#ifndef _LIB_FILE_BUFFER
#define _LIB_FILE_BUFFER
#include "libMisc.h"
extern EFI_EDITOR_LINE* FileImageCreateNode (VOID);
#define ABSOLUTE_MAX_COLUMNS 132
STATIC CHAR16 BlankLine[ABSOLUTE_MAX_COLUMNS];
STATIC EFI_STATUS FileBufferScrollUp (VOID);
STATIC EFI_STATUS FileBufferScrollDown (VOID);
STATIC EFI_STATUS FileBufferScrollLeft (VOID);
STATIC EFI_STATUS FileBufferScrollRight (VOID);
STATIC EFI_STATUS FileBufferPageUp (VOID);
STATIC EFI_STATUS FileBufferPageDown (VOID);
STATIC EFI_STATUS FileBufferHome (VOID);
STATIC EFI_STATUS FileBufferEnd (VOID);
STATIC EFI_STATUS FileBufferChangeMode (VOID);
STATIC EFI_STATUS FileBufferDoDelete (VOID);
STATIC EFI_STATUS FileBufferDoBackspace (VOID);
STATIC EFI_STATUS FileBufferDoCharInput (CHAR16);
STATIC EFI_STATUS FileBufferDoReturn (VOID);
STATIC EFI_STATUS FileBufferRefreshCurrentLine(VOID);
STATIC EFI_STATUS FileBufferRefreshDown(VOID);
STATIC EFI_STATUS FileBufferInit (VOID);
STATIC EFI_STATUS FileBufferCleanup (VOID);
STATIC EFI_STATUS FileBufferRefresh (VOID);
STATIC EFI_STATUS FileBufferHide (VOID);
STATIC EFI_STATUS FileBufferHandleInput (EFI_INPUT_KEY*);
STATIC EFI_STATUS FileBufferClearLine (UINTN);
STATIC EFI_STATUS FileBufferSetPosition (UINTN,UINTN);
STATIC EFI_STATUS FileBufferRestorePosition (VOID);
EFI_EDITOR_FILE_BUFFER FileBuffer = {
{0,0},
{0,0},
{0,0},
{0,0},
0,
0,
TRUE,
NULL,
FileBufferInit,
FileBufferCleanup,
FileBufferRefresh,
FileBufferHide,
FileBufferHandleInput,
FileBufferClearLine,
FileBufferSetPosition,
FileBufferRestorePosition,
FileBufferRefreshCurrentLine
};
EFI_EDITOR_FILE_BUFFER FileBufferConst = {
{0,0},
{0,0},
{0,0},
{0,0},
0,
0,
TRUE,
NULL,
FileBufferInit,
FileBufferCleanup,
FileBufferRefresh,
FileBufferHide,
FileBufferHandleInput,
FileBufferClearLine,
FileBufferSetPosition,
FileBufferRestorePosition,
FileBufferRefreshCurrentLine
};
STATIC
EFI_STATUS
FileBufferInit (
VOID
)
{
UINTN i;
CopyMem (&FileBuffer, &FileBufferConst, sizeof(FileBuffer));
FileBuffer.DisplayPosition.Row = TEXT_START_ROW;
FileBuffer.DisplayPosition.Column = TEXT_START_COLUMN;
FileBuffer.LowVisibleRange.Row = TEXT_START_ROW;
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
FileBuffer.MaxVisibleRows = MAX_TEXT_ROWS;
FileBuffer.MaxVisibleColumns = MAX_TEXT_COLUMNS;
FileBuffer.HighVisibleRange.Row = MAX_TEXT_ROWS;
FileBuffer.HighVisibleRange.Column = MAX_TEXT_COLUMNS;
for (i = 0; i < MAX_TEXT_COLUMNS; i++) {
BlankLine[i] = ' ';
}
BlankLine[i-1] = 0;
FileBuffer.LowVisibleRange.Row = TEXT_START_ROW;
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
FileBuffer.MaxVisibleRows = MAX_TEXT_ROWS;
FileBuffer.MaxVisibleColumns = MAX_TEXT_COLUMNS;
FileBuffer.FilePosition.Row = 1;
FileBuffer.FilePosition.Column = 1;
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferCleanup (
VOID
)
{
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferRefresh (
VOID
)
{
LIST_ENTRY *Item;
UINTN Row;
Row = FileBuffer.DisplayPosition.Row;
FileBuffer.DisplayPosition.Row = TEXT_START_ROW;
Item = FileBuffer.CurrentLine;
LineRetreat(FileBuffer.FilePosition.Row - FileBuffer.LowVisibleRange.Row);
FileBufferRefreshDown();
FileBuffer.CurrentLine = Item;
FileBuffer.DisplayPosition.Row = Row;
FileBufferRestorePosition();
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferRefreshCurrentLine (
VOID
)
{
EFI_EDITOR_LINE *Line;
UINTN Where;
CHAR16 *StrLine;
UINTN StartColumn;
Where = FileBuffer.DisplayPosition.Row;
StartColumn = FileBuffer.LowVisibleRange.Column;
FileBufferClearLine(Where);
Line = LineCurrent();
if (Line->Link.Blink == MainEditor.FileImage->ListHead &&
FileBuffer.DisplayPosition.Row > TEXT_START_ROW) {
return EFI_SUCCESS;
}
if (Line->Size < StartColumn) {
FileBufferRestorePosition();
return EFI_SUCCESS;
}
StrLine = PoolPrint(L"%s",Line->Buffer + StartColumn);
if ((Line->Size - StartColumn)> FileBuffer.MaxVisibleColumns) {
StrLine[FileBuffer.MaxVisibleColumns-2] = 0;
} else {
StrLine[(Line->Size - StartColumn)] = 0;
}
/* PrintAt(0,Where,StrLine); */
Out->SetCursorPosition(Out,0,Where);
Out->OutputString(Out,StrLine);
FreePool(StrLine);
FileBufferRestorePosition();
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferRefreshDown (
VOID
)
{
LIST_ENTRY *Item;
LIST_ENTRY *Link;
UINTN Row;
Row = FileBuffer.DisplayPosition.Row;
Item = FileBuffer.CurrentLine;
Link = FileBuffer.CurrentLine;
while (FileBuffer.DisplayPosition.Row <= MAX_TEXT_ROWS) {
if (Link->Flink != MainEditor.FileImage->ListHead) {
FileBufferRefreshCurrentLine();
LineNext();
Link = FileBuffer.CurrentLine;
} else {
FileBufferClearLine(FileBuffer.DisplayPosition.Row);
}
FileBuffer.DisplayPosition.Row++;
}
FileBuffer.CurrentLine = Item;
FileBuffer.DisplayPosition.Row = Row;
FileBufferRestorePosition();
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferHandleInput (
IN EFI_INPUT_KEY* Key
)
{
switch (Key->ScanCode) {
case SCAN_CODE_NULL:
FileBufferDoCharInput (Key->UnicodeChar);
break;
case SCAN_CODE_UP:
FileBufferScrollUp();
break;
case SCAN_CODE_DOWN:
FileBufferScrollDown();
break;
case SCAN_CODE_RIGHT:
FileBufferScrollRight();
break;
case SCAN_CODE_LEFT:
FileBufferScrollLeft();
break;
case SCAN_CODE_PGUP:
FileBufferPageUp();
break;
case SCAN_CODE_PGDN:
FileBufferPageDown();
break;
case SCAN_CODE_DEL:
FileBufferDoDelete();
break;
case SCAN_CODE_HOME:
FileBufferHome();
break;
case SCAN_CODE_END:
FileBufferEnd();
break;
case SCAN_CODE_INS:
FileBufferChangeMode();
break;
default:
break;
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferHide (
VOID
)
{
UINTN i;
for (i = TEXT_START_ROW; i < FileBuffer.MaxVisibleRows; i++ ) {
FileBufferClearLine(i);
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferClearLine (
UINTN Line
)
{
PrintAt(0,Line,BlankLine);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferSetPosition (
IN UINTN Row,
IN UINTN Column
)
{
FileBuffer.DisplayPosition.Row = Row;
FileBuffer.DisplayPosition.Column = Column;
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferRestorePosition (
VOID
)
{
Out->SetCursorPosition (Out,FileBuffer.DisplayPosition.Column,FileBuffer.DisplayPosition.Row);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferScrollDown (
VOID
)
{
UINTN CurrentRow;
UINTN CurrentCol;
UINTN MaxRows;
UINTN HighRow;
EFI_EDITOR_LINE *Line;
BOOLEAN Refresh = FALSE;
Line = LineCurrent();
if (Line->Link.Flink == MainEditor.FileImage->ListHead) {
return EFI_SUCCESS;
}
CurrentRow = FileBuffer.DisplayPosition.Row;
CurrentCol = FileBuffer.DisplayPosition.Column;
MaxRows = FileBuffer.MaxVisibleRows;
HighRow = FileBuffer.HighVisibleRange.Row;
/* Current row is the bottom row, shift only one line, not scroll the whole screen. */
if (CurrentRow == MaxRows) {
FileBuffer.LowVisibleRange.Row += 1;
FileBuffer.HighVisibleRange.Row += 1;
CurrentRow = MaxRows;
Refresh = TRUE;
} else if (CurrentRow == HighRow) {
return EFI_SUCCESS;
} else {
++CurrentRow;
}
Line = LineNext();
if (FileBuffer.FilePosition.Column > (Line->Size-1)) {
FileBuffer.FilePosition.Column = Line->Size;
if (Line->Size < FileBuffer.LowVisibleRange.Column) {
if (FileBuffer.LowVisibleRange.Column < FileBuffer.MaxVisibleColumns) {
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
} else {
FileBuffer.LowVisibleRange.Column = Line->Size - FileBuffer.MaxVisibleColumns + 2;
}
FileBuffer.HighVisibleRange.Column = FileBuffer.LowVisibleRange.Column + FileBuffer.MaxVisibleColumns - 1;
Refresh = TRUE;
}
CurrentCol = FileBuffer.FilePosition.Column - FileBuffer.LowVisibleRange.Column - 1;
}
if (Refresh) {
FileBufferRefresh();
}
FileBuffer.SetPosition(CurrentRow,CurrentCol);
++FileBuffer.FilePosition.Row;
MainEditor.StatusBar->SetPosition(FileBuffer.FilePosition.Row,FileBuffer.FilePosition.Column);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferScrollUp (
VOID
)
{
UINTN CurrentRow;
UINTN CurrentCol;
UINTN MaxRows;
UINTN LowRow;
EFI_EDITOR_LINE *Line;
if ( FileBuffer.FilePosition.Row <= TEXT_START_ROW ) {
return EFI_SUCCESS;
}
MaxRows = FileBuffer.MaxVisibleRows;
LowRow = FileBuffer.LowVisibleRange.Row;
CurrentRow = FileBuffer.DisplayPosition.Row;
CurrentCol = FileBuffer.DisplayPosition.Column;
/* Current row is the top row, shift only one line, not scroll the whole screen. */
if (CurrentRow == TEXT_START_ROW) {
FileBuffer.HighVisibleRange.Row -= 1;
FileBuffer.LowVisibleRange.Row -= 1;
CurrentRow = TEXT_START_ROW;
FileBuffer.Refresh();
} else {
CurrentRow--;
}
Line = LinePrevious ();
if (FileBuffer.FilePosition.Column > (Line->Size-1)) {
FileBuffer.FilePosition.Column = Line->Size;
if (Line->Size < FileBuffer.LowVisibleRange.Column) {
if ( FileBuffer.LowVisibleRange.Column < FileBuffer.MaxVisibleColumns ) {
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
} else {
FileBuffer.LowVisibleRange.Column = Line->Size - FileBuffer.MaxVisibleColumns + 2;
}
FileBuffer.HighVisibleRange.Column = FileBuffer.LowVisibleRange.Column + FileBuffer.MaxVisibleColumns - 1;
FileBuffer.Refresh();
}
CurrentCol = FileBuffer.FilePosition.Column - FileBuffer.LowVisibleRange.Column - 1;
}
FileBuffer.SetPosition(CurrentRow,CurrentCol);
--FileBuffer.FilePosition.Row;
MainEditor.StatusBar->SetPosition(FileBuffer.FilePosition.Row,FileBuffer.FilePosition.Column);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferPageUp (
VOID
)
{
UINTN MaxRows;
UINTN LowRow;
UINTN FilePos;
EFI_EDITOR_LINE *Line;
if ( FileBuffer.FilePosition.Row <= TEXT_START_ROW ) {
return EFI_SUCCESS;
}
MaxRows = FileBuffer.MaxVisibleRows;
LowRow = FileBuffer.LowVisibleRange.Row;
FilePos = FileBuffer.FilePosition.Row;
if (LowRow < MaxRows) {
FileBuffer.HighVisibleRange.Row = MaxRows;
FileBuffer.LowVisibleRange.Row = 1;
if (LowRow > TEXT_START_ROW) {
if (FilePos > MaxRows){
FileBuffer.DisplayPosition.Row = FilePos - MaxRows;
} else {
FileBuffer.DisplayPosition.Row = 1;
}
} else {
FileBuffer.DisplayPosition.Row = 1;
FileBuffer.DisplayPosition.Column = TEXT_START_COLUMN;
}
FileBuffer.FilePosition.Row = FileBuffer.DisplayPosition.Row;
} else {
FileBuffer.HighVisibleRange.Row = LowRow;
FileBuffer.LowVisibleRange.Row -= (MaxRows - 1);
FileBuffer.FilePosition.Row -= (MaxRows - 1);
}
LineRetreat(FilePos - FileBuffer.FilePosition.Row);
Line = LineCurrent ();
if (FileBuffer.FilePosition.Column > (Line->Size-1)) {
FileBuffer.FilePosition.Column = Line->Size;
if (Line->Size < FileBuffer.LowVisibleRange.Column ) {
if ( FileBuffer.LowVisibleRange.Column < FileBuffer.MaxVisibleColumns ) {
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
} else {
FileBuffer.LowVisibleRange.Column = Line->Size - FileBuffer.MaxVisibleColumns + 2;
}
FileBuffer.HighVisibleRange.Column = FileBuffer.LowVisibleRange.Column + FileBuffer.MaxVisibleColumns - 1;
}
FileBuffer.DisplayPosition.Column = FileBuffer.FilePosition.Column - FileBuffer.LowVisibleRange.Column - 1;
FileBuffer.Refresh();
}
FileBuffer.Refresh();
MainEditor.StatusBar->SetPosition(FileBuffer.FilePosition.Row,FileBuffer.FilePosition.Column);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferPageDown (
VOID
)
{
UINTN MaxRows;
UINTN HighRow;
UINTN FilePos;
EFI_EDITOR_LINE *Line;
BOOLEAN Refresh = FALSE;
if (FileBuffer.FilePosition.Row == MainEditor.FileImage->NumLines) {
return EFI_SUCCESS;
}
MaxRows = FileBuffer.MaxVisibleRows;
HighRow = FileBuffer.HighVisibleRange.Row;
FilePos = FileBuffer.FilePosition.Row;
FileBuffer.FilePosition.Row = min((FileBuffer.FilePosition.Row+MaxRows-1),MainEditor.FileImage->NumLines);
if (HighRow < MainEditor.FileImage->NumLines) {
FileBuffer.LowVisibleRange.Row = HighRow;
FileBuffer.HighVisibleRange.Row = HighRow + (MaxRows-1);
Refresh = TRUE;
}
FileBuffer.DisplayPosition.Row = TEXT_START_ROW + FileBuffer.FilePosition.Row - FileBuffer.LowVisibleRange.Row;
Line = LineAdvance(FileBuffer.FilePosition.Row - FilePos);
if (FileBuffer.FilePosition.Column > (Line->Size-1) || !Refresh) {
FileBuffer.FilePosition.Column = Line->Size;
if (Line->Size < FileBuffer.LowVisibleRange.Column ) {
if (FileBuffer.LowVisibleRange.Column < FileBuffer.MaxVisibleColumns) {
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
} else {
FileBuffer.LowVisibleRange.Column = Line->Size - FileBuffer.MaxVisibleColumns + 2;
}
FileBuffer.HighVisibleRange.Column = FileBuffer.LowVisibleRange.Column + FileBuffer.MaxVisibleColumns - 1;
Refresh = TRUE;
}
FileBuffer.DisplayPosition.Column = FileBuffer.FilePosition.Column - FileBuffer.LowVisibleRange.Column - 1;
}
if (Refresh) {
FileBuffer.Refresh();
}
MainEditor.StatusBar->SetPosition(FileBuffer.FilePosition.Row,FileBuffer.FilePosition.Column);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferScrollLeft (
VOID
)
{
UINTN CurrentCol;
UINTN CurrentRow;
UINTN MaxCols;
UINTN HighCol;
UINTN LowCol;
EFI_EDITOR_POSITION FilePos;
EFI_EDITOR_LINE *Line;
CurrentCol = FileBuffer.DisplayPosition.Column;
CurrentRow = FileBuffer.DisplayPosition.Row;
MaxCols = FileBuffer.MaxVisibleColumns;
HighCol = FileBuffer.HighVisibleRange.Column;
LowCol = FileBuffer.LowVisibleRange.Column;
FilePos = FileBuffer.FilePosition;
Line = LineCurrent ();
if ( FilePos.Row == 1 && FilePos.Column == 1) {
return EFI_SUCCESS;
}
if ( Line->Size == 0 || FilePos.Column == TEXT_START_COLUMN + 1 ) {
FileBufferScrollUp ();
Line = LineCurrent ();
CurrentCol = Line->Size - 1;
if ( CurrentCol > HighCol ) {
if ( CurrentCol < MaxCols ) {
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
FileBuffer.HighVisibleRange.Column = MaxCols;
} else {
FileBuffer.HighVisibleRange.Column = CurrentCol;
FileBuffer.LowVisibleRange.Column = CurrentCol - MaxCols + 1;
}
FileBuffer.Refresh();
}
FileBuffer.FilePosition.Column = CurrentCol + 1;
FileBuffer.DisplayPosition.Column = CurrentCol - FileBuffer.LowVisibleRange.Column;
} else if ( FilePos.Column <= LowCol+1 ) {
if ( LowCol <= MaxCols ) {
LowCol = TEXT_START_COLUMN;
} else {
LowCol -= (MaxCols-1);
}
FileBuffer.LowVisibleRange.Column = LowCol;
FileBuffer.HighVisibleRange.Column = LowCol + MaxCols - 1;
FileBuffer.DisplayPosition.Column = FilePos.Column - LowCol - 2;
--FileBuffer.FilePosition.Column;
FileBuffer.Refresh();
} else {
--FileBuffer.DisplayPosition.Column;
--FileBuffer.FilePosition.Column;
}
MainEditor.StatusBar->SetPosition(FileBuffer.FilePosition.Row,FileBuffer.FilePosition.Column);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferScrollRight (
VOID
)
{
EFI_EDITOR_POSITION FilePos;
EFI_EDITOR_POSITION CurrentPos;
EFI_EDITOR_LINE *Line;
UINTN LineSize;
UINTN MaxCols;
UINTN LowCol;
UINTN HighCol;
CurrentPos = FileBuffer.DisplayPosition;
FilePos = FileBuffer.FilePosition;
Line = LineCurrent ();
LineSize = Line->Size;
MaxCols = FileBuffer.MaxVisibleColumns;
LowCol = FileBuffer.LowVisibleRange.Column;
HighCol = FileBuffer.HighVisibleRange.Column;
if (FilePos.Column >= (Line->Size-1) && FilePos.Row >= MainEditor.FileImage->NumLines) {
return EFI_SUCCESS;
}
if (LineSize == 0 || FilePos.Column >= LineSize) {
FileBufferScrollDown();
CurrentPos.Column = TEXT_START_COLUMN;
if (LowCol > TEXT_START_COLUMN) {
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
FileBuffer.HighVisibleRange.Column = MaxCols;
FileBuffer.Refresh ();
}
FileBuffer.FilePosition.Column = 1;
FileBuffer.DisplayPosition.Column = TEXT_START_COLUMN;
} else if (CurrentPos.Column >= (MaxCols - 1)) {
FileBuffer.LowVisibleRange.Column = HighCol - 2;
FileBuffer.HighVisibleRange.Column = HighCol + MaxCols - 2;
++FileBuffer.FilePosition.Column;
FileBuffer.DisplayPosition.Column = TEXT_START_COLUMN + 2;
FileBuffer.Refresh();
} else {
++FileBuffer.FilePosition.Column;
++FileBuffer.DisplayPosition.Column;
}
MainEditor.StatusBar->SetPosition(FileBuffer.FilePosition.Row,FileBuffer.FilePosition.Column);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferHome (
VOID
)
{
FileBuffer.DisplayPosition.Column = TEXT_START_COLUMN;
FileBuffer.FilePosition.Column = TEXT_START_COLUMN + 1;
if (FileBuffer.LowVisibleRange.Column != TEXT_START_COLUMN) {
FileBuffer.LowVisibleRange.Column = TEXT_START_COLUMN;
FileBuffer.HighVisibleRange.Column = FileBuffer.MaxVisibleColumns;
FileBuffer.Refresh ();
}
MainEditor.StatusBar->SetPosition (FileBuffer.FilePosition.Row,TEXT_START_COLUMN+1);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferEnd (
VOID
)
{
EFI_EDITOR_LINE *Line;
Line = LineCurrent ();
FileBuffer.FilePosition.Column = Line->Size;
if (FileBuffer.HighVisibleRange.Column < (Line->Size - 1)) {
FileBuffer.HighVisibleRange.Column = Line->Size - 1;
FileBuffer.LowVisibleRange.Column = Line->Size - FileBuffer.MaxVisibleColumns;
FileBuffer.Refresh();
}
FileBuffer.DisplayPosition.Column = Line->Size - FileBuffer.LowVisibleRange.Column - 1;
MainEditor.StatusBar->SetPosition (FileBuffer.FilePosition.Row,Line->Size);
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferDoCharInput (
IN CHAR16 Char
)
{
switch (Char) {
case 0:
break;
case 0x08:
FileBufferDoBackspace();
break;
case 0x0a:
case 0x0d:
FileBufferDoReturn();
break;
default:
{
EFI_EDITOR_LINE *Line;
UINTN FilePos;
Line = LineCurrent ();
if (Line->Link.Flink != MainEditor.FileImage->ListHead) {
FilePos = FileBuffer.FilePosition.Column - 1;
if (FileBuffer.ModeInsert || FilePos >= Line->Size-1) {
StrInsert (&Line->Buffer,Char,FilePos,Line->Size+1);
Line->Size++;
} else {
Line->Buffer[FilePos] = Char;
}
} else {
Line->Buffer[0] = Char;
Line->Size++;
FileImageCreateNode();
}
FileBufferRefreshCurrentLine();
FileBufferScrollRight();
}
if (!MainEditor.FileModified) {
MainEditor.FileModified = TRUE;
MainEditor.TitleBar->Refresh();
}
break;
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferDoBackspace (
VOID
)
{
EFI_EDITOR_LINE *Line;
EFI_EDITOR_LINE *End;
LIST_ENTRY *Link;
UINTN FileColumn;
FileColumn = FileBuffer.FilePosition.Column - 1;
if (FileColumn == TEXT_START_COLUMN) {
if (FileBuffer.FilePosition.Row == 1) {
return EFI_SUCCESS;
}
FileBufferScrollLeft();
Line = LineCurrent ();
Link = Line->Link.Flink;
End = CR(Link,EFI_EDITOR_LINE,Link,EFI_EDITOR_LINE_LIST);
LineCat(Line,End);
RemoveEntryList(&End->Link);
FreePool(End);
--MainEditor.FileImage->NumLines;
FileBufferRefresh();
} else {
Line = LineCurrent ();
LineDeleteAt(Line,FileColumn-1);
FileBufferRefreshCurrentLine();
FileBufferScrollLeft();
}
if (!MainEditor.FileModified) {
MainEditor.FileModified = TRUE;
MainEditor.TitleBar->Refresh();
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferDoDelete (
VOID
)
{
EFI_EDITOR_LINE *Line;
EFI_EDITOR_LINE *Next;
LIST_ENTRY *Link;
UINTN FileColumn;
Line = LineCurrent ();
FileColumn = FileBuffer.FilePosition.Column - 1;
if (Line->Link.Flink == MainEditor.FileImage->ListHead) {
return EFI_SUCCESS;
}
if (FileColumn >= Line->Size - 1) {
Link = Line->Link.Flink;
if (Link->Flink == MainEditor.FileImage->ListHead) {
return EFI_SUCCESS;
}
Next = CR(Link,EFI_EDITOR_LINE,Link,EFI_EDITOR_LINE_LIST);
LineCat(Line,Next);
RemoveEntryList(&Next->Link);
FreePool(Next);
--MainEditor.FileImage->NumLines;
FileBufferRefresh();
} else {
LineDeleteAt (Line,FileColumn);
FileBufferRefreshCurrentLine();
}
if (!MainEditor.FileModified) {
MainEditor.FileModified = TRUE;
MainEditor.TitleBar->Refresh();
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferDoReturn (
VOID
)
{
EFI_EDITOR_LINE *Line;
EFI_EDITOR_LINE *NewLine;
UINTN FileColumn;
Line = LineCurrent ();
FileColumn = FileBuffer.FilePosition.Column - 1;
NewLine = AllocatePool(sizeof(EFI_EDITOR_LINE));
NewLine->Signature = EFI_EDITOR_LINE_LIST;
NewLine->Size = Line->Size - FileColumn;
if (NewLine->Size > 1) {
NewLine->Buffer = PoolPrint(L"%s\0",Line->Buffer+FileColumn);
} else {
NewLine->Buffer = PoolPrint(L" \0");
}
Line->Buffer[FileColumn] = ' ';
Line->Buffer[FileColumn+1] = 0;
Line->Size = FileColumn + 1;
NewLine->Link.Blink = &(Line->Link);
NewLine->Link.Flink = Line->Link.Flink;
Line->Link.Flink->Blink = &(NewLine->Link);
Line->Link.Flink = &(NewLine->Link);
++MainEditor.FileImage->NumLines;
BS->Stall(50);
FileBufferRefreshDown();
FileBufferScrollRight();
if (!MainEditor.FileModified) {
MainEditor.FileModified = TRUE;
MainEditor.TitleBar->Refresh();
}
return EFI_SUCCESS;
}
STATIC
EFI_STATUS
FileBufferChangeMode (
VOID
)
{
FileBuffer.ModeInsert = !FileBuffer.ModeInsert;
MainEditor.StatusBar->SetMode(FileBuffer.ModeInsert);
MainEditor.StatusBar->Refresh();
return EFI_SUCCESS;
}
#endif /* _LIB_FILE_BUFFER */