7 #include "dlg_macro_table.h"
9 #define _(str) gettext(str)
12 #define STR_NULL_ITEM "..."
13 #define MACRO_DEFAULT_VALUE _("(replace text)")
15 enum {COL_KEY = 0, COL_VALUE, NUM_COLS};
18 void check_last_macro_in_list(GtkListStore* list);
19 void key_edited_cb (GtkCellRendererText *celltext,
20 const gchar *string_path,
23 void value_edited_cb(GtkCellRendererText *celltext,
24 const gchar *string_path,
25 const gchar *newvalue,
27 void remove_macro_clicked_cb(GtkButton *button, gpointer user_data);
28 void removeall_macro_clicked_cb(GtkButton *button, gpointer user_data);
29 void import_macro_clicked_cb(GtkButton *button, gpointer user_data);
30 void export_macro_clicked_cb(GtkButton *button, gpointer user_data);
32 GtkWidget* unikey_macro_dialog_new()
34 GtkBuilder* builder = gtk_builder_new();
36 gtk_builder_add_from_file(builder, GLADE_DATA_DIR "/setup-macro.glade", NULL);
38 GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "dlg_macro_table"));
41 GtkListStore* list = GTK_LIST_STORE(gtk_builder_get_object(builder, "list_macro"));
42 check_last_macro_in_list(list);
44 GtkTreeView* tree = GTK_TREE_VIEW(gtk_builder_get_object(builder, "tree_macro"));
45 g_object_set_data(G_OBJECT(dialog), "tree_macro", tree);
47 GtkTreeViewColumn* col;
48 GtkCellRenderer* render;
51 render = gtk_cell_renderer_text_new();
54 "width-chars", MAX_MACRO_KEY_LEN+8,
56 g_signal_connect(render, "edited", G_CALLBACK(key_edited_cb), tree);
57 col = gtk_tree_view_column_new_with_attributes(_("Word"),
62 gtk_tree_view_column_set_resizable(col, TRUE);
63 gtk_tree_view_append_column(tree, col);
65 // create value column
66 render = gtk_cell_renderer_text_new();
70 g_signal_connect(render, "edited", G_CALLBACK(value_edited_cb), tree);
71 col = gtk_tree_view_column_new_with_attributes(_("Replace with"),
76 gtk_tree_view_column_set_resizable(col, TRUE);
77 gtk_tree_view_append_column(tree, col);
82 btn = GTK_WIDGET(gtk_builder_get_object(builder, "btn_remove"));
83 g_signal_connect(btn, "clicked", G_CALLBACK(remove_macro_clicked_cb), tree);
86 btn = GTK_WIDGET(gtk_builder_get_object(builder, "btn_removeall"));
87 g_signal_connect(btn, "clicked", G_CALLBACK(removeall_macro_clicked_cb), tree);
89 btn = GTK_WIDGET(gtk_builder_get_object(builder, "btn_import"));
90 g_signal_connect(btn, "clicked", G_CALLBACK(import_macro_clicked_cb), dialog);
92 btn = GTK_WIDGET(gtk_builder_get_object(builder, "btn_export"));
93 g_signal_connect(btn, "clicked", G_CALLBACK(export_macro_clicked_cb), dialog);
95 g_object_unref(builder);
100 void append_macro_to_list_store(GtkListStore* list, CMacroTable macro)
103 gchar key[MAX_MACRO_KEY_LEN*3];
104 gchar value[MAX_MACRO_TEXT_LEN*3];
107 int inLen, maxOutLen;
110 for (i = 0 ; i < macro.getCount(); i++)
112 // get key and convert to XUTF charset
113 p = (UKBYTE*)macro.getKey(i);
115 maxOutLen = sizeof(key);
116 ret = VnConvert(CONV_CHARSET_VNSTANDARD, CONV_CHARSET_XUTF8,
122 // check if any key same as newkey
123 gboolean b = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
126 gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, COL_KEY, &oldkey, -1);
128 if (strcasecmp(oldkey, key) == 0)
133 b = gtk_tree_model_iter_next(GTK_TREE_MODEL(list), &iter);
141 // get value and convert to XUTF charset
142 p = (UKBYTE*)macro.getText(i);
144 maxOutLen = sizeof(value);
145 ret = VnConvert(CONV_CHARSET_VNSTANDARD, CONV_CHARSET_XUTF8,
151 // append to liststore
152 gtk_list_store_append(list, &iter);
153 gtk_list_store_set(list, &iter, COL_KEY, key, COL_VALUE, value, -1);
157 void unikey_macro_dialog_load_macro(GtkDialog* dialog, CMacroTable macro)
163 tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(dialog), "tree_macro"));
164 list = GTK_LIST_STORE(gtk_tree_view_get_model(tree));
166 gtk_list_store_clear(list);
168 append_macro_to_list_store(list, macro);
169 check_last_macro_in_list(list);
172 GtkTreeSelection* select = gtk_tree_view_get_selection(tree);
173 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
174 gtk_tree_selection_select_iter(select, &iter);
177 void unikey_macro_dialog_save_macro(GtkDialog* dialog, CMacroTable* macro)
185 macro->resetContent();
187 tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(dialog), "tree_macro"));
188 model = GTK_TREE_MODEL(gtk_tree_view_get_model(tree));
190 b = gtk_tree_model_get_iter_first(model, &iter);
193 gtk_tree_model_get(model, &iter, COL_KEY, &key, COL_VALUE, &value, -1);
195 if (strcasecmp(key, STR_NULL_ITEM) != 0)
197 macro->addItem(key, value, CONV_CHARSET_XUTF8);
200 b = gtk_tree_model_iter_next(model, &iter);
204 void check_last_macro_in_list(GtkListStore* list)
210 // get number item in list
211 n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list), NULL);
216 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list), &iter, NULL, n-1);
219 gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, COL_KEY, &key, -1);
221 // if key is value used for NULL item
222 if (strcmp(key, STR_NULL_ITEM) == 0)
228 // if last item is valid item or no item in list, add new NULL item
229 gtk_list_store_append(list, &iter);
230 gtk_list_store_set(list, &iter,
231 COL_KEY, STR_NULL_ITEM,
232 COL_VALUE, STR_NULL_ITEM,
236 void key_edited_cb (GtkCellRendererText *celltext,
237 const gchar *string_path,
244 gchar *key, *oldkey, *oldvalue;
245 gchar nkey[MAX_MACRO_KEY_LEN];
248 tree = GTK_TREE_VIEW(data);
249 model = gtk_tree_view_get_model(tree);
251 strncpy(nkey, newkey, MAX_MACRO_KEY_LEN-1);
252 nkey[MAX_MACRO_KEY_LEN-1] = '\0';
254 if (strcmp(nkey, STR_NULL_ITEM) == 0
255 || (strlen(STR_NULL_ITEM) != 0 && strlen(nkey) == 0))
260 // check if any key same as newkey
261 b = gtk_tree_model_get_iter_first(model, &iter);
264 gtk_tree_model_get(model, &iter, COL_KEY, &key, -1);
265 if (strcasecmp(key, nkey) == 0)
270 b = gtk_tree_model_iter_next(model, &iter);
274 // get iter of newkey
275 gtk_tree_model_get_iter_from_string(model, &iter, string_path);
276 // get old value of that iter
277 gtk_tree_model_get(model, &iter, COL_KEY, &oldkey, COL_VALUE, &oldvalue, -1);
279 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_KEY, nkey, -1);
281 if (strcmp(oldkey, STR_NULL_ITEM) == 0)
283 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_VALUE, MACRO_DEFAULT_VALUE);
286 check_last_macro_in_list(GTK_LIST_STORE(model));
289 void value_edited_cb(GtkCellRendererText *celltext,
290 const gchar *string_path,
291 const gchar *newvalue,
298 gchar value[MAX_MACRO_TEXT_LEN];
300 tree = GTK_TREE_VIEW(data);
301 model = gtk_tree_view_get_model(tree);
303 gtk_tree_model_get_iter_from_string(model, &iter, string_path);
305 gtk_tree_model_get(model, &iter, COL_KEY, &key, -1);
307 strncpy(value, newvalue, MAX_MACRO_TEXT_LEN-1);
308 value[MAX_MACRO_TEXT_LEN-1] = '\0';
310 if (strcmp(key, STR_NULL_ITEM) != 0)
312 gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_VALUE, value, -1);
316 void remove_macro_clicked_cb(GtkButton *button, gpointer user_data)
318 GtkTreeView *treeview;
320 GtkTreeSelection*select;
324 treeview = GTK_TREE_VIEW(user_data);
326 select = gtk_tree_view_get_selection(treeview);
328 list = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
330 if (gtk_tree_selection_get_selected(select, NULL, &iter) == TRUE)
332 gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, COL_KEY, &key, -1);
334 if (strcmp(key, STR_NULL_ITEM) != 0)
336 gtk_list_store_remove(list, &iter);
339 gtk_tree_selection_select_iter(select, &iter); // select current index
343 void removeall_macro_clicked_cb(GtkButton *button, gpointer data)
348 GtkTreeSelection* select;
350 tree = GTK_TREE_VIEW(data);
351 list = GTK_LIST_STORE(gtk_tree_view_get_model(tree));
353 gtk_list_store_clear(list);
355 check_last_macro_in_list(list);
357 select = gtk_tree_view_get_selection(tree);
359 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
361 gtk_tree_selection_select_iter(select, &iter);
364 void import_macro_clicked_cb(GtkButton *button, gpointer data)
374 file = gtk_file_chooser_dialog_new(_("Choose file to import"),
376 GTK_FILE_CHOOSER_ACTION_OPEN,
377 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
378 GTK_STOCK_OPEN, GTK_RESPONSE_OK,
381 gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
383 r = gtk_dialog_run(GTK_DIALOG(file));
384 if (r == GTK_RESPONSE_OK)
386 fn = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file));
388 macro.loadFromFile(fn);
391 tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(data), "tree_macro"));
392 list = GTK_LIST_STORE(gtk_tree_view_get_model(tree));
394 n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list), NULL); // get number of iter
395 gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list), &iter, NULL, n-1); // get last iter
396 gtk_list_store_remove(list, &iter); // remove last iter (...)
398 append_macro_to_list_store(list, macro);
400 check_last_macro_in_list(list); // add iter (...)
403 GtkTreeSelection* select = gtk_tree_view_get_selection(tree);
404 gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
405 gtk_tree_selection_select_iter(select, &iter);
408 gtk_widget_destroy(file);
410 gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE);
413 void export_macro_clicked_cb(GtkButton *button, gpointer data)
424 file = gtk_file_chooser_dialog_new(_("Choose file to export"),
426 GTK_FILE_CHOOSER_ACTION_SAVE,
427 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
428 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
431 gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
433 r = gtk_dialog_run(GTK_DIALOG(file));
434 if (r == GTK_RESPONSE_OK)
438 tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(data), "tree_macro"));
439 model = GTK_TREE_MODEL(gtk_tree_view_get_model(tree));
441 gboolean b = gtk_tree_model_get_iter_first(model, &iter);
444 gtk_tree_model_get(model, &iter, COL_KEY, &key, COL_VALUE, &value, -1);
446 if (strcasecmp(key, STR_NULL_ITEM) != 0)
448 macro.addItem(key, value, CONV_CHARSET_XUTF8);
450 b = gtk_tree_model_iter_next(model, &iter);
453 fn = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file));
454 macro.writeToFile(fn);
458 gtk_widget_destroy(file);
460 gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE);