mirror of
https://github.com/GNOME/gedit
synced 2024-07-02 15:58:48 +00:00
947 lines
27 KiB
C
947 lines
27 KiB
C
/*
|
|
* gedit-file-browser-plugin.c - Gedit plugin providing easy file access
|
|
* from the sidepanel
|
|
*
|
|
* Copyright (C) 2006 - Jesse van den Kieboom <jesse@icecrew.nl>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <string.h>
|
|
#include <glib/gi18n-lib.h>
|
|
#include <gmodule.h>
|
|
#include <gedit/gedit-app.h>
|
|
#include <gedit/gedit-commands.h>
|
|
#include <gedit/gedit-debug.h>
|
|
#include <gedit/gedit-window.h>
|
|
#include <gedit/gedit-window-activatable.h>
|
|
#include <gedit/gedit-utils.h>
|
|
#include <tepl/tepl.h>
|
|
|
|
#include "gedit-file-browser-enum-types.h"
|
|
#include "gedit-file-browser-plugin.h"
|
|
#include "gedit-file-browser-utils.h"
|
|
#include "gedit-file-browser-error.h"
|
|
#include "gedit-file-browser-widget.h"
|
|
#include "gedit-file-browser-messages.h"
|
|
|
|
#define FILEBROWSER_BASE_SETTINGS "org.gnome.gedit.plugins.filebrowser"
|
|
#define FILEBROWSER_TREE_VIEW "tree-view"
|
|
#define FILEBROWSER_ROOT "root"
|
|
#define FILEBROWSER_VIRTUAL_ROOT "virtual-root"
|
|
#define FILEBROWSER_ENABLE_REMOTE "enable-remote"
|
|
#define FILEBROWSER_OPEN_AT_FIRST_DOC "open-at-first-doc"
|
|
#define FILEBROWSER_FILTER_MODE "filter-mode"
|
|
#define FILEBROWSER_FILTER_PATTERN "filter-pattern"
|
|
#define FILEBROWSER_BINARY_PATTERNS "binary-patterns"
|
|
|
|
#define NAUTILUS_BASE_SETTINGS "org.gnome.nautilus.preferences"
|
|
#define NAUTILUS_FALLBACK_SETTINGS "org.gnome.gedit.plugins.filebrowser.nautilus"
|
|
#define NAUTILUS_CLICK_POLICY_KEY "click-policy"
|
|
|
|
#define TERMINAL_BASE_SETTINGS "org.gnome.desktop.default-applications.terminal"
|
|
#define TERMINAL_EXEC_KEY "exec"
|
|
|
|
struct _GeditFileBrowserPluginPrivate
|
|
{
|
|
GSettings *settings;
|
|
GSettings *nautilus_settings;
|
|
GSettings *terminal_settings;
|
|
|
|
GeditWindow *window;
|
|
|
|
GeditFileBrowserWidget *tree_widget;
|
|
gboolean auto_root;
|
|
gulong end_loading_handle;
|
|
|
|
guint click_policy_handle;
|
|
|
|
TeplPanelItem *side_panel_item;
|
|
};
|
|
|
|
enum
|
|
{
|
|
PROP_0,
|
|
PROP_WINDOW
|
|
};
|
|
|
|
static void gedit_window_activatable_iface_init (GeditWindowActivatableInterface *iface);
|
|
|
|
static void on_location_activated_cb (GeditFileBrowserWidget *widget,
|
|
GFile *location,
|
|
GeditWindow *window);
|
|
static void on_error_cb (GeditFileBrowserWidget *widget,
|
|
guint code,
|
|
gchar const *message,
|
|
GeditFileBrowserPlugin *plugin);
|
|
static void on_model_set_cb (GeditFileBrowserView *widget,
|
|
GParamSpec *param,
|
|
GeditFileBrowserPlugin *plugin);
|
|
static void on_virtual_root_changed_cb (GeditFileBrowserStore *model,
|
|
GParamSpec *param,
|
|
GeditFileBrowserPlugin *plugin);
|
|
static void on_rename_cb (GeditFileBrowserStore *model,
|
|
GFile *oldfile,
|
|
GFile *newfile,
|
|
GeditWindow *window);
|
|
static void on_tab_added_cb (GeditWindow *window,
|
|
GeditTab *tab,
|
|
GeditFileBrowserPlugin *plugin);
|
|
static gboolean on_confirm_delete_cb (GeditFileBrowserWidget *widget,
|
|
GeditFileBrowserStore *store,
|
|
GList *rows,
|
|
GeditFileBrowserPlugin *plugin);
|
|
static gboolean on_confirm_no_trash_cb (GeditFileBrowserWidget *widget,
|
|
GList *files,
|
|
GeditWindow *window);
|
|
|
|
G_DEFINE_DYNAMIC_TYPE_EXTENDED (GeditFileBrowserPlugin,
|
|
gedit_file_browser_plugin,
|
|
G_TYPE_OBJECT,
|
|
0,
|
|
G_ADD_PRIVATE_DYNAMIC (GeditFileBrowserPlugin)
|
|
G_IMPLEMENT_INTERFACE_DYNAMIC (GEDIT_TYPE_WINDOW_ACTIVATABLE,
|
|
gedit_window_activatable_iface_init) \
|
|
\
|
|
gedit_file_browser_enum_and_flag_register_type (type_module); \
|
|
_gedit_file_bookmarks_store_register_type (type_module); \
|
|
_gedit_file_browser_store_register_type (type_module); \
|
|
_gedit_file_browser_view_register_type (type_module); \
|
|
_gedit_file_browser_widget_register_type (type_module); \
|
|
)
|
|
|
|
static GSettings *
|
|
create_nautilus_gsettings (void)
|
|
{
|
|
GSettings *nautilus_settings = NULL;
|
|
|
|
if (tepl_utils_can_use_gsettings_schema (NAUTILUS_BASE_SETTINGS))
|
|
{
|
|
nautilus_settings = g_settings_new (NAUTILUS_BASE_SETTINGS);
|
|
|
|
if (tepl_utils_can_use_gsettings_key (nautilus_settings, NAUTILUS_CLICK_POLICY_KEY))
|
|
{
|
|
return nautilus_settings;
|
|
}
|
|
}
|
|
|
|
g_clear_object (&nautilus_settings);
|
|
return g_settings_new (NAUTILUS_FALLBACK_SETTINGS);
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_init (GeditFileBrowserPlugin *plugin)
|
|
{
|
|
plugin->priv = gedit_file_browser_plugin_get_instance_private (plugin);
|
|
|
|
plugin->priv->settings = g_settings_new (FILEBROWSER_BASE_SETTINGS);
|
|
plugin->priv->terminal_settings = g_settings_new (TERMINAL_BASE_SETTINGS);
|
|
plugin->priv->nautilus_settings = create_nautilus_gsettings ();
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_dispose (GObject *object)
|
|
{
|
|
GeditFileBrowserPlugin *plugin = GEDIT_FILE_BROWSER_PLUGIN (object);
|
|
|
|
g_clear_object (&plugin->priv->settings);
|
|
g_clear_object (&plugin->priv->nautilus_settings);
|
|
g_clear_object (&plugin->priv->terminal_settings);
|
|
g_clear_object (&plugin->priv->window);
|
|
|
|
G_OBJECT_CLASS (gedit_file_browser_plugin_parent_class)->dispose (object);
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_set_property (GObject *object,
|
|
guint prop_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
GeditFileBrowserPlugin *plugin = GEDIT_FILE_BROWSER_PLUGIN (object);
|
|
|
|
switch (prop_id)
|
|
{
|
|
case PROP_WINDOW:
|
|
plugin->priv->window = GEDIT_WINDOW (g_value_dup_object (value));
|
|
break;
|
|
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_get_property (GObject *object,
|
|
guint prop_id,
|
|
GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
GeditFileBrowserPlugin *plugin = GEDIT_FILE_BROWSER_PLUGIN (object);
|
|
|
|
switch (prop_id)
|
|
{
|
|
case PROP_WINDOW:
|
|
g_value_set_object (value, plugin->priv->window);
|
|
break;
|
|
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void
|
|
on_end_loading_cb (GeditFileBrowserStore *store,
|
|
GtkTreeIter *iter,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
|
|
/* Disconnect the signal */
|
|
g_signal_handler_disconnect (store, priv->end_loading_handle);
|
|
priv->end_loading_handle = 0;
|
|
priv->auto_root = FALSE;
|
|
}
|
|
|
|
static void
|
|
prepare_auto_root (GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
GeditFileBrowserStore *store;
|
|
|
|
priv->auto_root = TRUE;
|
|
|
|
store = gedit_file_browser_widget_get_browser_store (priv->tree_widget);
|
|
|
|
if (priv->end_loading_handle != 0)
|
|
{
|
|
g_signal_handler_disconnect (store, priv->end_loading_handle);
|
|
priv->end_loading_handle = 0;
|
|
}
|
|
|
|
priv->end_loading_handle = g_signal_connect (store,
|
|
"end-loading",
|
|
G_CALLBACK (on_end_loading_cb),
|
|
plugin);
|
|
}
|
|
|
|
static void
|
|
restore_default_location (GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
gchar *root;
|
|
gchar *virtual_root;
|
|
gboolean bookmarks;
|
|
gboolean remote;
|
|
|
|
bookmarks = !g_settings_get_boolean (priv->settings,
|
|
FILEBROWSER_TREE_VIEW);
|
|
|
|
if (bookmarks)
|
|
{
|
|
gedit_file_browser_widget_show_bookmarks (priv->tree_widget);
|
|
return;
|
|
}
|
|
|
|
root = g_settings_get_string (priv->settings,
|
|
FILEBROWSER_ROOT);
|
|
virtual_root = g_settings_get_string (priv->settings,
|
|
FILEBROWSER_VIRTUAL_ROOT);
|
|
|
|
remote = g_settings_get_boolean (priv->settings,
|
|
FILEBROWSER_ENABLE_REMOTE);
|
|
|
|
if (root != NULL && *root != '\0')
|
|
{
|
|
GFile *rootfile;
|
|
GFile *vrootfile;
|
|
|
|
rootfile = g_file_new_for_uri (root);
|
|
vrootfile = g_file_new_for_uri (virtual_root);
|
|
|
|
if (remote || g_file_is_native (rootfile))
|
|
{
|
|
if (virtual_root != NULL && *virtual_root != '\0')
|
|
{
|
|
prepare_auto_root (plugin);
|
|
gedit_file_browser_widget_set_root_and_virtual_root (priv->tree_widget,
|
|
rootfile,
|
|
vrootfile);
|
|
}
|
|
else
|
|
{
|
|
prepare_auto_root (plugin);
|
|
gedit_file_browser_widget_set_root (priv->tree_widget,
|
|
rootfile,
|
|
TRUE);
|
|
}
|
|
}
|
|
|
|
g_object_unref (rootfile);
|
|
g_object_unref (vrootfile);
|
|
}
|
|
|
|
g_free (root);
|
|
g_free (virtual_root);
|
|
}
|
|
|
|
static void
|
|
on_click_policy_changed (GSettings *settings,
|
|
const gchar *key,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
GeditFileBrowserViewClickPolicy policy;
|
|
GeditFileBrowserView *view;
|
|
|
|
policy = g_settings_get_enum (settings, key);
|
|
|
|
view = gedit_file_browser_widget_get_browser_view (priv->tree_widget);
|
|
gedit_file_browser_view_set_click_policy (view, policy);
|
|
}
|
|
|
|
static void
|
|
install_nautilus_prefs (GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
GeditFileBrowserViewClickPolicy policy;
|
|
GeditFileBrowserView *view;
|
|
|
|
/* Get click_policy */
|
|
policy = g_settings_get_enum (priv->nautilus_settings,
|
|
NAUTILUS_CLICK_POLICY_KEY);
|
|
|
|
view = gedit_file_browser_widget_get_browser_view (priv->tree_widget);
|
|
gedit_file_browser_view_set_click_policy (view, policy);
|
|
|
|
priv->click_policy_handle =
|
|
g_signal_connect (priv->nautilus_settings,
|
|
"changed::" NAUTILUS_CLICK_POLICY_KEY,
|
|
G_CALLBACK (on_click_policy_changed),
|
|
plugin);
|
|
}
|
|
|
|
static void
|
|
set_root_from_doc (GeditFileBrowserPlugin *plugin,
|
|
GeditDocument *doc)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
GtkSourceFile *file;
|
|
GFile *location;
|
|
GFile *parent;
|
|
|
|
if (doc == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
file = gedit_document_get_file (doc);
|
|
location = gtk_source_file_get_location (file);
|
|
if (location == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
parent = g_file_get_parent (location);
|
|
|
|
if (parent != NULL)
|
|
{
|
|
gedit_file_browser_widget_set_root (priv->tree_widget,
|
|
parent,
|
|
TRUE);
|
|
|
|
g_object_unref (parent);
|
|
}
|
|
}
|
|
|
|
static void
|
|
set_active_root (GeditFileBrowserWidget *widget,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
set_root_from_doc (plugin,
|
|
gedit_window_get_active_document (plugin->priv->window));
|
|
}
|
|
|
|
static gchar *
|
|
get_terminal (GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
gchar *terminal;
|
|
|
|
terminal = g_settings_get_string (priv->terminal_settings,
|
|
TERMINAL_EXEC_KEY);
|
|
|
|
if (terminal == NULL)
|
|
{
|
|
const gchar *term = g_getenv ("TERM");
|
|
|
|
if (term != NULL)
|
|
terminal = g_strdup (term);
|
|
else
|
|
terminal = g_strdup ("xterm");
|
|
}
|
|
|
|
return terminal;
|
|
}
|
|
|
|
static void
|
|
open_in_terminal (GeditFileBrowserWidget *widget,
|
|
GFile *location,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
if (location)
|
|
{
|
|
gchar *terminal;
|
|
gchar *local;
|
|
gchar *argv[2];
|
|
|
|
terminal = get_terminal (plugin);
|
|
local = g_file_get_path (location);
|
|
|
|
argv[0] = terminal;
|
|
argv[1] = NULL;
|
|
|
|
g_spawn_async (local,
|
|
argv,
|
|
NULL,
|
|
G_SPAWN_SEARCH_PATH,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
g_free (terminal);
|
|
g_free (local);
|
|
}
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_update_state (GeditWindowActivatable *activatable)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = GEDIT_FILE_BROWSER_PLUGIN (activatable)->priv;
|
|
GeditDocument *doc;
|
|
GFile *location = NULL;
|
|
|
|
doc = gedit_window_get_active_document (priv->window);
|
|
|
|
if (doc != NULL)
|
|
{
|
|
TeplFile *file;
|
|
|
|
file = tepl_buffer_get_file (TEPL_BUFFER (doc));
|
|
location = tepl_file_get_location (file);
|
|
}
|
|
|
|
gedit_file_browser_widget_set_active_root_enabled (priv->tree_widget, location != NULL);
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_activate (GeditWindowActivatable *activatable)
|
|
{
|
|
GeditFileBrowserPlugin *plugin = GEDIT_FILE_BROWSER_PLUGIN (activatable);
|
|
GeditFileBrowserPluginPrivate *priv;
|
|
TeplPanel *side_panel;
|
|
GeditFileBrowserStore *store;
|
|
|
|
priv = plugin->priv;
|
|
|
|
priv->tree_widget = GEDIT_FILE_BROWSER_WIDGET (gedit_file_browser_widget_new ());
|
|
|
|
g_signal_connect (priv->tree_widget,
|
|
"location-activated",
|
|
G_CALLBACK (on_location_activated_cb), priv->window);
|
|
|
|
g_signal_connect (priv->tree_widget,
|
|
"error", G_CALLBACK (on_error_cb), plugin);
|
|
|
|
g_signal_connect (priv->tree_widget,
|
|
"confirm-delete",
|
|
G_CALLBACK (on_confirm_delete_cb),
|
|
plugin);
|
|
|
|
g_signal_connect (priv->tree_widget,
|
|
"confirm-no-trash",
|
|
G_CALLBACK (on_confirm_no_trash_cb),
|
|
priv->window);
|
|
|
|
g_signal_connect (priv->tree_widget,
|
|
"open-in-terminal",
|
|
G_CALLBACK (open_in_terminal),
|
|
plugin);
|
|
|
|
g_signal_connect (priv->tree_widget,
|
|
"set-active-root",
|
|
G_CALLBACK (set_active_root),
|
|
plugin);
|
|
|
|
g_settings_bind (priv->settings,
|
|
FILEBROWSER_FILTER_PATTERN,
|
|
priv->tree_widget,
|
|
FILEBROWSER_FILTER_PATTERN,
|
|
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
|
|
|
|
g_clear_object (&priv->side_panel_item);
|
|
priv->side_panel_item = tepl_panel_item_new (GTK_WIDGET (priv->tree_widget),
|
|
"GeditFileBrowserPanel",
|
|
_("File Browser"),
|
|
NULL,
|
|
0);
|
|
|
|
side_panel = gedit_window_get_side_panel (priv->window);
|
|
tepl_panel_add (side_panel, priv->side_panel_item);
|
|
|
|
/* Install nautilus preferences */
|
|
install_nautilus_prefs (plugin);
|
|
|
|
/* Connect signals to store the last visited location */
|
|
g_signal_connect (gedit_file_browser_widget_get_browser_view (priv->tree_widget),
|
|
"notify::model",
|
|
G_CALLBACK (on_model_set_cb),
|
|
plugin);
|
|
|
|
store = gedit_file_browser_widget_get_browser_store (priv->tree_widget);
|
|
|
|
g_settings_bind (priv->settings,
|
|
FILEBROWSER_FILTER_MODE,
|
|
store,
|
|
FILEBROWSER_FILTER_MODE,
|
|
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
|
|
|
|
g_settings_bind (priv->settings,
|
|
FILEBROWSER_BINARY_PATTERNS,
|
|
store,
|
|
FILEBROWSER_BINARY_PATTERNS,
|
|
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
|
|
|
|
g_signal_connect (store,
|
|
"notify::virtual-root",
|
|
G_CALLBACK (on_virtual_root_changed_cb),
|
|
plugin);
|
|
|
|
g_signal_connect (store,
|
|
"rename",
|
|
G_CALLBACK (on_rename_cb),
|
|
priv->window);
|
|
|
|
g_signal_connect (priv->window,
|
|
"tab-added",
|
|
G_CALLBACK (on_tab_added_cb),
|
|
plugin);
|
|
|
|
/* Register messages on the bus */
|
|
gedit_file_browser_messages_register (priv->window, priv->tree_widget);
|
|
|
|
gedit_file_browser_plugin_update_state (activatable);
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_deactivate (GeditWindowActivatable *activatable)
|
|
{
|
|
GeditFileBrowserPlugin *plugin = GEDIT_FILE_BROWSER_PLUGIN (activatable);
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
TeplPanel *side_panel;
|
|
|
|
/* Unregister messages from the bus */
|
|
gedit_file_browser_messages_unregister (priv->window);
|
|
|
|
/* Disconnect signals */
|
|
g_signal_handlers_disconnect_by_func (priv->window,
|
|
G_CALLBACK (on_tab_added_cb),
|
|
plugin);
|
|
|
|
if (priv->click_policy_handle)
|
|
{
|
|
g_signal_handler_disconnect (priv->nautilus_settings,
|
|
priv->click_policy_handle);
|
|
}
|
|
|
|
side_panel = gedit_window_get_side_panel (priv->window);
|
|
tepl_panel_remove (side_panel, priv->side_panel_item);
|
|
g_clear_object (&priv->side_panel_item);
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_class_init (GeditFileBrowserPluginClass *klass)
|
|
{
|
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
|
|
object_class->dispose = gedit_file_browser_plugin_dispose;
|
|
object_class->set_property = gedit_file_browser_plugin_set_property;
|
|
object_class->get_property = gedit_file_browser_plugin_get_property;
|
|
|
|
g_object_class_override_property (object_class, PROP_WINDOW, "window");
|
|
}
|
|
|
|
static void
|
|
gedit_window_activatable_iface_init (GeditWindowActivatableInterface *iface)
|
|
{
|
|
iface->activate = gedit_file_browser_plugin_activate;
|
|
iface->deactivate = gedit_file_browser_plugin_deactivate;
|
|
iface->update_state = gedit_file_browser_plugin_update_state;
|
|
}
|
|
|
|
static void
|
|
gedit_file_browser_plugin_class_finalize (GeditFileBrowserPluginClass *klass)
|
|
{
|
|
}
|
|
|
|
/* Callbacks */
|
|
static void
|
|
on_location_activated_cb (GeditFileBrowserWidget *tree_widget,
|
|
GFile *location,
|
|
GeditWindow *window)
|
|
{
|
|
gedit_commands_load_location (window, location, NULL, 0, 0);
|
|
}
|
|
|
|
static void
|
|
on_error_cb (GeditFileBrowserWidget *tree_widget,
|
|
guint code,
|
|
gchar const *message,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
gchar *title;
|
|
GtkWidget *dlg;
|
|
|
|
/* Do not show the error when the root has been set automatically */
|
|
if (priv->auto_root && (code == GEDIT_FILE_BROWSER_ERROR_SET_ROOT ||
|
|
code == GEDIT_FILE_BROWSER_ERROR_LOAD_DIRECTORY))
|
|
{
|
|
/* Show bookmarks */
|
|
gedit_file_browser_widget_show_bookmarks (priv->tree_widget);
|
|
return;
|
|
}
|
|
|
|
switch (code)
|
|
{
|
|
case GEDIT_FILE_BROWSER_ERROR_NEW_DIRECTORY:
|
|
title = _("An error occurred while creating a new directory");
|
|
break;
|
|
case GEDIT_FILE_BROWSER_ERROR_NEW_FILE:
|
|
title = _("An error occurred while creating a new file");
|
|
break;
|
|
case GEDIT_FILE_BROWSER_ERROR_RENAME:
|
|
title = _("An error occurred while renaming a file or directory");
|
|
break;
|
|
case GEDIT_FILE_BROWSER_ERROR_DELETE:
|
|
title = _("An error occurred while deleting a file or directory");
|
|
break;
|
|
case GEDIT_FILE_BROWSER_ERROR_OPEN_DIRECTORY:
|
|
title = _("An error occurred while opening a directory in the file manager");
|
|
break;
|
|
case GEDIT_FILE_BROWSER_ERROR_SET_ROOT:
|
|
title = _("An error occurred while setting a root directory");
|
|
break;
|
|
case GEDIT_FILE_BROWSER_ERROR_LOAD_DIRECTORY:
|
|
title = _("An error occurred while loading a directory");
|
|
break;
|
|
default:
|
|
title = _("An error occurred");
|
|
break;
|
|
}
|
|
|
|
dlg = gtk_message_dialog_new (GTK_WINDOW (priv->window),
|
|
GTK_DIALOG_MODAL |
|
|
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
|
|
"%s", title);
|
|
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dlg),
|
|
"%s", message);
|
|
|
|
gtk_dialog_run (GTK_DIALOG (dlg));
|
|
gtk_widget_destroy (dlg);
|
|
}
|
|
|
|
static void
|
|
on_model_set_cb (GeditFileBrowserView *widget,
|
|
GParamSpec *param,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
GtkTreeModel *model;
|
|
|
|
model = gtk_tree_view_get_model (GTK_TREE_VIEW (gedit_file_browser_widget_get_browser_view (priv->tree_widget)));
|
|
|
|
if (model == NULL)
|
|
return;
|
|
|
|
g_settings_set_boolean (priv->settings,
|
|
FILEBROWSER_TREE_VIEW,
|
|
GEDIT_IS_FILE_BROWSER_STORE (model));
|
|
}
|
|
|
|
static void
|
|
on_rename_cb (GeditFileBrowserStore *store,
|
|
GFile *oldfile,
|
|
GFile *newfile,
|
|
GeditWindow *window)
|
|
{
|
|
GList *documents;
|
|
GList *item;
|
|
|
|
/* Find all documents and set its uri to newuri where it matches olduri */
|
|
documents = gedit_app_get_documents (GEDIT_APP (g_application_get_default ()));
|
|
|
|
for (item = documents; item; item = item->next)
|
|
{
|
|
GeditDocument *doc;
|
|
GtkSourceFile *source_file;
|
|
GFile *docfile;
|
|
|
|
doc = GEDIT_DOCUMENT (item->data);
|
|
source_file = gedit_document_get_file (doc);
|
|
docfile = gtk_source_file_get_location (source_file);
|
|
|
|
if (docfile == NULL)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (g_file_equal (docfile, oldfile))
|
|
{
|
|
gtk_source_file_set_location (source_file, newfile);
|
|
}
|
|
else
|
|
{
|
|
gchar *relative;
|
|
|
|
relative = g_file_get_relative_path (oldfile, docfile);
|
|
|
|
if (relative != NULL)
|
|
{
|
|
/* Relative now contains the part in docfile without
|
|
the prefix oldfile */
|
|
|
|
docfile = g_file_get_child (newfile, relative);
|
|
|
|
gtk_source_file_set_location (source_file, docfile);
|
|
|
|
g_object_unref (docfile);
|
|
}
|
|
|
|
g_free (relative);
|
|
}
|
|
}
|
|
|
|
g_list_free (documents);
|
|
}
|
|
|
|
static void
|
|
on_virtual_root_changed_cb (GeditFileBrowserStore *store,
|
|
GParamSpec *param,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
GFile *root;
|
|
GFile *virtual_root;
|
|
gchar *uri_root = NULL;
|
|
|
|
root = gedit_file_browser_store_get_root (store);
|
|
|
|
if (!root)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
uri_root = g_file_get_uri (root);
|
|
g_object_unref (root);
|
|
}
|
|
|
|
g_settings_set_string (priv->settings,
|
|
FILEBROWSER_ROOT,
|
|
uri_root);
|
|
|
|
virtual_root = gedit_file_browser_store_get_virtual_root (store);
|
|
|
|
if (!virtual_root)
|
|
{
|
|
/* Set virtual to same as root then */
|
|
g_settings_set_string (priv->settings,
|
|
FILEBROWSER_VIRTUAL_ROOT,
|
|
uri_root);
|
|
}
|
|
else
|
|
{
|
|
gchar *uri_vroot;
|
|
|
|
uri_vroot = g_file_get_uri (virtual_root);
|
|
|
|
g_settings_set_string (priv->settings,
|
|
FILEBROWSER_VIRTUAL_ROOT,
|
|
uri_vroot);
|
|
g_free (uri_vroot);
|
|
g_object_unref (virtual_root);
|
|
}
|
|
|
|
g_signal_handlers_disconnect_by_func (priv->window,
|
|
G_CALLBACK (on_tab_added_cb),
|
|
plugin);
|
|
g_free (uri_root);
|
|
}
|
|
|
|
static void
|
|
on_tab_added_cb (GeditWindow *window,
|
|
GeditTab *tab,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
gboolean open;
|
|
gboolean load_default = TRUE;
|
|
|
|
open = g_settings_get_boolean (priv->settings,
|
|
FILEBROWSER_OPEN_AT_FIRST_DOC);
|
|
|
|
if (open)
|
|
{
|
|
GeditDocument *doc;
|
|
GtkSourceFile *file;
|
|
GFile *location;
|
|
|
|
doc = gedit_tab_get_document (tab);
|
|
file = gedit_document_get_file (doc);
|
|
location = gtk_source_file_get_location (file);
|
|
|
|
if (location != NULL)
|
|
{
|
|
if (g_file_has_uri_scheme (location, "file"))
|
|
{
|
|
prepare_auto_root (plugin);
|
|
set_root_from_doc (plugin, doc);
|
|
load_default = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (load_default)
|
|
restore_default_location (plugin);
|
|
|
|
/* Disconnect this signal, it's only called once */
|
|
g_signal_handlers_disconnect_by_func (window,
|
|
G_CALLBACK (on_tab_added_cb),
|
|
plugin);
|
|
}
|
|
|
|
static gchar *
|
|
get_filename_from_path (GtkTreeModel *model,
|
|
GtkTreePath *path)
|
|
{
|
|
GtkTreeIter iter;
|
|
GFile *location;
|
|
gchar *ret = NULL;
|
|
|
|
if (!gtk_tree_model_get_iter (model, &iter, path))
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
gtk_tree_model_get (model, &iter,
|
|
GEDIT_FILE_BROWSER_STORE_COLUMN_LOCATION, &location,
|
|
-1);
|
|
|
|
if (location)
|
|
{
|
|
ret = gedit_file_browser_utils_file_basename (location);
|
|
g_object_unref (location);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static gboolean
|
|
on_confirm_no_trash_cb (GeditFileBrowserWidget *widget,
|
|
GList *files,
|
|
GeditWindow *window)
|
|
{
|
|
gchar *normal;
|
|
gchar *message;
|
|
gchar *secondary;
|
|
gboolean result;
|
|
|
|
message = _("Cannot move file to trash, do you\nwant to delete permanently?");
|
|
|
|
if (files->next == NULL)
|
|
{
|
|
normal = gedit_file_browser_utils_file_basename (G_FILE (files->data));
|
|
secondary = g_strdup_printf (_("The file “%s” cannot be moved to the trash."), normal);
|
|
g_free (normal);
|
|
}
|
|
else
|
|
{
|
|
secondary = g_strdup (_("The selected files cannot be moved to the trash."));
|
|
}
|
|
|
|
result = gedit_file_browser_utils_confirmation_dialog (window,
|
|
GTK_MESSAGE_QUESTION,
|
|
message,
|
|
secondary,
|
|
_("_Delete"));
|
|
g_free (secondary);
|
|
|
|
return result;
|
|
}
|
|
|
|
static gboolean
|
|
on_confirm_delete_cb (GeditFileBrowserWidget *widget,
|
|
GeditFileBrowserStore *store,
|
|
GList *paths,
|
|
GeditFileBrowserPlugin *plugin)
|
|
{
|
|
GeditFileBrowserPluginPrivate *priv = plugin->priv;
|
|
gchar *normal;
|
|
gchar *message;
|
|
gchar *secondary;
|
|
gboolean result;
|
|
|
|
if (paths->next == NULL)
|
|
{
|
|
normal = get_filename_from_path (GTK_TREE_MODEL (store), (GtkTreePath *)(paths->data));
|
|
message = g_strdup_printf (_("Are you sure you want to permanently delete “%s”?"), normal);
|
|
g_free (normal);
|
|
}
|
|
else
|
|
{
|
|
message = g_strdup (_("Are you sure you want to permanently delete the selected files?"));
|
|
}
|
|
|
|
secondary = _("If you delete an item, it is permanently lost.");
|
|
|
|
result = gedit_file_browser_utils_confirmation_dialog (priv->window,
|
|
GTK_MESSAGE_QUESTION,
|
|
message,
|
|
secondary,
|
|
_("_Delete"));
|
|
|
|
g_free (message);
|
|
|
|
return result;
|
|
}
|
|
|
|
G_MODULE_EXPORT void
|
|
peas_register_types (PeasObjectModule *module)
|
|
{
|
|
gedit_file_browser_plugin_register_type (G_TYPE_MODULE (module));
|
|
|
|
peas_object_module_register_extension_type (module,
|
|
GEDIT_TYPE_WINDOW_ACTIVATABLE,
|
|
GEDIT_TYPE_FILE_BROWSER_PLUGIN);
|
|
}
|
|
|
|
/* ex:set ts=8 noet: */
|