���� ���� ����

10. ����Ʈ widget

GtkList widget�� GtkListItem���� widget�� ���� ������ �����̳�ó�� �۵��ϵ��� ����Ǿ���.

�ϳ��� GtkList widget�� �̺�Ʈ�� ���� �ڽŸ��� ������, ���� white�� �ڽŸ��� background ���� ������ �ִ�. GtkContainer�κ��� �Ļ��Ǿ��⿡ GTK_CONTAINER(List) ��ũ�θ� �̿��� �ٷ� �� �ִµ�, �̰Ϳ� ���ؼ��� GtkContainer widget�� ���� �κ��� �����ϱ� �ٶ���.

GtkList widget�� ����ü ���ǿ��� �ξ� �� ��̷ο� �ϳ��� �ʵ尡 �ִ�. �ٷ� �̰��̴�.

struct _GtkList
{
  ...
  GList *selection;
  guint selection_mode;
  ...
};

GtkList�� selection �ʵ�� ���� ���õ� ��� �����۵��� ���Ḯ��Ʈ�� ����Ű�� �ְ�, ���� ���õ� �� ���ٸ� 'NULL'�̴�. �׷��� �츮�� ������ ���õ� ���� �˱����� GTK_LIST()->selection �ʵ带 ����������, �� ������ �ʵ���� gtk_list*() �Լ���ν� �����ǰ� �����Ƿ� �װ��� �����ؼ��� �ȵȴ�. GtkList�� selection_mode�� GtkList �� GTK_LIST()->selection �ʵ��� �͵鿡 ���� ���� �Ӽ��� �����Ѵ�.

selection_mode�� �̰͵� �� �ϳ��� �� ���̴�.

����Ʈ�� GTK_SELECTION_MULTIPLE�̴�.

10.1 �ñ׳�

void GtkList::selection_changed (GtkList *LIST)

�� �ñ׳��� GtkList�� selection �ʵ尡 ��ȭ���� ������ ��û�ȴ�. �̰��� GtkList�� child�� ���õǰų� ������ �����Ǿ��� �� �߻��Ѵ�.

void GtkList::select_child (GtkList *LIST, GtkWidget *CHILD)

�� �ñ׳��� GtkList�� child�� ���õǷ��� �� �� �߻��Ѵ�. �̰��� �ַ� gtk_list_select_item()�� gtk_list_select_child()�� ȣ���� ��, ��ư�� ������ �� � �߻��ϸ�, ������ child���� GtkList�� �������ų� �����Ǿ��� �� �ٸ� ���ε鿡 ���� ���������� �߻��ϱ⵵ �Ѵ�.

void GtkList::unselect_child (GtkList *LIST, GtkWidget *CHILD)

�̰��� GtkList�� child�� ���� ������ �� ��û�ȴ�. �̰��� �ַ� gtk_list_ unselect_item()�̳� gtk_list_unselect_child()�Լ��� �θ� ���� ��ư�� ������ �� �߻��ϸ�, ���� GtkList�� child���� �������ų� ������ �� �Ǵٸ� ���ο� ���� ���������� �߻��Ѵ�.

10.2 �Լ�

guint gtk_list_get_type (void)

�̰��� GtkList���� �ĺ��ڸ� �����Ѵ�.

GtkWidget* gtk_list_new (void)

�̰��� ���ο� GtkList object�� �����. �� �� widget �� GtkWidget object�� ���� �������� ���·� ���ϵȴ�. �������� ��쿣 'NULL'�� �����Ѵ�.

void gtk_list_insert_items (GtkList *LIST, GList *ITEMS, gint POSITION)

POSITION���� �����ؼ�, ����Ʈ �������� LIST�� �����Ѵ�. ITEMS�� �� ����� ������ �����Ͱ� ���Ӱ� ������� GtkListItem�� ����Ű���� �Ǿ��ִ�, ������ ���Ḯ��Ʈ��. ITEMS�� GList������ LIST�� ���� ��������.

