diff options
Diffstat (limited to 'certmanager/conf/appearanceconfigwidget.cpp')
-rw-r--r-- | certmanager/conf/appearanceconfigwidget.cpp | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/certmanager/conf/appearanceconfigwidget.cpp b/certmanager/conf/appearanceconfigwidget.cpp new file mode 100644 index 000000000..a3d177c2a --- /dev/null +++ b/certmanager/conf/appearanceconfigwidget.cpp @@ -0,0 +1,358 @@ +/* + appearanceconfigwidget.cpp + + This file is part of kleopatra, the KDE key manager + Copyright (c) 2002,2004 Klarälvdalens Datakonsult AB + Copyright (c) 2002,2003 Marc Mutz <mutz@kde.org> + + Libkleopatra 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. + + Libkleopatra 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + In addition, as a special exception, the copyright holders give + permission to link the code of this program with any edition of + the Qt library by Trolltech AS, Norway (or with modified versions + of Qt that use the same license as Qt), and distribute linked + combinations including the two. You must obey the GNU General + Public License in all respects for all of the code used other than + Qt. If you modify this file, you may extend this exception to + your version of the file, but you are not obligated to do so. If + you do not wish to do so, delete this exception statement from + your version. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "appearanceconfigwidget.h" + +#include <kleo/cryptobackendfactory.h> +#include <kleo/keyfiltermanager.h> + +#include <klistview.h> +#include <kconfig.h> +#include <kdialog.h> +#include <klocale.h> +#include <kdebug.h> +#include <kmessagebox.h> +#include <kfontdialog.h> +#include <kcolordialog.h> + +#include <qpushbutton.h> +#include <qlayout.h> +#include <qheader.h> +#include <qcolor.h> +#include <qfont.h> +#include <qstring.h> +#include <qpainter.h> +#include <qregexp.h> +#include <qcheckbox.h> + +#include <assert.h> + +using namespace Kleo; + +class CategoryListViewItem : public QListViewItem +{ +public: + CategoryListViewItem( QListView* lv, QListViewItem* prev, const KConfigBase& config ) + : QListViewItem( lv, prev ) { + + setName( config.readEntry( "Name", i18n("<unnamed>") ) ); + mForegroundColor = config.readColorEntry( "foreground-color" ); + mBackgroundColor = config.readColorEntry( "background-color" ); + mHasFont = config.hasKey( "font" ); + if ( mHasFont ) { + setFont( config.readFontEntry( "font" ) ); // sets mItalic and mBold + } + else { + mItalic = config.readBoolEntry( "font-italic", false ); + mBold = config.readBoolEntry( "font-bold", false ); + } + mStrikeOut = config.readBoolEntry( "font-strikeout", false ); + mIsExpired = config.readBoolEntry( "is-expired", false ); + mDirty = false; + } + + void save( KConfigBase& config ) { + config.writeEntry( "Name", text( 0 ) ); + config.writeEntry( "foreground-color", mForegroundColor ); + config.writeEntry( "background-color", mBackgroundColor ); + if ( mHasFont ) + config.writeEntry( "font", mFont ); + else { + config.deleteEntry( "font" ); + config.writeEntry( "font-italic", mItalic ); + config.writeEntry( "font-bold", mBold ); + } + config.writeEntry( "font-strikeout", mStrikeOut ); + } + + void setForegroundColor( const QColor& foreground ) { mForegroundColor = foreground; mDirty = true; } + void setBackgroundColor( const QColor& background ) { mBackgroundColor = background; mDirty = true; } + void setFont( const QFont& font ) { + mFont = font; + mHasFont = true; + mItalic = font.italic(); + mBold = font.bold(); + mDirty = true; + } + + QColor foregroundColor() const { return mForegroundColor; } + QColor backgroundColor() const { return mBackgroundColor; } + QFont font() const { return mFont; } + + void setDefaultAppearance() { + mForegroundColor = mIsExpired ? Qt::red : QColor(); + mBackgroundColor = QColor(); + mHasFont = false; + mFont = QFont(); + mBold = false; + mItalic = false; + mStrikeOut = false; + mDirty = true; + } + + bool isDirty() const { return mDirty; } + bool isItalic() const { return mItalic; } + bool isBold() const { return mBold; } + bool isStrikeout() const { return mStrikeOut; } + bool hasFont() const { return mHasFont; } + + void toggleItalic() { mItalic = !mItalic; if ( mHasFont ) mFont.setItalic( mItalic ); mDirty = true; } + void toggleBold() { mBold = !mBold; if ( mHasFont ) mFont.setBold( mBold ); mDirty = true; } + void toggleStrikeout() { mStrikeOut = !mStrikeOut; mDirty = true; } + +private: + void setName( const QString& name ) { + setText( 0, name ); + } + + void paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int alignment ); + +private: + QColor mForegroundColor, mBackgroundColor; + QFont mFont; + bool mHasFont; + bool mIsExpired; // used for default settings + bool mItalic; + bool mBold; + bool mStrikeOut; + bool mDirty; +}; + +void CategoryListViewItem::paintCell( QPainter * p, const QColorGroup & cg, int column, int width, int alignment ) { + QColorGroup _cg = cg; + QFont font = p->font(); + if ( mHasFont ) + font = mFont; + else { + if ( mItalic ) + font.setItalic( true ); + if ( mBold ) + font.setBold( true ); + } + if ( mStrikeOut ) + font.setStrikeOut( true ); + p->setFont( font ); + + if ( mForegroundColor.isValid() ) + _cg.setColor( QColorGroup::Text, mForegroundColor ); + if ( mBackgroundColor.isValid() ) + _cg.setColor( QColorGroup::Base, mBackgroundColor ); + + QListViewItem::paintCell( p, _cg, column, width, alignment ); +} + +//// + +Kleo::AppearanceConfigWidget::AppearanceConfigWidget ( + QWidget* parent, const char* name, WFlags fl ) + : AppearanceConfigWidgetBase( parent, name, fl ) +{ + categoriesLV->setSorting( -1 ); + load(); +} + + +/* + * Destroys the object and frees any allocated resources + */ + +AppearanceConfigWidget::~AppearanceConfigWidget() +{ + // no need to delete child widgets, Qt does it all for us +} + + +void AppearanceConfigWidget::slotSelectionChanged( QListViewItem* item ) +{ + bool sel = item != 0; + foregroundButton->setEnabled( sel ); + backgroundButton->setEnabled( sel ); + fontButton->setEnabled( sel ); + italicCB->setEnabled( item ); + boldCB->setEnabled( item ); + strikeoutCB->setEnabled( item ); + defaultLookPB->setEnabled( sel ); + if ( item ) { + CategoryListViewItem* clvi = static_cast<CategoryListViewItem *>( item ); + italicCB->setChecked( clvi->isItalic() ); + boldCB->setChecked( clvi->isBold() ); + strikeoutCB->setChecked( clvi->isStrikeout() ); + } else { + italicCB->setChecked( false ); + boldCB->setChecked( false ); + strikeoutCB->setChecked( false ); + } +} + +/* + * set default appearance for selected category + */ +void AppearanceConfigWidget::slotDefaultClicked() +{ + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(categoriesLV->selectedItem() ); + if ( !item ) + return; + item->setDefaultAppearance(); + item->repaint(); + slotSelectionChanged( item ); + emit changed(); +} + +void AppearanceConfigWidget::load() +{ + categoriesLV->clear(); + KConfig * config = Kleo::CryptoBackendFactory::instance()->configObject(); + if ( !config ) + return; + QStringList groups = config->groupList().grep( QRegExp( "^Key Filter #\\d+$" ) ); + for ( QStringList::const_iterator it = groups.begin() ; it != groups.end() ; ++it ) { + KConfigGroup cfg( config, *it ); + (void) new CategoryListViewItem( categoriesLV, categoriesLV->lastItem(), cfg ); + } +} + +void AppearanceConfigWidget::save() +{ + KConfig * config = Kleo::CryptoBackendFactory::instance()->configObject(); + if ( !config ) + return; + // We know (assume) that the groups in the config object haven't changed, + // so we just iterate over them and over the listviewitems, and map one-to-one. + QStringList groups = config->groupList().grep( QRegExp( "^Key Filter #\\d+$" ) ); + if ( groups.isEmpty() ) { + // If we created the default categories ourselves just now, then we need to make up their list + QListViewItemIterator lvit( categoriesLV ); + for ( ; lvit.current() ; ++lvit ) + groups << lvit.current()->text( 0 ); + } + + QListViewItemIterator lvit( categoriesLV ); + for ( QStringList::const_iterator it = groups.begin() ; it != groups.end() && lvit.current(); ++it, ++lvit ) { + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(lvit.current() ); + KConfigGroup cfg( config, *it ); + item->save( cfg ); + } + config->sync(); + Kleo::KeyFilterManager::instance()->reload(); +} + + +void AppearanceConfigWidget::slotForegroundClicked() { + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(categoriesLV->selectedItem() ); + Q_ASSERT( item ); + if( !item ) + return; + QColor fg = item->foregroundColor(); + int result = KColorDialog::getColor( fg ); + if ( result == KColorDialog::Accepted ) { + item->setForegroundColor( fg ); + item->repaint(); + emit changed(); + } +} + +void AppearanceConfigWidget::slotBackgroundClicked() { + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(categoriesLV->selectedItem() ); + Q_ASSERT( item ); + if( !item ) + return; + QColor bg = item->backgroundColor(); + int result = KColorDialog::getColor( bg ); + if ( result == KColorDialog::Accepted ) { + item->setBackgroundColor( bg ); + item->repaint(); + emit changed(); + } +} + +void AppearanceConfigWidget::slotFontClicked() { + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(categoriesLV->selectedItem() ); + Q_ASSERT( item ); + if( !item ) + return; + QFont font = item->font(); + int result = KFontDialog::getFont( font ); + if ( result == KFontDialog::Accepted ) { + item->setFont( font ); + item->repaint(); + emit changed(); + } +} + +void AppearanceConfigWidget::defaults() +{ + // This simply means "default look for every category" + QListViewItemIterator lvit( categoriesLV ); + for ( ; lvit.current() ; ++lvit ) { + CategoryListViewItem* item = static_cast<CategoryListViewItem *>( lvit.current() ); + item->setDefaultAppearance(); + item->repaint(); + } + emit changed(); +} + +void AppearanceConfigWidget::slotItalicClicked() +{ + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(categoriesLV->selectedItem() ); + if ( item ) { + item->toggleItalic(); + item->repaint(); + emit changed(); + } +} + +void AppearanceConfigWidget::slotBoldClicked() +{ + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(categoriesLV->selectedItem() ); + if ( item ) { + item->toggleBold(); + item->repaint(); + emit changed(); + } +} + +void AppearanceConfigWidget::slotStrikeoutClicked() +{ + CategoryListViewItem* item = static_cast<CategoryListViewItem*>(categoriesLV->selectedItem() ); + if ( item ) { + item->toggleStrikeout(); + item->repaint(); + emit changed(); + } +} + +#include "appearanceconfigwidget.moc" |