Systematic use of tm_ostream class instead of ostream (removing dependency on std)
[texmacs.git] / src / src / Plugins / Widkit / Basic / wk_widget.cpp
blobf1741b3fd51b01729e3bd33641efbd86c682d6c1
2 /******************************************************************************
3 * MODULE : wk_widget.cpp
4 * DESCRIPTION: Definition of abstract native widgets
5 * COPYRIGHT : (C) 1999 Joris van der Hoeven
6 *******************************************************************************
7 * This software falls under the GNU general public license version 3 or later.
8 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
9 * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
10 ******************************************************************************/
12 #include "window.hpp"
13 #include "Widkit/wk_widget.hpp"
14 #include "Widkit/Event/basic_event.hpp"
16 /******************************************************************************
17 * Widget construction and destruction
18 ******************************************************************************/
20 extern int widget_count;
21 wk_widget_rep::wk_widget_rep (
22 array<wk_widget> a2, array<string> n2, gravity grav2):
23 win (NULL), ox (0), oy (0), w (0), h (0),
24 grav (grav2), a (a2), name (n2) { TM_DEBUG(widget_count++); }
26 wk_widget_rep::~wk_widget_rep () { TM_DEBUG(widget_count--); }
28 /******************************************************************************
29 * Computing lower left and upper right widget coordinates
30 ******************************************************************************/
33 get_dx (gravity grav, SI w) {
34 switch (grav) {
35 case north_west: case west: case south_west:
36 return 0;
37 case north: case center: case south:
38 return (w/(2*PIXEL))*PIXEL;
39 case north_east: case east: case south_east:
40 return w;
42 FAILED ("unknown gravity");
43 return 0;
47 get_dy (gravity grav, SI h) {
48 switch (grav) {
49 case north_west: case north: case north_east:
50 return 0;
51 case west: case center: case east:
52 return ((-h)/(2*PIXEL))*PIXEL;
53 case south_west: case south: case south_east:
54 return -h;
56 FAILED ("unknown gravity");
57 return 0;
61 wk_widget_rep::x1 () {
62 return ox- get_dx (grav, w);
66 wk_widget_rep::y1 () {
67 return oy- get_dy (grav, h)- h;
71 wk_widget_rep::x2 () {
72 return ox- get_dx (grav, w)+ w;
76 wk_widget_rep::y2 () {
77 return oy- get_dy (grav, h);
80 /******************************************************************************
81 * Finding and assigning children by name
82 ******************************************************************************/
84 static string
85 get_first (string s) {
86 int i;
87 for (i=0; i<N(s); i++)
88 if (s[i] == '|') return s (0, i);
89 return s;
92 wk_widget
93 wk_widget::operator [] (string s) {
94 string l= get_first (s);
95 wk_widget w;
96 (*this) << get_widget (l, w);
97 if (l==s) return w;
98 else return w [s (N(l)+1, N(s))];
101 /******************************************************************************
102 * Other routines
103 ******************************************************************************/
105 bool
106 wk_widget_rep::attached () {
107 return win != NULL;
110 bool
111 wk_widget_rep::is_window_widget () {
112 return false;
115 void
116 wk_widget_rep::wk_error (string message) {
117 cerr << "\n------------------------------------------------------------------------------\n";
118 cerr << wk_widget (this);
119 cerr << "------------------------------------------------------------------------------\n";
120 cerr << "Error: " << message << "\n";
123 wk_widget
124 operator << (wk_widget w, event ev) {
125 if (!w->handle (ev))
126 cerr << "Warning: " << ((tree) ev)
127 << " cannot be handled by\n" << w << "\n";
128 return w;
131 static void
132 print_tree (tm_ostream& out, tree t, int tab) {
133 int i;
134 for (i=0; i<tab; i++) out << "| ";
135 if (is_atomic (t)) out << as_string (t) << "\n";
136 else {
137 out << as_string (t[0]) << "\n";
138 for (i=1; i<N(t); i++) print_tree (out, t[i], tab+1);
142 tm_ostream&
143 operator << (tm_ostream& out, wk_widget w) {
144 print_tree (out, (tree) w, 0);
145 return out;
148 /******************************************************************************
149 * Pointer grabbing
150 ******************************************************************************/
152 void
153 wk_grab_pointer (wk_widget w) {
154 ASSERT (!is_nil (w) && w->win != NULL, "widget should be attached");
155 w->win->set_mouse_grab (abstract (w), true);
158 void
159 wk_ungrab_pointer (wk_widget w) {
160 ASSERT (!is_nil (w) && w->win != NULL, "widget should be attached");
161 w->win->set_mouse_grab (abstract (w), false);
164 bool
165 wk_has_pointer_grab (wk_widget w) {
166 return !is_nil (w) && w->win != NULL &&
167 w->win->get_mouse_grab (abstract (w));