29 #include <gdk/gdkkeysyms.h>
30 #include <glib/gi18n.h>
36 #include "dialog-utils.h"
43 #include "guile-util.h"
50 #define GNC_PREF_LAST_GEOMETRY "last-geometry"
61 gnc_get_deficit_color(GdkColor *color)
78 gnc_set_label_color(GtkWidget *label,
gnc_numeric value)
87 cm = gtk_widget_get_colormap(GTK_WIDGET(label));
88 gtk_widget_ensure_style(GTK_WIDGET(label));
89 style = gtk_widget_get_style(GTK_WIDGET(label));
91 style = gtk_style_copy(style);
97 gnc_get_deficit_color(&style->fg[GTK_STATE_NORMAL]);
98 gdk_colormap_alloc_color(cm, &style->fg[GTK_STATE_NORMAL], FALSE, TRUE);
101 style->fg[GTK_STATE_NORMAL] = style->black;
103 gtk_widget_set_style(label, style);
105 g_object_unref(style);
121 gnc_restore_window_size(
const char *group, GtkWindow *window)
123 gint wpos[2], wsize[2];
128 g_return_if_fail(group != NULL);
129 g_return_if_fail(window != NULL);
135 if (g_variant_is_of_type (geometry, (
const GVariantType *)
"(iiii)") )
137 gint screen_width = gdk_screen_width();
138 gint screen_height = gdk_screen_height();
140 g_variant_get (geometry,
"(iiii)",
142 &wsize[0], &wsize[1]);
143 DEBUG(
"geometry from preferences - wpos[0]: %d, wpos[1]: %d, wsize[0]: %d, wsize[1]: %d",
144 wpos[0], wpos[1], wsize[0], wsize[1]);
147 if ((wpos[0] != -1) && (wpos[1] != -1))
150 if (screen_width != 0)
151 wpos[0] = wpos[0] % screen_width;
152 if (screen_height != 0)
153 wpos[1] = wpos[1] % screen_height;
154 DEBUG(
"geometry after screen adaption - wpos[0]: %d, wpos[1]: %d, wsize[0]: %d, wsize[1]: %d",
155 wpos[0], wpos[1], wsize[0], wsize[1]);
157 gtk_window_move(window, wpos[0], wpos[1]);
161 if ((wsize[0] > 0) && (wsize[1] > 0))
162 gtk_window_resize(window, wsize[0], wsize[1]);
164 g_variant_unref (geometry);
181 gnc_save_window_size(
const char *group, GtkWindow *window)
183 gint wpos[2], wsize[2];
186 g_return_if_fail(group != NULL);
187 g_return_if_fail(window != NULL);
192 gtk_window_get_position(GTK_WINDOW(window), &wpos[0], &wpos[1]);
193 gtk_window_get_size(GTK_WINDOW(window), &wsize[0], &wsize[1]);
194 geometry = g_variant_new (
"(iiii)", wpos[0], wpos[1],
209 gnc_window_adjust_for_screen(GtkWindow * window)
219 g_return_if_fail(GTK_IS_WINDOW(window));
220 if (GTK_WIDGET(window)->window == NULL)
223 screen_width = gdk_screen_width();
224 screen_height = gdk_screen_height();
225 gdk_drawable_get_size(GTK_WIDGET(window)->window, &width, &height);
227 if ((width <= screen_width) && (height <= screen_height))
230 width = MIN(width, screen_width - 10);
231 width = MAX(width, 0);
233 height = MIN(height, screen_height - 10);
234 height = MAX(height, 0);
236 gdk_window_resize(GTK_WIDGET(window)->window, width, height);
237 gtk_widget_queue_resize(GTK_WIDGET(window));
241 gnc_handle_date_accelerator (GdkEventKey *event,
243 const char *date_str)
247 g_return_val_if_fail (event != NULL, FALSE);
248 g_return_val_if_fail (tm != NULL, FALSE);
249 g_return_val_if_fail (date_str != NULL, FALSE);
251 if (event->type != GDK_KEY_PRESS)
254 if ((tm->tm_mday <= 0) || (tm->tm_mon == -1) || (tm->tm_year == -1))
257 g_date_set_dmy (&gdate,
266 switch (event->keyval)
271 if (event->state & GDK_SHIFT_MASK)
272 g_date_add_days (&gdate, 7);
273 else if (event->state & GDK_MOD1_MASK)
274 g_date_add_months (&gdate, 1);
275 else if (event->state & GDK_CONTROL_MASK)
276 g_date_add_years (&gdate, 1);
278 g_date_add_days (&gdate, 1);
279 g_date_to_struct_tm (&gdate, tm);
283 case GDK_KP_Subtract:
295 uc = g_utf8_get_char (c);
298 c = g_utf8_next_char (c);
305 if (event->state & GDK_SHIFT_MASK)
306 g_date_subtract_days (&gdate, 7);
307 else if (event->state & GDK_MOD1_MASK)
308 g_date_subtract_months (&gdate, 1);
309 else if (event->state & GDK_CONTROL_MASK)
310 g_date_subtract_years (&gdate, 1);
312 g_date_subtract_days (&gdate, 1);
313 g_date_to_struct_tm (&gdate, tm);
326 if (event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK))
330 switch (event->keyval)
333 case GDK_bracketright:
335 g_date_add_months (&gdate, 1);
339 case GDK_bracketleft:
341 g_date_subtract_months (&gdate, 1);
347 g_date_set_day (&gdate, 1);
353 g_date_set_day (&gdate, 1);
354 g_date_add_months (&gdate, 1);
355 g_date_subtract_days (&gdate, 1);
361 g_date_set_day (&gdate, 1);
362 g_date_set_month (&gdate, 1);
368 g_date_set_day (&gdate, 1);
369 g_date_set_month (&gdate, 1);
370 g_date_add_years (&gdate, 1);
371 g_date_subtract_days (&gdate, 1);
384 g_date_to_struct_tm (&gdate, tm);
394 GModule *allsymbols = NULL;
403 gnc_builder_add_from_file (GtkBuilder *builder,
const char *filename,
const char *root)
405 GError* error = NULL;
407 gchar *gnc_builder_dir;
410 g_return_val_if_fail (builder != NULL, FALSE);
411 g_return_val_if_fail (filename != NULL, FALSE);
412 g_return_val_if_fail (root != NULL, FALSE);
414 gnc_builder_dir = gnc_path_get_gtkbuilderdir ();
415 fname = g_build_filename(gnc_builder_dir, filename, (
char *)NULL);
416 g_free (gnc_builder_dir);
419 gchar *localroot = g_strdup(root);
420 gchar *objects[] = { localroot, NULL };
421 result = gtk_builder_add_objects_from_file (builder, fname, objects, &error);
424 PWARN (
"Couldn't load builder file: %s", error->message);
425 g_error_free (error);
440 gnc_builder_connect_full_func(GtkBuilder *builder,
441 GObject *signal_object,
442 const gchar *signal_name,
443 const gchar *handler_name,
444 GObject *connect_object,
449 GCallback *p_func = &func;
451 if (allsymbols == NULL)
454 allsymbols = g_module_open(NULL, 0);
457 if (!g_module_symbol(allsymbols, handler_name, (gpointer *)p_func))
461 func = dlsym(RTLD_DEFAULT, handler_name);
467 PWARN(
"ggaff: could not find signal handler '%s'.", handler_name);
473 g_signal_connect_object (signal_object, signal_name, func,
474 connect_object, flags);
476 g_signal_connect_data(signal_object, signal_name, func,
477 user_data, NULL , flags);
485 gnc_gtk_dialog_add_button (GtkWidget *dialog,
const gchar *label,
const gchar *stock_id, guint response)
489 button = gtk_button_new_with_mnemonic(label);
494 image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_BUTTON);
495 gtk_button_set_image(GTK_BUTTON(button), image);
497 g_object_set (button,
"can-default", TRUE, NULL);
498 gtk_widget_show_all(button);
499 gtk_dialog_add_action_widget(GTK_DIALOG(dialog), button, response);
503 gnc_perm_button_cb (GtkButton *perm, gpointer user_data)
505 gboolean perm_active;
507 perm_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(perm));
508 gtk_widget_set_sensitive(user_data, !perm_active);
512 gnc_dialog_run (GtkDialog *dialog,
const gchar *pref_name)
514 GtkWidget *perm, *temp;
529 if (GTK_IS_MESSAGE_DIALOG(dialog))
532 g_object_get(dialog,
"message-type", &type, (gchar*)NULL);
533 ask = (type == GTK_MESSAGE_QUESTION);
540 perm = gtk_check_button_new_with_mnemonic
542 ? _(
"Remember and don't _ask me again.")
543 : _(
"Don't _tell me again."));
544 temp = gtk_check_button_new_with_mnemonic
546 ? _(
"Remember and don't ask me again this _session.")
547 : _(
"Don't tell me again this _session."));
548 gtk_widget_show(perm);
549 gtk_widget_show(temp);
550 gtk_box_pack_start(GTK_BOX(dialog->vbox), perm, TRUE, TRUE, 0);
551 gtk_box_pack_start(GTK_BOX(dialog->vbox), temp, TRUE, TRUE, 0);
552 g_signal_connect(perm,
"clicked", G_CALLBACK(gnc_perm_button_cb), temp);
555 response = gtk_dialog_run(dialog);
556 if ((response == GTK_RESPONSE_NONE) || (response == GTK_RESPONSE_DELETE_EVENT))
558 return GTK_RESPONSE_CANCEL;
561 if (response != GTK_RESPONSE_CANCEL)
564 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(perm)))
568 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(temp)))
581 gnc_new_book_option_display (GtkWidget *parent)
584 gint result = GTK_RESPONSE_HELP;
588 gtk_window_set_transient_for (GTK_WINDOW(window), GTK_WINDOW(parent));
593 while (result == GTK_RESPONSE_HELP)
595 result = gtk_dialog_run(GTK_DIALOG(window));
void gnc_gdate_set_today(GDate *gd)
GtkWidget * gnc_book_options_dialog_cb(gboolean modal, gchar *title)
gboolean gnc_prefs_set_value(const gchar *group, const gchar *pref_name, GVariant *value)
utility functions for the GnuCash UI
#define DEBUG(format, args...)
gboolean gnc_prefs_set_int(const gchar *group, const gchar *pref_name, gint value)
gchar dateSeparator(void)
#define ENTER(format, args...)
gint gnc_prefs_get_int(const gchar *group, const gchar *pref_name)
Functions for adding content to a window.
gboolean gnc_numeric_negative_p(gnc_numeric a)
#define PWARN(format, args...)
All type declarations for the whole Gnucash engine.
GVariant * gnc_prefs_get_value(const gchar *group, const gchar *pref_name)
Generic api to store and retrieve preferences.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
#define LEAVE(format, args...)
Commodity handling public routines.
const gchar * QofLogModule