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.
237 lines
8.4 KiB
237 lines
8.4 KiB
/***************************************************************************
|
|
addcatdialog.cpp - description
|
|
-------------------
|
|
begin : Sun Mar 3 2002
|
|
copyright : (C) 2002 by Jason Harris
|
|
email : kstars@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 <tqlabel.h>
|
|
#include <tqlayout.h>
|
|
#include <kcolorbutton.h>
|
|
#include <kdebug.h>
|
|
#include <tdemessagebox.h>
|
|
#include <knuminput.h>
|
|
#include <tdetempfile.h>
|
|
#include <kurl.h>
|
|
|
|
#include "kstars.h"
|
|
#include "kstarsdata.h"
|
|
#include "customcatalog.h"
|
|
|
|
#include "addcatdialog.h"
|
|
|
|
AddCatDialog::AddCatDialog( TQWidget *parent )
|
|
: KDialogBase( KDialogBase::Plain, i18n( "Import Catalog" ), Help|Ok|Cancel, Ok, parent ) {
|
|
|
|
TQFrame *page = plainPage();
|
|
setMainWidget(page);
|
|
TQDir::setCurrent( TQDir::homeDirPath() );
|
|
|
|
vlay = new TQVBoxLayout( page, 0, spacingHint() );
|
|
acd = new AddCatDialogUI(page);
|
|
vlay->addWidget( acd );
|
|
|
|
connect( acd->DataURL->lineEdit(), TQ_SIGNAL( lostFocus() ), this, TQ_SLOT( slotShowDataFile() ) );
|
|
connect( acd->DataURL, TQ_SIGNAL( urlSelected( const TQString & ) ),
|
|
this, TQ_SLOT( slotShowDataFile() ) );
|
|
connect( acd->PreviewButton, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotPreviewCatalog() ) );
|
|
connect( this, TQ_SIGNAL( okClicked() ), this, TQ_SLOT( slotCreateCatalog() ) );
|
|
|
|
acd->FieldList->insertItem( i18n( "ID Number" ) );
|
|
acd->FieldList->insertItem( i18n( "Right Ascension" ) );
|
|
acd->FieldList->insertItem( i18n( "Declination" ) );
|
|
acd->FieldList->insertItem( i18n( "Object Type" ) );
|
|
|
|
acd->FieldPool->insertItem( i18n( "Common Name" ) );
|
|
acd->FieldPool->insertItem( i18n( "Magnitude" ) );
|
|
acd->FieldPool->insertItem( i18n( "Major Axis" ) );
|
|
acd->FieldPool->insertItem( i18n( "Minor Axis" ) );
|
|
acd->FieldPool->insertItem( i18n( "Position Angle" ) );
|
|
acd->FieldPool->insertItem( i18n( "Ignore" ) );
|
|
}
|
|
|
|
AddCatDialog::~AddCatDialog(){
|
|
}
|
|
|
|
void AddCatDialog::slotOk() {
|
|
//Overriding slotOk() so that custom data file can be validated before
|
|
//TQDialog::accept() is emitted and the window is closed.
|
|
|
|
//the validation code needs to be aware of AddCatDialog members, so I will just
|
|
//emit the okClicked() signal, which is connected to AddCatDialog::validateFile()
|
|
emit okClicked();
|
|
}
|
|
|
|
void AddCatDialog::slotHelp() {
|
|
TQString message =
|
|
i18n( "A valid custom catalog file has one line per object, "
|
|
"with the following fields in each line:") + "\n\t" +
|
|
i18n( "1. Type identifier. Must be one of: 0 (star), 3 (open cluster), 4 (globular cluster), "
|
|
"5 (gaseous nebula), 6 (planetary nebula), 7 (supernova remnant), or 8 (galaxy)" ) + "\n\t" +
|
|
i18n( "2. Right Ascension (floating-point value)" ) + "\n\t" +
|
|
i18n( "3. Declination (floating-point value)" ) + "\n\t" +
|
|
i18n( "4. Magnitude (floating-point value)" ) + "\n\t" +
|
|
i18n( "5. Spectral type (if type=0); otherwise object's catalog name" ) + "\n\t" +
|
|
i18n( "6. Star name (if type=0); otherwise object's common name. [field 6 is optional]" ) + "\n\n" +
|
|
|
|
i18n( "The fields should be separated by whitespace. In addition, the catalog "
|
|
"may contain comment lines beginning with \'#\'." );
|
|
|
|
KMessageBox::information( 0, message, i18n( "Help on custom catalog file format" ) );
|
|
}
|
|
|
|
/* Attempt to parse the catalog data file specified in the DataURL box.
|
|
* We assume the data file has space-separated fields, and that each line has
|
|
* the data fields listed in the Catalog fields list, in the same order.
|
|
* Each data field is parsed as follows:
|
|
*
|
|
* ID number: integer value
|
|
* Right Ascension: colon-delimited hh:mm:ss.s or floating-point value
|
|
* Declination: colon-delimited dd:mm:ss.s or floating-point value
|
|
* Object type: integer value, one of [ 0,1,2,3,4,5,6,7,8 ]
|
|
* Common name: string value (if it contains a space, it *must* be enclosed in quotes!)
|
|
* Magnitude: floating-point value
|
|
* Major axis: floating-point value (length of major axis in arcmin)
|
|
* Minor axis: floating-point value (length of minor axis in arcmin)
|
|
* Position angle: floating-point value (position angle, in degrees)
|
|
*/
|
|
bool AddCatDialog::validateDataFile() {
|
|
KStars *ksw = (KStars*) topLevelWidget()->parent();
|
|
|
|
//Create the catalog file contents: first the header
|
|
CatalogContents = writeCatalogHeader();
|
|
|
|
//Next, the data lines (fill from user-specified file)
|
|
TQFile dataFile( acd->DataURL->url() );
|
|
if ( ! acd->DataURL->url().isEmpty() && dataFile.open( IO_ReadOnly ) ) {
|
|
TQTextStream dataStream( &dataFile );
|
|
CatalogContents += dataStream.read();
|
|
|
|
dataFile.close();
|
|
}
|
|
|
|
//Now create a temporary file for the Catalog, and attempt to parse it into a CustomCatalog
|
|
KTempFile ktf;
|
|
TQFile tmpFile( ktf.name() );
|
|
ktf.unlink(); //just need filename
|
|
if ( tmpFile.open( IO_WriteOnly ) ) {
|
|
TQTextStream ostream( &tmpFile );
|
|
ostream << CatalogContents;
|
|
tmpFile.close();
|
|
CustomCatalog *newCat;
|
|
|
|
newCat = ksw->data()->createCustomCatalog( tmpFile.name(), true ); // true = showerrs
|
|
if ( newCat ) {
|
|
int nObjects = newCat->objList().count();
|
|
delete newCat;
|
|
if ( nObjects ) return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
TQString AddCatDialog::writeCatalogHeader() {
|
|
TQString name = ( acd->CatalogName->text().isEmpty() ? i18n("Custom") : acd->CatalogName->text() );
|
|
TQString pre = ( acd->Prefix->text().isEmpty() ? "CC" : acd->Prefix->text() );
|
|
|
|
TQString h = TQString("# Name: %1\n").arg( name );
|
|
h += TQString("# Prefix: %1\n").arg( pre );
|
|
h += TQString("# Color: %1\n").arg( acd->ColorButton->color().name() );
|
|
h += TQString("# Epoch: %1\n").arg( acd->Epoch->value() );
|
|
h += TQString("# ");
|
|
|
|
for ( uint i=0; i < acd->FieldList->count(); ++i ) {
|
|
TQString f = acd->FieldList->text( i );
|
|
|
|
if ( f == i18n( "ID Number" ) ) {
|
|
h += "ID ";
|
|
} else if ( f == i18n( "Right Ascension" ) ) {
|
|
h += "RA ";
|
|
} else if ( f == i18n( "Declination" ) ) {
|
|
h += "Dc ";
|
|
} else if ( f == i18n( "Object Type" ) ) {
|
|
h += "Tp ";
|
|
} else if ( f == i18n( "Common Name" ) ) {
|
|
h += "Nm ";
|
|
} else if ( f == i18n( "Magnitude" ) ) {
|
|
h += "Mg ";
|
|
} else if ( f == i18n( "Major Axis" ) ) {
|
|
h += "Mj ";
|
|
} else if ( f == i18n( "Minor Axis" ) ) {
|
|
h += "Mn ";
|
|
} else if ( f == i18n( "Position Angle" ) ) {
|
|
h += "PA ";
|
|
} else if ( f == i18n( "Ignore" ) ) {
|
|
h += "Ig ";
|
|
}
|
|
}
|
|
|
|
h += "\n";
|
|
|
|
return h;
|
|
}
|
|
|
|
void AddCatDialog::slotShowDataFile() {
|
|
TQFile dataFile( acd->DataURL->url() );
|
|
if ( ! acd->DataURL->url().isEmpty() && dataFile.open( IO_ReadOnly ) ) {
|
|
acd->DataFileBox->clear();
|
|
TQTextStream dataStream( &dataFile );
|
|
acd->DataFileBox->insertStringList( TQStringList::split( "\n", dataStream.read(), TRUE ) );
|
|
dataFile.close();
|
|
}
|
|
}
|
|
|
|
void AddCatDialog::slotPreviewCatalog() {
|
|
if ( validateDataFile() ) {
|
|
KMessageBox::informationList( 0, i18n( "Preview of %1" ).arg( acd->CatalogName->text() ),
|
|
TQStringList::split( "\n", CatalogContents ), i18n( "Catalog Preview" ) );
|
|
}
|
|
}
|
|
|
|
void AddCatDialog::slotCreateCatalog() {
|
|
if ( validateDataFile() ) {
|
|
//CatalogContents now contains the text for the catalog file,
|
|
//and objList contains the parsed objects
|
|
|
|
//Warn user if file exists!
|
|
if ( TQFile::exists( acd->CatalogURL->url() ) )
|
|
{
|
|
KURL u( acd->CatalogURL->url() );
|
|
int r=KMessageBox::warningContinueCancel( 0,
|
|
i18n( "A file named \"%1\" already exists. "
|
|
"Overwrite it?" ).arg( u.fileName() ),
|
|
i18n( "Overwrite File?" ),
|
|
i18n( "&Overwrite" ) );
|
|
|
|
if(r==KMessageBox::Cancel) return;
|
|
}
|
|
|
|
TQFile OutFile( acd->CatalogURL->url() );
|
|
if ( ! OutFile.open( IO_WriteOnly ) ) {
|
|
KMessageBox::sorry( 0,
|
|
i18n( "Could not open the file %1 for writing." ).arg( acd->CatalogURL->url() ),
|
|
i18n( "Error Opening Output File" ) );
|
|
} else {
|
|
TQTextStream outStream( &OutFile );
|
|
outStream << CatalogContents;
|
|
OutFile.close();
|
|
|
|
emit TQDialog::accept();
|
|
close();
|
|
}
|
|
}
|
|
}
|
|
|
|
#include "addcatdialog.moc"
|