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 ******************************************************************************/
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
) {
35 case north_west
: case west
: case south_west
:
37 case north
: case center
: case south
:
38 return (w
/(2*PIXEL
))*PIXEL
;
39 case north_east
: case east
: case south_east
:
42 FAILED ("unknown gravity");
47 get_dy (gravity grav
, SI h
) {
49 case north_west
: case north
: case north_east
:
51 case west
: case center
: case east
:
52 return ((-h
)/(2*PIXEL
))*PIXEL
;
53 case south_west
: case south
: case south_east
:
56 FAILED ("unknown gravity");
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 ******************************************************************************/
85 get_first (string s
) {
87 for (i
=0; i
<N(s
); i
++)
88 if (s
[i
] == '|') return s (0, i
);
93 wk_widget::operator [] (string s
) {
94 string l
= get_first (s
);
96 (*this) << get_widget (l
, w
);
98 else return w
[s (N(l
)+1, N(s
))];
101 /******************************************************************************
103 ******************************************************************************/
106 wk_widget_rep::attached () {
111 wk_widget_rep::is_window_widget () {
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";
124 operator << (wk_widget w
, event ev
) {
126 cerr
<< "Warning: " << ((tree
) ev
)
127 << " cannot be handled by\n" << w
<< "\n";
132 print_tree (tm_ostream
& out
, tree t
, int tab
) {
134 for (i
=0; i
<tab
; i
++) out
<< "| ";
135 if (is_atomic (t
)) out
<< as_string (t
) << "\n";
137 out
<< as_string (t
[0]) << "\n";
138 for (i
=1; i
<N(t
); i
++) print_tree (out
, t
[i
], tab
+1);
143 operator << (tm_ostream
& out
, wk_widget w
) {
144 print_tree (out
, (tree
) w
, 0);
148 /******************************************************************************
150 ******************************************************************************/
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);
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);
165 wk_has_pointer_grab (wk_widget w
) {
166 return !is_nil (w
) && w
->win
!= NULL
&&
167 w
->win
->get_mouse_grab (abstract (w
));