1/* Data/register window display.
2
3   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
4   Foundation, Inc.
5
6   Contributed by Hewlett-Packard Company.
7
8   This file is part of GDB.
9
10   This program is free software; you can redistribute it and/or modify
11   it under the terms of the GNU General Public License as published by
12   the Free Software Foundation; either version 2 of the License, or
13   (at your option) any later version.
14
15   This program is distributed in the hope that it will be useful,
16   but WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   GNU General Public License for more details.
19
20   You should have received a copy of the GNU General Public License
21   along with this program; if not, write to the Free Software
22   Foundation, Inc., 59 Temple Place - Suite 330,
23   Boston, MA 02111-1307, USA.  */
24
25#include "defs.h"
26#include "tui/tui.h"
27#include "tui/tui-data.h"
28#include "tui/tui-wingeneral.h"
29#include "tui/tui-regs.h"
30
31#include "gdb_string.h"
32#include "gdb_curses.h"
33
34
35/*****************************************
36** STATIC LOCAL FUNCTIONS FORWARD DECLS    **
37******************************************/
38
39
40
41/*****************************************
42** PUBLIC FUNCTIONS                        **
43******************************************/
44
45
46/* Answer the index first element displayed.  If none are displayed,
47   then return (-1).  */
48int
49tui_first_data_item_displayed (void)
50{
51  int element_no = (-1);
52  int i;
53
54  for (i = 0; (i < TUI_DATA_WIN->generic.content_size && element_no < 0); i++)
55    {
56      struct tui_gen_win_info * data_item_win;
57
58      data_item_win = &((tui_win_content)
59		      TUI_DATA_WIN->generic.content)[i]->which_element.data_window;
60      if (data_item_win->handle != (WINDOW *) NULL && data_item_win->is_visible)
61	element_no = i;
62    }
63
64  return element_no;
65}
66
67
68/* Answer the index of the first element in line_no.  If line_no is
69   past the data area (-1) is returned.  */
70int
71tui_first_data_element_no_in_line (int line_no)
72{
73  int first_element_no = (-1);
74
75  /*
76     ** First see if there is a register on line_no, and if so, set the
77     ** first element number
78   */
79  if ((first_element_no = tui_first_reg_element_no_inline (line_no)) == -1)
80    {				/*
81				   ** Looking at the general data, the 1st element on line_no
82				 */
83    }
84
85  return first_element_no;
86}
87
88
89/* Function to delete all the item windows in the data window.  This
90   is usually done when the data window is scrolled.  */
91void
92tui_delete_data_content_windows (void)
93{
94  int i;
95  struct tui_gen_win_info * data_item_win_ptr;
96
97  for (i = 0; (i < TUI_DATA_WIN->generic.content_size); i++)
98    {
99      data_item_win_ptr = &((tui_win_content)
100		      TUI_DATA_WIN->generic.content)[i]->which_element.data_window;
101      tui_delete_win (data_item_win_ptr->handle);
102      data_item_win_ptr->handle = (WINDOW *) NULL;
103      data_item_win_ptr->is_visible = FALSE;
104    }
105}
106
107
108void
109tui_erase_data_content (char *prompt)
110{
111  werase (TUI_DATA_WIN->generic.handle);
112  tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
113  if (prompt != (char *) NULL)
114    {
115      int half_width = (TUI_DATA_WIN->generic.width - 2) / 2;
116      int x_pos;
117
118      if (strlen (prompt) >= half_width)
119	x_pos = 1;
120      else
121	x_pos = half_width - strlen (prompt);
122      mvwaddstr (TUI_DATA_WIN->generic.handle,
123		 (TUI_DATA_WIN->generic.height / 2),
124		 x_pos,
125		 prompt);
126    }
127  wrefresh (TUI_DATA_WIN->generic.handle);
128}
129
130
131/* This function displays the data that is in the data window's
132   content.  It does not set the content.  */
133void
134tui_display_all_data (void)
135{
136  if (TUI_DATA_WIN->generic.content_size <= 0)
137    tui_erase_data_content (NO_DATA_STRING);
138  else
139    {
140      tui_erase_data_content ((char *) NULL);
141      tui_delete_data_content_windows ();
142      tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
143      tui_display_registers_from (0);
144      /*
145         ** Then display the other data
146       */
147      if (TUI_DATA_WIN->detail.data_display_info.data_content !=
148	  (tui_win_content) NULL &&
149	  TUI_DATA_WIN->detail.data_display_info.data_content_count > 0)
150	{
151	}
152    }
153}
154
155
156/* Function to display the data starting at line, line_no, in the data
157   window.  */
158void
159tui_display_data_from_line (int line_no)
160{
161  int _line_no = line_no;
162
163  if (line_no < 0)
164    _line_no = 0;
165
166  tui_check_and_display_highlight_if_needed (TUI_DATA_WIN);
167
168  /* there is no general data, force regs to display (if there are any) */
169  if (TUI_DATA_WIN->detail.data_display_info.data_content_count <= 0)
170    tui_display_registers_from_line (_line_no, TRUE);
171  else
172    {
173      int element_no, start_line_no;
174      int regs_last_line = tui_last_regs_line_no ();
175
176
177      /* display regs if we can */
178      if (tui_display_registers_from_line (_line_no, FALSE) < 0)
179	{			/*
180				   ** _line_no is past the regs display, so calc where the
181				   ** start data element is
182				 */
183	  if (regs_last_line < _line_no)
184	    {			/* figure out how many lines each element is to obtain
185				   the start element_no */
186	    }
187	}
188      else
189	{			/*
190				   ** calculate the starting element of the data display, given
191				   ** regs_last_line and how many lines each element is, up to
192				   ** _line_no
193				 */
194	}
195      /* Now display the data , starting at element_no */
196    }
197}
198
199
200/* Display data starting at element element_no.   */
201void
202tui_display_data_from (int element_no, int reuse_windows)
203{
204  int first_line = (-1);
205
206  if (element_no < TUI_DATA_WIN->detail.data_display_info.regs_content_count)
207    first_line = tui_line_from_reg_element_no (element_no);
208  else
209    {				/* calculate the first_line from the element number */
210    }
211
212  if (first_line >= 0)
213    {
214      tui_erase_data_content ((char *) NULL);
215      if (!reuse_windows)
216	tui_delete_data_content_windows ();
217      tui_display_data_from_line (first_line);
218    }
219}
220
221
222/* Function to redisplay the contents of the data window.  */
223void
224tui_refresh_data_win (void)
225{
226  tui_erase_data_content ((char *) NULL);
227  if (TUI_DATA_WIN->generic.content_size > 0)
228    {
229      int first_element = tui_first_data_item_displayed ();
230
231      if (first_element >= 0)	/* re-use existing windows */
232	tui_display_data_from (first_element, TRUE);
233    }
234}
235
236
237/* Function to check the data values and hilite any that have changed.  */
238void
239tui_check_data_values (struct frame_info *frame)
240{
241  tui_check_register_values (frame);
242
243  /* Now check any other data values that there are */
244  if (TUI_DATA_WIN != NULL && TUI_DATA_WIN->generic.is_visible)
245    {
246      int i;
247
248      for (i = 0; TUI_DATA_WIN->detail.data_display_info.data_content_count; i++)
249	{
250#ifdef LATER
251	  tui_data_element_ptr data_element_ptr;
252	  struct tui_gen_win_info * data_item_win_ptr;
253	  Opaque new_value;
254
255	  data_item_ptr = &TUI_DATA_WIN->detail.data_display_info.
256	    data_content[i]->which_element.data_window;
257	  data_element_ptr = &((tui_win_content)
258			     data_item_win_ptr->content)[0]->which_element.data;
259	  if value
260	    has changed (data_element_ptr, frame, &new_value)
261	    {
262	      data_element_ptr->value = new_value;
263	      update the display with the new value, hiliting it.
264	    }
265#endif
266	}
267    }
268}
269
270
271/* Scroll the data window vertically forward or backward.   */
272void
273tui_vertical_data_scroll (enum tui_scroll_direction scroll_direction, int num_to_scroll)
274{
275  int first_element_no;
276  int first_line = (-1);
277
278  first_element_no = tui_first_data_item_displayed ();
279  if (first_element_no < TUI_DATA_WIN->detail.data_display_info.regs_content_count)
280    first_line = tui_line_from_reg_element_no (first_element_no);
281  else
282    {				/* calculate the first line from the element number which is in
283				   ** the general data content
284				 */
285    }
286
287  if (first_line >= 0)
288    {
289      int last_element_no, last_line;
290
291      if (scroll_direction == FORWARD_SCROLL)
292	first_line += num_to_scroll;
293      else
294	first_line -= num_to_scroll;
295      tui_erase_data_content ((char *) NULL);
296      tui_delete_data_content_windows ();
297      tui_display_data_from_line (first_line);
298    }
299}
300
301
302/*****************************************
303** STATIC LOCAL FUNCTIONS               **
304******************************************/
305