/***************************************************************************
                          astrocalc.cpp  -  description
                             -------------------
    begin                : wed dec 19 16:20:11 CET 2002
    copyright            : (C) 2001-2005 by Pablo de Vicente
    email                : p.devicente@wanadoo.es
 ***************************************************************************/

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

#include "astrocalc.h"
#include "astrocalc.moc"
#include "dms.h"
#include "dmsbox.h"
#include "modcalcjd.h"
#include "modcalcgeodcoord.h"
#include "modcalcgalcoord.h"
#include "modcalcsidtime.h"
#include "modcalcprec.h"
#include "modcalcapcoord.h"
#include "modcalcdaylength.h"
#include "modcalcazel.h"
#include "modcalcplanets.h"
#include "modcalceclipticcoords.h"
#include "modcalcangdist.h"
#include "modcalcequinox.h"
#include "modcalcvlsr.h"

#include <tdelocale.h>
#include <tqlistview.h>
#include <tqtextview.h>


AstroCalc::AstroCalc( TQWidget* parent ) :
	KDialogBase( parent, "starscalculator", true, i18n("Calculator"), Close ),
	JDFrame(0), GeodCoordFrame(0), GalFrame(0), SidFrame(0), PrecFrame(0),
	AppFrame(0), DayFrame(0), AzelFrame(0), PlanetsFrame(0), EquinoxFrame(0),
	EclFrame(0), AngDistFrame(0)
{
	split = new TQSplitter ( this );
	setMainWidget(split);

	navigationPanel = new TQListView (split,"NavigationPanel");
	splashScreen = new TQTextView (i18n("<H2>KStars Astrocalculator</H2>"),"",split);

	splashScreen->setMaximumWidth(550);
	splashScreen->setMinimumWidth(400);

	rightPanel = GenText;

	navigationPanel->addColumn("Section");
	navigationPanel->setRootIsDecorated(1);

	TQPixmap jdIcon = TQPixmap (TQString("jd.png"));
	TQPixmap geodIcon = TQPixmap (TQString("geodetic.png"));
	TQPixmap solarIcon = TQPixmap (TQString("geodetic.png"));
	TQPixmap sunsetIcon = TQPixmap (TQString("sunset.png"));
	TQPixmap timeIcon = TQPixmap (TQString("sunclock.png"));

	TQListViewItem * timeItem = new TQListViewItem(navigationPanel,i18n("Time Calculators"));
	timeItem->setPixmap(0,timeIcon);

	TQListViewItem * jdItem = new TQListViewItem(timeItem,i18n("Julian Day"));
	jdItem->setPixmap(0,jdIcon);

	new TQListViewItem(timeItem,i18n("Sidereal Time"));
	new TQListViewItem(timeItem,i18n("Day Duration"));
	new TQListViewItem(timeItem,i18n("Equinoxes & Solstices"));
//	dayItem->setPixmap(0,sunsetIcon);

	TQListViewItem * coordItem = new TQListViewItem(navigationPanel,i18n("Celestial Coordinates"));
	new TQListViewItem(coordItem,i18n("Galactic Coordinates"));
	new TQListViewItem(coordItem,i18n("Precession"));
	new TQListViewItem(coordItem,i18n("Apparent Coordinates"));
	new TQListViewItem(coordItem,i18n("Horizontal Coordinates"));
	new TQListViewItem(coordItem,i18n("Ecliptic Coordinates"));
	new TQListViewItem(coordItem,i18n("Angular Distance"));
	new TQListViewItem(coordItem,i18n("LSR Velocity"));

	TQListViewItem * geoItem = new TQListViewItem(navigationPanel,i18n("Earth Coordinates"));
	geoItem->setPixmap(0,geodIcon);
	/*TQListViewItem * cartItem = */new TQListViewItem(geoItem,i18n("Geodetic Coordinates"));

	TQListViewItem * solarItem = new TQListViewItem(navigationPanel,i18n("Solar System"));
	solarItem->setPixmap(0,solarIcon);
	/*TQListViewItem * planetsItem = */new TQListViewItem(solarItem,i18n("Planets Coordinates"));

	connect(navigationPanel, TQ_SIGNAL(clicked(TQListViewItem *)), this,
		TQ_SLOT(slotItemSelection(TQListViewItem *)));
}

AstroCalc::~AstroCalc()
{
}

