You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
479 lines
16 KiB
479 lines
16 KiB
/***************************************************************************
|
|
lcgenerator.cpp - description
|
|
-------------------
|
|
begin : Tue Oct 1 18:01:48 CDT 2002
|
|
copyright : (C) 2002 by Jasem Mutlaq
|
|
email : mutlaqja@ku.edu
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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 <tqvariant.h>
|
|
#include <klineedit.h>
|
|
#include <tdelistbox.h>
|
|
#include <kpushbutton.h>
|
|
#include <tqcheckbox.h>
|
|
#include <tqgroupbox.h>
|
|
#include <tqlabel.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqlayout.h>
|
|
#include <tqtooltip.h>
|
|
#include <tqwhatsthis.h>
|
|
#include <tqfile.h>
|
|
|
|
#include <tdeio/netaccess.h>
|
|
#include <kmessagebox.h>
|
|
#include <kstandarddirs.h>
|
|
|
|
#include "lcgenerator.h"
|
|
#include "imageviewer.h"
|
|
#include "kstars.h"
|
|
#include "kstarsdata.h"
|
|
|
|
#include <kapplication.h>
|
|
|
|
LCGenerator::LCGenerator( TQWidget* parent)
|
|
: KDialogBase( parent, "lcgenerator", false, i18n( "AAVSO Light Curve Generator"),0) , Hostprefix("http://www.aavso.org/cgi-bin/kstar.pl"), JDCutOff(2437600)
|
|
{
|
|
|
|
ksw = (KStars*) parent;
|
|
createGUI();
|
|
|
|
downloadJob = 0;
|
|
|
|
file = new TQFile();
|
|
}
|
|
|
|
LCGenerator::~LCGenerator()
|
|
{
|
|
delete file;
|
|
delete downloadJob;
|
|
}
|
|
|
|
void LCGenerator::createGUI()
|
|
{
|
|
|
|
TQWidget *page = new TQWidget(this);
|
|
setMainWidget(page);
|
|
|
|
LCGeneratorDialogLayout = new TQVBoxLayout( page, 11, 6, "LCGeneratorDialogLayout");
|
|
|
|
SDLayout = new TQHBoxLayout( 0, 0, 6, "SDLayout");
|
|
|
|
StarInfoBox = new TQGroupBox( page, "StarInfoBox" );
|
|
StarInfoBox->setColumnLayout(0, Qt::Vertical );
|
|
StarInfoBox->layout()->setSpacing( 6 );
|
|
StarInfoBox->layout()->setMargin( 11 );
|
|
StarInfoBoxLayout = new TQVBoxLayout( StarInfoBox->layout() );
|
|
StarInfoBoxLayout->setAlignment( TQt::AlignTop );
|
|
|
|
DesignHLayout = new TQHBoxLayout( 0, 0, 6, "DesignHLayout");
|
|
|
|
desigLabel = new TQLabel( StarInfoBox, "desigLabel" );
|
|
desigLabel->setMinimumSize( TQSize( 70, 0 ) );
|
|
DesignHLayout->addWidget( desigLabel );
|
|
|
|
DesignationIn = new TDEListBox( StarInfoBox, "DesignationIn" );
|
|
DesignHLayout->addWidget( DesignationIn );
|
|
StarInfoBoxLayout->addLayout( DesignHLayout );
|
|
|
|
// Fill stars designations
|
|
for (uint i=0; i< (ksw->data()->VariableStarsList.count()); i++)
|
|
DesignationIn->insertItem(ksw->data()->VariableStarsList.at(i)->Designation);
|
|
|
|
NameHLayout = new TQHBoxLayout( 0, 0, 6, "NameHLayout");
|
|
|
|
nameLabel = new TQLabel( StarInfoBox, "nameLabel" );
|
|
nameLabel->setMinimumSize( TQSize( 70, 0 ) );
|
|
NameHLayout->addWidget( nameLabel );
|
|
|
|
NameIn = new TDEListBox( StarInfoBox, "NameIn" );
|
|
NameHLayout->addWidget( NameIn );
|
|
StarInfoBoxLayout->addLayout( NameHLayout );
|
|
|
|
// Fill star names
|
|
for (uint i=0; i<ksw->data()->VariableStarsList.count(); i++)
|
|
NameIn->insertItem(ksw->data()->VariableStarsList.at(i)->Name);
|
|
|
|
StartHLayout = new TQHBoxLayout( 0, 0, 6, "StartHLayout");
|
|
|
|
startLabel = new TQLabel( StarInfoBox, "startLabel" );
|
|
startLabel->setMinimumSize( TQSize( 70, 0 ) );
|
|
StartHLayout->addWidget( startLabel );
|
|
|
|
StartDateIn = new KLineEdit( StarInfoBox, "StartDateIn" );
|
|
StartHLayout->addWidget( StartDateIn );
|
|
StarInfoBoxLayout->addLayout( StartHLayout );
|
|
|
|
EndHLayout = new TQHBoxLayout( 0, 0, 6, "EndHLayout");
|
|
|
|
endLabel = new TQLabel( StarInfoBox, "endLabel" );
|
|
endLabel->setMinimumSize( TQSize( 70, 0 ) );
|
|
EndHLayout->addWidget( endLabel );
|
|
|
|
EndDateIn = new KLineEdit( StarInfoBox, "EndDateIn" );
|
|
EndHLayout->addWidget( EndDateIn );
|
|
StarInfoBoxLayout->addLayout( EndHLayout );
|
|
SDLayout->addWidget( StarInfoBox );
|
|
|
|
DataSelectBox = new TQGroupBox( page, "DataSelectBox" );
|
|
DataSelectBox->setColumnLayout(0, Qt::Vertical );
|
|
DataSelectBox->layout()->setSpacing( 6 );
|
|
DataSelectBox->layout()->setMargin( 11 );
|
|
DataSelectBoxLayout = new TQVBoxLayout( DataSelectBox->layout() );
|
|
DataSelectBoxLayout->setAlignment( TQt::AlignTop );
|
|
|
|
VisualCheck = new TQCheckBox( DataSelectBox, "VisualCheck" );
|
|
VisualCheck->setChecked( TRUE );
|
|
DataSelectBoxLayout->addWidget( VisualCheck );
|
|
|
|
FainterCheck = new TQCheckBox( DataSelectBox, "FainterCheck" );
|
|
FainterCheck->setChecked( TRUE );
|
|
DataSelectBoxLayout->addWidget( FainterCheck );
|
|
|
|
DiscrepantCheck = new TQCheckBox( DataSelectBox, "DiscrepantCheck" );
|
|
DataSelectBoxLayout->addWidget( DiscrepantCheck );
|
|
|
|
CCDBCheck = new TQCheckBox( DataSelectBox, "CCDBCheck" );
|
|
CCDBCheck->setChecked( TRUE );
|
|
DataSelectBoxLayout->addWidget( CCDBCheck );
|
|
|
|
CCDVCheck = new TQCheckBox( DataSelectBox, "CCDVCheck" );
|
|
CCDVCheck->setChecked( TRUE );
|
|
DataSelectBoxLayout->addWidget( CCDVCheck );
|
|
|
|
CCDRCheck = new TQCheckBox( DataSelectBox, "CCDRCheck" );
|
|
CCDRCheck->setChecked( TRUE );
|
|
DataSelectBoxLayout->addWidget( CCDRCheck );
|
|
|
|
CCDICheck = new TQCheckBox( DataSelectBox, "CCDICheck" );
|
|
CCDICheck->setChecked( TRUE );
|
|
DataSelectBoxLayout->addWidget( CCDICheck );
|
|
|
|
PlotHLayout = new TQHBoxLayout( 0, 0, 6, "PlotHLayout");
|
|
|
|
plotLabel = new TQLabel( DataSelectBox, "plotLabel" );
|
|
PlotHLayout->addWidget( plotLabel );
|
|
|
|
AverageDayIn = new KLineEdit( DataSelectBox, "AverageDayIn" );
|
|
PlotHLayout->addWidget( AverageDayIn );
|
|
|
|
daysLabel = new TQLabel( DataSelectBox, "daysLabel" );
|
|
PlotHLayout->addWidget( daysLabel );
|
|
DataSelectBoxLayout->addLayout( PlotHLayout );
|
|
SDLayout->addWidget( DataSelectBox );
|
|
LCGeneratorDialogLayout->addLayout( SDLayout );
|
|
|
|
ButtonHLayout = new TQHBoxLayout( 0, 0, 6, "ButtonHLayout");
|
|
|
|
GetCurveButton = new KPushButton( page, "GetCurveButton" );
|
|
ButtonHLayout->addWidget( GetCurveButton );
|
|
|
|
UpdateListButton = new KPushButton( page, "UpdateListButton" );
|
|
ButtonHLayout->addWidget( UpdateListButton );
|
|
TQSpacerItem* spacer = new TQSpacerItem( 128, 16, TQSizePolicy::Expanding, TQSizePolicy::Minimum );
|
|
ButtonHLayout->addItem( spacer );
|
|
|
|
CloseButton = new KPushButton( page, "closeButton" );
|
|
ButtonHLayout->addWidget( CloseButton );
|
|
LCGeneratorDialogLayout->addLayout( ButtonHLayout );
|
|
|
|
|
|
StarInfoBox->setTitle( i18n( "Star Info" ) );
|
|
desigLabel->setText( i18n( "Designation:" ) );
|
|
nameLabel->setText( i18n( "Or name:" ) );
|
|
startLabel->setText( i18n( "Start date:" ) );
|
|
TQWhatsThis::add( startLabel, i18n( "Start date for the light curve plot in mm/dd/yy or JD" ) );
|
|
endLabel->setText( i18n( "End date:" ) );
|
|
TQWhatsThis::add( endLabel, i18n( "End date for the light curve plot in mm/dd/yy or JD" ) );
|
|
StartDateIn->setText( i18n( "default" ) );
|
|
EndDateIn->setText( i18n( "default" ) );
|
|
DataSelectBox->setTitle( i18n( "Data Selection" ) );
|
|
VisualCheck->setText( i18n( "Visual" ) );
|
|
FainterCheck->setText( i18n( "Fainter thans" ) );
|
|
DiscrepantCheck->setText( i18n( "Discrepant data" ) );
|
|
CCDBCheck->setText( i18n( "CCDB" ) );
|
|
CCDVCheck->setText( i18n( "CCDV" ) );
|
|
CCDRCheck->setText( i18n( "CCDR" ) );
|
|
CCDICheck->setText( i18n( "CCDI" ) );
|
|
plotLabel->setText( i18n( "Plot average:" ) );
|
|
daysLabel->setText( i18n( "days" ) );
|
|
GetCurveButton->setText( i18n( "Retrieve Curve" ) );
|
|
UpdateListButton->setText( i18n( "Update List" ) );
|
|
CloseButton->setText( i18n( "Close" ) );
|
|
|
|
resize( TQSize(500, 360) );
|
|
|
|
// Signals/Slots
|
|
TQObject::connect(CloseButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(close()));
|
|
TQObject::connect(GetCurveButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(VerifyData()));
|
|
TQObject::connect(UpdateListButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(updateStarList()));
|
|
TQObject::connect(DesignationIn, TQT_SIGNAL(highlighted(int)), this, TQT_SLOT(updateNameList(int)));
|
|
TQObject::connect(NameIn, TQT_SIGNAL(highlighted(int)), this, TQT_SLOT(updateDesigList(int)));
|
|
|
|
|
|
}
|
|
|
|
void LCGenerator::VerifyData()
|
|
{
|
|
TQString InitialStartDate, InitialEndDate;
|
|
TQString FinalDesignation, FinalStartDate, FinalEndDate, AverageDays;
|
|
bool AverageDaysOK;
|
|
|
|
// Get initial user input
|
|
if ( StartDateIn->text().isEmpty() ) StartDateIn->setText( i18n( "default" ) );
|
|
if ( EndDateIn->text().isEmpty() ) EndDateIn->setText( i18n( "default" ) );
|
|
InitialStartDate = StartDateIn->text().lower();
|
|
InitialEndDate = EndDateIn->text().lower();
|
|
AverageDays = AverageDayIn->text();
|
|
FinalDesignation = DesignationIn->currentText();
|
|
|
|
// set Julian day
|
|
if (!setJD(InitialStartDate, &FinalStartDate, 0))
|
|
return;
|
|
if (!setJD(InitialEndDate, &FinalEndDate, 1))
|
|
return;
|
|
|
|
if (FinalEndDate.toInt() < FinalStartDate.toInt())
|
|
{
|
|
KMessageBox::error(this, i18n("End date must occur after start date."));
|
|
return;
|
|
}
|
|
|
|
// Check that we have an integer for average number of days, if data field empty, then make it 'default'
|
|
if (!AverageDays.isEmpty())
|
|
{
|
|
AverageDays.toInt(&AverageDaysOK);
|
|
if (!AverageDaysOK)
|
|
{
|
|
KMessageBox::error(this, i18n("Average days must be a positive integer."));
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if (AverageDays.toInt() < 0)
|
|
{
|
|
KMessageBox::error(this, i18n("Average days must be a positive integer."));
|
|
return;
|
|
}
|
|
}
|
|
|
|
}
|
|
else AverageDays = TQString("default");
|
|
|
|
//Download the curve!
|
|
DownloadCurve(FinalStartDate, FinalEndDate, FinalDesignation, AverageDays);
|
|
|
|
}
|
|
|
|
bool LCGenerator::setJD(TQString Date, TQString *JD, int JDType)
|
|
{
|
|
uint i=0;
|
|
int TempJD=0;
|
|
int slashCount =0;
|
|
int slashRefrence[2];
|
|
|
|
int dateFormat[3];
|
|
bool isNumber;
|
|
|
|
const TQString invalidFormatStartJD(i18n("Invalid date format. Correct format is mm/dd/yyyy or JD, leave 'default' to generate light curves for the past 500 days."));
|
|
const TQString invalidFormatENDJD(i18n("Invalid date format. Correct format is mm/dd/yyyy or JD, leave 'default' to generate light curves until today."));
|
|
TQString invalidFormatMsg(JDType ? invalidFormatENDJD : invalidFormatStartJD);
|
|
|
|
|
|
// check for "default" date
|
|
if (Date == i18n("default"))
|
|
{
|
|
*JD = "default";
|
|
return true;
|
|
}
|
|
|
|
// Get slashcount and and slash refrences
|
|
for (i=0; i<Date.length(); i++)
|
|
if (Date.at(i) == '/')
|
|
{
|
|
slashRefrence[slashCount++] = i;
|
|
if (slashCount > 2)
|
|
{
|
|
KMessageBox::error(this, invalidFormatMsg);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// check if the data appears to be in JD format
|
|
if (!slashCount)
|
|
{
|
|
TempJD = Date.toInt(&isNumber, 10);
|
|
if (!isNumber)
|
|
{
|
|
KMessageBox::error(this, invalidFormatMsg);
|
|
return false;
|
|
}
|
|
|
|
if (TempJD >= JDCutOff)
|
|
{
|
|
JD->setNum(TempJD, 10);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
const char* invalidJD = I18N_NOOP("No data available for JD prior to %d");
|
|
KMessageBox::error(this, TQString().sprintf(invalidJD, JDCutOff));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// If it's not a Julian day, check for the format of the date
|
|
// check if year is 4 digits
|
|
if ( (Date.length() - slashRefrence[1] - 1) != 4)
|
|
{
|
|
KMessageBox::error(this, invalidFormatMsg);
|
|
return false;
|
|
}
|
|
|
|
// form mm/dd/yyy fields
|
|
dateFormat[0] = Date.mid(0, slashRefrence[0]).toInt();
|
|
dateFormat[1] = Date.mid(slashRefrence[0]+1, slashRefrence[1] - (slashRefrence[0] +1)).toInt();
|
|
dateFormat[2] = Date.mid(slashRefrence[1]+1, Date.length()).toInt();
|
|
|
|
ExtDate tempdate(dateFormat[2], dateFormat[0], dateFormat[1]);
|
|
if (!tempdate.isValid())
|
|
{
|
|
KMessageBox::error(this, invalidFormatMsg);
|
|
return false;
|
|
}
|
|
|
|
// Convert to JD and verify its lower limit
|
|
TempJD = tempdate.jd();
|
|
|
|
if (TempJD >= JDCutOff)
|
|
{
|
|
JD->setNum(TempJD, 10);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
const char* invalidJD = I18N_NOOP("No data available for JD prior to %d");
|
|
KMessageBox::error(this, TQString().sprintf(invalidJD, JDCutOff));
|
|
return false;
|
|
}
|
|
|
|
}
|
|
|
|
void LCGenerator::DownloadCurve(TQString FinalStartDate, TQString FinalEndDate, TQString FinalDesignation, TQString AverageDay)
|
|
{
|
|
|
|
TQString buf(Hostprefix);
|
|
TQString Yes("yes");
|
|
TQString No("no");
|
|
|
|
//FainterCheck;
|
|
//CCDVCheck;
|
|
//CCDICheck;
|
|
//CCDRCheck;
|
|
//CCDBCheck;
|
|
//VisualCheck;
|
|
//DiscrepantCheck;
|
|
|
|
|
|
buf.append("?"+FinalStartDate);
|
|
buf.append("?"+FinalEndDate);
|
|
buf.append("?"+FinalDesignation);
|
|
buf.append("?"+AverageDay);
|
|
buf.append("?"+ (FainterCheck->isOn() ? Yes : No));
|
|
buf.append("?"+ (CCDVCheck->isOn() ? Yes : No));
|
|
buf.append("?"+ (CCDICheck->isOn() ? Yes : No));
|
|
buf.append("?"+ (CCDRCheck->isOn() ? Yes : No));
|
|
buf.append("?"+ (CCDBCheck->isOn() ? Yes : No));
|
|
buf.append("?"+ (VisualCheck->isOn() ? Yes : No));
|
|
buf.append("?"+ (DiscrepantCheck->isOn() ? Yes : No));
|
|
|
|
|
|
KURL url(buf);
|
|
TQString message = i18n( "Light Curve produced by the American Amateur Variable Star Observers" );
|
|
// parent of imageview is KStars
|
|
new ImageViewer(&url, message, ksw, "lightcurve");
|
|
|
|
}
|
|
|
|
void LCGenerator::updateDesigList(int index)
|
|
{
|
|
|
|
DesignationIn->setSelected(index, true);
|
|
DesignationIn->centerCurrentItem();
|
|
|
|
}
|
|
|
|
void LCGenerator::updateNameList(int index)
|
|
{
|
|
|
|
NameIn->setSelected(index, true);
|
|
NameIn->centerCurrentItem();
|
|
|
|
}
|
|
|
|
void LCGenerator::updateStarList()
|
|
{
|
|
file->setName( locateLocal( "appdata", "valaav.txt" ) );
|
|
|
|
KURL AAVSOFile("http://www.aavso.org/observing/aids/valaav.txt");
|
|
KURL saveFile (file->name());
|
|
|
|
downloadJob = TDEIO::file_copy (AAVSOFile, saveFile, -1, true);
|
|
connect (downloadJob, TQT_SIGNAL (result (TDEIO::Job *)), TQT_SLOT (downloadReady (TDEIO::Job *)));
|
|
}
|
|
|
|
void LCGenerator::downloadReady(TDEIO::Job * job)
|
|
{
|
|
|
|
downloadJob = 0;
|
|
|
|
if ( job->error() )
|
|
{
|
|
job->showErrorDialog();
|
|
closeEvent (0);
|
|
return; // exit this function
|
|
}
|
|
|
|
file->close(); // to get the newest informations of the file and not any informations from opening of the file
|
|
|
|
if ( file->exists() )
|
|
{
|
|
ksw->data()->readVARData();
|
|
|
|
DesignationIn->clear();
|
|
NameIn->clear();
|
|
|
|
// Fill stars designations
|
|
for (uint i=0; i< (ksw->data()->VariableStarsList.count()); i++)
|
|
DesignationIn->insertItem(ksw->data()->VariableStarsList.at(i)->Designation);
|
|
|
|
// Fill star names
|
|
for (uint i=0; i<ksw->data()->VariableStarsList.count(); i++)
|
|
NameIn->insertItem(ksw->data()->VariableStarsList.at(i)->Name);
|
|
|
|
KMessageBox::information(this, i18n("AAVSO Star list downloaded successfully."));
|
|
|
|
|
|
return;
|
|
}
|
|
closeEvent (0);
|
|
|
|
}
|
|
|
|
void LCGenerator::closeEvent (TQCloseEvent *ev)
|
|
{
|
|
if (ev) // not if closeEvent (0) is called, because segfault
|
|
ev->accept(); // parent-widgets should not get this event, so it will be filtered
|
|
//this->~LCGenerator(); // destroy the object, so the object can only allocated with operator new, not as a global/local variable
|
|
}
|
|
|
|
#include "lcgenerator.moc"
|