ncurses 6.2 - patch 20210306
[ncurses.git] / c++ / cursesp.cc
1 // * this is for making emacs happy: -*-Mode: C++;-*-
2 /****************************************************************************
3  * Copyright 2019,2020 Thomas E. Dickey                                     *
4  * Copyright 1998-2003,2005 Free Software Foundation, Inc.                  *
5  *                                                                          *
6  * Permission is hereby granted, free of charge, to any person obtaining a  *
7  * copy of this software and associated documentation files (the            *
8  * "Software"), to deal in the Software without restriction, including      *
9  * without limitation the rights to use, copy, modify, merge, publish,      *
10  * distribute, distribute with modifications, sublicense, and/or sell       *
11  * copies of the Software, and to permit persons to whom the Software is    *
12  * furnished to do so, subject to the following conditions:                 *
13  *                                                                          *
14  * The above copyright notice and this permission notice shall be included  *
15  * in all copies or substantial portions of the Software.                   *
16  *                                                                          *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
20  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
21  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
22  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
23  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
24  *                                                                          *
25  * Except as contained in this notice, the name(s) of the above copyright   *
26  * holders shall not be used in advertising or otherwise to promote the     *
27  * sale, use or other dealings in this Software without prior written       *
28  * authorization.                                                           *
29  ****************************************************************************/
30
31 /****************************************************************************
32  *   Author: Juergen Pfeifer, 1993, 1997                                    *
33  ****************************************************************************/
34
35 #include "internal.h"
36 #include "cursesp.h"
37
38 MODULE_ID("$Id: cursesp.cc,v 1.27 2020/02/02 23:34:34 tom Exp $")
39
40 NCursesPanel* NCursesPanel::dummy = static_cast<NCursesPanel*>(0);
41
42 void NCursesPanel::init()
43 {
44   p = ::new_panel(w);
45   if (!p)
46     OnError(ERR);
47
48   UserHook* hook = new UserHook;
49   hook->m_user  = NULL;
50   hook->m_back  = this;
51   hook->m_owner = p;
52   ::set_panel_userptr(p, reinterpret_cast<void *>(hook));
53 }
54
55 NCursesPanel::~NCursesPanel() THROWS(NCursesException)
56 {
57   UserHook* hook = UserPointer();
58   assert(hook != 0 && hook->m_back==this && hook->m_owner==p);
59   delete hook;
60   ::del_panel(p);
61   ::update_panels();
62 }
63
64 void
65 NCursesPanel::redraw()
66 {
67   PANEL *pan;
68
69   pan = ::panel_above(NULL);
70   while (pan) {
71     ::touchwin(panel_window(pan));
72     pan = ::panel_above(pan);
73   }
74   ::update_panels();
75   ::doupdate();
76 }
77
78 int
79 NCursesPanel::refresh()
80 {
81   ::update_panels();
82   return ::doupdate();
83 }
84
85 int
86 NCursesPanel::noutrefresh()
87 {
88   ::update_panels();
89   return OK;
90 }
91
92 void
93 NCursesPanel::boldframe(const char *title, const char* btitle)
94 {
95   standout();
96   frame(title, btitle);
97   standend();
98 }
99
100 void
101 NCursesPanel::frame(const char *title,const char *btitle)
102 {
103   int err = OK;
104   if (!title && !btitle) {
105     err = box();
106   }
107   else {
108     err = box();
109     if (err==OK)
110       label(title,btitle);
111   }
112   OnError(err);
113 }
114
115 void
116 NCursesPanel::label(const char *tLabel, const char *bLabel)
117 {
118   if (tLabel)
119     centertext(0,tLabel);
120   if (bLabel)
121     centertext(maxy(),bLabel);
122 }
123
124 void
125 NCursesPanel::centertext(int row,const char *labelText)
126 {
127   if (labelText) {
128     int x = (maxx() - ::strlen(labelText)) / 2;
129     if (x<0)
130       x=0;
131     OnError(addstr(row, x, labelText, width()));
132   }
133 }
134
135 int
136 NCursesPanel::getKey(void)
137 {
138   return getch();
139 }