void gtk_list_append_items (GtkList *LIST, GList *ITEMS)

LIST�� �������� gtk_list_insert_items() ó�� ����Ʈ �������� �����Ѵ�. ITEMS�� GList ������ LIST�� ���� ��������.

void gtk_list_prepend_items (GtkList *LIST, GList *ITEMS)

LIST�� �� ù�κп� gtk_list_insert_items() ó�� ����Ʈ �������� �����Ѵ�. ���� ITEMS�� GList ������ LIST�� ���� ��������.

void gtk_list_remove_items (GtkList *LIST, GList *ITEMS)

LIST�κ��� ����Ʈ �������� �����Ѵ�. ITEMS�� �� ����� ����Ÿ �����Ͱ� LIST�� ���� child�� ����Ű���� �Ǿ� �ִ� ���� ���Ḯ��Ʈ��. ����ؼ� g_list_free(ITEMS)�� �θ��� ���� ȣ���ϴ� ����� å���̴�. ���� ȣ���ڴ� ����Ʈ ������ �� ��ü�� �ı��� �־�� �Ѵ�.

void gtk_list_clear_items (GtkList *LIST, gint START, gint END)

LIST�κ��� ����Ʈ �������� �����ϰ� �ı����ش�. LIST������ ���� ��ġ�� START���� END ���̷� ������ ������ �ִ� widget�� ������ ���� ���̴�.

void gtk_list_select_item (GtkList *LIST, gint ITEM)

LIST������ ���� ��ġ�� ���� ������ ����Ʈ �������� ���� GtkList::select_ child �ñ׳��� ��û�Ѵ�.

void gtk_list_unselect_item (GtkList *LIST, gint ITEM)

���� �������� ��쿡 GtkList::unselect_child �ñ׳��� ��û�Ѵ�.

void gtk_list_select_child (GtkList *LIST, GtkWidget *CHILD)

�־��� CHILD�� ���� GtkList::select_child �ñ׳��� ��û�Ѵ�.

void gtk_list_unselect_child (GtkList *LIST, GtkWidget *CHILD)

�־��� CHILD�� ���� GtkList::unselect_child �ñ׳��� ��û�Ѵ�.

gint gtk_list_child_position (GtkList *LIST, GtkWidget *CHILD)

LIST������ CHILD�� ��ġ�� �����Ѵ�. '-1'�� �������� ���� ���ϰ��̴�.

void gtk_list_set_selection_mode (GtkList *LIST, GtkSelectionMode MODE)

���� ��� MODE�� LIST�� �����Ѵ�. ���� GTK_SELECTION_SINGLE, GTK_ SELECTION_BROWSE, GTK_SELECTION_MULTIPLE, GTK_SELECTION_EXTENDED �߿��� �ϳ��� �ȴ�.

GtkList* GTK_LIST (gpointer OBJ)

��κ� �����͸� GtkList* ������ ij��Ʈ�Ѵ�. �� �ڼ��� �˷��� �Ϲ����� ��ũ�θ� �����϶�.

GtkListClass* GTK_LIST_CLASS (gpointer CLASS)

��κ��� �����͸� GtkListClass* ������ ij��Ʈ�Ѵ�. �Ϲ����� ��ũ�θ� �����϶�.

gint GTK_IS_LIST (gpointer OBJ)

� ��κ��� �����Ͱ� GtkList object�� �����ϴ��� �����Ѵ�. �ڼ��� �˷��� �Ϲ����� ��ũ�θ� �����϶�.

10.3 ����

�̹� ������ GtkList�� ������ ��ȭ��Ű�� ���� ������ ���̴�. �׸��� ����Ʈ �����۵��� ���콺 ������ ��ư���� ���������ν� �׵��� ��Ƶ� �� �ְ� �� ���̴�.

/* �� ���α׷��� �������Ϸ��� �̷��� �Ѵ�.
 * $ gcc -I/usr/local/include/ -lgtk -lgdk -lglib -lX11 -lm -Wall main.c
 */

