Diffstat (limited to 'kaddressbook/views/kaddressbooktableview.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | kaddressbook/views/kaddressbooktableview.cpp | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/kaddressbook/views/kaddressbooktableview.cpp b/kaddressbook/views/kaddressbooktableview.cpp new file mode 100644 index 0000000..ee2fcf8 --- a/dev/null +++ b/kaddressbook/views/kaddressbooktableview.cpp | |||
@@ -0,0 +1,337 @@ | |||
1 | // $Id$ | ||
2 | |||
3 | #include <qvbox.h> | ||
4 | #include <qlistbox.h> | ||
5 | #include <qwidget.h> | ||
6 | #include <qfile.h> | ||
7 | #include <qimage.h> | ||
8 | #include <qcombobox.h> | ||
9 | #include <qapplication.h> | ||
10 | #include <qdragobject.h> | ||
11 | #include <qevent.h> | ||
12 | #include <qurl.h> | ||
13 | #include <qpixmap.h> | ||
14 | |||
15 | #include <kabc/addressbook.h> | ||
16 | #include <kapplication.h> | ||
17 | #include <kconfig.h> | ||
18 | #include <kcolorbutton.h> | ||
19 | #include <kdebug.h> | ||
20 | #include <kglobal.h> | ||
21 | #include <kiconloader.h> | ||
22 | #include <klineedit.h> | ||
23 | #include <klocale.h> | ||
24 | #include <kmessagebox.h> | ||
25 | #include <kurl.h> | ||
26 | #include <kurlrequester.h> | ||
27 | |||
28 | //US#include "configuretableviewdialog.h" | ||
29 | #include "contactlistview.h" | ||
30 | #include "kabprefs.h" | ||
31 | #include "undocmds.h" | ||
32 | #include "viewmanager.h" | ||
33 | |||
34 | #include <qlayout.h> | ||
35 | |||
36 | |||
37 | #include "kaddressbooktableview.h" | ||
38 | |||
39 | |||
40 | KAddressBookTableView::KAddressBookTableView( KABC::AddressBook *ab, | ||
41 | QWidget *parent, const char *name ) | ||
42 | : KAddressBookView( ab, parent, name ) | ||
43 | { | ||
44 | mainLayout = new QVBoxLayout( viewWidget(), 2 ); | ||
45 | |||
46 | // The list view will be created when the config is read. | ||
47 | mListView = 0; | ||
48 | } | ||
49 | |||
50 | KAddressBookTableView::~KAddressBookTableView() | ||
51 | { | ||
52 | } | ||
53 | |||
54 | void KAddressBookTableView::reconstructListView() | ||
55 | { | ||
56 | if (mListView) | ||
57 | { | ||
58 | disconnect(mListView, SIGNAL(selectionChanged()), | ||
59 | this, SLOT(addresseeSelected())); | ||
60 | disconnect(mListView, SIGNAL(executed(QListViewItem*)), | ||
61 | this, SLOT(addresseeExecuted(QListViewItem*))); | ||
62 | disconnect(mListView, SIGNAL(doubleClicked(QListViewItem*)), | ||
63 | this, SLOT(addresseeExecuted(QListViewItem*))); | ||
64 | disconnect(mListView, SIGNAL(startAddresseeDrag()), this, | ||
65 | SIGNAL(startDrag())); | ||
66 | disconnect(mListView, SIGNAL(returnPressed(QListViewItem*)), | ||
67 | this, SLOT(addresseeExecuted(QListViewItem*))); | ||
68 | |||
69 | disconnect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this, | ||
70 | SIGNAL(dropped(QDropEvent*))); | ||
71 | delete mListView; | ||
72 | } | ||
73 | |||
74 | mListView = new ContactListView( this, addressBook(), viewWidget() ); | ||
75 | |||
76 | // Add the columns | ||
77 | KABC::Field::List fieldList = fields(); | ||
78 | KABC::Field::List::ConstIterator it; | ||
79 | |||
80 | int c = 0; | ||
81 | for( it = fieldList.begin(); it != fieldList.end(); ++it ) { | ||
82 | mListView->addColumn( (*it)->label() ); | ||
83 | mListView->setColumnWidthMode(c++, QListView::Manual); | ||
84 | //US | ||
85 | // qDebug("KAddressBookTableView::reconstructListView: field %s", (*it)->label().latin1()); | ||
86 | } | ||
87 | |||
88 | connect(mListView, SIGNAL(selectionChanged()), | ||
89 | this, SLOT(addresseeSelected())); | ||
90 | connect(mListView, SIGNAL(startAddresseeDrag()), this, | ||
91 | SIGNAL(startDrag())); | ||
92 | connect(mListView, SIGNAL(addresseeDropped(QDropEvent*)), this, | ||
93 | SIGNAL(dropped(QDropEvent*))); | ||
94 | |||
95 | if (KABPrefs::instance()->mHonorSingleClick) | ||
96 | connect(mListView, SIGNAL(executed(QListViewItem*)), | ||
97 | this, SLOT(addresseeExecuted(QListViewItem*))); | ||
98 | else | ||
99 | connect(mListView, SIGNAL(doubleClicked(QListViewItem*)), | ||
100 | this, SLOT(addresseeExecuted(QListViewItem*))); | ||
101 | connect(mListView, SIGNAL(returnPressed(QListViewItem*)), | ||
102 | this, SLOT(addresseeExecuted(QListViewItem*))); | ||
103 | connect(mListView, SIGNAL(signalDelete()), | ||
104 | this, SLOT(addresseeDeleted())); | ||
105 | |||
106 | refresh(); | ||
107 | |||
108 | mListView->setSorting( 0, true ); | ||
109 | mainLayout->addWidget( mListView ); | ||
110 | mainLayout->activate(); | ||
111 | mListView->show(); | ||
112 | } | ||
113 | |||
114 | void KAddressBookTableView::writeConfig(KConfig *config) | ||
115 | { | ||
116 | KAddressBookView::writeConfig(config); | ||
117 | |||
118 | mListView->saveLayout(config, config->group()); | ||
119 | } | ||
120 | |||
121 | void KAddressBookTableView::readConfig(KConfig *config) | ||
122 | { | ||
123 | KAddressBookView::readConfig( config ); | ||
124 | |||
125 | // The config could have changed the fields, so we need to reconstruct | ||
126 | // the listview. | ||
127 | reconstructListView(); | ||
128 | |||
129 | // Set the list view options | ||
130 | mListView->setAlternateBackgroundEnabled(config->readBoolEntry("ABackground", | ||
131 | true)); | ||
132 | mListView->setSingleLineEnabled(config->readBoolEntry("SingleLine", false)); | ||
133 | mListView->setToolTipsEnabled(config->readBoolEntry("ToolTips", true)); | ||
134 | |||
135 | if (config->readBoolEntry("Background", false)) | ||
136 | mListView->setBackgroundPixmap(config->readEntry("BackgroundName")); | ||
137 | |||
138 | // Restore the layout of the listview | ||
139 | mListView->restoreLayout(config, config->group()); | ||
140 | } | ||
141 | |||
142 | void KAddressBookTableView::refresh(QString uid) | ||
143 | { | ||
144 | // For now just repopulate. In reality this method should | ||
145 | // check the value of uid, and if valid iterate through | ||
146 | // the listview to find the entry, then tell it to refresh. | ||
147 | |||
148 | if (uid.isNull()) { | ||
149 | // Clear the list view | ||
150 | QString currentUID, nextUID; | ||
151 | #ifndef KAB_EMBEDDED | ||
152 | ContactListViewItem *currentItem = dynamic_cast<ContactListViewItem*>( mListView->currentItem() ); | ||
153 | #else //KAB_EMBEDDED | ||
154 | ContactListViewItem *currentItem = (ContactListViewItem*)( mListView->currentItem() ); | ||
155 | #endif //KAB_EMBEDDED | ||
156 | |||
157 | if ( currentItem ) { | ||
158 | #ifndef KAB_EMBEDDED | ||
159 | ContactListViewItem *nextItem = dynamic_cast<ContactListViewItem*>( currentItem->itemBelow() ); | ||
160 | #else //KAB_EMBEDDED | ||
161 | ContactListViewItem *nextItem = (ContactListViewItem*)( currentItem->itemBelow() ); | ||
162 | #endif //KAB_EMBEDDED | ||
163 | if ( nextItem ) | ||
164 | nextUID = nextItem->addressee().uid(); | ||
165 | currentUID = currentItem->addressee().uid(); | ||
166 | } | ||
167 | |||
168 | mListView->clear(); | ||
169 | |||
170 | currentItem = 0; | ||
171 | KABC::Addressee::List addresseeList = addressees(); | ||
172 | KABC::Addressee::List::Iterator it; | ||
173 | for (it = addresseeList.begin(); it != addresseeList.end(); ++it ) { | ||
174 | ContactListViewItem *item = new ContactListViewItem(*it, mListView, addressBook(), fields()); | ||
175 | if ( (*it).uid() == currentUID ) | ||
176 | currentItem = item; | ||
177 | else if ( (*it).uid() == nextUID && !currentItem ) | ||
178 | currentItem = item; | ||
179 | } | ||
180 | |||
181 | // Sometimes the background pixmap gets messed up when we add lots | ||
182 | // of items. | ||
183 | mListView->repaint(); | ||
184 | |||
185 | if ( currentItem ) { | ||
186 | mListView->setCurrentItem( currentItem ); | ||
187 | mListView->ensureItemVisible( currentItem ); | ||
188 | } | ||
189 | } else { | ||
190 | // Only need to update on entry. Iterate through and try to find it | ||
191 | ContactListViewItem *ceItem; | ||
192 | QListViewItemIterator it( mListView ); | ||
193 | while ( it.current() ) { | ||
194 | #ifndef KAB_EMBEDDED | ||
195 | ceItem = dynamic_cast<ContactListViewItem*>( it.current() ); | ||
196 | #else //KAB_EMBEDDED | ||
197 | ceItem = (ContactListViewItem*)( it.current() ); | ||
198 | #endif //KAB_EMBEDDED | ||
199 | |||
200 | if ( ceItem && ceItem->addressee().uid() == uid ) { | ||
201 | ceItem->refresh(); | ||
202 | return; | ||
203 | } | ||
204 | ++it; | ||
205 | } | ||
206 | |||
207 | refresh( QString::null ); | ||
208 | } | ||
209 | } | ||
210 | |||
211 | QStringList KAddressBookTableView::selectedUids() | ||
212 | { | ||
213 | QStringList uidList; | ||
214 | QListViewItem *item; | ||
215 | ContactListViewItem *ceItem; | ||
216 | |||
217 | for(item = mListView->firstChild(); item; item = item->itemBelow()) | ||
218 | { | ||
219 | if (mListView->isSelected( item )) | ||
220 | { | ||
221 | #ifndef KAB_EMBEDDED | ||
222 | ceItem = dynamic_cast<ContactListViewItem*>(item); | ||
223 | #else //KAB_EMBEDDED | ||
224 | ceItem = (ContactListViewItem*)(item); | ||
225 | #endif //KAB_EMBEDDED | ||
226 | |||
227 | if (ceItem != 0L) | ||
228 | uidList << ceItem->addressee().uid(); | ||
229 | } | ||
230 | } | ||
231 | if ( uidList.count() == 0 ) | ||
232 | if ( mListView->currentItem() ) { | ||
233 | ceItem = (ContactListViewItem*)(mListView->currentItem()) ; | ||
234 | uidList << ceItem->addressee().uid(); | ||
235 | } | ||
236 | |||
237 | return uidList; | ||
238 | } | ||
239 | |||
240 | void KAddressBookTableView::setSelected(QString uid, bool selected) | ||
241 | { | ||
242 | QListViewItem *item; | ||
243 | ContactListViewItem *ceItem; | ||
244 | |||
245 | if (uid.isNull()) | ||
246 | { | ||
247 | mListView->selectAll(selected); | ||
248 | } | ||
249 | else | ||
250 | { | ||
251 | for(item = mListView->firstChild(); item; item = item->itemBelow()) | ||
252 | { | ||
253 | #ifndef KAB_EMBEDDED | ||
254 | ceItem = dynamic_cast<ContactListViewItem*>(item); | ||
255 | #else //KAB_EMBEDDED | ||
256 | ceItem = (ContactListViewItem*)(item); | ||
257 | #endif //KAB_EMBEDDED | ||
258 | |||
259 | |||
260 | if ((ceItem != 0L) && (ceItem->addressee().uid() == uid)) | ||
261 | { | ||
262 | mListView->setSelected(item, selected); | ||
263 | |||
264 | if (selected) | ||
265 | mListView->ensureItemVisible(item); | ||
266 | } | ||
267 | } | ||
268 | } | ||
269 | } | ||
270 | |||
271 | void KAddressBookTableView::addresseeSelected() | ||
272 | { | ||
273 | // We need to try to find the first selected item. This might not be the | ||
274 | // last selected item, but when QListView is in multiselection mode, | ||
275 | // there is no way to figure out which one was | ||
276 | // selected last. | ||
277 | QListViewItem *item; | ||
278 | bool found =false; | ||
279 | for (item = mListView->firstChild(); item && !found; | ||
280 | item = item->nextSibling()) | ||
281 | { | ||
282 | if (item->isSelected()) | ||
283 | { | ||
284 | found = true; | ||
285 | #ifndef KAB_EMBEDDED | ||
286 | ContactListViewItem *ceItem | ||
287 | = dynamic_cast<ContactListViewItem*>(item); | ||
288 | #else //KAB_EMBEDDED | ||
289 | ContactListViewItem *ceItem | ||
290 | = (ContactListViewItem*)(item); | ||
291 | #endif //KAB_EMBEDDED | ||
292 | |||
293 | if ( ceItem ) emit selected(ceItem->addressee().uid()); | ||
294 | } | ||
295 | } | ||
296 | |||
297 | if (!found) | ||
298 | emit selected(QString::null); | ||
299 | } | ||
300 | |||
301 | void KAddressBookTableView::addresseeExecuted(QListViewItem *item) | ||
302 | { | ||
303 | if (item) | ||
304 | { | ||
305 | #ifndef KAB_EMBEDDED | ||
306 | ContactListViewItem *ceItem | ||
307 | = dynamic_cast<ContactListViewItem*>(item); | ||
308 | #else //KAB_EMBEDDED | ||
309 | ContactListViewItem *ceItem | ||
310 | = (ContactListViewItem*)(item); | ||
311 | #endif //KAB_EMBEDDED | ||
312 | |||
313 | if (ceItem) | ||
314 | { | ||
315 | emit executed(ceItem->addressee().uid()); | ||
316 | } | ||
317 | } | ||
318 | else | ||
319 | { | ||
320 | emit executed(QString::null); | ||
321 | } | ||
322 | } | ||
323 | |||
324 | void KAddressBookTableView::addresseeDeleted() | ||
325 | { | ||
326 | |||
327 | emit deleteRequest(); | ||
328 | |||
329 | } | ||
330 | |||
331 | |||
332 | |||
333 | |||
334 | |||
335 | #ifndef KAB_EMBEDDED | ||
336 | #include "kaddressbooktableview.moc" | ||
337 | #endif //KAB_EMBEDDED | ||