aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--addressbook/ChangeLog12
-rw-r--r--addressbook/gui/component/Makefile.am5
-rw-r--r--addressbook/gui/component/addressbook.c89
-rw-r--r--addressbook/gui/component/alphabet.glade382
-rw-r--r--addressbook/gui/component/alphabet.glade.h34
-rw-r--r--addressbook/gui/minicard/e-minicard-view.c30
-rw-r--r--addressbook/gui/minicard/e-minicard-view.h2
-rw-r--r--addressbook/gui/minicard/e-reflow-sorted.c33
-rw-r--r--addressbook/gui/minicard/e-reflow-sorted.h1
-rw-r--r--addressbook/gui/widgets/alphabet.glade382
-rw-r--r--addressbook/gui/widgets/alphabet.glade.h34
-rw-r--r--addressbook/gui/widgets/e-minicard-view.c30
-rw-r--r--addressbook/gui/widgets/e-minicard-view.h2
-rw-r--r--widgets/e-reflow/e-reflow-sorted.c33
-rw-r--r--widgets/e-reflow/e-reflow-sorted.h1
15 files changed, 1057 insertions, 13 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog
index a793e505c1..4583ad3b0e 100644
--- a/addressbook/ChangeLog
+++ b/addressbook/ChangeLog
@@ -1,5 +1,17 @@
2000-05-30 Christopher James Lahey <clahey@helixcode.com>
+ * gui/component/Makefile.am: Added alphabet.glade and
+ alphabet.glade.h.
+
+ * gui/component/addressbook.c, gui/component/alphabet.glade,
+ gui/component/alphabet.glade.h: Added an alphabet bar.
+
+ * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard-view.h,
+ gui/minicard/e-reflow-sorted.c, gui/minicard/e-reflow-sorted.h:
+ Added the ability to just to a particular spot in the reflow.
+
+2000-05-30 Christopher James Lahey <clahey@helixcode.com>
+
* printing/Makefile.am: Added BONOBO_GNOME_CFLAGS to CPPFLAGS.
2000-05-30 Christopher James Lahey <clahey@helixcode.com>
diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am
index 0958528daf..370265e019 100644
--- a/addressbook/gui/component/Makefile.am
+++ b/addressbook/gui/component/Makefile.am
@@ -69,12 +69,13 @@ gnorba_DATA = addressbook.gnorba
endif
gladedir = $(datadir)/evolution/glade
-glade_DATA = ldap-server-dialog.glade ldap-server-dialog.glade.h
+glade_DATA = ldap-server-dialog.glade ldap-server-dialog.glade.h alphabet.glade
EXTRA_DIST = \
$(glade_DATA) \
addressbook.gnorba \
- addressbook.oafinfo
+ addressbook.oafinfo \
+ alphabet.glade.h
if ENABLE_PURIFY
PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c
index dab940d088..a128648d76 100644
--- a/addressbook/gui/component/addressbook.c
+++ b/addressbook/gui/component/addressbook.c
@@ -50,7 +50,7 @@ typedef struct {
AddressbookViewType view_type;
EBook *book;
GtkWidget *vbox;
- GtkWidget *minicard_vbox;
+ GtkWidget *minicard_hbox;
GtkWidget *canvas;
GnomeCanvasItem *view;
GnomeCanvasItem *rect;
@@ -639,23 +639,84 @@ teardown_minicard_view (AddressbookView *view)
gtk_object_destroy(GTK_OBJECT(view->view));
view->view = NULL;
}
- if (view->minicard_vbox) {
- gtk_widget_destroy(view->minicard_vbox);
- view->minicard_vbox = NULL;
+ if (view->minicard_hbox) {
+ gtk_widget_destroy(view->minicard_hbox);
+ view->minicard_hbox = NULL;
}
view->canvas = NULL;
}
+typedef struct {
+ AddressbookView *view;
+ char letter;
+} LetterClosure;
+
+static void
+jump_to_letter(GtkWidget *button, LetterClosure *closure)
+{
+ if (closure->view->view)
+ e_minicard_view_jump_to_letter(E_MINICARD_VIEW(closure->view->view), closure->letter);
+}
+
+static void
+free_closure(GtkWidget *button, LetterClosure *closure)
+{
+ g_free(closure);
+}
+
+static void
+connect_button (AddressbookView *view, GladeXML *gui, char letter)
+{
+ char *name;
+ GtkWidget *button;
+ LetterClosure *closure;
+ name = g_strdup_printf("button-%c", letter);
+ button = glade_xml_get_widget(gui, name);
+ g_free(name);
+ if (!button)
+ return;
+ closure = g_new(LetterClosure, 1);
+ closure->view = view;
+ closure->letter = letter;
+ gtk_signal_connect(GTK_OBJECT(button), "clicked",
+ GTK_SIGNAL_FUNC(jump_to_letter), closure);
+ gtk_signal_connect(GTK_OBJECT(button), "destroy",
+ GTK_SIGNAL_FUNC(free_closure), closure);
+}
+
+static GtkWidget *
+create_alphabet (AddressbookView *view)
+{
+ GtkWidget *widget;
+ char letter;
+ GladeXML *gui = glade_xml_new (EVOLUTION_GLADEDIR "/alphabet.glade", NULL);
+
+ widget = glade_xml_get_widget(gui, "scrolledwindow-top");
+ if (!widget) {
+ return NULL;
+ }
+
+ connect_button(view, gui, '1');
+ for (letter = 'a'; letter <= 'z'; letter ++) {
+ connect_button(view, gui, letter);
+ }
+ return widget;
+}
+
static void
create_minicard_view (AddressbookView *view, char *initial_query)
{
GtkWidget *scrollbar;
+ GtkWidget *vbox;
+ GtkWidget *alphabet;
gtk_widget_push_visual (gdk_rgb_get_visual ());
gtk_widget_push_colormap (gdk_rgb_get_cmap ());
- view->minicard_vbox = gtk_vbox_new(FALSE, 0);
+ view->minicard_hbox = gtk_hbox_new(FALSE, 0);
+
+ vbox = gtk_vbox_new(FALSE, 0);
view->canvas = e_canvas_new();
view->rect = gnome_canvas_item_new(
@@ -683,16 +744,26 @@ create_minicard_view (AddressbookView *view, char *initial_query)
0, 0,
100, 100 );
- gtk_box_pack_start(GTK_BOX(view->minicard_vbox), view->canvas, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), view->canvas, TRUE, TRUE, 0);
scrollbar = gtk_hscrollbar_new(
gtk_layout_get_hadjustment(GTK_LAYOUT(view->canvas)));
- gtk_box_pack_start(GTK_BOX(view->minicard_vbox), scrollbar, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), scrollbar, FALSE, FALSE, 0);
+
+ gtk_box_pack_start(GTK_BOX(view->minicard_hbox), vbox, TRUE, TRUE, 0);
+
+ alphabet = create_alphabet(view);
+ if (alphabet) {
+ gtk_object_ref(GTK_OBJECT(alphabet));
+ gtk_widget_unparent(alphabet);
+ gtk_box_pack_start(GTK_BOX(view->minicard_hbox), alphabet, FALSE, FALSE, 0);
+ gtk_object_unref(GTK_OBJECT(alphabet));
+ }
- gtk_box_pack_start(GTK_BOX(view->vbox), view->minicard_vbox, TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(view->vbox), view->minicard_hbox, TRUE, TRUE, 0);
- gtk_widget_show_all( GTK_WIDGET(view->minicard_vbox) );
+ gtk_widget_show_all( GTK_WIDGET(view->minicard_hbox) );
/* Connect the signals */
gtk_signal_connect( GTK_OBJECT( view->canvas ), "size_allocate",
diff --git a/addressbook/gui/component/alphabet.glade b/addressbook/gui/component/alphabet.glade
new file mode 100644
index 0000000000..a2c61d4a47
--- /dev/null
+++ b/addressbook/gui/component/alphabet.glade
@@ -0,0 +1,382 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>alphabet</name>
+ <program_name>alphabet</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>True</gnome_support>
+ <gettext_support>True</gettext_support>
+ <use_widget_names>True</use_widget_names>
+ <output_main_file>False</output_main_file>
+ <output_support_files>False</output_support_files>
+ <output_build_files>False</output_build_files>
+ <gnome_help_support>True</gnome_help_support>
+ <output_translatable_strings>True</output_translatable_strings>
+ <translatable_strings_file>alphabet.glade.h</translatable_strings_file>
+</project>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>window2</name>
+ <visible>False</visible>
+ <title>window2</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <modal>False</modal>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow-top</name>
+ <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
+ <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
+ <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+ <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+
+ <widget>
+ <class>GtkViewport</class>
+ <name>viewport1</name>
+ <shadow_type>GTK_SHADOW_NONE</shadow_type>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox2</name>
+ <width>27</width>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-1</name>
+ <can_focus>True</can_focus>
+ <label>123</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-a</name>
+ <can_focus>True</can_focus>
+ <label>a</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-b</name>
+ <can_focus>True</can_focus>
+ <label>b</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-c</name>
+ <can_focus>True</can_focus>
+ <label>c</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-d</name>
+ <can_focus>True</can_focus>
+ <label>d</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-e</name>
+ <can_focus>True</can_focus>
+ <label>e</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-f</name>
+ <can_focus>True</can_focus>
+ <label>f</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-g</name>
+ <can_focus>True</can_focus>
+ <label>g</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-h</name>
+ <can_focus>True</can_focus>
+ <label>h</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-i</name>
+ <can_focus>True</can_focus>
+ <label>i</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-j</name>
+ <can_focus>True</can_focus>
+ <label>j</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-k</name>
+ <can_focus>True</can_focus>
+ <label>k</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-l</name>
+ <can_focus>True</can_focus>
+ <label>l</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-m</name>
+ <can_focus>True</can_focus>
+ <label>m</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-n</name>
+ <can_focus>True</can_focus>
+ <label>n</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-o</name>
+ <can_focus>True</can_focus>
+ <label>o</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-p</name>
+ <can_focus>True</can_focus>
+ <label>p</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-q</name>
+ <can_focus>True</can_focus>
+ <label>q</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-r</name>
+ <can_focus>True</can_focus>
+ <label>r</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-s</name>
+ <can_focus>True</can_focus>
+ <label>s</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-t</name>
+ <can_focus>True</can_focus>
+ <label>t</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-u</name>
+ <can_focus>True</can_focus>
+ <label>u</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-v</name>
+ <can_focus>True</can_focus>
+ <label>v</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-w</name>
+ <can_focus>True</can_focus>
+ <label>w</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-x</name>
+ <can_focus>True</can_focus>
+ <label>x</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-y</name>
+ <can_focus>True</can_focus>
+ <label>y</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-z</name>
+ <can_focus>True</can_focus>
+ <label>z</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/addressbook/gui/component/alphabet.glade.h b/addressbook/gui/component/alphabet.glade.h
new file mode 100644
index 0000000000..2448eeb4fc
--- /dev/null
+++ b/addressbook/gui/component/alphabet.glade.h
@@ -0,0 +1,34 @@
+/*
+ * Translatable strings file generated by Glade.
+ * Add this file to your project's POTFILES.in.
+ * DO NOT compile it as part of your application.
+ */
+
+gchar *s = N_("window2");
+gchar *s = N_("123");
+gchar *s = N_("a");
+gchar *s = N_("b");
+gchar *s = N_("c");
+gchar *s = N_("d");
+gchar *s = N_("e");
+gchar *s = N_("f");
+gchar *s = N_("g");
+gchar *s = N_("h");
+gchar *s = N_("i");
+gchar *s = N_("j");
+gchar *s = N_("k");
+gchar *s = N_("l");
+gchar *s = N_("m");
+gchar *s = N_("n");
+gchar *s = N_("o");
+gchar *s = N_("p");
+gchar *s = N_("q");
+gchar *s = N_("r");
+gchar *s = N_("s");
+gchar *s = N_("t");
+gchar *s = N_("u");
+gchar *s = N_("v");
+gchar *s = N_("w");
+gchar *s = N_("x");
+gchar *s = N_("y");
+gchar *s = N_("z");
diff --git a/addressbook/gui/minicard/e-minicard-view.c b/addressbook/gui/minicard/e-minicard-view.c
index d3acb1ad54..bc2e22fa32 100644
--- a/addressbook/gui/minicard/e-minicard-view.c
+++ b/addressbook/gui/minicard/e-minicard-view.c
@@ -107,7 +107,7 @@ e_minicard_view_init (EMinicardView *view)
view->canvas_destroy_id = 0;
gtk_object_set(GTK_OBJECT(view),
- "empty_message", _("There are no items to show in this view\n\n"
+ "empty_message", _("\n\nThere are no items to show in this view\n\n"
"Double-click here to create a new Contact."),
NULL);
@@ -380,3 +380,31 @@ e_minicard_view_remove_selection(EMinicardView *view,
}
}
}
+
+static int
+compare_to_letter(EMinicard *card, char *letter)
+{
+ g_return_val_if_fail(card != NULL, 0);
+ g_return_val_if_fail(E_IS_MINICARD(card), 0);
+
+ if (card->card) {
+ char *file_as;
+ gtk_object_get(GTK_OBJECT(card->card),
+ "file_as", &file_as,
+ NULL);
+ if (file_as)
+ return strncasecmp(file_as, letter, 1);
+ else
+ return 0;
+ } else {
+ return 0;
+ }
+}
+
+void e_minicard_view_jump_to_letter (EMinicardView *view,
+ char letter)
+{
+ e_reflow_sorted_jump(E_REFLOW_SORTED(view),
+ (GCompareFunc) compare_to_letter,
+ &letter);
+}
diff --git a/addressbook/gui/minicard/e-minicard-view.h b/addressbook/gui/minicard/e-minicard-view.h
index 780b0dde33..a166a6ade1 100644
--- a/addressbook/gui/minicard/e-minicard-view.h
+++ b/addressbook/gui/minicard/e-minicard-view.h
@@ -84,6 +84,8 @@ GtkType e_minicard_view_get_type (void);
void e_minicard_view_remove_selection (EMinicardView *view,
EBookCallback cb,
gpointer closure);
+void e_minicard_view_jump_to_letter (EMinicardView *view,
+ char letter);
#ifdef __cplusplus
}
diff --git a/addressbook/gui/minicard/e-reflow-sorted.c b/addressbook/gui/minicard/e-reflow-sorted.c
index 7205785c6c..c899ccb9a7 100644
--- a/addressbook/gui/minicard/e-reflow-sorted.c
+++ b/addressbook/gui/minicard/e-reflow-sorted.c
@@ -34,6 +34,10 @@ static void e_reflow_sorted_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
static void e_reflow_sorted_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
static void e_reflow_sorted_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
+#define E_REFLOW_DIVIDER_WIDTH 2
+#define E_REFLOW_BORDER_WIDTH 7
+#define E_REFLOW_FULL_GUTTER (E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH * 2)
+
static EReflowClass *parent_class = NULL;
/* The arguments we take */
@@ -234,3 +238,32 @@ e_reflow_sorted_add_item(EReflow *reflow, GnomeCanvasItem *item)
}
e_reflow_post_add_item(reflow, item);
}
+
+void e_reflow_sorted_jump (EReflowSorted *sorted,
+ GCompareFunc compare_func,
+ void *value)
+{
+ int columns = 0;
+ EReflow *reflow = E_REFLOW(sorted);
+ GList *list;
+
+ for (list = reflow->columns; list; list = g_list_next(list)) {
+ if (compare_func(((GList *)list->data)->data, value) >= 0) {
+ GList *last = list->prev;
+ GtkAdjustment *adjustment;
+ if (last) {
+ GList *walk;
+ for (walk = last->data; walk != list->data; walk = g_list_next(walk)) {
+ if (compare_func(walk->data, value) >= 0) {
+ columns --;
+ break;
+ }
+ }
+ }
+ adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(sorted)->canvas));
+ gtk_adjustment_set_value(adjustment, (reflow->column_width + E_REFLOW_FULL_GUTTER) * columns);
+ return;
+ }
+ columns ++;
+ }
+}
diff --git a/addressbook/gui/minicard/e-reflow-sorted.h b/addressbook/gui/minicard/e-reflow-sorted.h
index d9b4acc747..7adfa2c045 100644
--- a/addressbook/gui/minicard/e-reflow-sorted.h
+++ b/addressbook/gui/minicard/e-reflow-sorted.h
@@ -81,6 +81,7 @@ void e_reflow_sorted_replace_item (EReflowSorted *sorted, GnomeCanvasI
void e_reflow_sorted_reorder_item (EReflowSorted *e_reflow_sorted, const gchar *id);
GnomeCanvasItem *e_reflow_sorted_get_item (EReflowSorted *e_reflow_sorted, const gchar *id);
GtkType e_reflow_sorted_get_type (void);
+void e_reflow_sorted_jump (EReflowSorted *sorted, GCompareFunc compare_func, void *value);
#ifdef __cplusplus
}
diff --git a/addressbook/gui/widgets/alphabet.glade b/addressbook/gui/widgets/alphabet.glade
new file mode 100644
index 0000000000..a2c61d4a47
--- /dev/null
+++ b/addressbook/gui/widgets/alphabet.glade
@@ -0,0 +1,382 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>alphabet</name>
+ <program_name>alphabet</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>True</gnome_support>
+ <gettext_support>True</gettext_support>
+ <use_widget_names>True</use_widget_names>
+ <output_main_file>False</output_main_file>
+ <output_support_files>False</output_support_files>
+ <output_build_files>False</output_build_files>
+ <gnome_help_support>True</gnome_help_support>
+ <output_translatable_strings>True</output_translatable_strings>
+ <translatable_strings_file>alphabet.glade.h</translatable_strings_file>
+</project>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>window2</name>
+ <visible>False</visible>
+ <title>window2</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <modal>False</modal>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow-top</name>
+ <hscrollbar_policy>GTK_POLICY_NEVER</hscrollbar_policy>
+ <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy>
+ <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+ <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+
+ <widget>
+ <class>GtkViewport</class>
+ <name>viewport1</name>
+ <shadow_type>GTK_SHADOW_NONE</shadow_type>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox2</name>
+ <width>27</width>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-1</name>
+ <can_focus>True</can_focus>
+ <label>123</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-a</name>
+ <can_focus>True</can_focus>
+ <label>a</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-b</name>
+ <can_focus>True</can_focus>
+ <label>b</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-c</name>
+ <can_focus>True</can_focus>
+ <label>c</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-d</name>
+ <can_focus>True</can_focus>
+ <label>d</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-e</name>
+ <can_focus>True</can_focus>
+ <label>e</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-f</name>
+ <can_focus>True</can_focus>
+ <label>f</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-g</name>
+ <can_focus>True</can_focus>
+ <label>g</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-h</name>
+ <can_focus>True</can_focus>
+ <label>h</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-i</name>
+ <can_focus>True</can_focus>
+ <label>i</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-j</name>
+ <can_focus>True</can_focus>
+ <label>j</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-k</name>
+ <can_focus>True</can_focus>
+ <label>k</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-l</name>
+ <can_focus>True</can_focus>
+ <label>l</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-m</name>
+ <can_focus>True</can_focus>
+ <label>m</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-n</name>
+ <can_focus>True</can_focus>
+ <label>n</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-o</name>
+ <can_focus>True</can_focus>
+ <label>o</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-p</name>
+ <can_focus>True</can_focus>
+ <label>p</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-q</name>
+ <can_focus>True</can_focus>
+ <label>q</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-r</name>
+ <can_focus>True</can_focus>
+ <label>r</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-s</name>
+ <can_focus>True</can_focus>
+ <label>s</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-t</name>
+ <can_focus>True</can_focus>
+ <label>t</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-u</name>
+ <can_focus>True</can_focus>
+ <label>u</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-v</name>
+ <can_focus>True</can_focus>
+ <label>v</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-w</name>
+ <can_focus>True</can_focus>
+ <label>w</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-x</name>
+ <can_focus>True</can_focus>
+ <label>x</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-y</name>
+ <can_focus>True</can_focus>
+ <label>y</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button-z</name>
+ <can_focus>True</can_focus>
+ <label>z</label>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/addressbook/gui/widgets/alphabet.glade.h b/addressbook/gui/widgets/alphabet.glade.h
new file mode 100644
index 0000000000..2448eeb4fc
--- /dev/null
+++ b/addressbook/gui/widgets/alphabet.glade.h
@@ -0,0 +1,34 @@
+/*
+ * Translatable strings file generated by Glade.
+ * Add this file to your project's POTFILES.in.
+ * DO NOT compile it as part of your application.
+ */
+
+gchar *s = N_("window2");
+gchar *s = N_("123");
+gchar *s = N_("a");
+gchar *s = N_("b");
+gchar *s = N_("c");
+gchar *s = N_("d");
+gchar *s = N_("e");
+gchar *s = N_("f");
+gchar *s = N_("g");
+gchar *s = N_("h");
+gchar *s = N_("i");
+gchar *s = N_("j");
+gchar *s = N_("k");
+gchar *s = N_("l");
+gchar *s = N_("m");
+gchar *s = N_("n");
+gchar *s = N_("o");
+gchar *s = N_("p");
+gchar *s = N_("q");
+gchar *s = N_("r");
+gchar *s = N_("s");
+gchar *s = N_("t");
+gchar *s = N_("u");
+gchar *s = N_("v");
+gchar *s = N_("w");
+gchar *s = N_("x");
+gchar *s = N_("y");
+gchar *s = N_("z");
diff --git a/addressbook/gui/widgets/e-minicard-view.c b/addressbook/gui/widgets/e-minicard-view.c
index d3acb1ad54..bc2e22fa32 100644
--- a/addressbook/gui/widgets/e-minicard-view.c
+++ b/addressbook/gui/widgets/e-minicard-view.c
@@ -107,7 +107,7 @@ e_minicard_view_init (EMinicardView *view)
view->canvas_destroy_id = 0;
gtk_object_set(GTK_OBJECT(view),
- "empty_message", _("There are no items to show in this view\n\n"
+ "empty_message", _("\n\nThere are no items to show in this view\n\n"
"Double-click here to create a new Contact."),
NULL);
@@ -380,3 +380,31 @@ e_minicard_view_remove_selection(EMinicardView *view,
}
}
}
+
+static int
+compare_to_letter(EMinicard *card, char *letter)
+{
+ g_return_val_if_fail(card != NULL, 0);
+ g_return_val_if_fail(E_IS_MINICARD(card), 0);
+
+ if (card->card) {
+ char *file_as;
+ gtk_object_get(GTK_OBJECT(card->card),
+ "file_as", &file_as,
+ NULL);
+ if (file_as)
+ return strncasecmp(file_as, letter, 1);
+ else
+ return 0;
+ } else {
+ return 0;
+ }
+}
+
+void e_minicard_view_jump_to_letter (EMinicardView *view,
+ char letter)
+{
+ e_reflow_sorted_jump(E_REFLOW_SORTED(view),
+ (GCompareFunc) compare_to_letter,
+ &letter);
+}
diff --git a/addressbook/gui/widgets/e-minicard-view.h b/addressbook/gui/widgets/e-minicard-view.h
index 780b0dde33..a166a6ade1 100644
--- a/addressbook/gui/widgets/e-minicard-view.h
+++ b/addressbook/gui/widgets/e-minicard-view.h
@@ -84,6 +84,8 @@ GtkType e_minicard_view_get_type (void);
void e_minicard_view_remove_selection (EMinicardView *view,
EBookCallback cb,
gpointer closure);
+void e_minicard_view_jump_to_letter (EMinicardView *view,
+ char letter);
#ifdef __cplusplus
}
diff --git a/widgets/e-reflow/e-reflow-sorted.c b/widgets/e-reflow/e-reflow-sorted.c
index 7205785c6c..c899ccb9a7 100644
--- a/widgets/e-reflow/e-reflow-sorted.c
+++ b/widgets/e-reflow/e-reflow-sorted.c
@@ -34,6 +34,10 @@ static void e_reflow_sorted_set_arg (GtkObject *o, GtkArg *arg, guint arg_id);
static void e_reflow_sorted_get_arg (GtkObject *object, GtkArg *arg, guint arg_id);
static void e_reflow_sorted_add_item(EReflow *e_reflow, GnomeCanvasItem *item);
+#define E_REFLOW_DIVIDER_WIDTH 2
+#define E_REFLOW_BORDER_WIDTH 7
+#define E_REFLOW_FULL_GUTTER (E_REFLOW_DIVIDER_WIDTH + E_REFLOW_BORDER_WIDTH * 2)
+
static EReflowClass *parent_class = NULL;
/* The arguments we take */
@@ -234,3 +238,32 @@ e_reflow_sorted_add_item(EReflow *reflow, GnomeCanvasItem *item)
}
e_reflow_post_add_item(reflow, item);
}
+
+void e_reflow_sorted_jump (EReflowSorted *sorted,
+ GCompareFunc compare_func,
+ void *value)
+{
+ int columns = 0;
+ EReflow *reflow = E_REFLOW(sorted);
+ GList *list;
+
+ for (list = reflow->columns; list; list = g_list_next(list)) {
+ if (compare_func(((GList *)list->data)->data, value) >= 0) {
+ GList *last = list->prev;
+ GtkAdjustment *adjustment;
+ if (last) {
+ GList *walk;
+ for (walk = last->data; walk != list->data; walk = g_list_next(walk)) {
+ if (compare_func(walk->data, value) >= 0) {
+ columns --;
+ break;
+ }
+ }
+ }
+ adjustment = gtk_layout_get_hadjustment(GTK_LAYOUT(GNOME_CANVAS_ITEM(sorted)->canvas));
+ gtk_adjustment_set_value(adjustment, (reflow->column_width + E_REFLOW_FULL_GUTTER) * columns);
+ return;
+ }
+ columns ++;
+ }
+}
diff --git a/widgets/e-reflow/e-reflow-sorted.h b/widgets/e-reflow/e-reflow-sorted.h
index d9b4acc747..7adfa2c045 100644
--- a/widgets/e-reflow/e-reflow-sorted.h
+++ b/widgets/e-reflow/e-reflow-sorted.h
@@ -81,6 +81,7 @@ void e_reflow_sorted_replace_item (EReflowSorted *sorted, GnomeCanvasI
void e_reflow_sorted_reorder_item (EReflowSorted *e_reflow_sorted, const gchar *id);
GnomeCanvasItem *e_reflow_sorted_get_item (EReflowSorted *e_reflow_sorted, const gchar *id);
GtkType e_reflow_sorted_get_type (void);
+void e_reflow_sorted_jump (EReflowSorted *sorted, GCompareFunc compare_func, void *value);
#ifdef __cplusplus
}