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