/* GTK+�� ����� include�Ѵ�.
 * printf()�Լ� ������ <stdio.h>�� include�Ѵ�.
 */
#include        <gtk/gtk.h>
#include        <stdio.h>

/* �̰��� ����Ʈ �����ۿ� �����͸� �����ϱ� ���� ������ �ĺ��ڴ�. */
const   gchar   *list_item_data_key="list_item_data";

/* �츮�� GtkList widget�� �����ų �ñ׳� �ڵ鷯���� �Լ�����. */
static  void    sigh_print_selection    (GtkWidget      *gtklist,
                                         gpointer       func_data);
static  void    sigh_button_event       (GtkWidget      *gtklist,
                                         GdkEventButton *event,
                                         GtkWidget      *frame);

/* ����� �������̽��� �����ϴ� main �Լ� */

gint main (int argc, gchar *argv[])
{
                GtkWidget       *separator;
                GtkWidget       *window;
                GtkWidget       *vbox;
                GtkWidget       *scrolled_window;
                GtkWidget       *frame;
                GtkWidget       *gtklist;
                GtkWidget       *button;
                GtkWidget       *list_item;
                GList           *dlist;
                guint           i;
                gchar           buffer[64];

                /* gtk+(�׸��� ��������� gdk��)�� �ʱ�ȭ�Ѵ�. */

                gtk_init(&argc, &argv);

                /* ��� widget�� �־�� ������ �����.
                 * ���� �Ŵ����� close-window-event�� �ٷ�� ���� gtk_main_quit()
                 * �Լ��� ������ "destroy" �̺�Ʈ�� �����Ų��. */
                window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
                gtk_window_set_title(GTK_WINDOW(window), "GtkList Example");
                gtk_signal_connect(GTK_OBJECT(window),
                                                                                         "destroy",
                                                                                         GTK_SIGNAL_FUNC(gtk_main_quit),
                                                                                         NULL);

                /* ���� ���ο� widget���� �������� ������ �ڽ��� �־�� �Ѵ�. */
                vbox=gtk_vbox_new(FALSE, 5);
                gtk_container_border_width(GTK_CONTAINER(vbox), 5);
                gtk_container_add(GTK_CONTAINER(window), vbox);
                gtk_widget_show(vbox);
                /* GtkList widget�� �־�ΰ��� �ϴ� ��ũ�ѵ� ������. */
                scrolled_window=gtk_scrolled_window_new(NULL, NULL);
                gtk_widget_set_usize(scrolled_window, 250, 150);
                gtk_container_add(GTK_CONTAINER(vbox), scrolled_window);
                gtk_widget_show(scrolled_window);

                /* GtkList widget�� �����.  selection�� ���� ������ �� ���õ�
                 * �������� ����Ʈ�� �����ֱ� ���� sigh_print_selection()
                 * �ñ׳� �ڵ鷯 �Լ��� GtkList�� "selection_changed" �ñ׳ο�
                 * ������� �д�. */
                gtklist=gtk_list_new();
                gtk_container_add(GTK_CONTAINER(scrolled_window), gtklist);
                gtk_widget_show(gtklist);
                gtk_signal_connect(GTK_OBJECT(gtklist),
                                                                                         "selection_changed",
                                                                                         GTK_SIGNAL_FUNC(sigh_print_selection),
                                                                                         NULL);

                /* ����Ʈ �������� ���ξ� �� "Prison"�� �����. ;) */
                frame=gtk_frame_new("Prison");
                gtk_widget_set_usize(frame, 200, 50);
                gtk_container_border_width(GTK_CONTAINER(frame), 5);
                gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
                gtk_container_add(GTK_CONTAINER(vbox), frame);
                gtk_widget_show(frame);

                /* ����Ʈ �������� "arresting"�� �ٷ� GtkList�� sigh_button_event()
                 * �ñ׳� �ڵ鷯�� �����Ų��. */
                gtk_signal_connect(GTK_OBJECT(gtklist),
                                                                                         "button_release_event",
                                                                                         GTK_SIGNAL_FUNC(sigh_button_event),
                                                                                         frame);

                /* Separator�� �����. */
                separator=gtk_hseparator_new();
                gtk_container_add(GTK_CONTAINER(vbox), separator);
                gtk_widget_show(separator);

                /* ������ ��ư�� ����� �װ��� "clicked" �ñ׳��� ������ �ı���
                 * �����Ų��. */
                button=gtk_button_new_with_label("Close");
                gtk_container_add(GTK_CONTAINER(vbox), button);
                gtk_widget_show(button);
                gtk_signal_connect_object(GTK_OBJECT(button),
                                  "clicked",
                                  GTK_SIGNAL_FUNC(gtk_widget_destroy),
                                  GTK_OBJECT(window));

                /* ���� ���� ���� ������ �ִ� 5���� ����Ʈ �������� �����,
                 * gtk_container_add()�ν� �׵��� GtkList�� ÷���Ѵ�.
                 * ���� ���� �ؽ�Ʈ ���ڿ��� �����ϰ� �װ��� �� ����Ʈ ��������
                 * list_item_data_key�� ���ս�Ų��. */
                for (i=0; i<5; i++) {
                                GtkWidget       *label;
                                gchar           *string;

                                sprintf(buffer, "ListItemContainer with Label #%d", i);
                                label=gtk_label_new(buffer);
                                list_item=gtk_list_item_new();
                                gtk_container_add(GTK_CONTAINER(list_item), label);
                                gtk_widget_show(label);
                                gtk_container_add(GTK_CONTAINER(gtklist), list_item);
                                gtk_widget_show(list_item);
                                gtk_label_get(GTK_LABEL(label), &string);
                                gtk_object_set_data(GTK_OBJECT(list_item),
                                    list_item_data_key,
                                    string);
                }
                /* ���⼭��, gtk_list_item_new_with_label()�� �̿��ؼ�
                 * �ٸ� 5���� ���� �����.
                 * �̹����� �󺧵鿡 ���� �����Ͱ� �����Ƿ� ���� �ؽ�Ʈ
                 * ���ڿ��� ������ �� ����, �׷��Ƿ� �� ����Ʈ ��������
                 * list_item_data_key�� �Ȱ��� �ؽ�Ʈ ���ڿ��� �����Ѵ�.
                 * ����Ʈ �������� �߰��ϱ� ���ؼ� �츮�� �׵��� ���� ����
                 * ����Ʈ(GList)�� �о�ְ�, gtk_list_append_items()�� 
                 * ȣ�����ش�.  �츮�� �����۵��� ���� ���� ����Ʈ�� �о�ֱ�
                 * ���� g_list_prepend()�� ����ϱ� ������, �׵��� ������
                 * �ڷ� �̾�����(descending) ���� �ȴ�.  �ݴ�� g_list_append()
                 * �� �̿��ߴٸ� �տ��� �ٿ�����(ascending)�� �� ���̴�. */
                dlist=NULL;
                for (; i<10; i++) {
                                sprintf(buffer, "List Item with Label %d", i);
                                list_item=gtk_list_item_new_with_label(buffer);
                                dlist=g_list_prepend(dlist, list_item);
                                gtk_widget_show(list_item);
                                gtk_object_set_data(GTK_OBJECT(list_item),
                                    list_item_data_key,
                                    "ListItem with integrated Label");
                }
                gtk_list_append_items(GTK_LIST(gtklist), dlist);

                /* ������ �츮�� ������ ���� �;� �Ѵ�, �ƴѰ�? ;) */
                gtk_widget_show(window);

                /* GTK�� main �̺�Ʈ ������ �õ��Ѵ�. */
                gtk_main();

                /* gtk_main_quit()�� ȣ��Ǹ� ����� ����� �´�. */
                return 0;
}

