예제 #1
0
static void
on_log_view_drag_data_get (GtkWidget *log_view, 
                           GdkDragContext *drag_context,
                           GtkSelectionData *data,
                           guint info, guint time,
                           GitLogPane *self)
{
	GtkTreeSelection *selection;
	GtkTreeIter iter;
	GitRevision *revision;
	gchar *sha;

	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (log_view));

	if (gtk_tree_selection_count_selected_rows (selection) > 0)
	{
		gtk_tree_selection_get_selected (selection, NULL, &iter);

		gtk_tree_model_get (GTK_TREE_MODEL (self->priv->log_model), &iter, 
		                    0, &revision, -1);
		
		sha = git_revision_get_sha (revision);

		gtk_selection_data_set_text (data, sha, -1);

		g_object_unref (revision);
		g_free (sha);
	}
}
예제 #2
0
void
on_commit_diff_button_clicked (GtkAction *action, Git *plugin)
{
	GitRevision *revision;
	gchar *sha;
	gchar *short_sha;
	gchar *editor_name;
	IAnjutaDocumentManager *document_manager;
	IAnjutaEditor *editor;
	GitDiffTreeCommand *diff_command;
	
	revision = git_log_pane_get_selected_revision (GIT_LOG_PANE (plugin->log_pane));
	
	if (revision)
	{
		sha = git_revision_get_sha (revision);
		short_sha = git_revision_get_short_sha (revision);
		/* Translators: file name for an existing commits diff, %s is an SHASUM of a commit */
		editor_name = g_strdup_printf (_("Commit %s.diff"), short_sha);
		
		document_manager = anjuta_shell_get_interface (ANJUTA_PLUGIN (plugin)->shell,
													   IAnjutaDocumentManager, 
													   NULL);
		editor = ianjuta_document_manager_add_buffer (document_manager, 
													  editor_name,
													  "", NULL);
		
		diff_command = git_diff_tree_command_new (plugin->project_root_directory,
												  sha);
		
		g_signal_connect (G_OBJECT (diff_command), "data-arrived",
						  G_CALLBACK (git_pane_send_raw_output_to_editor),
						  editor);
		
		g_signal_connect (G_OBJECT (diff_command), "command-finished",
						  G_CALLBACK (git_pane_report_errors),
						  plugin);

		g_signal_connect (G_OBJECT (diff_command), "command-finished",
						  G_CALLBACK (g_object_unref),
						  NULL);

		
		anjuta_command_start (ANJUTA_COMMAND (diff_command));

		g_object_unref (revision);
		g_free (sha);
		g_free (short_sha);
		g_free (editor_name);
	}
	else
		anjuta_util_dialog_error (NULL, _("No revision selected"));
}
예제 #3
0
void
on_log_menu_git_create_branch (GtkAction *action, Git *plugin)
{
	GitRevision *revision;
	gchar *sha;
	
	revision = git_log_get_selected_revision (plugin);
	
	if (revision)
	{
		sha = git_revision_get_sha (revision);
		
		create_branch_dialog (plugin, sha);
		g_free (sha);
	}
}
예제 #4
0
void
on_git_log_reset_activated (GtkAction *action, Git *plugin)
{
	GitRevision *revision;
	gchar *sha;
	AnjutaDockPane *pane;

	revision = git_log_pane_get_selected_revision (GIT_LOG_PANE (plugin->log_pane));

	if (revision)
	{
		sha = git_revision_get_sha (revision);
		pane = git_reset_pane_new_with_sha (plugin, sha);

		add_pane (pane, plugin);

		g_free (sha);
		g_object_unref (revision);
	}
}
예제 #5
0
static void
ref_icon_cell_function (GtkTreeViewColumn *column, GtkCellRenderer *renderer,
						GtkTreeModel *model, GtkTreeIter *iter, 
						GitLogPane *self)
{
	GitRevision *revision;
	gchar *sha;
	
	gtk_tree_model_get (model, iter, LOG_COL_REVISION, &revision, -1);
	sha = git_revision_get_sha (revision);
	
	g_object_unref (revision);
	
	if (g_hash_table_lookup_extended (self->priv->refs, sha, NULL, NULL))
		g_object_set (renderer, "stock-id", GTK_STOCK_INFO, NULL);
	else
		g_object_set (renderer, "stock-id", NULL, NULL);
	
	g_free (sha);
}
예제 #6
0
static gboolean
on_log_view_row_selected (GtkTreeSelection *selection, 
                          GtkTreeModel *model,
                          GtkTreePath *path, 
                          gboolean path_currently_selected,
                          GitLogPane *self)
{
	Git *plugin;
	GtkTreeIter iter;
	GitRevision *revision;
	gchar *sha;
	
	if (!path_currently_selected)
	{
		plugin = ANJUTA_PLUGIN_GIT (anjuta_dock_pane_get_plugin (ANJUTA_DOCK_PANE (self)));

		gtk_tree_model_get_iter (model, &iter, path);
		gtk_tree_model_get (model, &iter, LOG_COL_REVISION, &revision, -1);
		sha = git_revision_get_sha (revision);

		/* Unref the previous command if it's still running. */
		if (self->priv->log_message_command)
			g_object_unref (self->priv->log_message_command);

		self->priv->log_message_command =
			git_log_message_command_new (plugin->project_root_directory, sha);
		
		g_free (sha);
		g_object_unref (revision);
		
		g_signal_connect_object (G_OBJECT (self->priv->log_message_command), "command-finished",
		                         G_CALLBACK (on_log_message_command_finished),
		                         self, 0);
		
		anjuta_command_start (ANJUTA_COMMAND (self->priv->log_message_command));
	}
	
	return TRUE;
}
예제 #7
0
static gboolean
on_log_view_query_tooltip (GtkWidget *log_view, gint x, gint y,
                           gboolean keyboard_mode, GtkTooltip *tooltip,
                           GitLogPane *self)
{
	gboolean ret;
	GtkTreeViewColumn *ref_icon_column;
	gint bin_x;
	gint bin_y;
	GtkTreeViewColumn *current_column;
	GtkTreePath *path;
	GtkTreeModel *model;
	GtkTreeIter iter;
	GitRevision *revision;
	gchar *sha;
	GList *ref_list;
	GList *current_ref;
	GString *tooltip_string;
	gchar *ref_name;
	GitRefType ref_type;
	
	ret = FALSE;
	
	ref_icon_column = gtk_tree_view_get_column (GTK_TREE_VIEW (log_view), 0);
	
	gtk_tree_view_convert_widget_to_bin_window_coords (GTK_TREE_VIEW (log_view),
													   x, y, &bin_x, &bin_y);
	if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (log_view), bin_x, 
									   bin_y, &path, &current_column, NULL, 
	                                   NULL))
	{
		/* We need to be in the ref icon column */
		if (current_column == ref_icon_column)
		{
			model = gtk_tree_view_get_model (GTK_TREE_VIEW (log_view));
			gtk_tree_model_get_iter (model, &iter, path);

			gtk_tree_model_get (model, &iter, LOG_COL_REVISION, &revision, -1);
			sha = git_revision_get_sha (revision);

			g_object_unref (revision);

			ref_list = g_hash_table_lookup (self->priv->refs, sha);
			g_free (sha);

			if (ref_list)
			{
				current_ref = ref_list;
				tooltip_string = g_string_new ("");

				while (current_ref)
				{
					ref_name = git_ref_get_name (GIT_REF (current_ref->data));
					ref_type = git_ref_get_ref_type (GIT_REF (current_ref->data));

					if (tooltip_string->len > 0)
						g_string_append (tooltip_string, "\n");

					switch (ref_type)
					{
						case GIT_REF_TYPE_BRANCH:
							g_string_append_printf (tooltip_string,
							                        _("<b>Branch:</b> %s"),
							                        ref_name );
							break;
						case GIT_REF_TYPE_TAG:
							g_string_append_printf (tooltip_string,
							                        _("<b>Tag:</b> %s"),
							                        ref_name);
							break;
						case GIT_REF_TYPE_REMOTE:
							g_string_append_printf (tooltip_string,
							                        _("<b>Remote:</b> %s"),
							                        ref_name);
							break;
						default:
							break;
					}

					g_free (ref_name);
					current_ref = g_list_next (current_ref);
				}

				gtk_tooltip_set_markup (tooltip, tooltip_string->str);
				g_string_free (tooltip_string, TRUE);

				ret = TRUE;
			}
		}

		gtk_tree_path_free (path);
	}
	
	return ret;	
}