first release
[groupsms] / sms / contactwidget.cpp
1 #include <QtGui>
2 #include <QDebug>
3
4 #include "contactwidget.h"
5 #include "contactwidgetitem.h"
6 #include "groupwidgetitem.h"
7 #include "contactinterface.h"
8 #include "utility.h"
9
10
11 ContactWidget::ContactWidget(QWidget *parent) :
12     QWidget(parent)
13 {
14     //qDebug() << "ContactWidget::ContactWidget(QWidget *parent), Entry";
15     contact_items = new QVector<ContactWidgetItem*>;
16     contact_items_selected = new QVector<ContactWidgetItem*>;
17 }
18
19 ContactWidget::~ContactWidget()
20 {
21     //qDebug() << "ContactWidget::~ContactWidget(), Entry";
22     destroyContactWidget();
23 }
24
25 void ContactWidget::setItemObserver()
26 {
27     ContactInterface::getInstance()->setItemObserver( this );
28 }
29
30 void ContactWidget::initContactWidget()
31 {
32     //qDebug() << "ContactWidget::initContactWidget(), Entry";
33
34     setItemObserver();
35     ContactInterface::getInstance()->getAllContactsFromXml();
36 }
37
38 void ContactWidget::destroyContactWidget()
39 {
40     //qDebug() << ("ContactWidget::destroyContactWidget(), Entry");
41
42     for (int i = 0; i < contact_items->size(); ++i)
43     {
44         contact_items->remove(i);
45     }
46     contact_items->clear();
47     delete contact_items;
48     contact_items = NULL;
49
50     for (int i = 0; i < contact_items_selected->size(); ++i)
51     {
52         contact_items_selected->remove(i);
53     }
54     contact_items_selected->clear();
55     delete contact_items_selected;
56     contact_items_selected = NULL;
57
58     //qDebug() << ("ContactWidget::destroyContactWidget(), Exit");
59 }
60
61 int ContactWidget::findGroup(const QString &groupname)
62 {
63     for( int i = 0; i < contact_items->size(); i++ )
64     {
65         if( contact_items->at(i)->m_isGroup )
66         {
67             if( groupname == (static_cast<GroupWidgetItem*>(contact_items->at(i)))->group_name )
68                 return i;
69         }
70     }
71     return -1;
72 }
73
74 // from ItemObserver
75 void ContactWidget::refreshContactsList()
76 {
77     update();
78 }
79
80 // from ItemObserver
81 void ContactWidget::removeContact(Item *contact)
82 {
83     for (int i = 0; i < contact_items->size(); ++i)
84     {
85         if( contact->uid == contact_items->at(i)->uid && contact->group_owner == contact_items->at(i)->group_owner )
86         {
87             disconnect( contact_items->at(i), SIGNAL( itemUpdate() ), this, SLOT( update() ) );
88             disconnect( contact_items->at(i), SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
89             contact_items->remove(i);
90             break;
91         }
92     }
93 }
94
95 // from ItemObserver
96 void ContactWidget::removeAllContacts()
97 {
98     for (int i = 0; i < contact_items->size(); ++i)
99     {
100         delete contact_items->at(i);
101     }
102     contact_items->clear();
103 }
104
105 // from ItemObserver
106 void ContactWidget::addGroup( Item *item )
107 {
108     //qDebug() << "ContactWidget::addGroup( Item *item ), Entry";
109     GroupWidgetItem *group = new GroupWidgetItem(this);
110     group->group_name = item->group_name;
111     group->label_group_name->setText( item->group_name );
112
113     contact_items->append( group );
114
115     connect( group, SIGNAL( itemUpdate() ), this, SLOT( update() ) );
116     connect( group, SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
117
118     update();
119 }
120
121 // from ItemObserver
122 void ContactWidget::addContact( Item *item )
123 {
124     addContact(item, -1);
125 }
126
127 void ContactWidget::addContact(ContactWidgetItem *contact, int index)
128 {
129     //qDebug() << ("ContactWidget::addContact(ContactWidgetItem *contact), Entry");
130     //qDebug() << "contact is" << (int)contact;
131     if( -1 == index || index >= contact_items->size() )
132     {
133         contact_items->append(contact);
134     }else
135     {
136         contact_items->insert( ++index, contact);
137     }
138
139     connect( contact, SIGNAL( itemUpdate() ), this, SLOT( update() ) );
140     connect( contact, SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
141 }
142
143 void ContactWidget::addContact( Item *item, int groupindex )
144 {
145     //qDebug() << "ContactWidget::addContact( Item *item, int groupindex ), Entry";
146     if( item->m_isGroup )
147     {
148         GroupWidgetItem *contact = new GroupWidgetItem(this);
149
150         contact->label_group_name->setText( item->group_name );
151         contact->group_name = item->group_name;
152
153         addContact( (static_cast<ContactWidgetItem*>(contact)), groupindex );
154     }else
155     {
156         ContactWidgetItem *contact = new ContactWidgetItem(this);
157
158         contact->label_fullname->setText( item->full_name );
159         contact->full_name = item->full_name;
160
161         contact->label_mobile_number->setText( item->mobile_number );
162         contact->mobile_number = item->mobile_number;
163
164         contact->group_owner =  item->group_owner;
165
166         contact->uid = item->uid;
167
168         addContact(contact, groupindex);
169     }
170 }
171
172 // from ItemObserver
173 void ContactWidget::addContact( Item *item, const QString &groupname )
174 {
175     int groupindex = findGroup( groupname );
176     addContact( item, groupindex);
177 }
178
179 // from ItemObserver
180 void ContactWidget::addContact( ItemListPtr items, const QString &groupname )
181 {
182     //qDebug() << "addContact(const QString &groupname, Item &item)";
183     int groupindex = findGroup( groupname );
184
185     for( int i = 0; i < items.size(); i++ )
186     {
187         Item *item = items.at(i);
188
189         addContact( item, groupindex);
190     }
191     update();
192 }
193
194 // from ItemObserver
195 void ContactWidget::addContact( ItemList items, const QString &groupname )
196 {
197     //qDebug() << "addContact(const QString &groupname, Item &item)";
198     int groupindex = findGroup( groupname );
199
200     for( int i = 0; i < items.size(); i++ )
201     {
202         Item item = items.at(i);
203
204         addContact( &item, groupindex);
205     }
206     update();
207 }
208
209 void ContactWidget::cleanContactList()
210 {
211     for (int i = 0; i < contact_items->size(); ++i)
212     {
213         disconnect( contact_items->at(i), SIGNAL( itemUpdate() ), this, SLOT( update() ) );
214         disconnect( contact_items->at(i), SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
215     }
216     contact_items->clear();
217 }
218
219 void ContactWidget::cleanSelectedContactList()
220 {
221     contact_items_selected->clear();
222
223     resetContacts();
224     update();
225 }
226
227 void ContactWidget::refreshContactList()
228 {
229     //qDebug() << "ContactWidget::refreshContactList()";
230     cleanContactList();
231
232     ContactInterface::getInstance()->getAllContactsFromXml();
233     for (int i = 0; i < contact_items->size(); ++i)
234     {
235         connect( contact_items->at(i), SIGNAL( itemUpdate() ), this, SLOT( update() ) );
236         connect( contact_items->at(i), SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
237     }
238
239     update();
240 }
241
242 void ContactWidget::resetContacts()
243 {
244     //qDebug() << ("ContactWidget::resetContacts(), Entry");
245     for (int i = 0; i < contact_items->size(); ++i)
246     {
247         if( contact_items->at(i)->m_isGroup )
248         {
249             (static_cast<GroupWidgetItem*>(contact_items->at(i)))->reSet();
250         }else
251         {
252             contact_items->at(i)->reSet();
253         }
254     }
255 }
256
257 void ContactWidget::update()
258 {
259     update( contact_items );
260 }
261
262 void ContactWidget::update(QVector<ContactWidgetItem *> *items)
263 {
264     //qDebug() << ("ContactWidget::update(), Entry");
265
266     bool group_open = false;
267     int size = items->size();
268     //qDebug() << "size is" << items->size();
269     int x = 0;
270     int y = 0;
271     for( int i = 0; i < size; i++ )
272     {
273         ContactWidgetItem *item = items->at(i);
274         if( item->m_isGroup )
275         {
276             //qDebug() << "ContactWidget::update(), item is group";
277             group_open = false;
278             x = 0;
279             y = (static_cast<GroupWidgetItem*>(item))->move(x, y, this);
280             if( (static_cast<GroupWidgetItem*>(item))->m_isOpenContactList )
281             {
282                 x += CONTACT_ITEM_MARGE_WIDTH;
283                 group_open = true;
284                 //qDebug() << "group open is true. x =" << x;
285             }
286             (static_cast<GroupWidgetItem*>(item))->showAll();
287             y += MARGE_HEIGH;
288         }else
289         {
290             //qDebug() << "ContactWidget::update(), item is contact";
291             if( group_open )
292             {
293                 y = item->move(x, y, this);
294                 item->showAll();
295                 y += MARGE_HEIGH;
296             }else
297             {
298                 item->hideAll();
299             }
300         }        
301     }
302     resize( qApp->desktop()->rect().width(), y );
303
304     //qDebug() << ("ContactWidget::update(), Exit");
305 }
306
307 void ContactWidget::paintEvent(QPaintEvent *event)
308 {
309     //qDebug() << "ContactWidget::paintEvent(QPaintEvent *event), Entry";
310
311     QPainter painter(this);
312     for (int i = 0; i < contact_items->size(); i++) {
313         //ContactWidgetItem *item = contact_items->at(i);
314         //painter.fillRect(0, item->m_x, width(), item->m_height, QBrush(item->m_color));
315         //qDebug() << "paint item at:" << i << "m_x=" << item->m_x << "m_height=" << item->m_height;
316     }
317     event->accept();
318 }
319
320 void ContactWidget::resizeEvent(QResizeEvent *event)
321 {
322     Q_UNUSED( event )
323     //qDebug() << ("ContactWidget::resizeEvent(QResizeEvent *event), Entry");
324 }
325
326 void ContactWidget::contactItemSelected( ContactWidgetItem *item, bool selected )
327 {
328     //qDebug() << ("ContactWidget::contactItemSelected( ContactWidgetItem *item, bool selected ), Entry");
329     //qDebug() << "item is" << (int)item;
330
331     if( selected )
332     {
333         //qDebug() << "contact_items_selected->append(item)" << item->full_name;
334         if( item->m_isGroup )
335         {
336             QString str = (static_cast<GroupWidgetItem*>(item))->group_name;
337             for( int i = 0; i < contact_items->size(); i++ )
338             {
339                 if( contact_items->at(i)->group_owner == str )
340                 {
341                     contact_items_selected->append( contact_items->at(i) );
342                     contact_items->at(i)->setSelected(true);
343                 }
344             }
345         }else
346         {
347             contact_items_selected->append(item);
348             checkGroupPartOfSelected(item);
349         }
350     }else
351     {
352         if( item->m_isGroup )
353         {
354             QString str = (static_cast<GroupWidgetItem*>(item))->group_name;
355             for( int i = 0; i < contact_items_selected->size(); i++ )
356             {
357                 if( contact_items_selected->at(i)->group_owner == str )
358                 {
359                     contact_items_selected->remove( i );
360                     contact_items->at(i)->setSelected(false);
361                 }
362             }
363         }else
364         {
365             for( int i = 0; i < contact_items_selected->size(); i++ )
366             {
367                 if( contact_items_selected->at(i)->uid == item->uid )
368                 {
369                     contact_items_selected->remove( i );
370                     checkGroupPartOfSelected( item );
371                     break;
372                 }
373             }
374         }
375     }
376     Q_EMIT validRecycle( isValidRecycle() );
377 }
378
379 void ContactWidget::checkGroupPartOfSelected(ContactWidgetItem* item)
380 {
381     bool partselected = false;
382     GroupWidgetItem* group = NULL;
383     QString str = item->group_owner;
384     for( int i = 0; i < contact_items->size(); i++ )
385     {
386         if(  contact_items->at(i)->m_isGroup && str == (static_cast<GroupWidgetItem*>(contact_items->at(i)))->group_name )
387         {
388              group = (static_cast<GroupWidgetItem*>(contact_items->at(i)));
389              break;
390         }
391     }
392
393     for( int i = 0; i < contact_items_selected->size(); i++ )
394     {
395         if( group->group_name == contact_items_selected->at(i)->group_owner )
396         {
397             partselected = true;
398             break;
399         }
400     }
401     if( partselected )
402     {
403         group->partOfAllSeleted();
404     }else
405     {
406         group->setSelected(false);
407     }
408 }
409
410 QVector<ContactWidgetItem*>* ContactWidget::getSelectedContacts()
411 {
412     return contact_items_selected;
413 }
414
415 bool ContactWidget::isValidRecycle()
416 {
417     if( contact_items_selected->size() > 0 )
418         return true;
419     return false;
420 }
421
422 void ContactWidget::removeSelectedContact()
423 {
424     ItemListPtr list;
425     for( int i = 0; i < contact_items_selected->size(); i++ )
426     {
427         ContactWidgetItem *contact = contact_items_selected->at(i);
428         if( contact->m_isGroup )
429         {
430             continue;
431         }
432
433         Item *item = new Item();
434         item->uid = contact->uid;
435         item->full_name = contact->full_name;
436         item->mobile_number = contact->mobile_number;
437         item->group_owner = contact->group_owner;
438
439         list.append(item);
440     }
441     ContactInterface::getInstance()->removeContactToGroup(list);
442     contact_items_selected->clear();
443 }
444
445
446
447
448
449
450
451