// 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.

// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 

// Copyright 2003 Liam Girdwood  

#include "config.h"
#include "vsky_druid.hh"
#include "todo_dialog.hh"
#include <libgnome/libgnome.h>
#include <gdk/gdkkeysyms.h>
#include <gtkmm/accelgroup.h>

namespace GUI
{

/*! \fn VSkyDruid::VSkyDruid()
*
* Virtusl sky druid constructor.
* Create all the druid pages and display druid.
*/
VSkyDruid::VSkyDruid()
{  
	// create druid
	m_druid = Gtk::manage(new Gnome::UI::Druid());
	
	m_is_location_complete = false;	
	m_is_date_complete = false;		
	m_is_zone_complete = false;
	ln_get_date_from_sys(&m_date);
	m_JD = ln_get_julian_from_sys();
	
	// create pages
	create_page_start ();
	create_page_location ();
	create_page_date ();
	create_page_zone ();
	create_page_finish ();
	
	// append pages
	m_druid->append_page(*m_vsky_druidpagestart);
	m_druid->append_page(*m_posn_druidpage);
	m_druid->append_page(*m_date_time_druidpage);
	m_druid->append_page(*m_timezone_druidpage);
	m_druid->append_page(*m_vsky_druidpagefinish);
	
	// druid settings
	set_border_width(2);
	set_title("Create a new Sky View");
	set_modal(true);
	property_window_position().set_value(Gtk::WIN_POS_NONE);
	set_resizable(false);
	set_size_request(500, 450);
	get_vbox()->pack_start(*m_druid);
	
	m_druid->set_show_help(true);
	m_druid->set_border_width(4);
	m_druid->show_all();
	
	m_long.degrees = 0;
	m_long.minutes = 0;
	m_long.seconds = 0;
	m_lat.degrees = 0;
	m_lat.minutes = 0;
	m_lat.seconds = 0;
	
	// connect druid signal handlers
	m_druid->signal_cancel().connect(SigC::slot(*this, &VSkyDruid::on_vsky_druid_cancel));
	m_druid->signal_help().connect(SigC::slot(*this, &VSkyDruid::on_vsky_druid_help));
}


/*! \fn VSkyDruid::~VSkyDruid()
*
* Virtual sky druid destructor
*/
VSkyDruid::~VSkyDruid()
{
}

/*! \fn void set_vsky(Vega::VirtualSky* sky);
*
*/
void VSkyDruid::set_vsky(Vega::VirtualSky* sky)
{
	m_vsky = sky;
	refresh_date();
	m_vsky->set_jd(m_JD);
	m_vsky->set_live(true);
}


/*! \fn void VSkyDruid::create_page_start (void)
*
* Create the virtual sky druid start page.
*/
void VSkyDruid::create_page_start (void)
{
	// create page
	m_vsky_druidpagestart = Gtk::manage(new Gnome::UI::DruidPageEdge(Gnome::UI::EDGE_START));
	
	// page settings
	m_vsky_druidpagestart->set_border_width(1);
	m_vsky_druidpagestart->set_title_color(Gdk::Color("#ffffff"));
	m_vsky_druidpagestart->set_logo_bg_color(Gdk::Color("#ffffff"));
	m_vsky_druidpagestart->set_title(  ("Creating a new Sky View"));
	m_vsky_druidpagestart->set_text_color(Gdk::Color("#000000"));
	m_vsky_druidpagestart->set_textbox_color(Gdk::Color("#ffffff"));
	m_vsky_druidpagestart->set_text(  ("This assistant will guide you through the\ncreation of a new night sky view on your computer."));
}


/*! \fn void VSkyDruid::create_page_location (void)
*
* Create the virtual sky location page.
* This may be expanded to include an optional world map
* like evolution does.
*/
void VSkyDruid::create_page_location (void)
{	
	// create location widgets
	Gtk::Tooltips _tooltips;
	Glib::RefPtr<Gtk::AccelGroup> accgrp;
	m_location_vbox = Gtk::manage(new class Gtk::VBox());
	m_location_label = Gtk::manage(new class Gtk::Label(_("<b>Observing Location</b>")));
	m_name_label = Gtk::manage(new class Gtk::Label(_("_Name"), true));
	m_name_entry = Gtk::manage(new class Gtk::Entry());
	m_name_hbox = Gtk::manage(new class Gtk::HBox(false, 6));
	m_position_label = Gtk::manage(new class Gtk::Label(_("<b>Observer Position</b>\n"
			"<i>Note: Nova measures longitude positively westwards.</i>")));
	m_lat_deg_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, -90, 90, 1, 10, 10));
	m_lat_deg_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_lat_deg_spinbutton_adj, 1, 0));
	m_lat_label1 = Gtk::manage(new class Gtk::Label(_(":")));
	m_lat_min_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 59, 1, 10, 10));
	m_lat_min_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_lat_min_spinbutton_adj, 1, 0));
	m_lat_label2 = Gtk::manage(new class Gtk::Label(_(":")));
	m_lat_sec_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 59.9, 1, 10, 10));
	m_lat_sec_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_lat_sec_spinbutton_adj, 1, 1));
	m_lat_hbox = Gtk::manage(new class Gtk::HBox(false, 0));
	m_long_deg_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 359, 1, 10, 10));
	m_long_deg_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_long_deg_spinbutton_adj, 1, 0));
	m_long_label1 = Gtk::manage(new class Gtk::Label(_(":")));
	m_long_min_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 59, 1, 10, 10));
	m_long_min_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_long_min_spinbutton_adj, 1, 0));
	m_long_label2 = Gtk::manage(new class Gtk::Label(_(":")));
	m_long_sec_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 59.9, 1, 10, 10));
	m_long_sec_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_long_sec_spinbutton_adj, 1, 1));
	m_long_hbox = Gtk::manage(new class Gtk::HBox(false, 0));
	m_elevation_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, -500, 10000, 1, 10, 10));
	m_elevation_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_elevation_spinbutton_adj, 1, 0));
	m_latitude_label = Gtk::manage(new class Gtk::Label(_("L_atitude (d:m:s)"), true));
	m_longitude_label = Gtk::manage(new class Gtk::Label(_("L_ongitude (d:m:s)"), true));
	m_elevation_label = Gtk::manage(new class Gtk::Label(_("_Elevation (m)"), true));
	m_position_table = Gtk::manage(new class Gtk::Table(2, 2, false));
	m_druid_location_vbox = Gtk::manage(new Gtk::VBox(false, 6));
	m_posn_druidpage = Gtk::manage(new Gnome::UI::DruidPageStandard());

	// init location widgets	
	m_location_label->set_alignment(0,0.5);
	m_location_label->set_padding(0,6);
	m_location_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_location_label->set_line_wrap(false);
	m_location_label->set_use_markup(true);
	m_location_label->set_selectable(false);
	
	m_name_label->set_alignment(0.3,0.5);
	m_name_label->set_padding(0,0);
	m_name_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_name_label->set_line_wrap(false);
	m_name_label->set_use_markup(true);
	m_name_label->set_selectable(false);
	m_name_label->set_mnemonic_widget(*m_name_entry);
	
	m_name_entry->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_name_entry, _("Name of your Observatory or observing location"), "");
	//m_name_entry->add_accelerator("grab_focus", accgrp, GDK_N, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_name_entry->set_visibility(true);
	m_name_entry->set_editable(true);
	m_name_entry->set_max_length(0);
	m_name_entry->set_text(_(""));
	m_name_entry->set_has_frame(true);
	m_name_entry->set_activates_default(false);
	
	m_name_hbox->set_border_width(6);
	m_name_hbox->pack_start(*m_name_label);
	m_name_hbox->pack_start(*m_name_entry);
	
	m_position_label->set_alignment(0,0.5);
	m_position_label->set_padding(0,6);
	m_position_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_position_label->set_line_wrap(false);
	m_position_label->set_use_markup(true);
	m_position_label->set_selectable(false);
	
	m_lat_deg_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_lat_deg_spinbutton, _("Latitude in degrees of your location"), "");
	//m_lat_deg_spinbutton->add_accelerator("grab_focus", accgrp, GDK_a, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_lat_deg_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_lat_deg_spinbutton->set_numeric(true);
	m_lat_deg_spinbutton->set_digits(0);
	m_lat_deg_spinbutton->set_wrap(true);
	
	m_lat_label1->set_alignment(0.5,0.5);
	m_lat_label1->set_padding(0,0);
	m_lat_label1->set_justify(Gtk::JUSTIFY_LEFT);
	m_lat_label1->set_line_wrap(false);
	m_lat_label1->set_use_markup(false);
	m_lat_label1->set_selectable(false);
	
	m_lat_min_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_lat_min_spinbutton, _("Latitude in minutes of your location"), "");
	m_lat_min_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_lat_min_spinbutton->set_numeric(true);
	m_lat_min_spinbutton->set_digits(0);
	m_lat_min_spinbutton->set_wrap(true);
	
	m_lat_label2->set_alignment(0.5,0.5);
	m_lat_label2->set_padding(0,0);
	m_lat_label2->set_justify(Gtk::JUSTIFY_LEFT);
	m_lat_label2->set_line_wrap(false);
	m_lat_label2->set_use_markup(false);
	m_lat_label2->set_selectable(false);
	
	m_lat_sec_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_lat_sec_spinbutton, _("Latitude in seconds of your location"), "");
	m_lat_sec_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_lat_sec_spinbutton->set_numeric(true);
	m_lat_sec_spinbutton->set_digits(1);
	m_lat_sec_spinbutton->set_wrap(true);
	
	m_lat_hbox->pack_start(*m_lat_deg_spinbutton);
	m_lat_hbox->pack_start(*m_lat_label1, Gtk::PACK_SHRINK, 0);
	m_lat_hbox->pack_start(*m_lat_min_spinbutton);
	m_lat_hbox->pack_start(*m_lat_label2, Gtk::PACK_SHRINK, 0);
	m_lat_hbox->pack_start(*m_lat_sec_spinbutton);
	
	m_long_deg_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_long_deg_spinbutton, _("Longitude in degrees of your location"), "");
	//m_long_deg_spinbutton->add_accelerator("grab_focus", accgrp, GDK_o, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_long_deg_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_long_deg_spinbutton->set_numeric(true);
	m_long_deg_spinbutton->set_digits(0);
	m_long_deg_spinbutton->set_wrap(true);
	
	m_long_label1->set_alignment(0.5,0.5);
	m_long_label1->set_padding(0,0);
	m_long_label1->set_justify(Gtk::JUSTIFY_LEFT);
	m_long_label1->set_line_wrap(false);
	m_long_label1->set_use_markup(false);
	m_long_label1->set_selectable(false);
	
	m_long_min_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_long_min_spinbutton, _("Longitude in minutes of your location"), "");
	//spinbutton1->add_accelerator("grab_focus", accgrp, GDK_o, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_long_min_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_long_min_spinbutton->set_numeric(true);
	m_long_min_spinbutton->set_digits(0);
	m_long_min_spinbutton->set_wrap(true);
	
	m_long_label2->set_alignment(0.5,0.5);
	m_long_label2->set_padding(0,0);
	m_long_label2->set_justify(Gtk::JUSTIFY_LEFT);
	m_long_label2->set_line_wrap(false);
	m_long_label2->set_use_markup(false);
	m_long_label2->set_selectable(false);
	
	m_long_sec_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_long_sec_spinbutton, _("Longitude in seconds of your location"), "");
	//spinbutton2->add_accelerator("grab_focus", accgrp, GDK_o, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_long_sec_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_long_sec_spinbutton->set_numeric(true);
	m_long_sec_spinbutton->set_digits(1);
	m_long_sec_spinbutton->set_wrap(true);
	
	m_long_hbox->pack_start(*m_long_deg_spinbutton);
	m_long_hbox->pack_start(*m_long_label1, Gtk::PACK_SHRINK, 0);
	m_long_hbox->pack_start(*m_long_min_spinbutton);
	m_long_hbox->pack_start(*m_long_label2, Gtk::PACK_SHRINK, 0);
	m_long_hbox->pack_start(*m_long_sec_spinbutton);
	
	m_elevation_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_elevation_spinbutton, _("Location height above sea level in metres"), "");
	//m_elevation_spinbutton->add_accelerator("grab_focus", accgrp, GDK_E, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_elevation_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_elevation_spinbutton->set_numeric(true);
	m_elevation_spinbutton->set_digits(0);
	m_elevation_spinbutton->set_wrap(false);
	
	m_latitude_label->set_alignment(0.40,0.5);
	m_latitude_label->set_padding(0,0);
	m_latitude_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_latitude_label->set_line_wrap(false);
	m_latitude_label->set_use_markup(true);
	m_latitude_label->set_selectable(false);
	m_latitude_label->set_mnemonic_widget(*m_lat_deg_spinbutton);
	
	m_longitude_label->set_alignment(0.45,0.5);
	m_longitude_label->set_padding(0,0);
	m_longitude_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_longitude_label->set_line_wrap(false);
	m_longitude_label->set_use_markup(true);
	m_longitude_label->set_selectable(false);
	m_longitude_label->set_mnemonic_widget(*m_long_deg_spinbutton);
	
	m_elevation_label->set_alignment(0.35,0.5);
	m_elevation_label->set_padding(0,0);
	m_elevation_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_elevation_label->set_line_wrap(false);
	m_elevation_label->set_use_markup(true);
	m_elevation_label->set_selectable(false);
	m_elevation_label->set_mnemonic_widget(*m_elevation_spinbutton);
	
	m_position_table->set_border_width(6);
	m_position_table->set_row_spacings(10);
	m_position_table->set_col_spacings(6);
	m_position_table->attach(*m_lat_hbox, 1, 2, 0, 1, Gtk::FILL, Gtk::FILL, 0, 0);
	m_position_table->attach(*m_long_hbox, 1, 2, 1, 2, Gtk::FILL, Gtk::FILL, 0, 0);
	m_position_table->attach(*m_elevation_spinbutton, 1, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::AttachOptions(), 0, 0);
	m_position_table->attach(*m_latitude_label, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::AttachOptions(), 0, 0);
	m_position_table->attach(*m_longitude_label, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::AttachOptions(), 0, 0);
	m_position_table->attach(*m_elevation_label, 0, 1, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::AttachOptions(), 0, 0);
	
	m_location_vbox->set_border_width(6);
	m_location_vbox->set_spacing(6);
	m_location_vbox->pack_start(*m_location_label, Gtk::PACK_SHRINK, 0);
	m_location_vbox->pack_start(*m_name_hbox, Gtk::PACK_SHRINK, 0);
	m_location_vbox->pack_start(*m_position_label, Gtk::PACK_SHRINK, 0);
	m_location_vbox->pack_start(*m_position_table, Gtk::PACK_SHRINK, 0);

	m_posn_druidpage->set_title("Creating a new Sky View");
	m_posn_druidpage->get_vbox()->pack_start(*m_location_vbox);
	m_posn_druidpage->show_all();
	
	// connect signal handlers
	m_name_entry->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_name_entry_changed));
	m_lat_deg_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_lat_deg_spinbutton_changed));
	m_lat_min_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_lat_min_spinbutton_changed));
	m_lat_sec_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_lat_sec_spinbutton_changed));
	m_long_deg_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_long_deg_spinbutton_changed));
	m_long_min_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_long_min_spinbutton_changed));
	m_long_sec_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_long_sec_spinbutton_changed));
	m_elevation_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_elevation_spinbutton_changed));
}

