1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
4 * Copyright (C) 2004 Naba Kumar <naba@gnome.org>
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)
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
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
24 #include <libanjuta/anjuta-shell.h>
25 #include <libanjuta/anjuta-utils.h>
26 #include <libanjuta/anjuta-debug.h>
30 #define UI_FILE PACKAGE_DATA_DIR"/ui/anjuta-shell.ui"
33 shutdown (AnjutaTestShell
*shell
)
35 anjuta_plugin_manager_unload_all_plugins (shell
->plugin_manager
);
40 on_delete_event (GtkWidget
*window
, GdkEvent
*event
, gpointer data
)
42 shutdown (ANJUTA_TEST_SHELL (window
));
47 on_exit_activate (GtkAction
*action
, AnjutaTestShell
*shell
)
53 on_preferences_activate (GtkAction
*action
, AnjutaTestShell
*shell
)
55 gtk_widget_show (GTK_WIDGET (shell
->preferences
));
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")},
84 N_("Quit Anjuta Test Shell"),
85 G_CALLBACK (on_exit_activate
)
88 "ActionSettingsPreferences",
90 N_("_Preferences..."),
93 G_CALLBACK (on_preferences_activate
)
96 "ActionSettingsShortcuts",
98 N_("C_ustomize shortcuts"),
100 N_("Customize shortcuts associated with menu items"),
101 G_CALLBACK (on_shortcuts_activate
)
105 static gpointer parent_class
= NULL
;
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);
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",
124 return GTK_WIDGET (shell
);
128 anjuta_test_shell_instance_init (AnjutaTestShell
*shell
)
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
);
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
),
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
),
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
));
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
),
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"),
173 G_N_ELEMENTS (action_entries
),
174 GETTEXT_PACKAGE
, TRUE
, shell
);
176 shell
->merge_id
= anjuta_ui_merge (shell
->ui
, UI_FILE
);
178 gtk_window_set_default_size (GTK_WINDOW (shell
), 300, 400);
182 anjuta_test_shell_add_value (AnjutaShell
*shell
,
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
);
201 anjuta_test_shell_get_value (AnjutaShell
*shell
,
207 AnjutaTestShell
*s
= ANJUTA_TEST_SHELL (shell
);
209 val
= g_hash_table_lookup (s
->values
, name
);
212 if (!value
->g_type
) {
213 g_value_init (value
, val
->g_type
);
215 g_value_copy (val
, value
);
218 *error
= g_error_new (ANJUTA_SHELL_ERROR
,
219 ANJUTA_SHELL_ERROR_DOESNT_EXIST
,
220 _("Value doesn't exist"));
226 anjuta_test_shell_add_widget (AnjutaShell
*shell
,
230 const char *stock_id
,
231 AnjutaShellPlacement placement
,
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
);
248 remove_from_widgets_hash (gpointer key
, gpointer value
, gpointer data
)
251 // AnjutaShell *shell;
253 // shell = g_object_get_data (G_OBJECT (value), "__temp_shell__");
254 // anjuta_shell_remove_value (shell, key, NULL);
262 anjuta_test_shell_remove_widget (AnjutaShell
*shell
,
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))
276 client_win
= gtk_widget_get_toplevel (w
);
277 gtk_container_remove (GTK_CONTAINER (client_win
), w
);
278 gtk_widget_destroy (client_win
);
283 anjuta_test_shell_present_widget (AnjutaShell
*shell
,
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
));
297 anjuta_test_shell_remove_value (AnjutaShell
*shell
,
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
);
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
);
325 anjuta_test_shell_get_object (AnjutaShell
*shell
, const char *iface_name
,
328 return anjuta_plugin_manager_get_plugin (ANJUTA_TEST_SHELL (shell
)->plugin_manager
,
333 anjuta_test_shell_get_status (AnjutaShell
*shell
, GError
**error
)
335 return ANJUTA_TEST_SHELL (shell
)->status
;
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
;
351 anjuta_test_shell_dispose (GObject
*widget
)
354 GNOME_CALL_PARENT (G_OBJECT_CLASS
, dispose
, (widget
));
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
);
365 GNOME_CALL_PARENT (G_OBJECT_CLASS
, finalize
, (widget
));
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
;
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
);
401 main (int argc
, char *argv
[])
404 GnomeProgram
*program
;
406 // GList* command_args;
409 bindtextdomain (PACKAGE
, PACKAGE_LOCALE_DIR
);
410 bind_textdomain_codeset(PACKAGE
, "UTF-8");
411 textdomain (PACKAGE
);
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
,
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
));