/** @file
  Declares editor types.

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

**/

#pragma once

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

#define MIN_POOL_SIZE      125
#define MAX_STRING_LENGTH  127

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

typedef
EFI_STATUS
(*EFI_MENU_ITEM_FUNCTION) (
  VOID
  );

typedef enum {
  NewLineTypeDefault,
  NewLineTypeLineFeed,
  NewLineTypeCarriageReturn,
  NewLineTypeCarriageReturnLineFeed,
  NewLineTypeLineFeedCarriageReturn,
  NewLineTypeUnknown
} EE_NEWLINE_TYPE;

#define LINE_LIST_SIGNATURE  SIGNATURE_32 ('e', 'e', 'l', 'l')
typedef struct _EFI_EDITOR_LINE {
  UINTN              Signature;
  CHAR16             *Buffer;
  UINTN              Size;                // unit is Unicode
  UINTN              TotalSize;           // unit is Unicode, exclude CHAR_NULL
  EE_NEWLINE_TYPE    Type;
  LIST_ENTRY         Link;
} EFI_EDITOR_LINE;

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

typedef union {
  EFI_EDITOR_COLOR_ATTRIBUTES    Colors;
  UINTN                          Data;
} EFI_EDITOR_COLOR_UNION;

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

typedef struct {
  CHAR16                 *FileName;       // file name current edited in editor
  EDIT_FILE_TYPE         FileType;        // Unicode file or ASCII file
  LIST_ENTRY             *ListHead;       // list head of lines
  EFI_EDITOR_LINE        *Lines;          // lines of current file
  UINTN                  NumLines;        // total line numbers
  EFI_EDITOR_POSITION    DisplayPosition; // cursor position in screen
  EFI_EDITOR_POSITION    FilePosition;    // cursor position in file
  EFI_EDITOR_POSITION    MousePosition;   // mouse position in screen
  // file position of first byte displayed on screen
  //
  EFI_EDITOR_POSITION    LowVisibleRange;

  BOOLEAN                FileModified;    // file is modified or not
  BOOLEAN                ModeInsert;      // input mode INS or OVR
  BOOLEAN                ReadOnly;        // file is read-only or not
  EFI_EDITOR_LINE        *CurrentLine;    // current line cursor is at
} EFI_EDITOR_FILE_BUFFER;

typedef struct {
  EFI_EDITOR_FILE_BUFFER               *FileBuffer;

  EFI_EDITOR_COLOR_UNION               ColorAttributes;
  EFI_EDITOR_POSITION                  ScreenSize; // row number and column number
  EFI_EDITOR_LINE                      *CutLine;   // clip board
  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL    *TextInputEx;
  BOOLEAN                              MouseSupported;
  EFI_SIMPLE_POINTER_PROTOCOL          *MouseInterface;
  INT32                                MouseAccumulatorX;
  INT32                                MouseAccumulatorY;
} EFI_EDITOR_GLOBAL_EDITOR;