/*! \fn void VSkyDruid::create_page_date (void)
* \bug The GnomeDateEdit is incorrectly displaying a time selector.
*
* Create the virtual sky druid date page.
*/
void VSkyDruid::create_page_date (void)
{
	time_t the_time;
	time (&the_time);
	Gtk::RadioButton::Group _RadioBGroup_m_sys_date_radiobutton;
	Gtk::Tooltips _tooltips;
	Glib::RefPtr<Gtk::AccelGroup> accgrp;
	
	m_date_time_vbox = Gtk::manage(new class Gtk::VBox());
	m_date_time_label = Gtk::manage(new class Gtk::Label(_("<b>Observing Date and Time</b>")));
	m_sys_date_radiobutton = Gtk::manage(new class Gtk::RadioButton(_RadioBGroup_m_sys_date_radiobutton, _("Use your _computers date and time"), true));
	m_another_date_radiobutton = Gtk::manage(new class Gtk::RadioButton(_RadioBGroup_m_sys_date_radiobutton, _("Use _another date and time"), true));
	m_date_time_table = Gtk::manage(new class Gtk::Table(2,2,false));
	m_day_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(1, 1, 31, 1, 10, 10));
	m_day_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_day_spinbutton_adj, 1, 0));
	m_date_label1 = Gtk::manage(new class Gtk::Label(_(":")));
	m_month_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(1, 1, 12, 1, 2, 2));
	m_month_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_month_spinbutton_adj, 1, 0));
	m_date_label2 = Gtk::manage(new class Gtk::Label(_(":")));
	m_year_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(2000, 0, 3000, 1, 10, 10));
	m_year_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_year_spinbutton_adj, 1, 0));
	m_date_hbox = Gtk::manage(new class Gtk::HBox(false, 0));
	m_hours_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 23, 1, 10, 10));
	m_hours_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_hours_spinbutton_adj, 1, 0));
	m_time_label1 = Gtk::manage(new class Gtk::Label(_(":")));
	m_minutes_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 59, 1, 10, 10));
	m_minutes_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_minutes_spinbutton_adj, 1, 0));
	m_time_label2 = Gtk::manage(new class Gtk::Label(_(":")));
	m_seconds_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(0, 0, 59.9, 1, 10, 10));
	m_seconds_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_seconds_spinbutton_adj, 1, 1));
	m_time_hbox = Gtk::manage(new class Gtk::HBox(false, 0));
	m_date_label = Gtk::manage(new class Gtk::Label(_("_Date (m:d:y)"), true));
	m_time_label = Gtk::manage(new class Gtk::Label(_("_Time (h:m:s)"), true));
	m_julian_day_radiobutton = Gtk::manage(new class Gtk::RadioButton(_RadioBGroup_m_sys_date_radiobutton, _("Use a _Julian day"), true));
	m_julian_label = Gtk::manage(new class Gtk::Label(_("J_ulian Day:"), true));
	m_julian_spinbutton_adj = Gtk::manage(new class Gtk::Adjustment(2.45e+06, 0, 3e+06, 1, 10, 10));
	m_julian_spinbutton = Gtk::manage(new class Gtk::SpinButton(*m_julian_spinbutton_adj, 1, 5));
	m_julian_hbox = Gtk::manage(new class Gtk::HBox(false, 6));
	m_date_time_druidpage = Gtk::manage(new Gnome::UI::DruidPageStandard());

	// page settings
	m_date_time_label->set_alignment(0,0.5);
	m_date_time_label->set_padding(0,6);
	m_date_time_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_date_time_label->set_line_wrap(false);
	m_date_time_label->set_use_markup(true);
	m_date_time_label->set_selectable(false);
	
	m_sys_date_radiobutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_sys_date_radiobutton, _("Use the system date and time for the sky view"), "");
	//m_sys_date_radiobutton->add_accelerator("clicked", accgrp, GDK_c, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_sys_date_radiobutton->set_border_width(6);
	m_sys_date_radiobutton->set_relief(Gtk::RELIEF_NORMAL);
	m_sys_date_radiobutton->set_mode(true);
	m_sys_date_radiobutton->set_active(true);
	
	m_another_date_radiobutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_another_date_radiobutton, _("Use another date and time for the sky view"), "");
	//m_another_date_radiobutton->add_accelerator("clicked", accgrp, GDK_a, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_another_date_radiobutton->set_border_width(6);
	m_another_date_radiobutton->set_relief(Gtk::RELIEF_NORMAL);
	m_another_date_radiobutton->set_mode(true);
	m_another_date_radiobutton->set_active(false);
	
	m_day_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_day_spinbutton, _("Day of the Month"), "");
	//m_day_spinbutton->add_accelerator("grab_focus", gmm_data->getAccelGroup(), GDK_a, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_day_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_day_spinbutton->set_numeric(true);
	m_day_spinbutton->set_digits(0);
	m_day_spinbutton->set_wrap(true);
	m_day_spinbutton->set_sensitive(false);
	m_day_spinbutton->set_value(m_date.days);
	
	m_date_label1->set_alignment(0.5,0.5);
	m_date_label1->set_padding(0,0);
	m_date_label1->set_justify(Gtk::JUSTIFY_LEFT);
	m_date_label1->set_line_wrap(false);
	m_date_label1->set_use_markup(false);
	m_date_label1->set_selectable(false);
	
	m_month_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_month_spinbutton, _("Month of the Year"), "");
	m_month_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_month_spinbutton->set_numeric(true);
	m_month_spinbutton->set_digits(0);
	m_month_spinbutton->set_wrap(true);
	m_month_spinbutton->set_sensitive(false);
	m_month_spinbutton->set_value(m_date.months);
	
	m_date_label2->set_alignment(0.5,0.5);
	m_date_label2->set_padding(0,0);
	m_date_label2->set_justify(Gtk::JUSTIFY_LEFT);
	m_date_label2->set_line_wrap(false);
	m_date_label2->set_use_markup(false);
	m_date_label2->set_selectable(false);
	
	m_year_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_year_spinbutton, _("Year"), "");
	m_year_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_year_spinbutton->set_numeric(true);
	m_year_spinbutton->set_digits(0);
	m_year_spinbutton->set_wrap(true);
	m_year_spinbutton->set_sensitive(false);
	m_year_spinbutton->set_value(m_date.years);
	
	m_date_hbox->pack_start(*m_day_spinbutton);
	m_date_hbox->pack_start(*m_date_label1, Gtk::PACK_SHRINK, 0);
	m_date_hbox->pack_start(*m_month_spinbutton);
	m_date_hbox->pack_start(*m_date_label2, Gtk::PACK_SHRINK, 0);
	m_date_hbox->pack_start(*m_year_spinbutton);
	
	m_hours_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_hours_spinbutton, _("Time in Hours"), "");
	//m_hours_spinbutton->add_accelerator("grab_focus", gmm_data->getAccelGroup(), GDK_a, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_hours_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_hours_spinbutton->set_numeric(true);
	m_hours_spinbutton->set_digits(0);
	m_hours_spinbutton->set_wrap(true);
	m_hours_spinbutton->set_sensitive(false);
	m_hours_spinbutton->set_value(m_date.hours);
	
	m_time_label1->set_alignment(0.5,0.5);
	m_time_label1->set_padding(0,0);
	m_time_label1->set_justify(Gtk::JUSTIFY_LEFT);
	m_time_label1->set_line_wrap(false);
	m_time_label1->set_use_markup(false);
	m_time_label1->set_selectable(false);
	
	m_minutes_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_minutes_spinbutton, _("Time in Minutes"), "");
	m_minutes_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_minutes_spinbutton->set_numeric(true);
	m_minutes_spinbutton->set_digits(0);
	m_minutes_spinbutton->set_wrap(true);
	m_minutes_spinbutton->set_sensitive(false);
	m_minutes_spinbutton->set_value(m_date.minutes);
	
	m_time_label2->set_alignment(0.5,0.5);
	m_time_label2->set_padding(0,0);
	m_time_label2->set_justify(Gtk::JUSTIFY_LEFT);
	m_time_label2->set_line_wrap(false);
	m_time_label2->set_use_markup(false);
	m_time_label2->set_selectable(false);
	
	m_seconds_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_seconds_spinbutton, _("Time in Seconds"), "");
	m_seconds_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_seconds_spinbutton->set_numeric(true);
	m_seconds_spinbutton->set_digits(1);
	m_seconds_spinbutton->set_wrap(true);
	m_seconds_spinbutton->set_sensitive(false);
	m_seconds_spinbutton->set_value(m_date.seconds);
	
	m_time_hbox->pack_start(*m_hours_spinbutton);
	m_time_hbox->pack_start(*m_time_label1, Gtk::PACK_SHRINK, 0);
	m_time_hbox->pack_start(*m_minutes_spinbutton);
	m_time_hbox->pack_start(*m_time_label2, Gtk::PACK_SHRINK, 0);
	m_time_hbox->pack_start(*m_seconds_spinbutton);
	
	m_date_label->set_alignment(0.34,0.5);
	m_date_label->set_padding(0,0);
	m_date_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_date_label->set_line_wrap(false);
	m_date_label->set_use_markup(true);
	m_date_label->set_selectable(false);
	
	m_time_label->set_alignment(0.34,0.5);
	m_time_label->set_padding(0,0);
	m_time_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_time_label->set_line_wrap(false);
	m_time_label->set_use_markup(true);
	m_time_label->set_selectable(false);
	
	m_date_time_table->set_border_width(6);
	m_date_time_table->set_row_spacings(10);
	m_date_time_table->set_col_spacings(6);
	m_date_time_table->attach(*m_date_hbox, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::FILL, 0, 0);
	m_date_time_table->attach(*m_time_hbox, 1, 2, 1, 2, Gtk::FILL, Gtk::FILL, 0, 0);
	m_date_time_table->attach(*m_date_label, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::AttachOptions(), 0, 0);
	m_date_time_table->attach(*m_time_label, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::AttachOptions(), 0, 0);
	
	m_julian_day_radiobutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_julian_day_radiobutton, _("Use a Julian day for the sky view"), "");
	//m_julian_day_radiobutton->add_accelerator("clicked", accgrp, GDK_J, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_julian_day_radiobutton->set_border_width(6);
	m_julian_day_radiobutton->set_relief(Gtk::RELIEF_NORMAL);
	m_julian_day_radiobutton->set_mode(true);
	m_julian_day_radiobutton->set_active(false);
	
	m_julian_label->set_alignment(0.26,0.5);
	m_julian_label->set_padding(0,0);
	m_julian_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_julian_label->set_line_wrap(false);
	m_julian_label->set_use_markup(true);
	m_julian_label->set_selectable(false);
	m_julian_label->set_mnemonic_widget(*m_julian_spinbutton);
	
	m_julian_spinbutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_julian_spinbutton, _("Julian day"), "");
	//m_julian_spinbutton->add_accelerator("grab_focus", accgrp, GDK_u, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_julian_spinbutton->set_update_policy(Gtk::UPDATE_ALWAYS);
	m_julian_spinbutton->set_numeric(true);
	m_julian_spinbutton->set_digits(3);
	m_julian_spinbutton->set_wrap(false);
	m_julian_spinbutton->set_sensitive(false);
	m_julian_spinbutton->set_value(m_JD);
	
	m_julian_hbox->set_border_width(6);
	m_julian_hbox->pack_start(*m_julian_label);
	m_julian_hbox->pack_start(*m_julian_spinbutton);
	
	m_date_time_vbox->set_border_width(6);
	m_date_time_vbox->pack_start(*m_date_time_label, Gtk::PACK_SHRINK, 0);
	m_date_time_vbox->pack_start(*m_sys_date_radiobutton, Gtk::PACK_SHRINK, 0);
	m_date_time_vbox->pack_start(*m_another_date_radiobutton, Gtk::PACK_SHRINK, 0);
	m_date_time_vbox->pack_start(*m_date_time_table, Gtk::PACK_SHRINK, 0);
	m_date_time_vbox->pack_start(*m_julian_day_radiobutton, Gtk::PACK_SHRINK, 0);
	m_date_time_vbox->pack_start(*m_julian_hbox, Gtk::PACK_SHRINK, 0);
	
	m_date_time_druidpage->set_title("Creating a new Sky View");
	m_date_time_druidpage->get_vbox()->pack_start(*m_date_time_vbox);
	m_date_time_druidpage->show_all();
	
	//connect signal handlers
	m_sys_date_radiobutton->signal_toggled().connect(SigC::slot(*this, &VSkyDruid::on_sys_date_radiobutton_toggled));
	m_another_date_radiobutton->signal_toggled().connect(SigC::slot(*this, &VSkyDruid::on_another_date_radiobutton_toggled));
	m_days_changed = m_day_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_day_spinbutton_changed));
	m_months_changed = m_month_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_month_spinbutton_changed));
	m_years_changed = m_year_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_year_spinbutton_changed));
	m_hours_changed = m_hours_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_hours_spinbutton_changed));
	m_minutes_changed = m_minutes_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_minutes_spinbutton_changed));
	m_seconds_changed = m_seconds_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_seconds_spinbutton_changed));
	m_julian_day_radiobutton->signal_toggled().connect(SigC::slot(*this, &VSkyDruid::on_julian_day_radiobutton_toggled));
	m_julian_changed = m_julian_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_julian_spinbutton_changed));
}


