1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #include "gtkradiomenuitem.h"
23 static void gtk_radio_menu_item_class_init (GtkRadioMenuItemClass *klass);
24 static void gtk_radio_menu_item_init (GtkRadioMenuItem *radio_menu_item);
25 static void gtk_radio_menu_item_activate (GtkMenuItem *menu_item);
26 static void gtk_radio_menu_item_draw_indicator (GtkCheckMenuItem *check_menu_item,
31 gtk_radio_menu_item_get_type ()
33 static guint radio_menu_item_type = 0;
35 if (!radio_menu_item_type)
37 GtkTypeInfo radio_menu_item_info =
40 sizeof (GtkRadioMenuItem),
41 sizeof (GtkRadioMenuItemClass),
42 (GtkClassInitFunc) gtk_radio_menu_item_class_init,
43 (GtkObjectInitFunc) gtk_radio_menu_item_init,
48 radio_menu_item_type = gtk_type_unique (gtk_check_menu_item_get_type (), &radio_menu_item_info);
51 return radio_menu_item_type;
55 gtk_radio_menu_item_new (GSList *group)
57 GtkRadioMenuItem *radio_menu_item;
58 GtkRadioMenuItem *tmp_menu_item;
61 radio_menu_item = gtk_type_new (gtk_radio_menu_item_get_type ());
64 radio_menu_item->group = g_slist_prepend (group, radio_menu_item);
70 tmp_menu_item = tmp_list->data;
71 tmp_list = tmp_list->next;
73 tmp_menu_item->group = radio_menu_item->group;
78 GTK_CHECK_MENU_ITEM (radio_menu_item)->active = TRUE;
81 return GTK_WIDGET (radio_menu_item);
85 gtk_radio_menu_item_new_with_label (GSList *group,
88 GtkWidget *radio_menu_item;
89 GtkWidget *label_widget;
91 radio_menu_item = gtk_radio_menu_item_new (group);
92 label_widget = gtk_label_new (label);
93 gtk_misc_set_alignment (GTK_MISC (label_widget), 0.0, 0.5);
95 gtk_container_add (GTK_CONTAINER (radio_menu_item), label_widget);
96 gtk_widget_show (label_widget);
98 return radio_menu_item;
102 gtk_radio_menu_item_group (GtkRadioMenuItem *radio_menu_item)
104 g_return_val_if_fail (radio_menu_item != NULL, NULL);
105 g_return_val_if_fail (GTK_IS_RADIO_MENU_ITEM (radio_menu_item), NULL);
107 return radio_menu_item->group;
112 gtk_radio_menu_item_class_init (GtkRadioMenuItemClass *klass)
114 GtkMenuItemClass *menu_item_class;
115 GtkCheckMenuItemClass *check_menu_item_class;
117 menu_item_class = (GtkMenuItemClass*) klass;
118 check_menu_item_class = (GtkCheckMenuItemClass*) klass;
120 menu_item_class->activate = gtk_radio_menu_item_activate;
122 check_menu_item_class->draw_indicator = gtk_radio_menu_item_draw_indicator;
126 gtk_radio_menu_item_init (GtkRadioMenuItem *radio_menu_item)
128 radio_menu_item->group = NULL;
132 gtk_radio_menu_item_activate (GtkMenuItem *menu_item)
134 GtkRadioMenuItem *radio_menu_item;
135 GtkCheckMenuItem *check_menu_item;
136 GtkCheckMenuItem *tmp_menu_item;
140 g_return_if_fail (menu_item != NULL);
141 g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (menu_item));
143 radio_menu_item = GTK_RADIO_MENU_ITEM (menu_item);
144 check_menu_item = GTK_CHECK_MENU_ITEM (menu_item);
147 if (check_menu_item->active)
149 tmp_menu_item = NULL;
150 tmp_list = radio_menu_item->group;
154 tmp_menu_item = tmp_list->data;
155 tmp_list = tmp_list->next;
157 if (tmp_menu_item->active && (tmp_menu_item != check_menu_item))
160 tmp_menu_item = NULL;
166 check_menu_item->active = !check_menu_item->active;
172 check_menu_item->active = !check_menu_item->active;
174 tmp_list = radio_menu_item->group;
177 tmp_menu_item = tmp_list->data;
178 tmp_list = tmp_list->next;
180 if (tmp_menu_item->active && (tmp_menu_item != check_menu_item))
182 gtk_menu_item_activate (GTK_MENU_ITEM (tmp_menu_item));
189 gtk_check_menu_item_toggled (check_menu_item);
190 gtk_widget_queue_draw (GTK_WIDGET (radio_menu_item));
194 gtk_radio_menu_item_draw_indicator (GtkCheckMenuItem *check_menu_item,
198 GtkStateType state_type;
199 GtkShadowType shadow_type;
204 g_return_if_fail (check_menu_item != NULL);
205 g_return_if_fail (GTK_IS_RADIO_MENU_ITEM (check_menu_item));
207 if (GTK_WIDGET_DRAWABLE (check_menu_item))
209 widget = GTK_WIDGET (check_menu_item);
213 x = (GTK_CONTAINER (check_menu_item)->border_width +
214 widget->style->klass->xthickness + 2);
215 y = (widget->allocation.height - height) / 2;
217 gdk_window_clear_area (widget->window, x, y, width, height);
219 if (check_menu_item->active ||
220 check_menu_item->always_show_toggle ||
221 (GTK_WIDGET_STATE (check_menu_item) == GTK_STATE_PRELIGHT))
223 state_type = GTK_WIDGET_STATE (widget);
224 if (check_menu_item->active ||
225 !check_menu_item->always_show_toggle)
226 shadow_type = GTK_SHADOW_IN;
228 shadow_type = GTK_SHADOW_OUT;
230 pts[0].x = x + width / 2;
232 pts[1].x = x + width;
233 pts[1].y = y + height / 2;
235 pts[2].y = y + height;
239 gdk_draw_polygon (widget->window,
240 widget->style->bg_gc[state_type],
242 gtk_draw_diamond (widget->style, widget->window,
243 state_type, shadow_type,
244 x, y, width, height);