void AstroCalc::slotItemSelection(TQListViewItem *item)
{
	TQString election;

	if (item==0L) return;

	election = item->text(0);
	if(!(election.compare(i18n("Time Calculators"))))
		genTimeText();
	if(!(election.compare(i18n("Sidereal Time"))))
		genSidFrame();
	if(!(election.compare(i18n("Celestial Coordinates"))))
		genCoordText();
	if(!(election.compare(i18n("Julian Day"))))
		genJdFrame();
	if(!(election.compare(i18n("Galactic Coordinates"))))
		genGalFrame();
	if(!(election.compare(i18n("Precession"))))
		genPrecFrame();
	if(!(election.compare(i18n("Apparent Coordinates"))))
		genAppFrame();
	if(!(election.compare(i18n("Horizontal Coordinates"))))
		genAzelFrame();
	if(!(election.compare(i18n("Ecliptic Coordinates"))))
		genEclFrame();
	if(!(election.compare(i18n("Earth Coordinates"))))
		genGeodText();
	if(!(election.compare(i18n("Geodetic Coordinates"))))
		genGeodCoordFrame();
	if(!(election.compare(i18n("Day Duration"))))
		genDayFrame();
	if(!(election.compare(i18n("Equinoxes & Solstices"))))
		genEquinoxFrame();
	if(!(election.compare(i18n("Solar System"))))
		genSolarText();
	if(!(election.compare(i18n("Planets Coordinates"))))
		genPlanetsFrame();
	if(!(election.compare(i18n("Angular Distance"))))
		genAngDistFrame();
	if(!(election.compare(i18n("LSR Velocity"))))
		genVlsrFrame();

		previousElection = election;

}

void AstroCalc::genTimeText(void)
{

	delRightPanel();
	splashScreen = new TQTextView ("","",split);
	splashScreen->setMaximumWidth(550);
	splashScreen->setMinimumWidth(400);
	splashScreen->show();
		
	splashScreen->setText(i18n("<QT>"
														 "Section for time-related astronomical calculations"
														 "<UL><LI>"
														 "<B>Julian Day:</B> Julian Day/Calendar conversion"
														 "</LI><LI>"
														 "<B>Sidereal Time:</B> Sidereal/Universal time conversion"
														 "</LI><LI>"
														 "<B>Day duration:</B> Sunrise, Sunset and noon time and "
														 "positions for those events"
														 "</LI><LI>"
														"<B>Equinoxes & Solstices:</B> Equinoxes, Solstices and duration of the "
														"seasons"
														 "</LI></UL>"
														 "</QT>"));
	
	rightPanel=TimeText;
														 	
}

void AstroCalc::genCoordText(void)
{
	delRightPanel();
	splashScreen = new TQTextView ("","",split);
	splashScreen->setMaximumWidth(550);
	splashScreen->setMinimumWidth(400);
	splashScreen->show();
	
	splashScreen->setText(i18n("<QT>"
														 "Section with algorithms for the conversion of "
														 "different astronomical systems of coordinates"
														 "<UL><LI>"
														 "<B>Precessor:</B> Precession of coordinates between epochs"
														 "</LI><LI>"
														 "<B>Galactic:</B> Galactic/Equatorial coordinates conversion"
														 "</LI><LI>"
														 "<B>Apparent:</B> Computation of current equatorial coordinates"
														 " from a given epoch"
														 "</LI><LI>"
														 "<B>Ecliptic:</B> Ecliptic/Equatorial coordinates conversion"
														 "</LI><LI>"
														 "<B>Horizontal:</B> Computation of azimuth and elevation for a "
														 "given source, time, and location on the Earth"
														 "</LI><LI>"
														 "<B>Angular Distance:</B> Computation of angular distance between "
														 "two objects whose positions are given in equatorial coordinates"
														 "</LI><LI>"
														 "<B>LSR Velocity:</B> Computation of the heliocentric, geocentric "
														 "and topocentric radial velocity of a source from its LSR velocity"
														 "</LI></UL>"
														 "</QT>"));

	rightPanel=CoordText;

}

void AstroCalc::genGeodText(void)
{
	delRightPanel();
	splashScreen = new TQTextView ("","",split);
	splashScreen->setMaximumWidth(550);
	splashScreen->setMinimumWidth(400);
	splashScreen->show();
	
	splashScreen->setText(i18n("<QT>"
														 "Section with algorithms for the conversion of "
														 "systems of coordinates for the Earth"
														 "<UL><LI>"
														 "<B>Geodetic Coordinates:</B> Geodetic/XYZ coordinate conversion"
														 "</LI></UL>"
														 "</QT>"));

	rightPanel=GeoText;
}