/*! \fn void VSkyDruid::create_page_epoch (void)
*
* Create the virtual sky druid epoch page.
*/
void VSkyDruid::create_page_zone (void)
{	
	// create page widgets
	Gtk::Tooltips _tooltips;
	Glib::RefPtr<Gtk::AccelGroup> accgrp;
	m_zone_label = Gtk::manage(new class Gtk::Label(_("<b>Observing Timezone</b>")));
	Gtk::RadioButton::Group _RadioBGroup_m_sys_zone_radiobutton;
	m_sys_zone_radiobutton = Gtk::manage(new class Gtk::RadioButton(_RadioBGroup_m_sys_zone_radiobutton, _("Use the timezone from your _computer."), true));
	m_another_zone_radiobutton = Gtk::manage(new class Gtk::RadioButton(_RadioBGroup_m_sys_zone_radiobutton, _("Use _another timezone"), true));
	m_timezone_label = Gtk::manage(new class Gtk::Label(_("_Timezone"), true));
	m_zone_combo = Gtk::manage(new class Gtk::Combo());
	m_zone_hbox = Gtk::manage(new class Gtk::HBox(false, 6));
	m_zone_vbox = Gtk::manage(new Gtk::VBox(false, 6));
	m_timezone_druidpage = Gtk::manage(new Gnome::UI::DruidPageStandard());

	// page settings
	m_zone_label->set_alignment(0,0.5);
	m_zone_label->set_padding(0,6);
	m_zone_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_zone_label->set_line_wrap(false);
	m_zone_label->set_use_markup(true);
	m_zone_label->set_selectable(false);
	
	m_sys_zone_radiobutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_sys_zone_radiobutton, _("Use the system timezone for the sky view"), "");
	//m_sys_zone_radiobutton->add_accelerator("clicked", accgrp, GDK_c, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_sys_zone_radiobutton->set_border_width(6);
	m_sys_zone_radiobutton->set_relief(Gtk::RELIEF_NORMAL);
	m_sys_zone_radiobutton->set_mode(true);
	m_sys_zone_radiobutton->set_active(true);
	
	m_another_zone_radiobutton->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_another_zone_radiobutton, _("Use another timezone for the sky view"), "");
	//m_another_zone_radiobutton->add_accelerator("clicked", accgrp, GDK_a, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_another_zone_radiobutton->set_border_width(6);
	m_another_zone_radiobutton->set_relief(Gtk::RELIEF_NORMAL);
	m_another_zone_radiobutton->set_mode(true);
	m_another_zone_radiobutton->set_active(false);
	
	m_timezone_label->set_alignment(0.5,0.5);
	m_timezone_label->set_padding(0,0);
	m_timezone_label->set_justify(Gtk::JUSTIFY_LEFT);
	m_timezone_label->set_line_wrap(false);
	m_timezone_label->set_use_markup(true);
	m_timezone_label->set_selectable(false);
