~ubuntu-branches/ubuntu/edgy/gnome-system-tools/edgy-proposed

« back to all changes in this revision

Viewing changes to src/services/table.c

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2004-10-14 18:49:22 UTC
  • Revision ID: james.westby@ubuntu.com-20041014184922-efvh7u8kpyy67a3z
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
 
2
/* table.c: this file is part of services-admin, a gnome-system-tool frontend 
 
3
 * for run level services administration.
 
4
 * 
 
5
 * Copyright (C) 2002 Ximian, Inc.
 
6
 *
 
7
 * This program is free software; you can redistribute it and/or modify
 
8
 * it under the terms of the GNU General Public License as
 
9
 * published by the Free Software Foundation; either version 2 of the
 
10
 * License, or (at your option) any later version.
 
11
 *
 
12
 * This program is distributed in the hope that it will be useful,
 
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
 * GNU General Public License for more details.
 
16
 *
 
17
 * You should have received a copy of the GNU General Public License
 
18
 * along with this program; if not, write to the Free Software
 
19
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 
20
 *
 
21
 * Authors: Carlos Garnacho <garnacho@tuxerver.net>.
 
22
 */
 
23
 
 
24
#ifdef HAVE_CONFIG_H
 
25
#  include <config.h>
 
26
#endif
 
27
 
 
28
#include <gtk/gtk.h>
 
29
 
 
30
#include "gst.h"
 
31
 
 
32
#include "table.h"
 
33
#include "callbacks.h"
 
34
 
 
35
GtkActionEntry popup_menu_items[] = {
 
36
        { "Properties", GTK_STOCK_PROPERTIES, "_Properties", NULL, NULL, G_CALLBACK (on_popup_settings_activate) },
 
37
};
 
38
 
 
39
const gchar *ui_description =
 
40
        "<ui>"
 
41
        "  <popup name='MainMenu'>"
 
42
        "    <menuitem action='Properties'/>"
 
43
        "  </popup>"
 
44
        "</ui>";
 
45
 
 
46
typedef struct TreeItem_ TreeItem;
 
47
        
 
48
struct TreeItem_ {
 
49
        gchar *service;
 
50
        gboolean active;
 
51
        gint priority;
 
52
};
 
53
 
 
54
extern GstTool *tool;
 
55
 
 
56
static GtkWidget*
 
57
table_popup_menu_create (GtkTreeView *treeview)
 
58
{
 
59
        GtkUIManager   *ui_manager;
 
60
        GtkActionGroup *action_group;
 
61
        GtkWidget      *popup;
 
62
 
 
63
        action_group = gtk_action_group_new ("MenuActions");
 
64
        gtk_action_group_add_actions (action_group, popup_menu_items, G_N_ELEMENTS (popup_menu_items), treeview);
 
65
 
 
66
        ui_manager = gtk_ui_manager_new ();
 
67
        gtk_ui_manager_insert_action_group (ui_manager, action_group, 0);
 
68
 
 
69
        if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_description, -1, NULL))
 
70
                return NULL;
 
71
 
 
72
        popup = gtk_ui_manager_get_widget (ui_manager, "/MainMenu");
 
73
        return popup;
 
74
}
 
75
 
 
76
static void
 
77
add_columns (GtkTreeView *treeview)
 
78
{
 
79
        gint i, *col;
 
80
        gchar *label;
 
81
        GtkCellRenderer *renderer;
 
82
        GtkTreeViewColumn *column;
 
83
 
 
84
        renderer = gtk_cell_renderer_toggle_new ();
 
85
        gtk_tree_view_insert_column_with_attributes (treeview, -1,
 
86
                                                     _("Active"),
 
87
                                                     renderer,
 
88
                                                     "active", COL_ACTIVE,
 
89
                                                     NULL);
 
90
 
 
91
        g_signal_connect (G_OBJECT (renderer), "toggled",
 
92
                          G_CALLBACK (on_service_toggled), tool);
 
93
        
 
94
        renderer = gtk_cell_renderer_text_new ();
 
95
        column = gtk_tree_view_column_new_with_attributes (_("Service"),
 
96
                                                           renderer,
 
97
                                                           "text", COL_SERVICE,
 
98
                                                           NULL);
 
99
        gtk_tree_view_column_set_sort_column_id (column, COL_SERVICE);
 
100
        gtk_tree_view_insert_column (treeview, column, -1);
 
101
        
 
102
        column = gtk_tree_view_column_new_with_attributes ("priority",
 
103
                                                           renderer,
 
104
                                                           "text", COL_PRIORITY,
 
105
                                                           NULL);
 
106
        gtk_tree_view_column_set_sort_column_id (column, COL_PRIORITY);
 
107
        gtk_tree_view_column_set_sort_indicator (column, FALSE);
 
108
        gtk_tree_view_column_set_visible (column, FALSE);
 
109
 
 
110
        gtk_tree_view_insert_column (treeview, column, -1);
 
111
}
 
112
 
 
113
static GtkTreeModel*
 
114
create_model (void)
 
115
{
 
116
        GtkTreeStore *model;
 
117
 
 
118
        model = gtk_tree_store_new (COL_LAST,
 
119
                                    G_TYPE_BOOLEAN,
 
120
                                    G_TYPE_STRING,
 
121
                                    G_TYPE_INT,
 
122
                                    G_TYPE_POINTER);
 
123
        return GTK_TREE_MODEL(model);
 
124
}
 
125
 
 
126
void
 
127
table_create (void)
 
