diff browser_side/contact.py @ 17:c725b702e927

register.py and contact.py moved to new directory browser_side
author Goffi <goffi@goffi.org>
date Fri, 15 Apr 2011 15:18:38 +0200
parents contact.py@099c05a0dcab
children e8e3704eb97f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browser_side/contact.py	Fri Apr 15 15:18:38 2011 +0200
@@ -0,0 +1,181 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+"""
+Libervia: a Salut à Toi frontend
+Copyright (C) 2011  Jérôme Poisson (goffi@goffi.org)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import pyjd # this is dummy in pyjs
+from pyjamas.ui.SimplePanel import SimplePanel
+from pyjamas.ui.VerticalPanel import VerticalPanel
+from pyjamas.ui.HorizontalPanel import HorizontalPanel
+from pyjamas.ui.Label import Label
+from pyjamas import Window
+from pyjamas import DOM
+
+from pyjamas.dnd import makeDraggable
+from pyjamas.ui.DragWidget import DragWidget, DragContainer
+from tools.jid import JID
+
+class DragLabel(DragWidget):
+
+    def __init__(self, text, type):
+        DragWidget.__init__(self)
+        self._text = text
+        self._type = type
+    
+    def onDragStart(self, event):
+        print "onDragStart"
+        dt = event.dataTransfer
+        #self.addMessage('types is %s' % dt.getTypes())
+        dt.setData('Text', self._text)
+        dt.setData('type', self._type)
+        #self.addMessage('after setting, len is %s' % len(dt.dataStore.items))
+        #self.addMessage('types is %s' % dt.getTypes())
+        dt.setDragImage(self.getElement(), 15, 15)
+        #dt.effectAllowed = 'copy'
+        #self.addMessage('mode is %s' % dt.dataStore.items.mode)
+
+    def onDragEnd(self, event):
+        print "onDragEnd"
+        #self.addMessage('Drag ended')
+        #self.addMessage('mode is %s' % dt._data.mode)
+
+    def addMessage(self, message):
+        print "addMessage"
+        #parent = self.getParent()
+        #while not hasattr(parent, 'addMessage'):
+        #    parent = parent.getParent()
+        #parent.addMessage(message)
+
+class GroupLabel(DragLabel, Label):
+    def __init__(self, group):
+        self.group = group
+        Label.__init__(self, group) #, Element=DOM.createElement('div')
+        self.setStyleName('group')
+        DragLabel.__init__(self, group, "GROUP")
+    
+
+class ContactLabel(Label):
+    def __init__(self, jid, name=None):
+        if not name:
+            name=jid
+        Label.__init__(self, name)
+        self.jid=jid
+        self.setStyleName('contact')
+
+class GroupList(VerticalPanel):
+
+    def __init__(self, parent):
+        VerticalPanel.__init__(self)
+        self._parent = parent
+
+    def add(self, group):
+        _item = GroupLabel(group)
+        _item.addMouseListener(self._parent)
+        DOM.setStyleAttribute(_item.getElement(), "cursor", "pointer")
+        VerticalPanel.add(self, _item)
+    
+class ContactList(VerticalPanel):
+
+    def __init__(self):
+        VerticalPanel.__init__(self)
+        self.contacts=[]
+
+    def __iter__(self):
+        return self.contacts.__iter__()
+    
+    def add(self, jid, name=None):
+        _item = ContactLabel(jid, name)
+        DOM.setStyleAttribute(_item.getElement(), "cursor", "pointer")
+        VerticalPanel.add(self, _item)
+        self.contacts.append(_item)
+
+class ContactTitleLabel(DragLabel, Label):
+    def __init__(self, text):
+        Label.__init__(self, text) #, Element=DOM.createElement('div')
+        self.setStyleName('contactTitle')
+        DragLabel.__init__(self, text, "CONTACT")
+
+class ContactPanel(SimplePanel):
+    """Manage the contacts and groups"""
+    
+    def __init__(self, host):
+        SimplePanel.__init__(self)
+        self.host = host
+        self.groups={}
+
+        self.vPanel = VerticalPanel()
+        _title = ContactTitleLabel('Contacts')
+        DOM.setStyleAttribute(_title.getElement(), "cursor", "pointer")
+
+        self._contactList = ContactList()
+        self._contactList.setStyleName('contactList')
+        self._groupList = GroupList(self)
+        self._groupList.setStyleName('groupList')
+        
+        self.vPanel.add(_title)
+        self.vPanel.add(self._groupList)
+        self.vPanel.add(self._contactList)
+        self.add(self.vPanel)
+        self.setStyleName('contactBox')
+
+    def addContact(self, jid, attributes, groups):
+        """Add a contact to the panel
+        @param jid: jid
+        @attributes: cf SàT Bridge API's newContact
+        @param groups: list of groups"""
+        for group in groups:
+            if not self.groups.has_key(group):
+                self.groups[group] = set()
+                self._groupList.add(group)
+                self.host.uniBox.addKey("@%s: " % group)
+            self.groups[group].add(jid)
+        self._contactList.add(jid)
+
+    def isContactInGroup(self, group, contact_jid):
+       """Test if the contact_jid is in the group
+       @param group: string of single group, or list of string
+       @param contact_jid: jid to test
+       @return: True if contact_jid is in on of the groups"""
+       print "isContactInGroup: %s, %s" % (group, contact_jid)
+       print JID(contact_jid)
+       print self.groups[group]
+       if self.groups.has_key(group) and contact_jid in self.groups[group]:
+           return True
+       return False
+
+    def onMouseMove(self, sender, x, y):
+        pass
+        
+    def onMouseDown(self, sender, x, y):
+        pass
+
+    def onMouseUp(self, sender, x, y):
+        pass
+
+    def onMouseEnter(self, sender):
+        if isinstance(sender, GroupLabel):
+            for contact in self._contactList:
+                if contact.jid in self.groups[sender.group]:
+                    contact.addStyleName("selected")
+    
+    def onMouseLeave(self, sender):
+        if isinstance(sender, GroupLabel):
+            for contact in self._contactList:
+                if contact.jid in self.groups[sender.group]:
+                    contact.removeStyleName("selected")