Work on displaying multi-byte character sets in the register.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3310 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
Dave Peticolas 2000-12-14 07:22:46 +00:00
parent e3d1185f36
commit 16139b2a78
3 changed files with 73 additions and 31 deletions

View File

@ -32,6 +32,7 @@ src/gnome/window-reconcile.c
src/gnome/window-register.c
src/gnome/window-report.c
src/guile/gnucash.c
src/register/gnome/gnucash-style.c
src/register/recncell.c
src/register/splitreg.c
src/FileDialog.c

View File

@ -62,9 +62,13 @@ static GdkAtom ctext_atom = GDK_NONE;
typedef struct _TextDrawInfo TextDrawInfo;
struct _TextDrawInfo
{
char *text_1;
char *text_2;
char *text_3;
GdkWChar *all_text;
GdkWChar *text_1;
GdkWChar *text_2;
GdkWChar *text_3;
int total_len;
int len_1;
int len_2;
@ -145,6 +149,7 @@ item_edit_draw_info(ItemEdit *item_edit, int x, int y, TextDrawInfo *info)
int start_pos, end_pos;
int toggle_space, cursor_pos;
int xoffset;
char *text;
gboolean hatching;
guint32 argb;
@ -172,9 +177,15 @@ item_edit_draw_info(ItemEdit *item_edit, int x, int y, TextDrawInfo *info)
end_pos = MAX(editable->selection_start_pos,
editable->selection_end_pos);
info->text_1 = gtk_entry_get_text(GTK_ENTRY (item_edit->editor));
text = gtk_entry_get_text(GTK_ENTRY (item_edit->editor));
text_len = strlen(text);
info->all_text = g_new0(GdkWChar, text_len + 1);
text_len = gdk_mbstowcs(info->all_text, text, text_len);
info->total_len = text_len;
info->text_1 = info->all_text;
info->len_1 = start_pos;
text_len = strlen(info->text_1);
info->text_2 = &info->text_1[start_pos];
info->len_2 = end_pos - start_pos;
@ -182,12 +193,12 @@ item_edit_draw_info(ItemEdit *item_edit, int x, int y, TextDrawInfo *info)
info->text_3 = &info->text_1[end_pos];
info->len_3 = text_len - end_pos;
total_width = gdk_text_measure (info->font, info->text_1, text_len);
pre_cursor_width = gdk_text_width (info->font, info->text_1,
cursor_pos);
total_width = gdk_text_width_wc (info->font, info->text_1, text_len);
pre_cursor_width = gdk_text_width_wc (info->font, info->text_1,
cursor_pos);
width_1 = gdk_text_width (info->font, info->text_1, info->len_1);
width_2 = gdk_text_width (info->font, info->text_2, info->len_2);
width_1 = gdk_text_width_wc (info->font, info->text_1, info->len_1);
width_2 = gdk_text_width_wc (info->font, info->text_2, info->len_2);
item_edit_get_pixel_coords (item_edit, &xd, &yd, &wd, &hd);
@ -238,6 +249,16 @@ item_edit_draw_info(ItemEdit *item_edit, int x, int y, TextDrawInfo *info)
}
}
static void
item_edit_free_draw_info_members(TextDrawInfo *info)
{
if (info == NULL)
return;
g_free(info->all_text);
info->all_text = NULL;
}
static void
item_edit_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
int x, int y, int width, int height)
@ -292,22 +313,22 @@ item_edit_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
info.font->ascent + info.font->descent);
gdk_gc_set_foreground (item_edit->gc, info.fg_color2);
gdk_draw_text (drawable, info.font, item_edit->gc,
info.text_x2, info.text_y,
info.text_2, info.len_2);
gdk_draw_text_wc (drawable, info.font, item_edit->gc,
info.text_x2, info.text_y,
info.text_2, info.len_2);
}
gdk_gc_set_foreground (item_edit->gc, info.fg_color);
if (info.len_1 > 0)
gdk_draw_text (drawable, info.font, item_edit->gc,
info.text_x1, info.text_y,
info.text_1, info.len_1);
gdk_draw_text_wc (drawable, info.font, item_edit->gc,
info.text_x1, info.text_y,
info.text_1, info.len_1);
if (info.len_3 > 0)
gdk_draw_text (drawable, info.font, item_edit->gc,
info.text_x3, info.text_y,
info.text_3, info.len_3);
gdk_draw_text_wc (drawable, info.font, item_edit->gc,
info.text_x3, info.text_y,
info.text_3, info.len_3);
if (info.len_2 == 0)
gdk_draw_line (drawable, item_edit->gc,
@ -315,6 +336,8 @@ item_edit_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
info.cursor_x, info.cursor_y2);
gdk_gc_set_clip_rectangle (item_edit->gc, NULL);
item_edit_free_draw_info_members(&info);
}
@ -509,7 +532,7 @@ item_edit_set_cursor_pos (ItemEdit *item_edit,
CellDimensions *cd;
gint cell_row, cell_col;
SheetBlockStyle *style;
char *text;
GdkWChar *text;
g_return_val_if_fail (IS_ITEM_EDIT(item_edit), FALSE);
@ -544,19 +567,25 @@ item_edit_set_cursor_pos (ItemEdit *item_edit,
item_edit_draw_info(item_edit, o_x, o_y, &info);
if (info.text_1 == NULL)
{
item_edit_free_draw_info_members(&info);
return FALSE;
}
pos = strlen(info.text_1);
pos = info.total_len;
if (pos == 0)
{
item_edit_free_draw_info_members(&info);
return FALSE;
}
text = info.text_1 + (pos - 1);
while (text >= info.text_1) {
pos_x = o_x + info.text_x1 +
gdk_text_width (info.font, info.text_1, pos);
gdk_text_width_wc (info.font, info.text_1, pos);
if (pos_x <= x + (gdk_char_width(info.font, *text) / 2))
if (pos_x <= x + (gdk_char_width_wc(info.font, *text) / 2))
break;
pos--;
@ -592,6 +621,8 @@ item_edit_set_cursor_pos (ItemEdit *item_edit,
queue_sync (item_edit);
item_edit_free_draw_info_members(&info);
return TRUE;
}
@ -1227,6 +1258,9 @@ item_edit_hide_popup (ItemEdit *item_edit)
g_return_if_fail(item_edit != NULL);
g_return_if_fail(IS_ITEM_EDIT(item_edit));
if (item_edit->item_list == NULL)
return;
if (item_edit->item_list)
gnome_canvas_item_set
(GNOME_CANVAS_ITEM(item_edit->item_list),

View File

@ -33,8 +33,9 @@
#include "date.h"
#define DEFAULT_FONT "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*"
#define HINT_FONT "-adobe-helvetica-medium-o-normal--*-120-*-*-*-*-*-*"
#define DEFAULT_FONT _("register-default-font:-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*"+22)
#define HINT_FONT _("register-hint-font:-adobe-helvetica-medium-o-normal--*-120-*-*-*-*-*-*"+19)
#define DEFAULT_STYLE_WIDTH 680
@ -747,14 +748,16 @@ gnucash_style_set_register_font_name(const char *name)
gnucash_register_font = NULL;
}
g_warning (register_font_name);
if (register_font_name != NULL)
gnucash_register_font = gdk_font_load(register_font_name);
gnucash_register_font = gdk_fontset_load(register_font_name);
if (gnucash_register_font == NULL)
{
g_free(register_font_name);
register_font_name = NULL;
gnucash_register_font = gdk_font_load(DEFAULT_FONT);
gnucash_register_font = gdk_fontset_load(DEFAULT_FONT);
}
g_assert(gnucash_register_font != NULL);
@ -776,13 +779,13 @@ gnucash_style_set_register_hint_font_name(const char *name)
if (register_hint_font_name != NULL)
gnucash_register_hint_font =
gdk_font_load(register_hint_font_name);
gdk_fontset_load(register_hint_font_name);
if (gnucash_register_hint_font == NULL)
{
g_free(register_hint_font_name);
register_hint_font_name = NULL;
gnucash_register_hint_font = gdk_font_load(HINT_FONT);
gnucash_register_hint_font = gdk_fontset_load(HINT_FONT);
}
g_assert(gnucash_register_hint_font != NULL);
@ -868,13 +871,17 @@ gnucash_sheet_set_header_widths (GnucashSheet *sheet, int *header_widths)
const char *
gnucash_style_get_default_register_font_name(void)
{
return DEFAULT_FONT;
/* same as DEFAULT_FONT */
/* repeated here so gettext will pick it up */
return _("register-default-font:-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*"+22);
}
const char *
gnucash_style_get_default_register_hint_font_name(void)
{
return HINT_FONT;
/* same as HINT_FONT */
/* repeated here so gettext will pick it up */
return _("register-hint-font:-adobe-helvetica-medium-o-normal--*-120-*-*-*-*-*-*"+19);
}
void