00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00025 #include <gtk/gtk.h>
00026
00027 #include "application-data.h"
00028 #include "notebook.h"
00029
00030
00031
00032 static gint frame_table_cmp_func (gconstpointer a, gconstpointer b)
00033 {
00034 return ((frame_table_t *)a)->table_box != b;
00035 }
00036
00037
00038
00039 void notebook_on_page_switch (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data)
00040 {
00041 synema_instance_t *inst = synema_instance ();
00042 GList *item = g_list_find_custom (inst->tables_list,
00043 gtk_notebook_get_nth_page (notebook, page_num),
00044 frame_table_cmp_func);
00045 if (item) {
00046 frame_table_hide_frames (inst->current_table);
00047 inst->current_table = item->data;
00048 frame_table_show_frames (inst->current_table);
00049 }
00050 }
00051
00052
00053
00054 void notebook_remove_page (GtkToolButton *donotuse, gpointer user_data)
00055 {
00056
00057 synema_instance_t *inst = synema_instance ();
00058 frame_table_t *tab = (frame_table_t *) user_data;
00059 GtkWidget *frame_box = (GtkWidget *) gtk_builder_get_object (inst->builder, "notebook");
00060 gint index = gtk_notebook_page_num (GTK_NOTEBOOK (frame_box), tab->table_box);
00061
00062 if (tab == inst->current_table)
00063 notebook_on_page_switch (GTK_NOTEBOOK (frame_box), NULL, 0, NULL);
00064
00065 gtk_notebook_remove_page (GTK_NOTEBOOK (frame_box), index);
00066 inst->tables_list = g_list_remove (inst->tables_list, tab);
00067 if (!inst->tables_list)
00068 inst->current_table = NULL;
00069 frame_table_free (tab);
00070 }
00071
00072
00073
00074 const gchar *notebook_get_tab_label (GtkNotebook *notebook, GtkWidget *child)
00075 {
00076 const gchar *buffer = NULL;
00077 GtkWidget *box = gtk_notebook_get_tab_label (notebook, child);
00078 GList *children = gtk_container_get_children (GTK_CONTAINER (box));
00079 GList *iter = children;
00080
00081 if (iter) {
00082 do {
00083 if (GTK_IS_EVENT_BOX (iter->data)) {
00084 iter = gtk_container_get_children (GTK_CONTAINER (iter->data));
00085 buffer = gtk_label_get_text (GTK_LABEL (iter->data));
00086 g_list_free (iter);
00087 g_list_free (children);
00088 return buffer;
00089 }
00090 } while ((iter = g_list_next (iter)) != NULL);
00091 }
00092
00093 g_list_free (children);
00094 return NULL;
00095 }
00096
00097
00098
00099 static GtkWidget *notebook_new_page_label ()
00100 {
00101 synema_instance_t *inst = synema_instance ();
00102
00103 gchar *text = g_strdup_printf ("Unnamed %u", inst->labelcount);
00104 GtkWidget *label = gtk_label_new (text);
00105 g_free (text);
00106
00107 return label;
00108 }
00109
00110
00111
00112 static gboolean notebook_edit_tab_label (GtkEventBox *box, GdkEventButton *event, gpointer user_data)
00113 {
00114 if (event->type == GDK_2BUTTON_PRESS) {
00115 synema_instance_t *inst = synema_instance ();
00116 GtkWidget *label = (GtkWidget *) user_data;
00117 GtkWidget *dialog = gtk_dialog_new_with_buttons ("Rename Tab",
00118 GTK_WINDOW (gtk_builder_get_object (inst->builder, "synema_window")),
00119 GTK_DIALOG_DESTROY_WITH_PARENT,
00120 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
00121 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
00122 NULL);
00123 GtkWidget *entry = gtk_entry_new ();
00124 gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
00125 gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
00126 gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), entry);
00127 gtk_entry_set_text (GTK_ENTRY (entry), gtk_label_get_text (GTK_LABEL (label)));
00128 gtk_widget_show_all (dialog);
00129
00130 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
00131 switch (result) {
00132 case GTK_RESPONSE_ACCEPT:
00133 gtk_label_set_text (GTK_LABEL (label), gtk_entry_get_text (GTK_ENTRY (entry)));
00134 }
00135
00136 gtk_widget_destroy (dialog);
00137 return TRUE;
00138 }
00139
00140 return FALSE;
00141 }
00142
00143
00144
00145 frame_table_t *_notebook_add_page (GtkWidget *frame_box, const gchar *tablabel)
00146 {
00147 synema_instance_t *inst = synema_instance ();
00148 frame_table_t *tmptab = frame_table_new ();
00149 GtkWidget *button = gtk_button_new ();
00150 GtkWidget *eventbox = gtk_event_box_new ();
00151 GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
00152 GtkWidget *icon = gtk_image_new_from_stock (GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
00153 GtkWidget *label = NULL;
00154
00155
00156 inst->labelcount++;
00157 label = (tablabel==NULL) ? notebook_new_page_label () : gtk_label_new (tablabel);
00158
00159
00160 gtk_container_add (GTK_CONTAINER (eventbox), label);
00161 gtk_event_box_set_visible_window (GTK_EVENT_BOX (eventbox), FALSE);
00162 gtk_widget_set_events (eventbox, GDK_BUTTON_PRESS_MASK);
00163 g_signal_connect (eventbox, "button_press_event", G_CALLBACK (notebook_edit_tab_label), label);
00164
00165
00166 gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
00167 gtk_container_add (GTK_CONTAINER (button), icon);
00168 g_signal_connect (button, "clicked", G_CALLBACK (notebook_remove_page), tmptab);
00169
00170
00171 gtk_box_pack_start (GTK_BOX (hbox), eventbox, TRUE, TRUE, 0);
00172 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
00173 gtk_widget_show_all (hbox);
00174 gtk_widget_show_all (tmptab->table_box);
00175
00176
00177 gtk_notebook_append_page (GTK_NOTEBOOK (frame_box), tmptab->table_box, hbox);
00178 gtk_notebook_set_current_page (GTK_NOTEBOOK (frame_box), -1);
00179 tmptab->position = gtk_notebook_get_current_page (GTK_NOTEBOOK (frame_box));
00180 gtk_widget_show (frame_box);
00181 inst->tables_list = g_list_prepend (inst->tables_list, tmptab);
00182 frame_table_hide_frames (inst->current_table);
00183 inst->current_table = tmptab;
00184
00185 return tmptab;
00186 }
00187
00188
00189
00190 void notebook_add_page (GtkToolButton *addbutton, gpointer user_data)
00191 {
00192 _notebook_add_page (user_data, NULL);
00193 }
00194
00195
00196
00197 void notebook_on_page_added (GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
00198 {
00199 if (gtk_notebook_get_n_pages (notebook) > 1) {
00200 gtk_notebook_set_show_tabs (notebook, TRUE);
00201 } else if (gtk_notebook_get_n_pages (notebook) == 1) {
00202 gtk_notebook_set_show_tabs (notebook, FALSE);
00203 }
00204 }
00205
00206
00207
00208 void notebook_on_page_removed (GtkNotebook *notebook, GtkWidget *child, guint page_num, gpointer user_data)
00209 {
00210 if (gtk_notebook_get_n_pages (notebook) > 1) {
00211 gtk_notebook_set_show_tabs (notebook, TRUE);
00212 } else if (gtk_notebook_get_n_pages (notebook) == 1) {
00213 gtk_notebook_set_show_tabs (notebook, FALSE);
00214 }
00215 }
00216
00217
00218
00219 void notebook_remove_all ()
00220 {
00221 synema_instance_t *inst = synema_instance ();
00222
00223 while (inst->tables_list)
00224 notebook_remove_page (NULL, inst->tables_list->data);
00225 }