/** @file
  data types that are used by editor

  Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _HEDITOR_TYPE_H_
#define _HEDITOR_TYPE_H_

#include "UefiShellDebug1CommandsLib.h"
#include "EditTitleBar.h"

#define EFI_EDITOR_LINE_LIST  SIGNATURE_32 ('e', 'e', 'l', 'l')

#define ASCII_POSITION        ((0x10 * 3) + 12)


typedef struct {
  UINTN Row;
  UINTN Column;
} HEFI_EDITOR_POSITION;

typedef
EFI_STATUS
(*HEFI_MENU_ITEM_FUNCTION) (
  VOID
  );

typedef struct {
  CHAR16                  Name[50];
  CHAR16                  Key[3];
  HEFI_MENU_ITEM_FUNCTION Function;
} HMENU_ITEMS;

typedef struct _HEFI_EDITOR_LINE {
  UINTN           Signature;
  UINT8           Buffer[0x10];
  UINTN           Size;                             // unit is Unicode
  LIST_ENTRY  Link;
} HEFI_EDITOR_LINE;

typedef struct _HEFI_EDITOR_MENU_ITEM {
  CHAR16                  NameToken;
  CHAR16                  FunctionKeyToken;
  HEFI_MENU_ITEM_FUNCTION Function;
} HEFI_EDITOR_MENU_ITEM;

typedef struct {
  UINT32  Foreground : 4;
  UINT32  Background : 4;
} HEFI_EDITOR_COLOR_ATTRIBUTES;

typedef union {
  HEFI_EDITOR_COLOR_ATTRIBUTES  Colors;
  UINTN                         Data;
} HEFI_EDITOR_COLOR_UNION;

typedef struct {
  UINTN Columns;
  UINTN Rows;
} HEFI_EDITOR_TEXT_MODE;


typedef struct {
  CHAR16  *Name;

  UINTN   BlockSize;
  UINTN   Size;
  UINTN   Offset;
} HEFI_EDITOR_DISK_IMAGE;

typedef struct {
  EFI_CPU_IO2_PROTOCOL *IoFncs;
  UINTN                Offset;
  UINTN                Size;
} HEFI_EDITOR_MEM_IMAGE;

typedef struct {
  CHAR16  *FileName;
  UINTN   Size;                                     // file size
  BOOLEAN ReadOnly;                                 // file is read-only or not
} HEFI_EDITOR_FILE_IMAGE;

typedef struct {
  LIST_ENTRY                      *ListHead;        // list head of lines
  HEFI_EDITOR_LINE                *Lines;           // lines of current file
  UINTN                           NumLines;         // number of lines
  HEFI_EDITOR_LINE                *CurrentLine;     // current line cursor is at
  HEFI_EDITOR_POSITION            DisplayPosition;  // cursor position in screen
  HEFI_EDITOR_POSITION            MousePosition;    // mouse position in screen
  HEFI_EDITOR_POSITION            BufferPosition;   // cursor position in buffer
  UINTN                           LowVisibleRow;    // the lowest visible row of file position
  BOOLEAN                         HighBits;         // cursor is at the high4 bits or low4 bits
  BOOLEAN                         Modified;         // BUFFER is modified or not
  EDIT_FILE_TYPE                  BufferType;

  HEFI_EDITOR_FILE_IMAGE          *FileImage;
  HEFI_EDITOR_DISK_IMAGE          *DiskImage;
  HEFI_EDITOR_MEM_IMAGE           *MemImage;

} HEFI_EDITOR_BUFFER_IMAGE;

typedef struct {
  HEFI_EDITOR_BUFFER_IMAGE          *BufferImage;

  HEFI_EDITOR_COLOR_UNION           ColorAttributes;
  HEFI_EDITOR_POSITION              ScreenSize;           // row number and column number
  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInputEx;
  BOOLEAN                           MouseSupported;
  EFI_SIMPLE_POINTER_PROTOCOL       *MouseInterface;
  INT32                             MouseAccumulatorX;
  INT32                             MouseAccumulatorY;

  UINTN                             SelectStart;          // starting from 1
  UINTN                             SelectEnd;            // starting from 1
} HEFI_EDITOR_GLOBAL_EDITOR;

#endif
