1 
2 /******************************************************************************
3 * MODULE     : separator_widget.cpp
4 * DESCRIPTION: Widgets for filling up space between a group of 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 ******************************************************************************/
11 
12 #include "gui.hpp"
13 #include "renderer.hpp"
14 #include "window.hpp"
15 #include "Widkit/attribute_widget.hpp"
16 #include "Widkit/layout.hpp"
17 
18 /******************************************************************************
19 * Glue widgets
20 ******************************************************************************/
21 
22 class separator_widget_rep: public attribute_widget_rep {
23   SI   pre, post;
24   bool vert;
25 
26 public:
27   separator_widget_rep (SI pre, SI post, bool vert);
28   operator tree ();
29 
30   void handle_get_size (get_size_event ev);
31   void handle_repaint (repaint_event ev);
32   void handle_get_coord2 (get_coord2_event ev);
33   void handle_set_coord2 (set_coord2_event ev);
34 };
35 
separator_widget_rep(SI pre2,SI post2,bool vert2)36 separator_widget_rep::separator_widget_rep (
37   SI pre2, SI post2, bool vert2):
38     attribute_widget_rep (), pre (pre2), post (post2), vert (vert2) {}
39 
operator tree()40 separator_widget_rep::operator tree () {
41   return "separator";
42 }
43 
44 void
handle_get_size(get_size_event ev)45 separator_widget_rep::handle_get_size (get_size_event ev) {
46   if (vert) {
47     if (ev->mode==1) gui_maximal_extents (ev->w, ev->h);
48     ev->w= 2*PIXEL+ pre+ post;
49     ev->h= 0;
50   }
51   else {
52     if (ev->mode==-1) ev->w= 0;
53     if (ev->mode==1) gui_maximal_extents (ev->w, ev->h);
54     ev->h= 2*PIXEL+ pre+ post;
55   }
56 }
57 
58 void
handle_repaint(repaint_event ev)59 separator_widget_rep::handle_repaint (repaint_event ev) {
60   renderer ren= ev->win;
61   layout_default (ren, ev->x1, ev->y1, ev->x2, ev->y2);
62   ren->set_pencil (pencil (layout_dark (ren), PIXEL));
63   if (vert) ren->line (pre+PIXEL, ev->y1, pre+PIXEL, ev->y2);
64   else ren->line (ev->x1, -pre-PIXEL, ev->x2, -pre-PIXEL);
65   ren->set_pencil (pencil (white, PIXEL));
66   if (vert) ren->line (pre+2*PIXEL, ev->y1, pre+2*PIXEL, ev->y2);
67   else ren->line (ev->x1, -pre-2*PIXEL, ev->x2, -pre-2*PIXEL);
68 }
69 
70 void
handle_get_coord2(get_coord2_event ev)71 separator_widget_rep::handle_get_coord2 (get_coord2_event ev) {
72   if (ev->which != "extra width") attribute_widget_rep::handle_get_coord2 (ev);
73   else { ev->c1= 0; ev->c2= 0; }
74 }
75 
76 void
handle_set_coord2(set_coord2_event ev)77 separator_widget_rep::handle_set_coord2 (set_coord2_event ev) {
78   if (ev->which != "extra width") attribute_widget_rep::handle_set_coord2 (ev);
79 }
80 
81 /******************************************************************************
82 * Interface
83 ******************************************************************************/
84 
85 wk_widget
separator_wk_widget(SI pre,SI post,bool vert)86 separator_wk_widget (SI pre, SI post, bool vert) {
87   return tm_new<separator_widget_rep> (pre, post, vert);
88 }
89