X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-dialog.c;h=9c854a699e66f153ef878cc8faa4867d780b3b33;hb=bcebdcd4f6c599d2c214fd3fa64d602f7df7be69;hp=1e4216175b41e1a536a4d64decbca52a89911afc;hpb=b367f5ac49aa1b4f0ea7d76e322e40b824f607b9;p=pspp diff --git a/src/ui/gui/psppire-dialog.c b/src/ui/gui/psppire-dialog.c index 1e4216175b..9c854a699e 100644 --- a/src/ui/gui/psppire-dialog.c +++ b/src/ui/gui/psppire-dialog.c @@ -86,22 +86,6 @@ psppire_dialog_get_type (void) static GObjectClass *parent_class = NULL; -static void -psppire_dialog_finalize (GObject *object) -{ - PsppireDialog *dialog ; - - g_return_if_fail (object != NULL); - g_return_if_fail (PSPPIRE_IS_DIALOG (object)); - - dialog = PSPPIRE_DIALOG (object); - - if (G_OBJECT_CLASS (parent_class)->finalize) - G_OBJECT_CLASS (parent_class)->finalize (object); -} - - - /* Properties */ enum { @@ -286,7 +270,7 @@ psppire_dialog_class_init (PsppireDialogClass *class) G_TYPE_STRING); - object_class->finalize = psppire_dialog_finalize; + parent_class = g_type_class_peek_parent (class); } @@ -322,6 +306,8 @@ psppire_dialog_init (PsppireDialog *dialog) dialog->box = NULL; dialog->contents_are_valid = NULL; dialog->validity_data = NULL; + dialog->contents_are_acceptable = NULL; + dialog->acceptable_data = NULL; dialog->slidable = FALSE; g_value_init (&value, orientation_spec->value_type); @@ -545,6 +531,10 @@ psppire_orientation_get_type (void) } +/* Sets a predicate function that is checked after each change that the user + makes to the dialog's state. If the predicate function returns false, then + "OK" and other buttons that accept the dialog's settings will be + disabled. */ void psppire_dialog_set_valid_predicate (PsppireDialog *dialog, ContentsAreValid contents_are_valid, @@ -554,6 +544,30 @@ psppire_dialog_set_valid_predicate (PsppireDialog *dialog, dialog->validity_data = data; } +/* Sets a predicate function that is called after "OK" or another button that + accepts the dialog's settings is pushed. If the predicate function returns + false, then the button push is ignored. (If the predicate function returns + false, then it should take some action to notify the user why the contents + are unacceptable, e.g. pop up a dialog box.) + + An accept predicate is preferred over a validity predicate when the reason + why the dialog settings are unacceptable may not be obvious to the user, so + that the user needs a helpful message to explain. */ +void +psppire_dialog_set_accept_predicate (PsppireDialog *dialog, + ContentsAreValid contents_are_acceptable, + gpointer data) +{ + dialog->contents_are_acceptable = contents_are_acceptable; + dialog->acceptable_data = data; +} + +gboolean +psppire_dialog_is_acceptable (const PsppireDialog *dialog) +{ + return (dialog->contents_are_acceptable == NULL + || dialog->contents_are_acceptable (dialog->acceptable_data)); +}