diff --git a/src/common/connection.py b/src/common/connection.py index edf65b6362f0ba4c9dbf8500618b15f21610b882..43311d4828d9ffda147966968185b4d6aa83c8a4 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -2629,11 +2629,22 @@ class Connection(CommonConnection, ConnectionHandlers): """ Send invitation """ - message=common.xmpp.Message(to = room) - c = message.addChild(name = 'x', namespace = common.xmpp.NS_MUC_USER) - c = c.addChild(name = 'invite', attrs={'to' : to}) + message=common.xmpp.Message(to=room) + c = message.addChild(name='x', namespace=common.xmpp.NS_MUC_USER) + c = c.addChild(name='invite', attrs={'to': to}) if continue_tag: - c.addChild(name = 'continue') + c.addChild(name='continue') + if reason != '': + c.setTagData('reason', reason) + self.connection.send(message) + + def decline_invitation(self, room, to, reason=''): + """ + decline a groupchat invitation + """ + message=common.xmpp.Message(to=room) + c = message.addChild(name='x', namespace=common.xmpp.NS_MUC_USER) + c = c.addChild(name='decline', attrs={'to': to}) if reason != '': c.setTagData('reason', reason) self.connection.send(message) diff --git a/src/dialogs.py b/src/dialogs.py index 5b7cb95d0ece551f83cb9874971d80e89c41c470..9530bc048acdbd4f7254e4ba3bd53c4010d0d2ee 100644 --- a/src/dialogs.py +++ b/src/dialogs.py @@ -1615,8 +1615,8 @@ class YesNoDialog(HigDialog): HIG compliant YesNo dialog """ - def __init__(self, pritext, sectext='', checktext='', on_response_yes=None, - on_response_no=None, type_=gtk.MESSAGE_QUESTION): + def __init__(self, pritext, sectext='', checktext='', text_label=None, + on_response_yes=None, on_response_no=None, type_=gtk.MESSAGE_QUESTION): self.user_response_yes = on_response_yes self.user_response_no = on_response_no if hasattr(gajim.interface, 'roster') and gajim.interface.roster: @@ -1632,25 +1632,59 @@ class YesNoDialog(HigDialog): self.vbox.pack_start(self.checkbutton, expand=False, fill=True) else: self.checkbutton = None + if text_label: + label = gtk.Label(text_label) + self.vbox.pack_start(label, expand=False, fill=True) + buff = gtk.TextBuffer() + self.textview = gtk.TextView(buff) + frame = gtk.Frame() + frame.set_shadow_type(gtk.SHADOW_IN) + frame.add(self.textview) + self.vbox.pack_start(frame, expand=False, fill=True) + else: + self.textview = None self.set_modal(False) self.popup() def on_response_yes(self, widget): if self.user_response_yes: + if self.textview: + buff = self.textview.get_buffer() + start, end = buff.get_bounds() + txt = self.textview.get_buffer().get_text(start, end) + if isinstance(self.user_response_yes, tuple): - self.user_response_yes[0](self.is_checked(), - *self.user_response_yes[1:]) + if self.textview: + self.user_response_yes[0](self.is_checked(), txt, + *self.user_response_yes[1:]) + else: + self.user_response_yes[0](self.is_checked(), + *self.user_response_yes[1:]) else: - self.user_response_yes(self.is_checked()) + if self.textview: + self.user_response_yes(self.is_checked()) + else: + self.user_response_yes(self.is_checked(), txt) self.call_cancel_on_destroy = False self.destroy() def on_response_no(self, widget): if self.user_response_no: + if self.textview: + buff = self.textview.get_buffer() + start, end = buff.get_bounds() + txt = self.textview.get_buffer().get_text(start, end) + if isinstance(self.user_response_no, tuple): - self.user_response_no[0](*self.user_response_no[1:]) + if self.textview: + self.user_response_no[0](txt, *self.user_response_no[1:]) + else: + self.user_response_no[0](*self.user_response_no[1:]) else: - self.user_response_no() + if self.textview: + self.user_response_no(txt) + else: + self.user_response_no() self.call_cancel_on_destroy = False self.destroy() @@ -4436,6 +4470,7 @@ class InvitationReceivedDialog: self.account = account self.password = password self.is_continued = is_continued + self.contact_jid = contact_jid pritext = _('''You are invited to a groupchat''') #Don't translate $Contact @@ -4454,7 +4489,7 @@ class InvitationReceivedDialog: sectext += '\n\n%s' % comment sectext += '\n\n' + _('Do you want to accept the invitation?') - def on_yes(checked): + def on_yes(checked, text): try: if self.is_continued: gajim.interface.join_gc_room(self.account, self.room_jid, @@ -4464,7 +4499,12 @@ class InvitationReceivedDialog: except GajimGeneralException: pass - YesNoDialog(pritext, sectext, on_response_yes=on_yes) + def on_no(text): + gajim.connections[account].decline_invitation(self.room_jid, + self.contact_jid, text) + + YesNoDialog(pritext, sectext, text_label=_('Reason:'), + on_response_yes=on_yes, on_response_no=on_no) class ProgressDialog: def __init__(self, title_text, during_text, messages_queue): @@ -5231,8 +5271,9 @@ class CheckFingerprintDialog(YesNoDialog): on_response_yes=None, on_response_no=None, account=None, certificate=None): self.account = account self.cert = certificate - YesNoDialog.__init__(self, pritext, sectext, checktext, on_response_yes, - on_response_no) + YesNoDialog.__init__(self, pritext, sectext=sectext, + checktext=checktext, on_response_yes=on_response_yes, + on_response_no=on_response_no) b = gtk.Button(_('View cert...')) b.connect('clicked', self.on_cert_clicked) b.show_all()