author | zautrix <zautrix> | 2004-06-26 19:01:18 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-06-26 19:01:18 (UTC) |
commit | b9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (side-by-side diff) | |
tree | 2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /kaddressbook/jumpbuttonbar.cpp | |
download | kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2 |
Initial revision
Diffstat (limited to 'kaddressbook/jumpbuttonbar.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | kaddressbook/jumpbuttonbar.cpp | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/kaddressbook/jumpbuttonbar.cpp b/kaddressbook/jumpbuttonbar.cpp new file mode 100644 index 0000000..ee5b44e --- a/dev/null +++ b/kaddressbook/jumpbuttonbar.cpp @@ -0,0 +1,232 @@ +/* + This file is part of KAddressBook. + Copyright (c) 2002 Mike Pilone <mpilone@slac.com> + + 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. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qevent.h> +#include <qlayout.h> +#include <qpushbutton.h> +#include <qstring.h> +#include <qtl.h> +#include <qapplication.h> + +#include <kabc/addressbook.h> +#include <kabc/field.h> +#include <kdebug.h> +#include <klocale.h> + +#include "kabcore.h" + +#include "jumpbuttonbar.h" + +class JumpButton : public QPushButton +{ + public: + JumpButton( const QString &text, QWidget *parent, + const QString &character ); + + void setCharacter( const QString &character ); + QString character() const; + + private: + QString mCharacter; +}; + +JumpButton::JumpButton( const QString &text, QWidget *parent, + const QString &character ) + : QPushButton( text, parent ) +{ + mCharacter = character; +} + +void JumpButton::setCharacter( const QString &character ) +{ + mCharacter = character; + setText(mCharacter.upper() ); +} + +QString JumpButton::character() const +{ + return mCharacter; +} + +JumpButtonBar::JumpButtonBar( KABCore *core, QWidget *parent, const char *name ) + : QWidget( parent, name ), mCore( core ) +{ + if ( QApplication::desktop()->width() < 480 ) + + mButtonLayout = new QGridLayout( this, 2, 14 ); + else + mButtonLayout = new QGridLayout( this, 1, 28 ); + mButtonLayout->setAlignment( Qt::AlignTop ); + + recreateButtons(); +} + +JumpButtonBar::~JumpButtonBar() +{ +} + +QSizePolicy JumpButtonBar::sizePolicy() const +{ +#ifndef KAB_EMBEDDED + return QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Minimum, + QSizePolicy::Vertically ); +#else //KAB_EMBEDDED + return QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Minimum); +#endif //KAB_EMBEDDED +} + +void JumpButtonBar::letterClicked() +{ + JumpButton *button = (JumpButton*)sender(); + QString character = button->character(); + if ( !character.isNull() ) + emit jumpToLetter( character ); +} + +void JumpButtonBar::recreateButtons() +{ + // the easiest way to remove all buttons ;) + //mButtons.setAutoDelete( true ); + //mButtons.clear(); + //mButtons.setAutoDelete( false ); + mCharacters.clear(); + + QString character; + + KABC::AddressBook *ab = mCore->addressBook(); + KABC::AddressBook::Iterator it; + KABC::Field *field = mCore->currentSearchField(); + if ( field ) { + setEnabled( true ); + } else { + setEnabled( false ); + return; + } + for ( it = ab->begin(); it != ab->end(); ++it ) { + if ( !field->value( *it ).isEmpty() ) + character = field->value( *it )[ 0 ].lower(); + if ( !character.isEmpty() && !mCharacters.contains( character ) ) + mCharacters.append( character ); + } + if ( mCharacters.count() == 0 ) { + setEnabled( false ); + return; + } + + int maxRows = mCharacters.count() / 2; // we use 2 columns + if ( mCharacters.count() % 2 ) + maxRows++; + int fixwid = 20; + sortListLocaleAware( mCharacters ); + bool skip2 = false; + int skipcount = 0; + int maxHei = 25; + if ( QApplication::desktop()->width() < 480 && mCharacters.count() > 13) { + skipcount = mCharacters.count()-13; + maxHei = (QApplication::desktop()->height()-65)/13; + } + else { + fixwid = 30; + if ( mCharacters.count() > 20 ) + skipcount = mCharacters.count()- 20; + maxHei = (QApplication::desktop()->height()-120)/(mCharacters.count()-skipcount); + + } + maxRows = 28; + bool skipcurrent = false; + bool state = isUpdatesEnabled(); + setUpdatesEnabled( false ); + //qDebug("cc %d ",mCharacters.count() ); + JumpButton *button; + int row = 0, col = 0; + JumpButton* cur = mButtons.first(); + for ( uint i = 0; i < mCharacters.count(); ++i ) { + if ( skipcount > 0 && skipcurrent ) { + --skipcount; + } else { + if ( cur ) { + button = cur ; + cur = mButtons.next(); + button->setCharacter(mCharacters[ i ]); + } else { + button = new JumpButton( mCharacters[ i ].upper(), this, mCharacters[ i ] ); + button->setFixedWidth( fixwid ); + mButtons.append( button ); + connect( button, SIGNAL( clicked() ), this, SLOT( letterClicked() ) ); + mButtonLayout->addWidget( button, row, col ); + } + button->setMaximumHeight( maxHei ); + button->show(); + + if ( col == maxRows ) { + row = 0; + col++; + } else + row++; + } + + skipcurrent = !skipcurrent; + } + while ( cur ) { + cur->hide(); + cur = mButtons.next(); + } + + mButtonLayout->activate(); + setUpdatesEnabled( state ); + update(); +} + +void JumpButtonBar::sortListLocaleAware( QStringList &list ) +{ + QStringList::Iterator beginIt = list.begin(); + QStringList::Iterator endIt = list.end(); + + --endIt; + if ( beginIt == endIt ) // don't need sorting + return; + + QStringList::Iterator walkBackIt = endIt; + while ( beginIt != endIt ) { + QStringList::Iterator j1 = list.begin(); + QStringList::Iterator j2 = j1; + ++j2; + while ( j1 != walkBackIt ) { +#ifndef KAB_EMBEDDED + if ( QString::localeAwareCompare( *j2, *j1 ) < 0 ) +#else //KAB_EMBEDDED + if ( QString::compare( *j2, *j1 ) < 0 ) +#endif //KAB_EMBEDDED + qSwap( *j1, *j2 ); + + ++j1; + ++j2; + } + ++beginIt; + --walkBackIt; + } +} + +#ifndef KAB_EMBEDDED +#include "jumpbuttonbar.moc" +#endif //KAB_EMBEDDED |