/*++ 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 */