summaryrefslogtreecommitdiffstats
path: root/lib/kformula/symbolaction.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kformula/symbolaction.cc')
-rw-r--r--lib/kformula/symbolaction.cc174
1 files changed, 174 insertions, 0 deletions
diff --git a/lib/kformula/symbolaction.cc b/lib/kformula/symbolaction.cc
new file mode 100644
index 00000000..7939f231
--- /dev/null
+++ b/lib/kformula/symbolaction.cc
@@ -0,0 +1,174 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Heinrich Kuettler <heinrich.kuettler@gmx.de>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <qlistbox.h>
+#include <qpainter.h>
+
+#include <kapplication.h>
+#include <kcombobox.h>
+#include <kglobalsettings.h>
+#include <ktoolbar.h>
+#include <kdebug.h>
+
+#include "symbolaction.h"
+
+/*
+ * The items for the SymbolCombos. *
+ */
+
+KFORMULA_NAMESPACE_BEGIN
+
+class SymbolComboItem : public QListBoxItem
+{
+public:
+ SymbolComboItem( const QString&, const QFont& , QChar, QComboBox* combo );
+ virtual ~SymbolComboItem();
+
+ virtual int width( const QListBox* ) const;
+ virtual int height( const QListBox* ) const;
+
+protected:
+ virtual void paint( QPainter *p );
+
+private:
+ QComboBox *m_combo;
+ QString m_name;
+ QFont m_font;
+ QChar m_symbol;
+
+ static int widest;
+};
+
+int SymbolComboItem::widest = 0;
+
+SymbolComboItem::SymbolComboItem( const QString &name, const QFont& font,
+ QChar symbol, QComboBox *combo )
+ : QListBoxItem( combo->listBox() ),
+ m_combo( combo ),
+ m_name( name ),
+ m_font( font ),
+ m_symbol( symbol )
+{
+ setText( name );
+ int charWidth = QFontMetrics( m_font ).width( QChar( m_symbol ) );
+ widest = QMAX( widest, charWidth );
+}
+
+SymbolComboItem::~SymbolComboItem()
+{
+}
+
+int SymbolComboItem::width( const QListBox * /*lb*/ ) const
+{
+ return widest + QFontMetrics( KGlobalSettings::generalFont() ).width( text() ) + 12;
+}
+
+int SymbolComboItem::height( const QListBox * /*lb*/ ) const
+{
+ int generalHeight = QFontMetrics( KGlobalSettings::generalFont() ).lineSpacing();
+ int fontHeight = QFontMetrics( m_font ).lineSpacing();
+ return QMAX( generalHeight, fontHeight ) + 2;
+}
+
+void SymbolComboItem::paint( QPainter *p )
+{
+ p->setFont( m_font );
+ QFontMetrics fm( p->fontMetrics() );
+ p->drawText( 3, fm.ascent() + fm.leading() / 2,
+ QString( "%1" ).arg( QChar( m_symbol ) ) );
+
+ p->setFont( KGlobalSettings::generalFont() );
+ fm = p->fontMetrics();
+ p->drawText( widest + 6, height( m_combo->listBox() ) / 2 + fm.strikeOutPos(), m_name );
+}
+
+/*
+ * The symbol action *
+ */
+SymbolAction::SymbolAction( QObject* parent, const char* name )
+ : KSelectAction( parent, name )
+{
+ setEditable( FALSE );
+}
+
+SymbolAction::SymbolAction( const QString& text, const KShortcut& cut,
+ const QObject* receiver, const char* slot,
+ QObject* parent, const char* name )
+ : KSelectAction( text, cut, receiver, slot, parent, name )
+{
+ setEditable( FALSE );
+}
+
+int SymbolAction::plug( QWidget* w, int index )
+{
+ if (kapp && !kapp->authorizeKAction(name()))
+ return -1;
+ if ( w->inherits( "KToolBar" ) )
+ {
+ KToolBar* bar = static_cast<KToolBar*>( w );
+ int id_ = KAction::getToolButtonID();
+ KComboBox *cb = new KComboBox( bar );
+ connect( cb, SIGNAL( activated( const QString & ) ),
+ SLOT( slotActivated( const QString & ) ) );
+ cb->setEnabled( isEnabled() );
+ bar->insertWidget( id_, comboWidth(), cb, index );
+ cb->setMinimumWidth( cb->sizeHint().width() );
+
+ addContainer( bar, id_ );
+
+ connect( bar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) );
+
+ updateItems( containerCount() - 1 );
+
+ return containerCount() - 1;
+ }
+ else return KSelectAction::plug( w, index );
+}
+
+void SymbolAction::setSymbols( const QStringList &names,
+ const QFont& font,
+ const QMemArray<QChar>& chars )
+{
+ m_chars = chars;
+ m_font = font;
+ setItems( names );
+
+ int len = containerCount();
+ for ( int i = 0; i < len; ++i )
+ updateItems( i );
+}
+
+void SymbolAction::updateItems( int id )
+{
+ QWidget *w = container( id );
+ if ( w->inherits( "KToolBar" ) ) {
+ QWidget *r = static_cast<KToolBar*>( w )->getWidget( itemId( id ) );
+ if ( r->inherits( "QComboBox" ) ) {
+ QComboBox *cb = static_cast<QComboBox*>( r );
+ cb->clear();
+
+ for( uint i = 0; i < items().count(); ++i ) {
+ new SymbolComboItem( *items().at( i ), m_font, m_chars.at( i ), cb );
+ }
+ cb->setMinimumWidth( cb->sizeHint().width() );
+ }
+ }
+}
+
+KFORMULA_NAMESPACE_END