//	m_timezone_label->set_mnemonic_widget(*m_zone_combo_entry);
	
	m_zone_combo->get_entry()->set_flags(Gtk::CAN_FOCUS);
	_tooltips.set_tip(*m_zone_combo->get_entry(), _("Sky view timezone"), "");
	//m_zone_combo->get_entry()->add_accelerator("grab_focus", accgrp, GDK_T, Gdk::MOD1_MASK, Gtk::ACCEL_VISIBLE);
	m_zone_combo->get_entry()->set_visibility(true);
	m_zone_combo->get_entry()->set_editable(false);
	m_zone_combo->get_entry()->set_max_length(0);
	m_zone_combo->get_entry()->set_has_frame(true);
	m_zone_combo->get_entry()->set_activates_default(false);
	m_zone_combo->set_case_sensitive(false);
	m_zone_combo->set_sensitive(false);
	{	
	  const char * const items[] = { 
		  "GMT - 11", 
		  "GMT - 10", 
		  "GMT - 9", 
		  "GMT - 8", 
		  "GMT - 7", 
		  "GMT - 6", 
		  "GMT - 5", 
		  "GMT - 4", 
		  "GMT - 3", 
		  "GMT - 2", 
		  "GMT - 1", 
		  "GMT (London, UK)", 
		  "GMT + 1",
		  "GMT + 2",
		  "GMT + 3",
		  "GMT + 4",
		  "GMT + 5",
		  "GMT + 6",
		  "GMT + 7",
		  "GMT + 8",
		  "GMT + 9",
		  "GMT + 10",
		  "GMT + 11",
		  0 };
		  m_zone_combo->set_popdown_strings(items);
	 }
	 m_zone_combo->get_entry()->set_text(_("GMT (London, UK)"));
	 
	m_zone_hbox->set_border_width(6);
	m_zone_hbox->pack_start(*m_timezone_label, Gtk::PACK_EXPAND_PADDING, 0);
	m_zone_hbox->pack_start(*m_zone_combo);
	
	m_zone_vbox->set_border_width(6);
	m_zone_vbox->pack_start(*m_zone_label, Gtk::PACK_SHRINK, 0);
	m_zone_vbox->pack_start(*m_sys_zone_radiobutton, Gtk::PACK_SHRINK, 0);
	m_zone_vbox->pack_start(*m_another_zone_radiobutton, Gtk::PACK_SHRINK, 0);
	m_zone_vbox->pack_start(*m_zone_hbox, Gtk::PACK_SHRINK, 0);
	
	m_timezone_druidpage->set_title("Creating a new Sky View");
	m_timezone_druidpage->get_vbox()->pack_start(*m_zone_vbox);
	m_timezone_druidpage->show_all();
	
	// connect signal handlers
	m_sys_zone_radiobutton->signal_toggled().connect(SigC::slot(*this, &VSkyDruid::on_sys_zone_radiobutton_toggled));
	m_another_zone_radiobutton->signal_toggled().connect(SigC::slot(*this, &VSkyDruid::on_another_zone_radiobutton_toggled));
	m_zone_combo->get_entry()->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_zone_combo_entry_changed));
}

