43 #include "basiccell.h"
45 #include "quickfillcell.h"
48 static void gnc_quickfill_cell_set_original (
QuickFillCell *cell,
49 const char *original);
53 gnc_quickfill_cell_set_value_internal (
BasicCell *_cell,
57 gnc_quickfill_cell_set_value (cell, val);
62 gnc_quickfill_cell_enter (
BasicCell *_cell,
69 *cursor_position = -1;
73 gnc_quickfill_cell_set_original (cell, NULL);
79 utf8_caseequal (
const char *s1,
const char *s2)
83 gboolean equal = FALSE;
91 s1new = g_utf8_casefold(s1, -1);
92 s2new = g_utf8_casefold(s2, -1);
94 if (g_utf8_collate(s1new, s2new) == 0)
104 utf8_caseequal_len (
const char *s1,
const char *s2, guint len)
108 const gchar *s1_offset;
109 const gchar *s2_offset;
114 gboolean equal = FALSE;
126 s1_offset = g_utf8_offset_to_pointer (s1, len);
127 s2_offset = g_utf8_offset_to_pointer (s2, len);
128 s1_bytes_len = s1_offset - s1;
129 s2_bytes_len = s2_offset - s2;
133 s1chars = g_utf8_strlen (s1, s1_bytes_len);
134 s2chars = g_utf8_strlen (s2, s2_bytes_len);
135 if ( (s1chars < len) || (s2chars < len) )
139 s1new = g_utf8_casefold (s1, s1_bytes_len);
140 s2new = g_utf8_casefold (s2, s2_bytes_len);
147 if (g_utf8_collate(s1new, s2new) == 0)
157 gnc_quickfill_cell_modify_verify (
BasicCell *_cell,
162 int *cursor_position,
163 int *start_selection,
167 const char *match_str;
173 newval_chars = g_utf8_strlen(newval, newval_len);
174 change_chars = g_utf8_strlen(change, change_len);
182 if ((*cursor_position >= newval_chars) &&
183 (cell->original != NULL) &&
184 (g_utf8_strlen (cell->original, -1) >= newval_chars) &&
185 utf8_caseequal_len (cell->original, newval, newval_chars))
187 gchar *temp = g_strndup (cell->original, newval_len);
188 gnc_quickfill_cell_set_original (cell, temp);
192 gnc_quickfill_cell_set_original (cell, NULL);
194 gnc_basic_cell_set_value_internal (&cell->cell, newval);
199 if (*cursor_position < _cell->value_chars)
201 gnc_basic_cell_set_value_internal (&cell->cell, newval);
202 gnc_quickfill_cell_set_original (cell, NULL);
206 if (cell->original == NULL)
207 cell->original = g_strdup (newval);
208 else if (utf8_caseequal (cell->original, _cell->value))
212 original = g_string_new (cell->original);
213 g_string_append (original, change);
215 g_free (cell->original);
216 cell->original = g_strdup (original->str);
217 g_string_free (original, TRUE);
221 g_free (cell->original);
222 cell->original = NULL;
229 if (match_str == NULL)
231 if (cell->original != NULL)
232 newval = cell->original;
234 *cursor_position = -1;
236 gnc_basic_cell_set_value_internal (&cell->cell, newval);
240 *start_selection = newval_chars;
242 *cursor_position += change_chars;
244 gnc_basic_cell_set_value_internal (&cell->cell, match_str);
250 gnc_quickfill_cell_leave (
BasicCell * _cell)
258 gnc_quickfill_cell_destroy (
BasicCell *bcell)
262 if (!cell->use_quickfill_cache)
264 gnc_quickfill_destroy (cell->qf);
268 g_free (cell->original);
269 cell->original = NULL;
271 cell->cell.enter_cell = NULL;
272 cell->cell.modify_verify = NULL;
273 cell->cell.leave_cell = NULL;
274 cell->cell.set_value = NULL;
280 gnc_basic_cell_init (&(cell->cell));
282 cell->qf = gnc_quickfill_new ();
283 cell->use_quickfill_cache = FALSE;
284 cell->sort = QUICKFILL_LIFO;
285 cell->original = NULL;
287 cell->cell.destroy = gnc_quickfill_cell_destroy;
289 cell->cell.enter_cell = gnc_quickfill_cell_enter;
290 cell->cell.modify_verify = gnc_quickfill_cell_modify_verify;
291 cell->cell.leave_cell = gnc_quickfill_cell_leave;
292 cell->cell.set_value = gnc_quickfill_cell_set_value_internal;
296 gnc_quickfill_cell_new (
void)
302 gnc_quickfill_cell_init (cell);
308 gnc_quickfill_cell_set_value (
QuickFillCell *cell,
const char * value)
313 gnc_basic_cell_set_value_internal (&cell->cell, value);
318 gnc_quickfill_cell_set_sort (
QuickFillCell *cell, QuickFillSort sort)
327 gnc_quickfill_cell_set_original (
QuickFillCell *cell,
const char *original)
332 g_free (cell->original);
334 if ((original != NULL) && (*original != 0))
335 cell->original = strdup (original);
337 cell->original = NULL;
341 gnc_quickfill_cell_add_completion (
QuickFillCell *cell,
const char *completion)
355 if (!cell->use_quickfill_cache)
357 cell->use_quickfill_cache = TRUE;
358 gnc_quickfill_destroy (cell->qf);
360 cell->qf = shared_qf;
void gnc_quickfill_insert(QuickFill *qf, const char *text, QuickFillSort sort)
utility functions for the GnuCash UI
QuickFill * gnc_quickfill_get_string_match(QuickFill *qf, const char *str)
const char * gnc_quickfill_string(QuickFill *qf)