292 lines
10 KiB
C
Raw Normal View History

2014-08-16 04:35:41 -05:00
#include <geanyplugin.h>
#include <gdk/gdkkeysyms.h>
#include <string.h>
extern const gchar *tools;
static GtkWidget *scrollable, *tree, *title, *saveCheckbox, *menuCheckbox,
*shortcutCheckbox, *outputCombo, *editButton, *shortcutButton;
static GtkTreeStore *list, *outputs;
static GtkTreeIter row;
static GtkDialog *configDialog;
static Tool* get_active_tool()
{
GtkTreeSelection *selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
GtkTreeIter iter;
GtkTreeModel *model;
if(gtk_tree_selection_get_selected(selected, &model, &iter)) {
Tool *tool;
gtk_tree_model_get(model, &iter, 0, &tool, -1);
return tool;
}
else {
return NULL;
}
}
static void selected_changed(GtkTreeView *view, gpointer data)
{
Tool* tool = get_active_tool();
if(tool == NULL) {
gtk_widget_set_sensitive(GTK_WIDGET(title), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(saveCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(menuCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(shortcutCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(shortcutCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(outputCombo), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(editButton), FALSE);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(saveCheckbox), FALSE);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menuCheckbox), FALSE);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(shortcutCheckbox), FALSE);
gtk_entry_set_text(GTK_ENTRY(title), "");
}
else {
gtk_widget_set_sensitive(GTK_WIDGET(title), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(saveCheckbox), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(menuCheckbox), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(shortcutCheckbox), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(shortcutCheckbox), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(outputCombo), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(editButton), TRUE);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(saveCheckbox), tool->save);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menuCheckbox), tool->menu);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(shortcutCheckbox), tool->shortcut);
gtk_combo_box_set_active(GTK_COMBO_BOX(outputCombo), tool->output == -1 ? 0 : tool->output);
gtk_entry_set_text(GTK_ENTRY(title), tool->name);
}
}
static void combo_changed(GtkComboBox *combo, gpointer data)
{
Tool* tool = get_active_tool();
if(tool != NULL) {
GtkTreeIter iter;
gint value;
GtkTreeModel *model;
if(gtk_combo_box_get_active_iter(combo, &iter)) {
model = gtk_combo_box_get_model(combo);
gtk_tree_model_get(model, &iter, 1, &value, -1);
}
tool->output = value;
}
}
static int add_tool(Tool *tool)
{
gtk_tree_store_append(list, &row, NULL);
gtk_tree_store_set(list, &row, 0, tool, -1);
}
static int add_output(gchar *label, gint value)
{
gtk_tree_store_append(outputs, &row, NULL);
gtk_tree_store_set(outputs, &row, 0, label, 1, value, -1);
}
static void delete_tool(GtkButton *button, gpointer data)
{
GtkTreeSelection *selected = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
GtkTreeIter iter;
GtkTreeModel *model;
if(gtk_tree_selection_get_selected(selected, &model, &iter))
{
Tool *tool;
gtk_tree_model_get(model, &iter, 0, &tool, -1);
g_remove(tool->id);
free_tool(tool, TRUE);
gtk_tree_selection_unselect_iter(selected, &iter);
gtk_tree_store_remove(list, &iter);
}
}
static void new_tool_entry(GtkButton *button, gpointer data)
{
Tool *tool = new_tool();
add_tool(tool);
}
static void cell_data(GtkTreeViewColumn *tree_column, GtkCellRenderer *render,
GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
{
Tool *tool;
gtk_tree_model_get(model, iter, 0, &tool, -1);
g_object_set(render, "text", tool->name, NULL);
}
static void toggle_checkbox(GtkToggleButton *checkbox, gpointer data)
{
Tool* tool = get_active_tool();
if(tool != NULL) {
gboolean value = gtk_toggle_button_get_active(checkbox);
gint property = GPOINTER_TO_INT(data);
switch(property) {
case SAVE:
tool->save = value;
break;
case MENU:
tool->menu = value;
break;
case SHORTCUT:
tool->shortcut = value;
break;
}
}
}
static GtkWidget* checkbox(const gchar *label, const gchar *tooltip, gchar *key)
{
GtkWidget *check = gtk_check_button_new_with_label(_(label));
ui_widget_set_tooltip_text(check, _(tooltip));
g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(toggle_checkbox), key);
return check;
}
static void dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
{
GtkTreeIter iter;
gboolean valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
while(valid)
{
Tool *tool;
gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, 0, &tool, -1);
save_tool(tool);
valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(list), &iter);
}
//Remove all shortcuts to tools from the UI for a refresh:
clean_tools();
//We need to re-establish all of the tools in the UI:
reload_tools();
}
static gboolean on_change(GtkWidget *entry, GdkEventKey *event, gpointer user_data)
{
Tool* tool = get_active_tool();
if(tool != NULL) {
g_free(tool->name);
tool->name = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
}
return FALSE;
}
static void on_edit(GtkButton* button, gpointer data)
{
Tool* tool = get_active_tool();
gtk_dialog_response(configDialog, GTK_RESPONSE_OK);
document_open_file(tool->id, FALSE, NULL, NULL);
}
static void on_shortcut(GtkButton* button, gpointer data)
{
Tool* tool = get_active_tool();
gtk_dialog_response(configDialog, GTK_RESPONSE_OK);
keybindings_dialog_show_prefs_scroll("External Tools");
}
GtkWidget* plugin_configure(GtkDialog *dialog)
{
configDialog = dialog;
GtkCellRenderer *render;
GtkWidget* vbox = gtk_vbox_new(FALSE, 6);
GtkWidget* hbox = gtk_hbox_new(FALSE, 6);
GtkWidget* hboxButtons = gtk_hbox_new(FALSE, 6);
GtkWidget* settingsBox = gtk_vbox_new(FALSE, 6);
GtkWidget* buttonBox = gtk_hbox_new(FALSE, 6);
//Tools (left half):
list = gtk_tree_store_new(1, G_TYPE_POINTER);
tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list));
render = gtk_cell_renderer_text_new();
GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("Tool Name", render, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE);
gtk_tree_view_column_set_cell_data_func(column, render,
(GtkTreeCellDataFunc)cell_data, NULL, NULL);
scrollable = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollable),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrollable), tree);
GtkTreeSelection *select = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
g_signal_connect(G_OBJECT(select), "changed",
G_CALLBACK(selected_changed), NULL);
GtkWidget* delete = gtk_button_new_with_label("Delete");
GtkWidget* new = gtk_button_new_with_label("New");
g_signal_connect(delete, "clicked", G_CALLBACK(delete_tool), NULL);
g_signal_connect(new, "clicked", G_CALLBACK(new_tool_entry), NULL);
gtk_box_pack_start(GTK_BOX(buttonBox), delete, FALSE, FALSE, 10);
gtk_box_pack_end(GTK_BOX(buttonBox), new, FALSE, FALSE, 10);
gtk_box_pack_start(GTK_BOX(vbox), scrollable, TRUE, TRUE, 10);
gtk_box_pack_start(GTK_BOX(vbox), buttonBox, FALSE, FALSE, 10);
//Properties (right half):
gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 10);
outputs = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT);
outputCombo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(outputs));
GtkCellRenderer *cell = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(outputCombo), cell, TRUE );
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(outputCombo), cell, "text", 0, NULL );
add_output(_("None"), TOOL_OUTPUT_NONE);
add_output(_("Message Text"), TOOL_OUTPUT_MESSAGE_TEXT);
add_output(_("Message Table"), TOOL_OUTPUT_MESSAGE_TABLE);
add_output(_("Replace Selected"), TOOL_OUTPUT_REPLACE_SELECTED);
add_output(_("Replace Line"), TOOL_OUTPUT_REPLACE_LINE);
add_output(_("Replace Word"), TOOL_OUTPUT_REPLACE_WORD);
add_output(_("Append Current Document"), TOOL_OUTPUT_APPEND_CURRENT_DOCUMENT);
add_output(_("New Document"), TOOL_OUTPUT_NEW_DOCUMENT);
g_signal_connect(G_OBJECT(outputCombo), "changed", G_CALLBACK(combo_changed), NULL);
saveCheckbox = checkbox("Save", "Should the active document be saved when this tool is run?", GINT_TO_POINTER(SAVE));
menuCheckbox = checkbox("Menu", "Should there be a menu for this tool?", GINT_TO_POINTER(MENU));
shortcutCheckbox = checkbox("Shortcut", "Should there be a keyboard shortcut for this tool?", GINT_TO_POINTER(SHORTCUT));
title = gtk_entry_new();
g_signal_connect(title, "focus-out-event", G_CALLBACK(on_change), NULL);
gtk_box_pack_start(GTK_BOX(settingsBox), title, FALSE, FALSE, 2);
gtk_box_pack_start(GTK_BOX(settingsBox), saveCheckbox, FALSE, FALSE, 10);
gtk_box_pack_start(GTK_BOX(settingsBox), menuCheckbox, FALSE, FALSE, 10);
gtk_box_pack_start(GTK_BOX(settingsBox), shortcutCheckbox, FALSE, FALSE, 10);
gtk_box_pack_start(GTK_BOX(settingsBox), outputCombo, FALSE, FALSE, 10);
editButton = gtk_button_new_with_label(_("Edit"));
g_signal_connect(editButton, "clicked", G_CALLBACK(on_edit), NULL);
gtk_box_pack_start(GTK_BOX(hboxButtons), editButton, TRUE, TRUE, 2);
shortcutButton = gtk_button_new_with_label(_("Shortcut"));
g_signal_connect(shortcutButton, "clicked", G_CALLBACK(on_shortcut), NULL);
gtk_box_pack_start(GTK_BOX(hboxButtons), shortcutButton, TRUE, TRUE, 2);
gtk_box_pack_start(GTK_BOX(settingsBox), hboxButtons, FALSE, FALSE, 10);
gtk_box_pack_end(GTK_BOX(hbox), settingsBox, TRUE, TRUE, 10);
gtk_widget_show_all(hbox);
g_signal_connect(dialog, "response", G_CALLBACK(dialog_response), NULL);
load_tools(add_tool);
gtk_widget_set_sensitive(GTK_WIDGET(title), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(saveCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(menuCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(shortcutCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(shortcutCheckbox), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(editButton), FALSE);
return hbox;
}