X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=c%2B%2B%2Fcursesp.h;h=f5295e410c90832298a48f1a6fe74293625974f4;hp=9ea20aebef6b2bca177594875669523446f4140c;hb=46722468f47c2b77b3987729b4bcf2321cccfd01;hpb=3a9b6a3bf0269231bef7de74757a910dedd04e0c diff --git a/c++/cursesp.h b/c++/cursesp.h index 9ea20aeb..f5295e41 100644 --- a/c++/cursesp.h +++ b/c++/cursesp.h @@ -1,52 +1,101 @@ // * This makes emacs happy -*-Mode: C++;-*- -#ifndef _CURSESP_H -#define _CURSESP_H +/**************************************************************************** + * Copyright (c) 1998,1999,2000,2001 Free Software Foundation, Inc. * + * * + * Permission is hereby granted, free of charge, to any person obtaining a * + * copy of this software and associated documentation files (the * + * "Software"), to deal in the Software without restriction, including * + * without limitation the rights to use, copy, modify, merge, publish, * + * distribute, distribute with modifications, sublicense, and/or sell * + * copies of the Software, and to permit persons to whom the Software is * + * furnished to do so, subject to the following conditions: * + * * + * The above copyright notice and this permission notice shall be included * + * in all copies or substantial portions of the Software. * + * * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * + * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * + * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * + * * + * Except as contained in this notice, the name(s) of the above copyright * + * holders shall not be used in advertising or otherwise to promote the * + * sale, use or other dealings in this Software without prior written * + * authorization. * + ****************************************************************************/ + +/**************************************************************************** + * Author: Juergen Pfeifer, 1997 * + * Contact: http://www.familiepfeifer.de/Contact.aspx?Lang=en * + ****************************************************************************/ + +#ifndef NCURSES_CURSESP_H_incl +#define NCURSES_CURSESP_H_incl 1 + +// $Id: cursesp.h,v 1.17 2002/07/06 15:47:52 juergen Exp $ #include -#include extern "C" { -#include -#include +# include } -class NCursesPanel : public NCursesWindow { - +class NCURSES_IMPEXP NCursesPanel : public NCursesWindow { protected: PANEL *p; + static NCursesPanel *dummy; private: // This structure is used for the panel's user data field to link the // PANEL* to the C++ object and to provide extra space for a user pointer. typedef struct { - const void* m_user; // the pointer for the user's data + void* m_user; // the pointer for the user's data const NCursesPanel* m_back; // backward pointer to C++ object const PANEL* m_owner; // the panel itself } UserHook; + void init(); // Initialize the panel object + protected: - void set_user(const void *user) { + void set_user(void *user) { UserHook* uptr = (UserHook*)::panel_userptr (p); - assert (uptr && uptr->m_back==this && uptr->m_owner==p); + assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==p); uptr->m_user = user; } + // Set the user pointer of the panel. - const void *get_user() { + void *get_user() { UserHook* uptr = (UserHook*)::panel_userptr (p); - assert (uptr && uptr->m_back==this && uptr->m_owner==p); + assert (uptr != 0 && uptr->m_back==this && uptr->m_owner==p); return uptr->m_user; } void OnError (int err) const THROWS((NCursesPanelException)) { - if (err != OK) + if (err==ERR) THROW(new NCursesPanelException (this, err)); } + // If err is equal to the curses error indicator ERR, an error handler + // is called. + + // Get a keystroke. Default implementation calls getch() + virtual int getKey(void); public: - NCursesPanel(int lines = 0, - int cols = 0, + NCursesPanel(int lines, + int cols, int begin_y = 0, - int begin_x = 0); + int begin_x = 0) + : NCursesWindow(lines,cols,begin_y,begin_x) { + init(); + } + // Create a panel with this size starting at the requested position. + + NCursesPanel() : NCursesWindow(::stdscr) { init(); } + // This constructor creates the default Panel associated with the + // ::stdscr window virtual ~NCursesPanel(); @@ -54,42 +103,81 @@ public: inline void hide() { OnError (::hide_panel(p)); } + // Hide the panel. It stays in the stack but becomes invisible. inline void show() { OnError (::show_panel(p)); } + // Show the panel, i.e. make it visible. inline void top() { OnError (::top_panel(p)); } + // Make this panel the top panel in the stack. inline void bottom() { OnError (::bottom_panel(p)); } + // Make this panel the bottom panel in the stack. + // N.B.: The panel associated with ::stdscr is always on the bottom. So + // actually bottom() makes the panel the first above ::stdscr. - inline void mvpan(int y, int x) { - OnError (::move_panel(p, y, x)); - } - - inline void mvwin(int y, int x) { - OnError (::move_panel(p, y, x)); + virtual int mvwin(int y, int x) { + OnError(::move_panel(p, y, x)); + return OK; } inline bool hidden() const { - return ::panel_hidden (p); + return (::panel_hidden (p) ? TRUE : FALSE); + } + // Return TRUE if the panel is hidden, FALSE otherwise. + +/* The functions panel_above() and panel_below() are not reflected in + the NCursesPanel class. The reason for this is, that we cannot + assume that a panel retrieved by those operations is one wrapped + by a C++ class. Although this situation might be handled, we also + need a reverse mapping from PANEL to NCursesPanel which needs some + redesign of the low level stuff. At the moment, we define them in the + interface but they will always produce an error. */ + inline NCursesPanel& above() const { + OnError(ERR); + return *dummy; } - static void redraw(); // redraw all panels - static void refresh(); // update screen - + inline NCursesPanel& below() const { + OnError(ERR); + return *dummy; + } + + // Those two are rewrites of the corresponding virtual members of + // NCursesWindow + virtual int refresh(); + // Propagate all panel changes to the virtual screen and update the + // physical screen. + + virtual int noutrefresh(); + // Propagate all panel changes to the virtual screen. + + static void redraw(); + // Redraw all panels. + // decorations - virtual void frame(const char *title=NULL, const char* btitle=NULL); - virtual void boldframe(const char *title=NULL, const char* btitle=NULL); - virtual void label(const char *topLabel, const char *bottomLabel); - virtual void centertext(int row,const char *label); - -}; + virtual void frame(const char* title=NULL, + const char* btitle=NULL); + // Put a frame around the panel and put the title centered in the top line + // and btitle in the bottom line. + + virtual void boldframe(const char* title=NULL, + const char* btitle=NULL); + // Same as frame(), but use highlighted attributes. + virtual void label(const char* topLabel, + const char* bottomLabel); + // Put the title centered in the top line and btitle in the bottom line. + + virtual void centertext(int row,const char* label); + // Put the label text centered in the specified row. +}; /* We use templates to provide a typesafe mechanism to associate * user data with a panel. A NCursesUserPanel is a panel @@ -98,33 +186,37 @@ public: template class NCursesUserPanel : public NCursesPanel { public: - NCursesUserPanel (int lines = 0, - int cols = 0, + NCursesUserPanel (int lines, + int cols, int begin_y = 0, - int begin_x = 0) - : NCursesPanel (lines, cols, begin_y, begin_x) { - }; - - NCursesUserPanel (const T* p_UserData, - int lines = 0, - int cols = 0, - int begin_y = 0, - int begin_x = 0) + int begin_x = 0, + const T* p_UserData = (T*)0) : NCursesPanel (lines, cols, begin_y, begin_x) { if (p) - set_user ((const void *)p_UserData); + set_user ((void *)p_UserData); }; + // This creates an user panel of the requested size with associated + // user data pointed to by p_UserData. + NCursesUserPanel(const T* p_UserData = (T*)0) : NCursesPanel() { + if (p) + set_user((void *)p_UserData); + }; + // This creates an user panel associated with the ::stdscr and user data + // pointed to by p_UserData. + virtual ~NCursesUserPanel() {}; - const T* UserData (void) const { - return (const T*)get_user (); + T* UserData (void) const { + return (T*)get_user (); }; - + // Retrieve the user data associated with the panel. + virtual void setUserData (const T* p_UserData) { if (p) - set_user ((const void *)p_UserData); + set_user ((void *)p_UserData); } + // Associate the user panel with the user data pointed to by p_UserData. }; -#endif // _CURSESP_H +#endif // NCURSES_CURSESP_H_incl