+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <locale.h>
+#include <gtk/gtk.h>
+
+#include "tmalloc.h"
+#include "xgalaxy.h"
+#include "gtkcellrendererbutton.h"
+
+XGlalaxyStruct XGalaxy;
+
+gint
+delete( GtkWidget *widget, GtkWidget *event, gpointer data ) {
+ if ( XGalaxy.runing && !XGalaxy.paused ) {
+ XGalaxy.request_to_exit = 1;
+ /* wait thread */
+ while(XGalaxy.request_to_exit);
+ }
+
+ gtk_main_quit();
+ return(FALSE);
+}
+
+gboolean
+check_number(GtkWidget *widget, GdkEventFocus *event, gpointer user_data) {
+ char buf[128];
+ if ( atof(gtk_entry_get_text(GTK_ENTRY(widget))) <= 0 )
+ sprintf(buf, "%G", *(double*)user_data );
+ else
+ sprintf(buf, "%G", atof(gtk_entry_get_text(GTK_ENTRY(widget))) );
+ gtk_entry_set_text(GTK_ENTRY(widget), buf);
+ return FALSE;
+}
+
+typedef struct {
+ GtkListStore *store;
+ int colnumber;
+} ColInfo;
+
+void
+set_edited_data(GtkCellRendererText *cellrenderertext, gchar *arg1, gchar *arg2, gpointer user_data) {
+ GtkTreeIter iter;
+ GtkTreePath *path;
+ ColInfo *info = (ColInfo*)user_data;
+ char buf[128];
+ double val = atof(arg2);
+
+ if ( XGalaxy.runing ) return;
+
+ path = gtk_tree_path_new_from_string (arg1);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL (info->store), &iter, path);
+ gtk_tree_path_free (path);
+
+ if ( info->colnumber==1 && val < 0 )
+ val=-val;
+ sprintf(buf,"%G", val);
+ gtk_list_store_set( info->store, &iter, info->colnumber, buf, -1);
+ editEntry(atoi(arg1), info->colnumber, val);
+ cntEntry();
+}
+
+static int row_to_delete=-1;
+
+void
+cell_toggled(GtkCellRendererButton *cell_renderer, gchar *path, gpointer user_data) {
+ GtkTreePath *treepath;
+ GtkTreeIter iter;
+ GtkListStore *store = GTK_LIST_STORE(user_data);
+
+ if ( XGalaxy.runing || row_to_delete>=0 ) return;
+
+ row_to_delete = atoi(path);
+ treepath = gtk_tree_path_new_from_string (path);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL (store), &iter, treepath);
+ gtk_tree_path_free (treepath);
+
+ gtk_list_store_set (GTK_LIST_STORE (store), &iter, 0, TRUE, -1);
+}
+
+gboolean
+button_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data) {
+ char path[16];
+ GtkTreePath *treepath;
+ GtkTreeIter iter;
+ GtkListStore *store = GTK_LIST_STORE(user_data);
+
+ if (row_to_delete<0)
+ return FALSE;
+
+ sprintf(path,"%d", row_to_delete);
+ treepath = gtk_tree_path_new_from_string (path);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL (store), &iter, treepath);
+ gtk_tree_path_free (treepath);
+
+ gtk_list_store_remove(store, &iter);
+ deleteEntry(row_to_delete);
+ cntEntry();
+
+ row_to_delete=-1;
+
+ return FALSE;
+}
+
+void
+append_row(GtkTreeViewColumn *treeviewcolumn, gpointer user_data) {
+ GtkTreeIter iter;
+ GtkListStore *store = GTK_LIST_STORE(user_data);
+ int i;
+
+ if ( XGalaxy.runing ) return;
+ gtk_list_store_append( store, &iter );
+ for(i=1;i<8;i++)
+ gtk_list_store_set( store, &iter, i, "0", -1);
+ addEntry(NULL);
+}
+
+static int size_allocation_treelist_oldwidth=0;
+
+static gint
+size_allocation_treelist(GtkWidget *widget, GtkAllocation *allocation, gpointer user_data) {
+ /* workaround to prevent size-allocation storm */
+ if ( size_allocation_treelist_oldwidth != allocation->width ) {
+ int i;
+ int colwidth = (allocation->width-18)/7;
+
+ for(i=1;i<8;i++)
+ gtk_tree_view_column_set_fixed_width(
+ gtk_tree_view_get_column(GTK_TREE_VIEW(widget), i),
+ colwidth
+ );
+
+ size_allocation_treelist_oldwidth=allocation->width;
+ }
+ return TRUE;
+}
+
+
+static double default_delta=3600;
+static double default_error=1e-8;
+
+GtkWidget*
+inputPage() {
+ GtkWidget *table, *frame;
+ GtkWidget *scrolled;
+ GtkWidget *label, *subtable, *aligment;
+ gchar *titles[8] = { "+", "Mass", "X", "Y", "Z", "Vx", "Vy", "Vz" };
+
+ table = gtk_table_new(3,100,FALSE);
+
+ frame=gtk_frame_new("Options");
+ gtk_container_set_border_width(GTK_CONTAINER (frame), 5);
+ gtk_table_attach_defaults(GTK_TABLE(table), frame, 0, 1, 0, 1);
+ gtk_widget_show (frame);
+
+ subtable = gtk_table_new(3,3,FALSE);
+
+ label = gtk_label_new("Delta T (secs):");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,1,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_container_set_border_width(GTK_CONTAINER (aligment), 3);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,0,1);
+
+ XGalaxy.deltaField = gtk_entry_new_with_max_length(15);
+ gtk_entry_set_text(GTK_ENTRY(XGalaxy.deltaField), "3600");
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.deltaField),"focus-out-event", (GtkSignalFunc) check_number, (gpointer)&default_delta);
+ gtk_widget_show(XGalaxy.deltaField);
+ aligment=gtk_alignment_new(0,1,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.deltaField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,0,1);
+
+ label = gtk_label_new("Quality:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_container_set_border_width(GTK_CONTAINER (aligment), 3);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,1,2);
+
+ XGalaxy.errorField = gtk_entry_new_with_max_length(15);
+ gtk_entry_set_text(GTK_ENTRY(XGalaxy.errorField), "1e-8");
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.errorField),"focus-out-event", (GtkSignalFunc) check_number, (gpointer)&default_error);
+ gtk_widget_show(XGalaxy.errorField);
+ aligment=gtk_alignment_new(0,0,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.errorField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,1,2);
+
+ gtk_widget_show(subtable);
+ gtk_container_add(GTK_CONTAINER(frame), subtable);
+
+ frame=gtk_frame_new("Summary information");
+ gtk_container_set_border_width(GTK_CONTAINER (frame), 5);
+ gtk_table_attach_defaults(GTK_TABLE(table), frame, 1, 2, 0, 1);
+ gtk_widget_show (frame);
+
+ subtable = gtk_table_new(4,2,FALSE);
+
+ label = gtk_label_new("Energy:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,0,1);
+
+ XGalaxy.dataEnergyField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.dataEnergyField), FALSE);
+ gtk_widget_show(XGalaxy.dataEnergyField);
+ aligment=gtk_alignment_new(0,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.dataEnergyField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,0,1);
+
+ label = gtk_label_new("Impulse:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,1,2);
+
+ XGalaxy.dataImpulseField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.dataImpulseField), FALSE);
+ gtk_widget_show(XGalaxy.dataImpulseField);
+ aligment=gtk_alignment_new(0,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.dataImpulseField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,1,2);
+
+ label = gtk_label_new("Moment:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,2,3);
+
+ XGalaxy.dataMomentField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.dataMomentField), FALSE);
+ gtk_widget_show(XGalaxy.dataMomentField);
+ aligment=gtk_alignment_new(0,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.dataMomentField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,2,3);
+
+ gtk_widget_show(subtable);
+ gtk_container_add(GTK_CONTAINER(frame), subtable);
+
+ scrolled = gtk_scrolled_window_new(NULL,NULL);
+ gtk_container_set_border_width(GTK_CONTAINER (scrolled), 5);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_table_attach_defaults(GTK_TABLE(table), scrolled, 0, 2, 1, 99);
+ gtk_widget_show (scrolled);
+
+ do {
+ int i;
+ GtkListStore *store = gtk_list_store_new (8,
+ G_TYPE_BOOLEAN, /* + */
+ G_TYPE_STRING, /* mass */
+ G_TYPE_STRING, /* X */
+ G_TYPE_STRING, /* Y */
+ G_TYPE_STRING, /* Z */
+ G_TYPE_STRING, /* Vx */
+ G_TYPE_STRING, /* Vy */
+ G_TYPE_STRING /* Vz */
+ );
+ XGalaxy.dataField = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
+
+ for(i=0;i<8;i++) {
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+
+ if ( i>0 ) {
+ ColInfo *info = tmalloc(sizeof(ColInfo));
+
+ info->store=store;
+ info->colnumber=i;
+ renderer = gtk_cell_renderer_text_new ();
+
+ g_object_set (G_OBJECT (renderer), "mode", GTK_CELL_RENDERER_MODE_EDITABLE, NULL);
+ g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL);
+ g_object_set (G_OBJECT (renderer), "editable-set", TRUE, NULL);
+ g_object_set (G_OBJECT (renderer), "single-paragraph-mode", TRUE, NULL);
+ gtk_signal_connect (GTK_OBJECT(renderer),"edited", (GtkSignalFunc) set_edited_data, info);
+ column = gtk_tree_view_column_new_with_attributes(
+ titles[i],
+ renderer,
+ "text",
+ i,
+ NULL
+ );
+ gtk_tree_view_column_set_clickable(column, FALSE);
+ gtk_tree_view_column_set_resizable(column, TRUE);
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_fixed_width(column, (640-56)/7);
+ } else {
+ renderer = gtk_cell_renderer_button_new();
+ g_object_set (G_OBJECT (renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
+ g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL);
+ gtk_signal_connect (GTK_OBJECT(renderer), "toggled", (GtkSignalFunc) cell_toggled, store);
+ column = gtk_tree_view_column_new_with_attributes(
+ titles[i],
+ renderer, "active", 0,
+ NULL
+ );
+ gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+ gtk_tree_view_column_set_fixed_width(column, 20);
+ gtk_tree_view_column_set_clickable(column, TRUE);
+ gtk_tree_view_column_set_resizable(column, FALSE);
+ gtk_signal_connect (GTK_OBJECT(column), "clicked", (GtkSignalFunc) append_row, store);
+ }
+ gtk_tree_view_append_column (GTK_TREE_VIEW (XGalaxy.dataField), column);
+ }
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.dataField),"button-release-event", (GtkSignalFunc) button_release, store);
+ } while(0);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.dataField),"size-allocate", (GtkSignalFunc) size_allocation_treelist, NULL);
+ gtk_widget_show(XGalaxy.dataField);
+ gtk_container_add(GTK_CONTAINER(scrolled), XGalaxy.dataField);
+
+ gtk_widget_show(table);
+
+ return table;
+}
+
+static gint
+size_allocation_clist(GtkWidget *widget, GtkAllocation *allocation, gpointer user_data) {
+ int i;
+ int colwidth = (allocation->width-52)/8;
+
+ for(i=0;i<8;i++)
+ gtk_clist_set_column_width (GTK_CLIST(widget), i, colwidth);
+
+ return FALSE;
+}
+
+GtkWidget*
+resPage() {
+ GtkWidget *scrolled, *frame, *label, *aligment, *subtable, *vbox;
+ gchar *titles[11] = { "Mass", "X", "Y", "Z", "Vx", "Vy", "Vz", "|V|", "A", "E", "I" };
+
+ vbox = gtk_vbox_new (FALSE, 1);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
+ gtk_widget_show (vbox);
+
+ frame=gtk_frame_new("Summary information");
+ gtk_container_set_border_width(GTK_CONTAINER (frame), 5);
+ gtk_widget_show (frame);
+
+ subtable = gtk_table_new(1,10,FALSE);
+
+ label = gtk_label_new("Energy:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 0,1,0,1);
+
+ XGalaxy.resEnergyField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resEnergyField), FALSE);
+ gtk_widget_show(XGalaxy.resEnergyField);
+ aligment=gtk_alignment_new(0.05,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resEnergyField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 1,2,0,1);
+
+ label = gtk_label_new("Impulse:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 2,3,0,1);
+
+ XGalaxy.resImpulseField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resImpulseField), FALSE);
+ gtk_widget_show(XGalaxy.resImpulseField);
+ aligment=gtk_alignment_new(0.05,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resImpulseField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 3,4,0,1);
+
+ label = gtk_label_new("Moment:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 4,5,0,1);
+
+ XGalaxy.resMomentField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resMomentField), FALSE);
+ gtk_widget_show(XGalaxy.resMomentField);
+ aligment=gtk_alignment_new(0.05,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resMomentField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 5,6,0,1);
+
+ label = gtk_label_new("Delta:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 6,7,0,1);
+
+ XGalaxy.resDeltaField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resDeltaField), FALSE);
+ gtk_widget_show(XGalaxy.resDeltaField);
+ aligment=gtk_alignment_new(0.05,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resDeltaField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 7,8,0,1);
+
+ label = gtk_label_new("Elapsed:");
+ gtk_label_set_line_wrap(GTK_LABEL(label), FALSE);
+ gtk_widget_show(label);
+ aligment=gtk_alignment_new(1,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), label);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 8,9,0,1);
+
+ XGalaxy.resTimeField = gtk_label_new("0");
+ gtk_label_set_line_wrap(GTK_LABEL(XGalaxy.resTimeField), FALSE);
+ gtk_widget_show(XGalaxy.resTimeField);
+ aligment=gtk_alignment_new(0.05,0.5,0,0);
+ gtk_container_add(GTK_CONTAINER(aligment), XGalaxy.resTimeField);
+ gtk_widget_show(aligment);
+ gtk_table_attach_defaults(GTK_TABLE(subtable), aligment, 9,10,0,1);
+
+ gtk_widget_show(subtable);
+
+ gtk_container_add(GTK_CONTAINER(frame), subtable);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);
+
+ scrolled = gtk_scrolled_window_new(NULL,NULL);
+ gtk_container_set_border_width(GTK_CONTAINER (scrolled), 5);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_widget_show (scrolled);
+
+ XGalaxy.resField = gtk_clist_new_with_titles( 8, titles);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.resField),"size-allocate", (GtkSignalFunc) size_allocation_clist, NULL);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.resField),"hide", (GtkSignalFunc) show_resCList, NULL);
+ gtk_clist_set_selection_mode(GTK_CLIST(XGalaxy.resField),GTK_SELECTION_SINGLE);
+ gtk_container_add(GTK_CONTAINER(scrolled), XGalaxy.resField);
+
+ gtk_widget_show(XGalaxy.resField);
+
+ gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0);
+
+ return vbox;
+}
+
+static void
+scale_clicked (GtkButton *button, gpointer user_data) {
+ if ( XGalaxy.trace )
+ return;
+ if ( (int)user_data )
+ XGalaxy.Scale *= 1.5;
+ else
+ XGalaxy.Scale /= 1.5;
+
+ drawGalaxy();
+}
+
+static void
+trace_clicked (GtkToggleButton *button, gpointer user_data) {
+ XGalaxy.trace = gtk_toggle_button_get_active(button);
+ drawGalaxy();
+}
+
+static void
+axis_clicked (GtkToggleButton *button, gpointer user_data) {
+ if ( XGalaxy.locksignal )
+ return;
+ if ( XGalaxy.trace ) {
+ XGalaxy.locksignal=1;
+ gtk_toggle_button_set_active( button, !gtk_toggle_button_get_active(button) );
+ XGalaxy.locksignal=0;
+ return;
+ }
+ XGalaxy.drawaxis = gtk_toggle_button_get_active(button);
+ drawGalaxy();
+}
+
+static gboolean
+mouse_button_press(GtkWidget *widget, GdkEventButton *event) {
+ XGalaxy.beginx = event->x;
+ XGalaxy.beginy = event->y;
+
+ memset( &(XGalaxy.motion.d), 0, sizeof(Vector));
+ XGalaxy.motion.w=1.0;
+
+ return FALSE;
+}
+
+GtkWidget*
+viewPage() {
+ GtkWidget *vbox, *hbox, *separator, *button, *table;
+ GtkTooltips *button_bar_tips;
+ button_bar_tips = gtk_tooltips_new ();
+
+ vbox = gtk_vbox_new (FALSE, 1);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
+ gtk_widget_show (vbox);
+
+ hbox=gtk_hbutton_box_new();
+ gtk_widget_show (hbox);
+
+ XGalaxy.buttonRun = gtk_toggle_button_new_with_label("Go!");
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.buttonRun),"toggled", (GtkSignalFunc) actionRun, NULL);
+ gtk_container_set_border_width(GTK_CONTAINER (XGalaxy.buttonRun), 5);
+ gtk_widget_show(XGalaxy.buttonRun);
+ gtk_box_pack_start (GTK_BOX (hbox), XGalaxy.buttonRun, FALSE, TRUE, 0);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.buttonRun, "Start modeling", "");
+
+ XGalaxy.buttonPause = gtk_toggle_button_new_with_label("Pause");
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.buttonPause),"toggled", (GtkSignalFunc) actionPause, NULL);
+ gtk_container_set_border_width(GTK_CONTAINER (XGalaxy.buttonPause), 5);
+ gtk_widget_show(XGalaxy.buttonPause);
+ gtk_box_pack_start (GTK_BOX (hbox), XGalaxy.buttonPause, FALSE, TRUE, 0);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.buttonPause, "Pause modeling", "");
+
+ button = gtk_button_new_with_label("Stop");
+ gtk_signal_connect (GTK_OBJECT(button),"clicked", (GtkSignalFunc) actionStop, NULL);
+ gtk_container_set_border_width(GTK_CONTAINER (button), 5);
+ gtk_widget_show(button);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Stop modeling", "");
+
+ //button = gtk_button_new_from_stock(GTK_STOCK_ZOOM_IN);
+ button = gtk_button_new_with_label("Scale +");
+ gtk_container_set_border_width(GTK_CONTAINER (button), 5);
+ gtk_widget_show(button);
+ gtk_signal_connect (GTK_OBJECT(button),"clicked", (GtkSignalFunc) scale_clicked, (gpointer)1);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Increase scale", "");
+
+ //button = gtk_button_new_from_stock(GTK_STOCK_ZOOM_OUT);
+ button = gtk_button_new_with_label("Scale -");
+ gtk_container_set_border_width(GTK_CONTAINER (button), 5);
+ gtk_widget_show(button);
+ gtk_signal_connect (GTK_OBJECT(button),"clicked", (GtkSignalFunc) scale_clicked, (gpointer)0);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Decrease scale", "");
+
+ button = gtk_toggle_button_new_with_label("Trace");
+ gtk_container_set_border_width(GTK_CONTAINER (button), 5);
+ gtk_widget_show(button);
+ gtk_signal_connect (GTK_OBJECT(button),"toggled", (GtkSignalFunc) trace_clicked, (gpointer)0);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Turn on/off trace of stars", "");
+
+ button = gtk_toggle_button_new_with_label("Axis");
+ gtk_container_set_border_width(GTK_CONTAINER (button), 5);
+ gtk_widget_show(button);
+ gtk_signal_connect (GTK_OBJECT(button),"toggled", (GtkSignalFunc) axis_clicked, (gpointer)0);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 0);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), button, "Axis show on/off", "");
+
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+
+ separator = gtk_hseparator_new();
+ gtk_widget_show(separator);
+
+ gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, TRUE, 0);
+
+
+ table = gtk_table_new(1000,1000,FALSE);
+
+ XGalaxy.YSlider = gtk_hscale_new_with_range(-180, 180, 1);
+ gtk_scale_set_draw_value(GTK_SCALE(XGalaxy.YSlider), FALSE);
+ gtk_range_set_value(GTK_RANGE(XGalaxy.YSlider), 0);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.YSlider),"value-changed", (GtkSignalFunc) angle_changed, (gpointer)'Y');
+ gtk_widget_show (XGalaxy.YSlider);
+ gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.YSlider, 1,999, 999,1000);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.YSlider, "Turn around Y-axis", "");
+
+ XGalaxy.XSlider = gtk_vscale_new_with_range(-180, 180, 1);
+ gtk_scale_set_draw_value(GTK_SCALE(XGalaxy.XSlider), FALSE);
+ gtk_range_set_value(GTK_RANGE(XGalaxy.XSlider), 0);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.XSlider),"value-changed", (GtkSignalFunc) angle_changed, (gpointer)'X');
+ gtk_widget_show (XGalaxy.XSlider);
+ gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.XSlider, 0,1, 0,999);
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.XSlider, "Turn around X-axis", "");
+
+ XGalaxy.ZSlider = gtk_vscale_new_with_range(-180, 180, 1);
+ gtk_scale_set_draw_value(GTK_SCALE(XGalaxy.ZSlider), FALSE);
+ gtk_range_set_value(GTK_RANGE(XGalaxy.ZSlider), 0);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.ZSlider),"value-changed", (GtkSignalFunc) angle_changed, (gpointer)'Z');
+ gtk_widget_show (XGalaxy.ZSlider);
+ gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.ZSlider, 999, 1000, 0, 999 );
+ gtk_tooltips_set_tip (GTK_TOOLTIPS (button_bar_tips), XGalaxy.ZSlider, "Turn around Z-axis", "");
+
+ XGalaxy.drawing_area = gtk_drawing_area_new ();
+ gtk_widget_set_events(XGalaxy.drawing_area,
+ GDK_EXPOSURE_MASK|
+ GDK_BUTTON_PRESS_MASK|
+ GDK_BUTTON_RELEASE_MASK|
+ GDK_POINTER_MOTION_MASK|
+ GDK_POINTER_MOTION_HINT_MASK);
+ gtk_drawing_area_size (GTK_DRAWING_AREA (XGalaxy.drawing_area), 100,100);
+ gtk_widget_show (XGalaxy.drawing_area);
+ gtk_signal_connect (GTK_OBJECT (XGalaxy.drawing_area), "expose_event", (GtkSignalFunc) expose_event, NULL);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.drawing_area),"configure_event", (GtkSignalFunc) configure_event, NULL);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.drawing_area),"button_press_event", (GtkSignalFunc) mouse_button_press, NULL);
+ gtk_signal_connect (GTK_OBJECT(XGalaxy.drawing_area),"motion_notify_event", (GtkSignalFunc) mouse_motion_notify, NULL);
+ gtk_table_attach_defaults(GTK_TABLE(table), XGalaxy.drawing_area, 1,999, 0,999);
+
+ gtk_widget_show(table);
+
+ gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 0);
+
+ return vbox;
+}
+
+static GtkItemFactoryEntry menu_items[] = {
+ { "/_File", NULL, NULL, 0, "<Branch>" },
+ { "/File/_Open", "<control>O", openFile, 0, NULL },
+ { "/File/_Save", "<control>S", saveFile, 0, NULL },
+ { "/File/Save _As", NULL, saveAsFile, 0, NULL },
+ { "/File/sep1", NULL, NULL, 0, "<Separator>" },
+ { "/File/Quit", "<control>Q", gtk_main_quit, 0, NULL },
+ { "/_Options", NULL, NULL, 0, "<Branch>" },
+ { "/Options/Clear", NULL, clearData, 0, NULL },
+ { "/Options/Fill", NULL, NULL, 0, NULL },
+ { "/_Help", NULL, NULL, 0, "<LastBranch>" },
+ { "/_Help/About", NULL, showAbout, 0, NULL },
+};
+
+static GtkWidget*
+get_main_menu(GtkWidget *window) {
+ GtkItemFactory *item_factory;
+ GtkAccelGroup *accel_group;
+ GtkWidget *menubar;
+ gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
+
+ accel_group = gtk_accel_group_new ();
+
+ item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
+
+ gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
+
+ gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
+
+ menubar = gtk_item_factory_get_widget (item_factory, "<main>");
+
+ return menubar;
+}
+
+void
+page_switched(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data) {
+ XGalaxy.page_active = page_num;
+}
+
+int
+main( int argc, char *argv[] ) {
+ GtkWidget *window, *notebook, *menubar, *main_vbox;
+ int rc;
+
+ memset(&XGalaxy, 0, sizeof(XGalaxy));
+ XGalaxy.angle.w=1;
+ XGalaxy.motion.w=1.0;
+ XGalaxy.Scale=1.0;
+
+ gtk_init (&argc, &argv);
+
+ if ( (rc=pthread_mutex_init(&(XGalaxy.mutex), NULL)) != 0 ) {
+ g_print("pthread_mutex_init returns %d: %s\n", rc, g_strerror(errno));
+ exit(1);
+ }
+
+ XGalaxy.window = window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ galaxy_set_title();
+ gtk_window_set_default_size (GTK_WINDOW(window), 640, 480);
+ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete), NULL);
+
+ main_vbox = gtk_vbox_new (FALSE, 1);
+ gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 2);
+ gtk_container_add(GTK_CONTAINER(window), main_vbox);
+ gtk_widget_show (main_vbox);
+
+ menubar = get_main_menu(window);
+ gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0);
+ gtk_widget_show (menubar);
+
+ notebook = gtk_notebook_new ();
+ gtk_notebook_set_tab_pos(GTK_NOTEBOOK (notebook), GTK_POS_TOP);
+ gtk_widget_show(notebook);
+
+ gtk_notebook_append_page( GTK_NOTEBOOK (notebook), inputPage(), gtk_label_new("Input") );
+ gtk_notebook_append_page( GTK_NOTEBOOK (notebook), viewPage(), gtk_label_new("View") );
+ gtk_notebook_append_page( GTK_NOTEBOOK (notebook), resPage(), gtk_label_new("Data View") );
+ gtk_signal_connect (GTK_OBJECT(notebook),"switch-page", (GtkSignalFunc) page_switched, NULL);
+ XGalaxy.notebook = notebook;
+
+ gtk_box_pack_start (GTK_BOX (main_vbox), notebook, TRUE, TRUE, 0);
+
+
+ setlocale(LC_NUMERIC, "C");
+ gtk_widget_show(window);
+
+ gtk_main ();
+
+ return 0;
+}
+