Advertisement
pzoxicuv

Updated Text Wrapper

Nov 16th, 2011
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.92 KB | None | 0 0
  1. /* When enabled, plugin wraps selected text in single/double quotes, parentheses,
  2.  * or square brackets.
  3.  *
  4.  * Build with:
  5.  * gcc -c surroundText.c -fPIC `pkg-config --cflags geany`
  6.  * gcc surroundText.o -o surroundText.so -shared `pkg-config --libs geany`
  7.  *
  8.  */
  9.  
  10. #include <geanyplugin.h>
  11.  
  12. GeanyPlugin *geany_plugin;
  13. GeanyData   *geany_data;
  14. GeanyFunctions  *geany_functions;
  15.  
  16. PLUGIN_VERSION_CHECK (147);
  17. PLUGIN_SET_INFO ("Text Encloser",
  18.     "Upon a keybinding, wraps selected text in characters associated with that keybinding.",
  19.     "0.1", "Alex M.");
  20.    
  21. enum
  22. {
  23.     COLUMN_TITLE,
  24.     COLUMN_PRIOR_CHAR,
  25.     COLUMN_END_CHAR,
  26.     NUM_COLUMNS
  27. };
  28.  
  29. void wrap_text_action (guint);
  30. void configure_response (GtkDialog *, gint, gpointer);
  31. void wrap_chars_changed (GtkCellRendererText *, gchar *, gchar *, gpointer);
  32.  
  33. gchar *wrap_chars [8];
  34. GtkListStore *chars_list;
  35.  
  36. /* Called when a keybinding associated with the plugin is pressed.  Wraps the selected text in
  37.  * the characters associated with this keybinding. */
  38.  
  39. void wrap_text_action (guint key_id)
  40. {
  41.     gint selection_end;
  42.     ScintillaObject *sci_obj = document_get_current()->editor->sci;
  43.    
  44.     if (sci_get_selected_text_length (sci_obj) < 2)
  45.         return;
  46.    
  47.     selection_end = sci_get_selection_end (sci_obj);
  48.    
  49.     sci_start_undo_action (sci_obj);
  50.     sci_insert_text (sci_obj, sci_get_selection_start (sci_obj),
  51.         g_strdup_printf ("%c", *(wrap_chars [key_id])));
  52.     sci_insert_text (sci_obj, selection_end + 1, g_strdup_printf ("%c", *(wrap_chars [key_id]+1)));
  53.     sci_set_current_position (sci_obj, selection_end + 2, TRUE);
  54.     sci_end_undo_action (sci_obj);
  55. }
  56.  
  57. /* Called when the plugin is loaded, tries to load the wrapping characters from the config file */
  58.  
  59. void plugin_init (GeanyData *data)
  60. {  
  61.     GeanyKeyGroup *wrap_text_key_group;
  62.     GKeyFile *config_keys;
  63.     gchar *config_file_name;
  64.     gint i;
  65.    
  66.     config_keys = g_key_file_new ();
  67.     config_file_name = g_strconcat (geany->app->configdir, G_DIR_SEPARATOR_S, "plugins",
  68.         G_DIR_SEPARATOR_S, "Text Wrapper", G_DIR_SEPARATOR_S, "wrapper.conf", NULL);
  69.     g_key_file_load_from_file (config_keys, config_file_name, G_KEY_FILE_NONE, NULL);
  70.    
  71.     wrap_text_key_group = plugin_set_key_group (geany_plugin, "Wrap Text", 8,
  72.         (GeanyKeyGroupCallback) wrap_text_action);
  73.    
  74.     for (i = 0; i < 8; i++)
  75.     {
  76.         wrap_chars [i] = utils_get_setting_string (config_keys, "Text Wrapper",
  77.             g_strdup_printf ("wrap_chars_%d", i), "  ");
  78.         keybindings_set_item (wrap_text_key_group, i, NULL, 0, 0,
  79.             g_strdup_printf ("wrap_%d",i + 1), g_strdup_printf ("Wrap %d", i + 1), NULL);
  80.     }
  81.        
  82.     g_key_file_free (config_keys);
  83.     g_free (config_file_name);
  84. }
  85.  
  86. /* Called when the user closes the plugin preferences dialog.  If the user accepted or ok'd,
  87.  * update the array of wrapping characters and config file with the new wrapping characters */
  88.  
  89. void configure_response (GtkDialog *dialog, gint response, gpointer char_tree_view)
  90. {
  91.     GtkTreeIter char_iter;
  92.     GtkTreeModel *char_tree_model;
  93.     GKeyFile *config_keys;
  94.     gchar *config_file_name, *config_data;
  95.     gchar *prior_char_str, *end_char_str;
  96.     gint i;
  97.    
  98.     if (response != GTK_RESPONSE_OK && response != GTK_RESPONSE_ACCEPT)
  99.     {
  100.         return;
  101.     }
  102.    
  103.     char_tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (char_tree_view));
  104.     gtk_tree_model_get_iter_first (char_tree_model, &char_iter);
  105.    
  106.     config_keys = g_key_file_new ();
  107.     config_file_name = g_strconcat (geany->app->configdir, G_DIR_SEPARATOR_S, "plugins",
  108.         G_DIR_SEPARATOR_S, "Text Wrapper", G_DIR_SEPARATOR_S, "wrapper.conf", NULL);
  109.    
  110.     for (i = 0; i < 8; i++)
  111.     {
  112.         gtk_tree_model_get (char_tree_model, &char_iter,
  113.             COLUMN_PRIOR_CHAR, &prior_char_str, COLUMN_END_CHAR, &end_char_str, -1);
  114.         wrap_chars [i] = g_strdup_printf ("%c%c", prior_char_str [0], end_char_str [0]);
  115.         gtk_tree_model_iter_next (char_tree_model, &char_iter);
  116.        
  117.         g_key_file_set_string (config_keys, "Text Wrapper",
  118.             g_strdup_printf ("wrap_chars_%d", i), wrap_chars [i]);
  119.     }
  120.    
  121.     if (!g_file_test(g_path_get_dirname (config_file_name), G_FILE_TEST_IS_DIR) &&
  122.         utils_mkdir(g_path_get_dirname (config_file_name), TRUE) != 0)
  123.     {
  124.         dialogs_show_msgbox(GTK_MESSAGE_ERROR,
  125.             _("Plugin configuration directory could not be created."));
  126.     }
  127.    
  128.     else
  129.     {
  130.         config_data = g_key_file_to_data (config_keys, NULL, NULL);
  131.         utils_write_file (config_file_name, config_data);
  132.     }
  133.    
  134.     g_free (prior_char_str);
  135.     g_free (end_char_str);
  136.     g_free (config_file_name);
  137.     g_free (config_data);
  138.     g_key_file_free (config_keys);
  139. }
  140.  
  141. /* When the user changes an entry in the preferences dialog, this updates the list of
  142.  * wrapping characters with the new entry */
  143.  
  144. void wrap_chars_changed (GtkCellRendererText *renderer, gchar *path, gchar *new_char,
  145.     gpointer column_num)
  146. {
  147.     GtkTreeIter chars_iter;
  148.     gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (chars_list), &chars_iter, path);
  149.     gtk_list_store_set (chars_list, &chars_iter, GPOINTER_TO_INT (column_num), new_char, -1);
  150. }
  151.  
  152. GtkWidget *plugin_configure (GtkDialog *dialog)
  153. {  
  154.     GtkWidget *vbox;
  155.     GtkTreeIter chars_iter;
  156.     GtkCellRenderer *renderer;
  157.     GtkTreeViewColumn *label_column, *char_one_column, *char_two_column;
  158.     GtkTreeView *chars_tree_view;
  159.     gint i;
  160.    
  161.     vbox = gtk_vbox_new (FALSE, 6);
  162.     chars_list = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
  163.     renderer = gtk_cell_renderer_text_new ();
  164.     chars_tree_view = (GtkTreeView *) gtk_tree_view_new ();
  165.    
  166.     for (i = 0; i < 8; i++)
  167.     {
  168.         gtk_list_store_append (chars_list, &chars_iter);
  169.         gtk_list_store_set (chars_list, &chars_iter,
  170.             COLUMN_TITLE, g_strdup_printf ("Wrap combo %d", i + 1),
  171.             COLUMN_PRIOR_CHAR, g_strdup_printf ("%c", *(wrap_chars [i])),
  172.             COLUMN_END_CHAR, g_strdup_printf ("%c", *(wrap_chars [i] + 1)), -1);
  173.     }
  174.    
  175.     label_column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", 0, NULL);
  176.  
  177.     renderer = gtk_cell_renderer_text_new ();
  178.     g_object_set (renderer, "editable", TRUE, NULL);
  179.     char_one_column = gtk_tree_view_column_new_with_attributes ("Opening Character", renderer,
  180.         "text", COLUMN_PRIOR_CHAR, NULL);
  181.     g_signal_connect (renderer, "edited", G_CALLBACK (wrap_chars_changed),
  182.         GINT_TO_POINTER (COLUMN_PRIOR_CHAR));  
  183.    
  184.     renderer = gtk_cell_renderer_text_new ();
  185.     g_object_set (renderer, "editable", TRUE, NULL);
  186.     char_two_column = gtk_tree_view_column_new_with_attributes ("Closing Character", renderer,
  187.         "text", COLUMN_END_CHAR, NULL);
  188.     g_signal_connect (renderer, "edited", G_CALLBACK (wrap_chars_changed),
  189.         GINT_TO_POINTER (COLUMN_END_CHAR));
  190.        
  191.     gtk_tree_view_append_column (chars_tree_view, label_column);
  192.     gtk_tree_view_append_column (chars_tree_view, char_one_column);
  193.     gtk_tree_view_append_column (chars_tree_view, char_two_column);
  194.     gtk_tree_view_set_model (chars_tree_view, GTK_TREE_MODEL (chars_list));
  195.  
  196.     gtk_container_add (GTK_CONTAINER (vbox), (GtkWidget *) chars_tree_view);
  197.     g_signal_connect (dialog, "response", G_CALLBACK (configure_response), chars_tree_view);
  198.    
  199.     return vbox;
  200. }
  201.  
  202. void plugin_cleanup (void)
  203. {
  204.    
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement