first release
[groupsms] / sms / contactwidget.cpp
diff --git a/sms/contactwidget.cpp b/sms/contactwidget.cpp
new file mode 100644 (file)
index 0000000..6464865
--- /dev/null
@@ -0,0 +1,451 @@
+#include <QtGui>
+#include <QDebug>
+
+#include "contactwidget.h"
+#include "contactwidgetitem.h"
+#include "groupwidgetitem.h"
+#include "contactinterface.h"
+#include "utility.h"
+
+
+ContactWidget::ContactWidget(QWidget *parent) :
+    QWidget(parent)
+{
+    //qDebug() << "ContactWidget::ContactWidget(QWidget *parent), Entry";
+    contact_items = new QVector<ContactWidgetItem*>;
+    contact_items_selected = new QVector<ContactWidgetItem*>;
+}
+
+ContactWidget::~ContactWidget()
+{
+    //qDebug() << "ContactWidget::~ContactWidget(), Entry";
+    destroyContactWidget();
+}
+
+void ContactWidget::setItemObserver()
+{
+    ContactInterface::getInstance()->setItemObserver( this );
+}
+
+void ContactWidget::initContactWidget()
+{
+    //qDebug() << "ContactWidget::initContactWidget(), Entry";
+
+    setItemObserver();
+    ContactInterface::getInstance()->getAllContactsFromXml();
+}
+
+void ContactWidget::destroyContactWidget()
+{
+    //qDebug() << ("ContactWidget::destroyContactWidget(), Entry");
+
+    for (int i = 0; i < contact_items->size(); ++i)
+    {
+        contact_items->remove(i);
+    }
+    contact_items->clear();
+    delete contact_items;
+    contact_items = NULL;
+
+    for (int i = 0; i < contact_items_selected->size(); ++i)
+    {
+        contact_items_selected->remove(i);
+    }
+    contact_items_selected->clear();
+    delete contact_items_selected;
+    contact_items_selected = NULL;
+
+    //qDebug() << ("ContactWidget::destroyContactWidget(), Exit");
+}
+
+int ContactWidget::findGroup(const QString &groupname)
+{
+    for( int i = 0; i < contact_items->size(); i++ )
+    {
+        if( contact_items->at(i)->m_isGroup )
+        {
+            if( groupname == (static_cast<GroupWidgetItem*>(contact_items->at(i)))->group_name )
+                return i;
+        }
+    }
+    return -1;
+}
+
+// from ItemObserver
+void ContactWidget::refreshContactsList()
+{
+    update();
+}
+
+// from ItemObserver
+void ContactWidget::removeContact(Item *contact)
+{
+    for (int i = 0; i < contact_items->size(); ++i)
+    {
+        if( contact->uid == contact_items->at(i)->uid && contact->group_owner == contact_items->at(i)->group_owner )
+        {
+            disconnect( contact_items->at(i), SIGNAL( itemUpdate() ), this, SLOT( update() ) );
+            disconnect( contact_items->at(i), SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
+            contact_items->remove(i);
+            break;
+        }
+    }
+}
+
+// from ItemObserver
+void ContactWidget::removeAllContacts()
+{
+    for (int i = 0; i < contact_items->size(); ++i)
+    {
+        delete contact_items->at(i);
+    }
+    contact_items->clear();
+}
+
+// from ItemObserver
+void ContactWidget::addGroup( Item *item )
+{
+    //qDebug() << "ContactWidget::addGroup( Item *item ), Entry";
+    GroupWidgetItem *group = new GroupWidgetItem(this);
+    group->group_name = item->group_name;
+    group->label_group_name->setText( item->group_name );
+
+    contact_items->append( group );
+
+    connect( group, SIGNAL( itemUpdate() ), this, SLOT( update() ) );
+    connect( group, SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
+
+    update();
+}
+
+// from ItemObserver
+void ContactWidget::addContact( Item *item )
+{
+    addContact(item, -1);
+}
+
+void ContactWidget::addContact(ContactWidgetItem *contact, int index)
+{
+    //qDebug() << ("ContactWidget::addContact(ContactWidgetItem *contact), Entry");
+    //qDebug() << "contact is" << (int)contact;
+    if( -1 == index || index >= contact_items->size() )
+    {
+        contact_items->append(contact);
+    }else
+    {
+        contact_items->insert( ++index, contact);
+    }
+
+    connect( contact, SIGNAL( itemUpdate() ), this, SLOT( update() ) );
+    connect( contact, SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
+}
+
+void ContactWidget::addContact( Item *item, int groupindex )
+{
+    //qDebug() << "ContactWidget::addContact( Item *item, int groupindex ), Entry";
+    if( item->m_isGroup )
+    {
+        GroupWidgetItem *contact = new GroupWidgetItem(this);
+
+        contact->label_group_name->setText( item->group_name );
+        contact->group_name = item->group_name;
+
+        addContact( (static_cast<ContactWidgetItem*>(contact)), groupindex );
+    }else
+    {
+        ContactWidgetItem *contact = new ContactWidgetItem(this);
+
+        contact->label_fullname->setText( item->full_name );
+        contact->full_name = item->full_name;
+
+        contact->label_mobile_number->setText( item->mobile_number );
+        contact->mobile_number = item->mobile_number;
+
+        contact->group_owner =  item->group_owner;
+
+        contact->uid = item->uid;
+
+        addContact(contact, groupindex);
+    }
+}
+
+// from ItemObserver
+void ContactWidget::addContact( Item *item, const QString &groupname )
+{
+    int groupindex = findGroup( groupname );
+    addContact( item, groupindex);
+}
+
+// from ItemObserver
+void ContactWidget::addContact( ItemListPtr items, const QString &groupname )
+{
+    //qDebug() << "addContact(const QString &groupname, Item &item)";
+    int groupindex = findGroup( groupname );
+
+    for( int i = 0; i < items.size(); i++ )
+    {
+        Item *item = items.at(i);
+
+        addContact( item, groupindex);
+    }
+    update();
+}
+
+// from ItemObserver
+void ContactWidget::addContact( ItemList items, const QString &groupname )
+{
+    //qDebug() << "addContact(const QString &groupname, Item &item)";
+    int groupindex = findGroup( groupname );
+
+    for( int i = 0; i < items.size(); i++ )
+    {
+        Item item = items.at(i);
+
+        addContact( &item, groupindex);
+    }
+    update();
+}
+
+void ContactWidget::cleanContactList()
+{
+    for (int i = 0; i < contact_items->size(); ++i)
+    {
+        disconnect( contact_items->at(i), SIGNAL( itemUpdate() ), this, SLOT( update() ) );
+        disconnect( contact_items->at(i), SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
+    }
+    contact_items->clear();
+}
+
+void ContactWidget::cleanSelectedContactList()
+{
+    contact_items_selected->clear();
+
+    resetContacts();
+    update();
+}
+
+void ContactWidget::refreshContactList()
+{
+    //qDebug() << "ContactWidget::refreshContactList()";
+    cleanContactList();
+
+    ContactInterface::getInstance()->getAllContactsFromXml();
+    for (int i = 0; i < contact_items->size(); ++i)
+    {
+        connect( contact_items->at(i), SIGNAL( itemUpdate() ), this, SLOT( update() ) );
+        connect( contact_items->at(i), SIGNAL( itemSelected( ContactWidgetItem*, bool) ), this, SLOT( contactItemSelected( ContactWidgetItem*, bool ) ) );
+    }
+
+    update();
+}
+
+void ContactWidget::resetContacts()
+{
+    //qDebug() << ("ContactWidget::resetContacts(), Entry");
+    for (int i = 0; i < contact_items->size(); ++i)
+    {
+        if( contact_items->at(i)->m_isGroup )
+        {
+            (static_cast<GroupWidgetItem*>(contact_items->at(i)))->reSet();
+        }else
+        {
+            contact_items->at(i)->reSet();
+        }
+    }
+}
+
+void ContactWidget::update()
+{
+    update( contact_items );
+}
+
+void ContactWidget::update(QVector<ContactWidgetItem *> *items)
+{
+    //qDebug() << ("ContactWidget::update(), Entry");
+
+    bool group_open = false;
+    int size = items->size();
+    //qDebug() << "size is" << items->size();
+    int x = 0;
+    int y = 0;
+    for( int i = 0; i < size; i++ )
+    {
+        ContactWidgetItem *item = items->at(i);
+        if( item->m_isGroup )
+        {
+            //qDebug() << "ContactWidget::update(), item is group";
+            group_open = false;
+            x = 0;
+            y = (static_cast<GroupWidgetItem*>(item))->move(x, y, this);
+            if( (static_cast<GroupWidgetItem*>(item))->m_isOpenContactList )
+            {
+                x += CONTACT_ITEM_MARGE_WIDTH;
+                group_open = true;
+                //qDebug() << "group open is true. x =" << x;
+            }
+            (static_cast<GroupWidgetItem*>(item))->showAll();
+            y += MARGE_HEIGH;
+        }else
+        {
+            //qDebug() << "ContactWidget::update(), item is contact";
+            if( group_open )
+            {
+                y = item->move(x, y, this);
+                item->showAll();
+                y += MARGE_HEIGH;
+            }else
+            {
+                item->hideAll();
+            }
+        }        
+    }
+    resize( qApp->desktop()->rect().width(), y );
+
+    //qDebug() << ("ContactWidget::update(), Exit");
+}
+
+void ContactWidget::paintEvent(QPaintEvent *event)
+{
+    //qDebug() << "ContactWidget::paintEvent(QPaintEvent *event), Entry";
+
+    QPainter painter(this);
+    for (int i = 0; i < contact_items->size(); i++) {
+        //ContactWidgetItem *item = contact_items->at(i);
+        //painter.fillRect(0, item->m_x, width(), item->m_height, QBrush(item->m_color));
+        //qDebug() << "paint item at:" << i << "m_x=" << item->m_x << "m_height=" << item->m_height;
+    }
+    event->accept();
+}
+
+void ContactWidget::resizeEvent(QResizeEvent *event)
+{
+    Q_UNUSED( event )
+    //qDebug() << ("ContactWidget::resizeEvent(QResizeEvent *event), Entry");
+}
+
+void ContactWidget::contactItemSelected( ContactWidgetItem *item, bool selected )
+{
+    //qDebug() << ("ContactWidget::contactItemSelected( ContactWidgetItem *item, bool selected ), Entry");
+    //qDebug() << "item is" << (int)item;
+
+    if( selected )
+    {
+        //qDebug() << "contact_items_selected->append(item)" << item->full_name;
+        if( item->m_isGroup )
+        {
+            QString str = (static_cast<GroupWidgetItem*>(item))->group_name;
+            for( int i = 0; i < contact_items->size(); i++ )
+            {
+                if( contact_items->at(i)->group_owner == str )
+                {
+                    contact_items_selected->append( contact_items->at(i) );
+                    contact_items->at(i)->setSelected(true);
+                }
+            }
+        }else
+        {
+            contact_items_selected->append(item);
+            checkGroupPartOfSelected(item);
+        }
+    }else
+    {
+        if( item->m_isGroup )
+        {
+            QString str = (static_cast<GroupWidgetItem*>(item))->group_name;
+            for( int i = 0; i < contact_items_selected->size(); i++ )
+            {
+                if( contact_items_selected->at(i)->group_owner == str )
+                {
+                    contact_items_selected->remove( i );
+                    contact_items->at(i)->setSelected(false);
+                }
+            }
+        }else
+        {
+            for( int i = 0; i < contact_items_selected->size(); i++ )
+            {
+                if( contact_items_selected->at(i)->uid == item->uid )
+                {
+                    contact_items_selected->remove( i );
+                    checkGroupPartOfSelected( item );
+                    break;
+                }
+            }
+        }
+    }
+    Q_EMIT validRecycle( isValidRecycle() );
+}
+
+void ContactWidget::checkGroupPartOfSelected(ContactWidgetItem* item)
+{
+    bool partselected = false;
+    GroupWidgetItem* group = NULL;
+    QString str = item->group_owner;
+    for( int i = 0; i < contact_items->size(); i++ )
+    {
+        if(  contact_items->at(i)->m_isGroup && str == (static_cast<GroupWidgetItem*>(contact_items->at(i)))->group_name )
+        {
+             group = (static_cast<GroupWidgetItem*>(contact_items->at(i)));
+             break;
+        }
+    }
+
+    for( int i = 0; i < contact_items_selected->size(); i++ )
+    {
+        if( group->group_name == contact_items_selected->at(i)->group_owner )
+        {
+            partselected = true;
+            break;
+        }
+    }
+    if( partselected )
+    {
+        group->partOfAllSeleted();
+    }else
+    {
+        group->setSelected(false);
+    }
+}
+
+QVector<ContactWidgetItem*>* ContactWidget::getSelectedContacts()
+{
+    return contact_items_selected;
+}
+
+bool ContactWidget::isValidRecycle()
+{
+    if( contact_items_selected->size() > 0 )
+        return true;
+    return false;
+}
+
+void ContactWidget::removeSelectedContact()
+{
+    ItemListPtr list;
+    for( int i = 0; i < contact_items_selected->size(); i++ )
+    {
+        ContactWidgetItem *contact = contact_items_selected->at(i);
+        if( contact->m_isGroup )
+        {
+            continue;
+        }
+
+        Item *item = new Item();
+        item->uid = contact->uid;
+        item->full_name = contact->full_name;
+        item->mobile_number = contact->mobile_number;
+        item->group_owner = contact->group_owner;
+
+        list.append(item);
+    }
+    ContactInterface::getInstance()->removeContactToGroup(list);
+    contact_items_selected->clear();
+}
+
+
+
+
+
+
+
+