1 /*
2  *      ao_copyfilepath.c - this file is part of Addons, a Geany plugin
3  *
4  *      Copyright 2015 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
5  *
6  *      This program is free software; you can redistribute it and/or modify
7  *      it under the terms of the GNU General Public License as published by
8  *      the Free Software Foundation; either version 2 of the License, or
9  *      (at your option) any later version.
10  *
11  *      This program is distributed in the hope that it will be useful,
12  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *      GNU General Public License for more details.
15  *
16  *      You should have received a copy of the GNU General Public License
17  *      along with this program; if not, write to the Free Software
18  *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  */
21 
22 #ifdef HAVE_CONFIG_H
23 	#include "config.h"
24 #endif
25 #include <geanyplugin.h>
26 
27 #include "addons.h"
28 #include "ao_copyfilepath.h"
29 
30 
31 typedef struct _AoCopyFilePathPrivate			AoCopyFilePathPrivate;
32 
33 #define AO_COPY_FILE_PATH_GET_PRIVATE(obj)		(G_TYPE_INSTANCE_GET_PRIVATE((obj),\
34 			AO_COPY_FILE_PATH_TYPE, AoCopyFilePathPrivate))
35 
36 struct _AoCopyFilePath
37 {
38 	GObject parent;
39 };
40 
41 struct _AoCopyFilePathClass
42 {
43 	GObjectClass parent_class;
44 };
45 
46 struct _AoCopyFilePathPrivate
47 {
48 	GtkWidget *tools_menu_item;
49 };
50 
51 
52 
53 static void ao_copy_file_path_finalize(GObject *object);
54 
55 
G_DEFINE_TYPE(AoCopyFilePath,ao_copy_file_path,G_TYPE_OBJECT)56 G_DEFINE_TYPE(AoCopyFilePath, ao_copy_file_path, G_TYPE_OBJECT)
57 
58 
59 
60 static void ao_copy_file_path_class_init(AoCopyFilePathClass *klass)
61 {
62 	GObjectClass *g_object_class;
63 
64 	g_object_class = G_OBJECT_CLASS(klass);
65 
66 	g_object_class->finalize = ao_copy_file_path_finalize;
67 
68 	g_type_class_add_private(klass, sizeof(AoCopyFilePathPrivate));
69 }
70 
71 
ao_copy_file_path_finalize(GObject * object)72 static void ao_copy_file_path_finalize(GObject *object)
73 {
74 	AoCopyFilePathPrivate *priv = AO_COPY_FILE_PATH_GET_PRIVATE(object);
75 
76 	gtk_widget_destroy(priv->tools_menu_item);
77 
78 	G_OBJECT_CLASS(ao_copy_file_path_parent_class)->finalize(object);
79 }
80 
81 
ao_copy_file_path_get_menu_item(AoCopyFilePath * self)82 GtkWidget* ao_copy_file_path_get_menu_item(AoCopyFilePath *self)
83 {
84 	AoCopyFilePathPrivate *priv = AO_COPY_FILE_PATH_GET_PRIVATE(self);
85 
86 	return priv->tools_menu_item;
87 }
88 
89 
ao_copy_file_path_copy(AoCopyFilePath * self)90 void ao_copy_file_path_copy(AoCopyFilePath *self)
91 {
92 	GeanyDocument *doc;
93 	GtkClipboard *clipboard, *primary;
94 
95 	doc = document_get_current();
96 	if (doc != NULL)
97 	{
98 		gchar *file_name = DOC_FILENAME(doc);
99 		clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
100 		primary = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
101 		gtk_clipboard_set_text(clipboard, file_name, -1);
102 		gtk_clipboard_set_text(primary, file_name, -1);
103 
104 		ui_set_statusbar(TRUE, _("File path \"%s\" copied to clipboard."), file_name);
105 	}
106 }
107 
108 
copy_file_path_activated_cb(GtkMenuItem * item,AoCopyFilePath * self)109 static void copy_file_path_activated_cb(GtkMenuItem *item, AoCopyFilePath *self)
110 {
111 	ao_copy_file_path_copy(self);
112 }
113 
114 
ao_copy_file_path_init(AoCopyFilePath * self)115 static void ao_copy_file_path_init(AoCopyFilePath *self)
116 {
117 	AoCopyFilePathPrivate *priv = AO_COPY_FILE_PATH_GET_PRIVATE(self);
118 
119 	priv->tools_menu_item = ui_image_menu_item_new(GTK_STOCK_COPY, _("Copy File Path"));
120 	gtk_widget_set_tooltip_text(
121 		priv->tools_menu_item,
122 		_("Copy the file path of the current document to the clipboard"));
123 	gtk_widget_show(priv->tools_menu_item);
124 	g_signal_connect(
125 		priv->tools_menu_item,
126 		"activate",
127 		G_CALLBACK(copy_file_path_activated_cb),
128 		self);
129 	gtk_container_add(GTK_CONTAINER(geany->main_widgets->tools_menu), priv->tools_menu_item);
130 
131 	ui_add_document_sensitive(priv->tools_menu_item);
132 }
133 
134 
ao_copy_file_path_new(void)135 AoCopyFilePath *ao_copy_file_path_new(void)
136 {
137 	return g_object_new(AO_COPY_FILE_PATH_TYPE, NULL);
138 }
139