1/* General window behavior.
2
3   Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
4   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-win.h"
30
31#include "gdb_curses.h"
32
33/***********************
34** PUBLIC FUNCTIONS
35***********************/
36
37/* Refresh the window.   */
38void
39tui_refresh_win (struct tui_gen_win_info * win_info)
40{
41  if (win_info->type == DATA_WIN && win_info->content_size > 0)
42    {
43      int i;
44
45      for (i = 0; (i < win_info->content_size); i++)
46	{
47	  struct tui_gen_win_info * data_item_win_ptr;
48
49	  data_item_win_ptr = &((tui_win_content)
50			     win_info->content)[i]->which_element.data_window;
51	  if (data_item_win_ptr != NULL
52	      && data_item_win_ptr->handle != (WINDOW *) NULL)
53	    wrefresh (data_item_win_ptr->handle);
54	}
55    }
56  else if (win_info->type == CMD_WIN)
57    {
58      /* Do nothing */
59    }
60  else
61    {
62      if (win_info->handle != (WINDOW *) NULL)
63	wrefresh (win_info->handle);
64    }
65
66  return;
67}
68
69
70/* Function to delete the curses window, checking for NULL.   */
71void
72tui_delete_win (WINDOW * window)
73{
74  if (window != (WINDOW *) NULL)
75    delwin (window);
76
77  return;
78}
79
80
81/* Draw a border arround the window.  */
82void
83box_win (struct tui_gen_win_info * win_info, int highlight_flag)
84{
85  if (win_info && win_info->handle)
86    {
87      WINDOW *win;
88      int attrs;
89
90      win = win_info->handle;
91      if (highlight_flag == HILITE)
92        attrs = tui_active_border_attrs;
93      else
94        attrs = tui_border_attrs;
95
96      wattron (win, attrs);
97      wborder (win, tui_border_vline, tui_border_vline,
98               tui_border_hline, tui_border_hline,
99               tui_border_ulcorner, tui_border_urcorner,
100               tui_border_llcorner, tui_border_lrcorner);
101      if (win_info->title)
102        mvwaddstr (win, 0, 3, win_info->title);
103      wattroff (win, attrs);
104    }
105}
106
107
108void
109tui_unhighlight_win (struct tui_win_info * win_info)
110{
111  if (win_info != NULL && win_info->generic.handle != (WINDOW *) NULL)
112    {
113      box_win ((struct tui_gen_win_info *) win_info, NO_HILITE);
114      wrefresh (win_info->generic.handle);
115      tui_set_win_highlight (win_info, 0);
116    }
117}
118
119
120void
121tui_highlight_win (struct tui_win_info * win_info)
122{
123  if (win_info != NULL
124      && win_info->can_highlight
125      && win_info->generic.handle != (WINDOW *) NULL)
126    {
127      box_win ((struct tui_gen_win_info *) win_info, HILITE);
128      wrefresh (win_info->generic.handle);
129      tui_set_win_highlight (win_info, 1);
130    }
131}
132
133void
134tui_check_and_display_highlight_if_needed (struct tui_win_info * win_info)
135{
136  if (win_info != NULL && win_info->generic.type != CMD_WIN)
137    {
138      if (win_info->is_highlighted)
139	tui_highlight_win (win_info);
140      else
141	tui_unhighlight_win (win_info);
142
143    }
144  return;
145}
146
147
148void
149tui_make_window (struct tui_gen_win_info * win_info, int box_it)
150{
151  WINDOW *handle;
152
153  handle = newwin (win_info->height,
154		   win_info->width,
155		   win_info->origin.y,
156		   win_info->origin.x);
157  win_info->handle = handle;
158  if (handle != (WINDOW *) NULL)
159    {
160      if (box_it == BOX_WINDOW)
161	box_win (win_info, NO_HILITE);
162      win_info->is_visible = TRUE;
163      scrollok (handle, TRUE);
164    }
165}
166
167
168/* We can't really make windows visible, or invisible.  So we have to
169   delete the entire window when making it visible, and create it
170   again when making it visible.  */
171static void
172make_visible (struct tui_gen_win_info *win_info, int visible)
173{
174  /* Don't tear down/recreate command window */
175  if (win_info->type == CMD_WIN)
176    return;
177
178  if (visible)
179    {
180      if (!win_info->is_visible)
181	{
182	  tui_make_window (win_info,
183			   (win_info->type != CMD_WIN
184			    && !tui_win_is_auxillary (win_info->type)));
185	  win_info->is_visible = TRUE;
186	}
187    }
188  else if (!visible &&
189	   win_info->is_visible && win_info->handle != (WINDOW *) NULL)
190    {
191      win_info->is_visible = FALSE;
192      tui_delete_win (win_info->handle);
193      win_info->handle = (WINDOW *) NULL;
194    }
195
196  return;
197}
198
199void
200tui_make_visible (struct tui_gen_win_info *win_info)
201{
202  make_visible (win_info, 1);
203}
204
205void
206tui_make_invisible (struct tui_gen_win_info *win_info)
207{
208  make_visible (win_info, 0);
209}
210
211
212/* Makes all windows invisible (except the command and locator windows).   */
213static void
214make_all_visible (int visible)
215{
216  int i;
217
218  for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
219    {
220      if (tui_win_list[i] != NULL
221	  && ((tui_win_list[i])->generic.type) != CMD_WIN)
222	{
223	  if (tui_win_is_source_type ((tui_win_list[i])->generic.type))
224	    make_visible ((tui_win_list[i])->detail.source_info.execution_info,
225			  visible);
226	  make_visible ((struct tui_gen_win_info *) tui_win_list[i], visible);
227	}
228    }
229
230  return;
231}
232
233void
234tui_make_all_visible (void)
235{
236  make_all_visible (1);
237}
238
239void
240tui_make_all_invisible (void)
241{
242  make_all_visible (0);
243}
244
245/* Function to refresh all the windows currently displayed.  */
246
247void
248tui_refresh_all (struct tui_win_info * * list)
249{
250  enum tui_win_type type;
251  struct tui_gen_win_info * locator = tui_locator_win_info_ptr ();
252
253  for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
254    {
255      if (list[type] && list[type]->generic.is_visible)
256	{
257	  if (type == SRC_WIN || type == DISASSEM_WIN)
258	    {
259	      touchwin (list[type]->detail.source_info.execution_info->handle);
260	      tui_refresh_win (list[type]->detail.source_info.execution_info);
261	    }
262	  touchwin (list[type]->generic.handle);
263	  tui_refresh_win (&list[type]->generic);
264	}
265    }
266  if (locator->is_visible)
267    {
268      touchwin (locator->handle);
269      tui_refresh_win (locator);
270    }
271}
272
273
274/*********************************
275** Local Static Functions
276*********************************/
277