add import/export options
authorMr.LeQuocTuan <Mr.LeQuocTuan@79bd180b-0a32-48ee-ac55-ada8cae9df61>
Wed, 5 Aug 2009 03:42:03 +0000 (03:42 +0000)
committerMr.LeQuocTuan <Mr.LeQuocTuan@79bd180b-0a32-48ee-ac55-ada8cae9df61>
Wed, 5 Aug 2009 03:42:03 +0000 (03:42 +0000)
git-svn-id: svn://localhost/trunk@53 79bd180b-0a32-48ee-ac55-ada8cae9df61

setup/dlg_macro_table.cpp
setup/setup-macro.glade

index 500b17b..b952048 100644 (file)
@@ -14,6 +14,8 @@
 
 enum {COL_KEY = 0, COL_VALUE, NUM_COLS};
 
+
+void check_last_macro_in_list(GtkListStore* list);
 void key_edited_cb (GtkCellRendererText *celltext,
                     const gchar *string_path,
                     const gchar *newkey,
@@ -24,8 +26,8 @@ void value_edited_cb(GtkCellRendererText *celltext,
                      gpointer data);
 void remove_macro_clicked_cb(GtkButton *button, gpointer user_data);
 void removeall_macro_clicked_cb(GtkButton *button, gpointer user_data);
-void check_last_macro_in_list(GtkListStore* list);
-
+void import_macro_clicked_cb(GtkButton *button, gpointer user_data);
+void export_macro_clicked_cb(GtkButton *button, gpointer user_data);
 
 GtkWidget* unikey_macro_dialog_new()
 {
@@ -83,28 +85,28 @@ GtkWidget* unikey_macro_dialog_new()
     // connect signal
     btn = GTK_WIDGET(gtk_builder_get_object(builder, "btn_removeall"));
     g_signal_connect(btn, "clicked", G_CALLBACK(removeall_macro_clicked_cb), tree);
+    // connect signal
+    btn = GTK_WIDGET(gtk_builder_get_object(builder, "btn_import"));
+    g_signal_connect(btn, "clicked", G_CALLBACK(import_macro_clicked_cb), dialog);
+    // connect signal
+    btn = GTK_WIDGET(gtk_builder_get_object(builder, "btn_export"));
+    g_signal_connect(btn, "clicked", G_CALLBACK(export_macro_clicked_cb), dialog);
 
     g_object_unref(builder);
 
     return dialog;
 }
 
-void unikey_macro_dialog_load_macro(GtkDialog* dialog, CMacroTable macro)
+void append_macro_to_list_store(GtkListStore* list, CMacroTable macro)
 {
-    GtkTreeView* tree;
-    GtkListStore* list;
     GtkTreeIter iter;
     gchar key[MAX_MACRO_KEY_LEN*3];
     gchar value[MAX_MACRO_TEXT_LEN*3];
+    gchar* oldkey;
     UKBYTE* p;
     int inLen, maxOutLen;
     int i, ret;
 
-    tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(dialog), "tree_macro"));
-    list = GTK_LIST_STORE(gtk_tree_view_get_model(tree));
-    
-    gtk_list_store_clear(list);
-
     for (i = 0 ; i < macro.getCount(); i++)
     {
         // get key and convert to XUTF charset
@@ -117,6 +119,25 @@ void unikey_macro_dialog_load_macro(GtkDialog* dialog, CMacroTable macro)
         if (ret != 0)
             continue;
 
+        // check if any key same as newkey
+        gboolean b = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
+        while (b)
+        {
+            gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, COL_KEY, &oldkey, -1);
+
+            if (strcasecmp(oldkey, key) == 0)
+            {
+                break;
+            }
+
+            b = gtk_tree_model_iter_next(GTK_TREE_MODEL(list), &iter);
+        }
+        if (b)
+        {
+            continue;
+        }
+        // end check
+
         // get value and convert to XUTF charset
         p = (UKBYTE*)macro.getText(i);
         inLen = -1;
@@ -131,7 +152,20 @@ void unikey_macro_dialog_load_macro(GtkDialog* dialog, CMacroTable macro)
         gtk_list_store_append(list, &iter);
         gtk_list_store_set(list, &iter, COL_KEY, key, COL_VALUE, value, -1);
     }
+}
+
+void unikey_macro_dialog_load_macro(GtkDialog* dialog, CMacroTable macro)
+{
+    GtkTreeView* tree;
+    GtkListStore* list;
+    GtkTreeIter iter;
+
+    tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(dialog), "tree_macro"));
+    list = GTK_LIST_STORE(gtk_tree_view_get_model(tree));
+    
+    gtk_list_store_clear(list);
 
+    append_macro_to_list_store(list, macro);
     check_last_macro_in_list(list);
 
     // select first iter
@@ -167,6 +201,38 @@ void unikey_macro_dialog_save_macro(GtkDialog* dialog, CMacroTable* macro)
     }
 }
 
+void check_last_macro_in_list(GtkListStore* list)
+{
+    GtkTreeIter iter;
+    gchar *key;
+    gint n;
+
+    // get number item in list
+    n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list), NULL);
+
+    if (n > 0)
+    {
+        // get last item
+        gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list), &iter, NULL, n-1);
+
+        // get key of item
+        gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, COL_KEY, &key, -1);
+
+        // if key is value used for NULL item
+        if (strcmp(key, STR_NULL_ITEM) == 0)
+        {
+            return;
+        }
+    }
+
+    // if last item is valid item or no item in list, add new NULL item
+    gtk_list_store_append(list, &iter);
+    gtk_list_store_set(list, &iter,
+                       COL_KEY, STR_NULL_ITEM,
+                       COL_VALUE, STR_NULL_ITEM,
+                       -1);
+}
+
 void key_edited_cb (GtkCellRendererText *celltext,
                     const gchar *string_path,
                     const gchar *newkey,
@@ -295,34 +361,102 @@ void removeall_macro_clicked_cb(GtkButton *button, gpointer data)
     gtk_tree_selection_select_iter(select, &iter);
 }
 
