Mercurial > dwindows
diff gtk/dw.c @ 22:6a246b3bb14f
Added tree widgets, fixed some delete event processing, fixed a layout bug
on OS/2 and Win32. Added another function to compat to deal with MSVC
runtime library conflicts.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 02 Aug 2001 09:57:21 +0000 |
parents | 3e5bff3e55ff |
children | b1d7e8a28dfa |
line wrap: on
line diff
--- a/gtk/dw.c Fri Jul 27 07:12:35 2001 +0000 +++ b/gtk/dw.c Thu Aug 02 09:57:21 2001 +0000 @@ -50,8 +50,7 @@ GdkColor _foreground = { 0, 0x0000, 0x0000, 0x0000 }; GdkColor _background = { 0, 0xaaaa, 0xaaaa, 0xaaaa }; -char *_dw_browse_file = NULL; -int _dw_file_active = 0, _dw_file_ready = 0, _dw_ignore_click = 0; +int _dw_file_active = 0, _dw_ignore_click = 0; pthread_t _dw_thread = (pthread_t)-1; int _dw_mutex_locked = FALSE; @@ -609,6 +608,28 @@ return strlen(outbuf); } +void _dw_yes_func(HWND window, void *data) +{ + DWDialog *dwwait = (DWDialog *)data; + + if(!dwwait) + return; + + dw_window_destroy((HWND)dwwait->data); + dw_dialog_dismiss((DWDialog *)data, (void *)1); +} + +void _dw_no_func(HWND window, void *data) +{ + DWDialog *dwwait = (DWDialog *)data; + + if(!dwwait) + return; + + dw_window_destroy((HWND)dwwait->data); + dw_dialog_dismiss((DWDialog *)data, (void *)0); +} + /* * Displays a Message Box with given text and title.. * Parameters: @@ -619,7 +640,44 @@ */ int dw_yesno(char *title, char *text) { - return FALSE; + HWND entrywindow, mainbox, nobutton, yesbutton, buttonbox, stext; + ULONG flStyle = DW_FCF_TITLEBAR | DW_FCF_SHELLPOSITION | DW_FCF_DLGBORDER; + DWDialog *dwwait; + + entrywindow = dw_window_new(HWND_DESKTOP, title, flStyle); + + mainbox = dw_box_new(BOXVERT, 10); + + dw_box_pack_start(entrywindow, mainbox, 0, 0, TRUE, TRUE, 0); + + /* Archive Name */ + stext = dw_text_new(text, 0); + + dw_box_pack_start(mainbox, stext, 130, 20, TRUE, TRUE, 2); + + /* Buttons */ + buttonbox = dw_box_new(BOXHORZ, 10); + + dw_box_pack_start(mainbox, buttonbox, 0, 0, TRUE, TRUE, 0); + + yesbutton = dw_button_new("Yes", 1001L); + + dw_box_pack_start(buttonbox, yesbutton, 130, 30, TRUE, TRUE, 2); + + nobutton = dw_button_new("No", 1002L); + + dw_box_pack_start(buttonbox, nobutton, 130, 30, TRUE, TRUE, 2); + + dwwait = dw_dialog_new((void *)entrywindow); + + dw_signal_connect(yesbutton, "clicked", DW_SIGNAL_FUNC(_dw_yes_func), (void *)dwwait); + dw_signal_connect(nobutton, "clicked", DW_SIGNAL_FUNC(_dw_no_func), (void *)dwwait); + + dw_window_set_usize(entrywindow, 340, 150); + + dw_window_show(entrywindow); + + return (int)dw_dialog_wait(dwwait);; } /* @@ -911,6 +969,19 @@ } /* + * Changes the appearance of the mouse pointer. + * Parameters: + * handle: Handle to widget for which to change. + * cursortype: ID of the pointer you want. + */ +void dw_window_pointer(HWND handle, int pointertype) +{ + GdkCursor *cursor = gdk_cursor_new(pointertype); + gdk_window_set_cursor(handle->window, cursor); + gdk_cursor_destroy(cursor); +} + +/* * Releases previous mouse capture. */ void dw_window_release(void) @@ -1385,6 +1456,43 @@ } /* + * Create a tree object to be packed. + * Parameters: + * id: An ID to be used for getting the resource from the + * resource file. + */ +HWND dw_tree_new(ULONG id) +{ + GtkWidget *tmp, *tree; + int _locked_by_me = FALSE; + + DW_MUTEX_LOCK; + tmp = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (tmp), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + + gtk_object_set_data(GTK_OBJECT(tmp), "id", (gpointer)id); + gtk_widget_show(tmp); + tree = gtk_tree_new(); + if(!tree) + { + gtk_widget_destroy(tmp); + DW_MUTEX_UNLOCK; + return FALSE; + } + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp), tree); + /* Set the selection mode */ + gtk_tree_set_selection_mode (GTK_TREE(tree), GTK_SELECTION_SINGLE); + + gtk_object_set_user_data(GTK_OBJECT(tmp), (gpointer)tree); + gtk_widget_show(tree); + + DW_MUTEX_UNLOCK; + return tmp; +} + + +/* * Create a new static text window (widget) to be packed. * Parameters: * text: The text to be display by the static text widget. @@ -2292,6 +2400,61 @@ DW_MUTEX_UNLOCK; } +/* + * Inserts an item into a tree window (widget). + * Parameters: + * handle: Handle to the tree to be inserted. + * title: The text title of the entry. + * icon: Handle to coresponding icon. + * parent: Parent handle or 0 if root. + */ +HWND dw_tree_insert(HWND handle, char *title, unsigned long icon, HWND parent) +{ + GtkWidget *item, *tree, *subtree, *label, *hbox, *pixmap; + GdkPixmap *gdkpix; + GdkBitmap *gdkbmp; + int _locked_by_me = FALSE; + + DW_MUTEX_LOCK; + tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle)); + if(!tree || !GTK_IS_TREE(tree)) + { + DW_MUTEX_UNLOCK; + return NULL; + } + item = gtk_tree_item_new(); + label = gtk_label_new(title); + hbox = gtk_hbox_new(FALSE, 2); + gdkpix = _find_pixmap(&gdkbmp, icon, hbox); + pixmap = gtk_pixmap_new(gdkpix, gdkbmp); + gtk_container_add(GTK_CONTAINER(item), hbox); + gtk_box_pack_start(GTK_BOX(hbox), pixmap, FALSE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); + gtk_widget_show(label); + gtk_widget_show(pixmap); + gtk_widget_show(hbox); + + if(parent) + { + subtree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(parent)); + if(!subtree) + { + subtree = gtk_tree_new(); + gtk_object_set_user_data(GTK_OBJECT(parent), subtree); + gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); + gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); + gtk_tree_item_set_subtree(GTK_TREE_ITEM(parent), subtree); + gtk_widget_show(subtree); + } + gtk_tree_append(GTK_TREE(subtree), item); + } + else + gtk_tree_append(GTK_TREE(tree), item); + gtk_widget_show(item); + DW_MUTEX_UNLOCK; + return item; +} + int _dw_container_setup(HWND handle, unsigned long *flags, char **titles, int count, int separator, int extra) { GtkWidget *clist; @@ -2546,6 +2709,26 @@ } /* + * Sets the width of a column in the container. + * Parameters: + * handle: Handle to window (widget) of container. + * column: Zero based column of width being set. + * width: Width of column in pixels. + */ +void dw_container_set_column_width(HWND handle, int column, int width) +{ + GtkWidget *clist; + int _locked_by_me = FALSE; + + DW_MUTEX_LOCK; + clist = gtk_object_get_user_data(GTK_OBJECT(handle)); + + if(clist && GTK_IS_CLIST(clist)) + gtk_clist_set_column_width(GTK_CLIST(clist), column, width); + DW_MUTEX_UNLOCK; +} + +/* * Sets the title of a row in the container. * Parameters: * pointer: Pointer to the allocated memory in dw_container_alloc(). @@ -2586,6 +2769,42 @@ } /* + * Removes the first x rows from a container. + * Parameters: + * handle: Handle to the window (widget) to be deleted from. + * rowcount: The number of rows to be deleted. + */ +void dw_container_delete(HWND handle, int rowcount) +{ + GtkWidget *clist; + GList *list; + int _locked_by_me = FALSE; + + DW_MUTEX_LOCK; + clist = (GtkWidget*)gtk_object_get_user_data(GTK_OBJECT(handle)); + if(clist && GTK_IS_CLIST(clist)) + { + int rows, z; + + list = (GList *)gtk_object_get_data(GTK_OBJECT(clist), "selectlist"); + rows = (int)gtk_object_get_data(GTK_OBJECT(clist), "rowcount"); + g_list_free(list); + + for(z=0;z<rowcount;z++) + gtk_clist_remove(GTK_CLIST(clist), 0); + + if(rows - rowcount < 0) + rows = 0; + else + rows -= rowcount; + + gtk_object_set_data(GTK_OBJECT(clist), "selectlist", NULL); + gtk_object_set_data(GTK_OBJECT(clist), "rowcount", (gpointer)rows); + } + DW_MUTEX_UNLOCK; +} + +/* * Removes all rows from a container. * Parameters: * handle: Handle to the window (widget) to be cleared. @@ -2619,6 +2838,42 @@ } /* + * Scrolls container up or down. + * Parameters: + * handle: Handle to the window (widget) to be scrolled. + * direction: DW_SCROLL_UP, DW_SCROLL_DOWN, DW_SCROLL_TOP or + * DW_SCROLL_BOTTOM. (rows is ignored for last two) + * rows: The number of rows to be scrolled. + */ +void dw_container_scroll(HWND handle, int direction, long rows) +{ + GtkAdjustment *adj; + GtkWidget *clist; + int _locked_by_me = FALSE; + + DW_MUTEX_LOCK; + clist = (GtkWidget*)gtk_object_get_user_data(GTK_OBJECT(handle)); + if(clist && GTK_IS_CLIST(clist)) + { + adj = gtk_clist_get_vadjustment(GTK_CLIST(clist)); + if(adj) + { + switch(direction) + { + case DW_SCROLL_TOP: + adj->value = adj->lower; + break; + case DW_SCROLL_BOTTOM: + adj->value = adj->upper; + break; + } + gtk_clist_set_vadjustment(GTK_CLIST(clist), adj); + } + } + DW_MUTEX_UNLOCK; +} + +/* * Starts a new query of a container. * Parameters: * handle: Handle to the window (widget) to be queried. @@ -4130,27 +4385,28 @@ } /* Internal function to handle the file OK press */ -void _gtk_file_ok(GtkWidget *widget, GtkWidget *window) +void _gtk_file_ok(GtkWidget *widget, DWDialog *dwwait) { char *tmp; - tmp = gtk_file_selection_get_filename(GTK_FILE_SELECTION(window)); - if(tmp) - _dw_browse_file = strdup(tmp); - gtk_widget_destroy(GTK_WIDGET(window)); - if(pthread_self() == _dw_thread) - gtk_main_quit(); - _dw_file_ready = 1; + if(!dwwait) + return; + + tmp = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dwwait->data)); + gtk_widget_destroy(GTK_WIDGET(dwwait->data)); + _dw_file_active = 0; + dw_dialog_dismiss(dwwait, (void *)(tmp ? strdup(tmp) : NULL)); } /* Internal function to handle the file Cancel press */ -void _gtk_file_cancel(GtkWidget *widget, GtkWidget *window) +void _gtk_file_cancel(GtkWidget *widget, DWDialog *dwwait) { - gtk_widget_destroy(GTK_WIDGET(window)); - if(pthread_self() == _dw_thread) - gtk_main_quit(); - _dw_file_ready = 1; - + if(!dwwait) + return; + + gtk_widget_destroy(GTK_WIDGET(dwwait->data)); + _dw_file_active = 0; + dw_dialog_dismiss(dwwait, NULL); } /* @@ -4168,8 +4424,8 @@ char *dw_file_browse(char *title, char *defpath, char *ext, int flags) { GtkWidget *filew; - char *tmpvar; int _locked_by_me = FALSE; + DWDialog *dwwait; DW_MUTEX_LOCK; @@ -4183,12 +4439,13 @@ } _dw_file_active = 1; - _dw_file_ready = 0; filew = gtk_file_selection_new(title); - gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) _gtk_file_ok, filew); - gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) _gtk_file_cancel, filew); + 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); @@ -4197,20 +4454,7 @@ DW_MUTEX_UNLOCK; - if(pthread_self() == _dw_thread) - gtk_main(); - else - { - /* This should be an event semaphore */ - while(!_dw_file_ready) - usleep(100); - } - - tmpvar = _dw_browse_file; - _dw_browse_file = NULL; - _dw_file_ready = _dw_file_active = 0; - - return tmpvar; + return (char *)dw_dialog_wait(dwwait); }