/*************************************************************************** * 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 "entrywidgetkeyword.h" namespace KBibTeX { KeywordListViewItem::KeywordListViewItem( TDEListView * parent, const TQString & text, bool global ) : TQCheckListItem( parent, text, TQCheckListItem::CheckBox ) { setGlobal( global ); } KeywordListViewItem::~KeywordListViewItem() { // nothing } void KeywordListViewItem::setGlobal( bool global ) { m_isGlobal = global; if ( m_isGlobal ) { setText( 1, i18n( "Global" ) ); setPixmap( 1, SmallIcon( "package" ) ); } else { setText( 1, i18n( "In this file only" ) ); setPixmap( 1, SmallIcon( "edit-copy" ) ); } } EntryWidgetKeyword::EntryWidgetKeyword( BibTeX::File *bibtexfile, bool isReadOnly, TQWidget *parent, const char *name ) : EntryWidgetTab( bibtexfile, isReadOnly, parent, name ), m_bibtexfile( bibtexfile ), m_isModified( FALSE ), m_numKeywords( 0 ) { setupGUI(); } EntryWidgetKeyword::~EntryWidgetKeyword() { // nothing } bool EntryWidgetKeyword::isModified() { return m_isModified; } void EntryWidgetKeyword::updateGUI( BibTeX::Entry::EntryType /*entryType*/, bool /*enableAll*/ ) { // nothing } void EntryWidgetKeyword::apply( BibTeX::Entry *entry ) { readListView(); /** * Update entry */ if ( m_usedKeywords.empty() ) entry->deleteField( BibTeX::EntryField::ftKeywords ); else { BibTeX::EntryField * field = entry->getField( BibTeX::EntryField::ftKeywords ); BibTeX::Value *value = NULL; if ( field == NULL ) { field = new BibTeX::EntryField( BibTeX::EntryField::ftKeywords ); entry->addField( field ); } value = field->value(); value->items.clear(); BibTeX::KeywordContainer *keywordContainer = new BibTeX::KeywordContainer( m_usedKeywords ); value->items.append( keywordContainer ); } /** * Update global keyword list */ KBibTeX::Settings * settings = KBibTeX::Settings::self(); settings->keyword_GlobalList = m_globalKeywords; } void EntryWidgetKeyword::reset( BibTeX::Entry *entry ) { BibTeX::EntryField * field = entry->getField( BibTeX::EntryField::ftKeywords ); BibTeX::KeywordContainer *keywordContainer = NULL; if ( field != NULL && ( keywordContainer = dynamic_cast( field->value()->items.first() ) ) != NULL ) for ( TQValueList::Iterator it = keywordContainer->keywords.begin(); it != keywordContainer->keywords.end(); ++it ) m_usedKeywords.append(( *it )->text() ); if ( m_bibtexfile != NULL ) m_fileKeywords = m_bibtexfile->getAllValuesAsStringList( BibTeX::EntryField::ftKeywords ); KBibTeX::Settings * settings = KBibTeX::Settings::self(); m_globalKeywords = settings->keyword_GlobalList; m_availableKeywords = TQStringList( m_globalKeywords ); for ( TQStringList::Iterator it = m_fileKeywords.begin(); it != m_fileKeywords.end(); ++it ) if ( !m_availableKeywords.contains( *it ) ) m_availableKeywords.append( *it ); for ( TQStringList::Iterator it = m_usedKeywords.begin(); it != m_usedKeywords.end(); ++it ) if ( !m_availableKeywords.contains( *it ) ) m_availableKeywords.append( *it ); setListView(); } void EntryWidgetKeyword::updateWarnings( BibTeX::Entry::EntryType /*entryType*/, TQListView */*listViewWarnings*/ ) { // nothing } void EntryWidgetKeyword::slotSelectionChanged() { bool hasCurrent = m_listviewKeywords->selectedItem() != NULL; m_buttonEdit->setEnabled( hasCurrent ); m_buttonToggleGlobal->setEnabled( hasCurrent ); } void EntryWidgetKeyword::slotKeywordRenamed( TQListViewItem * item, const TQString & text, int /*col*/ ) { KeywordListViewItem *kwlvi = dynamic_cast( item ); if ( text.isEmpty() ) { item->setText( 0, m_beforeRenaming ); kwlvi->setOn( FALSE ); } else if ( text != m_beforeRenaming ) { if ( m_availableKeywords.contains( text ) ) { item->setText( 0, m_beforeRenaming ); KMessageBox::error( this, TQString( i18n( "The keyword '%1' does already exist in the list of keywords.\nThe old name has been restored." ) ).arg( text ), i18n( "Renaming keyword failed" ) ); } else { m_availableKeywords.remove( m_beforeRenaming ); m_availableKeywords.append( text ); if ( kwlvi->isGlobal() ) { m_globalKeywords.remove( m_beforeRenaming ); m_globalKeywords.append( text ); } else { m_fileKeywords.remove( m_beforeRenaming ); m_fileKeywords.append( text ); } TQCheckListItem *checkedItem = dynamic_cast( item ); if ( checkedItem != NULL ) checkedItem->setOn( TRUE ); } } } void EntryWidgetKeyword::slotNewKeyword() { KeywordListViewItem * item = new KeywordListViewItem( m_listviewKeywords, TQString( i18n( "May only contain ASCII characters, in case of doubt keep English form", "NewKeyword%1" ) ).arg( ++m_numKeywords ), FALSE ); m_listviewKeywords->setSelected( item, TRUE ); TQTimer::singleShot( 100, this, SLOT( slotEditKeyword() ) ); } void EntryWidgetKeyword::slotEditKeyword() { TQListViewItem * item = m_listviewKeywords->selectedItem(); if ( item != NULL ) { m_beforeRenaming = item->text( 0 ); m_listviewKeywords->rename( item, 0 ); } } void EntryWidgetKeyword::slotToggleGlobal() { KeywordListViewItem *item = dynamic_cast( m_listviewKeywords->selectedItem() ); if ( item != NULL ) { bool isGlobal = item->isGlobal(); if ( isGlobal ) m_globalKeywords.remove( item->text( 0 ) ); else m_globalKeywords.append( item->text( 0 ) ); item->setGlobal( !isGlobal ); } } void EntryWidgetKeyword::setupGUI() { TQGridLayout * gridLayout = new TQGridLayout( this, 6, 2, KDialog::marginHint(), KDialog::spacingHint(), "gridLayout" ); gridLayout->setRowStretch( 4, 1 ); m_listviewKeywords = new TDEListView( this ); m_listviewKeywords->setEnabled( !m_isReadOnly ); m_listviewKeywords->addColumn( i18n( "Keyword" ) ); m_listviewKeywords->addColumn( i18n( "Origin" ) ); gridLayout->addMultiCellWidget( m_listviewKeywords, 0, 4, 0, 0 ); m_listviewKeywords->setAllColumnsShowFocus( TRUE ); connect( m_listviewKeywords, SIGNAL( currentChanged( TQListViewItem* ) ), this, SLOT( slotSelectionChanged() ) ); connect( m_listviewKeywords, SIGNAL( clicked( TQListViewItem * ) ), this, SLOT( slotSelectionChanged() ) ); connect( m_listviewKeywords, SIGNAL( itemRenamed( TQListViewItem*, const TQString&, int ) ), this, SLOT( slotKeywordRenamed( TQListViewItem*, const TQString&, int ) ) ); m_buttonNew = new TQPushButton( i18n( "keyword", "New" ), this ); m_buttonNew->setEnabled( !m_isReadOnly ); m_buttonNew->setIconSet( TQIconSet( SmallIcon( "add" ) ) ); TQToolTip::add( m_buttonNew, i18n( "Add a new keyword to the list" ) ); gridLayout->addWidget( m_buttonNew, 0, 1 ); connect( m_buttonNew, SIGNAL( clicked() ), this, SLOT( slotNewKeyword() ) ); m_buttonEdit = new TQPushButton( i18n( "keyword", "Edit" ), this ); m_buttonEdit->setIconSet( TQIconSet( SmallIcon( "edit" ) ) ); TQToolTip::add( m_buttonEdit, i18n( "Edit the selected keyword" ) ); gridLayout->addWidget( m_buttonEdit, 1, 1 ); m_buttonEdit->setEnabled( FALSE ); connect( m_buttonEdit, SIGNAL( clicked() ), this, SLOT( slotEditKeyword() ) ); m_buttonToggleGlobal = new TQPushButton( i18n( "keyword", "Toggle &global" ), this ); m_buttonToggleGlobal->setIconSet( TQIconSet( SmallIcon( "package" ) ) ); TQToolTip::add( m_buttonToggleGlobal, i18n( "Add or remove the selected keyword to or from the global list" ) ); gridLayout->addWidget( m_buttonToggleGlobal, 2, 1 ); m_buttonToggleGlobal->setEnabled( FALSE ); connect( m_buttonToggleGlobal, SIGNAL( clicked() ), this, SLOT( slotToggleGlobal() ) ); TQLabel *label = new TQLabel( i18n( "There is no need to delete keywords. Simply uncheck unwanted keywords and make them non-global.\nGlobal keywords can also be edited in the settings dialog." ), this ); label->setAlignment( TQLabel::WordBreak | TQLabel::AlignTop ); gridLayout->addMultiCellWidget( label, 5, 5, 0, 1 ); } void EntryWidgetKeyword::setListView() { m_availableKeywords.sort(); m_listviewKeywords->clear(); for ( TQStringList::Iterator it = m_availableKeywords.begin(); it != m_availableKeywords.end(); ++it ) { KeywordListViewItem *item = new KeywordListViewItem( m_listviewKeywords, *it, m_globalKeywords.contains( *it ) ); if ( m_usedKeywords.contains( *it ) ) item->setOn( TRUE ); } } void EntryWidgetKeyword::readListView() { m_usedKeywords.clear(); for ( TQListViewItemIterator it = TQListViewItemIterator( m_listviewKeywords, TQListViewItemIterator::Checked ); it.current() != NULL; ++it ) m_usedKeywords.append(( *it ) ->text( 0 ) ); } } #include "entrywidgetkeyword.moc"