comparison gtk/dw.c @ 478:ea099ba917c6

Added two new tree functions, get_title and get_parent and finished the OS/2 folder browser. Will be porting to Unix soon. Windows tree functions need to be completed. Will do that tomorrow.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 15 Oct 2003 09:55:28 +0000
parents d11be1f40f8c
children 61e2973ad093
comparison
equal deleted inserted replaced
477:923b46b0716c 478:ea099ba917c6
103 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data); 103 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
104 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 104 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
105 static gint _value_changed_event(GtkAdjustment *adjustment, gpointer user_data); 105 static gint _value_changed_event(GtkAdjustment *adjustment, gpointer user_data);
106 #if GTK_MAJOR_VERSION > 1 106 #if GTK_MAJOR_VERSION > 1
107 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data); 107 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data);
108 static gint _tree_expand_event(GtkTreeView *treeview, GtkTreeIter *arg1, GtkTreePath *arg2, gpointer data);
108 #else 109 #else
109 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data); 110 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data);
110 #endif 111 static gint _tree_expand_event(GtkTreeItem *treeitem, gpointer data);
111 static gint _switch_page_event(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data); 112 #endif
112 static gint _column_click_event(GtkWidget *widget, gint column_num, gpointer user_data); 113 static gint _switch_page_event(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data);
114 static gint _column_click_event(GtkWidget *widget, gint column_num, gpointer data);
113 115
114 typedef struct 116 typedef struct
115 { 117 {
116 GdkPixmap *pixmap; 118 GdkPixmap *pixmap;
117 GdkBitmap *mask; 119 GdkBitmap *mask;
140 gint cid; 142 gint cid;
141 void *intfunc; 143 void *intfunc;
142 144
143 } SignalHandler; 145 } SignalHandler;
144 146
145 #define SIGNALMAX 18 147 #define SIGNALMAX 19
146 148
147 /* A list of signal forwarders, to account for paramater differences. */ 149 /* A list of signal forwarders, to account for paramater differences. */
148 static SignalList SignalTranslate[SIGNALMAX] = { 150 static SignalList SignalTranslate[SIGNALMAX] = {
149 { _configure_event, DW_SIGNAL_CONFIGURE }, 151 { _configure_event, DW_SIGNAL_CONFIGURE },
150 { _key_press_event, DW_SIGNAL_KEY_PRESS }, 152 { _key_press_event, DW_SIGNAL_KEY_PRESS },
161 { _item_select_event, DW_SIGNAL_LIST_SELECT }, 163 { _item_select_event, DW_SIGNAL_LIST_SELECT },
162 { _tree_select_event, DW_SIGNAL_ITEM_SELECT }, 164 { _tree_select_event, DW_SIGNAL_ITEM_SELECT },
163 { _set_focus_event, DW_SIGNAL_SET_FOCUS }, 165 { _set_focus_event, DW_SIGNAL_SET_FOCUS },
164 { _value_changed_event, DW_SIGNAL_VALUE_CHANGED }, 166 { _value_changed_event, DW_SIGNAL_VALUE_CHANGED },
165 { _switch_page_event, DW_SIGNAL_SWITCH_PAGE }, 167 { _switch_page_event, DW_SIGNAL_SWITCH_PAGE },
166 { _column_click_event, DW_SIGNAL_COLUMN_CLICK } 168 { _column_click_event, DW_SIGNAL_COLUMN_CLICK },
169 { _tree_expand_event, DW_SIGNAL_TREE_EXPAND }
167 }; 170 };
168 171
169 /* Alignment flags */ 172 /* Alignment flags */
170 #define DW_CENTER 0.5f 173 #define DW_CENTER 0.5f
171 #define DW_LEFT 0.0f 174 #define DW_LEFT 0.0f
588 } 591 }
589 } 592 }
590 } 593 }
591 return retval; 594 return retval;
592 } 595 }
596
597 static gint _tree_expand_event(GtkTreeView *treeview, GtkTreeIter *arg1, GtkTreePath *arg2, gpointer user_data)
598 {
599 SignalHandler work = _get_signal_handler(widget, data);
600 int retval = FALSE;
601
602 if(work.window)
603 {
604 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func;
605 retval = treeexpandfunc(work.window, (HTREEITEM)arg1, work.data);
606 }
607 return retval;
608 }
593 #else 609 #else
594 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data) 610 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data)
595 { 611 {
596 SignalHandler work = _get_signal_handler((GtkWidget *)tree, data); 612 SignalHandler work = _get_signal_handler((GtkWidget *)tree, data);
597 GtkWidget *treeroot = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(child), "_dw_tree"); 613 GtkWidget *treeroot = (GtkWidget *)gtk_object_get_data(GTK_OBJECT(child), "_dw_tree");
609 { 625 {
610 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func; 626 int (*treeselectfunc)(HWND, HTREEITEM, char *, void *, void *) = work.func;
611 char *text = (char *)gtk_object_get_data(GTK_OBJECT(child), "_dw_text"); 627 char *text = (char *)gtk_object_get_data(GTK_OBJECT(child), "_dw_text");
612 void *itemdata = (void *)gtk_object_get_data(GTK_OBJECT(child), "_dw_itemdata"); 628 void *itemdata = (void *)gtk_object_get_data(GTK_OBJECT(child), "_dw_itemdata");
613 retval = treeselectfunc(work.window, (HTREEITEM)child, text, work.data, itemdata); 629 retval = treeselectfunc(work.window, (HTREEITEM)child, text, work.data, itemdata);
630 }
631 return retval;
632 }
633
634 static gint _tree_expand_event(GtkTreeItem *treeitem, gpointer data)
635 {
636 SignalHandler work = _get_signal_handler(widget, data);
637 int retval = FALSE;
638
639 if(work.window)
640 {
641 int (*treeexpandfunc)(HWND, HTREEITEM, void *) = work.func;
642 retval = treeexpandfunc(work.window, (HTREEITEM)treeitem, work.data);
614 } 643 }
615 return retval; 644 return retval;
616 } 645 }
617 #endif 646 #endif
618 647
2346 gtk_tree_view_column_add_attribute(col, rend, "pixbuf", 1); 2375 gtk_tree_view_column_add_attribute(col, rend, "pixbuf", 1);
2347 rend = gtk_cell_renderer_text_new(); 2376 rend = gtk_cell_renderer_text_new();
2348 gtk_tree_view_column_pack_start(col, rend, TRUE); 2377 gtk_tree_view_column_pack_start(col, rend, TRUE);
2349 gtk_tree_view_column_add_attribute(col, rend, "text", 0); 2378 gtk_tree_view_column_add_attribute(col, rend, "text", 0);
2350 2379
2380 gtk_tree_view_append_column(GTK_TREE_VIEW (tree), col);
2351 gtk_tree_view_append_column(GTK_TREE_VIEW (tree), col); 2381 gtk_tree_view_append_column(GTK_TREE_VIEW (tree), col);
2352 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(tree), col); 2382 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(tree), col);
2353 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE); 2383 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), FALSE);
2354 2384
2355 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)); 2385 sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
3901 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter)); 3931 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter));
3902 3932
3903 pixbuf = _find_pixbuf(icon); 3933 pixbuf = _find_pixbuf(icon);
3904 3934
3905 gtk_tree_store_insert_after(store, iter, (GtkTreeIter *)parent, (GtkTreeIter *)item); 3935 gtk_tree_store_insert_after(store, iter, (GtkTreeIter *)parent, (GtkTreeIter *)item);
3906 gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, -1); 3936 gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, 4, parent, -1);
3907 if(pixbuf && !(icon & (1 << 31))) 3937 if(pixbuf && !(icon & (1 << 31)))
3908 g_object_unref(pixbuf); 3938 g_object_unref(pixbuf);
3909 retval = (HTREEITEM)iter; 3939 retval = (HTREEITEM)iter;
3910 } 3940 }
3911 DW_MUTEX_UNLOCK; 3941 DW_MUTEX_UNLOCK;
3937 newitem = gtk_tree_item_new(); 3967 newitem = gtk_tree_item_new();
3938 label = gtk_label_new(title); 3968 label = gtk_label_new(title);
3939 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_text", (gpointer)strdup(title)); 3969 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_text", (gpointer)strdup(title));
3940 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_itemdata", (gpointer)itemdata); 3970 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_itemdata", (gpointer)itemdata);
3941 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_tree", (gpointer)tree); 3971 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_tree", (gpointer)tree);
3972 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_parent", (gpointer)parent);
3942 hbox = gtk_hbox_new(FALSE, 2); 3973 hbox = gtk_hbox_new(FALSE, 2);
3943 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_hbox", (gpointer)hbox); 3974 gtk_object_set_data(GTK_OBJECT(newitem), "_dw_hbox", (gpointer)hbox);
3944 gdkpix = _find_pixmap(&gdkbmp, icon, hbox, NULL, NULL); 3975 gdkpix = _find_pixmap(&gdkbmp, icon, hbox, NULL, NULL);
3945 gtk_container_add(GTK_CONTAINER(newitem), hbox); 3976 gtk_container_add(GTK_CONTAINER(newitem), hbox);
3946 if(gdkpix) 3977 if(gdkpix)
4037 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter)); 4068 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter));
4038 4069
4039 pixbuf = _find_pixbuf(icon); 4070 pixbuf = _find_pixbuf(icon);
4040 4071
4041 gtk_tree_store_append (store, iter, (GtkTreeIter *)parent); 4072 gtk_tree_store_append (store, iter, (GtkTreeIter *)parent);
4042 gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, -1); 4073 gtk_tree_store_set (store, iter, 0, title, 1, pixbuf, 2, itemdata, 3, iter, 4, NULL, -1);
4043 if(pixbuf && !(icon & (1 << 31))) 4074 if(pixbuf && !(icon & (1 << 31)))
4044 g_object_unref(pixbuf); 4075 g_object_unref(pixbuf);
4045 retval = (HTREEITEM)iter; 4076 retval = (HTREEITEM)iter;
4046 } 4077 }
4047 DW_MUTEX_UNLOCK; 4078 DW_MUTEX_UNLOCK;
4233 4264
4234 DW_MUTEX_LOCK; 4265 DW_MUTEX_LOCK;
4235 gtk_object_set_data(GTK_OBJECT(item), "_dw_itemdata", (gpointer)itemdata); 4266 gtk_object_set_data(GTK_OBJECT(item), "_dw_itemdata", (gpointer)itemdata);
4236 DW_MUTEX_UNLOCK; 4267 DW_MUTEX_UNLOCK;
4237 #endif 4268 #endif
4269 }
4270
4271 /*
4272 * Gets the text an item in a tree window (widget).
4273 * Parameters:
4274 * handle: Handle to the tree containing the item.
4275 * item: Handle of the item to be modified.
4276 */
4277 char * API dw_tree_get_title(HWND handle, HTREEITEM item)
4278 {
4279 int _locked_by_me = FALSE;
4280 char *text = NULL;
4281
4282 if(!handle || !item)
4283 return;
4284
4285 DW_MUTEX_LOCK;
4286 #if GTK_MAJOR_VERSION > 1
4287 GtkTreeIter iter = (GtkTreeIter)item;
4288 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_tree_store");
4289
4290 gtk_tree_model_get(store, &iter, 0, &text, -1);
4291 #else
4292 text = (char *)gtk_object_get_data(GTK_OBJECT(item), "_dw_text");
4293 #endif
4294 DW_MUTEX_UNLOCK;
4295 return text;
4296 }
4297
4298 /*
4299 * Gets the text an item in a tree window (widget).
4300 * Parameters:
4301 * handle: Handle to the tree containing the item.
4302 * item: Handle of the item to be modified.
4303 */
4304 HTREEITEM API dw_tree_get_parent(HWND handle, HTREEITEM item)
4305 {
4306 int _locked_by_me = FALSE;
4307 HTREEITEM parent = (HTREEITEM)0;
4308
4309 if(!handle || !item)
4310 return;
4311
4312 DW_MUTEX_LOCK;
4313 #if GTK_MAJOR_VERSION > 1
4314 GtkTreeIter iter = (GtkTreeIter)item;
4315 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_tree_store");
4316
4317 gtk_tree_model_get(store, &iter, 4, &parent, -1);
4318 #else
4319 parent = (HTREEITEM)gtk_object_get_data(GTK_OBJECT(item), "_dw_parent");
4320 #endif
4321 DW_MUTEX_UNLOCK;
4322 return parent;
4238 } 4323 }
4239 4324
4240 /* 4325 /*
4241 * Gets the item data of a tree item. 4326 * Gets the item data of a tree item.
4242 * Parameters: 4327 * Parameters:
7990 cid = g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc, (gpointer)sigid); 8075 cid = g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc, (gpointer)sigid);
7991 _set_signal_handler_id(treeview, sigid, cid); 8076 _set_signal_handler_id(treeview, sigid, cid);
7992 DW_MUTEX_UNLOCK; 8077 DW_MUTEX_UNLOCK;
7993 return; 8078 return;
7994 } 8079 }
8080 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_TREE_EXPAND) == 0)
8081 {
8082 thisname = "row-expanded";
8083 }
7995 #else 8084 #else
7996 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0) 8085 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0)
7997 { 8086 {
7998 thisfunc = _findsigfunc("tree-context"); 8087 thisfunc = _findsigfunc("tree-context");
7999 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc); 8088 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc);