Added initial Spanish translation
[anjuta-git-plugin.git] / src / shell.c
blob27107f49a551739d2a239aa7c316d9fccf75c54b
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * shell.c
4 * Copyright (C) 2004 Naba Kumar <naba@gnome.org>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation; either version 2 of the License, or (at your option)
9 * any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc., 59
17 * Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #ifdef HAVE_CONFIG_H
21 # include <config.h>
22 #endif
24 #include <libanjuta/anjuta-shell.h>
25 #include <libanjuta/anjuta-utils.h>
26 #include <libanjuta/anjuta-debug.h>
28 #include "shell.h"
30 #define UI_FILE PACKAGE_DATA_DIR"/ui/anjuta-shell.ui"
32 static void
33 shutdown (AnjutaTestShell *shell)
35 anjuta_plugin_manager_unload_all_plugins (shell->plugin_manager);
36 gtk_main_quit ();
39 static gint
40 on_delete_event (GtkWidget *window, GdkEvent *event, gpointer data)
42 shutdown (ANJUTA_TEST_SHELL (window));
43 return TRUE;
46 static void
47 on_exit_activate (GtkAction *action, AnjutaTestShell *shell)
49 shutdown (shell);
52 static void
53 on_preferences_activate (GtkAction *action, AnjutaTestShell *shell)
55 gtk_widget_show (GTK_WIDGET (shell->preferences));
58 static void
59 on_shortcuts_activate (GtkAction *action, AnjutaTestShell *shell)
61 GtkWidget *win, *accel_editor;
63 accel_editor = anjuta_ui_get_accel_editor (ANJUTA_UI (shell->ui));
64 win = gtk_dialog_new_with_buttons (_("Anjuta Plugins"), GTK_WINDOW (shell),
65 GTK_DIALOG_DESTROY_WITH_PARENT,
66 GTK_STOCK_CLOSE, GTK_STOCK_CANCEL, NULL);
67 gtk_box_pack_start_defaults (GTK_BOX (GTK_DIALOG(win)->vbox), accel_editor);
68 gtk_window_set_default_size (GTK_WINDOW (win), 500, 400);
69 gtk_dialog_run (GTK_DIALOG (win));
70 gtk_widget_destroy (win);
73 static GtkActionEntry action_entries[] = {
74 { "ActionMenuFile", NULL, N_("_File")},
75 { "ActionMenuEdit", NULL, N_("_Edit")},
76 { "ActionMenuView", NULL, N_("_View")},
77 { "ActionMenuSettings", NULL, N_("_Settings")},
78 { "ActionMenuHelp", NULL, N_("_Help")},
80 "ActionExit",
81 GTK_STOCK_QUIT,
82 N_("_Quit"),
83 "<control>q",
84 N_("Quit Anjuta Test Shell"),
85 G_CALLBACK (on_exit_activate)
88 "ActionSettingsPreferences",
89 GTK_STOCK_PROPERTIES,
90 N_("_Preferences..."),
91 NULL,
92 N_("Preferences"),
93 G_CALLBACK (on_preferences_activate)
96 "ActionSettingsShortcuts",
97 NULL,
98 N_("C_ustomize shortcuts"),
99 NULL,
100 N_("Customize shortcuts associated with menu items"),
101 G_CALLBACK (on_shortcuts_activate)
105 static gpointer parent_class = NULL;
107 static void
108 on_add_merge_widget (GtkUIManager *merge, GtkWidget *widget,
109 GtkWidget *ui_container)
111 DEBUG_PRINT ("Adding UI item...");
112 gtk_box_pack_start (GTK_BOX ((ANJUTA_TEST_SHELL (ui_container))->box),
113 widget, FALSE, FALSE, 0);
116 GtkWidget *
117 anjuta_test_shell_new (void)
119 AnjutaTestShell *shell;
121 shell = ANJUTA_TEST_SHELL (g_object_new (ANJUTA_TYPE_TEST_SHELL,
122 "title", "Anjuta Shell",
123 NULL));
124 return GTK_WIDGET (shell);
127 static void
128 anjuta_test_shell_instance_init (AnjutaTestShell *shell)
130 GtkWidget *plugins;
131 GList *plugins_dirs = NULL;
133 shell->values = g_hash_table_new (g_str_hash, g_str_equal);
134 shell->widgets = g_hash_table_new (g_str_hash, g_str_equal);
136 shell->box = gtk_vbox_new (FALSE, 0);
137 gtk_widget_show (shell->box);
138 gtk_container_add (GTK_CONTAINER (shell), shell->box);
140 /* Status bar */
141 shell->status = ANJUTA_STATUS (anjuta_status_new ());
142 gtk_widget_show (GTK_WIDGET (shell->status));
143 gtk_box_pack_end (GTK_BOX (shell->box), GTK_WIDGET (shell->status),
144 FALSE, FALSE, 0);
146 /* Initialize plugins */
147 plugins_dirs = g_list_prepend (plugins_dirs, PACKAGE_PLUGIN_DIR);
148 shell->plugin_manager = anjuta_plugin_manager_new (G_OBJECT (shell),
149 shell->status,
150 plugins_dirs);
151 g_list_free (plugins_dirs);
153 plugins = anjuta_plugin_manager_get_plugins_page (shell->plugin_manager);
154 gtk_box_pack_end_defaults (GTK_BOX (shell->box), plugins);
156 /* Preferencesnces */
157 shell->preferences = ANJUTA_PREFERENCES (anjuta_preferences_new (shell->plugin_manager));
159 /* UI engine */
160 shell->ui = anjuta_ui_new ();
161 gtk_window_add_accel_group (GTK_WINDOW (shell),
162 anjuta_ui_get_accel_group (shell->ui));
163 g_signal_connect (G_OBJECT (shell->ui),
164 "add_widget", G_CALLBACK (on_add_merge_widget),
165 shell);
167 gtk_window_add_accel_group (GTK_WINDOW (shell),
168 anjuta_ui_get_accel_group (shell->ui));
169 /* Register actions */
170 anjuta_ui_add_action_group_entries (shell->ui, "ActionGroupTestShell",
171 _("Test shell action group"),
172 action_entries,
173 G_N_ELEMENTS (action_entries),
174 GETTEXT_PACKAGE, TRUE, shell);
175 /* Merge UI */
176 shell->merge_id = anjuta_ui_merge (shell->ui, UI_FILE);
178 gtk_window_set_default_size (GTK_WINDOW (shell), 300, 400);
181 static void
182 anjuta_test_shell_add_value (AnjutaShell *shell,
183 const char *name,
184 const GValue *value,
185 GError **error)
187 GValue *copy;
188 AnjutaTestShell *window = ANJUTA_TEST_SHELL (shell);
190 anjuta_shell_remove_value (shell, name, error);
192 copy = g_new0 (GValue, 1);
193 g_value_init (copy, value->g_type);
194 g_value_copy (value, copy);
196 g_hash_table_insert (window->values, g_strdup (name), copy);
197 g_signal_emit_by_name (shell, "value_added", name, copy);
200 static void
201 anjuta_test_shell_get_value (AnjutaShell *shell,
202 const char *name,
203 GValue *value,
204 GError **error)
206 GValue *val;
207 AnjutaTestShell *s = ANJUTA_TEST_SHELL (shell);
209 val = g_hash_table_lookup (s->values, name);
211 if (val) {
212 if (!value->g_type) {
213 g_value_init (value, val->g_type);
215 g_value_copy (val, value);
216 } else {
217 if (error) {
218 *error = g_error_new (ANJUTA_SHELL_ERROR,
219 ANJUTA_SHELL_ERROR_DOESNT_EXIST,
220 _("Value doesn't exist"));
225 static void
226 anjuta_test_shell_add_widget (AnjutaShell *shell,
227 GtkWidget *w,
228 const char *name,
229 const char *title,
230 const char *stock_id,
231 AnjutaShellPlacement placement,
232 GError **error)
234 GtkWidget *client_win;
235 AnjutaTestShell *window = ANJUTA_TEST_SHELL (shell);
237 g_return_if_fail (w != NULL);
239 // anjuta_shell_add (shell, name, G_TYPE_FROM_INSTANCE (w), w, NULL);
241 g_hash_table_insert (window->widgets, g_strdup (name), w);
242 client_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
243 gtk_container_add (GTK_CONTAINER (client_win), w);
244 gtk_widget_show_all (client_win);
247 static gboolean
248 remove_from_widgets_hash (gpointer key, gpointer value, gpointer data)
250 if (value == data) {
251 // AnjutaShell *shell;
253 // shell = g_object_get_data (G_OBJECT (value), "__temp_shell__");
254 // anjuta_shell_remove_value (shell, key, NULL);
255 g_free (key);
256 return TRUE;
258 return FALSE;
261 static void
262 anjuta_test_shell_remove_widget (AnjutaShell *shell,
263 GtkWidget *w,
264 GError **error)
266 // gint old_size;
267 GtkWidget *client_win;
268 AnjutaTestShell *window = ANJUTA_TEST_SHELL (shell);
269 g_return_if_fail (w != NULL);
271 // old_size = g_hash_table_size (window->widgets);
272 // g_object_set_data (G_OBJECT (w), "__temp_shell__", shell);
273 g_hash_table_foreach_steal (window->widgets, remove_from_widgets_hash, w);
274 // if (old_size != g_hash_table_size (window->widgets))
275 // {
276 client_win = gtk_widget_get_toplevel (w);
277 gtk_container_remove (GTK_CONTAINER (client_win), w);
278 gtk_widget_destroy (client_win);
282 static void
283 anjuta_test_shell_present_widget (AnjutaShell *shell,
284 GtkWidget *w,
285 GError **error)
287 GtkWidget *client_win;
288 // AnjutaTestShell *window = ANJUTA_TEST_SHELL (shell);
290 g_return_if_fail (w != NULL);
292 client_win = gtk_widget_get_toplevel (w);
293 gtk_window_present (GTK_WINDOW (client_win));
296 static void
297 anjuta_test_shell_remove_value (AnjutaShell *shell,
298 const char *name,
299 GError **error)
301 GValue *value;
302 GtkWidget *w;
303 char *key;
304 AnjutaTestShell *window = ANJUTA_TEST_SHELL (shell);
306 if (g_hash_table_lookup_extended (window->widgets, name,
307 (gpointer*)&key, (gpointer*)&w)) {
308 GtkWidget *client_win;
309 client_win = gtk_widget_get_toplevel (w);
310 gtk_container_remove (GTK_CONTAINER (client_win), w);
311 gtk_widget_destroy (client_win);
312 g_free (key);
315 if (g_hash_table_lookup_extended (window->values, name,
316 (gpointer*)&key, (gpointer*)&value)) {
317 g_hash_table_remove (window->values, name);
318 g_signal_emit_by_name (window, "value_removed", name);
319 g_value_unset (value);
320 g_free (value);
324 static GObject*
325 anjuta_test_shell_get_object (AnjutaShell *shell, const char *iface_name,
326 GError **error)
328 return anjuta_plugin_manager_get_plugin (ANJUTA_TEST_SHELL (shell)->plugin_manager,
329 iface_name);
332 static AnjutaStatus*
333 anjuta_test_shell_get_status (AnjutaShell *shell, GError **error)
335 return ANJUTA_TEST_SHELL (shell)->status;
338 static AnjutaUI *
339 anjuta_test_shell_get_ui (AnjutaShell *shell, GError **error)
341 return ANJUTA_TEST_SHELL (shell)->ui;
344 static AnjutaPreferences *
345 anjuta_test_shell_get_preferences (AnjutaShell *shell, GError **error)
347 return ANJUTA_TEST_SHELL (shell)->preferences;
350 static void
351 anjuta_test_shell_dispose (GObject *widget)
353 /* FIXME */
354 GNOME_CALL_PARENT (G_OBJECT_CLASS, dispose, (widget));
357 static void
358 anjuta_test_shell_finalize (GObject *widget)
360 AnjutaTestShell *shell = ANJUTA_TEST_SHELL (widget);
362 g_hash_table_destroy (shell->values);
363 g_hash_table_destroy (shell->widgets);
364 /* FIXME */
365 GNOME_CALL_PARENT (G_OBJECT_CLASS, finalize, (widget));
368 static void
369 anjuta_test_shell_class_init (AnjutaTestShellClass *class)
371 GObjectClass *object_class;
372 GtkWidgetClass *widget_class;
374 parent_class = g_type_class_peek_parent (class);
375 object_class = (GObjectClass*) class;
376 widget_class = (GtkWidgetClass*) class;
377 object_class->dispose = anjuta_test_shell_dispose;
378 object_class->finalize = anjuta_test_shell_finalize;
381 static void
382 anjuta_shell_iface_init (AnjutaShellIface *iface)
384 iface->add_widget = anjuta_test_shell_add_widget;
385 iface->remove_widget = anjuta_test_shell_remove_widget;
386 iface->present_widget = anjuta_test_shell_present_widget;
387 iface->add_value = anjuta_test_shell_add_value;
388 iface->get_value = anjuta_test_shell_get_value;
389 iface->remove_value = anjuta_test_shell_remove_value;
390 iface->get_object = anjuta_test_shell_get_object;
391 iface->get_status = anjuta_test_shell_get_status;
392 iface->get_ui = anjuta_test_shell_get_ui;
393 iface->get_preferences = anjuta_test_shell_get_preferences;
396 ANJUTA_TYPE_BEGIN(AnjutaTestShell, anjuta_test_shell, GTK_TYPE_WINDOW);
397 ANJUTA_TYPE_ADD_INTERFACE(anjuta_shell, ANJUTA_TYPE_SHELL);
398 ANJUTA_TYPE_END;
401 main (int argc, char *argv[])
403 GtkWidget *shell;
404 GnomeProgram *program;
405 gchar *data_dir;
406 // GList* command_args;
408 #ifdef ENABLE_NLS
409 bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
410 bind_textdomain_codeset(PACKAGE, "UTF-8");
411 textdomain (PACKAGE);
412 #endif
414 data_dir = g_strdup (PACKAGE_DATA_DIR);
415 data_dir[strlen (data_dir) - strlen (PACKAGE) - 1] = '\0';
417 /* Initialize gnome program */
418 program = gnome_program_init ("Anjuta Test Shell", VERSION,
419 LIBGNOMEUI_MODULE, argc, argv,
420 GNOME_PARAM_POPT_TABLE, NULL,
421 GNOME_PARAM_HUMAN_READABLE_NAME,
422 _("Anjuta test shell"),
423 GNOME_PARAM_APP_DATADIR, data_dir,
424 NULL);
425 g_free (data_dir);
427 shell = anjuta_test_shell_new ();
428 g_signal_connect (G_OBJECT (shell), "delete-event",
429 G_CALLBACK (on_delete_event), NULL);
430 gtk_widget_show_all (GTK_WIDGET (shell));
431 gtk_main();
432 return 0;