2006-12-05 [wwp] 2.6.1cvs5
authorTristan Chabredier <wwp@claws-mail.org>
Tue, 5 Dec 2006 14:59:26 +0000 (14:59 +0000)
committerTristan Chabredier <wwp@claws-mail.org>
Tue, 5 Dec 2006 14:59:26 +0000 (14:59 +0000)
* src/message_search.c
* src/summary_search.c
* src/gtk/combobox.c
* src/gtk/combobox.h
* src/gtk/gtkutils.c
* src/gtk/gtkutils.h
make up and down arrow keys in modern gtk_combo_box_entry widgets
behave like w/ old comboboxes (summary and message search only).

ChangeLog
PATCHSETS
configure.ac
src/gtk/combobox.c
src/gtk/combobox.h
src/gtk/gtkutils.c
src/gtk/gtkutils.h
src/message_search.c
src/summary_search.c

index 9f05252e76d9704683c8ff4036f6986995da5218..668d256571a16afdbb320b323491affe230d3998 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-12-05 [wwp]       2.6.1cvs5
+
+       * src/message_search.c
+       * src/summary_search.c
+       * src/gtk/combobox.c
+       * src/gtk/combobox.h
+       * src/gtk/gtkutils.c
+       * src/gtk/gtkutils.h
+               make up and down arrow keys in modern gtk_combo_box_entry widgets
+               behave like w/ old comboboxes (summary and message search only).
+
 2006-12-05 [paul]      2.6.1cvs4
 
        * src/wizard.c
index 6dbbdd891f8c3302f3be2691a4f16e613034bd29..eb49cab735feba6d7b65772f2f411bd326b8990d 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.382.2.338 -r 1.382.2.339 src/compose.c;  ) > 2.6.1cvs2.patchset
 ( cvs diff -u -r 1.30.2.14 -r 1.30.2.15 tools/README;  cvs diff -u -r 1.1.2.1 -r 1.1.2.2 tools/textviewer.pl;  ) > 2.6.1cvs3.patchset
 ( cvs diff -u -r 1.1.2.39 -r 1.1.2.40 src/wizard.c;  ) > 2.6.1cvs4.patchset
+( cvs diff -u -r 1.3.12.20 -r 1.3.12.21 src/message_search.c;  cvs diff -u -r 1.15.2.38 -r 1.15.2.39 src/summary_search.c;  cvs diff -u -r 1.1.2.3 -r 1.1.2.4 src/gtk/combobox.c;  cvs diff -u -r 1.1.2.3 -r 1.1.2.4 src/gtk/combobox.h;  cvs diff -u -r 1.5.2.45 -r 1.5.2.46 src/gtk/gtkutils.c;  cvs diff -u -r 1.4.2.27 -r 1.4.2.28 src/gtk/gtkutils.h;  ) > 2.6.1cvs5.patchset
index fd0eefa90141f1b70053b61e6bb360bdb0ec84c3..379662d1efcf03ca7dd5443239332906c0e12ef9 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=6
 MICRO_VERSION=1
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=4
+EXTRA_VERSION=5
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index 517040eac78d6e42a26577586b84ed668f15401a..d92f717a275e2619dea70439788efaa96f5c772e 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <glib.h>
 #include <glib/gi18n.h>
+#include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
 #include <utils.h>
 
@@ -104,3 +105,59 @@ void combobox_set_popdown_strings(GtkComboBox *combobox,
        for (cur = list; cur != NULL; cur = g_list_next(cur))
                gtk_combo_box_append_text(combobox, (const gchar*) cur->data);
 }