/*! \fn void VSkyDruid::create_page_finish (void)
* 
* Create the virtual sky druid finish page.
*/
void VSkyDruid::create_page_finish (void)
{
	// create page 
	m_vsky_druidpagefinish = Gtk::manage(new Gnome::UI::DruidPageEdge(Gnome::UI::EDGE_FINISH));
	
	// page settings
	m_vsky_druidpagefinish->set_title_color(Gdk::Color("#ffffff"));
	m_vsky_druidpagefinish->set_logo_bg_color(Gdk::Color("#ffffff"));
	m_vsky_druidpagefinish->set_title(  ("Sky View complete"));
	m_vsky_druidpagefinish->set_text_color(Gdk::Color("#000000"));
	m_vsky_druidpagefinish->set_textbox_color(Gdk::Color("#ffffff"));
	m_vsky_druidpagefinish->set_text(  ("Click 'Apply' to display the new sky view.\n\nThe sky settings can be changed from the Sky menu."));
	
	// connect signal handler
	m_vsky_druidpagefinish->signal_finish().connect(SigC::slot(*this, &VSkyDruid::on_vsky_druidpagefinish_finish));
}

void VSkyDruid::on_name_entry_changed()
{  
	Glib::ustring name = m_name_entry->get_text();
	m_vsky->set_location(name);
}

