Add to git.
[monolith.git] / src / ml_dialog.c
1 /* Monolith dialog 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_dialog.c,v 1.4 2002/11/13 21:41:01 rich Exp $
19  */
20
21 #include "config.h"
22
23 #include <pthr_iolib.h>
24
25 #include "monolith.h"
26 #include "ml_widget.h"
27 #include "ml_table_layout.h"
28 #include "ml_flow_layout.h"
29 #include "ml_label.h"
30 #include "ml_text_label.h"
31 #include "ml_image.h"
32 #include "ml_button.h"
33 #include "ml_close_button.h"
34 #include "ml_dialog.h"
35
36 static void repaint (void *, ml_session, const char *, io_handle);
37
38 struct ml_widget_operations dialog_ops =
39   {
40     repaint: repaint,
41   };
42
43 struct ml_dialog
44 {
45   struct ml_widget_operations *ops;
46   pool pool;                    /* Pool for allocations. */
47
48   ml_table_layout tbl;          /* Top-level table layout. */
49   ml_text_label title;          /* Title-bar. */
50   ml_image icon;                /* Icon. */
51   ml_label text;                /* Main text. */
52   ml_flow_layout buttons;       /* Buttons. */
53 };
54
55 ml_dialog
56 new_ml_dialog (pool pool)
57 {
58   ml_dialog w = pmalloc (pool, sizeof *w);
59
60   w->ops = &dialog_ops;
61   w->pool = pool;
62
63   /* At the top level, a dialog is nothing more than a table layout. */
64   w->tbl = new_ml_table_layout (pool, 3, 2);
65
66   /* Title bar. */
67   w->title = new_ml_text_label (pool, 0);
68   ml_widget_set_property (w->title, "font.weight", "bold");
69   ml_table_layout_pack (w->tbl, w->title, 0, 0);
70   ml_table_layout_set_colspan (w->tbl, 0, 0, 2);
71
72   /* Icon. */
73   w->icon = new_ml_image (pool, 0);
74   ml_table_layout_pack (w->tbl, w->icon, 1, 0);
75
76   /* Text. */
77   w->text = new_ml_label (pool, 0);
78   ml_table_layout_pack (w->tbl, w->text, 1, 1);
79
80   /* Buttons. */
81   w->buttons = new_ml_flow_layout (pool);
82   ml_table_layout_pack (w->tbl, w->buttons, 2, 0);
83   ml_table_layout_set_colspan (w->tbl, 2, 0, 2);
84
85   return w;
86 }
87
88 void
89 ml_dialog_set_text (ml_dialog w, const char *text)
90 {
91   ml_widget_set_property (w->text, "text", text);
92 }
93
94 const char *
95 ml_dialog_get_text (ml_dialog w)
96 {
97   const char *text;
98
99   ml_widget_get_property (w->text, "text", text);
100   return text;
101 }
102
103 void
104 ml_dialog_set_title (ml_dialog w, const char *title)
105 {
106   ml_widget_set_property (w->title, "text", title);
107 }
108
109 const char *
110 ml_dialog_get_title (ml_dialog w)
111 {
112   const char *title;
113
114   ml_widget_get_property (w->title, "text", title);
115   return title;
116 }
117
118 void
119 ml_dialog_set_icon (ml_dialog w, const char *icon)
120 {
121   ml_widget_set_property (w->icon, "image", icon);
122 }
123
124 const char *
125 ml_dialog_get_icon (ml_dialog w)
126 {
127   const char *icon;
128
129   ml_widget_get_property (w->icon, "image", icon);
130   return icon;
131 }
132
133 void
134 ml_dialog_clear_buttons (ml_dialog w)
135 {
136   ml_flow_layout_clear (w->buttons);
137 }
138
139 void
140 ml_dialog_add_button (ml_dialog w, const char *text,
141                       void (*callback_fn) (ml_session, void *),
142                       ml_session session, void *data)
143 {
144   ml_button b;
145
146   /* Create a new button widget. */
147   b = new_ml_button (w->pool, text);
148   ml_button_set_callback (b, callback_fn, session, data);
149
150   /* Pack it into the buttons flow layout. */
151   ml_flow_layout_pack (w->buttons, b);
152 }
153
154 void
155 ml_dialog_add_close_button (ml_dialog w, const char *text, int flags)
156 {
157   ml_close_button b;
158
159   /* Create new button. */
160   b = new_ml_close_button (w->pool, text);
161
162   if ((flags & ML_DIALOG_CLOSE_RELOAD_OPENER))
163     ml_widget_set_property (b, "button.reload-opener", 1);
164
165   /* Pack it. */
166   ml_flow_layout_pack (w->buttons, b);
167 }
168
169 ml_window
170 ml_ok_window (pool pool, ml_session session, const char *text, int flags)
171 {
172   ml_window win;
173   ml_dialog dlg;
174   const char *title = "That operation was carried out successfully";
175
176   win = new_ml_window (session, pool);
177   dlg = new_ml_dialog (pool);
178
179   ml_window_set_title (win, title);
180   ml_dialog_set_text (dlg, text);
181   ml_dialog_set_title (dlg, title);
182   // ml_dialog_set_icon (dlg, ...);
183
184   if ((flags & ML_DIALOG_CLOSE_BUTTON))
185     ml_dialog_add_close_button (dlg, "Close window", flags);
186
187   ml_window_pack (win, dlg);
188
189   return win;
190 }
191
192 ml_window
193 ml_error_window (pool pool, ml_session session, const char *text, int flags)
194 {
195   ml_window win;
196   ml_dialog dlg;
197   const char *title = "There was an error";
198
199   win = new_ml_window (session, pool);
200   dlg = new_ml_dialog (pool);
201
202   ml_window_set_title (win, title);
203   ml_dialog_set_text (dlg, text);
204   ml_dialog_set_title (dlg, title);
205   // ml_dialog_set_icon (dlg, ...);
206
207   if ((flags & ML_DIALOG_CLOSE_BUTTON))
208     ml_dialog_add_close_button (dlg, "Close window", flags);
209
210   ml_window_pack (win, dlg);
211
212   return win;
213 }
214
215 static void
216 repaint (void *vw, ml_session session, const char *windowid, io_handle io)
217 {
218   ml_dialog w = (ml_dialog) vw;
219
220   ml_widget_repaint (w->tbl, session, windowid, io);
221 }