+
+gboolean combobox_set_value_from_arrow_key(GtkComboBox *combobox,
+                                guint keyval)
+/* used from key_press events upon gtk_combo_box_entry with one text column 
+   (gtk_combo_box_new_text() and with GtkComboBoxEntry's for instance),
+   make sure that up and down arrow keys behave the same as old with old
+   gtk_combo widgets:
+    when pressing Up:
+         if the current text in entry widget is not found in combo list,
+           get last value from combo list
+         if the current text in entry widget exists in combo list,
+           get prev value from combo list
+    when pressing Down:
+         if the current text in entry widget is not found in combo list,
+           get first value from combo list
+         if the current text in entry widget exists in combo list,
+           get next value from combo list
+*/
+{
+       gboolean valid = FALSE;
+
+       g_return_val_if_fail(combobox != NULL, FALSE);
+
+       /* reproduce the behaviour of old gtk_combo_box */
+       GtkTreeModel *model = gtk_combo_box_get_model(combobox);
+       GtkTreeIter iter;
+
+       if (gtk_combo_box_get_active_iter(combobox, &iter)) {
+               /* if current text is in list, get prev or next one */
+
+               if (keyval == GDK_Up)
+                       valid = gtkut_tree_model_text_iter_prev(model, &iter,
+                                               gtk_combo_box_get_active_text(combobox));
+               else
+               if (keyval == GDK_Down)
+                       valid = gtk_tree_model_iter_next(model, &iter);
+
+               if (valid)
+                       gtk_combo_box_set_active_iter(combobox, &iter);
+
+       } else {
+               /* current text is not in list, get first or next one */
+
+               if (keyval == GDK_Up)
+                       valid = gtkut_tree_model_get_iter_last(model, &iter);
+               else
+               if (keyval == GDK_Down)
+                       valid = gtk_tree_model_get_iter_first(model, &iter);
+
+               if (valid)
+                       gtk_combo_box_set_active_iter(combobox, &iter);
+       }
+
+       /* return TRUE if value could be set */
+       return valid;
+}
index c3a9c186aac47a099b33379bb4a6924fb8fbbffc..2d8e8d317c61bfef1f900f5d9079ac94e08765f8 100644 (file)
@@ -41,5 +41,7 @@ gint combobox_get_active_data (GtkComboBox            *combobox);
 void combobox_unset_popdown_strings(GtkComboBox                *combobox);
 void combobox_set_popdown_strings(GtkComboBox          *combobox,
                                 GList       *list);
+gboolean combobox_set_value_from_arrow_key(GtkComboBox *combobox,
+                                guint keyval);
 
 #endif /* __COMBOBOX_H__ */
index 85c637225da80ede8efc9af1131ea52d96fb400f..9659f8200e090260588e659a9615860bb00ec4d9 100644 (file)
@@ -1482,3 +1482,58 @@ void gtkutils_scroll_one_line(GtkWidget *widget, GtkAdjustment *vadj, gboolean u
                }
        }
 }
+
+gboolean gtkut_tree_model_text_iter_prev(GtkTreeModel *model,
+                                GtkTreeIter *iter,
+                                const gchar* text)
+/* do the same as gtk_tree_model_iter_next, but _prev instead.
+   to use with widgets with one text column (gtk_combo_box_new_text()
+   and with GtkComboBoxEntry's for instance),
+*/
+{
+       GtkTreeIter cur_iter;
+       gchar *cur_value;
+       gboolean valid;
+       gint count;
+
+       g_return_val_if_fail(model != NULL, FALSE);
+       g_return_val_if_fail(iter != NULL, FALSE);
+
+       if (text == NULL || *text == '\0')
+               return FALSE;
+
+       valid = gtk_tree_model_get_iter_first(model, &cur_iter);
+       count = 0;
+       while (valid) {
+               gtk_tree_model_get(model, &cur_iter, 0, &cur_value, -1);
+
+               if (strcmp(text, cur_value) == 0) {
+                       if (count <= 0)
+                               return FALSE;
+
+                       return gtk_tree_model_iter_nth_child(model, iter, NULL, count - 1);
+               }
+
+               valid = gtk_tree_model_iter_next(model, &cur_iter);
+               count++;
+       }
+       return FALSE;           
+}
+
+gboolean gtkut_tree_model_get_iter_last(GtkTreeModel *model,
+                                GtkTreeIter *iter)
+/* do the same as gtk_tree_model_get_iter_first, but _last instead.
+*/
+{
+       gint count;
+
+       g_return_val_if_fail(model != NULL, FALSE);
+       g_return_val_if_fail(iter != NULL, FALSE);
+
+       count = gtk_tree_model_iter_n_children(model, NULL);
+
+       if (count <= 0)
+               return FALSE;
+
+       return gtk_tree_model_iter_nth_child(model, iter, NULL, count - 1);
+}
index 3523b1a67e376e7939200afd9b7cc2414e3ea9c7..e4b0ad5dbab180d9f314ed71c535c7a1a38b0cf1 100644 (file)
@@ -34,6 +34,7 @@
 #include <gtk/gtkcombo.h>
 #include <gtk/gtktextview.h>
 #include <gtk/gtkitemfactory.h>
