Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* When enabled, plugin wraps selected text in single/double quotes, parentheses,
- * or square brackets.
- *
- * Build with:
- * gcc -c surroundText.c -fPIC `pkg-config --cflags geany`
- * gcc surroundText.o -o surroundText.so -shared `pkg-config --libs geany`
- *
- */
- #include <geanyplugin.h>
- GeanyPlugin *geany_plugin;
- GeanyData *geany_data;
- GeanyFunctions *geany_functions;
- PLUGIN_VERSION_CHECK (147);
- PLUGIN_SET_INFO ("Text Encloser",
- "Upon a keybinding, wraps selected text in characters associated with that keybinding.",
- "0.1", "Alex M.");
- enum
- {
- COLUMN_TITLE,
- COLUMN_PRIOR_CHAR,
- COLUMN_END_CHAR,
- NUM_COLUMNS
- };
- void wrap_text_action (guint);
- void configure_response (GtkDialog *, gint, gpointer);
- void wrap_chars_changed (GtkCellRendererText *, gchar *, gchar *, gpointer);
- gchar *wrap_chars [8];
- GtkListStore *chars_list;
- /* Called when a keybinding associated with the plugin is pressed. Wraps the selected text in
- * the characters associated with this keybinding. */
- void wrap_text_action (guint key_id)
- {
- gint selection_end;
- ScintillaObject *sci_obj = document_get_current()->editor->sci;
- if (sci_get_selected_text_length (sci_obj) < 2)
- return;
- selection_end = sci_get_selection_end (sci_obj);
- sci_start_undo_action (sci_obj);
- sci_insert_text (sci_obj, sci_get_selection_start (sci_obj),
- g_strdup_printf ("%c", *(wrap_chars [key_id])));
- sci_insert_text (sci_obj, selection_end + 1, g_strdup_printf ("%c", *(wrap_chars [key_id]+1)));
- sci_set_current_position (sci_obj, selection_end + 2, TRUE);
- sci_end_undo_action (sci_obj);
- }
- /* Called when the plugin is loaded, tries to load the wrapping characters from the config file */
- void plugin_init (GeanyData *data)
- {
- GeanyKeyGroup *wrap_text_key_group;
- GKeyFile *config_keys;
- gchar *config_file_name;
- gint i;
- config_keys = g_key_file_new ();
- config_file_name = g_strconcat (geany->app->configdir, G_DIR_SEPARATOR_S, "plugins",
- G_DIR_SEPARATOR_S, "Text Wrapper", G_DIR_SEPARATOR_S, "wrapper.conf", NULL);
- g_key_file_load_from_file (config_keys, config_file_name, G_KEY_FILE_NONE, NULL);
- wrap_text_key_group = plugin_set_key_group (geany_plugin, "Wrap Text", 8,
- (GeanyKeyGroupCallback) wrap_text_action);
- for (i = 0; i < 8; i++)
- {
- wrap_chars [i] = utils_get_setting_string (config_keys, "Text Wrapper",
- g_strdup_printf ("wrap_chars_%d", i), " ");
- keybindings_set_item (wrap_text_key_group, i, NULL, 0, 0,
- g_strdup_printf ("wrap_%d",i + 1), g_strdup_printf ("Wrap %d", i + 1), NULL);
- }
- g_key_file_free (config_keys);
- g_free (config_file_name);
- }
- /* Called when the user closes the plugin preferences dialog. If the user accepted or ok'd,
- * update the array of wrapping characters and config file with the new wrapping characters */
- void configure_response (GtkDialog *dialog, gint response, gpointer char_tree_view)
- {
- GtkTreeIter char_iter;
- GtkTreeModel *char_tree_model;
- GKeyFile *config_keys;
- gchar *config_file_name, *config_data;
- gchar *prior_char_str, *end_char_str;
- gint i;
- if (response != GTK_RESPONSE_OK && response != GTK_RESPONSE_ACCEPT)
- {
- return;
- }
- char_tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (char_tree_view));
- gtk_tree_model_get_iter_first (char_tree_model, &char_iter);
- config_keys = g_key_file_new ();
- config_file_name = g_strconcat (geany->app->configdir, G_DIR_SEPARATOR_S, "plugins",
- G_DIR_SEPARATOR_S, "Text Wrapper", G_DIR_SEPARATOR_S, "wrapper.conf", NULL);
- for (i = 0; i < 8; i++)
- {
- gtk_tree_model_get (char_tree_model, &char_iter,
- COLUMN_PRIOR_CHAR, &prior_char_str, COLUMN_END_CHAR, &end_char_str, -1);
- wrap_chars [i] = g_strdup_printf ("%c%c", prior_char_str [0], end_char_str [0]);
- gtk_tree_model_iter_next (char_tree_model, &char_iter);
- g_key_file_set_string (config_keys, "Text Wrapper",
- g_strdup_printf ("wrap_chars_%d", i), wrap_chars [i]);
- }
- if (!g_file_test(g_path_get_dirname (config_file_name), G_FILE_TEST_IS_DIR) &&
- utils_mkdir(g_path_get_dirname (config_file_name), TRUE) != 0)
- {
- dialogs_show_msgbox(GTK_MESSAGE_ERROR,
- _("Plugin configuration directory could not be created."));
- }
- else
- {
- config_data = g_key_file_to_data (config_keys, NULL, NULL);
- utils_write_file (config_file_name, config_data);
- }
- g_free (prior_char_str);
- g_free (end_char_str);
- g_free (config_file_name);
- g_free (config_data);
- g_key_file_free (config_keys);
- }
- /* When the user changes an entry in the preferences dialog, this updates the list of
- * wrapping characters with the new entry */
- void wrap_chars_changed (GtkCellRendererText *renderer, gchar *path, gchar *new_char,
- gpointer column_num)
- {
- GtkTreeIter chars_iter;
- gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (chars_list), &chars_iter, path);
- gtk_list_store_set (chars_list, &chars_iter, GPOINTER_TO_INT (column_num), new_char, -1);
- }
- GtkWidget *plugin_configure (GtkDialog *dialog)
- {
- GtkWidget *vbox;
- GtkTreeIter chars_iter;
- GtkCellRenderer *renderer;
- GtkTreeViewColumn *label_column, *char_one_column, *char_two_column;
- GtkTreeView *chars_tree_view;
- gint i;
- vbox = gtk_vbox_new (FALSE, 6);
- chars_list = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
- renderer = gtk_cell_renderer_text_new ();
- chars_tree_view = (GtkTreeView *) gtk_tree_view_new ();
- for (i = 0; i < 8; i++)
- {
- gtk_list_store_append (chars_list, &chars_iter);
- gtk_list_store_set (chars_list, &chars_iter,
- COLUMN_TITLE, g_strdup_printf ("Wrap combo %d", i + 1),
- COLUMN_PRIOR_CHAR, g_strdup_printf ("%c", *(wrap_chars [i])),
- COLUMN_END_CHAR, g_strdup_printf ("%c", *(wrap_chars [i] + 1)), -1);
- }
- label_column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", 0, NULL);
- renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "editable", TRUE, NULL);
- char_one_column = gtk_tree_view_column_new_with_attributes ("Opening Character", renderer,
- "text", COLUMN_PRIOR_CHAR, NULL);
- g_signal_connect (renderer, "edited", G_CALLBACK (wrap_chars_changed),
- GINT_TO_POINTER (COLUMN_PRIOR_CHAR));
- renderer = gtk_cell_renderer_text_new ();
- g_object_set (renderer, "editable", TRUE, NULL);
- char_two_column = gtk_tree_view_column_new_with_attributes ("Closing Character", renderer,
- "text", COLUMN_END_CHAR, NULL);
- g_signal_connect (renderer, "edited", G_CALLBACK (wrap_chars_changed),
- GINT_TO_POINTER (COLUMN_END_CHAR));
- gtk_tree_view_append_column (chars_tree_view, label_column);
- gtk_tree_view_append_column (chars_tree_view, char_one_column);
- gtk_tree_view_append_column (chars_tree_view, char_two_column);
- gtk_tree_view_set_model (chars_tree_view, GTK_TREE_MODEL (chars_list));
- gtk_container_add (GTK_CONTAINER (vbox), (GtkWidget *) chars_tree_view);
- g_signal_connect (dialog, "response", G_CALLBACK (configure_response), chars_tree_view);
- return vbox;
- }
- void plugin_cleanup (void)
- {
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement