/* * ECell::event method */ static gint ect_event (ECellView *ecell_view, GdkEvent *event, gint model_col, gint view_col, gint row, ECellFlags flags, ECellActions *actions) { GtkLayout *layout; GdkWindow *window; ECellTreeView *tree_view = (ECellTreeView *) ecell_view; ETreeModel *tree_model = e_cell_tree_get_tree_model (ecell_view->e_table_model, row); ETreeTableAdapter *etta = e_cell_tree_get_tree_table_adapter (ecell_view->e_table_model, row); ETreePath node = e_cell_tree_get_node (ecell_view->e_table_model, row); gint offset = offset_of_node (ecell_view->e_table_model, row); gint result; layout = GTK_LAYOUT (tree_view->canvas); window = gtk_layout_get_bin_window (layout); switch (event->type) { case GDK_BUTTON_PRESS: if (event_in_expander (event, offset, 0)) { if (e_tree_model_node_is_expandable (tree_model, node)) { gboolean expanded = e_tree_table_adapter_node_is_expanded (etta, node); gint tmp_row = row; GdkRectangle area; animate_closure_t *closure = g_new0 (animate_closure_t, 1); cairo_t *cr; gint hgt; e_table_item_get_cell_geometry ( tree_view->cell_view.e_table_item_view, &tmp_row, &view_col, &area.x, &area.y, NULL, &area.height); area.width = offset - 2; hgt = e_cell_height (ecell_view, model_col, view_col, row); if (hgt != area.height) /* Composite cells */ area.height += hgt; cr = gdk_cairo_create (window); draw_expander ( tree_view, cr, expanded ? GTK_EXPANDER_SEMI_EXPANDED : GTK_EXPANDER_SEMI_COLLAPSED, GTK_STATE_NORMAL, &area); cairo_destroy (cr); closure->ectv = tree_view; closure->etta = etta; closure->node = node; closure->expanded = expanded; closure->area = area; tree_view->animate_timeout = e_named_timeout_add_full (G_PRIORITY_DEFAULT, 50, animate_expander, closure, g_free); return TRUE; } } else if (event->button.x < (offset - INDENT_AMOUNT)) return FALSE; break; case GDK_MOTION_NOTIFY: if (e_tree_model_node_is_expandable (tree_model, node)) { gint height = ect_height (ecell_view, model_col, view_col, row); GdkRectangle area; gboolean in_expander = event_in_expander (event, offset, height); if (tree_view->prelit ^ in_expander) { gint tmp_row = row; cairo_t *cr; e_table_item_get_cell_geometry ( tree_view->cell_view.e_table_item_view, &tmp_row, &view_col, &area.x, &area.y, NULL, &area.height); area.width = offset - 2; cr = gdk_cairo_create (window); draw_expander ( tree_view, cr, e_tree_table_adapter_node_is_expanded (etta, node) ? GTK_EXPANDER_EXPANDED : GTK_EXPANDER_COLLAPSED, in_expander ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL, &area); cairo_destroy (cr); tree_view->prelit = in_expander; return TRUE; } } break; case GDK_LEAVE_NOTIFY: if (tree_view->prelit) { gint tmp_row = row; GdkRectangle area; cairo_t *cr; e_table_item_get_cell_geometry ( tree_view->cell_view.e_table_item_view, &tmp_row, &view_col, &area.x, &area.y, NULL, &area.height); area.width = offset - 2; cr = gdk_cairo_create (window); draw_expander ( tree_view, cr, e_tree_table_adapter_node_is_expanded (etta, node) ? GTK_EXPANDER_EXPANDED : GTK_EXPANDER_COLLAPSED, GTK_STATE_NORMAL, &area); cairo_destroy (cr); tree_view->prelit = FALSE; } return TRUE; default: break; } adjust_event_position (event, -offset); result = e_cell_event (tree_view->subcell_view, event, model_col, view_col, row, flags, actions); adjust_event_position (event, offset); return result; }
gint main (gint argc, gchar **argv) { GTask *task; GCancellable *cancellable; gchar *file = NULL, *oper = NULL; const gchar *title = NULL; gint ii; GError *error = NULL; #ifdef G_OS_WIN32 e_util_win32_initialize (); #endif bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); gtk_init_with_args ( &argc, &argv, NULL, options, GETTEXT_PACKAGE, &error); if (error != NULL) { g_printerr ("%s\n", error->message); g_error_free (error); exit (EXIT_FAILURE); } if (opt_remaining != NULL) { for (ii = 0; ii < g_strv_length (opt_remaining); ii++) { if (backup_op) { title = _("Evolution Back Up"); oper = _("Backing up to the file %s"); bk_file = g_strdup ((gchar *) opt_remaining[ii]); file = bk_file; } else if (restore_op) { title = _("Evolution Restore"); oper = _("Restoring from the file %s"); res_file = g_strdup ((gchar *) opt_remaining[ii]); file = res_file; } else if (check_op) { d (g_message ("Checking %s", (gchar *) opt_remaining[ii])); chk_file = g_strdup ((gchar *) opt_remaining[ii]); } } } cancellable = g_cancellable_new (); if (gui_arg && !check_op) { GtkWidget *widget, *container; GtkWidget *action_area; GtkWidget *content_area; const gchar *txt, *txt2; gchar *str = NULL; gchar *markup; gtk_window_set_default_icon_name ("evolution"); /* Backup / Restore only can have GUI. * We should restrict the rest. */ progress_dialog = gtk_dialog_new_with_buttons ( title, NULL, GTK_DIALOG_MODAL, _("_Cancel"), GTK_RESPONSE_REJECT, NULL); gtk_container_set_border_width ( GTK_CONTAINER (progress_dialog), 12); action_area = gtk_dialog_get_action_area ( GTK_DIALOG (progress_dialog)); content_area = gtk_dialog_get_content_area ( GTK_DIALOG (progress_dialog)); /* Override GtkDialog defaults */ gtk_box_set_spacing (GTK_BOX (content_area), 12); gtk_container_set_border_width (GTK_CONTAINER (content_area), 0); gtk_box_set_spacing (GTK_BOX (action_area), 12); gtk_container_set_border_width (GTK_CONTAINER (action_area), 0); if (oper && file) str = g_strdup_printf (oper, file); container = gtk_grid_new (); gtk_grid_set_column_spacing (GTK_GRID (container), 6); gtk_grid_set_row_spacing (GTK_GRID (container), 0); gtk_widget_show (container); gtk_box_pack_start ( GTK_BOX (content_area), container, FALSE, TRUE, 0); widget = gtk_image_new_from_icon_name ( "edit-copy", GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.0); gtk_widget_show (widget); gtk_grid_attach (GTK_GRID (container), widget, 0, 0, 1, 3); g_object_set ( G_OBJECT (widget), "halign", GTK_ALIGN_FILL, "valign", GTK_ALIGN_FILL, "vexpand", TRUE, NULL); if (backup_op) { txt = _("Backing up Evolution Data"); txt2 = _("Please wait while Evolution is backing up your data."); } else if (restore_op) { txt = _("Restoring Evolution Data"); txt2 = _("Please wait while Evolution is restoring your data."); } else { g_return_val_if_reached (EXIT_FAILURE); } markup = g_markup_printf_escaped ("<b><big>%s</big></b>", txt); widget = gtk_label_new (markup); gtk_label_set_line_wrap (GTK_LABEL (widget), FALSE); gtk_label_set_use_markup (GTK_LABEL (widget), TRUE); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.0); gtk_widget_show (widget); g_free (markup); gtk_grid_attach (GTK_GRID (container), widget, 1, 0, 1, 1); g_object_set ( G_OBJECT (widget), "halign", GTK_ALIGN_FILL, "hexpand", TRUE, "valign", GTK_ALIGN_FILL, NULL); markup = g_strconcat ( txt2, " ", _("This may take a while depending " "on the amount of data in your account."), NULL); widget = gtk_label_new (markup); gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); gtk_widget_show (widget); g_free (markup); gtk_grid_attach (GTK_GRID (container), widget, 1, 1, 1, 1); g_object_set ( G_OBJECT (widget), "halign", GTK_ALIGN_FILL, "hexpand", TRUE, "valign", GTK_ALIGN_FILL, NULL); pbar = gtk_progress_bar_new (); if (str != NULL) { markup = g_markup_printf_escaped ("<i>%s</i>", str); widget = gtk_label_new (markup); gtk_label_set_use_markup (GTK_LABEL (widget), TRUE); gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); g_free (markup); g_free (str); gtk_grid_attach (GTK_GRID (container), widget, 1, 2, 1, 1); g_object_set ( G_OBJECT (widget), "halign", GTK_ALIGN_FILL, "hexpand", TRUE, "valign", GTK_ALIGN_FILL, NULL); gtk_grid_attach (GTK_GRID (container), pbar, 1, 3, 1, 1); } else gtk_grid_attach (GTK_GRID (container), pbar, 1, 2, 1, 1); g_object_set ( G_OBJECT (pbar), "halign", GTK_ALIGN_FILL, "hexpand", TRUE, "valign", GTK_ALIGN_FILL, NULL); g_signal_connect ( progress_dialog, "response", G_CALLBACK (dlg_response), cancellable); gtk_widget_show_all (progress_dialog); } else if (check_op) { /* For sanity we don't need gui */ check (chk_file, NULL); exit (result == 0 ? 0 : 1); } if (gui_arg) { e_named_timeout_add_full ( G_PRIORITY_DEFAULT, 50, pbar_update, g_object_ref (cancellable), (GDestroyNotify) g_object_unref); } task = g_task_new (cancellable, cancellable, NULL, NULL); g_task_run_in_thread (task, start_job); g_object_unref (task); gtk_main (); g_object_unref (cancellable); e_util_cleanup_settings (); return result; }
void e_task_shell_view_private_constructed (ETaskShellView *task_shell_view) { ETaskShellViewPrivate *priv = task_shell_view->priv; EShellBackend *shell_backend; EShellContent *shell_content; EShellSidebar *shell_sidebar; EShellWindow *shell_window; EShellView *shell_view; EShell *shell; gulong handler_id; shell_view = E_SHELL_VIEW (task_shell_view); shell_backend = e_shell_view_get_shell_backend (shell_view); shell_content = e_shell_view_get_shell_content (shell_view); shell_sidebar = e_shell_view_get_shell_sidebar (shell_view); shell_window = e_shell_view_get_shell_window (shell_view); shell = e_shell_window_get_shell (shell_window); e_shell_window_add_action_group (shell_window, "tasks"); e_shell_window_add_action_group (shell_window, "tasks-filter"); /* Cache these to avoid lots of awkward casting. */ priv->task_shell_backend = g_object_ref (shell_backend); priv->task_shell_content = g_object_ref (shell_content); priv->task_shell_sidebar = g_object_ref (shell_sidebar); priv->settings = g_settings_new ("org.gnome.evolution.calendar"); handler_id = g_signal_connect_object ( priv->task_shell_sidebar, "client-added", G_CALLBACK (task_shell_view_selector_client_added_cb), task_shell_view, G_CONNECT_SWAPPED); priv->client_added_handler_id = handler_id; handler_id = g_signal_connect_object ( priv->task_shell_sidebar, "client-removed", G_CALLBACK (task_shell_view_selector_client_removed_cb), task_shell_view, G_CONNECT_SWAPPED); priv->client_removed_handler_id = handler_id; /* Keep our own reference to this so we can * disconnect our signal handlers in dispose(). */ priv->client_cache = e_shell_get_client_cache (shell); g_object_ref (priv->client_cache); handler_id = g_signal_connect ( priv->client_cache, "backend-error", G_CALLBACK (task_shell_view_backend_error_cb), task_shell_view); priv->backend_error_handler_id = handler_id; /* Keep our own reference to this so we can * disconnect our signal handlers in dispose(). */ priv->task_table = e_task_shell_content_get_task_table ( E_TASK_SHELL_CONTENT (shell_content)); g_object_ref (priv->task_table); handler_id = g_signal_connect_swapped ( priv->task_table, "open-component", G_CALLBACK (e_task_shell_view_open_task), task_shell_view); priv->open_component_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->task_table, "popup-event", G_CALLBACK (task_shell_view_table_popup_event_cb), task_shell_view); priv->popup_event_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->task_table, "selection-change", G_CALLBACK (e_task_shell_view_update_sidebar), task_shell_view); priv->selection_change_1_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->task_table, "selection-change", G_CALLBACK (e_shell_view_update_actions), task_shell_view); priv->selection_change_2_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->task_table, "status-message", G_CALLBACK (e_task_shell_view_set_status_message), task_shell_view); priv->status_message_handler_id = handler_id; /* Keep our own reference to this so we can * disconnect our signal handlers in dispose(). */ priv->model = e_task_table_get_model (priv->task_table); g_object_ref (priv->model); handler_id = g_signal_connect_swapped ( priv->model, "model-changed", G_CALLBACK (e_task_shell_view_update_sidebar), task_shell_view); priv->model_changed_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->model, "model-rows-deleted", G_CALLBACK (e_task_shell_view_update_sidebar), task_shell_view); priv->model_rows_deleted_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->model, "model-rows-inserted", G_CALLBACK (e_task_shell_view_update_sidebar), task_shell_view); priv->model_rows_inserted_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->model, "row-appended", G_CALLBACK (task_shell_view_model_row_appended_cb), task_shell_view); priv->rows_appended_handler_id = handler_id; /* Keep our own reference to this so we can * disconnect our signal handlers in dispose(). */ priv->selector = e_task_shell_sidebar_get_selector ( E_TASK_SHELL_SIDEBAR (shell_sidebar)); g_object_ref (priv->selector); handler_id = g_signal_connect_swapped ( priv->selector, "popup-event", G_CALLBACK (task_shell_view_selector_popup_event_cb), task_shell_view); priv->selector_popup_event_handler_id = handler_id; handler_id = g_signal_connect_swapped ( priv->selector, "primary-selection-changed", G_CALLBACK (e_shell_view_update_actions), task_shell_view); priv->primary_selection_changed_handler_id = handler_id; e_categories_add_change_hook ( (GHookFunc) e_task_shell_view_update_search_filter, task_shell_view); /* Listen for configuration changes. */ g_settings_bind ( priv->settings, "confirm-purge", shell_view, "confirm-purge", G_SETTINGS_BIND_DEFAULT); /* Keep the ECalModel in sync with the sidebar. */ g_object_bind_property ( shell_sidebar, "default-client", priv->model, "default-client", G_BINDING_SYNC_CREATE); /* Hide Completed Tasks (enable/units/value) */ handler_id = g_signal_connect ( priv->settings, "changed::hide-completed-tasks", G_CALLBACK (task_shell_view_hide_completed_tasks_changed_cb), task_shell_view); priv->settings_hide_completed_tasks_handler_id = handler_id; handler_id = g_signal_connect ( priv->settings, "changed::hide-completed-tasks-units", G_CALLBACK (task_shell_view_hide_completed_tasks_changed_cb), task_shell_view); priv->settings_hide_completed_tasks_units_handler_id = handler_id; handler_id = g_signal_connect ( priv->settings, "changed::hide-completed-tasks-value", G_CALLBACK (task_shell_view_hide_completed_tasks_changed_cb), task_shell_view); priv->settings_hide_completed_tasks_value_handler_id = handler_id; e_task_shell_view_actions_init (task_shell_view); e_task_shell_view_update_sidebar (task_shell_view); e_task_shell_view_update_search_filter (task_shell_view); /* Call this when everything is ready, like actions in * action groups and such. */ task_shell_view_update_timeout_cb (task_shell_view); priv->update_timeout = e_named_timeout_add_full ( G_PRIORITY_LOW, 60000, task_shell_view_update_timeout_cb, task_shell_view, NULL); }