Add to git.
[monolith.git] / src / ml_form_layout.c
1 /* Monolith form layout class.
2  * - by Richard W.M. Jones <rich@annexia.org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the Free
16  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  *
18  * $Id: ml_form_layout.c,v 1.1 2002/11/13 20:46:37 rich Exp $
19  */
20
21 #include "config.h"
22
23 #include <pthr_iolib.h>
24
25 #include "ml_widget.h"
26 #include "monolith.h"
27 #include "ml_text_label.h"
28 #include "ml_multicol_layout.h"
29 #include "ml_form_layout.h"
30
31 static void repaint (void *, ml_session, const char *, io_handle);
32 static struct ml_widget_property properties[];
33
34 struct ml_widget_operations form_layout_ops =
35   {
36     repaint: repaint,
37     properties: properties,
38   };
39
40 struct ml_form_layout
41 {
42   struct ml_widget_operations *ops;
43   pool pool;                    /* Pool for allocations. */
44   ml_multicol_layout tbl;       /* We're really a multi-column layout. */
45   const char *clazz;            /* Stylesheet class. */
46 };
47
48 static void update_table_class (void *vw);
49
50 static struct ml_widget_property properties[] =
51   {
52     { name: "class",
53       offset: ml_offsetof (struct ml_form_layout, clazz),
54       type: ML_PROP_STRING,
55       on_set: update_table_class },
56     { 0 }
57   };
58
59 ml_form_layout
60 new_ml_form_layout (pool pool)
61 {
62   ml_form_layout w = pmalloc (pool, sizeof *w);
63
64   w->ops = &form_layout_ops;
65   w->pool = pool;
66   w->tbl = new_ml_multicol_layout (pool, 2);
67   w->clazz = "ml_form_layout";
68   update_table_class (w);
69
70   return w;
71 }
72
73 static void
74 update_table_class (void *vw)
75 {
76   ml_form_layout w = (ml_form_layout) vw;
77
78   ml_widget_set_property (w->tbl, "class", w->clazz);
79 }
80
81 void
82 ml_form_layout_pack (ml_form_layout w, const char *label, ml_widget input)
83 {
84   ml_text_label lbl;
85
86   if (label)
87     {
88       lbl = new_ml_text_label (w->pool, label);
89
90       ml_multicol_layout_set_header (w->tbl, 1);
91       ml_multicol_layout_pack (w->tbl, lbl);
92     }
93   else
94     {
95       ml_multicol_layout_set_header (w->tbl, 1);
96       ml_multicol_layout_pack (w->tbl, 0);
97     }
98
99   ml_multicol_layout_pack (w->tbl, input);
100 }
101
102 void
103 ml_form_layout_pack_help (ml_form_layout w, const char *help_text)
104 {
105   ml_text_label lbl;
106
107   ml_multicol_layout_set_header (w->tbl, 1);
108   ml_multicol_layout_pack (w->tbl, 0);
109
110   lbl = new_ml_text_label (w->pool, help_text);
111   ml_widget_set_property (lbl, "font.size", "small");
112   ml_multicol_layout_pack (w->tbl, lbl);
113 }
114
115 static void
116 repaint (void *vw, ml_session session, const char *windowid, io_handle io)
117 {
118   ml_form_layout w = (ml_form_layout) vw;
119
120   ml_widget_repaint (w->tbl, session, windowid, io);
121 }