2 Defines the Main Editor data type -
4 - Instances of the other objects of the editor
7 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>
8 This program and the accompanying materials
9 are licensed and made available under the terms and conditions of the BSD License
10 which accompanies this distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include "HexEditor.h"
19 #include "EditStatusBar.h"
20 #include "EditInputBar.h"
22 HEFI_EDITOR_COLOR_ATTRIBUTES HOriginalColors
;
26 // the first time editor launch
31 // it's time editor should exit
35 BOOLEAN HEditorMouseAction
;
37 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage
;
38 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImageBackupVar
;
40 extern HEFI_EDITOR_CLIPBOARD HClipBoard
;
42 extern BOOLEAN HBufferImageMouseNeedRefresh
;
43 extern BOOLEAN HBufferImageNeedRefresh
;
44 extern BOOLEAN HBufferImageOnlyLineNeedRefresh
;
46 HEFI_EDITOR_GLOBAL_EDITOR HMainEditor
;
47 HEFI_EDITOR_GLOBAL_EDITOR HMainEditorBackupVar
;
50 // basic initialization for MainEditor
52 HEFI_EDITOR_GLOBAL_EDITOR HMainEditorConst
= {
72 HMainCommandGoToOffset (
79 move cursor to specified lines
98 // variable initialization
108 Status
= InputBarSetPrompt (L
"Go To Offset: ");
109 if (EFI_ERROR (Status
)) {
113 Status
= InputBarSetStringSize (8);
114 if (EFI_ERROR (Status
)) {
119 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
124 if (Status
== EFI_NOT_READY
) {
129 // THE input string length should > 0
131 if (StrLen (InputBarGetString()) > 0) {
132 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
133 if (EFI_ERROR (Status
)) {
134 StatusBarSetStatusString (L
"Invalid Offset");
142 Size
= HBufferImageGetTotalSize ();
143 if (Offset
>= Size
) {
144 StatusBarSetStatusString (L
"Invalid Offset");
148 FRow
= (UINTN
)DivU64x32(Offset
, 0x10) + 1;
149 FCol
= (UINTN
)ModU64x32(Offset
, 0x10) + 1;
151 HBufferImageMovePosition (FRow
, FCol
, TRUE
);
153 HBufferImageNeedRefresh
= TRUE
;
154 HBufferImageOnlyLineNeedRefresh
= FALSE
;
155 HBufferImageMouseNeedRefresh
= TRUE
;
161 HMainCommandSaveBuffer (
168 save current opened buffer .
169 if is file buffer, you can save to current file name or
170 save to another file name
190 SHELL_FILE_HANDLE ShellFileHandle
;
192 if (HMainEditor
.BufferImage
->BufferType
!= FileTypeFileBuffer
) {
193 if (HMainEditor
.BufferImage
->Modified
== FALSE
) {
197 Status
= InputBarSetPrompt (L
"Dangerous to save disk/mem buffer. Save (Yes/No/Cancel) ? ");
198 if (EFI_ERROR (Status
)) {
202 // the answer is just one character
204 Status
= InputBarSetStringSize (1);
205 if (EFI_ERROR (Status
)) {
209 // loop for user's answer
210 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
213 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
218 if (Status
== EFI_NOT_READY
) {
222 switch (InputBarGetString()[0]) {
226 // want to save this buffer first
228 Status
= HBufferImageSave (
230 HMainEditor
.BufferImage
->DiskImage
->Name
,
231 HMainEditor
.BufferImage
->DiskImage
->Offset
,
232 HMainEditor
.BufferImage
->DiskImage
->Size
,
233 HMainEditor
.BufferImage
->MemImage
->Offset
,
234 HMainEditor
.BufferImage
->MemImage
->Size
,
235 HMainEditor
.BufferImage
->BufferType
238 if (EFI_ERROR (Status
)) {
239 StatusBarSetStatusString (L
"BufferSave: Problems Writing");
248 // the file won't be saved
266 // ENDOF != FILEBUFFER
268 // This command will save currently opened file to disk.
269 // You can choose save to another file name or just save to
270 // current file name.
271 // Below is the scenario of Save File command: (
272 // Suppose the old file name is A )
273 // 1. An Input Bar will be prompted: "File To Save: [ old file name]"
274 // IF user press ESC, Save File command ends .
275 // IF user press Enter, input file name will be A.
276 // IF user inputs a new file name B, input file name will be B.
278 // 2. IF input file name is A, go to do Step 3.
279 // IF input file name is B, go to do Step 4.
281 // 3. IF A is read only, Status Bar will show "Access Denied"
282 // and Save File commands ends.
283 // IF A is not read only, save file buffer to disk
284 // and remove Modified flag in Title Bar , then Save File command ends.
286 // 4. IF B does not exist, create this file and save file buffer to it.
288 // IF B exits, do Step 5.
290 // 5. An Input Bar will be prompted:
291 // "File Exists. Overwrite ( Yes/No/Cancel ) ?"
292 // IF user press 'y' or 'Y', do Step 6.
293 // IF user press 'n' or 'N', Save File commands ends.
294 // IF user press 'c' or 'C' or ESC, Save File commands ends.
296 // 6. IF B is a read-only file, Status Bar will show "Access Denied"
297 // and Save File commands ends.
298 // IF B can be read and write, save file buffer to B.
300 // 7. Update File Name field in Title Bar to B
301 // and remove the Modified flag in Title Bar.
303 Str
= CatSPrint(NULL
,
304 L
"File to Save: [%s]",
305 HMainEditor
.BufferImage
->FileImage
->FileName
308 return EFI_OUT_OF_RESOURCES
;
311 if (StrLen (Str
) >= 50) {
313 // replace the long file name with "..."
322 Status
= InputBarSetPrompt (Str
);
323 if (EFI_ERROR (Status
)) {
327 Status
= InputBarSetStringSize (100);
328 if (EFI_ERROR (Status
)) {
334 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
337 // if user pressed ESC
339 if (Status
== EFI_NOT_READY
) {
340 SHELL_FREE_NON_NULL (Str
);
344 SHELL_FREE_NON_NULL (Str
);
347 // if just enter pressed, so think save to current file name
349 if (StrLen (InputBarGetString()) == 0) {
350 FileName
= CatSPrint(NULL
,
352 HMainEditor
.BufferImage
->FileImage
->FileName
355 FileName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
358 if (FileName
== NULL
) {
359 return EFI_OUT_OF_RESOURCES
;
362 if (!IsValidFileName (FileName
)) {
363 StatusBarSetStatusString (L
"Invalid File Name");
364 SHELL_FREE_NON_NULL (FileName
);
371 // save to the old file
373 if (StringNoCaseCompare (
375 &HMainEditor
.BufferImage
->FileImage
->FileName
382 // if the file is read only, so can not write back to it.
384 if (HMainEditor
.BufferImage
->FileImage
->ReadOnly
== TRUE
) {
385 StatusBarSetStatusString (L
"Access Denied");
386 SHELL_FREE_NON_NULL (FileName
);
390 Status
= ShellOpenFileByName (FileName
, &ShellFileHandle
, EFI_FILE_MODE_READ
, 0);
392 if (!EFI_ERROR (Status
)) {
394 Info
= ShellGetFileInfo(ShellFileHandle
);
396 ShellCloseFile(&ShellFileHandle
);
398 // check if read only
400 if (Info
->Attribute
& EFI_FILE_READ_ONLY
) {
401 StatusBarSetStatusString (L
"Access Denied");
402 SHELL_FREE_NON_NULL (FileName
);
406 SHELL_FREE_NON_NULL(Info
);
408 // ask user whether to overwrite this file
410 Status
= InputBarSetPrompt (L
"File exists. Overwrite (Yes/No/Cancel) ? ");
411 if (EFI_ERROR (Status
)) {
412 SHELL_FREE_NON_NULL (FileName
);
416 Status
= InputBarSetStringSize (1);
417 if (EFI_ERROR (Status
)) {
418 SHELL_FREE_NON_NULL (FileName
);
424 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
426 if (Status
== EFI_NOT_READY
) {
427 SHELL_FREE_NON_NULL (FileName
);
431 switch (InputBarGetString()[0]) {
438 SHELL_FREE_NON_NULL (FileName
);
442 SHELL_FREE_NON_NULL (FileName
);
446 } // if opened existing file
450 // save file back to disk
452 Status
= HBufferImageSave (
454 HMainEditor
.BufferImage
->DiskImage
->Name
,
455 HMainEditor
.BufferImage
->DiskImage
->Offset
,
456 HMainEditor
.BufferImage
->DiskImage
->Size
,
457 HMainEditor
.BufferImage
->MemImage
->Offset
,
458 HMainEditor
.BufferImage
->MemImage
->Size
,
461 SHELL_FREE_NON_NULL (FileName
);
463 if (EFI_ERROR (Status
)) {
464 return EFI_LOAD_ERROR
;
471 HMainCommandSelectStart (
478 Load a disk buffer editor
494 Start
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
499 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
500 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
501 StatusBarSetStatusString (L
"Invalid Block Start");
502 return EFI_LOAD_ERROR
;
506 if (HMainEditor
.SelectEnd
!= 0 && Start
> HMainEditor
.SelectEnd
) {
507 StatusBarSetStatusString (L
"Invalid Block Start");
508 return EFI_LOAD_ERROR
;
511 HMainEditor
.SelectStart
= Start
;
513 HBufferImageNeedRefresh
= TRUE
;
519 HMainCommandSelectEnd (
526 Load a disk buffer editor
542 End
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
547 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
548 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
549 StatusBarSetStatusString (L
"Invalid Block End");
550 return EFI_LOAD_ERROR
;
554 if (HMainEditor
.SelectStart
!= 0 && End
< HMainEditor
.SelectStart
) {
555 StatusBarSetStatusString (L
"Invalid Block End");
559 HMainEditor
.SelectEnd
= End
;
561 HBufferImageNeedRefresh
= TRUE
;
574 cut current line to clipboard
589 HEFI_EDITOR_LINE
*Line
;
595 // not select, so not allowed to cut
597 if (HMainEditor
.SelectStart
== 0) {
598 StatusBarSetStatusString (L
"No Block is Selected");
602 // not select, so not allowed to cut
604 if (HMainEditor
.SelectEnd
== 0) {
605 StatusBarSetStatusString (L
"No Block is Selected");
609 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
610 for (Index
= 0; Index
< (HMainEditor
.SelectEnd
- 1) / 0x10; Index
++) {
611 Link
= Link
->ForwardLink
;
614 Line
= CR (Link
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
616 Count
= HMainEditor
.SelectEnd
- HMainEditor
.SelectStart
+ 1;
617 Buffer
= AllocateZeroPool (Count
);
618 if (Buffer
== NULL
) {
619 return EFI_OUT_OF_RESOURCES
;
622 // cut the selected area
624 HBufferImageDeleteCharacterFromBuffer (
625 HMainEditor
.SelectStart
- 1,
633 HClipBoardSet (Buffer
, Count
);
635 HBufferImageNeedRefresh
= TRUE
;
636 HBufferImageOnlyLineNeedRefresh
= FALSE
;
638 if (!HMainEditor
.BufferImage
->Modified
) {
639 HMainEditor
.BufferImage
->Modified
= TRUE
;
643 // now no select area
645 HMainEditor
.SelectStart
= 0;
646 HMainEditor
.SelectEnd
= 0;
659 paste line to file buffer
675 BOOLEAN OnlyLineRefresh
;
676 HEFI_EDITOR_LINE
*Line
;
681 Count
= HClipBoardGet (&Buffer
);
682 if (Count
== 0 || Buffer
== NULL
) {
683 StatusBarSetStatusString (L
"Nothing to Paste");
687 Line
= HMainEditor
.BufferImage
->CurrentLine
;
689 OnlyLineRefresh
= FALSE
;
690 if (Line
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
&& Line
->Size
+ Count
< 0x10) {
692 // is at last line, and after paste will not exceed
693 // so only this line need to be refreshed
695 // if after add, the line is 0x10, then will append a new line
696 // so the whole page will need be refreshed
698 OnlyLineRefresh
= TRUE
;
702 FPos
= 0x10 * (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) + HMainEditor
.BufferImage
->BufferPosition
.Column
- 1;
704 HBufferImageAddCharacterToBuffer (FPos
, Count
, Buffer
);
706 if (OnlyLineRefresh
) {
707 HBufferImageNeedRefresh
= FALSE
;
708 HBufferImageOnlyLineNeedRefresh
= TRUE
;
710 HBufferImageNeedRefresh
= TRUE
;
711 HBufferImageOnlyLineNeedRefresh
= FALSE
;
714 if (!HMainEditor
.BufferImage
->Modified
) {
715 HMainEditor
.BufferImage
->Modified
= TRUE
;
747 // Below is the scenario of Exit command:
748 // 1. IF currently opened file is not modified, exit the editor and
749 // Exit command ends.
750 // IF currently opened file is modified, do Step 2
752 // 2. An Input Bar will be prompted:
753 // "File modified. Save ( Yes/No/Cancel )?"
754 // IF user press 'y' or 'Y', currently opened file will be saved and
756 // IF user press 'n' or 'N', currently opened file will not be saved
758 // IF user press 'c' or 'C' or ESC, Exit command ends.
761 // if file has been modified, so will prompt user
762 // whether to save the changes
764 if (HMainEditor
.BufferImage
->Modified
) {
766 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
767 if (EFI_ERROR (Status
)) {
771 Status
= InputBarSetStringSize (1);
772 if (EFI_ERROR (Status
)) {
777 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
782 if (Status
== EFI_NOT_READY
) {
786 switch (InputBarGetString()[0]) {
790 // write file back to disk
792 Status
= HBufferImageSave (
793 HMainEditor
.BufferImage
->FileImage
->FileName
,
794 HMainEditor
.BufferImage
->DiskImage
->Name
,
795 HMainEditor
.BufferImage
->DiskImage
->Offset
,
796 HMainEditor
.BufferImage
->DiskImage
->Size
,
797 HMainEditor
.BufferImage
->MemImage
->Offset
,
798 HMainEditor
.BufferImage
->MemImage
->Size
,
799 HMainEditor
.BufferImage
->BufferType
801 if (!EFI_ERROR (Status
)) {
826 HMainCommandOpenFile (
833 Load a file from disk to editor
849 EDIT_FILE_TYPE BufferType
;
851 BufferType
= HMainEditor
.BufferImage
->BufferType
;
854 // This command will open a file from current working directory.
855 // Read-only file can also be opened. But it can not be modified.
856 // Below is the scenario of Open File command:
857 // 1. IF currently opened file has not been modified, directly go to step .
858 // IF currently opened file has been modified, an Input Bar will be
860 // "File Modified. Save ( Yes/No/Cancel) ?"
861 // IF user press 'y' or 'Y', currently opened file will be saved.
862 // IF user press 'n' or 'N', currently opened file will
864 // IF user press 'c' or 'C' or ESC, Open File command ends and
865 // currently opened file is still opened.
867 // 2. An Input Bar will be prompted as : "File Name to Open: "
868 // IF user press ESC, Open File command ends and
869 // currently opened file is still opened.
870 // Any other inputs with a Return will cause
871 // currently opened file close.
873 // 3. IF user input file name is an existing file ,
874 // this file will be read and opened.
875 // IF user input file name is a new file, this file will be created
876 // and opened. This file's type ( UNICODE or ASCII ) is the same with
880 // if current file is modified, so you need to choose whether to
883 if (HMainEditor
.BufferImage
->Modified
) {
885 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
886 if (EFI_ERROR (Status
)) {
890 // the answer is just one character
892 Status
= InputBarSetStringSize (1);
893 if (EFI_ERROR (Status
)) {
897 // loop for user's answer
898 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
902 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
907 if (Status
== EFI_NOT_READY
) {
911 switch (InputBarGetString()[0]) {
915 // want to save this buffer first
917 Status
= HBufferImageSave (
918 HMainEditor
.BufferImage
->FileImage
->FileName
,
919 HMainEditor
.BufferImage
->DiskImage
->Name
,
920 HMainEditor
.BufferImage
->DiskImage
->Offset
,
921 HMainEditor
.BufferImage
->DiskImage
->Size
,
922 HMainEditor
.BufferImage
->MemImage
->Offset
,
923 HMainEditor
.BufferImage
->MemImage
->Size
,
924 HMainEditor
.BufferImage
->BufferType
926 if (EFI_ERROR (Status
)) {
930 MainTitleBarRefresh (
931 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
932 HMainEditor
.BufferImage
->BufferType
,
933 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
935 HMainEditor
.ScreenSize
.Column
,
936 HMainEditor
.ScreenSize
.Row
,
937 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
938 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
946 // the file won't be saved
958 // TO get the open file name
960 Status
= InputBarSetPrompt (L
"File Name to Open: ");
961 if (EFI_ERROR (Status
)) {
963 HMainEditor
.BufferImage
->FileImage
->FileName
,
964 HMainEditor
.BufferImage
->DiskImage
->Name
,
965 HMainEditor
.BufferImage
->DiskImage
->Offset
,
966 HMainEditor
.BufferImage
->DiskImage
->Size
,
967 HMainEditor
.BufferImage
->MemImage
->Offset
,
968 HMainEditor
.BufferImage
->MemImage
->Size
,
975 Status
= InputBarSetStringSize (100);
976 if (EFI_ERROR (Status
)) {
977 Status
= HBufferImageRead (
978 HMainEditor
.BufferImage
->FileImage
->FileName
,
979 HMainEditor
.BufferImage
->DiskImage
->Name
,
980 HMainEditor
.BufferImage
->DiskImage
->Offset
,
981 HMainEditor
.BufferImage
->DiskImage
->Size
,
982 HMainEditor
.BufferImage
->MemImage
->Offset
,
983 HMainEditor
.BufferImage
->MemImage
->Size
,
991 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
996 if (Status
== EFI_NOT_READY
) {
997 Status
= HBufferImageRead (
998 HMainEditor
.BufferImage
->FileImage
->FileName
,
999 HMainEditor
.BufferImage
->DiskImage
->Name
,
1000 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1001 HMainEditor
.BufferImage
->DiskImage
->Size
,
1002 HMainEditor
.BufferImage
->MemImage
->Offset
,
1003 HMainEditor
.BufferImage
->MemImage
->Size
,
1011 // THE input string length should > 0
1013 if (StrLen (InputBarGetString()) > 0) {
1015 // CHECK if filename's valid
1017 if (!IsValidFileName (InputBarGetString())) {
1019 HMainEditor
.BufferImage
->FileImage
->FileName
,
1020 HMainEditor
.BufferImage
->DiskImage
->Name
,
1021 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1022 HMainEditor
.BufferImage
->DiskImage
->Size
,
1023 HMainEditor
.BufferImage
->MemImage
->Offset
,
1024 HMainEditor
.BufferImage
->MemImage
->Size
,
1029 StatusBarSetStatusString (L
"Invalid File Name");
1039 Status
= HBufferImageRead (
1040 InputBarGetString(),
1041 HMainEditor
.BufferImage
->DiskImage
->Name
,
1042 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1043 HMainEditor
.BufferImage
->DiskImage
->Size
,
1044 HMainEditor
.BufferImage
->MemImage
->Offset
,
1045 HMainEditor
.BufferImage
->MemImage
->Size
,
1050 if (EFI_ERROR (Status
)) {
1052 HMainEditor
.BufferImage
->FileImage
->FileName
,
1053 HMainEditor
.BufferImage
->DiskImage
->Name
,
1054 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1055 HMainEditor
.BufferImage
->DiskImage
->Size
,
1056 HMainEditor
.BufferImage
->MemImage
->Offset
,
1057 HMainEditor
.BufferImage
->MemImage
->Size
,
1062 return EFI_LOAD_ERROR
;
1069 HMainCommandOpenDisk (
1074 Routine Description:
1076 Load a disk buffer editor
1086 EFI_OUT_OF_RESOURCES
1097 EDIT_FILE_TYPE BufferType
;
1100 // variable initialization
1104 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1107 // if current file is modified, so you need to choose
1108 // whether to save it first.
1110 if (HMainEditor
.BufferImage
->Modified
) {
1112 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1113 if (EFI_ERROR (Status
)) {
1117 // the answer is just one character
1119 Status
= InputBarSetStringSize (1);
1120 if (EFI_ERROR (Status
)) {
1124 // loop for user's answer
1125 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1129 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1134 if (Status
== EFI_NOT_READY
) {
1138 switch (InputBarGetString()[0]) {
1142 // want to save this buffer first
1144 Status
= HBufferImageSave (
1145 HMainEditor
.BufferImage
->FileImage
->FileName
,
1146 HMainEditor
.BufferImage
->DiskImage
->Name
,
1147 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1148 HMainEditor
.BufferImage
->DiskImage
->Size
,
1149 HMainEditor
.BufferImage
->MemImage
->Offset
,
1150 HMainEditor
.BufferImage
->MemImage
->Size
,
1153 if (EFI_ERROR (Status
)) {
1157 MainTitleBarRefresh (
1158 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1159 HMainEditor
.BufferImage
->BufferType
,
1160 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1162 HMainEditor
.ScreenSize
.Column
,
1163 HMainEditor
.ScreenSize
.Row
,
1164 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1165 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1173 // the file won't be saved
1185 // get disk block device name
1187 Status
= InputBarSetPrompt (L
"Block Device to Open: ");
1188 if (EFI_ERROR (Status
)) {
1192 Status
= InputBarSetStringSize (100);
1193 if (EFI_ERROR (Status
)) {
1198 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1203 if (Status
== EFI_NOT_READY
) {
1208 // THE input string length should > 0
1210 if (StrLen (InputBarGetString()) > 0) {
1215 DeviceName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
1216 if (DeviceName
== NULL
) {
1217 return EFI_OUT_OF_RESOURCES
;
1220 // get starting offset
1222 Status
= InputBarSetPrompt (L
"First Block No.: ");
1223 if (EFI_ERROR (Status
)) {
1227 Status
= InputBarSetStringSize (16);
1228 if (EFI_ERROR (Status
)) {
1233 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1238 if (Status
== EFI_NOT_READY
) {
1243 // THE input string length should > 0
1245 if (StrLen (InputBarGetString()) > 0) {
1246 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1247 if (EFI_ERROR (Status
)) {
1255 // get Number of Blocks:
1257 Status
= InputBarSetPrompt (L
"Number of Blocks: ");
1258 if (EFI_ERROR (Status
)) {
1262 Status
= InputBarSetStringSize (8);
1263 if (EFI_ERROR (Status
)) {
1268 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1273 if (Status
== EFI_NOT_READY
) {
1278 // THE input string length should > 0
1280 if (StrLen (InputBarGetString()) > 0) {
1281 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1282 if (EFI_ERROR (Status
)) {
1294 Status
= HBufferImageRead (
1305 if (EFI_ERROR (Status
)) {
1308 HMainEditor
.BufferImage
->FileImage
->FileName
,
1309 HMainEditor
.BufferImage
->DiskImage
->Name
,
1310 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1311 HMainEditor
.BufferImage
->DiskImage
->Size
,
1312 HMainEditor
.BufferImage
->MemImage
->Offset
,
1313 HMainEditor
.BufferImage
->MemImage
->Size
,
1317 return EFI_NOT_FOUND
;
1324 HMainCommandOpenMemory (
1329 Routine Description:
1331 Load memory content to editor
1341 EFI_OUT_OF_RESOURCES
1350 EDIT_FILE_TYPE BufferType
;
1353 // variable initialization
1357 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1360 // if current buffer is modified, so you need to choose
1361 // whether to save it first.
1363 if (HMainEditor
.BufferImage
->Modified
) {
1365 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1366 if (EFI_ERROR (Status
)) {
1370 // the answer is just one character
1372 Status
= InputBarSetStringSize (1);
1373 if (EFI_ERROR (Status
)) {
1377 // loop for user's answer
1378 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1382 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1387 if (Status
== EFI_NOT_READY
) {
1391 switch (InputBarGetString()[0]) {
1395 // want to save this buffer first
1397 Status
= HBufferImageSave (
1398 HMainEditor
.BufferImage
->FileImage
->FileName
,
1399 HMainEditor
.BufferImage
->DiskImage
->Name
,
1400 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1401 HMainEditor
.BufferImage
->DiskImage
->Size
,
1402 HMainEditor
.BufferImage
->MemImage
->Offset
,
1403 HMainEditor
.BufferImage
->MemImage
->Size
,
1406 if (EFI_ERROR (Status
)) {
1410 MainTitleBarRefresh (
1411 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1412 HMainEditor
.BufferImage
->BufferType
,
1413 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1415 HMainEditor
.ScreenSize
.Column
,
1416 HMainEditor
.ScreenSize
.Row
,
1417 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1418 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1426 // the file won't be saved
1438 // get starting offset
1440 Status
= InputBarSetPrompt (L
"Starting Offset: ");
1441 if (EFI_ERROR (Status
)) {
1445 Status
= InputBarSetStringSize (8);
1446 if (EFI_ERROR (Status
)) {
1451 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1456 if (Status
== EFI_NOT_READY
) {
1461 // THE input string length should > 0
1463 if (StrLen (InputBarGetString()) > 0) {
1464 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1465 if (EFI_ERROR (Status
)) {
1473 // get Number of Blocks:
1475 Status
= InputBarSetPrompt (L
"Buffer Size: ");
1476 if (EFI_ERROR (Status
)) {
1480 Status
= InputBarSetStringSize (8);
1481 if (EFI_ERROR (Status
)) {
1486 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1491 if (Status
== EFI_NOT_READY
) {
1496 // THE input string length should > 0
1498 if (StrLen (InputBarGetString()) > 0) {
1499 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1500 if (EFI_ERROR (Status
)) {
1512 if ((Offset
+ Size
- 1)> 0xffffffff) {
1513 StatusBarSetStatusString (L
"Invalid parameter");
1514 return EFI_LOAD_ERROR
;
1517 Status
= HBufferImageRead (
1528 if (EFI_ERROR (Status
)) {
1529 StatusBarSetStatusString (L
"Read Device Error!");
1531 HMainEditor
.BufferImage
->FileImage
->FileName
,
1532 HMainEditor
.BufferImage
->DiskImage
->Name
,
1533 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1534 HMainEditor
.BufferImage
->DiskImage
->Size
,
1535 HMainEditor
.BufferImage
->MemImage
->Offset
,
1536 HMainEditor
.BufferImage
->MemImage
->Size
,
1540 return EFI_NOT_FOUND
;
1546 CONST EDITOR_MENU_ITEM HexEditorMenuItems
[] = {
1548 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_GO_TO_OFFSET
),
1549 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F1
),
1550 HMainCommandGoToOffset
1553 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SAVE_BUFFER
),
1554 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F2
),
1555 HMainCommandSaveBuffer
1558 STRING_TOKEN(STR_EDIT_LIBMENUBAR_EXIT
),
1559 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F3
),
1564 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_START
),
1565 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F4
),
1566 HMainCommandSelectStart
1569 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_END
),
1570 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F5
),
1571 HMainCommandSelectEnd
1574 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_CUT
),
1575 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F6
),
1579 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_PASTE
),
1580 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F7
),
1585 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_FILE
),
1586 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F8
),
1587 HMainCommandOpenFile
1590 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_DISK
),
1591 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F9
),
1592 HMainCommandOpenDisk
1595 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_MEMORY
),
1596 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F10
),
1597 HMainCommandOpenMemory
1614 Routine Description:
1616 Init function for MainEditor
1630 EFI_HANDLE
*HandleBuffer
;
1635 // basic initialization
1637 CopyMem (&HMainEditor
, &HMainEditorConst
, sizeof (HMainEditor
));
1640 // set screen attributes
1642 HMainEditor
.ColorAttributes
.Colors
.Foreground
= gST
->ConOut
->Mode
->Attribute
& 0x000000ff;
1644 HMainEditor
.ColorAttributes
.Colors
.Background
= (UINT8
) (gST
->ConOut
->Mode
->Attribute
>> 4);
1646 HOriginalColors
= HMainEditor
.ColorAttributes
.Colors
;
1648 HOriginalMode
= gST
->ConOut
->Mode
->Mode
;
1651 // query screen size
1653 gST
->ConOut
->QueryMode (
1655 gST
->ConOut
->Mode
->Mode
,
1656 &(HMainEditor
.ScreenSize
.Column
),
1657 &(HMainEditor
.ScreenSize
.Row
)
1661 // Find mouse in System Table ConsoleInHandle
1663 Status
= gBS
->HandleProtocol (
1665 &gEfiSimplePointerProtocolGuid
,
1666 (VOID
**)&HMainEditor
.MouseInterface
1668 if (EFI_ERROR (Status
)) {
1670 // If there is no Simple Pointer Protocol on System Table
1672 HandleBuffer
= NULL
;
1673 HMainEditor
.MouseInterface
= NULL
;
1674 Status
= gBS
->LocateHandleBuffer (
1676 &gEfiSimplePointerProtocolGuid
,
1681 if (!EFI_ERROR (Status
) && HandleCount
> 0) {
1683 // Try to find the first available mouse device
1685 for (Index
= 0; Index
< HandleCount
; Index
++) {
1686 Status
= gBS
->HandleProtocol (
1687 HandleBuffer
[Index
],
1688 &gEfiSimplePointerProtocolGuid
,
1689 (VOID
**)&HMainEditor
.MouseInterface
1691 if (!EFI_ERROR (Status
)) {
1696 if (HandleBuffer
!= NULL
) {
1697 FreePool (HandleBuffer
);
1701 if (!EFI_ERROR (Status
) && HMainEditor
.MouseInterface
!= NULL
) {
1702 HMainEditor
.MouseAccumulatorX
= 0;
1703 HMainEditor
.MouseAccumulatorY
= 0;
1704 HMainEditor
.MouseSupported
= TRUE
;
1708 // below will call the five components' init function
1710 Status
= MainTitleBarInit (NULL
);
1711 if (EFI_ERROR (Status
)) {
1712 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE
), gShellDebug1HiiHandle
);
1713 return EFI_LOAD_ERROR
;
1716 Status
= MenuBarInit (HexEditorMenuItems
);
1717 if (EFI_ERROR (Status
)) {
1718 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1719 return EFI_LOAD_ERROR
;
1722 Status
= StatusBarInit ();
1723 if (EFI_ERROR (Status
)) {
1724 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS
), gShellDebug1HiiHandle
);
1725 return EFI_LOAD_ERROR
;
1730 Status
= HBufferImageInit ();
1731 if (EFI_ERROR (Status
)) {
1732 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE
), gShellDebug1HiiHandle
);
1733 return EFI_LOAD_ERROR
;
1736 Status
= HClipBoardInit ();
1737 if (EFI_ERROR (Status
)) {
1738 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD
), gShellDebug1HiiHandle
);
1739 return EFI_LOAD_ERROR
;
1742 // clear whole screen and enable cursor
1744 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1745 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
1748 // initialize EditorFirst and EditorExit
1750 HEditorFirst
= TRUE
;
1751 HEditorExit
= FALSE
;
1752 HEditorMouseAction
= FALSE
;
1758 HMainEditorCleanup (
1763 Routine Description:
1765 cleanup function for MainEditor
1781 // call the five components' cleanup function
1783 MainTitleBarCleanup ();
1787 StatusBarCleanup ();
1791 Status
= HBufferImageCleanup ();
1792 if (EFI_ERROR (Status
)) {
1793 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN
), gShellDebug1HiiHandle
);
1796 Status
= HClipBoardCleanup ();
1797 if (EFI_ERROR (Status
)) {
1798 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN
), gShellDebug1HiiHandle
);
1803 if (HOriginalMode
!= gST
->ConOut
->Mode
->Mode
) {
1804 gST
->ConOut
->SetMode (gST
->ConOut
, HOriginalMode
);
1807 gST
->ConOut
->SetAttribute (
1809 EFI_TEXT_ATTR (HOriginalColors
.Foreground
, HOriginalColors
.Background
)
1811 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1817 HMainEditorRefresh (
1822 Routine Description:
1824 Refresh function for MainEditor
1842 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1843 HMainEditor
.BufferImage
->FileImage
->FileName
!= NULL
&&
1844 HBufferImageBackupVar
.FileImage
!= NULL
&&
1845 HBufferImageBackupVar
.FileImage
->FileName
!= NULL
&&
1846 StrCmp (HMainEditor
.BufferImage
->FileImage
->FileName
, HBufferImageBackupVar
.FileImage
->FileName
) != 0 ) {
1849 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1850 HBufferImageBackupVar
.FileImage
!= NULL
&&
1851 HMainEditor
.BufferImage
->FileImage
->ReadOnly
!= HBufferImageBackupVar
.FileImage
->ReadOnly
) {
1856 // to aVOID screen flicker
1857 // the stall value is from experience
1862 // call the components refresh function
1866 || HMainEditor
.BufferImage
->BufferType
!= HBufferImageBackupVar
.BufferType
1867 || HBufferImageBackupVar
.Modified
!= HMainEditor
.BufferImage
->Modified
1870 MainTitleBarRefresh (
1871 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1872 HMainEditor
.BufferImage
->BufferType
,
1873 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1874 HMainEditor
.BufferImage
->Modified
,
1875 HMainEditor
.ScreenSize
.Column
,
1876 HMainEditor
.ScreenSize
.Row
,
1877 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1878 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1880 HBufferImageRefresh ();
1883 || HBufferImageBackupVar
.DisplayPosition
.Row
!= HMainEditor
.BufferImage
->DisplayPosition
.Row
1884 || HBufferImageBackupVar
.DisplayPosition
.Column
!= HMainEditor
.BufferImage
->DisplayPosition
.Column
1885 || StatusBarGetRefresh()) {
1889 HMainEditor
.ScreenSize
.Row
,
1890 HMainEditor
.ScreenSize
.Column
,
1895 HBufferImageRefresh ();
1900 HMainEditor
.ScreenSize
.Row
,
1901 HMainEditor
.ScreenSize
.Column
);
1902 HBufferImageRefresh ();
1906 // EditorFirst is now set to FALSE
1908 HEditorFirst
= FALSE
;
1915 HMainEditorHandleMouseInput (
1916 IN EFI_SIMPLE_POINTER_STATE MouseState
,
1917 OUT BOOLEAN
*BeforeLeftButtonDown
1927 HEFI_EDITOR_LINE
*Line
;
1934 // have mouse movement
1936 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
1940 TextX
= HGetTextX (MouseState
.RelativeMovementX
);
1941 TextY
= HGetTextY (MouseState
.RelativeMovementY
);
1943 HBufferImageAdjustMousePosition (TextX
, TextY
);
1949 if (MouseState
.LeftButton
) {
1950 HighBits
= HBufferImageIsAtHighBits (
1951 HMainEditor
.BufferImage
->MousePosition
.Column
,
1956 // not at an movable place
1960 // now just move mouse pointer to legal position
1963 // move mouse position to legal position
1965 HMainEditor
.BufferImage
->MousePosition
.Column
-= 10;
1966 if (HMainEditor
.BufferImage
->MousePosition
.Column
> 24) {
1967 HMainEditor
.BufferImage
->MousePosition
.Column
--;
1968 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
1970 if (HMainEditor
.BufferImage
->MousePosition
.Column
< 24) {
1971 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
1984 FRow
= HMainEditor
.BufferImage
->BufferPosition
.Row
+
1985 HMainEditor
.BufferImage
->MousePosition
.Row
-
1986 HMainEditor
.BufferImage
->DisplayPosition
.Row
;
1988 if (HMainEditor
.BufferImage
->NumLines
< FRow
) {
1993 // now just move mouse pointer to legal position
1995 FRow
= HMainEditor
.BufferImage
->NumLines
;
1999 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
2000 for (Index
= 0; Index
< FRow
- 1; Index
++) {
2001 Link
= Link
->ForwardLink
;
2004 Line
= CR (Link
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
2010 // now just move mouse pointer to legal position
2012 if (FCol
> Line
->Size
) {
2013 if (*BeforeLeftButtonDown
) {
2016 if (Line
->Size
== 0) {
2029 FCol
= Line
->Size
+ 1;
2034 HBufferImageMovePosition (FRow
, FCol
, HighBits
);
2036 HMainEditor
.BufferImage
->MousePosition
.Row
= HMainEditor
.BufferImage
->DisplayPosition
.Row
;
2038 HMainEditor
.BufferImage
->MousePosition
.Column
= HMainEditor
.BufferImage
->DisplayPosition
.Column
;
2040 *BeforeLeftButtonDown
= TRUE
;
2045 // else of if LButton
2049 if (*BeforeLeftButtonDown
== TRUE
) {
2055 *BeforeLeftButtonDown
= FALSE
;
2062 return EFI_NOT_FOUND
;
2066 HMainEditorKeyInput (
2071 Routine Description:
2073 Handle user key input. will route it to other components handle function
2083 EFI_OUT_OF_RESOURCES
2089 EFI_SIMPLE_POINTER_STATE MouseState
;
2090 BOOLEAN LengthChange
;
2093 BOOLEAN BeforeMouseIsDown
;
2094 BOOLEAN MouseIsDown
;
2099 UINTN SelectStartBackup
;
2100 UINTN SelectEndBackup
;
2103 // variable initialization
2108 LengthChange
= FALSE
;
2110 MouseIsDown
= FALSE
;
2116 Status
= EFI_SUCCESS
;
2118 HEditorMouseAction
= FALSE
;
2121 // backup some key elements, so that can aVOID some refresh work
2123 HMainEditorBackup ();
2126 // wait for user key input
2129 // change priority of checking mouse/keyboard activity dynamically
2130 // so prevent starvation of keyboard.
2131 // if last time, mouse moves then this time check keyboard
2133 if (HMainEditor
.MouseSupported
) {
2134 Status
= HMainEditor
.MouseInterface
->GetState (
2135 HMainEditor
.MouseInterface
,
2138 if (!EFI_ERROR (Status
)) {
2140 BeforeMouseIsDown
= MouseIsDown
;
2142 Status
= HMainEditorHandleMouseInput (MouseState
, &MouseIsDown
);
2144 if (!EFI_ERROR (Status
)) {
2145 if (BeforeMouseIsDown
== FALSE
) {
2149 if (MouseIsDown
== TRUE
) {
2150 FRow
= HBufferImage
.BufferPosition
.Row
;
2151 FCol
= HBufferImage
.BufferPosition
.Column
;
2152 SelectStartBackup
= HMainEditor
.SelectStart
;
2153 SelectEndBackup
= HMainEditor
.SelectEnd
;
2159 SelectStartBackup
= HMainEditor
.SelectStart
;
2160 SelectEndBackup
= HMainEditor
.SelectEnd
;
2165 if (MouseIsDown
== TRUE
) {
2166 if (FirstDown
== TRUE
) {
2167 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
2168 HMainEditor
.SelectStart
= 0;
2169 HMainEditor
.SelectEnd
= 0;
2170 HMainEditor
.SelectStart
= (FRow
- 1) * 0x10 + FCol
;
2177 (HBufferImage
.BufferPosition
.Row
- 1) *
2179 HBufferImage
.BufferPosition
.Column
2180 ) >= HMainEditor
.SelectStart
2182 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2184 HBufferImage
.BufferPosition
.Column
;
2186 HMainEditor
.SelectEnd
= 0;
2190 // end of if RelativeX/Y
2197 if (HBufferImageGetTotalSize () == 0) {
2198 HMainEditor
.SelectStart
= 0;
2199 HMainEditor
.SelectEnd
= 0;
2205 (HBufferImage
.BufferPosition
.Row
- 1) *
2207 HBufferImage
.BufferPosition
.Column
2208 ) >= HMainEditor
.SelectStart
2210 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2212 HBufferImage
.BufferPosition
.Column
;
2214 HMainEditor
.SelectEnd
= 0;
2217 if (HMainEditor
.SelectEnd
== 0) {
2218 HMainEditor
.SelectStart
= 0;
2226 if (SelectStartBackup
!= HMainEditor
.SelectStart
|| SelectEndBackup
!= HMainEditor
.SelectEnd
) {
2227 if ((SelectStartBackup
- 1) / 0x10 != (HMainEditor
.SelectStart
- 1) / 0x10) {
2228 HBufferImageNeedRefresh
= TRUE
;
2230 if ((SelectEndBackup
- 1) / 0x10 != (HMainEditor
.SelectEnd
- 1) / 0x10) {
2231 HBufferImageNeedRefresh
= TRUE
;
2233 HBufferImageOnlyLineNeedRefresh
= TRUE
;
2239 HEditorMouseAction
= TRUE
;
2240 HBufferImageMouseNeedRefresh
= TRUE
;
2242 } else if (Status
== EFI_LOAD_ERROR
) {
2243 StatusBarSetStatusString (L
"Invalid Mouse Movement ");
2248 Status
= gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
2249 if (!EFI_ERROR (Status
)) {
2251 // dispatch to different components' key handling function
2252 // so not everywhere has to set this variable
2254 HBufferImageMouseNeedRefresh
= TRUE
;
2257 // clear previous status string
2259 StatusBarSetRefresh();
2261 if (Key
.ScanCode
== SCAN_NULL
) {
2262 Status
= HBufferImageHandleInput (&Key
);
2263 } else if (((Key
.ScanCode
>= SCAN_UP
) && (Key
.ScanCode
<= SCAN_PAGE_DOWN
))) {
2264 Status
= HBufferImageHandleInput (&Key
);
2265 } else if (((Key
.ScanCode
>= SCAN_F1
) && Key
.ScanCode
<= (SCAN_F12
))) {
2266 Status
= MenuBarDispatchFunctionKey (&Key
);
2268 StatusBarSetStatusString (L
"Unknown Command");
2270 HBufferImageMouseNeedRefresh
= FALSE
;
2273 if (Status
!= EFI_SUCCESS
&& Status
!= EFI_OUT_OF_RESOURCES
) {
2275 // not already has some error status
2277 if (StrCmp (L
"", StatusBarGetString()) == 0) {
2278 StatusBarSetStatusString (L
"Disk Error. Try Again");
2283 // decide if has to set length warning
2285 if (HBufferImage
.BufferType
!= HBufferImageBackupVar
.BufferType
) {
2286 LengthChange
= FALSE
;
2289 // still the old buffer
2291 if (HBufferImage
.BufferType
!= FileTypeFileBuffer
) {
2292 Size
= HBufferImageGetTotalSize ();
2294 switch (HBufferImage
.BufferType
) {
2295 case FileTypeDiskBuffer
:
2296 OldSize
= HBufferImage
.DiskImage
->Size
* HBufferImage
.DiskImage
->BlockSize
;
2299 case FileTypeMemBuffer
:
2300 OldSize
= HBufferImage
.MemImage
->Size
;
2304 if (LengthChange
== FALSE
) {
2305 if (OldSize
!= Size
) {
2306 StatusBarSetStatusString (L
"Disk/Mem Buffer Length should not be changed");
2310 if (OldSize
!= Size
) {
2311 LengthChange
= TRUE
;
2313 LengthChange
= FALSE
;
2318 // after handling, refresh editor
2320 HMainEditorRefresh ();
2322 } while (Status
!= EFI_OUT_OF_RESOURCES
&& !HEditorExit
);
2328 Backup function for MainEditor.
2336 HMainEditorBackupVar
.SelectStart
= HMainEditor
.SelectStart
;
2337 HMainEditorBackupVar
.SelectEnd
= HMainEditor
.SelectEnd
;
2338 HBufferImageBackup ();