Mercurial > dwindows
changeset 482:89b1b40d7e12
Initial port of the OS/2 folder browser to unix. dw_tree_get_parent()
seems to be broken in GTK 2.x at the moment... will see what the problem
is.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Wed, 15 Oct 2003 21:31:14 +0000 |
parents | 97c2c560f829 |
children | 1cb1b87bbd30 |
files | gtk/dw.c |
diffstat | 1 files changed, 208 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/gtk/dw.c Wed Oct 15 18:24:31 2003 +0000 +++ b/gtk/dw.c Wed Oct 15 21:31:14 2003 +0000 @@ -16,6 +16,8 @@ #include <unistd.h> #include <errno.h> #include <sys/time.h> +#include <dirent.h> +#include <sys/stat.h> #include "config.h" #include <gdk/gdkkeysyms.h> #ifdef USE_IMLIB @@ -4283,9 +4285,12 @@ DW_MUTEX_LOCK; #if GTK_MAJOR_VERSION > 1 - GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_tree_store"); - - gtk_tree_model_get(store, (GtkTreeIter *)item, 0, &text, -1); + GtkWidget *tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle)); + GtkTreeModel *store; + + if(tree && GTK_IS_TREE_VIEW(tree) && + (store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store"))) + gtk_tree_model_get(store, (GtkTreeIter *)item, 0, &text, -1); #else text = (char *)gtk_object_get_data(GTK_OBJECT(item), "_dw_text"); #endif @@ -4309,9 +4314,14 @@ DW_MUTEX_LOCK; #if GTK_MAJOR_VERSION > 1 - GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_tree_store"); - - gtk_tree_model_get(store, (GtkTreeIter *)item, 4, &parent, -1); + GtkWidget *tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle)); + GtkTreeModel *store; + + if(tree && GTK_IS_TREE_VIEW(tree) && + (store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store"))) + { + gtk_tree_model_get(store, (GtkTreeIter *)item, 4, &parent, -1); + } #else parent = (HTREEITEM)gtk_object_get_data(GTK_OBJECT(item), "_dw_parent"); #endif @@ -6034,7 +6044,7 @@ if(*handle == NULL) { strncpy(errorbuf, dlerror(), 1024); - printf("%s\n", errorbuf); + printf("%s\n", errorbuf); sprintf(newname, "lib%s.so", name); *handle = dlopen(newname, RTLD_NOW); } @@ -7740,6 +7750,129 @@ return FALSE; } +/* The next few functions are support functions for the UNIX folder browser */ +static void _populate_directory(HWND tree, HTREEITEM parent, char *path) +{ + struct dirent *dent; + HTREEITEM item; + DIR *hdir; + + if((hdir = opendir(path))) + { + while((dent = readdir(hdir))) + { + struct stat bleah; + + stat(dent->d_name, &bleah); + + if(S_ISDIR(bleah.st_mode) && strcmp(dent->d_name, ".") && strcmp(dent->d_name, "..")) + { + int len = strlen(path); + char *folder = malloc(len + strlen(dent->d_name) + 2); + HTREEITEM tempitem; + + strcpy(folder, path); + strcpy(&folder[len-1], dent->d_name); + + item = dw_tree_insert(tree, dent->d_name, 0, parent, (void *)parent); + tempitem = dw_tree_insert(tree, "", 0, item, 0); + dw_tree_set_data(tree, item, (void *)tempitem); + + strcat(folder, "/"); + + free(folder); + } + } + closedir(hdir); + } +} + +static int DWSIGNAL _dw_folder_ok_func(HWND window, void *data) +{ + DWDialog *dwwait = (DWDialog *)data; + void *treedata; + + if(!dwwait) + return FALSE; + + treedata = dw_window_get_data((HWND)dwwait->data, "_dw_tree_selected"); + dw_window_destroy((HWND)dwwait->data); + dw_dialog_dismiss(dwwait, treedata); + return FALSE; +} + +static int DWSIGNAL _dw_folder_cancel_func(HWND window, void *data) +{ + DWDialog *dwwait = (DWDialog *)data; + + if(!dwwait) + return FALSE; + + dw_window_destroy((HWND)dwwait->data); + dw_dialog_dismiss(dwwait, NULL); + return FALSE; +} + +static char *_tree_folder(HWND tree, HTREEITEM item) +{ + char *folder=strdup(""); + HTREEITEM parent = item; + + while(parent) + { + char *temp, *text = dw_tree_get_title(tree, parent); + + if(text) + { + temp = malloc(strlen(text) + strlen(folder) + 3); + strcpy(temp, text); + if(strcmp(text, "/")) + strcat(temp, "/"); + strcat(temp, folder); + free(folder); + folder = temp; + } + parent = dw_tree_get_parent(tree, parent); + } + return folder; +} + +static int DWSIGNAL _item_select(HWND window, HTREEITEM item, char *text, void *data, void *itemdata) +{ + DWDialog *dwwait = (DWDialog *)data; + char *treedata = (char *)dw_window_get_data((HWND)dwwait->data, "_dw_tree_selected"); + + text = text; itemdata = itemdata; + if(treedata) + free(treedata); + + treedata = _tree_folder(window, item); + dw_window_set_data((HWND)dwwait->data, "_dw_tree_selected", (void *)treedata); + + return FALSE; +} + +static int DWSIGNAL _tree_expand(HWND window, HTREEITEM item, void *data) +{ + DWDialog *dwwait = (DWDialog *)data; + HWND tree = (HWND)dw_window_get_data((HWND)dwwait->data, "_dw_tree"); + HTREEITEM tempitem = (HTREEITEM)dw_tree_get_data(tree, item); + + if(tempitem) + { + char *folder = _tree_folder(tree, item); + + dw_tree_set_data(tree, item, 0); + dw_tree_delete(tree, tempitem); + + if(*folder) + _populate_directory(tree, item, folder); + free(folder); + } + + return FALSE; +} + /* * Opens a file dialog and queries user selection. * Parameters: @@ -7758,33 +7891,75 @@ int _locked_by_me = FALSE; DWDialog *dwwait; - DW_MUTEX_LOCK; - - /* The DW mutex should be sufficient for - * insuring no thread changes this unknowingly. - */ - if(_dw_file_active) - { + if(flags == DW_DIRECTORY_OPEN) + { + HWND window, hbox, vbox, tree, button; + HTREEITEM item, tempitem; + + window = dw_window_new( HWND_DESKTOP, title, DW_FCF_SHELLPOSITION | DW_FCF_TITLEBAR | DW_FCF_SIZEBORDER | DW_FCF_MINMAX); + + vbox = dw_box_new(DW_VERT, 5); + + dw_box_pack_start(window, vbox, 0, 0, TRUE, TRUE, 0); + + tree = dw_tree_new(60); + + dw_box_pack_start(vbox, tree, 1, 1, TRUE, TRUE, 0); + dw_window_set_data(window, "_dw_tree", (void *)tree); + + hbox = dw_box_new(DW_HORZ, 0); + + dw_box_pack_start(vbox, hbox, 0, 0, TRUE, FALSE, 0); + + dwwait = dw_dialog_new((void *)window); + + dw_signal_connect(tree, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_item_select), (void *)dwwait); + dw_signal_connect(tree, DW_SIGNAL_TREE_EXPAND, DW_SIGNAL_FUNC(_tree_expand), (void *)dwwait); + + button = dw_button_new("Ok", 1001L); + dw_box_pack_start(hbox, button, 50, 30, TRUE, FALSE, 3); + dw_signal_connect(button, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_dw_folder_ok_func), (void *)dwwait); + + button = dw_button_new("Cancel", 1002L); + dw_box_pack_start(hbox, button, 50, 30, TRUE, FALSE, 3); + dw_signal_connect(button, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_dw_folder_cancel_func), (void *)dwwait); + + item = dw_tree_insert(tree, "/", 0, NULL, 0); + tempitem = dw_tree_insert(tree, "", 0, item, 0); + dw_tree_set_data(tree, item, (void *)tempitem); + + dw_window_set_usize(window, 225, 300); + dw_window_show(window); + } + else + { + DW_MUTEX_LOCK; + + /* The DW mutex should be sufficient for + * insuring no thread changes this unknowingly. + */ + if(_dw_file_active) + { + DW_MUTEX_UNLOCK; + return NULL; + } + + _dw_file_active = 1; + + filew = gtk_file_selection_new(title); + + dwwait = dw_dialog_new((void *)filew); + + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) _gtk_file_ok, dwwait); + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) _gtk_file_cancel, dwwait); + + if(defpath) + gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), defpath); + + gtk_widget_show(filew); + DW_MUTEX_UNLOCK; - return NULL; - } - - _dw_file_active = 1; - - filew = gtk_file_selection_new(title); - - dwwait = dw_dialog_new((void *)filew); - - gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) _gtk_file_ok, dwwait); - gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) _gtk_file_cancel, dwwait); - - if(defpath) - gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), defpath); - - gtk_widget_show(filew); - - DW_MUTEX_UNLOCK; - + } return (char *)dw_dialog_wait(dwwait); }