void VSkyDruid::on_lat_deg_spinbutton_changed()
{  
	double latitude;
	
	m_lat.degrees = (int)m_lat_deg_spinbutton->get_value();
	latitude = ln_dms_to_deg(&m_lat);
	m_vsky->set_latitude(latitude);
}

void VSkyDruid::on_lat_min_spinbutton_changed()
{
	double latitude;
	
	m_lat.minutes = (int)m_lat_min_spinbutton->get_value();
	latitude = ln_dms_to_deg(&m_lat);
	m_vsky->set_latitude(latitude);	
}

void VSkyDruid::on_lat_sec_spinbutton_changed()
{  
	double latitude;
	
	m_lat.seconds = m_lat_sec_spinbutton->get_value();
	latitude = ln_dms_to_deg(&m_lat);
	m_vsky->set_latitude(latitude);
}

void VSkyDruid::on_long_deg_spinbutton_changed()
{  
	double longitude;
	
	m_long.degrees = (int)m_long_deg_spinbutton->get_value();
	longitude = ln_dms_to_deg(&m_long);
	m_vsky->set_longitude(longitude);
}

void VSkyDruid::on_long_min_spinbutton_changed()
{  
	double longitude;
	
	m_long.minutes = (int)m_long_min_spinbutton->get_value();
	longitude = ln_dms_to_deg(&m_long);
	m_vsky->set_longitude(longitude);
}

