diff options
author | Tim Janik <timj@gtk.org> | 1998-07-16 20:23:12 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-07-16 20:23:12 +0000 |
commit | 81517a6d4c09663ba97335affe5b1ec047a567d3 (patch) | |
tree | 4638e036b6e692136a617d1fdd7d8f8a05f6a3bf /gtk/gtknotebook.c | |
parent | 5e3acecc12dc9b7671ea56150a66e2ae41a65a6e (diff) | |
download | gtk+-81517a6d4c09663ba97335affe5b1ec047a567d3.tar.gz |
signdness corrections all ove the place. implementation of object
Thu Jul 16 18:24:41 1998 Tim Janik <timj@gtk.org>
* gtk/gtknotebook.h:
* gtk/gtknotebook.c: signdness corrections all ove the place.
implementation of object arguments: GtkNotebook::enable_popup,
GtkNotebook::tab_pos, GtkNotebook::tab_border, GtkNotebook::show_tabs,
GtkNotebook::show_border, GtkNotebook::scrollable and GtkNotebook::page.
begun implementation of child args, we have GtkNotebook::tab_label, but
GtkNotebook::menu_label and GtkNotebook::position still lack the
implementation.
(gtk_notebook_remove_page):
(gtk_notebook_current_page): allow negative indices (-1) as alias for
the last page.
* gtk/gtkentry.h:
* gtk/gtkentry.c: GtkType and macro fixups. implementation of object
arguments GtkEntry::max_length and GtkEntry::visibility.
(gtk_entry_adjust_scroll): queue a redraw.
* gtk/gtkeditable.h:
* gtk/gtkeditable.c: GtkType und macro fixups. implementation of
object arguments GtkEditable::text_position and GtkEditable::editable.
new (action) signal GtkEditable::set_editable.
provide a default handler for GtkEditable::changed that queues a redraw.
* gtk/gtktext.h:
* gtk/gtktext.c: GtkType und macro fixups. override GtkEditable::
set_editable.
Diffstat (limited to 'gtk/gtknotebook.c')
-rw-r--r-- | gtk/gtknotebook.c | 305 |
1 files changed, 282 insertions, 23 deletions
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 858039943a..4d076c4e60 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -44,6 +44,24 @@ enum { STEP_NEXT }; +enum { + ARG_0, + ARG_TAB_POS, + ARG_SHOW_TABS, + ARG_SHOW_BORDER, + ARG_SCROLLABLE, + ARG_TAB_BORDER, + ARG_PAGE, + ARG_ENABLE_POPUP +}; + +enum { + CHILD_ARG_0, + CHILD_ARG_TAB_LABEL, + CHILD_ARG_MENU_LABEL, + CHILD_ARG_POSITION +}; + typedef void (*GtkNotebookSignal) (GtkObject *object, GtkNotebookPage *arg1, gint arg2, @@ -51,6 +69,20 @@ typedef void (*GtkNotebookSignal) (GtkObject *object, static void gtk_notebook_class_init (GtkNotebookClass *klass); static void gtk_notebook_init (GtkNotebook *notebook); +static void gtk_notebook_set_arg (GtkObject *object, + GtkArg *arg, + guint arg_id); +static void gtk_notebook_get_arg (GtkObject *object, + GtkArg *arg, + guint arg_id); +static void gtk_notebook_set_child_arg (GtkContainer *container, + GtkWidget *child, + GtkArg *arg, + guint arg_id); +static void gtk_notebook_get_child_arg (GtkContainer *container, + GtkWidget *child, + GtkArg *arg, + guint arg_id); static void gtk_notebook_destroy (GtkObject *object); static void gtk_notebook_map (GtkWidget *widget); static void gtk_notebook_unmap (GtkWidget *widget); @@ -84,13 +116,13 @@ static void gtk_notebook_remove (GtkContainer *container, GtkWidget *widget); static void gtk_notebook_real_remove (GtkNotebook *notebook, GList *list, - gint page_num); + guint page_num); static void gtk_notebook_foreach (GtkContainer *container, GtkCallback callback, gpointer callback_data); static void gtk_notebook_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, - gint page_num); + guint page_num); static void gtk_notebook_draw_tab (GtkNotebook *notebook, GtkNotebookPage *page, GdkRectangle *area); @@ -124,7 +156,7 @@ static void gtk_notebook_switch_focus_tab (GtkNotebook *notebook, GList *new_child); static void gtk_real_notebook_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, - gint page_num); + guint page_num); static void gtk_notebook_marshal_signal (GtkObject *object, GtkSignalFunc func, gpointer func_data, @@ -133,7 +165,7 @@ static void gtk_notebook_menu_switch_page (GtkWidget *widget, GtkNotebookPage *page); static void gtk_notebook_update_labels (GtkNotebook *notebook, GList *list, - gint page_num); + guint page_num); static void gtk_notebook_menu_detacher (GtkWidget *widget, GtkMenu *menu); static void gtk_notebook_menu_label_unparent (GtkWidget *widget, @@ -182,9 +214,22 @@ gtk_notebook_class_init (GtkNotebookClass *class) object_class = (GtkObjectClass*) class; widget_class = (GtkWidgetClass*) class; container_class = (GtkContainerClass*) class; - parent_class = gtk_type_class (gtk_container_get_type ()); + gtk_object_add_arg_type ("GtkNotebook::page", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_PAGE); + gtk_object_add_arg_type ("GtkNotebook::tab_pos", GTK_TYPE_POSITION_TYPE, GTK_ARG_READWRITE, ARG_TAB_POS); + gtk_object_add_arg_type ("GtkNotebook::tab_border", GTK_TYPE_UINT, GTK_ARG_READWRITE, ARG_TAB_BORDER); + gtk_object_add_arg_type ("GtkNotebook::show_tabs", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SHOW_TABS); + gtk_object_add_arg_type ("GtkNotebook::show_border", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SHOW_BORDER); + gtk_object_add_arg_type ("GtkNotebook::scrollable", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SCROLLABLE); + gtk_object_add_arg_type ("GtkNotebook::enable_popup", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_ENABLE_POPUP); + + gtk_container_add_child_arg_type ("GtkNotebook::tab_label", GTK_TYPE_STRING, GTK_ARG_READWRITE, CHILD_ARG_TAB_LABEL); + /* + * gtk_container_add_child_arg_type ("GtkNotebook::menu_label", GTK_TYPE_STRING, GTK_ARG_READWRITE, CHILD_ARG_MENU_LABEL); + * gtk_container_add_child_arg_type ("GtkNotebook::position", GTK_TYPE_INT, GTK_ARG_READWRITE, CHILD_ARG_POSITION); + */ + notebook_signals[SWITCH_PAGE] = gtk_signal_new ("switch_page", GTK_RUN_LAST, @@ -193,10 +238,12 @@ gtk_notebook_class_init (GtkNotebookClass *class) gtk_notebook_marshal_signal, GTK_TYPE_NONE, 2, GTK_TYPE_POINTER, - GTK_TYPE_INT); + GTK_TYPE_UINT); gtk_object_class_add_signals (object_class, notebook_signals, LAST_SIGNAL); + object_class->set_arg = gtk_notebook_set_arg; + object_class->get_arg = gtk_notebook_get_arg; object_class->destroy = gtk_notebook_destroy; widget_class->map = gtk_notebook_map; @@ -221,11 +268,202 @@ gtk_notebook_class_init (GtkNotebookClass *class) container_class->foreach = gtk_notebook_foreach; container_class->focus = gtk_notebook_focus; container_class->set_focus_child = gtk_notebook_set_focus_child; + container_class->get_child_arg = gtk_notebook_get_child_arg; + container_class->set_child_arg = gtk_notebook_set_child_arg; container_class->child_type = gtk_notebook_child_type; class->switch_page = gtk_real_notebook_switch_page; } +static void +gtk_notebook_set_arg (GtkObject *object, + GtkArg *arg, + guint arg_id) +{ + GtkNotebook *notebook; + + notebook = GTK_NOTEBOOK (object); + + switch (arg_id) + { + case ARG_SHOW_TABS: + gtk_notebook_set_show_tabs (notebook, GTK_VALUE_BOOL (*arg)); + break; + case ARG_SHOW_BORDER: + gtk_notebook_set_show_border (notebook, GTK_VALUE_BOOL (*arg)); + break; + case ARG_SCROLLABLE: + gtk_notebook_set_scrollable (notebook, GTK_VALUE_BOOL (*arg)); + break; + case ARG_ENABLE_POPUP: + if (GTK_VALUE_BOOL (*arg)) + gtk_notebook_popup_enable (notebook); + else + gtk_notebook_popup_disable (notebook); + break; + case ARG_PAGE: + gtk_notebook_set_page (notebook, GTK_VALUE_INT (*arg)); + break; + case ARG_TAB_POS: + gtk_notebook_set_tab_pos (notebook, GTK_VALUE_ENUM (*arg)); + break; + case ARG_TAB_BORDER: + gtk_notebook_set_tab_border (notebook, GTK_VALUE_UINT (*arg)); + break; + default: + break; + } +} + +static void +gtk_notebook_get_arg (GtkObject *object, + GtkArg *arg, + guint arg_id) +{ + GtkNotebook *notebook; + + notebook = GTK_NOTEBOOK (object); + + switch (arg_id) + { + case ARG_SHOW_TABS: + GTK_VALUE_BOOL (*arg) = notebook->show_tabs; + break; + case ARG_SHOW_BORDER: + GTK_VALUE_BOOL (*arg) = notebook->show_border; + break; + case ARG_SCROLLABLE: + GTK_VALUE_BOOL (*arg) = notebook->scrollable; + break; + case ARG_ENABLE_POPUP: + GTK_VALUE_BOOL (*arg) = notebook->menu != NULL; + break; + case ARG_PAGE: + GTK_VALUE_INT (*arg) = gtk_notebook_current_page (notebook); + break; + case ARG_TAB_POS: + GTK_VALUE_ENUM (*arg) = notebook->tab_pos; + break; + case ARG_TAB_BORDER: + GTK_VALUE_UINT (*arg) = notebook->tab_border; + break; + default: + arg->type = GTK_TYPE_INVALID; + break; + } +} + +static void +gtk_notebook_set_child_arg (GtkContainer *container, + GtkWidget *child, + GtkArg *arg, + guint arg_id) +{ + GtkNotebook *notebook; + GtkNotebookPage *page = NULL; + GList *list; + + notebook = GTK_NOTEBOOK (container); + + for (list = notebook->children; list; list = list->next) + { + page = list->data; + if (page->child == child) + break; + } + if (!list) + return; + + switch (arg_id) + { + case CHILD_ARG_TAB_LABEL: + /* a NULL pointer indicates a default_tab setting, otherwise + * we need to set the associated label + */ + if (GTK_VALUE_STRING (*arg)) + { + page->default_tab = FALSE; + if (page->tab_label) + gtk_widget_unparent (page->tab_label); + page->tab_label = gtk_label_new (GTK_VALUE_STRING (*arg)); + gtk_widget_set_parent (page->tab_label, GTK_WIDGET (notebook)); + if (notebook->show_tabs) + gtk_widget_show (page->tab_label); + } + else + { + page->default_tab = TRUE; + if (page->tab_label) + gtk_widget_unparent (page->tab_label); + if (!notebook->show_tabs) + page->tab_label = NULL; + else + { + gchar string[32]; + + sprintf (string, "Page %u", g_list_index (notebook->children, page) + 1); + page->tab_label = gtk_label_new (string); + gtk_widget_set_parent (page->tab_label, GTK_WIDGET (notebook)); + gtk_widget_show (page->tab_label); + } + } + break; + case CHILD_ARG_MENU_LABEL: + break; + case CHILD_ARG_POSITION: + break; + default: + break; + } +} + +static void +gtk_notebook_get_child_arg (GtkContainer *container, + GtkWidget *child, + GtkArg *arg, + guint arg_id) +{ + GtkNotebook *notebook; + GtkNotebookPage *page = NULL; + GList *list; + + notebook = GTK_NOTEBOOK (container); + + for (list = notebook->children; list; list = list->next) + { + page = list->data; + if (page->child == child) + break; + } + if (!list) + { + arg->type = GTK_TYPE_INVALID; + return; + } + + switch (arg_id) + { + case CHILD_ARG_TAB_LABEL: + if (page->default_tab) + GTK_VALUE_STRING (*arg) = NULL; + else + { + if (page->tab_label && GTK_IS_LABEL (page->tab_label)) + GTK_VALUE_STRING (*arg) = g_strdup (GTK_LABEL (page->tab_label)->label); + else + GTK_VALUE_STRING (*arg) = NULL; + } + break; + case CHILD_ARG_MENU_LABEL: + break; + case CHILD_ARG_POSITION: + break; + default: + arg->type = GTK_TYPE_INVALID; + break; + } +} + static GtkType gtk_notebook_child_type (GtkContainer *container) { @@ -439,15 +677,26 @@ gtk_notebook_insert_page_menu (GtkNotebook *notebook, void gtk_notebook_remove_page (GtkNotebook *notebook, - gint page_num) + gint page_num) { GList *list; g_return_if_fail (notebook != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - if ((list = g_list_nth (notebook->children, page_num))) - gtk_notebook_real_remove (notebook, list, page_num); + if (page_num >= 0) + { + list = g_list_nth (notebook->children, page_num); + if (list) + gtk_notebook_real_remove (notebook, list, page_num); + } + else + { + list = g_list_last (notebook->children); + if (list) + gtk_notebook_real_remove (notebook, list, + g_list_index (notebook->children, list->data)); + } } static void @@ -469,7 +718,7 @@ gtk_notebook_remove (GtkContainer *container, GtkNotebook *notebook; GtkNotebookPage *page; GList *children; - gint page_num; + guint page_num; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (container)); @@ -495,7 +744,7 @@ gtk_notebook_remove (GtkContainer *container, static void gtk_notebook_real_remove (GtkNotebook *notebook, GList *list, - gint page_num) + guint page_num) { GtkNotebookPage *page; GList * next_list; @@ -596,16 +845,26 @@ gtk_notebook_current_page (GtkNotebook *notebook) void gtk_notebook_set_page (GtkNotebook *notebook, - gint page_num) + gint page_num) { GList *list; - + g_return_if_fail (notebook != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - if ((list = g_list_nth (notebook->children, page_num))) - gtk_notebook_switch_page (notebook, - ((GtkNotebookPage *)(list->data)), page_num); + if (page_num >= 0) + { + list = g_list_nth (notebook->children, page_num); + if (list) + gtk_notebook_switch_page (notebook, list->data, page_num); + } + else + { + list = g_list_last (notebook->children); + if (list) + gtk_notebook_switch_page (notebook, list->data, + g_list_index (notebook->children, list->data)); + } } void @@ -1825,7 +2084,7 @@ gtk_notebook_draw_arrow (GtkNotebook *notebook, guint arrow) static void gtk_real_notebook_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, - gint page_num) + guint page_num) { g_return_if_fail (notebook != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); @@ -2633,7 +2892,7 @@ gtk_notebook_menu_switch_page (GtkWidget *widget, { GtkNotebook *notebook; GList *children; - gint page_num; + guint page_num; g_return_if_fail (widget != NULL); g_return_if_fail (page != NULL); @@ -2661,7 +2920,7 @@ gtk_notebook_menu_switch_page (GtkWidget *widget, static void gtk_notebook_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, - gint page_num) + guint page_num) { g_return_if_fail (notebook != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); @@ -2942,12 +3201,12 @@ gtk_notebook_key_press (GtkWidget *widget, void gtk_notebook_set_tab_border (GtkNotebook *notebook, - gint tab_border) + guint tab_border) { g_return_if_fail (notebook != NULL); g_return_if_fail (GTK_IS_NOTEBOOK (notebook)); - if (notebook->tab_border != tab_border && tab_border > 0) + if (notebook->tab_border != tab_border) { notebook->tab_border = tab_border; @@ -2959,7 +3218,7 @@ gtk_notebook_set_tab_border (GtkNotebook *notebook, static void gtk_notebook_update_labels (GtkNotebook *notebook, GList *list, - gint page_num) + guint page_num) { GtkNotebookPage *page; gchar string[32]; @@ -2968,7 +3227,7 @@ gtk_notebook_update_labels (GtkNotebook *notebook, { page = list->data; list = list->next; - sprintf (string, "Page %d", page_num); + sprintf (string, "Page %u", page_num); if (notebook->show_tabs && page->default_tab) gtk_label_set (GTK_LABEL (page->tab_label), string); if (notebook->menu && page->default_menu) |