/* TUI data manipulation routines.

   Copyright (C) 1998-2021 Free Software Foundation, Inc.

   Contributed by Hewlett-Packard Company.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef TUI_TUI_DATA_H
#define TUI_TUI_DATA_H

#include "tui/tui.h"
#include "gdb_curses.h"	/* For WINDOW.  */
#include "observable.h"

/* A deleter that calls delwin.  */
struct curses_deleter
{
  void operator() (WINDOW *win) const
  {
    delwin (win);
  }
};

#define MIN_WIN_HEIGHT          3

/* Generic window information.  */
struct tui_win_info
{
protected:

  tui_win_info () = default;
  DISABLE_COPY_AND_ASSIGN (tui_win_info);

  /* This is called after the window is resized, and should update the
     window's contents.  */
  virtual void rerender ();

  virtual void make_window ();

public:
  tui_win_info (tui_win_info &&) = default;
  virtual ~tui_win_info () = default;

  /* Call to refresh this window.  */
  virtual void refresh_window ();

  /* Make this window visible or invisible.  */
  virtual void make_visible (bool visible);

  /* Return the name of this type of window.  */
  virtual const char *name () const = 0;

  /* Compute the maximum height of this window.  */
  virtual int max_height () const;

  /* Compute the minimum height of this window.  */
  virtual int min_height () const
  {
    return MIN_WIN_HEIGHT;
  }

  /* Compute the maximum width of this window.  */
  int max_width () const;

  /* Compute the minimum width of this window.  */
  int min_width () const
  {
    return 3;
  }

  /* Return true if this window can be boxed.  */
  virtual bool can_box () const
  {
    return true;
  }

  /* Resize this window.  The parameters are used to set the window's
     size and position.  */
  virtual void resize (int height, int width,
		       int origin_x, int origin_y);

  /* Return true if this window is visible.  */
  bool is_visible () const
  {
    return handle != nullptr;
  }

  /* Return true if this window can accept the focus.  */
  virtual bool can_focus () const
  {
    return true;
  }

  /* Disable output until the next call to doupdate.  */
  void no_refresh ()
  {
    if (handle != nullptr)
      wnoutrefresh (handle.get ());
  }

  /* Called after the tab width has been changed.  */
  virtual void update_tab_width ()
  {
  }

  /* Set whether this window is highlighted.  */
  void set_highlight (bool highlight)
  {
    is_highlighted = highlight;
  }

  /* Methods to scroll the contents of this window.  Note that they
     are named with "_scroll" coming at the end because the more
     obvious "scroll_forward" is defined as a macro in term.h.  */
  void forward_scroll (int num_to_scroll);
  void backward_scroll (int num_to_scroll);
  void left_scroll (int num_to_scroll);
  void right_scroll (int num_to_scroll);

  /* Return true if this window can be scrolled, false otherwise.  */
  virtual bool can_scroll () const
  {
    return true;
  }

  void check_and_display_highlight_if_needed ();

  /* Window handle.  */
  std::unique_ptr<WINDOW, curses_deleter> handle;
  /* Window width.  */
  int width = 0;
  /* Window height.  */
  int height = 0;
  /* Origin of window.  */
  int x = 0;
  int y = 0;

  /* Window title to display.  */
  std::string title;

  /* Is this window highlighted?  */
  bool is_highlighted = false;

protected:

  /* Scroll the contents vertically.  This is only called via
     forward_scroll and backward_scroll.  */
  virtual void do_scroll_vertical (int num_to_scroll) = 0;

  /* Scroll the contents horizontally.  This is only called via
     left_scroll and right_scroll.  */
  virtual void do_scroll_horizontal (int num_to_scroll) = 0;
};

/* Constant definitions.  */
#define SRC_NAME                "src"
#define CMD_NAME                "cmd"
#define DATA_NAME               "regs"
#define DISASSEM_NAME           "asm"
#define STATUS_NAME		"status"

/* Global Data.  */
extern struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];

#define TUI_SRC_WIN     ((tui_source_window *) tui_win_list[SRC_WIN])
#define TUI_DISASM_WIN	((tui_disasm_window *) tui_win_list[DISASSEM_WIN])
#define TUI_DATA_WIN    ((tui_data_window *) tui_win_list[DATA_WIN])
#define TUI_CMD_WIN     ((tui_cmd_window *) tui_win_list[CMD_WIN])

/* All the windows that are currently instantiated, in layout
   order.  */
extern std::vector<tui_win_info *> tui_windows;

/* Return a range adapter for iterating over TUI windows.  */
static inline std::vector<tui_win_info *> &
all_tui_windows ()
{
  return tui_windows;
}

/* Data Manipulation Functions.  */
extern int tui_term_height (void);
extern void tui_set_term_height_to (int);
extern int tui_term_width (void);
extern void tui_set_term_width_to (int);
extern struct tui_locator_window *tui_locator_win_info_ptr (void);
extern struct tui_win_info *tui_win_with_focus (void);
extern bool tui_win_resized ();
extern void tui_set_win_resized_to (bool);

extern struct tui_win_info *tui_next_win (struct tui_win_info *);
extern struct tui_win_info *tui_prev_win (struct tui_win_info *);

extern unsigned int tui_tab_width;

#endif /* TUI_TUI_DATA_H */