void VSkyDruid::on_long_sec_spinbutton_changed()
{  
	double longitude;
	
	m_long.seconds = m_long_sec_spinbutton->get_value();
	longitude = ln_dms_to_deg(&m_long);
	m_vsky->set_longitude(longitude);
}

void VSkyDruid::on_elevation_spinbutton_changed()
{  
	m_vsky->set_elevation(m_elevation_spinbutton->get_value());
}

void VSkyDruid::on_sys_date_radiobutton_toggled()
{  
	double JD;
	
	m_years_changed.disconnect();
	m_months_changed.disconnect();
	m_days_changed.disconnect();
	m_hours_changed.disconnect();
	m_minutes_changed.disconnect();
	m_seconds_changed.disconnect();
	m_julian_changed.disconnect();
	
	m_year_spinbutton->set_sensitive(false);
	m_month_spinbutton->set_sensitive(false);
	m_day_spinbutton->set_sensitive(false);
	m_hours_spinbutton->set_sensitive(false);
	m_minutes_spinbutton->set_sensitive(false);
	m_seconds_spinbutton->set_sensitive(false);
	m_julian_spinbutton->set_sensitive(false);
	m_use_sys_date = true;
	m_use_another_date = false;
	m_use_julian_date = false;
	
	refresh_date();
	m_vsky->set_jd(m_JD);
	m_vsky->set_live(true);
}

