summaryrefslogtreecommitdiff
path: root/src/window.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/window.cpp')
-rw-r--r--src/window.cpp289
1 files changed, 289 insertions, 0 deletions
diff --git a/src/window.cpp b/src/window.cpp
new file mode 100644
index 0000000..bfa7701
--- /dev/null
+++ b/src/window.cpp
@@ -0,0 +1,289 @@
+/***************************************************************************
+ window.cpp
+ -------------------
+ begin : Thu Nov 25 2003
+ copyright : (C) 2003 - 2012 by Roland Riegel
+ email : feedback@roland-riegel.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "window.h"
+
+using namespace std;
+
+Window::WindowStreamBuf::WindowStreamBuf(Window& window)
+ : m_window(window)
+{
+}
+
+Window::WindowStreamBuf::~WindowStreamBuf()
+{
+}
+
+streamsize Window::WindowStreamBuf::xsputn(const char_type* str, streamsize n)
+{
+ m_window.print(string(str, n));
+ return n;
+}
+
+Window::WindowStreamBuf::int_type Window::WindowStreamBuf::overflow(int_type c)
+{
+ if(c == traits_type::eof())
+ return c;
+
+ m_window.print((char) c);
+ return c;
+}
+
+Window::WindowStream::WindowStream(Window& window)
+ : basic_ostream<char>(new WindowStreamBuf(window))
+{
+}
+
+Window::WindowStream::~WindowStream()
+{
+ delete rdbuf();
+}
+
+Window::Window()
+ : m_visible(false), m_window(0), m_stream(*this)
+{
+}
+
+Window::~Window()
+{
+ hide();
+}
+
+// create window and display it
+void Window::show(int x, int y, int width, int height)
+{
+ if(m_window)
+ return;
+
+ m_window = newwin(height, width, y, x);
+ clear();
+ refresh();
+
+ m_visible = true;
+}
+
+// hide window and destroy it
+void Window::hide()
+{
+ if(!m_window)
+ return;
+
+ clear();
+ refresh();
+ delwin(m_window);
+
+ m_window = 0;
+
+ m_visible = false;
+}
+
+// is the window currently visible?
+bool Window::isVisible()
+{
+ return m_visible;
+}
+
+// refresh window
+void Window::refresh()
+{
+ if(m_window)
+ wrefresh(m_window);
+}
+
+// clear the content of the window
+void Window::clear()
+{
+ if(m_window)
+ wclear(m_window);
+}
+
+// move and resize window
+void Window::resize(int x, int y, int width, int height)
+{
+ if(!m_window)
+ return;
+
+ wresize(m_window, height, width);
+ mvwin(m_window, y, x);
+}
+
+// return current window width
+int Window::getWidth()
+{
+ if(!m_window)
+ return 0;
+
+ int width, height;
+ getmaxyx(m_window, height, width);
+
+ return width;
+}
+
+// return current window height
+int Window::getHeight()
+{
+ if(!m_window)
+ return 0;
+
+ int width, height;
+ getmaxyx(m_window, height, width);
+
+ return height;
+}
+
+// return current distance to left screen edge
+int Window::getLeft()
+{
+ if(!m_window)
+ return 0;
+
+ int x, y;
+ getbegyx(m_window, y, x);
+
+ return x;
+}
+
+// return current distance to top screen edge
+int Window::getTop()
+{
+ if(!m_window)
+ return 0;
+
+ int x, y;
+ getbegyx(m_window, y, x);
+
+ return y;
+}
+
+// return current cursor position on the x-axis
+int Window::getX()
+{
+ if(!m_window)
+ return 0;
+
+ int x, y;
+ getyx(m_window, y, x);
+
+ return x;
+}
+
+// return current cursor position on the y-axis
+int Window::getY()
+{
+ if(!m_window)
+ return 0;
+
+ int x, y;
+ getyx(m_window, y, x);
+
+ return y;
+}
+
+// set current cursor x position
+void Window::setX(int new_x)
+{
+ if(!m_window)
+ return;
+
+ wmove(m_window, getY(), new_x);
+}
+
+// set current cursor y position
+void Window::setY(int new_y)
+{
+ if(!m_window)
+ return;
+
+ wmove(m_window, new_y, getX());
+}
+
+// set current cursor position
+void Window::setXY(int new_x, int new_y)
+{
+ if(!m_window)
+ return;
+
+ wmove(m_window, new_y, new_x);
+}
+
+// print some text to the window
+void Window::print(const string& text, int new_x, int new_y)
+{
+ if(!m_window)
+ return;
+ if(new_x <= -1)
+ new_x = getX();
+ if(new_y <= -1)
+ new_y = getY();
+
+ mvwaddstr(m_window, new_y, new_x, text.c_str());
+}
+
+// print a char to the window
+void Window::print(char text, int new_x, int new_y)
+{
+ if(!m_window)
+ return;
+ if(new_x <= -1)
+ new_x = getX();
+ if(new_y <= -1)
+ new_y = getY();
+
+ mvwaddch(m_window, new_y, new_x, text);
+}
+
+// print via stream to window
+Window::WindowStream& Window::print(int x, int y)
+{
+ if(x <= -1)
+ x = getX();
+ if(y <= -1)
+ y = getY();
+ setXY(x, y);
+
+ return m_stream;
+}
+
+SubWindow::SubWindow(Window* parent)
+ : Window(), m_parent(parent)
+{
+}
+
+SubWindow::~SubWindow()
+{
+ hide();
+}
+
+// return parent window
+Window* SubWindow::getParent()
+{
+ return m_parent;
+}
+
+// create window and display it
+void SubWindow::show(int x, int y, int width, int height)
+{
+ if(m_window)
+ return;
+
+ m_window = derwin(m_parent->m_window, height, width, y, x);
+ clear();
+ refresh();
+
+ m_visible = true;
+}
+