#include #include #include #include #include #include "helper.h" #include "callback.h" #include "project4.h" extern GtkWidget *ltree, *rtree, *bundlename, *bundleid, *classname, *classid; extern GtkTooltips tips; typedef struct _DragData DragData; struct _DragData { GdkAtom id; GtkTreeIter iter; }; void gtk_die(GtkWidget *widget, gpointer data) { gtk_main_quit(); } void add_bundle(GtkWidget *widget, gpointer data) { G_CONST_RETURN gchar *name = gtk_entry_get_text(GTK_ENTRY(bundlename)); G_CONST_RETURN gchar *id = gtk_entry_get_text(GTK_ENTRY(bundleid)); GtkTreeStore *store; GtkTreeIter iter; if (id == NULL || strlen(id) == 0) return; store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(ltree))); gtk_tree_store_append(store, &iter, NULL); if (name && strlen(name) > 0) gtk_tree_store_set(store, &iter, NAME, name, ID, id, -1); else gtk_tree_store_set(store, &iter, NAME, id, ID, id, -1); gtk_entry_set_text(GTK_ENTRY(bundlename), ""); gtk_entry_set_text(GTK_ENTRY(bundleid), ""); } void add_class(GtkWidget *widget, gpointer data) { G_CONST_RETURN gchar *name = gtk_entry_get_text(GTK_ENTRY(classname)); G_CONST_RETURN gchar *id = gtk_entry_get_text(GTK_ENTRY(classid)); GtkTreeStore *store; GtkTreeIter iter; if (id == NULL || strlen(id) == 0) return; store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(rtree))); gtk_tree_store_append(store, &iter, NULL); if (name && strlen(name) > 0) gtk_tree_store_set(store, &iter, NAME, name, ID, id, -1); else gtk_tree_store_set(store, &iter, NAME, id, ID, id, -1); gtk_entry_set_text(GTK_ENTRY(classname), ""); gtk_entry_set_text(GTK_ENTRY(classid), ""); } void get_drag( GtkWidget *widget, GdkDragContext *dc, GtkSelectionData *data, guint info, guint time, gpointer *column) { GtkTreeRowReference *ref = g_object_get_data(G_OBJECT(dc), "gtk-tree-view-source-row"); GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref); GtkTreeIter iter; GValue val = {0}; gchar *id; GdkAtom fromatom; DragData dragdata; if (!sourcerow) return; gtk_tree_model_get_iter(GTK_TREE_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))), &iter, sourcerow); gtk_tree_model_get_value(GTK_TREE_MODEL(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))), &iter, ID, &val); id = g_strdup_value_contents(&val); dragdata.id = gdk_atom_intern(id, FALSE); g_free(id); dragdata.iter = iter; /*fprintf(stderr, "Drag send: %s\n", id);*/ switch(GPOINTER_TO_INT(column)) { case MAJORCOL: fromatom = gdk_atom_intern("MAJOR", FALSE); break; case STUDENTCOL: fromatom = gdk_atom_intern("STUDENT", FALSE); break; default: fprintf(stderr, "Improper column argument\n"); exit(-1); } gtk_selection_data_set(data, fromatom, 8, (void*)&dragdata, sizeof(dragdata)); gtk_tree_path_free(sourcerow); } /* * From\To Requirement Class * Requirement Sort Fulfil requirement * Class Fulfil requirement Sort */ void rcv_drag( GtkWidget *widget, GdkDragContext *dc, guint x, guint y, GtkSelectionData *sd, guint info, guint t, gpointer *column) { GtkTreePath *path = NULL; GtkTreeViewDropPosition position; GtkTreeStore *dropstore; GtkTreeIter dropiter; gboolean dropvalid; gchar *id; DragData dragdata; treecol dest = GPOINTER_TO_INT(column); if (sd->data) { gtk_tree_view_get_dest_row_at_pos(GTK_TREE_VIEW(widget), x, y, &path, &position); dropstore = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))); dropvalid = gtk_tree_model_get_iter(GTK_TREE_MODEL(dropstore), &dropiter, path); memcpy(&dragdata, sd->data, sizeof(dragdata)); id = gdk_atom_name(dragdata.id); if (sd->type == gdk_atom_intern("MAJOR", FALSE)) { if (dest == MAJORCOL) { assert(gtk_tree_store_iter_is_valid(dropstore, &dropiter) == TRUE); assert(gtk_tree_store_iter_is_valid(dropstore, &dragdata.iter) == TRUE); fprintf(stderr, "Dropiter: %i\nSrciter: %i\n", gtk_tree_store_iter_depth(dropstore, &dropiter), gtk_tree_store_iter_depth(dropstore, &dragdata.iter)); if (dropvalid) gtk_tree_store_move_before(dropstore, &dragdata.iter, &dropiter); else gtk_tree_store_move_before(dropstore, &dragdata.iter, NULL); fprintf(stderr, "Req->Req: %s\n", id); } else if (dest == STUDENTCOL) { fprintf(stderr, "Req->Class: %s\n", id); } else fprintf(stderr, "Req->Unknown(%i): %s\n", dest, id); } else if (sd->type == gdk_atom_intern("STUDENT", FALSE)) { if (dest == MAJORCOL) { fprintf(stderr, "Class->Req: %s\n", id); } else if (dest == STUDENTCOL) { fprintf(stderr, "Class->Class: %s\n", id); } else fprintf(stderr, "Class->Unknown(%i): %s\n", dest, id); } else { fprintf(stderr, "Drag received from %s type: %s\n", gdk_atom_name(sd->type), id); } g_free(id); } }