mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
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:
parent
e3d1185f36
commit
16139b2a78
@ -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
|
||||
|
@ -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),
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user