\r
BOOLEAN HBufferImageMouseNeedRefresh;\r
\r
+/**\r
+ Initialization function for HBufferImage\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_LOAD_ERROR A load error occured.\r
+**/\r
EFI_STATUS\r
HBufferImageInit (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Initialization function for HBufferImage\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
- EFI_LOAD_ERROR\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Backup function for HBufferImage. Only a few fields need to be backup. \r
+ This is for making the file buffer refresh as few as possible.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageBackup (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Backup function for HBufferImage\r
- Only a few fields need to be backup. \r
- This is for making the file buffer refresh \r
- as few as possible.\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HBufferImageBackupVar.MousePosition = HBufferImage.MousePosition;\r
\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-HBufferImageFreeLines (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Free all the lines in HBufferImage\r
+/**\r
+ Free all the lines in HBufferImage.\r
Fields affected:\r
Lines\r
CurrentLine\r
NumLines\r
ListHead \r
\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
+EFI_STATUS\r
+HBufferImageFreeLines (\r
+ VOID\r
+ )\r
{\r
HFreeLines (HBufferImage.ListHead, HBufferImage.Lines);\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Cleanup function for HBufferImage\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageCleanup (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Cleanup function for HBufferImage\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
\r
\r
HFileImageCleanup ();\r
HDiskImageCleanup ();\r
- HMemImageCleanup ();\r
\r
return Status;\r
\r
}\r
\r
+/**\r
+ Print Line on Row\r
+\r
+ @param[in] Line The lline to print.\r
+ @param[in] Row The row on screen ( begin from 1 ).\r
+ @param[in] FRow The FRow.\r
+ @param[in] Orig The original color.\r
+ @param[in] New The color to print with.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImagePrintLine (\r
IN HEFI_EDITOR_LINE *Line,\r
IN HEFI_EDITOR_COLOR_UNION New\r
\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Print Line on Row\r
-\r
-Arguments: \r
-\r
- Line - Line to print\r
- Row - Row on screen ( begin from 1 )\r
- FRow - FRow\r
- Orig - Orig\r
- New - Light display\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
\r
UINTN Index;\r
\r
}\r
\r
- if (HEditorMouseAction == FALSE) {\r
+ if (!HEditorMouseAction) {\r
ShellPrintEx (\r
0,\r
(INT32)Row - 1,\r
//\r
// PRINT the buffer content\r
//\r
- if (HEditorMouseAction == FALSE) {\r
+ if (!HEditorMouseAction) {\r
for (Index = 0; Index < 0x10 && Index < Line->Size; Index++) {\r
Pos = ASCII_POSITION + Index;\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Function to decide if a column number is stored in the high bits.\r
+\r
+ @param[in] Column The column to examine.\r
+ @param[out] FCol The actual column number.\r
+\r
+ @retval TRUE The actual column was in high bits and is now in FCol.\r
+ @retval FALSE There was not a column number in the high bits.\r
+**/\r
BOOLEAN\r
HBufferImageIsAtHighBits (\r
IN UINTN Column,\r
\r
*FCol = (Column / 3) + 1;\r
\r
- if (!(Column % 3)) {\r
+ if (Column % 3 == 0) {\r
return TRUE;\r
}\r
\r
return FALSE;\r
}\r
\r
+/**\r
+ Decide if a point is in the already selected area.\r
+\r
+ @param[in] MouseRow The row of the point to test.\r
+ @param[in] MouseCol The col of the point to test.\r
+\r
+ @retval TRUE The point is in the selected area.\r
+ @retval FALSE The point is not in the selected area.\r
+**/\r
BOOLEAN\r
HBufferImageIsInSelectedArea (\r
IN UINTN MouseRow,\r
return TRUE;\r
}\r
\r
+/**\r
+ Set mouse position according to HBufferImage.MousePosition.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageRestoreMousePosition (\r
VOID\r
CurrentLine = HBufferImage.CurrentLine;\r
Line = HMoveLine (FRow - HBufferImage.BufferPosition.Row);\r
\r
- if (FColumn > Line->Size) {\r
+ if (Line == NULL || FColumn > Line->Size) {\r
HasCharacter = FALSE;\r
}\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Set cursor position according to HBufferImage.DisplayPosition.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageRestorePosition (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Set cursor position according to HBufferImage.DisplayPosition.\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
//\r
// set cursor position\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Refresh function for HBufferImage.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_LOAD_ERROR A Load error occured.\r
+\r
+**/\r
EFI_STATUS\r
HBufferImageRefresh (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Refresh function for HBufferImage\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
- EFI_LOAD_ERROR \r
-\r
---*/\r
{\r
LIST_ENTRY *Link;\r
HEFI_EDITOR_LINE *Line;\r
// no definite required refresh\r
// and file position displayed on screen has not been changed\r
//\r
- if (HBufferImageNeedRefresh == FALSE &&\r
- HBufferImageOnlyLineNeedRefresh == FALSE &&\r
+ if (!HBufferImageNeedRefresh &&\r
+ !HBufferImageOnlyLineNeedRefresh &&\r
HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow\r
) {\r
HBufferImageRestoreMousePosition ();\r
//\r
// only need to refresh current line\r
//\r
- if (HBufferImageOnlyLineNeedRefresh == TRUE && HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow) {\r
+ if (HBufferImageOnlyLineNeedRefresh && HBufferImageBackupVar.LowVisibleRow == HBufferImage.LowVisibleRow) {\r
\r
HBufferImagePrintLine (\r
HBufferImage.CurrentLine,\r
} while (Link != HBufferImage.ListHead && Row <= EndRow);\r
\r
while (Row <= EndRow) {\r
- HEditorClearLine (Row);\r
+ EditorClearLine (Row, HMainEditor.ScreenSize.Column, HMainEditor.ScreenSize.Row);\r
Row++;\r
}\r
//\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Read an image into a buffer friom a source.\r
+\r
+ @param[in] FileName Pointer to the file name. OPTIONAL and ignored if not FileTypeFileBuffer.\r
+ @param[in] DiskName Pointer to the disk name. OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+ @param[in] DiskOffset Offset into the disk. OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+ @param[in] DiskSize Size of the disk buffer. OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+ @param[in] MemOffset Offset into the Memory. OPTIONAL and ignored if not FileTypeMemBuffer.\r
+ @param[in] MemSize Size of the Memory buffer. OPTIONAL and ignored if not FileTypeMemBuffer.\r
+ @param[in] BufferType The type of buffer to save. IGNORED.\r
+ @param[in] Recover TRUE for recovermode, FALSE otherwise.\r
+\r
+ @return EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
+EFIAPI\r
HBufferImageRead (\r
IN CONST CHAR16 *FileName,\r
IN CONST CHAR16 *DiskName,\r
return Status;\r
}\r
\r
+/**\r
+ Save the current image.\r
+\r
+ @param[in] FileName Pointer to the file name. OPTIONAL and ignored if not FileTypeFileBuffer.\r
+ @param[in] DiskName Pointer to the disk name. OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+ @param[in] DiskOffset Offset into the disk. OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+ @param[in] DiskSize Size of the disk buffer. OPTIONAL and ignored if not FileTypeDiskBuffer.\r
+ @param[in] MemOffset Offset into the Memory. OPTIONAL and ignored if not FileTypeMemBuffer.\r
+ @param[in] MemSize Size of the Memory buffer. OPTIONAL and ignored if not FileTypeMemBuffer.\r
+ @param[in] BufferType The type of buffer to save. IGNORED.\r
+\r
+ @return EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageSave (\r
IN CHAR16 *FileName,\r
return Status;\r
}\r
\r
-HEFI_EDITOR_LINE *\r
-HBufferImageCreateLine (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Create a new line and append it to the line list\r
+/**\r
+ Create a new line and append it to the line list.\r
Fields affected:\r
NumLines\r
Lines \r
\r
-Arguments: \r
+ @retval NULL create line failed.\r
+ @return the line created.\r
\r
- None\r
-\r
-Returns: \r
-\r
- NULL -- create line failed\r
- Not NULL -- the line created\r
-\r
---*/\r
+**/\r
+HEFI_EDITOR_LINE *\r
+HBufferImageCreateLine (\r
+ VOID\r
+ )\r
{\r
HEFI_EDITOR_LINE *Line;\r
\r
return Line;\r
}\r
\r
+/**\r
+ Free the current image.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageFree (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Function called when load a new file in. It will free all the old lines\r
- and set FileModified field to FALSE\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
//\r
// free all lines\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-HBufferImageHandleInput (\r
- IN EFI_INPUT_KEY *Key\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Dispatch input to different handler\r
+/**\r
+ change char to int value based on Hex.\r
\r
-Arguments: \r
+ @param[in] Char The input char.\r
\r
- Key -- input key\r
- the keys can be:\r
- ASCII KEY\r
- Backspace/Delete\r
- Direction key: up/down/left/right/pgup/pgdn\r
- Home/End\r
- INS\r
+ @return The character's index value.\r
+ @retval -1 The operation failed.\r
+**/\r
+INTN\r
+EFIAPI\r
+HBufferImageCharToHex (\r
+ IN CHAR16 Char\r
+ )\r
+{\r
+ //\r
+ // change the character to hex\r
+ //\r
+ if (Char >= L'0' && Char <= L'9') {\r
+ return (INTN) (Char - L'0');\r
+ }\r
\r
-Returns: \r
+ if (Char >= L'a' && Char <= L'f') {\r
+ return (INTN) (Char - L'a' + 10);\r
+ }\r
\r
- EFI_SUCCESS\r
- EFI_LOAD_ERROR\r
- EFI_OUT_OF_RESOURCES\r
+ if (Char >= L'A' && Char <= L'F') {\r
+ return (INTN) (Char - L'A' + 10);\r
+ }\r
\r
---*/\r
-{\r
- EFI_STATUS Status;\r
+ return -1;\r
+}\r
\r
- Status = EFI_SUCCESS;\r
+/**\r
+ Add character.\r
\r
- switch (Key->ScanCode) {\r
- //\r
- // ordinary key\r
- //\r
- case SCAN_NULL:\r
- Status = HBufferImageDoCharInput (Key->UnicodeChar);\r
- break;\r
+ @param[in] Char -- input char.\r
\r
- //\r
- // up arrow\r
- //\r
- case SCAN_UP:\r
- Status = HBufferImageScrollUp ();\r
- break;\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageAddChar (\r
+ IN CHAR16 Char\r
+ )\r
+{\r
+ HEFI_EDITOR_LINE *Line;\r
+ HEFI_EDITOR_LINE *NewLine;\r
+ INTN Value;\r
+ UINT8 Old;\r
+ UINTN FRow;\r
+ UINTN FCol;\r
+ BOOLEAN High;\r
\r
- //\r
- // down arrow\r
- //\r
- case SCAN_DOWN:\r
- Status = HBufferImageScrollDown ();\r
- break;\r
+ Value = HBufferImageCharToHex (Char);\r
\r
//\r
- // right arrow\r
+ // invalid input\r
//\r
- case SCAN_RIGHT:\r
- Status = HBufferImageScrollRight ();\r
- break;\r
+ if (Value == -1) {\r
+ return EFI_SUCCESS;\r
+ }\r
\r
- //\r
- // left arrow\r
- //\r
- case SCAN_LEFT:\r
- Status = HBufferImageScrollLeft ();\r
- break;\r
+ Line = HBufferImage.CurrentLine;\r
+ FRow = HBufferImage.BufferPosition.Row;\r
+ FCol = HBufferImage.BufferPosition.Column;\r
+ High = HBufferImage.HighBits;\r
\r
//\r
- // page up\r
+ // only needs to refresh current line\r
//\r
- case SCAN_PAGE_UP:\r
- Status = HBufferImagePageUp ();\r
- break;\r
+ HBufferImageOnlyLineNeedRefresh = TRUE;\r
\r
//\r
- // page down\r
+ // not a full line and beyond the last character\r
//\r
- case SCAN_PAGE_DOWN:\r
- Status = HBufferImagePageDown ();\r
- break;\r
+ if (FCol > Line->Size) {\r
+ //\r
+ // cursor always at high 4 bits\r
+ // and always put input to the low 4 bits\r
+ //\r
+ Line->Buffer[Line->Size] = (UINT8) Value;\r
+ Line->Size++;\r
+ High = FALSE;\r
+ } else {\r
\r
- //\r
- // delete\r
- //\r
- case SCAN_DELETE:\r
- Status = HBufferImageDoDelete ();\r
- break;\r
+ Old = Line->Buffer[FCol - 1];\r
\r
- //\r
- // home\r
- //\r
- case SCAN_HOME:\r
- Status = HBufferImageHome ();\r
- break;\r
+ //\r
+ // always put the input to the low 4 bits\r
+ //\r
+ Old = (UINT8) (Old & 0x0f);\r
+ Old = (UINT8) (Old << 4);\r
+ Old = (UINT8) (Value + Old);\r
+ Line->Buffer[FCol - 1] = Old;\r
\r
- //\r
- // end\r
- //\r
- case SCAN_END:\r
- Status = HBufferImageEnd ();\r
- break;\r
+ //\r
+ // at the low 4 bits of the last character of a full line\r
+ // so if no next line, need to create a new line\r
+ //\r
+ if (!High && FCol == 0x10) {\r
\r
- default:\r
- Status = StatusBarSetStatusString (L"Unknown Command");\r
- break;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-HBufferImageDoCharInput (\r
- IN CHAR16 Char\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- ASCII key + Backspace + return\r
-\r
-Arguments: \r
-\r
- Char -- input char\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
- EFI_LOAD_ERROR\r
- EFI_OUT_OF_RESOURCES\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_SUCCESS;\r
-\r
- switch (Char) {\r
- case 0:\r
- break;\r
-\r
- case 0x08:\r
- Status = HBufferImageDoBackspace ();\r
- break;\r
-\r
- case 0x09:\r
- case 0x0a:\r
- case 0x0d:\r
- //\r
- // Tabs, Returns are thought as nothing\r
- //\r
- break;\r
-\r
- default:\r
- //\r
- // DEAL WITH ASCII CHAR, filter out thing like ctrl+f\r
- //\r
- if (Char > 127 || Char < 32) {\r
- Status = StatusBarSetStatusString (L"Unknown Command");\r
- } else {\r
- Status = HBufferImageAddChar (Char);\r
- }\r
-\r
- break;\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-INTN\r
-HBufferImageCharToHex (\r
- IN CHAR16 Char\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- change char to int value based on Hex\r
-\r
-Arguments: \r
-\r
- Char -- input char\r
-\r
-Returns: \r
-\r
- int value;\r
-\r
-\r
---*/\r
-{\r
- //\r
- // change the character to hex\r
- //\r
- if (Char >= L'0' && Char <= L'9') {\r
- return (INTN) (Char - L'0');\r
- }\r
-\r
- if (Char >= L'a' && Char <= L'f') {\r
- return (INTN) (Char - L'a' + 10);\r
- }\r
-\r
- if (Char >= L'A' && Char <= L'F') {\r
- return (INTN) (Char - L'A' + 10);\r
- }\r
-\r
- return -1;\r
-}\r
-\r
-EFI_STATUS\r
-HBufferImageAddChar (\r
- IN CHAR16 Char\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Add character\r
-\r
-Arguments: \r
-\r
- Char -- input char\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
- EFI_OUT_OF_RESOURCES\r
-\r
---*/\r
-{\r
- HEFI_EDITOR_LINE *Line;\r
- HEFI_EDITOR_LINE *NewLine;\r
- INTN Value;\r
- UINT8 Old;\r
- UINTN FRow;\r
- UINTN FCol;\r
- BOOLEAN High;\r
-\r
- Value = HBufferImageCharToHex (Char);\r
-\r
- //\r
- // invalid input\r
- //\r
- if (Value == -1) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- Line = HBufferImage.CurrentLine;\r
- FRow = HBufferImage.BufferPosition.Row;\r
- FCol = HBufferImage.BufferPosition.Column;\r
- High = HBufferImage.HighBits;\r
-\r
- //\r
- // only needs to refresh current line\r
- //\r
- HBufferImageOnlyLineNeedRefresh = TRUE;\r
-\r
- //\r
- // not a full line and beyond the last character\r
- //\r
- if (FCol > Line->Size) {\r
- //\r
- // cursor always at high 4 bits\r
- // and always put input to the low 4 bits\r
- //\r
- Line->Buffer[Line->Size] = (UINT8) Value;\r
- Line->Size++;\r
- High = FALSE;\r
- } else {\r
-\r
- Old = Line->Buffer[FCol - 1];\r
-\r
- //\r
- // always put the input to the low 4 bits\r
- //\r
- Old = (UINT8) (Old & 0x0f);\r
- Old = (UINT8) (Old << 4);\r
- Old = (UINT8) (Value + Old);\r
- Line->Buffer[FCol - 1] = Old;\r
-\r
- //\r
- // at the low 4 bits of the last character of a full line\r
- // so if no next line, need to create a new line\r
- //\r
- if (High == FALSE && FCol == 0x10) {\r
-\r
- HBufferImageOnlyLineNeedRefresh = FALSE;\r
- HBufferImageNeedRefresh = TRUE;\r
+ HBufferImageOnlyLineNeedRefresh = FALSE;\r
+ HBufferImageNeedRefresh = TRUE;\r
\r
if (Line->Link.ForwardLink == HBufferImage.ListHead) {\r
//\r
//\r
// if already at end of this line, scroll it to the start of next line\r
//\r
- if (FCol == 0x10 && High == FALSE) {\r
+ if (FCol == 0x10 && !High) {\r
//\r
// definitely has next line\r
//\r
return EFI_SUCCESS;\r
}\r
\r
-BOOLEAN\r
-HInCurrentScreen (\r
- IN UINTN FileRow\r
+/**\r
+ Delete the previous character.\r
+\r
+ @retval EFI_SUCCESS The operationw as successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageDoBackspace (\r
+ VOID\r
)\r
-/*++\r
+{\r
+ HEFI_EDITOR_LINE *Line;\r
+\r
+ UINTN FileColumn;\r
+ UINTN FPos;\r
+ BOOLEAN LastLine;\r
\r
-Routine Description: \r
+ //\r
+ // variable initialization\r
+ //\r
+ LastLine = FALSE;\r
\r
- Check user specified FileRow and FileCol is in current screen\r
+ //\r
+ // already the first character\r
+ //\r
+ if (HBufferImage.BufferPosition.Row == 1 && HBufferImage.BufferPosition.Column == 1) {\r
+ return EFI_SUCCESS;\r
+ }\r
\r
-Arguments: \r
+ FPos = (HBufferImage.BufferPosition.Row - 1) * 0x10 + HBufferImage.BufferPosition.Column - 1;\r
\r
- FileRow -- Row of file position ( start from 1 )\r
+ FileColumn = HBufferImage.BufferPosition.Column;\r
\r
+ Line = HBufferImage.CurrentLine;\r
+ LastLine = FALSE;\r
+ if (Line->Link.ForwardLink == HBufferImage.ListHead && FileColumn > 1) {\r
+ LastLine = TRUE;\r
+ }\r
\r
-Returns: \r
+ HBufferImageDeleteCharacterFromBuffer (FPos - 1, 1, NULL);\r
\r
- TRUE\r
- FALSE\r
+ //\r
+ // if is the last line\r
+ // then only this line need to be refreshed\r
+ //\r
+ if (LastLine) {\r
+ HBufferImageNeedRefresh = FALSE;\r
+ HBufferImageOnlyLineNeedRefresh = TRUE;\r
+ } else {\r
+ HBufferImageNeedRefresh = TRUE;\r
+ HBufferImageOnlyLineNeedRefresh = FALSE;\r
+ }\r
\r
---*/\r
-{\r
- if (FileRow >= HBufferImage.LowVisibleRow && FileRow <= HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 5) - 1) {\r
- return TRUE;\r
+ if (!HBufferImage.Modified) {\r
+ HBufferImage.Modified = TRUE;\r
}\r
\r
- return FALSE;\r
+ return EFI_SUCCESS;\r
}\r
\r
-BOOLEAN\r
-HAboveCurrentScreen (\r
- IN UINTN FileRow\r
+/**\r
+ ASCII key + Backspace + return.\r
+\r
+ @param[in] Char The input char.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_LOAD_ERROR A load error occured.\r
+ @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HBufferImageDoCharInput (\r
+ IN CHAR16 Char\r
)\r
-/*++\r
+{\r
+ EFI_STATUS Status;\r
\r
-Routine Description: \r
+ Status = EFI_SUCCESS;\r
\r
- Check user specified FileRow is above current screen\r
+ switch (Char) {\r
+ case 0:\r
+ break;\r
\r
-Arguments: \r
+ case 0x08:\r
+ Status = HBufferImageDoBackspace ();\r
+ break;\r
\r
- FileRow -- Row of file position ( start from 1 )\r
- \r
-Returns: \r
+ case 0x09:\r
+ case 0x0a:\r
+ case 0x0d:\r
+ //\r
+ // Tabs, Returns are thought as nothing\r
+ //\r
+ break;\r
\r
- TRUE\r
- FALSE\r
+ default:\r
+ //\r
+ // DEAL WITH ASCII CHAR, filter out thing like ctrl+f\r
+ //\r
+ if (Char > 127 || Char < 32) {\r
+ Status = StatusBarSetStatusString (L"Unknown Command");\r
+ } else {\r
+ Status = HBufferImageAddChar (Char);\r
+ }\r
\r
---*/\r
-{\r
- if (FileRow < HBufferImage.LowVisibleRow) {\r
- return TRUE;\r
+ break;\r
}\r
\r
- return FALSE;\r
+ return Status;\r
}\r
\r
+/**\r
+ Check user specified FileRow is above current screen.\r
+\r
+ @param[in] FileRow Row of file position ( start from 1 ).\r
+ \r
+ @retval TRUE It is above the current screen.\r
+ @retval FALSE It is not above the current screen.\r
+\r
+**/\r
BOOLEAN\r
-HUnderCurrentScreen (\r
+HAboveCurrentScreen (\r
IN UINTN FileRow\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Check user specified FileRow is under current screen\r
+{\r
+ if (FileRow < HBufferImage.LowVisibleRow) {\r
+ return TRUE;\r
+ }\r
\r
-Arguments: \r
+ return FALSE;\r
+}\r
\r
- FileRow -- Row of file position ( start from 1 )\r
+/**\r
+ Check user specified FileRow is under current screen.\r
\r
-Returns: \r
+ @param[in] FileRow Row of file position ( start from 1 ).\r
\r
- TRUE\r
- FALSE\r
+ @retval TRUE It is under the current screen.\r
+ @retval FALSE It is not under the current screen.\r
\r
---*/\r
+**/\r
+BOOLEAN\r
+HUnderCurrentScreen (\r
+ IN UINTN FileRow\r
+ )\r
{\r
if (FileRow > HBufferImage.LowVisibleRow + (HMainEditor.ScreenSize.Row - 5) - 1) {\r
return TRUE;\r
return FALSE;\r
}\r
\r
+/**\r
+ According to cursor's file position, adjust screen display.\r
+\r
+ @param[in] NewFilePosRow Row of file position ( start from 1 ).\r
+ @param[in] NewFilePosCol Column of file position ( start from 1 ).\r
+ @param[in] HighBits Cursor will on high4 bits or low4 bits.\r
+**/\r
VOID\r
HBufferImageMovePosition (\r
IN UINTN NewFilePosRow,\r
IN UINTN NewFilePosCol,\r
IN BOOLEAN HighBits\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- According to cursor's file position, adjust screen display\r
-\r
-Arguments: \r
-\r
- NewFilePosRow -- Row of file position ( start from 1 )\r
- NewFilePosCol -- Column of file position ( start from 1 ) \r
- HighBits -- cursor will on high4 bits or low4 bits\r
-\r
-Returns: \r
-\r
- None\r
-\r
---*/\r
{\r
INTN RowGap;\r
UINTN Abs;\r
NewDisplayCol++;\r
}\r
\r
- if (HighBits == FALSE) {\r
+ if (!HighBits) {\r
NewDisplayCol++;\r
}\r
\r
\r
}\r
\r
+/**\r
+ Scroll cursor to right.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageScrollRight (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to right\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HEFI_EDITOR_LINE *Line;\r
UINTN FRow;\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-HBufferImageScrollLeft (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to left\r
-\r
-Arguments: \r
+/**\r
+ Scroll cursor to left.\r
\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
+EFI_STATUS\r
+HBufferImageScrollLeft (\r
+ VOID\r
+ )\r
{\r
\r
HEFI_EDITOR_LINE *Line;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Scroll cursor to the next line\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageScrollDown (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to the next line\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HEFI_EDITOR_LINE *Line;\r
UINTN FRow;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Scroll cursor to previous line\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageScrollUp (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to previous line\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HEFI_EDITOR_LINE *Line;\r
UINTN FRow;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Scroll cursor to next page\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImagePageDown (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to next page\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HEFI_EDITOR_LINE *Line;\r
UINTN FRow;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Scroll cursor to previous page\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImagePageUp (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to previous page\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HEFI_EDITOR_LINE *Line;\r
UINTN FRow;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Scroll cursor to start of line\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageHome (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to start of line\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HEFI_EDITOR_LINE *Line;\r
UINTN FRow;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Scroll cursor to end of line.\r
+\r
+ @retval EFI_SUCCESS Teh operation was successful.\r
+**/\r
EFI_STATUS\r
HBufferImageEnd (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Scroll cursor to end of line\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
HEFI_EDITOR_LINE *Line;\r
UINTN FRow;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Get the size of the open buffer.\r
+\r
+ @retval The size in bytes.\r
+**/\r
UINTN\r
HBufferImageGetTotalSize (\r
VOID\r
return Size;\r
}\r
\r
+/**\r
+ Delete character from buffer.\r
+ \r
+ @param[in] Pos Position, Pos starting from 0.\r
+ @param[in] Count The Count of characters to delete.\r
+ @param[out] DeleteBuffer The DeleteBuffer.\r
+\r
+ @retval EFI_SUCCESS Success \r
+**/\r
EFI_STATUS\r
HBufferImageDeleteCharacterFromBuffer (\r
IN UINTN Pos,\r
IN UINTN Count,\r
OUT UINT8 *DeleteBuffer\r
)\r
-/*++\r
-Routine Description:\r
-\r
- Delete character from buffer\r
- \r
-Arguments:\r
-\r
- Pos - Position, Pos starting from 0\r
- Count - Count\r
- DeleteBuffer - DeleteBuffer\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS Success\r
- \r
---*/\r
{\r
UINTN Index;\r
\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Add character to buffer, add before pos.\r
+\r
+ @param[in] Pos Position, Pos starting from 0.\r
+ @param[in] Count Count of characters to add.\r
+ @param[in] AddBuffer Add buffer.\r
+\r
+ @retval EFI_SUCCESS Success. \r
+**/\r
EFI_STATUS\r
HBufferImageAddCharacterToBuffer (\r
IN UINTN Pos,\r
IN UINTN Count,\r
IN UINT8 *AddBuffer\r
)\r
-/*++'\r
-Routine Description:\r
-\r
- Add character to buffer, add before pos\r
-\r
-Arguments:\r
-\r
- Pos - Position, Pos starting from 0\r
- Count - Count\r
- AddBuffer - Add buffer\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS Success\r
- \r
---*/\r
{\r
INTN Index;\r
\r
return EFI_SUCCESS;\r
}\r
\r
-EFI_STATUS\r
-HBufferImageDoBackspace (\r
- VOID\r
- )\r
-/*++\r
-\r
-Routine Description: \r
-\r
- delete the previous character\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
-{\r
- HEFI_EDITOR_LINE *Line;\r
-\r
- UINTN FileColumn;\r
- UINTN FPos;\r
- BOOLEAN LastLine;\r
-\r
- //\r
- // variable initialization\r
- //\r
- LastLine = FALSE;\r
-\r
- //\r
- // already the first character\r
- //\r
- if (HBufferImage.BufferPosition.Row == 1 && HBufferImage.BufferPosition.Column == 1) {\r
- return EFI_SUCCESS;\r
- }\r
-\r
- FPos = (HBufferImage.BufferPosition.Row - 1) * 0x10 + HBufferImage.BufferPosition.Column - 1;\r
-\r
- FileColumn = HBufferImage.BufferPosition.Column;\r
-\r
- Line = HBufferImage.CurrentLine;\r
- LastLine = FALSE;\r
- if (Line->Link.ForwardLink == HBufferImage.ListHead && FileColumn > 1) {\r
- LastLine = TRUE;\r
- }\r
-\r
- HBufferImageDeleteCharacterFromBuffer (FPos - 1, 1, NULL);\r
-\r
- //\r
- // if is the last line\r
- // then only this line need to be refreshed\r
- //\r
- if (LastLine) {\r
- HBufferImageNeedRefresh = FALSE;\r
- HBufferImageOnlyLineNeedRefresh = TRUE;\r
- } else {\r
- HBufferImageNeedRefresh = TRUE;\r
- HBufferImageOnlyLineNeedRefresh = FALSE;\r
- }\r
-\r
- if (!HBufferImage.Modified) {\r
- HBufferImage.Modified = TRUE;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
+/**\r
+ Delete current character from line.\r
\r
+ @retval EFI_SUCCESS The operationw as successful.\r
+**/\r
EFI_STATUS\r
+EFIAPI\r
HBufferImageDoDelete (\r
VOID\r
)\r
-/*++\r
-\r
-Routine Description: \r
-\r
- Delete current character from line\r
-\r
-Arguments: \r
-\r
- None\r
-\r
-Returns: \r
-\r
- EFI_SUCCESS\r
-\r
---*/\r
{\r
\r
HEFI_EDITOR_LINE *Line;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Change the raw buffer to a list of lines for the UI.\r
+ \r
+ @param[in] Buffer The pointer to the buffer to fill.\r
+ @param[in] Bytes The size of the buffer in bytes.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_OUT_OF_RESOURCES A memory allocation failed.\r
+**/\r
EFI_STATUS\r
+EFIAPI\r
HBufferImageBufferToList (\r
IN VOID *Buffer,\r
IN UINTN Bytes\r
)\r
{\r
- UINTN i;\r
- UINTN j;\r
+ UINTN TempI;\r
+ UINTN TempJ;\r
UINTN Left;\r
HEFI_EDITOR_LINE *Line;\r
UINT8 *BufferPtr;\r
\r
- i = 0;\r
+ TempI = 0;\r
Left = 0;\r
BufferPtr = (UINT8 *) Buffer;\r
\r
//\r
// parse file content line by line\r
//\r
- while (i < Bytes) {\r
- if (Bytes - i >= 0x10) {\r
+ while (TempI < Bytes) {\r
+ if (Bytes - TempI >= 0x10) {\r
Left = 0x10;\r
} else {\r
- Left = Bytes - i;\r
+ Left = Bytes - TempI;\r
}\r
\r
//\r
\r
Line->Size = Left;\r
\r
- for (j = 0; j < Left; j++) {\r
- Line->Buffer[j] = BufferPtr[i];\r
- i++;\r
+ for (TempJ = 0; TempJ < Left; TempJ++) {\r
+ Line->Buffer[TempJ] = BufferPtr[TempI];\r
+ TempI++;\r
}\r
\r
}\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Change the list of lines from the UI to a raw buffer.\r
+ \r
+ @param[in] Buffer The pointer to the buffer to fill.\r
+ @param[in] Bytes The size of the buffer in bytes.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
EFI_STATUS\r
+EFIAPI\r
HBufferImageListToBuffer (\r
IN VOID *Buffer,\r
IN UINTN Bytes\r
\r
Line = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
\r
+ //@todo shouldn't this be an error???\r
if (Count + Line->Size > Bytes) {\r
return EFI_SUCCESS;\r
}\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Move the mouse in the image buffer.\r
+\r
+ @param[in] TextX The x-coordinate.\r
+ @param[in] TextY The y-coordinate.\r
+**/\r
VOID\r
+EFIAPI\r
HBufferImageAdjustMousePosition (\r
IN INT32 TextX,\r
IN INT32 TextY\r
)\r
{\r
- UINTN X;\r
- UINTN Y;\r
+ UINTN TempX;\r
+ UINTN TempY;\r
UINTN AbsX;\r
UINTN AbsY;\r
\r
// This function will change it to MousePosition\r
//\r
//\r
- // get absolute X value\r
+ // get absolute TempX value\r
//\r
if (TextX >= 0) {\r
AbsX = TextX;\r
AbsX = -TextX;\r
}\r
//\r
- // get absolute Y value\r
+ // get absolute TempY value\r
//\r
if (TextY >= 0) {\r
AbsY = TextY;\r
AbsY = -TextY;\r
}\r
\r
- X = HBufferImage.MousePosition.Column;\r
- Y = HBufferImage.MousePosition.Row;\r
+ TempX = HBufferImage.MousePosition.Column;\r
+ TempY = HBufferImage.MousePosition.Row;\r
\r
if (TextX >= 0) {\r
- X += TextX;\r
+ TempX += TextX;\r
} else {\r
- if (X >= AbsX) {\r
- X -= AbsX;\r
+ if (TempX >= AbsX) {\r
+ TempX -= AbsX;\r
} else {\r
- X = 0;\r
+ TempX = 0;\r
}\r
}\r
\r
if (TextY >= 0) {\r
- Y += TextY;\r
+ TempY += TextY;\r
} else {\r
- if (Y >= AbsY) {\r
- Y -= AbsY;\r
+ if (TempY >= AbsY) {\r
+ TempY -= AbsY;\r
} else {\r
- Y = 0;\r
+ TempY = 0;\r
}\r
}\r
//\r
// check whether new mouse column position is beyond screen\r
// if not, adjust it\r
//\r
- if (X >= 10 && X <= (10 + 0x10 * 3 - 1)) {\r
- HBufferImage.MousePosition.Column = X;\r
- } else if (X < 10) {\r
+ if (TempX >= 10 && TempX <= (10 + 0x10 * 3 - 1)) {\r
+ HBufferImage.MousePosition.Column = TempX;\r
+ } else if (TempX < 10) {\r
HBufferImage.MousePosition.Column = 10;\r
- } else if (X > (10 + 0x10 * 3 - 1)) {\r
+ } else if (TempX > (10 + 0x10 * 3 - 1)) {\r
HBufferImage.MousePosition.Column = 10 + 0x10 * 3 - 1;\r
}\r
//\r
// check whether new mouse row position is beyond screen\r
// if not, adjust it\r
//\r
- if (Y >= 2 && Y <= (HMainEditor.ScreenSize.Row - 4)) {\r
- HBufferImage.MousePosition.Row = Y;\r
- } else if (Y < 2) {\r
+ if (TempY >= 2 && TempY <= (HMainEditor.ScreenSize.Row - 4)) {\r
+ HBufferImage.MousePosition.Row = TempY;\r
+ } else if (TempY < 2) {\r
HBufferImage.MousePosition.Row = 2;\r
- } else if (Y > (HMainEditor.ScreenSize.Row - 4)) {\r
+ } else if (TempY > (HMainEditor.ScreenSize.Row - 4)) {\r
HBufferImage.MousePosition.Row = (HMainEditor.ScreenSize.Row - 4);\r
}\r
\r
}\r
+\r
+/**\r
+ Dispatch input to different handler\r
+\r
+ @param[in] Key The input key:\r
+ the keys can be:\r
+ ASCII KEY\r
+ Backspace/Delete\r
+ Direction key: up/down/left/right/pgup/pgdn\r
+ Home/End\r
+ INS\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_LOAD_ERROR A load error occured.\r
+ @retval EFI_OUT_OF_RESOURCES A Memory allocation failed.\r
+**/\r
+EFI_STATUS\r
+HBufferImageHandleInput (\r
+ IN EFI_INPUT_KEY *Key\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ switch (Key->ScanCode) {\r
+ //\r
+ // ordinary key\r
+ //\r
+ case SCAN_NULL:\r
+ Status = HBufferImageDoCharInput (Key->UnicodeChar);\r
+ break;\r
+\r
+ //\r
+ // up arrow\r
+ //\r
+ case SCAN_UP:\r
+ Status = HBufferImageScrollUp ();\r
+ break;\r
+\r
+ //\r
+ // down arrow\r
+ //\r
+ case SCAN_DOWN:\r
+ Status = HBufferImageScrollDown ();\r
+ break;\r
+\r
+ //\r
+ // right arrow\r
+ //\r
+ case SCAN_RIGHT:\r
+ Status = HBufferImageScrollRight ();\r
+ break;\r
+\r
+ //\r
+ // left arrow\r
+ //\r
+ case SCAN_LEFT:\r
+ Status = HBufferImageScrollLeft ();\r
+ break;\r
+\r
+ //\r
+ // page up\r
+ //\r
+ case SCAN_PAGE_UP:\r
+ Status = HBufferImagePageUp ();\r
+ break;\r
+\r
+ //\r
+ // page down\r
+ //\r
+ case SCAN_PAGE_DOWN:\r
+ Status = HBufferImagePageDown ();\r
+ break;\r
+\r
+ //\r
+ // delete\r
+ //\r
+ case SCAN_DELETE:\r
+ Status = HBufferImageDoDelete ();\r
+ break;\r
+\r
+ //\r
+ // home\r
+ //\r
+ case SCAN_HOME:\r
+ Status = HBufferImageHome ();\r
+ break;\r
+\r
+ //\r
+ // end\r
+ //\r
+ case SCAN_END:\r
+ Status = HBufferImageEnd ();\r
+ break;\r
+\r
+ default:\r
+ Status = StatusBarSetStatusString (L"Unknown Command");\r
+ break;\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r