/* GtkList�� ��ư press/release �̺�Ʈ��� ����� �ñ׳�
 * �ڵ鷯 �Լ����̴�. */
void
sigh_button_event       (GtkWidget      *gtklist,
                         GdkEventButton *event,
                         GtkWidget      *frame)
{
                /* ����°, �� ���� �����ʿ� �ִ� ���콺 ��ư�� �������� ����
                 * � ���� �ϵ��� �Ѵ�. */
                if (event->type==GDK_BUTTON_RELEASE &&
                                event->button==3) {
                                GList           *dlist, *free_list;
                                GtkWidget       *new_prisoner;

                                /* ���� ���õ� �������� �����ͼ� �츮�� ���� prisoner��
                                 * �Ѵ�. */
                                dlist=GTK_LIST(gtklist)->selection;
                                if (dlist)
                                                                new_prisoner=GTK_WIDGET(dlist->data);
                                else
                                                                new_prisoner=NULL;

                                /* �̹� ������� ����Ʈ �������� �����ϰ�, �׵���
                                 * �ٽ� ����Ʈ�� �����ش�.
                                 * gtk_container_children()�� �����ϴ� ���� ���� ����Ʈ��
                                 * �� ����(free)����� ���� ����϶�. */
                                dlist=gtk_container_children(GTK_CONTAINER(frame));
                                free_list=dlist;
                                while (dlist) {
                                                GtkWidget       *list_item;

                                                list_item=dlist->data;

                                                gtk_widget_reparent(list_item, gtklist);

                                                dlist=dlist->next;
                                }
                                g_list_free(free_list);

                                /* ���� prisoner�� ������ �Ǹ�, GtkList�κ��� �װ���
                                 * �����ϰ� "Prison" ���������� �о�ִ´�.
                                 * �������� ���� unselect�Ǿ�� �Ѵ�. */
                                if (new_prisoner) {
                                                GList   static_dlist;

                                                static_dlist.data=new_prisoner;
                                                static_dlist.next=NULL;
                                                static_dlist.prev=NULL;

                                                gtk_list_unselect_child(GTK_LIST(gtklist),
                                                new_prisoner);
                                                gtk_widget_reparent(new_prisoner, frame);
                                }
                }
}