void AstroCalc::genSolarText(void)
{
	delRightPanel();
	splashScreen = new TQTextView ("","",split);
	splashScreen->setMaximumWidth(550);
	splashScreen->setMinimumWidth(400);
	splashScreen->show();
	
	splashScreen->setText(i18n("<QT>"
														 "Section with algorithms regarding information "
														 "on solar system bodies coordinates and times"
														 "<UL><LI>"
														 "<B>Planets Coordinates:</B> Coordinates for the planets, moon and sun "
														 " at a given time and from a given position on Earth "
														 "</LI></UL>"
														 "</QT>"));

	rightPanel=SolarText;
}


void AstroCalc::delRightPanel(void)
{
	if (rightPanel <= CoordText)
		delete splashScreen;
	else if (rightPanel == JD)
		delete JDFrame;
	else if (rightPanel == SidTime)
		delete SidFrame;
	else if (rightPanel == DayLength)
		delete DayFrame;
	else if (rightPanel == Equinox)
		delete EquinoxFrame;
	else if (rightPanel == GeoCoord)
		delete GeodCoordFrame;
	else if (rightPanel == Galactic)
		delete GalFrame;
	else if (rightPanel == Ecliptic)
		delete EclFrame;
	else if (rightPanel == Precessor)
		delete PrecFrame;
	else if (rightPanel == Apparent)
		delete AppFrame;
	else if (rightPanel == Azel)
		delete AzelFrame;
	else if (rightPanel == Planets)
		delete PlanetsFrame;
	else if (rightPanel == AngDist)
		delete AngDistFrame;
	else if (rightPanel == Vlsr)
		delete VlsrFrame;

}

void AstroCalc::genJdFrame(void)
{
	delRightPanel();
	JDFrame = new modCalcJD(split,"JulianDay");
	rightPanel = JD;
}

void AstroCalc::genSidFrame(void)
{
	delRightPanel();
	SidFrame = new modCalcSidTime(split,"SiderealTime");
	rightPanel = SidTime;
}

void AstroCalc::genDayFrame(void)
{
	delRightPanel();
	DayFrame = new modCalcDayLength(split,"DayDuration");
	rightPanel = DayLength;
}

void AstroCalc::genEquinoxFrame(void)
{
	delRightPanel();
	EquinoxFrame = new modCalcEquinox(split,"Equinox");
	rightPanel = Equinox;
}

void AstroCalc::genGeodCoordFrame(void)
{
	delRightPanel();
	GeodCoordFrame = new modCalcGeodCoord(split,"GeoCoord");
	rightPanel = GeoCoord;
}

void AstroCalc::genGalFrame(void)
{
	delRightPanel();
	GalFrame = new modCalcGalCoord(split,"Galactic");
	rightPanel = Galactic;
}

void AstroCalc::genEclFrame(void)
{
	delRightPanel();
	EclFrame = new modCalcEclCoords(split,"Ecliptic");
	rightPanel = Ecliptic;
}

void AstroCalc::genPrecFrame(void)
{
	delRightPanel();
	PrecFrame = new modCalcPrec(split,"Precession");
	rightPanel = Precessor;
}

void AstroCalc::genAppFrame(void)
{
	delRightPanel();
	AppFrame = new modCalcApCoord(split,"Apparent");
	rightPanel = Apparent;
}

void AstroCalc::genAzelFrame(void)
{
	delRightPanel();
	AzelFrame = new modCalcAzel(split,"Horizontal");
	rightPanel = Azel;
}

void AstroCalc::genPlanetsFrame(void)
{
	delRightPanel();
	PlanetsFrame = new modCalcPlanets(split,"Planet");
	rightPanel = Planets;
}

void AstroCalc::genAngDistFrame(void)
{
	delRightPanel();
	AngDistFrame = new modCalcAngDist(split,"AngDist");
	rightPanel = AngDist;
}

void AstroCalc::genVlsrFrame(void)
{
	delRightPanel();
	VlsrFrame = new modCalcVlsr(split,"Vlsr");
	rightPanel = Vlsr;
}

TQSize AstroCalc::sizeHint() const
{
  return TQSize(640,430);
}
