summaryrefslogtreecommitdiff
path: root/src/mate-calc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mate-calc.c')
-rw-r--r--src/mate-calc.c433
1 files changed, 376 insertions, 57 deletions
diff --git a/src/mate-calc.c b/src/mate-calc.c
index c5439af..15efc97 100644
--- a/src/mate-calc.c
+++ b/src/mate-calc.c
@@ -1,34 +1,29 @@
-/* Copyright (c) 1987-2008 Sun Microsystems, Inc. All Rights Reserved.
- * Copyright (c) 2008-2009 Robert Ancell
+/*
+ * Copyright (C) 1987-2008 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright (C) 2008-2011 Robert Ancell
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301, USA.
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 2 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <locale.h>
+#include <glib/gi18n.h>
-#include "currency.h"
-#include "unittest.h"
#include "math-window.h"
+#include "math-preferences.h"
#include "mp-equation.h"
+#include "unit-manager.h"
static GSettings *settings = NULL;
static MathWindow *window;
+static MathPreferencesDialog *preferences_dialog;
static void
version(const gchar *progname)
@@ -38,18 +33,26 @@ version(const gchar *progname)
}
+static int
+do_convert(const MPNumber *x, const char *x_units, const char *z_units, MPNumber *z, void *data)
+{
+ return unit_manager_convert_by_symbol(unit_manager_get_default(), x, x_units, z_units, z);
+}
+
+
static void
solve(const char *equation)
{
MPEquationOptions options;
MPErrorCode error;
MPNumber result;
- char result_str[1024];
+ char *result_str;
memset(&options, 0, sizeof(options));
options.base = 10;
options.wordlen = 32;
options.angle_units = MP_DEGREES;
+ options.convert = do_convert;
error = mp_equation_parse(equation, &options, &result, NULL);
if(error == PARSER_ERR_MP) {
@@ -61,7 +64,7 @@ solve(const char *equation)
exit(1);
}
else {
- mp_cast_to_string(&result, 10, 10, 9, 1, result_str, 1024);
+ result_str = mp_serializer_to_string(mp_serializer_new(MP_DISPLAY_FORMAT_AUTOMATIC, 10, 9), &result);
printf("%s\n", result_str);
exit(0);
}
@@ -107,7 +110,6 @@ usage(const gchar *progname, gboolean show_application, gboolean show_gtk)
fprintf(stderr,
/* Description on mate-calc application options displayed on command-line */
_("Application Options:\n"
- " -u, --unittest Perform unit tests\n"
" -s, --solve <equation> Solve the given equation"));
fprintf(stderr,
"\n\n");
@@ -158,10 +160,6 @@ get_options(int argc, char *argv[])
else
solve(argv[i]);
}
- else if (strcmp(arg, "-u") == 0 ||
- strcmp(arg, "--unittest") == 0) {
- unittest();
- }
else {
fprintf(stderr,
/* Error printed to stderr when user provides an unknown command-line argument */
@@ -175,52 +173,291 @@ get_options(int argc, char *argv[])
static void
-quit_cb(MathWindow *window)
+accuracy_cb(MathEquation *equation, GParamSpec *spec)
{
- MathEquation *equation;
- MathButtons *buttons;
+ g_settings_set_int(settings, "accuracy", math_equation_get_accuracy(equation));
+}
- equation = math_window_get_equation(window);
- buttons = math_window_get_buttons(window);
- g_settings_set_int(settings, "accuracy", math_equation_get_accuracy(equation));
+static void
+word_size_cb(MathEquation *equation, GParamSpec *spec)
+{
g_settings_set_int(settings, "word-size", math_equation_get_word_size(equation));
- g_settings_set_int(settings, "base", math_buttons_get_programming_base(buttons));
+}
+
+
+static void
+show_thousands_separators_cb(MathEquation *equation, GParamSpec *spec)
+{
g_settings_set_boolean(settings, "show-thousands", math_equation_get_show_thousands_separators(equation));
+}
+
+
+static void
+show_trailing_zeroes_cb(MathEquation *equation, GParamSpec *spec)
+{
g_settings_set_boolean(settings, "show-zeroes", math_equation_get_show_trailing_zeroes(equation));
+}
+
+
+static void
+number_format_cb(MathEquation *equation, GParamSpec *spec)
+{
g_settings_set_enum(settings, "number-format", math_equation_get_number_format(equation));
+}
+
+
+static void
+angle_unit_cb(MathEquation *equation, GParamSpec *spec)
+{
g_settings_set_enum(settings, "angle-units", math_equation_get_angle_units(equation));
- g_settings_set_enum(settings, "button-mode", math_buttons_get_mode(buttons));
+}
+
+
+static void
+source_currency_cb(MathEquation *equation, GParamSpec *spec)
+{
g_settings_set_string(settings, "source-currency", math_equation_get_source_currency(equation));
+}
+
+
+static void
+target_currency_cb(MathEquation *equation, GParamSpec *spec)
+{
g_settings_set_string(settings, "target-currency", math_equation_get_target_currency(equation));
- g_settings_sync();
+}
+
+
+static void
+source_units_cb(MathEquation *equation, GParamSpec *spec)
+{
+ g_settings_set_string(settings, "source-units", math_equation_get_source_units(equation));
+}
- currency_free_resources();
- gtk_main_quit();
+
+static void
+target_units_cb(MathEquation *equation, GParamSpec *spec)
+{
+ g_settings_set_string(settings, "target-units", math_equation_get_target_units(equation));
}
-int
-main(int argc, char **argv)
+static void
+programming_base_cb(MathButtons *buttons, GParamSpec *spec)
+{
+ g_settings_set_int(settings, "base", math_buttons_get_programming_base(buttons));
+}
+
+
+static void
+mode_cb(MathButtons *buttons, GParamSpec *spec, GApplication *app)
+{
+ const char *state;
+ GAction *action;
+
+ g_settings_set_enum(settings, "button-mode", math_buttons_get_mode(buttons));
+
+ switch(math_buttons_get_mode(buttons))
+ {
+ default:
+ case BASIC:
+ state = "basic";
+ //FIXME: Should it revert to decimal mode? math_equation_set_number_format(window->priv->equation, DEC);
+ break;
+
+ case ADVANCED:
+ state = "advanced";
+ break;
+
+ case FINANCIAL:
+ state = "financial";
+ break;
+
+ case PROGRAMMING:
+ state = "programming";
+ break;
+ }
+
+ action = g_action_map_lookup_action(G_ACTION_MAP(app), "mode");
+ g_simple_action_set_state(G_SIMPLE_ACTION(action),
+ g_variant_new_string(state));
+}
+
+
+static void
+copy_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ math_equation_copy(math_window_get_equation(window));
+}
+
+
+static void
+paste_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ math_equation_paste(math_window_get_equation(window));
+}
+
+
+static void
+undo_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ math_equation_undo(math_window_get_equation(window));
+}
+
+
+static void
+redo_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ math_equation_redo(math_window_get_equation(window));
+}
+
+
+static void
+mode_changed_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ const char *mode_str;
+ int mode = BASIC;
+
+ mode_str = g_variant_get_string(parameter, NULL);
+ if (strcmp(mode_str, "basic") == 0)
+ mode = BASIC;
+ else if (strcmp(mode_str, "advanced") == 0)
+ mode = ADVANCED;
+ else if (strcmp(mode_str, "financial") == 0)
+ mode = FINANCIAL;
+ else if (strcmp(mode_str, "programming") == 0)
+ mode = PROGRAMMING;
+ math_buttons_set_mode(math_window_get_buttons(window), mode);
+}
+
+
+static void
+show_preferences_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ if (!preferences_dialog) {
+ preferences_dialog = math_preferences_dialog_new(math_window_get_equation(window));
+ gtk_window_set_transient_for(GTK_WINDOW(preferences_dialog), GTK_WINDOW(window));
+ }
+ gtk_window_present(GTK_WINDOW(preferences_dialog));
+}
+
+
+static void
+help_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ GdkScreen *screen;
+ GError *error = NULL;
+
+ screen = gtk_widget_get_screen(GTK_WIDGET(window));
+ gtk_show_uri(screen, "help:mate-calc", gtk_get_current_event_time(), &error);
+
+ if (error != NULL)
+ {
+ GtkWidget *d;
+ /* Translators: Error message displayed when unable to launch help browser */
+ const char *message = _("Unable to open help file");
+
+ d = gtk_message_dialog_new(GTK_WINDOW (window),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
+ "%s", message);
+ gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG (d),
+ "%s", error->message);
+ g_signal_connect(d, "response", G_CALLBACK(gtk_widget_destroy), NULL);
+ gtk_window_present(GTK_WINDOW(d));
+
+ g_error_free(error);
+ }
+}
+
+
+static void
+about_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ const gchar *authors[] = {
+ "Rich Burridge <[email protected]>",
+ "Robert Ancell <[email protected]>",
+ "Klaus Niederkrüger <[email protected]>",
+ "Robin Sonefors <[email protected]>",
+ NULL
+ };
+ const gchar *documenters[] = {
+ "Sun Microsystems",
+ NULL
+ };
+
+ /* The translator credits. Please translate this with your name(s). */
+ const gchar *translator_credits = _("translator-credits");
+
+ /* The license this software is under (GPL2+) */
+ char *license = _("mate-calc is free software; you can redistribute it and/or modify\n"
+ "it under the terms of the GNU General Public License as published by\n"
+ "the Free Software Foundation; either version 2 of the License, or\n"
+ "(at your option) any later version.\n"
+ "\n"
+ "mate-calc is distributed in the hope that it will be useful,\n"
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+ "GNU General Public License for more details.\n"
+ "\n"
+ "You should have received a copy of the GNU General Public License\n"
+ "along with mate-calc; if not, write to the Free Software Foundation, Inc.,\n"
+ "151 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA");
+
+ gtk_show_about_dialog(GTK_WINDOW(window),
+ "name",
+ /* Program name in the about dialog */
+ _("mate-calc"),
+ "version", VERSION,
+ "copyright",
+ /* Copyright notice in the about dialog */
+ _("\xc2\xa9 1986–2010 The gcalctool authors\n 2011-2012 mate-calc authors"),
+ "license", license,
+ "comments",
+ /* Short description in the about dialog */
+ _("Calculator with financial and scientific modes."),
+ "authors", authors,
+ "documenters", documenters,
+ "translator_credits", translator_credits,
+ "logo-icon-name", "accessories-calculator",
+ "website", "http://mate-desktop.org",
+ NULL);
+}
+
+
+static void
+quit_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data)
+{
+ gtk_widget_destroy(GTK_WIDGET(window));
+}
+
+
+static GActionEntry app_entries[] = {
+ { "copy", copy_cb, NULL, NULL, NULL },
+ { "paste", paste_cb, NULL, NULL, NULL },
+ { "undo", undo_cb, NULL, NULL, NULL },
+ { "redo", redo_cb, NULL, NULL, NULL },
+ { "mode", mode_changed_cb, "s", "\"basic\"", NULL },
+ { "preferences", show_preferences_cb, NULL, NULL, NULL },
+ { "help", help_cb, NULL, NULL, NULL },
+ { "about", about_cb, NULL, NULL, NULL },
+ { "quit", quit_cb, NULL, NULL, NULL },
+};
+
+
+static void
+startup_cb(GApplication *application)
{
MathEquation *equation;
+ MathButtons *buttons;
int accuracy = 9, word_size = 64, base = 10;
gboolean show_tsep = FALSE, show_zeroes = FALSE;
- DisplayFormat number_format;
+ MpDisplayFormat number_format;
MPAngleUnit angle_units;
ButtonMode button_mode;
gchar *source_currency, *target_currency;
-
- g_type_init();
-
- bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
- bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
- textdomain(GETTEXT_PACKAGE);
-
- /* Seed random number generator. */
- srand48((long) time((time_t *) 0));
-
- get_options(argc, argv);
+ gchar *source_units, *target_units;
+ GMenu *menu, *section;
settings = g_settings_new ("org.mate.calc");
accuracy = g_settings_get_int(settings, "accuracy");
@@ -233,6 +470,8 @@ main(int argc, char **argv)
button_mode = g_settings_get_enum(settings, "button-mode");
source_currency = g_settings_get_string(settings, "source-currency");
target_currency = g_settings_get_string(settings, "target-currency");
+ source_units = g_settings_get_string(settings, "source-units");
+ target_units = g_settings_get_string(settings, "target-units");
equation = math_equation_new();
math_equation_set_accuracy(equation, accuracy);
@@ -243,18 +482,98 @@ main(int argc, char **argv)
math_equation_set_angle_units(equation, angle_units);
math_equation_set_source_currency(equation, source_currency);
math_equation_set_target_currency(equation, target_currency);
+ math_equation_set_source_units(equation, source_units);
+ math_equation_set_target_units(equation, target_units);
g_free(source_currency);
g_free(target_currency);
+ g_free(source_units);
+ g_free(target_units);
+
+ g_signal_connect(equation, "notify::accuracy", G_CALLBACK(accuracy_cb), NULL);
+ g_signal_connect(equation, "notify::word-size", G_CALLBACK(word_size_cb), NULL);
+ g_signal_connect(equation, "notify::show-thousands-separators", G_CALLBACK(show_thousands_separators_cb), NULL);
+ g_signal_connect(equation, "notify::show-trailing-zeroes", G_CALLBACK(show_trailing_zeroes_cb), NULL);
+ g_signal_connect(equation, "notify::number-format", G_CALLBACK(number_format_cb), NULL);
+ g_signal_connect(equation, "notify::angle-units", G_CALLBACK(angle_unit_cb), NULL);
+ g_signal_connect(equation, "notify::source-currency", G_CALLBACK(source_currency_cb), NULL);
+ g_signal_connect(equation, "notify::target-currency", G_CALLBACK(target_currency_cb), NULL);
+ g_signal_connect(equation, "notify::source-units", G_CALLBACK(source_units_cb), NULL);
+ g_signal_connect(equation, "notify::target-units", G_CALLBACK(target_units_cb), NULL);
+
+ g_action_map_add_action_entries(G_ACTION_MAP(application), app_entries, G_N_ELEMENTS(app_entries), NULL);
+
+ window = math_window_new(GTK_APPLICATION(application), equation);
+ buttons = math_window_get_buttons(window);
+ math_buttons_set_programming_base(buttons, base);
+ math_buttons_set_mode(buttons, button_mode); // FIXME: We load the basic buttons even if we immediately switch to the next type
+ g_signal_connect(buttons, "notify::programming-base", G_CALLBACK(programming_base_cb), NULL);
+ g_signal_connect(buttons, "notify::mode", G_CALLBACK(mode_cb), application);
+ mode_cb (buttons, NULL, application);
+
+ menu = g_menu_new();
+
+ section = g_menu_new();
+ g_menu_append(section, _("Basic"), "app.mode::basic");
+ g_menu_append(section, _("Advanced"), "app.mode::advanced");
+ g_menu_append(section, _("Financial"), "app.mode::financial");
+ g_menu_append(section, _("Programming"), "app.mode::programming");
+ g_menu_append_section(menu, _("Mode"), G_MENU_MODEL(section));
+
+ section = g_menu_new();
+ g_menu_append(section, _("Preferences"), "app.preferences");
+ g_menu_append_section(menu, NULL, G_MENU_MODEL(section));
+
+ section = g_menu_new();
+ g_menu_append(section, _("About Calculator"), "app.about");
+ g_menu_append(section, _("Help"), "app.help");
+ g_menu_append(section, _("Quit"), "app.quit");
+ g_menu_append_section(menu, NULL, G_MENU_MODEL(section));
+
+ gtk_application_set_app_menu(GTK_APPLICATION(application), G_MENU_MODEL(menu));
+
+ gtk_application_add_accelerator(GTK_APPLICATION(application), "<control>Q", "app.quit", NULL);
+ gtk_application_add_accelerator(GTK_APPLICATION(application), "F1", "app.help", NULL);
+ gtk_application_add_accelerator(GTK_APPLICATION(application), "<control>C", "app.copy", NULL);
+ gtk_application_add_accelerator(GTK_APPLICATION(application), "<control>V", "app.paste", NULL);
+ gtk_application_add_accelerator(GTK_APPLICATION(application), "<control>Z", "app.undo", NULL);
+ gtk_application_add_accelerator(GTK_APPLICATION(application), "<control><shift>Z", "app.redo", NULL);
+}
+
+
+static void
+activate_cb(GApplication *application)
+{
+ gtk_window_present(GTK_WINDOW(window));
+}
+
+
+int
+main(int argc, char **argv)
+{
+ GtkApplication *app;
+ int status;
+
+ setlocale(LC_ALL, "");
+ bindtextdomain(GETTEXT_PACKAGE, LOCALE_DIR);
+ bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+ textdomain(GETTEXT_PACKAGE);
+
+ /* Seed random number generator. */
+ srand48((long) time((time_t *) 0));
+
+ g_type_init();
+
+ get_options(argc, argv);
gtk_init(&argc, &argv);
- window = math_window_new(equation);
- g_signal_connect(G_OBJECT(window), "quit", G_CALLBACK(quit_cb), NULL);
- math_buttons_set_programming_base(math_window_get_buttons(window), base);
- math_buttons_set_mode(math_window_get_buttons(window), button_mode); // FIXME: We load the basic buttons even if we immediately switch to the next type
+ gtk_window_set_default_icon_name("accessories-calculator");
+
+ app = gtk_application_new(NULL, G_APPLICATION_NON_UNIQUE);
+ g_signal_connect(app, "startup", G_CALLBACK(startup_cb), NULL);
+ g_signal_connect(app, "activate", G_CALLBACK(activate_cb), NULL);
- gtk_widget_show(GTK_WIDGET(window));
- gtk_main();
+ status = g_application_run(G_APPLICATION(app), argc, argv);
- return(0);
+ return status;
}