diff options
author | Slávek Banko <[email protected]> | 2013-06-24 02:08:15 +0200 |
---|---|---|
committer | Slávek Banko <[email protected]> | 2013-07-04 02:44:37 +0200 |
commit | 998f21e02a725cd553d7c278819f67cd81295af4 (patch) | |
tree | 4bd158018e9302c31367b00c01cd2b41eb228414 /src/entrywidgetkeyword.cpp | |
download | kbibtex-998f21e02a725cd553d7c278819f67cd81295af4.tar.gz kbibtex-998f21e02a725cd553d7c278819f67cd81295af4.zip |
Initial import
Diffstat (limited to 'src/entrywidgetkeyword.cpp')
-rw-r--r-- | src/entrywidgetkeyword.cpp | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/src/entrywidgetkeyword.cpp b/src/entrywidgetkeyword.cpp new file mode 100644 index 0000000..b61acc0 --- /dev/null +++ b/src/entrywidgetkeyword.cpp @@ -0,0 +1,283 @@ +/*************************************************************************** +* Copyright (C) 2004-2009 by Thomas Fischer * +* [email protected] * +* * +* 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 <qlayout.h> +#include <qregexp.h> +#include <qpushbutton.h> +#include <qtooltip.h> +#include <qtimer.h> +#include <qlabel.h> + +#include <kdialog.h> +#include <klocale.h> +#include <kiconloader.h> +#include <kdialogbase.h> +#include <kmessagebox.h> +#include <klistview.h> +#include <kguiitem.h> +#include <kdebug.h> + +#include <settings.h> +#include "entrywidgetkeyword.h" + +namespace KBibTeX +{ + KeywordListViewItem::KeywordListViewItem( KListView * parent, const QString & text, bool global ) : QCheckListItem( parent, text, QCheckListItem::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( "editcopy" ) ); + } + } + + EntryWidgetKeyword::EntryWidgetKeyword( BibTeX::File *bibtexfile, bool isReadOnly, QWidget *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<BibTeX::KeywordContainer*>( field->value()->items.first() ) ) != NULL ) + for ( QValueList<BibTeX::Keyword*>::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 = QStringList( m_globalKeywords ); + for ( QStringList::Iterator it = m_fileKeywords.begin(); it != m_fileKeywords.end(); ++it ) + if ( !m_availableKeywords.contains( *it ) ) + m_availableKeywords.append( *it ); + for ( QStringList::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*/, QListView */*listViewWarnings*/ ) + { + // nothing + } + + void EntryWidgetKeyword::slotSelectionChanged() + { + bool hasCurrent = m_listviewKeywords->selectedItem() != NULL; + + m_buttonEdit->setEnabled( hasCurrent ); + m_buttonToggleGlobal->setEnabled( hasCurrent ); + } + + void EntryWidgetKeyword::slotKeywordRenamed( QListViewItem * item, const QString & text, int /*col*/ ) + { + KeywordListViewItem *kwlvi = dynamic_cast<KeywordListViewItem*>( 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, QString( 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 ); + } + QCheckListItem *checkedItem = dynamic_cast<QCheckListItem*>( item ); + if ( checkedItem != NULL ) + checkedItem->setOn( TRUE ); + } + } + } + + void EntryWidgetKeyword::slotNewKeyword() + { + KeywordListViewItem * item = new KeywordListViewItem( m_listviewKeywords, QString( i18n( "May only contain ASCII characters, in case of doubt keep English form", "NewKeyword%1" ) ).arg( ++m_numKeywords ), FALSE ); + m_listviewKeywords->setSelected( item, TRUE ); + QTimer::singleShot( 100, this, SLOT( slotEditKeyword() ) ); + } + + void EntryWidgetKeyword::slotEditKeyword() + { + QListViewItem * item = m_listviewKeywords->selectedItem(); + if ( item != NULL ) + { + m_beforeRenaming = item->text( 0 ); + m_listviewKeywords->rename( item, 0 ); + } + } + + void EntryWidgetKeyword::slotToggleGlobal() + { + KeywordListViewItem *item = dynamic_cast<KeywordListViewItem*>( 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() + { + QGridLayout * gridLayout = new QGridLayout( this, 6, 2, KDialog::marginHint(), KDialog::spacingHint(), "gridLayout" ); + gridLayout->setRowStretch( 4, 1 ); + + m_listviewKeywords = new KListView( 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( QListViewItem* ) ), this, SLOT( slotSelectionChanged() ) ); + connect( m_listviewKeywords, SIGNAL( clicked( QListViewItem * ) ), this, SLOT( slotSelectionChanged() ) ); + connect( m_listviewKeywords, SIGNAL( itemRenamed( QListViewItem*, const QString&, int ) ), this, SLOT( slotKeywordRenamed( QListViewItem*, const QString&, int ) ) ); + + m_buttonNew = new QPushButton( i18n( "keyword", "New" ), this ); + m_buttonNew->setEnabled( !m_isReadOnly ); + m_buttonNew->setIconSet( QIconSet( SmallIcon( "add" ) ) ); + QToolTip::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 QPushButton( i18n( "keyword", "Edit" ), this ); + m_buttonEdit->setIconSet( QIconSet( SmallIcon( "edit" ) ) ); + QToolTip::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 QPushButton( i18n( "keyword", "Toggle &global" ), this ); + m_buttonToggleGlobal->setIconSet( QIconSet( SmallIcon( "package" ) ) ); + QToolTip::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() ) ); + + QLabel *label = new QLabel( 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( QLabel::WordBreak | QLabel::AlignTop ); + gridLayout->addMultiCellWidget( label, 5, 5, 0, 1 ); + } + + void EntryWidgetKeyword::setListView() + { + m_availableKeywords.sort(); + m_listviewKeywords->clear(); + for ( QStringList::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 ( QListViewItemIterator it = QListViewItemIterator( m_listviewKeywords, QListViewItemIterator::Checked ); it.current() != NULL; ++it ) + m_usedKeywords.append(( *it ) ->text( 0 ) ); + } +} +#include "entrywidgetkeyword.moc" |