From f5347f59ff008ebc53f456cfcd4b8c58dead29c5 Mon Sep 17 00:00:00 2001 From: Chris Lahey Date: Thu, 13 Jan 2000 22:01:23 +0000 Subject: e_canvas_item_move_absolute is just a helper function not supplied by the * widgets/e-canvas-utils.c, widgets/e-canvas-utils.h: e_canvas_item_move_absolute is just a helper function not supplied by the gnome_canvas.[ch] I put it here so that multiple items can use it. * widgets/e-reflow.c, widgets/e-reflow.h: This item contains a number of other items and places them into multiple columns. The items contained must support a number of arguments and signals to allow the reflow to interact with them. * widgets/test-reflow.c: This is a test program for e-reflow. * widgets/e-text.c, widgets/e-text.h: Added properly drawn selected text. Added some preliminary code for X selection handling and cut & paste. * widgets/e-minicard.c, widgets/e-minicard.h: Added ARG_HAS_FOCUS handling. Made label display random for more interesting tests of multiple cards. Tweaked sizing information for better display. * widgets/e-minicard-label.c, widgets/e-minicard-label.h: Added ARG_HAS_FOCUS handling. * widgets/Makefile.am: Added the reflow test and reflow files. svn path=/trunk/; revision=1566 --- addressbook/gui/widgets/e-minicard-label.c | 12 +++ addressbook/gui/widgets/e-minicard-label.h | 2 + addressbook/gui/widgets/e-minicard.c | 118 +++++++++++++++++-------- addressbook/gui/widgets/e-minicard.h | 4 +- addressbook/gui/widgets/test-reflow.c | 136 +++++++++++++++++++++++++++++ 5 files changed, 233 insertions(+), 39 deletions(-) create mode 100644 addressbook/gui/widgets/test-reflow.c (limited to 'addressbook/gui/widgets') diff --git a/addressbook/gui/widgets/e-minicard-label.c b/addressbook/gui/widgets/e-minicard-label.c index 9efdd0ba65..a550031123 100644 --- a/addressbook/gui/widgets/e-minicard-label.c +++ b/addressbook/gui/widgets/e-minicard-label.c @@ -48,6 +48,7 @@ enum { ARG_0, ARG_WIDTH, ARG_HEIGHT, + ARG_HAS_FOCUS, ARG_FIELD, ARG_FIELDNAME }; @@ -103,6 +104,8 @@ e_minicard_label_class_init (EMinicardLabelClass *klass) GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("EMinicardLabel::height", GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_HEIGHT); + gtk_object_add_arg_type ("EMinicardLabel::has_focus", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_HAS_FOCUS); gtk_object_add_arg_type ("EMinicardLabel::field", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_FIELD); gtk_object_add_arg_type ("EMinicardLabel::fieldname", GTK_TYPE_STRING, @@ -148,6 +151,10 @@ e_minicard_label_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) _update_label( e_minicard_label ); gnome_canvas_item_request_update (item); break; + case ARG_HAS_FOCUS: + if (e_minicard_label->field && GTK_VALUE_BOOL(*arg)) + gnome_canvas_item_grab_focus(e_minicard_label->field); + break; case ARG_FIELD: if ( e_minicard_label->field ) gnome_canvas_item_set( e_minicard_label->field, "text", GTK_VALUE_STRING (*arg), NULL ); @@ -178,6 +185,9 @@ e_minicard_label_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) case ARG_HEIGHT: GTK_VALUE_DOUBLE (*arg) = e_minicard_label->height; break; + case ARG_HAS_FOCUS: + GTK_VALUE_BOOL (*arg) = e_minicard_label->has_focus; + break; case ARG_FIELD: if ( e_minicard_label->field ) { @@ -317,6 +327,7 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) "outline_color", "grey50", "fill_color", "grey90", NULL ); + e_minicard_label->has_focus = TRUE; } else { @@ -324,6 +335,7 @@ e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) "outline_color", NULL, "fill_color", NULL, NULL ); + e_minicard_label->has_focus = FALSE; } } break; diff --git a/addressbook/gui/widgets/e-minicard-label.h b/addressbook/gui/widgets/e-minicard-label.h index bbaca884ac..ddbe7ab191 100644 --- a/addressbook/gui/widgets/e-minicard-label.h +++ b/addressbook/gui/widgets/e-minicard-label.h @@ -62,6 +62,8 @@ struct _EMinicardLabel GnomeCanvasItem *rect; char *fieldname_text; char *field_text; + + gboolean has_focus; }; struct _EMinicardLabelClass diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index 01c326d568..52d241d11e 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -49,6 +49,7 @@ enum { ARG_0, ARG_WIDTH, ARG_HEIGHT, + ARG_HAS_FOCUS, ARG_CARD }; @@ -103,6 +104,8 @@ e_minicard_class_init (EMinicardClass *klass) GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("EMinicard::height", GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_HEIGHT); + gtk_object_add_arg_type ("EMinicard::has_focus", GTK_TYPE_BOOL, + GTK_ARG_READWRITE, ARG_HAS_FOCUS); gtk_object_add_arg_type ("EMinicard::card", GTK_TYPE_OBJECT, GTK_ARG_READWRITE, ARG_CARD); @@ -124,6 +127,7 @@ e_minicard_init (EMinicard *minicard) minicard->fields = NULL; minicard->width = 10; minicard->height = 10; + minicard->has_focus = FALSE; } static void @@ -141,6 +145,14 @@ e_minicard_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) _update_card(e_minicard); gnome_canvas_item_request_update (item); break; + case ARG_HAS_FOCUS: + if (e_minicard->fields) + gnome_canvas_item_set(GNOME_CANVAS_ITEM(e_minicard->fields->data), + "has_focus", GTK_VALUE_BOOL(*arg), + NULL); + else + gnome_canvas_item_grab_focus(GNOME_CANVAS_ITEM(e_minicard)); + break; case ARG_CARD: /* e_minicard->card = GTK_VALUE_POINTER (*arg); _update_card(e_minicard); @@ -163,6 +175,9 @@ e_minicard_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) case ARG_HEIGHT: GTK_VALUE_DOUBLE (*arg) = e_minicard->height; break; + case ARG_HAS_FOCUS: + GTK_VALUE_BOOL (*arg) = e_minicard->has_focus; + break; case ARG_CARD: /* GTK_VALUE_POINTER (*arg) = e_minicard->card; */ break; @@ -218,42 +233,61 @@ e_minicard_realize (GnomeCanvasItem *item) "fill_color", "black", "text", "Chris Lahey", NULL ); - - gtk_signal_connect(GTK_OBJECT(e_minicard->header_text), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); - - new_item = gnome_canvas_item_new( group, - e_minicard_label_get_type(), - "x", (double) 2, - "y", e_minicard->height, - "width", e_minicard->width - 4, - "fieldname", "Full Name:", - "field", "Christopher James Lahey", - NULL ); - e_minicard->fields = g_list_append( e_minicard->fields, new_item); - - gtk_signal_connect(GTK_OBJECT(new_item), - "resize", - GTK_SIGNAL_FUNC(_resize), - (gpointer) e_minicard); - new_item = gnome_canvas_item_new( group, - e_minicard_label_get_type(), - "x", (double) 2, - "y", e_minicard->height, - "width", e_minicard->width - 4.0, - "fieldname", "Email:", - "field", "clahey@helixcode.com", - NULL ); - e_minicard->fields = g_list_append( e_minicard->fields, new_item); - - gtk_signal_connect(GTK_OBJECT(new_item), + gtk_signal_connect(GTK_OBJECT(e_minicard->header_text), "resize", GTK_SIGNAL_FUNC(_resize), (gpointer) e_minicard); + if ( rand() % 2 ) { + new_item = gnome_canvas_item_new( group, + e_minicard_label_get_type(), + "x", (double) 2, + "y", e_minicard->height, + "width", e_minicard->width - 4, + "fieldname", "Full Name:", + "field", "Christopher James Lahey", + NULL ); + e_minicard->fields = g_list_append( e_minicard->fields, new_item); + + gtk_signal_connect(GTK_OBJECT(new_item), + "resize", + GTK_SIGNAL_FUNC(_resize), + (gpointer) e_minicard); + } + if (rand() % 2) { + new_item = gnome_canvas_item_new( group, + e_minicard_label_get_type(), + "x", (double) 2, + "y", e_minicard->height, + "width", e_minicard->width - 4, + "fieldname", "Address:", + "field", "100 Main St\nHome town, USA", + NULL ); + e_minicard->fields = g_list_append( e_minicard->fields, new_item); + + gtk_signal_connect(GTK_OBJECT(new_item), + "resize", + GTK_SIGNAL_FUNC(_resize), + (gpointer) e_minicard); + } + + if (rand() % 2) { + new_item = gnome_canvas_item_new( group, + e_minicard_label_get_type(), + "x", (double) 2, + "y", e_minicard->height, + "width", e_minicard->width - 4.0, + "fieldname", "Email:", + "field", "clahey@helixcode.com", + NULL ); + e_minicard->fields = g_list_append( e_minicard->fields, new_item); + + gtk_signal_connect(GTK_OBJECT(new_item), + "resize", + GTK_SIGNAL_FUNC(_resize), + (gpointer) e_minicard); + } _update_card( e_minicard ); if (!item->canvas->aa) { @@ -298,6 +332,7 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) gnome_canvas_item_set( e_minicard->header_text, "fill_color", "white", NULL ); + e_minicard->has_focus = TRUE; } else { @@ -305,11 +340,12 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) "outline_color", NULL, NULL ); gnome_canvas_item_set( e_minicard->header_rect, - "fill_color", "grey50", + "fill_color", "grey70", NULL ); gnome_canvas_item_set( e_minicard->header_text, "fill_color", "black", NULL ); + e_minicard->has_focus = FALSE; } } break; @@ -317,15 +353,21 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) if (event->key.length == 1 && event->key.string[0] == '\t') { GList *list; for (list = e_minicard->fields; list; list = list->next) { - EMinicardLabel *label = E_MINICARD_LABEL (list->data); - if (label->field == label->field->canvas->focused_item) { + GnomeCanvasItem *item = GNOME_CANVAS_ITEM (list->data); + gboolean has_focus; + gtk_object_get(GTK_OBJECT(item), + "has_focus", &has_focus, + NULL); + if (has_focus) { if (event->key.state & GDK_SHIFT_MASK) list = list->prev; else list = list->next; if (list) { - label = E_MINICARD_LABEL (list->data); - gnome_canvas_item_grab_focus(label->field); + item = GNOME_CANVAS_ITEM (list->data); + gnome_canvas_item_set(item, + "has_focus", TRUE, + NULL); return 1; } else { return 0; @@ -357,7 +399,7 @@ _update_card( EMinicard *e_minicard ) "text_height", &text_height, NULL ); - e_minicard->height = text_height + 12.0; + e_minicard->height = text_height + 10.0; gnome_canvas_item_set( e_minicard->header_rect, "y2", text_height + 9.0, @@ -387,7 +429,7 @@ _update_card( EMinicard *e_minicard ) "y2", (double) e_minicard->height - 1.0, NULL ); gnome_canvas_item_set( e_minicard->header_rect, - "x2", (double) e_minicard->width - 4.0, + "x2", (double) e_minicard->width - 3.0, NULL ); gnome_canvas_item_set( e_minicard->header_text, "clip_width", (double) e_minicard->width - 12, diff --git a/addressbook/gui/widgets/e-minicard.h b/addressbook/gui/widgets/e-minicard.h index 43e7d8307f..98f6ea124a 100644 --- a/addressbook/gui/widgets/e-minicard.h +++ b/addressbook/gui/widgets/e-minicard.h @@ -61,6 +61,8 @@ struct _EMinicard GnomeCanvasItem *header_text; GList *fields; /* Of type GnomeCanvasItem. */ + gboolean has_focus; + double width; double height; }; @@ -69,7 +71,7 @@ struct _EMinicardClass { GnomeCanvasGroupClass parent_class; - void (* resize) (EMinicard *text); + void (* resize) (EMinicard *minicard); }; diff --git a/addressbook/gui/widgets/test-reflow.c b/addressbook/gui/widgets/test-reflow.c new file mode 100644 index 0000000000..f03232c72d --- /dev/null +++ b/addressbook/gui/widgets/test-reflow.c @@ -0,0 +1,136 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* test-reflow.c + * + * Copyright (C) 2000 Helix Code, Inc. + * Author: Chris Lahey + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + + +#include "config.h" + +#include +#include "e-reflow.h" +#include "e-minicard.h" + +/* This is a horrible thing to do, but it is just a test. */ +GnomeCanvasItem *reflow; +GnomeCanvasItem *rect; + +static void destroy_callback(GtkWidget *app, gpointer data) +{ + exit(0); +} + +static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) +{ + double width; + gnome_canvas_item_set( reflow, + "height", (double) allocation->height, + NULL ); + gtk_object_get(GTK_OBJECT(reflow), + "width", &width, + NULL); + width = MAX(width, allocation->width); + gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, width, allocation->height ); + gnome_canvas_item_set( rect, + "x2", (double) width, + "y2", (double) allocation->height, + NULL ); +} + +static void about_callback( GtkWidget *widget, gpointer data ) +{ + + const gchar *authors[] = + { + "Christopher James Lahey ", + NULL + }; + + GtkWidget *about = + gnome_about_new ( _( "Reflow Test" ), VERSION, + _( "Copyright (C) 2000, Helix Code, Inc." ), + authors, + _( "This should test the reflow canvas item" ), + NULL); + gtk_widget_show (about); +} + +int main( int argc, char *argv[] ) +{ + GtkWidget *app; + GtkWidget *canvas; + GtkWidget *vbox; + GtkWidget *scrollbar; + int i; + + /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); + textdomain (PACKAGE);*/ + + gnome_init( "Reflow Test", VERSION, argc, argv); + app = gnome_app_new("Reflow Test", NULL); + + vbox = gtk_vbox_new(FALSE, 0); + + canvas = gnome_canvas_new(); + rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), + gnome_canvas_rect_get_type(), + "x1", (double) 0, + "y1", (double) 0, + "x2", (double) 100, + "y2", (double) 100, + "fill_color", "white", + NULL ); + reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), + e_reflow_get_type(), + "x", (double) 0, + "y", (double) 0, + "height", (double) 100, + NULL ); + for ( i = 0; i < 200; i++ ) + { + GnomeCanvasItem *item; + item = gnome_canvas_item_new( GNOME_CANVAS_GROUP(reflow), + e_minicard_get_type(), + NULL); + e_reflow_add_item(E_REFLOW(reflow), item); + } + gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ), + 0, 0, + 100, 100 ); + + gtk_box_pack_start(GTK_BOX(vbox), canvas, TRUE, TRUE, 0); + + scrollbar = gtk_hscrollbar_new(gtk_layout_get_hadjustment(GTK_LAYOUT(canvas))); + + gtk_box_pack_start(GTK_BOX(vbox), scrollbar, FALSE, FALSE, 0); + + gnome_app_set_contents( GNOME_APP( app ), vbox ); + + /* Connect the signals */ + gtk_signal_connect( GTK_OBJECT( app ), "destroy", + GTK_SIGNAL_FUNC( destroy_callback ), + ( gpointer ) app ); + + gtk_signal_connect( GTK_OBJECT( canvas ), "size_allocate", + GTK_SIGNAL_FUNC( allocate_callback ), + ( gpointer ) app ); + + gtk_widget_show_all( app ); + + gtk_main(); + + /* Not reached. */ + return 0; +} -- cgit v1.2.3