1 /* vi: set sw=4 ts=4 wrap ai: */
2 /*
3  * caja-widget-view-provider.c: This file is part of caja.
4  *
5  * Copyright (C) 2019 Wu Xiaotian <yetist@gmail.com>
6  * Copyright (C) 2019-2021 The MATE developers
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  * */
22 
23 #include <config.h>
24 #include "caja-widget-view-provider.h"
25 
26 #include <glib-object.h>
27 
28 /**
29  * SECTION:caja-widget-view-provider
30  * @title: CajaWidgetViewProvider
31  * @short_description: Interface to provide widgets view.
32  * @include: libcaja-extension/caja-widget-view-provider.h
33  *
34  * #CajaWidgetViewProvider allows extension to provide widgets view
35  * in the file manager.
36  */
37 
38 static void
caja_widget_view_provider_base_init(gpointer g_class)39 caja_widget_view_provider_base_init (gpointer g_class)
40 {
41 }
42 
43 GType
caja_widget_view_provider_get_type(void)44 caja_widget_view_provider_get_type (void)
45 {
46     static GType type = 0;
47 
48     if (!type) {
49         const GTypeInfo info = {
50             sizeof (CajaWidgetViewProviderIface),
51             caja_widget_view_provider_base_init,
52             NULL,
53             NULL,
54             NULL,
55             NULL,
56             0,
57             0,
58             NULL
59         };
60 
61         type = g_type_register_static (G_TYPE_INTERFACE,
62                                        "CajaWidgetViewProvider",
63                                        &info, 0);
64         g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
65     }
66 
67     return type;
68 }
69 
70 /**
71  * caja_widget_view_provider_get_widget:
72  * @provider: a #CajaWidgetViewProvider
73  *
74  * Return a #GtkWidget to show the current location content.
75  *
76  * Returns: The #GtkWidget used to show the contents.
77  **/
78 GtkWidget *
caja_widget_view_provider_get_widget(CajaWidgetViewProvider * provider)79 caja_widget_view_provider_get_widget (CajaWidgetViewProvider *provider)
80 {
81     g_return_val_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider), NULL);
82     g_return_val_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->get_widget != NULL, NULL);
83 
84     return CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->get_widget (provider);
85 }
86 
87 /**
88  * caja_widget_view_provider_add_file:
89  * @provider: a #CajaWidgetViewProvider
90  * @file: add a #CajaFile into the widget view.
91  * @directory: the directory of the file.
92  *
93  * Add a file of this location into the widget view.
94  **/
caja_widget_view_provider_add_file(CajaWidgetViewProvider * provider,CajaFile * file,CajaFile * directory)95 void caja_widget_view_provider_add_file (CajaWidgetViewProvider *provider, CajaFile *file, CajaFile *directory)
96 {
97     g_return_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider));
98     g_return_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->add_file != NULL);
99 
100     CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->add_file (provider, file, directory);
101 }
102 
103 /**
104  * caja_widget_view_provider_set_location:
105  * @provider: a #CajaWidgetViewProvider
106  * @uri: the URI of the location
107  *
108  * Set the location of this #CajaWidgetViewProvider.
109  **/
caja_widget_view_provider_set_location(CajaWidgetViewProvider * provider,const char * location)110 void caja_widget_view_provider_set_location (CajaWidgetViewProvider *provider, const char *location)
111 {
112     g_return_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider));
113     g_return_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->set_location != NULL);
114 
115     CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->set_location (provider, location);
116 }
117 
118 /**
119  * caja_widget_view_provider_set_window:
120  * @provider: a #CajaWidgetViewProvider
121  * @window: parent #GtkWindow
122  *
123  * Set parent #GtkWindow of this #CajaWidgetViewProvider.
124  **/
caja_widget_view_provider_set_window(CajaWidgetViewProvider * provider,GtkWindow * window)125 void caja_widget_view_provider_set_window (CajaWidgetViewProvider *provider, GtkWindow *window)
126 {
127     g_return_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider));
128     g_return_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->set_window != NULL);
129 
130     CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->set_window (provider, window);
131 }
132 
133 /**
134  * caja_widget_view_provider_get_item_count:
135  * @provider: a #CajaWidgetViewProvider
136  *
137  * Return value: The item count of this #CajaWidgetViewProvider
138  **/
caja_widget_view_provider_get_item_count(CajaWidgetViewProvider * provider)139 guint caja_widget_view_provider_get_item_count (CajaWidgetViewProvider *provider)
140 {
141     g_return_val_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider), 0);
142     g_return_val_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->get_item_count != NULL, 0);
143 
144     return CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->get_item_count (provider);
145 }
146 
147 /**
148  * caja_widget_view_provider_get_first_visible_file:
149  * @provider: a #CajaWidgetViewProvider
150  *
151  * Return the first visible file. When use start visit the location, the caja's status is waiting, until
152  * get the first visible file.
153  *
154  * Return value: the first visible file.
155  **/
caja_widget_view_provider_get_first_visible_file(CajaWidgetViewProvider * provider)156 gchar* caja_widget_view_provider_get_first_visible_file (CajaWidgetViewProvider *provider)
157 {
158     g_return_val_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider), NULL);
159     g_return_val_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->get_first_visible_file != NULL, NULL);
160 
161     return CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->get_first_visible_file (provider);
162 }
163 
164 /**
165  * caja_widget_view_provider_clear:
166  * @provider: a #CajaWidgetViewProvider
167  *
168  * Clear the content of this widget view.
169  **/
caja_widget_view_provider_clear(CajaWidgetViewProvider * provider)170 void caja_widget_view_provider_clear (CajaWidgetViewProvider *provider)
171 {
172     g_return_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider));
173     g_return_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->clear != NULL);
174 
175     CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->clear (provider);
176 }
177 
178 /**
179  * caja_widget_view_provider_supports_uri:
180  * @provider: a #CajaWidgetViewProvider
181  * @uri: the location to visit.
182  * @file_type: The #GFileType for the uri
183  * @mime_type: The mimetype for the uri
184  *
185  * Whether this widget view works for the uri.
186  *
187  * Return value: True to use custom widget view, False to ignore, and caja use normal view.
188  **/
caja_widget_view_provider_supports_uri(CajaWidgetViewProvider * provider,const char * uri,GFileType file_type,const char * mime_type)189 gboolean caja_widget_view_provider_supports_uri (CajaWidgetViewProvider *provider,
190                                                  const char *uri,
191                                                  GFileType file_type,
192                                                  const char *mime_type)
193 {
194     g_return_val_if_fail (CAJA_IS_WIDGET_VIEW_PROVIDER (provider), FALSE);
195     g_return_val_if_fail (CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->supports_uri!= NULL, FALSE);
196 
197     return CAJA_WIDGET_VIEW_PROVIDER_GET_IFACE (provider)->supports_uri (provider, uri, file_type, mime_type);
198 }
199