summaryrefslogtreecommitdiffabout
path: root/kaddressbook/jumpbuttonbar.cpp
Unidiff
Diffstat (limited to 'kaddressbook/jumpbuttonbar.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/jumpbuttonbar.cpp232
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 @@
1/*
2 This file is part of KAddressBook.
3 Copyright (c) 2002 Mike Pilone <mpilone@slac.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution.
22*/
23
24#include <qevent.h>
25#include <qlayout.h>
26#include <qpushbutton.h>
27#include <qstring.h>
28#include <qtl.h>
29#include <qapplication.h>
30
31#include <kabc/addressbook.h>
32#include <kabc/field.h>
33#include <kdebug.h>
34#include <klocale.h>
35
36#include "kabcore.h"
37
38#include "jumpbuttonbar.h"
39
40class JumpButton : public QPushButton
41{
42 public:
43 JumpButton( const QString &text, QWidget *parent,
44 const QString &character );
45
46 void setCharacter( const QString &character );
47 QString character() const;
48
49 private:
50 QString mCharacter;
51};
52
53JumpButton::JumpButton( const QString &text, QWidget *parent,
54 const QString &character )
55 : QPushButton( text, parent )
56{
57 mCharacter = character;
58}
59
60void JumpButton::setCharacter( const QString &character )
61{
62 mCharacter = character;
63 setText(mCharacter.upper() );
64}
65
66QString JumpButton::character() const
67{
68 return mCharacter;
69}
70
71JumpButtonBar::JumpButtonBar( KABCore *core, QWidget *parent, const char *name )
72 : QWidget( parent, name ), mCore( core )
73{
74 if ( QApplication::desktop()->width() < 480 )
75
76 mButtonLayout = new QGridLayout( this, 2, 14 );
77 else
78 mButtonLayout = new QGridLayout( this, 1, 28 );
79 mButtonLayout->setAlignment( Qt::AlignTop );
80
81 recreateButtons();
82}
83
84JumpButtonBar::~JumpButtonBar()
85{
86}
87
88QSizePolicy JumpButtonBar::sizePolicy() const
89{
90#ifndef KAB_EMBEDDED
91 return QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Minimum,
92 QSizePolicy::Vertically );
93#else //KAB_EMBEDDED
94 return QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Minimum);
95#endif //KAB_EMBEDDED
96}
97
98void JumpButtonBar::letterClicked()
99{
100 JumpButton *button = (JumpButton*)sender();
101 QString character = button->character();
102 if ( !character.isNull() )
103 emit jumpToLetter( character );
104}
105
106void JumpButtonBar::recreateButtons()
107{
108 // the easiest way to remove all buttons ;)
109 //mButtons.setAutoDelete( true );
110 //mButtons.clear();
111 //mButtons.setAutoDelete( false );
112 mCharacters.clear();
113
114 QString character;
115
116 KABC::AddressBook *ab = mCore->addressBook();
117 KABC::AddressBook::Iterator it;
118 KABC::Field *field = mCore->currentSearchField();
119 if ( field ) {
120 setEnabled( true );
121 } else {
122 setEnabled( false );
123 return;
124 }
125 for ( it = ab->begin(); it != ab->end(); ++it ) {
126 if ( !field->value( *it ).isEmpty() )
127 character = field->value( *it )[ 0 ].lower();
128 if ( !character.isEmpty() && !mCharacters.contains( character ) )
129 mCharacters.append( character );
130 }
131 if ( mCharacters.count() == 0 ) {
132 setEnabled( false );
133 return;
134 }
135
136 int maxRows = mCharacters.count() / 2; // we use 2 columns
137 if ( mCharacters.count() % 2 )
138 maxRows++;
139 int fixwid = 20;
140 sortListLocaleAware( mCharacters );
141 bool skip2 = false;
142 int skipcount = 0;
143 int maxHei = 25;
144 if ( QApplication::desktop()->width() < 480 && mCharacters.count() > 13) {
145 skipcount = mCharacters.count()-13;
146 maxHei = (QApplication::desktop()->height()-65)/13;
147 }
148 else {
149 fixwid = 30;
150 if ( mCharacters.count() > 20 )
151 skipcount = mCharacters.count()- 20;
152 maxHei = (QApplication::desktop()->height()-120)/(mCharacters.count()-skipcount);
153
154 }
155 maxRows = 28;
156 bool skipcurrent = false;
157 bool state = isUpdatesEnabled();
158 setUpdatesEnabled( false );
159 //qDebug("cc %d ",mCharacters.count() );
160 JumpButton *button;
161 int row = 0, col = 0;
162 JumpButton* cur = mButtons.first();
163 for ( uint i = 0; i < mCharacters.count(); ++i ) {
164 if ( skipcount > 0 && skipcurrent ) {
165 --skipcount;
166 } else {
167 if ( cur ) {
168 button = cur ;
169 cur = mButtons.next();
170 button->setCharacter(mCharacters[ i ]);
171 } else {
172 button = new JumpButton( mCharacters[ i ].upper(), this, mCharacters[ i ] );
173 button->setFixedWidth( fixwid );
174 mButtons.append( button );
175 connect( button, SIGNAL( clicked() ), this, SLOT( letterClicked() ) );
176 mButtonLayout->addWidget( button, row, col );
177 }
178 button->setMaximumHeight( maxHei );
179 button->show();
180
181 if ( col == maxRows ) {
182 row = 0;
183 col++;
184 } else
185 row++;
186 }
187
188 skipcurrent = !skipcurrent;
189 }
190 while ( cur ) {
191 cur->hide();
192 cur = mButtons.next();
193 }
194
195 mButtonLayout->activate();
196 setUpdatesEnabled( state );
197 update();
198}
199
200void JumpButtonBar::sortListLocaleAware( QStringList &list )
201{
202 QStringList::Iterator beginIt = list.begin();
203 QStringList::Iterator endIt = list.end();
204
205 --endIt;
206 if ( beginIt == endIt ) // don't need sorting
207 return;
208
209 QStringList::Iterator walkBackIt = endIt;
210 while ( beginIt != endIt ) {
211 QStringList::Iterator j1 = list.begin();
212 QStringList::Iterator j2 = j1;
213 ++j2;
214 while ( j1 != walkBackIt ) {
215#ifndef KAB_EMBEDDED
216 if ( QString::localeAwareCompare( *j2, *j1 ) < 0 )
217#else //KAB_EMBEDDED
218 if ( QString::compare( *j2, *j1 ) < 0 )
219#endif //KAB_EMBEDDED
220 qSwap( *j1, *j2 );
221
222 ++j1;
223 ++j2;
224 }
225 ++beginIt;
226 --walkBackIt;
227 }
228}
229
230#ifndef KAB_EMBEDDED
231#include "jumpbuttonbar.moc"
232#endif //KAB_EMBEDDED