void VSkyDruid::on_another_date_radiobutton_toggled()
{  
	m_julian_changed.disconnect();

	m_days_changed = m_day_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_day_spinbutton_changed));
	m_months_changed = m_month_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_month_spinbutton_changed));
	m_years_changed = m_year_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_year_spinbutton_changed));
	m_hours_changed = m_hours_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_hours_spinbutton_changed));
	m_minutes_changed = m_minutes_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_minutes_spinbutton_changed));
	m_seconds_changed = m_seconds_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_seconds_spinbutton_changed));

	m_year_spinbutton->set_sensitive(true);
	m_month_spinbutton->set_sensitive(true);
	m_day_spinbutton->set_sensitive(true);
	m_hours_spinbutton->set_sensitive(true);
	m_minutes_spinbutton->set_sensitive(true);
	m_seconds_spinbutton->set_sensitive(true);
	m_julian_spinbutton->set_sensitive(false);
	m_use_sys_date = false;
	m_use_another_date = true;
	m_use_julian_date = false;
	refresh_date();
	m_vsky->set_live(false);
}

void VSkyDruid::on_year_spinbutton_changed()
{
	double JD;
	
	m_date.years = (int)m_year_spinbutton->get_value();
	refresh_date();
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_month_spinbutton_changed()
{
	double JD;
	
	m_date.months = (int)m_month_spinbutton->get_value();
	refresh_date();
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_day_spinbutton_changed()
{
	double JD;
	
	m_date.days = (int)m_day_spinbutton->get_value();
	refresh_date();
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_hours_spinbutton_changed()
{ 
	double JD;
	
	m_date.hours = (int)m_hours_spinbutton->get_value();
	refresh_date();	
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_minutes_spinbutton_changed()
{  
	double JD;
	
	m_date.minutes = (int)m_minutes_spinbutton->get_value();
	refresh_date();
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_seconds_spinbutton_changed()
{  
	double JD;
	
	m_date.seconds = m_seconds_spinbutton->get_value();
	refresh_date();
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_julian_spinbutton_changed()
{  
	double JD;
	
	m_JD = m_julian_spinbutton->get_value();
	refresh_date();
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_julian_day_radiobutton_toggled()
{
	double JD;
	
	m_years_changed.disconnect();
	m_months_changed.disconnect();
	m_days_changed.disconnect();
	m_hours_changed.disconnect();
	m_minutes_changed.disconnect();
	m_seconds_changed.disconnect();
	m_julian_changed = m_julian_spinbutton->signal_changed().connect(SigC::slot(*this, &VSkyDruid::on_julian_spinbutton_changed));
	
	m_year_spinbutton->set_sensitive(false);
	m_month_spinbutton->set_sensitive(false);
	m_day_spinbutton->set_sensitive(false);
	m_hours_spinbutton->set_sensitive(false);
	m_minutes_spinbutton->set_sensitive(false);
	m_seconds_spinbutton->set_sensitive(false);
	m_julian_spinbutton->set_sensitive(true);
	m_use_sys_date = false;
	m_use_another_date = false;
	m_use_julian_date = true;
	refresh_date();	
	JD = ln_get_julian_day(&m_date);
	m_vsky->set_jd(JD);
}

void VSkyDruid::on_sys_zone_radiobutton_toggled()
{  
	m_zone_combo->set_sensitive(false);
}

void VSkyDruid::on_another_zone_radiobutton_toggled()
{  
	m_zone_combo->set_sensitive(true);
}

void VSkyDruid::on_zone_combo_entry_changed()
{  
}

void VSkyDruid::on_vsky_druidpagefinish_finish(Gtk::Widget& druid)
{  
	hide();
	response(Gtk::RESPONSE_OK); //stops run().
}

void VSkyDruid::on_vsky_druid_cancel()
{  
	hide();
	response(Gtk::RESPONSE_CANCEL); //stops run().
}

void VSkyDruid::on_vsky_druid_help()
{  
	TodoDialog::display();
}

void VSkyDruid::refresh_date()
{	
	if (m_use_sys_date) {
		ln_get_date_from_sys(&m_date);
		m_JD = ln_get_julian_from_sys();
		
		m_year_spinbutton->set_value(m_date.years);
		m_month_spinbutton->set_value(m_date.months);
		m_day_spinbutton->set_value(m_date.days);
		m_hours_spinbutton->set_value(m_date.hours);
		m_minutes_spinbutton->set_value(m_date.minutes);
		m_seconds_spinbutton->set_value(m_date.seconds);
		m_julian_spinbutton->set_value(m_JD);
		
	} else if (m_use_another_date) {
		
		m_JD = ln_get_julian_day(&m_date);
		m_julian_spinbutton->set_value(m_JD);
	
	} else {
		ln_get_date(m_JD, &m_date);
		
		m_year_spinbutton->set_value(m_date.years);
		m_month_spinbutton->set_value(m_date.months);
		m_day_spinbutton->set_value(m_date.days);
		m_hours_spinbutton->set_value(m_date.hours);
		m_minutes_spinbutton->set_value(m_date.minutes);
		m_seconds_spinbutton->set_value(m_date.seconds);
		
	}
}

};


syntax highlighted by Code2HTML, v. 0.9.1