/*************************************************************************** * Copyright (C) 2004-2009 by Thomas Fischer * * fischer@unix-ag.uni-kl.de * * * * 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. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "settings.h" #include "webquerycsb.h" namespace KBibTeX { WebQueryCSBWidget::WebQueryCSBWidget( TQWidget *parent, const char *name ) : WebQueryWidget( parent, name ) { init(); Settings *settings = Settings::self(); TQString value = settings->getWebQueryDefault( "CSB_query" ); value = value == TQString::null ? "" : value; lineEditQuery->setText( value ); value = settings->getWebQueryDefault( "CSB_field" ); value = value == TQString::null || value.isEmpty() ? "0" : value; comboBoxField->setCurrentItem( value.toInt() ); value = settings->getWebQueryDefault( "CSB_yearCheck" ); value = value == TQString::null || value.isEmpty() ? "0" : value; checkBoxYear->setChecked( value == "1" ); value = settings->getWebQueryDefault( "CSB_yearType" ); value = value == TQString::null || value.isEmpty() ? "0" : value; comboBoxYear->setCurrentItem( value.toInt() ); value = settings->getWebQueryDefault( "CSB_yearValue" ); value = value == TQString::null ? "2000" : value; spinBoxYear->setValue( value.toInt() ); value = settings->getWebQueryDefault( "CSB_sortBy" ); value = value == TQString::null || value.isEmpty() ? "0" : value; comboBoxSortBy->setCurrentItem( value.toInt() ); value = settings->getWebQueryDefault( "CSB_onlinePapersOnly" ); value = value == TQString::null || value.isEmpty() ? "0" : value; checkBoxOnlinePapersOnly->setChecked( value == "1" ); slotTextChanged( value, true ); } void WebQueryCSBWidget::init() { TQVBoxLayout *vLayout = new TQVBoxLayout( this, 0, KDialog::spacingHint() ); TQHBoxLayout *hLayout = new TQHBoxLayout( ); vLayout->addLayout( hLayout ); KPushButton *clearSearchText = new KPushButton( this ); clearSearchText->setIconSet( TQIconSet( SmallIcon( "locationbar_erase" ) ) ); hLayout->addWidget( clearSearchText ); TQLabel *label = new TQLabel( i18n( "Search &term:" ), this ); hLayout->addWidget( label ); lineEditQuery = new KLineEdit( this ); TDECompletion *completionQuery = lineEditQuery->completionObject(); hLayout->addWidget( lineEditQuery ); label->setBuddy( lineEditQuery ); hLayout->addSpacing( KDialog::spacingHint() * 2 ); label = new TQLabel( i18n( "Here, \"Field\" refers to a parameter for the CSB search (author, title, any)", "&Field:" ), this ); hLayout->addWidget( label ); comboBoxField = new KComboBox( false, this ); hLayout->addWidget( comboBoxField ); label->setBuddy( comboBoxField ); connect( clearSearchText, SIGNAL( clicked() ), lineEditQuery, SLOT( clear() ) ); connect( lineEditQuery, SIGNAL( textChanged( const TQString& ) ), this, SLOT( slotTextChanged( const TQString& ) ) ); hLayout->setStretchFactor( lineEditQuery, 5 ); connect( lineEditQuery, SIGNAL( returnPressed() ), this, SIGNAL( startSearch() ) ); connect( lineEditQuery, SIGNAL( returnPressed( const TQString& ) ), completionQuery, SLOT( addItem( const TQString& ) ) ); hLayout = new TQHBoxLayout( ); vLayout->addLayout( hLayout ); label = new TQLabel( i18n( "&Number of results:" ), this ); hLayout->addWidget( label ); spinBoxMaxHits = new TQSpinBox( 1, 500, 1, this ); spinBoxMaxHits->setValue( 10 ); hLayout->setStretchFactor( spinBoxMaxHits, 3 ); hLayout->addWidget( spinBoxMaxHits ); label->setBuddy( spinBoxMaxHits ); hLayout->addSpacing( KDialog::spacingHint() * 2 ); checkBoxYear = new TQCheckBox( i18n( "&Year:" ), this ); hLayout->setStretchFactor( checkBoxYear, 1 ); checkBoxYear->setChecked( true ); hLayout->addWidget( checkBoxYear ); connect( checkBoxYear, SIGNAL( toggled( bool ) ), this, SLOT( slotYearCheckToggled() ) ); comboBoxYear = new KComboBox( false, this ); hLayout->setStretchFactor( comboBoxYear, 3 ); hLayout->addWidget( comboBoxYear ); spinBoxYear = new TQSpinBox( 1800, 2100, 1, this ); spinBoxYear->setValue( TQDate::currentDate().year() ); hLayout->setStretchFactor( spinBoxYear, 6 ); hLayout->addWidget( spinBoxYear ); hLayout->addSpacing( KDialog::spacingHint() * 2 ); label = new TQLabel( i18n( "Sort &by:" ), this ); hLayout->addWidget( label ); comboBoxSortBy = new KComboBox( false, this ); hLayout->setStretchFactor( comboBoxSortBy, 8 ); hLayout->addWidget( comboBoxSortBy ); label->setBuddy( comboBoxSortBy ); hLayout = new TQHBoxLayout( ); vLayout->addLayout( hLayout ); checkBoxOnlinePapersOnly = new TQCheckBox( i18n( "Online papers only" ), this ); hLayout->addWidget( checkBoxOnlinePapersOnly ); comboBoxField->insertItem( i18n( "any" ) ); comboBoxField->insertItem( i18n( "author" ) ); comboBoxField->insertItem( i18n( "title" ) ); comboBoxYear->insertItem( i18n( "exact" ) ); comboBoxYear->insertItem( i18n( "until" ) ); comboBoxYear->insertItem( i18n( "from" ) ); comboBoxYear->setCurrentItem( 1 ); comboBoxSortBy->insertItem( i18n( "none" ) ); comboBoxSortBy->insertItem( i18n( "score" ) ); comboBoxSortBy->insertItem( i18n( "year" ) ); } void WebQueryCSBWidget::slotYearCheckToggled() { bool yearEnabled = checkBoxYear->isChecked(); comboBoxYear->setEnabled( yearEnabled ); spinBoxYear->setEnabled( yearEnabled ); } WebQueryCSB::WebQueryCSB( TQWidget* parent ): WebQuery( parent ) { m_importer = new BibTeX::FileImporterBibTeX( FALSE ); m_importer->setIgnoreComments( TRUE ); m_widget = new WebQueryCSBWidget( parent ); } WebQueryCSB::~WebQueryCSB() { delete m_widget; delete m_importer; } TQString WebQueryCSB::title() { return i18n( "Computer Science Bibliographies" ); } TQString WebQueryCSB::disclaimer() { return i18n( "Copyright for the Bibliography Collection" ); } TQString WebQueryCSB::disclaimerURL() { return "http://liinwww.ira.uka.de/bibliography/Copyright.html"; } WebQueryWidget *WebQueryCSB::widget() { return m_widget; } void WebQueryCSB::query() { WebQuery::query(); Settings *settings = Settings::self(); settings->setWebQueryDefault( "CSB_query", m_widget->lineEditQuery->text() ); settings->setWebQueryDefault( "CSB_field", TQString::number( m_widget->comboBoxField->currentItem() ) ); settings->setWebQueryDefault( "CSB_yearCheck", m_widget->checkBoxYear->isChecked() ? "1" : "0" ); settings->setWebQueryDefault( "CSB_yearType", TQString::number( m_widget->comboBoxYear->currentItem() ) ); settings->setWebQueryDefault( "CSB_yearValue", TQString::number( m_widget->spinBoxYear->value() ) ); settings->setWebQueryDefault( "CSB_sortBy", TQString::number( m_widget->comboBoxSortBy->currentItem() ) ); settings->setWebQueryDefault( "CSB_onlinePapersOnly", m_widget->checkBoxOnlinePapersOnly->isChecked() ? "1" : "0" ); setNumStages( 1 ); int numberOfResults = m_widget->spinBoxMaxHits->value(); TQString searchTerm = m_widget->lineEditQuery->text().stripWhiteSpace().replace( '$', "" ); TQString year; if ( m_widget->checkBoxYear->isChecked() ) { switch ( m_widget->comboBoxYear->currentItem() ) { case 1: year = TQString( "before=%1" ).arg( m_widget->spinBoxYear->value() ); break; case 2: year = TQString( "since=%1" ).arg( m_widget->spinBoxYear->value() ); break; default: year = TQString( "year=%1" ).arg( m_widget->spinBoxYear->value() ); break; } } TQString field; switch ( m_widget->comboBoxField->currentItem() ) { case 1: field = "au"; break; case 2: field = "ti"; break; default: field = ""; break; } TQString sortBy; switch ( m_widget->comboBoxSortBy->currentItem() ) { case 1: sortBy = "&sort=score"; break; case 2: sortBy = "&sort=year"; break; default: sortBy = ""; break; } TQString onlinePapersOnly = m_widget->checkBoxOnlinePapersOnly->isChecked() ? "&online=on" : ""; KURL url = KURL( TQString( "http://liinwww.ira.uka.de/csbib?query=%4&results=bibtex&maxnum=%1&%2&field=%3" ).arg( numberOfResults ).arg( year ).arg( field ).arg( searchTerm.replace( "%", "%25" ).replace( "+", "%2B" ).replace( " ", "%20" ).replace( "#", "%23" ).replace( "&", "%26" ).replace( "?", "%3F" ) ).append( onlinePapersOnly ).append( sortBy ) ); TQString rawText = download( url ); if ( rawText != NULL && !m_aborted ) { TQRegExp removeXML( "<[^>]+>" ); rawText.replace( removeXML, "" ); BibTeX::FileImporterBibTeX importer( FALSE ); importer.setIgnoreComments( TRUE ); TQBuffer buffer; buffer.open( IO_WriteOnly ); TQTextStream ts( &buffer ); ts.setEncoding( TQTextStream::UnicodeUTF8 ); ts << rawText << endl; buffer.close(); buffer.open( IO_ReadOnly ); BibTeX::File *tmpBibFile = importer.load( &buffer ); buffer.close(); if ( tmpBibFile != NULL && tmpBibFile->count() > 0 ) { for ( BibTeX::File::ElementList::iterator it = tmpBibFile->begin(); !m_aborted && it != tmpBibFile->end(); ++it ) { BibTeX::Entry *entry = dynamic_cast( *it ); if ( entry != NULL ) emit foundEntry( new BibTeX::Entry( entry ), false ); } setEndSearch( WebQuery::statusSuccess ); } else setEndSearch( WebQuery::statusError ); if ( tmpBibFile != NULL ) delete tmpBibFile; } else if ( !m_aborted ) { TQString message = TDEIO::NetAccess::lastErrorString(); if ( message.isEmpty() ) message.prepend( '\n' ); message.prepend( TQString( i18n( "Querying database '%1' failed." ) ).arg( title() ) ); KMessageBox::error( m_parent, message ); setEndSearch( WebQuery::statusError ); } else setEndSearch( WebQuery::statusAborted ); } } #include "webquerycsb.moc"