/***************************************************************************
                          jmoontool.cpp  -  Display overhead view of the solar system
                             -------------------
    begin                : Sun May 25 2003
    copyright            : (C) 2003 by Jason Harris
    email                : jharris@30doradus.org
 ***************************************************************************/
/***************************************************************************
 *                                                                         *
 *   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 <tqlayout.h>
#include <tqlabel.h>

#include <kdebug.h>
#include <tdelocale.h>

#include "jmoontool.h"
#include "jupitermoons.h"
#include "kstars.h"
#include "kstarsdata.h"
#include "ksplanet.h"
#include "simclock.h"
#include "planetcatalog.h"
#include "dms.h"
#include "ksnumbers.h"

JMoonTool::JMoonTool(TQWidget *parent, const char *name)
 : KDialogBase( KDialogBase::Plain, i18n("Jupiter Moons Tool"), Close, Close, parent, name )
{
	ksw = (KStars*)parent;
	
	TQFrame *page = plainPage();
	TQVBoxLayout *vlay = new TQVBoxLayout( page, 0, 0 );
	
	colJp = "White";
	colIo = "Red";
	colEu = "Yellow";
	colGn = "Orange";
	colCa = "YellowGreen";
	
	TQLabel *labIo = new TQLabel( "Io", page );
	TQLabel *labEu = new TQLabel( "Europa", page );
	TQLabel *labGn = new TQLabel( "Ganymede", page );
	TQLabel *labCa = new TQLabel( "Callisto", page );
	
	labIo->setSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed );
	labEu->setSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed );
	labGn->setSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed );
	labCa->setSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed );
	labIo->setAlignment( AlignHCenter );
	labEu->setAlignment( AlignHCenter );
	labGn->setAlignment( AlignHCenter );
	labCa->setAlignment( AlignHCenter );

	labIo->setPaletteForegroundColor( colIo );
	labEu->setPaletteForegroundColor( colEu );
	labGn->setPaletteForegroundColor( colGn );
	labCa->setPaletteForegroundColor( colCa );
	labIo->setPaletteBackgroundColor( "Black" );
	labEu->setPaletteBackgroundColor( "Black" );
	labGn->setPaletteBackgroundColor( "Black" );
	labCa->setPaletteBackgroundColor( "Black" );
	
	TQGridLayout *glay = new TQGridLayout( 2, 2, 0 );
	glay->addWidget( labIo, 0, 0 );
	glay->addWidget( labEu, 1, 0 );
	glay->addWidget( labGn, 0, 1 );
	glay->addWidget( labCa, 1, 1 );
	
	pw = new KStarsPlotWidget( 0.0, 1.0, 0.0, 1.0, page );
	pw->setShowGrid( false );
	pw->setYAxisType0( KStarsPlotWidget::TIME );
	pw->setLimits( -12.0, 12.0, -240.0, 240.0 );
	pw->setXAxisLabel( i18n( "offset from Jupiter (arcmin)" ) );
	pw->setYAxisLabel( i18n( "time since now (days)" ) );
	vlay->addLayout( glay );
	vlay->addWidget( pw );
	resize( 250, 500 );

	initPlotObjects();
	update();
}

JMoonTool::~JMoonTool()
{
}

void JMoonTool::initPlotObjects() {
	KPlotObject *orbit[4];
	KPlotObject *jpath;
	long double jd0 = ksw->data()->ut().djd();
	KSSun *ksun = (KSSun*)ksw->data()->PCat->findByName( "Sun" );
	KSPlanet *jup = (KSPlanet*)ksw->data()->PCat->findByName( "Jupiter" );
	JupiterMoons jm;
	
	if ( pw->objectCount() ) pw->clearObjectList();
	
	orbit[0] = new KPlotObject( "io", colIo, KPlotObject::CURVE, 1, KPlotObject::SOLID );
	orbit[1] = new KPlotObject( "europa", colEu, KPlotObject::CURVE, 1, KPlotObject::SOLID );
	orbit[2] = new KPlotObject( "ganymede", colGn, KPlotObject::CURVE, 1, KPlotObject::SOLID );
	orbit[3] = new KPlotObject( "callisto", colCa, KPlotObject::CURVE, 1, KPlotObject::SOLID );
	jpath    = new KPlotObject( "jupiter", colJp, KPlotObject::CURVE, 1, KPlotObject::SOLID );
	
	double dy = 0.01*pw->dataHeight();
	
	//t is the offset from jd0, in hours.
	for ( double t=pw->y(); t<=pw->y2(); t+=dy ) {
		KSNumbers num( jd0 + t/24.0 );
		jm.findPosition( &num, jup, ksun );
		
		//jm.x(i) tells the offset from Jupiter, in units of Jupiter's angular radius.
		//multiply by 0.5*jup->angSize() to get arcminutes
		for ( unsigned int i=0; i<4; ++i ) 
			orbit[i]->addPoint( new DPoint( 0.5*jup->angSize()*jm.x(i), t ) );
		
		jpath->addPoint( new DPoint( 0.0, t ) );
	}

	for ( unsigned int i=0; i<4; ++i ) 
		pw->addObject( orbit[i] );

	pw->addObject( jpath );
}

void JMoonTool::keyPressEvent( TQKeyEvent *e ) {
	switch ( e->key() ) {
		case Key_BracketRight:
		{
			double dy = 0.02*pw->dataHeight();
			pw->setLimits( pw->x(), pw->x2(), pw->y()+dy, pw->y2()+dy );
			initPlotObjects();
			pw->update();
			break;
		}
		case Key_BracketLeft:
		{
			double dy = 0.02*pw->dataHeight();
			pw->setLimits( pw->x(), pw->x2(), pw->y()-dy, pw->y2()-dy );
			initPlotObjects();
			pw->update();
			break;
		}
		case Key_Plus:
		case Key_Equal:
		{
			if ( pw->dataHeight() > 48.0 ) { 
				double dy = 0.45*pw->dataHeight();
				double y0 = pw->y() + 0.5*pw->dataHeight();
				pw->setLimits( pw->x(), pw->x2(), y0-dy, y0+dy );
				initPlotObjects();
				pw->update();
			}
			break;
		}
		case Key_Minus:
		case Key_Underscore:
		{
			if ( pw->dataHeight() < 960.0 ) {
				double dy = 0.55*pw->dataHeight();
				double y0 = pw->y() + 0.5*pw->dataHeight();
				pw->setLimits( pw->x(), pw->x2(), y0-dy, y0+dy );
				initPlotObjects();
				pw->update();
			}
			break;
		}
		case Key_Escape:
		{
			close();
			break;
		}
		
		default: { e->ignore(); break; }
	}
}

#include "jmoontool.moc"
