diff -Nur skipstone-0.7.7-bak/src/bookmarks.c skipstone-0.7.7/src/bookmarks.c --- skipstone-0.7.7-bak/src/bookmarks.c Sat Dec 1 14:37:54 2001 +++ skipstone-0.7.7/src/bookmarks.c Sun Dec 2 16:54:54 2001 @@ -5,6 +5,10 @@ #include "skipstone.h" +#define AUTO_SCROLL_EDGE 20 +#define AUTO_SCROLL_INTERVAL 50 +#define AUTO_SCROLL_TITLE_HEIGHT 20 /* FIXME!! I don't know how to get title height of clist(ctree) widget */ + static void bookmark_activate(GtkWidget *widget,SkipStone *skipstone); static void click_on_bookmark_from_toolbar(GtkWidget *button, GdkEventButton *event, SkipStone *skipstone); static void close_bookmark_window(BookmarkWindow *bwin); @@ -15,6 +19,11 @@ static void on_bookmark_ctree_select_row(GtkWidget *ctree,GtkCTreeNode *node,gint col,BookmarkWindow *bwin); static void on_bookmark_ctree_unselect_row(GtkWidget *ctree,GtkCTreeNode *node,gint col,BookmarkWindow *bwin); static void on_bookmark_ctree_move(GtkWidget *ctree,GtkCTreeNode *node,GtkCTreeNode *parent,GtkCTreeNode *sibling,BookmarkWindow *bwin); +static gboolean scrolling_is_desirable(BookmarkWindow *bwin,gint x,gint y); +static gboolean timeout_auto_scroll(gpointer data); +static void cancel_auto_scroll(BookmarkWindow *bwin); +static void on_bookmark_ctree_drag_motion(GtkWidget *ctree,GdkDragContext *context,gint x,gint y,gint time,BookmarkWindow *bwin); +static void on_bookmark_ctree_drag_end(GtkWidget *ctree,GdkDragContext *context,BookmarkWindow *bwin); static void on_bookmark_add_button_clicked(GtkWidget *button,BookmarkWindow *bwin); static void on_bookmark_update_button_clicked(GtkWidget *button,BookmarkWindow *bwin); static void on_bookmark_remove_button_clicked(GtkWidget *button,BookmarkWindow *bwin); @@ -29,6 +38,9 @@ static gboolean read_bookmarks_from_ctree(GtkCTree *ctree,gint depth,GNode *gnode,GtkCTreeNode *cnode,gpointer user_data); static GSList *bmark_toolbar_widgets; +static gint scroll_timer_id = -1; +static gint drag_motion_x; +static gint drag_motion_y; extern GNode *bookmarks; extern GSList *window_count; @@ -211,6 +223,8 @@ gtk_signal_connect(GTK_OBJECT(ctree),"tree_select_row",GTK_SIGNAL_FUNC(on_bookmark_ctree_select_row),bwin); gtk_signal_connect(GTK_OBJECT(ctree),"tree_unselect_row",GTK_SIGNAL_FUNC(on_bookmark_ctree_unselect_row),bwin); gtk_signal_connect(GTK_OBJECT(ctree),"tree_move",GTK_SIGNAL_FUNC(on_bookmark_ctree_move),bwin); + gtk_signal_connect(GTK_OBJECT(ctree),"drag_motion",GTK_SIGNAL_FUNC(on_bookmark_ctree_drag_motion),bwin); + gtk_signal_connect(GTK_OBJECT(ctree),"drag_end",GTK_SIGNAL_FUNC(on_bookmark_ctree_drag_end),bwin); hbox1 = gtk_hbox_new(FALSE,0); gtk_widget_show(hbox1); @@ -286,6 +300,7 @@ setup_escape_key_handler(window); bwin->window = window; + bwin->scrolled_window = scrolled_window; bwin->ctree = ctree; bwin->menu_node = menu_node; bwin->toolbar_node = toolbar_node; @@ -350,6 +365,42 @@ D_RETURN; } +struct BookmarkNode { + BookmarkWindow *bwin; + GtkCTreeNode *node; + GtkCTreeNode *parent; + GtkCTreeNode *sibling; +}; + +static gint idle_move_node (gpointer data) { + struct BookmarkNode *bnode = data; + + if (bnode) { + BookmarkWindow *bwin = bnode->bwin; + if (bwin) + gtk_ctree_move(GTK_CTREE(bwin->ctree),bnode->node,bnode->parent,bnode->sibling); + } + + g_free (bnode); + + return FALSE; +} + +static void move_node_to_specified_pos (BookmarkWindow *bwin,GtkCTreeNode *node,GtkCTreeNode *parent,GtkCTreeNode *sibling) { + struct BookmarkNode *bnode; + + g_return_if_fail (bwin && node && parent); + + bnode = g_new0(struct BookmarkNode,1); + bnode->bwin = bwin; + bnode->node = node; + bnode->parent = parent; + bnode->sibling = sibling; + gtk_idle_add(idle_move_node,bnode); + + return; +} + static void on_bookmark_ctree_unselect_row(GtkWidget *ctree,GtkCTreeNode *node,gint col,BookmarkWindow *bwin) { D_ENTER; gtk_entry_set_text(GTK_ENTRY(bwin->text_entry),""); @@ -363,8 +414,7 @@ BookmarkData *data; D_ENTER; if (!parent) { - gtk_ctree_move(GTK_CTREE(bwin->ctree),node,bwin->menu_node,NULL); - /* this doesnt work, btw */ + move_node_to_specified_pos (bwin, node, GTK_CTREE_ROW(node)->parent, GTK_CTREE_ROW(node)->sibling); D_RETURN; } @@ -372,13 +422,82 @@ data = gtk_ctree_node_get_row_data(GTK_CTREE(bwin->ctree),node); if (parent_data->type != 0) { - parent_data->url = NULL; - parent_data->type = 0; - gtk_ctree_node_set_text(GTK_CTREE(bwin->ctree),parent,1,""); - gtk_ctree_node_set_row_data(GTK_CTREE(bwin->ctree),parent,parent_data); + move_node_to_specified_pos (bwin, node, GTK_CTREE_ROW(parent)->parent, GTK_CTREE_ROW(parent)->sibling); } D_RETURN; +} + +static gboolean scrolling_is_desirable(BookmarkWindow *bwin,gint x,gint y) { + GtkCTree *dirtree; + GtkAdjustment *vadj; + + dirtree = GTK_CTREE(bwin->ctree); + + vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(bwin->scrolled_window)); + + if (y < AUTO_SCROLL_EDGE + AUTO_SCROLL_TITLE_HEIGHT) { + if (vadj->value > vadj->lower) + return TRUE; + } else { + if (y > (vadj->page_size - AUTO_SCROLL_EDGE)){ + if (vadj->value < vadj->upper - vadj->page_size) + return TRUE; + } + } + + return FALSE; +} + +static gboolean timeout_auto_scroll(gpointer data) { + BookmarkWindow *bwin = data; + GtkAdjustment *vadj; + gfloat vpos; + + vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(bwin->scrolled_window)); + + if (drag_motion_y < AUTO_SCROLL_EDGE + AUTO_SCROLL_TITLE_HEIGHT) { + vpos = vadj->value - vadj->step_increment; + if (vpos < vadj->lower) + vpos = vadj->lower; + + gtk_adjustment_set_value(vadj, vpos); + } else { + vpos = vadj->value + vadj->step_increment; + if (vpos > vadj->upper - vadj->page_size) + vpos = vadj->upper - vadj->page_size; + + gtk_adjustment_set_value(vadj, vpos); + } + + return TRUE; +} + +static void cancel_auto_scroll(BookmarkWindow *bwin) { + g_return_if_fail(bwin); + + if (scroll_timer_id != -1){ + gtk_timeout_remove(scroll_timer_id); + scroll_timer_id = -1; + } +} + +static void on_bookmark_ctree_drag_motion(GtkWidget *ctree,GdkDragContext *context,gint x, gint y,gint time,BookmarkWindow *bwin) { + g_return_if_fail (bwin); + + cancel_auto_scroll (bwin); + + drag_motion_x = x; + drag_motion_y = y; + + if (scrolling_is_desirable(bwin,x,y)) + scroll_timer_id = gtk_timeout_add(AUTO_SCROLL_INTERVAL,timeout_auto_scroll,bwin); +} + +static void on_bookmark_ctree_drag_end(GtkWidget *ctree,GdkDragContext *context,BookmarkWindow *bwin) { + g_return_if_fail(bwin); + + cancel_auto_scroll(bwin); } diff -Nur skipstone-0.7.7-bak/src/skipstone-types.h skipstone-0.7.7/src/skipstone-types.h --- skipstone-0.7.7-bak/src/skipstone-types.h Sat Dec 1 14:37:54 2001 +++ skipstone-0.7.7/src/skipstone-types.h Sun Dec 2 16:48:06 2001 @@ -236,6 +236,7 @@ struct _BookmarkWindow { GtkWidget *window; + GtkWidget *scrolled_window; GtkWidget *ctree; GtkCTreeNode *menu_node; GtkCTreeNode *toolbar_node;