/* �̰��� GtkList�� "selection_changed" �ñ׳��� �߻���Ű��
 * ȣ��Ǵ� �ñ׳� �ڵ鷯��. */
void
sigh_print_selection    (GtkWidget      *gtklist,
                                         gpointer       func_data)
{
                GList   *dlist;

                /* GtkList�� ���õ� �������� ���� ���� ����Ʈ�� �����´�.
                 * �̰��� read-only�� �ٷ�� ���� ���� ����! */
                dlist=GTK_LIST(gtklist)->selection;

                /* ���õ� �������� ���� ���� �ƹ� �۾��� �� �� ���� �װ�
                 * ����ڿ��� �˷��ش�. */
                if (!dlist) {
                                g_print("Selection cleared\n");
                                return;
                }
                /* ������ �����߰� �װ��� ����Ʈ�Ѵ�. */
                g_print("The selection is a ");

                /* ���� ���� ����Ʈ���� ����Ʈ �������� ���ϰ�
                 * list_item_data_key�� ���õ� �����͸� �����Ѵ�.
                 * �׸��� ���� �װ� ����Ʈ�Ѵ�. */
                while (dlist) {
                                GtkObject       *list_item;
                                gchar           *item_data_string;

                                list_item=GTK_OBJECT(dlist->data);
                                item_data_string=gtk_object_get_data(list_item,
                                                                                                         list_item_data_key);
                                g_print("%s ", item_data_string);

                                dlist=dlist->next;
                }
                g_print("\n");
}

10.4 ����Ʈ ������ widget

GtkListItem widget�� �ϳ��� child�� �־�� �� �ִ� �����̳�ó�� �۵��ϵ��� ����Ǿ�����, GtkList widget�� ���� child���� ���� �׷��ϵ��� �̰� ���� selection/deselection �Լ����� �����ϰ� �ִ�.

