static AddressDataSource *addressbook_find_datasource
(GtkCTreeNode *node );
+static AddressDataSource *addressbook_find_datasource_for_object
+ ( AddrItemObject *ao );
static AddressBookFile *addressbook_get_book_file(void);
static void addressbook_browse_entry_cb ( void );
#endif
+static void addressbook_start_drag(GtkWidget *widget, gint button,
+ GdkEvent *event,
+ void *data);
+static void addressbook_drag_data_get(GtkWidget *widget,
+ GdkDragContext *drag_context,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time,
+ void *data);
+static gboolean addressbook_drag_motion_cb(GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint time,
+ void *data);
+static void addressbook_drag_leave_cb(GtkWidget *widget,
+ GdkDragContext *context,
+ guint time,
+ void *data);
+static void addressbook_drag_received_cb(GtkWidget *widget,
+ GdkDragContext *drag_context,
+ gint x,
+ gint y,
+ GtkSelectionData *data,
+ guint info,
+ guint time,
+ void *pdata);
+
+static GtkTargetEntry addressbook_drag_types[] =
+{
+ {"text/plain", GTK_TARGET_SAME_APP, TARGET_DUMMY}
+};
+
+static GtkTargetList *addressbook_target_list = NULL;
+
+
static GtkItemFactoryEntry addressbook_entries[] =
{
{N_("/_File"), NULL, NULL, 0, "<Branch>"},
GList *nodeIf;
gchar *titles[N_COLS];
+ gchar *dummy_titles[1];
gchar *text;
gint i;
titles[COL_NAME] = _("Name");
titles[COL_ADDRESS] = _("E-Mail address");
titles[COL_REMARKS] = _("Remarks");
+ dummy_titles[0] = "";
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), _("Address book"));
gtk_widget_set_size_request(ctree_swin, COL_FOLDER_WIDTH + 40, -1);
/* Address index */
- ctree = gtk_ctree_new(1, 0);
+ ctree = gtk_sctree_new_with_titles(1, 0, dummy_titles);
gtk_container_add(GTK_CONTAINER(ctree_swin), ctree);
gtk_clist_set_selection_mode(GTK_CLIST(ctree), GTK_SELECTION_BROWSE);
gtk_clist_set_column_width(GTK_CLIST(ctree), 0, COL_FOLDER_WIDTH);
g_signal_connect(G_OBJECT(ctree), "select_row",
G_CALLBACK(addressbook_select_row_tree), NULL);
+ gtk_drag_dest_set(ctree, GTK_DEST_DEFAULT_ALL & ~GTK_DEST_DEFAULT_HIGHLIGHT,
+ addressbook_drag_types, 1,
+ GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_DEFAULT);
+ g_signal_connect(G_OBJECT(ctree), "drag_motion",
+ G_CALLBACK(addressbook_drag_motion_cb),
+ ctree);
+ g_signal_connect(G_OBJECT(ctree), "drag_leave",
+ G_CALLBACK(addressbook_drag_leave_cb),
+ ctree);
+ g_signal_connect(G_OBJECT(ctree), "drag_data_received",
+ G_CALLBACK(addressbook_drag_received_cb),
+ ctree);
+
clist_vbox = gtk_vbox_new(FALSE, 4);
clist_swin = gtk_scrolled_window_new(NULL, NULL);
gtk_box_pack_start(GTK_BOX(clist_vbox), clist_swin, TRUE, TRUE, 0);
/* Address list */
- clist = gtk_ctree_new_with_titles(N_COLS, 0, titles);
+ clist = gtk_sctree_new_with_titles(N_COLS, 0, titles);
gtk_container_add(GTK_CONTAINER(clist_swin), clist);
gtk_clist_set_selection_mode(GTK_CLIST(clist), GTK_SELECTION_EXTENDED);
gtk_ctree_set_line_style(GTK_CTREE(clist), GTK_CTREE_LINES_NONE);
G_CALLBACK(addressbook_person_expand_node), NULL );
g_signal_connect(G_OBJECT(clist), "tree_collapse",
G_CALLBACK(addressbook_person_collapse_node), NULL );
-
+ g_signal_connect(G_OBJECT(clist), "start_drag",
+ G_CALLBACK(addressbook_start_drag), NULL);
+ g_signal_connect(G_OBJECT(clist), "drag_data_get",
+ G_CALLBACK(addressbook_drag_data_get), NULL);
hbox = gtk_hbox_new(FALSE, 4);
gtk_box_pack_start(GTK_BOX(clist_vbox), hbox, FALSE, FALSE, 0);
addrbook.window = window;
addrbook.menubar = menubar;
addrbook.ctree = ctree;
+ addrbook.ctree_swin
+ = ctree_swin;
addrbook.clist = clist;
addrbook.entry = entry;
addrbook.statusbar = statusbar;
if( ! compose ) return;
/* Nothing selected, but maybe there is something in text entry */
- addr = gtk_entry_get_text( GTK_ENTRY( addrbook.entry) );
+ addr = (char *)gtk_entry_get_text( GTK_ENTRY( addrbook.entry) );
if ( addr ) {
compose_entry_append(
compose, addr, (ComposeEntryType)data );
return abf;
}
+static AddressBookFile *addressbook_get_book_file_for_node(GtkCTreeNode *node) {
+ AddressBookFile *abf = NULL;
+ AddressDataSource *ds = NULL;
+
+ ds = addressbook_find_datasource( node );
+ if( ds == NULL ) return NULL;
+ if( ds->type == ADDR_IF_BOOK ) abf = ds->rawDataSource;
+ return abf;
+}
+
static void addressbook_tree_remove_children( GtkCTree *ctree, GtkCTreeNode *parent ) {
GtkCTreeNode *node;
GtkCTreeRow *row;
addressbook_exp_ldif( cache );
}
+static void addressbook_start_drag(GtkWidget *widget, gint button,
+ GdkEvent *event,
+ void *data)
+{
+ GdkDragContext *context;
+ if (addressbook_target_list == NULL)
+ addressbook_target_list = gtk_target_list_new(
+ addressbook_drag_types, 1);
+ context = gtk_drag_begin(widget, addressbook_target_list,
+ GDK_ACTION_MOVE|GDK_ACTION_COPY|GDK_ACTION_DEFAULT, button, event);
+ gtk_drag_set_icon_default(context);
+}
+
+static ItemPerson *dragged_person = NULL;
+static ItemFolder *dragged_folder = NULL;
+static AddressBookFile *dragged_ab = NULL;
+
+static void addressbook_drag_data_get(GtkWidget *widget,
+ GdkDragContext *drag_context,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time,
+ void *data)
+{
+ AddrItemObject *aio = NULL;
+ AddressObject *pobj = NULL;
+ AdapterDSource *ads = NULL;
+ AddressDataSource *ds = NULL;
+
+ pobj = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.ctree), addrbook.treeSelected );
+ if( pobj == NULL ) return;
+
+ if( pobj->type == ADDR_DATASOURCE ) {
+ ads = ADAPTER_DSOURCE(pobj);
+ ds = ads->dataSource;
+ } else if (pobj->type == ADDR_ITEM_GROUP) {
+ return;
+ }
+
+ else if( pobj->type != ADDR_INTERFACE ) {
+ ds = addressbook_find_datasource( addrbook.treeSelected );
+ if (!ds)
+ return;
+ }
+ if (addrbook.listSelected)
+ aio = gtk_ctree_node_get_row_data( GTK_CTREE(addrbook.clist),
+ addrbook.listSelected );
+
+ while (aio && aio->type != ADDR_ITEM_PERSON) {
+ aio = aio->parent;
+ }
+
+ if (aio && aio->type == ADDR_ITEM_PERSON) {
+ dragged_person = (ItemPerson *)aio;
+ dragged_folder = (ItemFolder *)ADAPTER_FOLDER(pobj)->itemFolder;
+ dragged_ab = addressbook_get_book_file();
+
+ gtk_selection_data_set(selection_data,
+ selection_data->target, 8,
+ "Dummy_addr", 11);
+ drag_context->actions = GDK_ACTION_MOVE;
+
+ if (pobj->type == ADDR_DATASOURCE) {
+ if( ds != NULL) {
+ dragged_folder = addrindex_ds_get_root_folder( ds );
+ if (ds->type != ADDR_IF_JPILOT ||
+ ds->type != ADDR_IF_LDAP)
+ drag_context->action = GDK_ACTION_COPY;
+ } else {
+ dragged_folder = NULL;
+ dragged_person = NULL;
+ dragged_ab = NULL;
+ }
+ }
+ } else {
+ dragged_folder = NULL;
+ dragged_person = NULL;
+ dragged_ab = NULL;
+ }
+}
+
+static gboolean addressbook_drag_motion_cb(GtkWidget *widget,
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ guint time,
+ void *data)
+{
+ gint row, column;
+ GtkCTreeNode *node = NULL;
+ gboolean acceptable = FALSE;
+ gint height = addrbook.ctree->allocation.height;
+ gint total_height = addrbook.ctree->requisition.height;
+ GtkAdjustment *pos = gtk_scrolled_window_get_vadjustment(
+ GTK_SCROLLED_WINDOW(addrbook.ctree_swin));
+ gfloat vpos = pos->value;
+
+ if (gtk_clist_get_selection_info
+ (GTK_CLIST(widget), x - 24, y - 24, &row, &column)) {
+
+ if (y > height - 24 && height + vpos < total_height)
+ gtk_adjustment_set_value(pos, (vpos+5 > height ? height : vpos+5));
+
+ if (y < 24 && y > 0)
+ gtk_adjustment_set_value(pos, (vpos-5 < 0 ? 0 : vpos-5));
+
+ node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
+
+ if (node != NULL) {
+ AddressObject *obj = gtk_ctree_node_get_row_data(GTK_CTREE(widget), node );
+ if( obj->type == ADDR_ITEM_FOLDER
+ || obj->type == ADDR_ITEM_GROUP)
+ acceptable = TRUE;
+ else {
+ AdapterDSource *ads = NULL;
+ AddressDataSource *ds = NULL;
+ ads = ADAPTER_DSOURCE(obj);
+ if (ads == NULL ) return FALSE;
+ ds = ads->dataSource;
+ if (ds == NULL ) return FALSE;
+ if (obj->type == ADDR_DATASOURCE
+ && !ds->interface->externalQuery)
+ acceptable = TRUE;
+
+ }
+ }
+ }
+
+
+ if (acceptable) {
+ g_signal_handlers_block_by_func
+ (G_OBJECT(widget),
+ G_CALLBACK(addressbook_tree_selected), NULL);
+ gtk_ctree_select(GTK_CTREE(widget), node);
+ g_signal_handlers_unblock_by_func
+ (G_OBJECT(widget),
+ G_CALLBACK(addressbook_tree_selected), NULL);
+ gdk_drag_status(context,
+ (context->actions == GDK_ACTION_COPY ?
+ GDK_ACTION_COPY : GDK_ACTION_MOVE) , time);
+ } else {
+ gdk_drag_status(context, 0, time);
+ }
+
+ return acceptable;
+}
+
+static void addressbook_drag_leave_cb(GtkWidget *widget,
+ GdkDragContext *context,
+ guint time,
+ void *data)
+{
+ if (addrbook.treeSelected) {
+ g_signal_handlers_block_by_func
+ (G_OBJECT(widget),
+ G_CALLBACK(addressbook_tree_selected), NULL);
+ gtk_ctree_select(GTK_CTREE(widget), addrbook.treeSelected);
+ g_signal_handlers_unblock_by_func
+ (G_OBJECT(widget),
+ G_CALLBACK(addressbook_tree_selected), NULL);
+ }
+}
+
+static AddressBookFile *get_rawDataSource(ItemFolder *item)
+{
+ AdapterDSource *ads = NULL;
+ AddressDataSource *ds = NULL;
+ ads = ADAPTER_DSOURCE(item);
+ if (ads == NULL ) return NULL;
+ ds = ads->dataSource;
+ if (ds == NULL ) return NULL;
+
+ return ds->rawDataSource;
+}
+
+static void addressbook_drag_received_cb(GtkWidget *widget,
+ GdkDragContext *drag_context,
+ gint x,
+ gint y,
+ GtkSelectionData *data,
+ guint info,
+ guint time,
+ void *pdata)
+{
+ gint row, column;
+ GtkCTreeNode *node;
+ ItemFolder *afolder = NULL;
+ ItemFolder *ofolder = NULL;
+ ItemPerson *person = NULL;
+
+
+ if (!strcmp(data->data, "Dummy_addr")) {
+ AddressObject *obj = NULL;
+ AdapterDSource *ads = NULL;
+ AddressDataSource *ds = NULL;
+ AddrBookBase *adbase = NULL;
+ AddressCache *cache = NULL;
+
+
+ if (gtk_clist_get_selection_info
+ (GTK_CLIST(widget), x - 24, y - 24, &row, &column) == 0) {
+ return;
+ }
+
+ node = gtk_ctree_node_nth(GTK_CTREE(widget), row);
+ if( node )
+ obj = gtk_ctree_node_get_row_data(GTK_CTREE(addrbook.ctree), node );
+ if( obj == NULL )
+ return;
+
+
+
+ person = ( ItemPerson * )dragged_person;
+
+ if (obj->type == ADDR_ITEM_FOLDER) {
+ afolder = ADAPTER_FOLDER(obj)->itemFolder;
+
+ } else if (obj->type == ADDR_DATASOURCE) {
+ ads = ADAPTER_DSOURCE(obj);
+ if( ads == NULL )
+ return;
+ ds = ads->dataSource;
+ if( ds == NULL ||
+ ds->type == ADDR_IF_JPILOT ||
+ ds->type == ADDR_IF_LDAP)
+ return;
+ afolder = addrindex_ds_get_root_folder( ds );
+
+ } else {
+ return;
+ }
+
+ ofolder = dragged_folder;
+
+ if (afolder && ofolder) {
+ AddressBookFile *obook = dragged_ab;
+ AddressBookFile *abook = addressbook_get_book_file_for_node(node);
+ addritem_folder_remove_person(ofolder, person);
+ addritem_folder_add_person(afolder, person);
+ addressbook_list_select_clear();
+ gtk_ctree_select( GTK_CTREE(addrbook.ctree), addrbook.opened);
+
+ if (abook) {
+ addrbook_set_dirty(abook, TRUE);
+ }
+ if (obook) {
+ addrbook_set_dirty(obook, TRUE);
+ }
+
+ addressbook_export_to_file();
+ }
+
+ gtk_drag_finish(drag_context, TRUE, TRUE, time);
+ }
+}
+
/*
* End of Source.
*/