+#include <gtk/gtktreemodel.h>
 #include <stdlib.h>
 #if HAVE_WCHAR_H
 #  include <wchar.h>
@@ -225,4 +226,11 @@ void gtkutils_scroll_one_line      (GtkWidget *widget,
 gboolean gtkutils_scroll_page  (GtkWidget *widget, 
                                 GtkAdjustment *vadj, 
                                 gboolean up);
+
+gboolean gtkut_tree_model_text_iter_prev(GtkTreeModel *model,
+                                GtkTreeIter *iter,
+                                const gchar* text);
+gboolean gtkut_tree_model_get_iter_last(GtkTreeModel *model,
+                                GtkTreeIter *iter);
+
 #endif /* __GTKUTILS_H__ */
index 7cf63bff24d6b7be03995294c835438a2a0b391b..d4015164cdf754e0d19938cee9d084029f2c5e5b 100644 (file)
@@ -389,8 +389,19 @@ static void message_search_next_clicked(GtkButton *button, gpointer data)
 static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
                            gpointer data)
 {
-       if (event && event->keyval == GDK_Escape)
+       if (event && (event->keyval == GDK_Escape)) {
                gtk_widget_hide(search_window.window);
+       }
+
+       if (event && (event->keyval == GDK_Down || event->keyval == GDK_Up)) {
+               if (search_window.body_entry_has_focus) {
+                       combobox_set_value_from_arrow_key(
+                                       GTK_COMBO_BOX(search_window.body_entry),
+                                       event->keyval);
+                       return TRUE;
+               }
+       }
+
        return FALSE;
 }
 
index cf2c44379867a1383c3f754eee51472803a94ca8..ba5148d8c1f7b9e2fa8ba325582a0dd607b91571 100644 (file)
@@ -948,7 +948,7 @@ static gboolean adv_condition_entry_focus_evt_out(GtkWidget *widget, GdkEventFoc
 static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
                            gpointer data)
 {
-       if (event && event->keyval == GDK_Escape) {
+       if (event && (event->keyval == GDK_Escape)) {
                /* ESC key will:
                        - stop a running search
                        - close the search window if no search is running
@@ -959,5 +959,39 @@ static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
                        search_window.is_searching = FALSE;
                }
        }
+
+       if (event && (event->keyval == GDK_Down || event->keyval == GDK_Up)) {
+               if (search_window.from_entry_has_focus) {
+                       combobox_set_value_from_arrow_key(
+                                       GTK_COMBO_BOX(search_window.from_entry),
+                                       event->keyval);
+                       return TRUE;
+               }
+               if (search_window.to_entry_has_focus) {
+                       combobox_set_value_from_arrow_key(
+                                       GTK_COMBO_BOX(search_window.to_entry),
+                                       event->keyval);
+                       return TRUE;
+               }
+               if (search_window.subject_entry_has_focus) {
+                       combobox_set_value_from_arrow_key(
+                                       GTK_COMBO_BOX(search_window.subject_entry),
+                                       event->keyval);
+                       return TRUE;
+               }
+               if (search_window.body_entry_has_focus) {
+                       combobox_set_value_from_arrow_key(
+                                       GTK_COMBO_BOX(search_window.body_entry),
+                                       event->keyval);
+                       return TRUE;
+               }
+               if (search_window.adv_condition_entry_has_focus) {
+                       combobox_set_value_from_arrow_key(
+                                       GTK_COMBO_BOX(search_window.adv_condition_entry),
+                                       event->keyval);
+                       return TRUE;
+               }
+       }
+
        return FALSE;
 }