GtkListItem�� �̺�Ʈ�� �ޱ� ���ؼ� �ڽŸ��� ������ ������ �ְ�, ���� ���� white�� �ڽŸ��� background ���� ������ �ִ�.

�̰��� GtkItem���κ��� ���������� �Ļ��Ǿ��� ������ ���� GTK_ITEM( ListItem) ��ũ�η� �ٷ���� �� ������, �ڼ��� ���� GtkItem widget�� �����ϸ� �� ���̴�. �밳 GtkListItem�� �ĺ��DZ� ���� ���� ������ �ִ�, ���� ��� GtkList�� �ִ� filenameó��. ���� convenient �Լ� gtk_list_item_new_with _label()�� �����ȴ�. ���� ȿ���� �ڽŸ��� GtkLabel�� �������ν� ���� �� �ִ�. GtkListItem�� ���̾����� �����̳ʿ� �Բ� xalign=0, yalign=0.5�� �����ϸ� �ȴ�.

GtkListItem�� �� GtkLabel�� ���� �ִ� ���� �ƴϸ�, �츮�� GtkVBox �Ǵ� GtkArrow ���� ������ ���� �ִ�.

10.5 �ñ׳�

GtkListItem�� �ڽŸ��� �ñ׳��� ���� �������� �ʰ�, GtkItem�� �ñ׳��� ��ӹ޴´�. �ڼ��� ���� GtkItem�� ���ؼ� �����϶�.

10.6 �Լ�

guint gtk_list_item_get_type (void)

GtkListItem���� �ĺ��ڸ� �����Ѵ�.

GtkWidget* gtk_list_item_new (void)

���ο� GtkListItem object�� �����. �� ���ο� widget�� GtkWidget object �� ���� �����ͷμ� ���ϵȴ�. 'NULL'�� �������� ����� ���ϰ��̴�.

GtkWidget* gtk_list_item_new_with_label (gchar *LABEL)

�ϳ����� child�� �ϳ��� GtkLabel�� ������ GtkListItem object�� �����. �� ���ο� widget�� GtkWidget object�� ���� �����ͷμ� ���ϵȴ�. 'NULL'�� �������� ���� ���ϰ��̴�.

void gtk_list_item_select (GtkListItem *LIST_ITEM)

�̰��� �ٺ�������, GtkItem::select �ñ׳��� �߻��� gtk_item_select�� ȣ���ϴ� �� �־�� wrapper��(GTK_ITEM(list_item)). �ڼ��� ���� GtkItem�� �����϶�.

void gtk_list_item_deselect (GtkListItem *LIST_ITEM)

�̰��� GtkItem::deselect �ñ׳��� �߻��� gtk_item_deselect�� ȣ���ϴ� �� �־�� wrapper��(GTK_ITEM(list_item)). ���� �ڼ��� ���� GtkItem�� ���� �϶�.

GtkListItem* GTK_LIST_ITEM (gpointer OBJ)

��κ��� �����͸� GtkListItem*���� ij��Ʈ�Ѵ�. �ڼ��� ���� �Ϲ����� ��ũ�θ� �����϶�.

GtkListItemClass* GTK_LIST_ITEM_CLASS (gpointer CLASS)

��κ��� �����͸� GtkListItemClass*�� ij��Ʈ�Ѵ�. ���� �Ϲ����� ��ũ�ο� ���� �κ��� �����϶�.

gint GTK_IS_LIST_ITEM (gpointer OBJ)

� �����Ͱ� GtkListItem object�� �����ϰ� �ִ����� �����Ѵ�. �ڼ��� ���� �Ϲ����� ��ũ�ο� ���ؼ� �����϶�.

10.7 ����

GtkList�� ���� ������ �����϶�. �װ��� GtkListItem�� �̿���� ���ؼ��� �� �ٷ�� �ִ�.


���� ���� ����