128
{
 
129
        GtkWidget        *runlevel_table = gst_dialog_get_widget (tool->main_dialog, "runlevel_table");
 
130
        GtkTreeModel     *model;
 
131
        GtkTreeSelection *selection;
 
132
        GtkWidget        *menu;
 
133
        
 
134
        model = create_model ();
 
135
 
 
136
        gtk_tree_view_set_model (GTK_TREE_VIEW (runlevel_table), model);
 
137
        g_object_unref (G_OBJECT (model));
 
138
        
 
139
        add_columns (GTK_TREE_VIEW (runlevel_table));
 
140
 
 
141
        menu = table_popup_menu_create (GTK_TREE_VIEW (runlevel_table));
 
142
        g_signal_connect (G_OBJECT (runlevel_table), "button_press_event",
 
143
                          G_CALLBACK (on_table_button_press_event), menu);
 
144
        g_signal_connect (G_OBJECT (runlevel_table), "popup_menu",
 
145
                          G_CALLBACK (on_table_popup_menu), menu);
 
146
 
 
147
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (runlevel_table));
 
148
        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
 
149
        g_signal_connect (G_OBJECT (selection), "changed",
 
150
                          G_CALLBACK (on_services_table_select_row), NULL);
 
151
}
 
152
 
 
153
static gchar*
 
154
table_value_service(xmlNodePtr node)
 
155
{
 
156
        gchar *buf, *name, *script;
 
157
        g_return_val_if_fail (node != NULL, NULL);
 
158
 
 
159
        name = gst_xml_get_child_content (node, "name");
 
160
        script = gst_xml_get_child_content (node, "script");
 
161
        
 
162
        if (name == NULL)
 
163
                buf = script;
 
164
        else {
 
165
                buf = g_strdup_printf ("%s - %s", script, name);
 
166
                g_free (name);
 
167
                g_free (script);
 
168
        }
 
169
        
 
170
        return buf;
 
171
}
 
172
 
 
173
static gboolean
 
174
table_value_active (xmlNodePtr node, gchar *runlevel)
 
175
{
 
176
        gboolean value = FALSE;
 
177
        xmlNodePtr runlevels = gst_xml_element_find_first (node, "runlevels");
 
178
        xmlNodePtr rl;
 
179
        gchar *str, *action;
 
180
 
 
181
        if (runlevels) {
 
182
                for (rl = gst_xml_element_find_first (runlevels, "runlevel");
 
183
                     rl != NULL;
 
184
                     rl = gst_xml_element_find_next (rl, "runlevel"))
 
185
                {
 
186
                        str = gst_xml_get_child_content (rl, "number");
 
187
 
 
188
                        if (str && runlevel && (strcmp (str, runlevel) == 0)) {
 
189
                                action = gst_xml_get_child_content (rl, "action");
 
190
 
 
191
                                if (strcmp (action, "start") == 0)
 
192
                                        value = TRUE;
 
193
 
 
194
                                g_free (action);
 
195
                        }
 
196
 
 
197
                        g_free (str);
 
198
                }
 
199
        }
 
200
 
 
201
        return value;
 
202
}
 
203
 
 
204
static gint
 
205
table_value_priority (xmlNodePtr node)
 
206
{
 
207
        gchar *str = gst_xml_get_child_content (node, "priority");
 
208
        gint   val;
 
209
 
 
210
        if (!str)
 
211
                return 0;
 
212
 
 
213
        val = (gint) g_strtod (str, NULL);
 
214
        g_free (str);
 
215
        
 
216
        return val;
 
217
}
 
218
 
 
219
static TreeItem*
 
220
get_node_data (xmlNodePtr service, gchar *runlevel)
 
221
{
 
222
        TreeItem *item = g_malloc (sizeof(TreeItem));
 
223
 
 
224
        item->service = table_value_service (service);
 
225
        item->active = table_value_active (service, runlevel);
 
226
        item->priority = table_value_priority (service);
 
227
 
 
228
        return item;
 
229
}
 
230
 
 
231
void 
 
232
table_populate (xmlNodePtr root, gchar *runlevel)
 
233
{
 
234
        xmlNodePtr service,services;
 
235
        GtkTreeIter iter;
 
236
        GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(gst_dialog_get_widget (tool->main_dialog, "runlevel_table")));
 
237
        
 
238
        g_return_if_fail (root != NULL);
 
239
        
 
240
        services = gst_xml_element_find_first (root, "services");
 
241
        
 
242
        for (service = gst_xml_element_find_first (services, "service"); service != NULL; service = gst_xml_element_find_next (service, "service"))
 
243
        {
 
244
                TreeItem *item;
 
245
 
 
246
                item = get_node_data (service, runlevel);
 
247
 
 
248
                gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
 
249
                gtk_tree_store_set (GTK_TREE_STORE (model),
 
250
                                    &iter,
 
251
                                    COL_ACTIVE, item->active,
 
252
                                    COL_SERVICE, item->service,
 
253
                                    COL_PRIORITY, item->priority,
 
254
                                    COL_POINTER, service,
 
255
                                    -1);
 
256
 
 
257
                g_free (item->service);
 
258
                g_free (item);
 
259
        }
 
260
        
 
261
}
 
262
 
 
263
void
 
264
table_clear (void)
 
265
{
 
266
        GtkWidget *runlevel_table = gst_dialog_get_widget (tool->main_dialog, "runlevel_table");
 
267
        GtkTreeModel *model;
 
268
 
 
269
        model = gtk_tree_view_get_model (GTK_TREE_VIEW (runlevel_table));
 
270
        gtk_tree_store_clear (GTK_TREE_STORE (model));
 
271
}