-void check_last_macro_in_list(GtkListStore* list)
+void import_macro_clicked_cb(GtkButton *button, gpointer data)
 {
+    GtkWidget* file;
+    GtkTreeView* tree;
+    GtkListStore* list;
     GtkTreeIter iter;
-    gchar *key;
-    gint n;
+    CMacroTable macro;
+    gchar* fn;
+    int r, n;
 
-    // get number item in list
-    n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list), NULL);
+    file = gtk_file_chooser_dialog_new(_("Choose file to import"),
+                                       GTK_WINDOW(data),
+                                       GTK_FILE_CHOOSER_ACTION_OPEN,
+                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                       GTK_STOCK_OPEN, GTK_RESPONSE_OK,
+                                       NULL);
 
-    if (n > 0)
+    gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
+
+    r = gtk_dialog_run(GTK_DIALOG(file));
+    if (r == GTK_RESPONSE_OK)
     {
-        // get last item
-        gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list), &iter, NULL, n-1);
+        fn = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file));
+        macro.init();
+        macro.loadFromFile(fn);
+        g_free(fn);
 
-        // get key of item
-        gtk_tree_model_get(GTK_TREE_MODEL(list), &iter, COL_KEY, &key, -1);
+        tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(data), "tree_macro"));
+        list = GTK_LIST_STORE(gtk_tree_view_get_model(tree));
 
-        // if key is value used for NULL item
-        if (strcmp(key, STR_NULL_ITEM) == 0)
+        n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(list), NULL);     // get number of iter
+        gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(list), &iter, NULL, n-1); // get last iter
+        gtk_list_store_remove(list, &iter); // remove last iter (...)
+
+        append_macro_to_list_store(list, macro);
+
+        check_last_macro_in_list(list); // add iter (...)
+
+        // select first iter
+        GtkTreeSelection* select = gtk_tree_view_get_selection(tree);
+        gtk_tree_model_get_iter_first(GTK_TREE_MODEL(list), &iter);
+        gtk_tree_selection_select_iter(select, &iter);
+    }
+
+    gtk_widget_destroy(file);
+
+    gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE);
+}
+
+void export_macro_clicked_cb(GtkButton *button, gpointer data)
+{
+    GtkWidget* file;
+    GtkTreeView* tree;
+    GtkTreeModel* model;
+    GtkTreeIter iter;
+    CMacroTable macro;
+    gchar* key, *value;
+    gchar* fn;
+    int r;
+
+    file = gtk_file_chooser_dialog_new(_("Choose file to export"),
+                                       GTK_WINDOW(data),
+                                       GTK_FILE_CHOOSER_ACTION_SAVE,
+                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                       GTK_STOCK_SAVE, GTK_RESPONSE_OK,
+                                       NULL);
+
+    gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE);
+
+    r = gtk_dialog_run(GTK_DIALOG(file));
+    if (r == GTK_RESPONSE_OK)
+    {
+        macro.init();
+
+        tree = GTK_TREE_VIEW(g_object_get_data(G_OBJECT(data), "tree_macro"));
+        model = GTK_TREE_MODEL(gtk_tree_view_get_model(tree));
+
+        gboolean b = gtk_tree_model_get_iter_first(model, &iter);
+        while (b == TRUE)
         {
-            return;
+            gtk_tree_model_get(model, &iter, COL_KEY, &key, COL_VALUE, &value, -1);
+
+            if (strcasecmp(key, STR_NULL_ITEM) != 0)
+            {
+                macro.addItem(key, value, CONV_CHARSET_XUTF8);
+            }
+            b = gtk_tree_model_iter_next(model, &iter);
         }
+
+        fn = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file));
+        macro.writeToFile(fn);
+        g_free(fn);
     }
 
-    // if last item is valid item or no item in list, add new NULL item
-    gtk_list_store_append(list, &iter);
-    gtk_list_store_set(list, &iter,
-                       COL_KEY, STR_NULL_ITEM,
-                       COL_VALUE, STR_NULL_ITEM,
-                       -1);
+    gtk_widget_destroy(file);
+
+    gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE);
 }
+
index 2328e47..5f00ec6 100644 (file)
@@ -54,7 +54,7 @@
                 <property name="spacing">5</property>
                 <child>
                   <object class="GtkButton" id="btn_remove">
-                    <property name="label" translatable="yes">gtk-delete</property>
+                    <property name="label">gtk-delete</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
                     <property name="receives_default">True</property>
                     <property name="position">1</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkHSeparator" id="hseparator1">
+                    <property name="visible">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="btn_import">
+                    <property name="label" translatable="yes">_Import...</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_underline">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="btn_export">
+                    <property name="label" translatable="yes">_Export...</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="use_underline">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
               </object>
               <packing>
                 <property name="expand">False</property>
             <property name="layout_style">end</property>
             <child>
               <object class="GtkButton" id="btn_ok">
-                <property name="label" translatable="yes">gtk-ok</property>
+                <property name="label">gtk-ok</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
             </child>
             <child>
               <object class="GtkButton" id="btn_cancel">
-                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="label">gtk-cancel</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>