view browser_side/dialog.py @ 53:dc7861390f10

social contract update
author Goffi <goffi@goffi.org>
date Sat, 28 May 2011 20:14:38 +0200
parents 4419ef07bb2b
children f25c4077f6b9
line wrap: on
line source

#!/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/>.
"""

from pyjamas.ui.VerticalPanel import VerticalPanel
from pyjamas.ui.HorizontalPanel import HorizontalPanel
from pyjamas.ui.PopupPanel import PopupPanel
from pyjamas.ui.DialogBox import DialogBox
from pyjamas.ui.ListBox import ListBox
from pyjamas.ui.Button import Button
from pyjamas.ui.TextBox import TextBox
from pyjamas.ui.Label import Label
from pyjamas.ui.HTML import HTML
from pyjamas.ui import HasAlignment
from pyjamas.ui.KeyboardListener import KEY_ESCAPE, KEY_ENTER

class ContactsChooser(DialogBox):

    def __init__(self, host, callback, nb_contact=None, text='Please select contacts'):
        """
        ContactsChooser allow to select one or several connected contacts
        @param host: SatWebFrontend instance
        @param callback: method to call when contacts have been choosed
        @param nb_contact: number of contacts that have to be selected, None for no limit
        """
        self.host = host
        self.callback = callback
        self.nb_contact = nb_contact
        DialogBox.__init__(self, centered=True)

        content = VerticalPanel()
        content.setWidth('100%')
        self.contacts_list = ListBox()
        self.contacts_list.setVisibleItemCount(10)
        self.contacts_list.setMultipleSelect(True)
        self.contacts_list.setWidth("100%")
        self.contacts_list.setStyleName('contactsChooser')
        self.contacts_list.addChangeListener(self.onChange)
        content.add(self.contacts_list)
        button_panel = HorizontalPanel()
        self.choose_button = Button("Choose", self.onChoose)
        self.choose_button.setEnabled(False)
        button_panel.add(self.choose_button)
        button_panel.add(Button("Cancel", self.onCancel))
        content.add(button_panel)
        self.setHTML(text)
        self.setWidget(content)	
    
    def onChange(self):
        if self.nb_contact:
            if len(self.contacts_list.getSelectedValues()) == self.nb_contact:
                self.choose_button.setEnabled(True)
            else:
                self.choose_button.setEnabled(False)

    def getContacts(self):
        """
        Actually ask to choose the contacts
        """
        self.contacts_list.clear()
        for contact in self.host.contact_panel.getConnected():
            if contact not in [room.bare for room in self.host.room_list]:
                self.contacts_list.addItem(contact)
        self.show()

    def onChoose(self):
        self.hide()
        self.callback(self.contacts_list.getSelectedValues())

    def onCancel(self):
        self.hide()

class ConfirmDialog(DialogBox):

    def __init__(self, callback, text='Are you sure ?'):
        """
        Dialog to confirm an action
        @param callback: method to call when contacts have been choosed
        """
        self.callback = callback
        DialogBox.__init__(self, centered=True)

        content = VerticalPanel()
        content.setWidth('100%')
        button_panel = HorizontalPanel()
        self.confirm_button = Button("OK", self.onConfirm)
        button_panel.add(self.confirm_button)
        button_panel.add(Button("Cancel", self.onCancel))
        content.add(button_panel)
        self.setHTML(text)
        self.setWidget(content)	
    
    def onConfirm(self):
        self.hide()
        self.callback(True)

    def onCancel(self):
        self.hide()
        self.callback(False)

class InfoDialog(DialogBox):
    """Dialog which just show a widget and a close button"""

    def __init__(self, title, widget, callback = None):
        """Simple notice dialog box
        @param title: HTML put in the header
        @param body: widget put in the body"""
        DialogBox.__init__(self, centered=True)
        self.callback = callback
        _body = VerticalPanel()
        _body.setSize('100%','100%')
        _body.setSpacing(4)
        _body.add(widget)
        _body.setCellWidth(widget, '100%')
        _close_button = Button("Close", self.onClose)
        _body.add(_close_button)
        _body.setCellHorizontalAlignment(_close_button, HasAlignment.ALIGN_CENTER)
        self.setHTML(title)
        self.setWidget(_body)
        self.panel.setWidth('100%')

    def onClose(self):
        self.hide()
        if self.callback:
            self.callback()

class SimpleDialog(InfoDialog):

    def __init__(self, title, body, callback = None):
        InfoDialog.__init__(self, title, HTML(body), callback)

class PopupPanelWrapper(PopupPanel):
    """This wrapper catch Escape event to avoid request cancellation by Firefox"""

    def onEventPreview(self, event):
        if event.type in ["keydown", "keypress", "keyup"] and event.keyCode == KEY_ESCAPE:
            #needed to prevent request cancellation in Firefox
            event.preventDefault()
        return PopupPanel.onEventPreview(self, event)

class ExtTextBox(TextBox):
    """Extended TextBox"""

    def __init__(self, *args, **kwargs):
        if 'enter_cb' in kwargs:
            self.enter_cb = kwargs['enter_cb']
            del kwargs['enter_cb']
        TextBox.__init__(self, *args, **kwargs)
        self.addKeyboardListener(self)

    def onKeyUp(self, sender, keycode, modifiers):
        pass
    
    def onKeyDown(self, sender, keycode, modifiers):
        pass
    
    def onKeyPress(self, sender, keycode, modifiers):
        if self.enter_cb and keycode == KEY_ENTER:
            self.enter_cb(self)

class GroupSelector(DialogBox):
    
    def __init__(self, top_widgets, initial_groups, selected_groups, ok_cb = None, cancel_cb = None):
        DialogBox.__init__(self, centered = True)
        main_panel = VerticalPanel()
        self.ok_cb = ok_cb
        self.cancel_cb = cancel_cb
        
        for wid in top_widgets:
            main_panel.add(wid)
        
        main_panel.add(Label('Select in which groups your contact is:'))
        self.list_box = ListBox()
        self.list_box.setMultipleSelect(True)
        self.list_box.setVisibleItemCount(5)
        self.setAvailableGroups(initial_groups)
        self.setGroupsSelected(selected_groups)
        main_panel.add(self.list_box)
        
        add_group_panel = HorizontalPanel()
        add_group_lb = Label('Add group:')
        add_group_tb = ExtTextBox(enter_cb = self.onGroupInput)
        add_group_panel.add(add_group_lb)
        add_group_panel.add(add_group_tb)
        main_panel.add(add_group_panel)
        
        button_panel = HorizontalPanel()
        button_panel.add(Button("Add", self.onOK))
        button_panel.add(Button("Cancel", self.onCancel))
        main_panel.add(button_panel)
        
        self.setWidget(main_panel)

    def setAvailableGroups(self, groups):
        _groups = list(set(groups))
        _groups.sort()
        self.list_box.clear()
        for group in _groups:
            self.list_box.addItem(group)

    def setGroupsSelected(self, groups):
        if groups:
            self.list_box.setItemTextSelection(selected_groups)
    
    def onOK(self, sender):
        self.hide()
        if self.ok_cb:
            self.ok_cb(self)

    def onCancel(self, sender):
        self.hide()
        if self.cancel_cb:
            self.cancel_cb(self)

    def onGroupInput(self, sender):
        self.list_box.addItem(sender.getText())
        sender.setText('')
        self.list_box.setItemSelected(self.list_box.getItemCount()-1, "selected")