Changeset 8535
- Timestamp:
- 08/22/07 01:13:03 (16 months ago)
- Location:
- trunk
- Files:
-
- 1 added
- 9 modified
-
data/glade/chat_control_popup_menu.glade (modified) (1 diff)
-
data/glade/chat_to_muc_window.glade (added)
-
src/chat_control.py (modified) (6 diffs)
-
src/common/connection_handlers.py (modified) (2 diffs)
-
src/common/connection.py (modified) (2 diffs)
-
src/common/xmpp/protocol.py (modified) (1 diff)
-
src/dialogs.py (modified) (6 diffs)
-
src/gajim.py (modified) (5 diffs)
-
src/groupchat_control.py (modified) (3 diffs)
-
src/roster_window.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/data/glade/chat_control_popup_menu.glade
r8314 r8535 1 <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->2 <!DOCTYPE glade-interface SYSTEM " http://glade.gnome.org/glade-2.0.dtd">3 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> 3 <!--*- mode: xml -*--> 4 4 <glade-interface> 5 6 <widget class="GtkMenu" id="chat_control_popup_menu"> 7 8 <child> 9 <widget class="GtkImageMenuItem" id="history_menuitem"> 10 <property name="visible">True</property> 11 <property name="tooltip" translatable="yes">Click to see past conversations with this contact</property> 12 <property name="label" translatable="yes">_History</property> 13 <property name="use_underline">True</property> 14 15 <child internal-child="image"> 16 <widget class="GtkImage" id="image1370"> 17 <property name="visible">True</property> 18 <property name="stock">gtk-justify-fill</property> 19 <property name="icon_size">1</property> 20 <property name="xalign">0.5</property> 21 <property name="yalign">0.5</property> 22 <property name="xpad">0</property> 23 <property name="ypad">0</property> 24 </widget> 25 </child> 26 </widget> 27 </child> 28 29 <child> 30 <widget class="GtkImageMenuItem" id="information_menuitem"> 31 <property name="visible">True</property> 32 <property name="label">gtk-info</property> 33 <property name="use_stock">True</property> 34 </widget> 35 </child> 36 37 <child> 38 <widget class="GtkImageMenuItem" id="send_file_menuitem"> 39 <property name="visible">True</property> 40 <property name="label" translatable="yes">Send _File</property> 41 <property name="use_underline">True</property> 42 <signal name="activate" handler="_on_send_file_menuitem_activate" last_modification_time="Tue, 03 Jan 2006 04:26:55 GMT"/> 43 44 <child internal-child="image"> 45 <widget class="GtkImage" id="image1371"> 46 <property name="visible">True</property> 47 <property name="stock">gtk-file</property> 48 <property name="icon_size">1</property> 49 <property name="xalign">0.5</property> 50 <property name="yalign">0.5</property> 51 <property name="xpad">0</property> 52 <property name="ypad">0</property> 53 </widget> 54 </child> 55 </widget> 56 </child> 57 58 <child> 59 <widget class="GtkCheckMenuItem" id="toggle_gpg_menuitem"> 60 <property name="visible">True</property> 61 <property name="label" translatable="yes">Toggle Open_PGP Encryption</property> 62 <property name="use_underline">True</property> 63 <property name="active">False</property> 64 <signal name="activate" handler="_on_toggle_gpg_menuitem_activate" last_modification_time="Tue, 03 Jan 2006 04:26:46 GMT"/> 65 </widget> 66 </child> 67 68 <child> 69 <widget class="GtkImageMenuItem" id="add_to_roster_menuitem"> 70 <property name="visible">True</property> 71 <property name="label" translatable="yes">_Add to Roster</property> 72 <property name="use_underline">True</property> 73 <signal name="activate" handler="_on_add_to_roster_menuitem_activate" last_modification_time="Tue, 03 Jan 2006 04:26:37 GMT"/> 74 75 <child internal-child="image"> 76 <widget class="GtkImage" id="image1372"> 77 <property name="visible">True</property> 78 <property name="stock">gtk-add</property> 79 <property name="icon_size">1</property> 80 <property name="xalign">0.5</property> 81 <property name="yalign">0.5</property> 82 <property name="xpad">0</property> 83 <property name="ypad">0</property> 84 </widget> 85 </child> 86 </widget> 87 </child> 88 </widget> 89 5 <widget class="GtkMenu" id="chat_control_popup_menu"> 6 <child> 7 <widget class="GtkImageMenuItem" id="history_menuitem"> 8 <property name="visible">True</property> 9 <property name="tooltip" translatable="yes">Click to see past conversations with this contact</property> 10 <property name="label" translatable="yes">_History</property> 11 <property name="use_underline">True</property> 12 <child internal-child="image"> 13 <widget class="GtkImage" id="image1370"> 14 <property name="visible">True</property> 15 <property name="stock">gtk-justify-fill</property> 16 <property name="icon_size">1</property> 17 </widget> 18 </child> 19 </widget> 20 </child> 21 <child> 22 <widget class="GtkImageMenuItem" id="information_menuitem"> 23 <property name="visible">True</property> 24 <property name="label">gtk-info</property> 25 <property name="use_underline">True</property> 26 <property name="use_stock">True</property> 27 </widget> 28 </child> 29 <child> 30 <widget class="GtkImageMenuItem" id="send_file_menuitem"> 31 <property name="visible">True</property> 32 <property name="label" translatable="yes">Send _File</property> 33 <property name="use_underline">True</property> 34 <signal name="activate" handler="_on_send_file_menuitem_activate"/> 35 <child internal-child="image"> 36 <widget class="GtkImage" id="image1371"> 37 <property name="visible">True</property> 38 <property name="stock">gtk-missing-image</property> 39 <property name="icon_size">1</property> 40 </widget> 41 </child> 42 </widget> 43 </child> 44 <child> 45 <widget class="GtkCheckMenuItem" id="toggle_gpg_menuitem"> 46 <property name="visible">True</property> 47 <property name="label" translatable="yes">Toggle Open_PGP Encryption</property> 48 <property name="use_underline">True</property> 49 <signal name="activate" handler="_on_toggle_gpg_menuitem_activate"/> 50 </widget> 51 </child> 52 <child> 53 <widget class="GtkImageMenuItem" id="add_to_roster_menuitem"> 54 <property name="visible">True</property> 55 <property name="label" translatable="yes">_Add to Roster</property> 56 <property name="use_underline">True</property> 57 <signal name="activate" handler="_on_add_to_roster_menuitem_activate"/> 58 <child internal-child="image"> 59 <widget class="GtkImage" id="image1372"> 60 <property name="visible">True</property> 61 <property name="stock">gtk-add</property> 62 <property name="icon_size">1</property> 63 </widget> 64 </child> 65 </widget> 66 </child> 67 <child> 68 <widget class="GtkMenuItem" id="convert_to_groupchat"> 69 <property name="visible">True</property> 70 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> 71 <property name="label" translatable="yes">Invite _Friends</property> 72 <property name="use_underline">True</property> 73 </widget> 74 </child> 75 </widget> 90 76 </glade-interface> -
trunk/src/chat_control.py
r8454 r8535 1537 1537 send_file_menuitem = xml.get_widget('send_file_menuitem') 1538 1538 information_menuitem = xml.get_widget('information_menuitem') 1539 convert_to_gc_menuitem = xml.get_widget('convert_to_groupchat') 1539 1540 1540 1541 contact = self.parent_win.get_active_contact() … … 1551 1552 toggle_gpg_menuitem.set_active(isactive) 1552 1553 toggle_gpg_menuitem.set_property('sensitive', is_sensitive) 1553 1554 1554 1555 # If we don't have resource, we can't do file transfer 1555 1556 # in transports, contact holds our info we need to disable it too … … 1561 1562 else: 1562 1563 send_file_menuitem.set_sensitive(False) 1563 1564 1565 # compact_view_menuitem 1566 compact_view_menuitem.set_active(self.hide_chat_buttons_current) 1567 1568 # check if it's possible to convert to groupchat 1569 if gajim.get_transport_name_from_jid(jid): 1570 convert_to_gc_menuitem.set_sensitive(False) 1571 1564 1572 # add_to_roster_menuitem 1565 1573 if _('Not in Roster') in contact.groups: … … 1569 1577 add_to_roster_menuitem.hide() 1570 1578 add_to_roster_menuitem.set_no_show_all(True) 1571 1572 1579 1573 1580 # connect signals 1574 1581 id = history_menuitem.connect('activate', … … 1587 1594 self._on_contact_information_menuitem_activate) 1588 1595 self.handlers[id] = information_menuitem 1596 id = convert_to_gc_menuitem.connect('activate', 1597 self._on_convert_to_gc_menuitem_activate) 1598 self.handlers[id] = convert_to_gc_menuitem 1589 1599 menu.connect('selection-done', lambda w:w.destroy()) 1590 1600 return menu … … 2000 2010 tb = self.xml.get_widget('gpg_togglebutton') 2001 2011 tb.set_active(not tb.get_active()) 2012 2013 def _on_convert_to_gc_menuitem_activate(self, widget): 2014 '''user want to invite some friends to chat''' 2015 dialogs.TransformChatToMUC(self.account, [self.contact.jid]) 2016 2002 2017 2003 2018 def got_connected(self): -
trunk/src/common/connection_handlers.py
r8505 r8535 1484 1484 if xtag.getNamespace() == common.xmpp.NS_CONFERENCE and not invite: 1485 1485 room_jid = xtag.getAttr('jid') 1486 self.dispatch('GC_INVITATION', (room_jid, frm, '', None)) 1486 is_continued = False 1487 if xtag.getTag('continue'): 1488 is_continued = True 1489 self.dispatch('GC_INVITATION', (room_jid, frm, '', None, 1490 is_continued)) 1487 1491 return 1488 1492 # chatstates - look for chatstate tags in a message if not delayed … … 1575 1579 item = invite.getTag('password') 1576 1580 password = invite.getTagData('password') 1577 self.dispatch('GC_INVITATION',(frm, jid_from, reason, password)) 1581 is_continued = False 1582 if invite.getTag('invite').getTag('continue'): 1583 is_continued = True 1584 self.dispatch('GC_INVITATION',(frm, jid_from, reason, password, 1585 is_continued)) 1578 1586 return 1579 1587 if self.name not in no_log_for and jid not in no_log_for and msgtxt: -
trunk/src/common/connection.py
r8513 r8535 1202 1202 self.connection.send(p) 1203 1203 1204 def check_unique_room_id_support(self, server, instance): 1205 if not self.connection: 1206 return 1207 iq = common.xmpp.Iq(typ = 'get', to = server) 1208 iq.setAttr('id', 'unique1') 1209 iq.addChild('unique', namespace=common.xmpp.NS_MUC_UNIQUE) 1210 def _on_response(resp): 1211 if not common.xmpp.isResultNode(resp): 1212 self.dispatch('UNIQUE_ROOM_ID_UNSUPPORTED', (server, instance)) 1213 return 1214 print resp.getTag('unique').getData() 1215 self.dispatch('UNIQUE_ROOM_ID_SUPPORTED', (server, instance, 1216 resp.getTag('unique').getData())) 1217 self.connection.SendAndCallForResponse(iq, _on_response) 1218 1204 1219 def join_gc(self, nick, room_jid, password): 1205 1220 # FIXME: This room JID needs to be normalized; see #1364 … … 1388 1403 _on_unregister_account_connect(self.connection) 1389 1404 1390 def send_invite(self, room, to, reason='' ):1405 def send_invite(self, room, to, reason='', continue_tag=False): 1391 1406 '''sends invitation''' 1392 1407 message=common.xmpp.Message(to = room) 1393 1408 c = message.addChild(name = 'x', namespace = common.xmpp.NS_MUC_USER) 1394 1409 c = c.addChild(name = 'invite', attrs={'to' : to}) 1410 if continue_tag: 1411 c.addChild(name = 'continue') 1395 1412 if reason != '': 1396 1413 c.setTagData('reason', reason) -
trunk/src/common/xmpp/protocol.py
r8410 r8535 63 63 NS_MUC_ADMIN =NS_MUC+'#admin' 64 64 NS_MUC_OWNER =NS_MUC+'#owner' 65 NS_MUC_UNIQUE =NS_MUC+'#unique' 65 66 NS_NICK ='http://jabber.org/protocol/nick' # XEP-0172 66 67 NS_OFFLINE ='http://www.jabber.org/jeps/jep-0030.html' # XEP-0013 -
trunk/src/dialogs.py
r8517 r8535 29 29 import conversation_textview 30 30 import message_control 31 32 from random import randrange 31 33 32 34 try: … … 402 404 self.countdown_enabled = False 403 405 if event.keyval == gtk.keysyms.Return or \ 404 event.keyval == gtk.keysyms.KP_Enter: # catch CTRL+ENTER406 event.keyval == gtk.keysyms.KP_Enter: # catch CTRL+ENTER 405 407 if (event.state & gtk.gdk.CONTROL_MASK): 406 408 self.window.response(gtk.RESPONSE_OK) … … 1533 1535 for jid in keys: 1534 1536 contact = self.completion_dict[jid] 1535 img = gajim.interface.roster.jabber_state_images['16'][contact.show]1537 img = gajim.interface.roster.jabber_state_images['16'][contact.show] 1536 1538 liststore.append((img.get_pixbuf(), jid)) 1537 1539 … … 2578 2580 class InvitationReceivedDialog: 2579 2581 def __init__(self, account, room_jid, contact_jid, password = None, 2580 comment = None ):2582 comment = None, is_continued = False): 2581 2583 2582 2584 self.room_jid = room_jid 2583 2585 self.account = account 2584 2586 self.password = password 2587 self.is_continued = is_continued 2585 2588 xml = gtkgui_helpers.get_glade('invitation_received_dialog.glade') 2586 2589 self.dialog = xml.get_widget('invitation_received_dialog') 2587 2590 2588 2591 #Don't translate $Contact 2589 pritext = _('$Contact has invited you to group chat %(room_jid)s')\ 2590 % {'room_jid': room_jid} 2592 if is_continued: 2593 pritext = _('$Contact has invited you to join a discussion') 2594 else: 2595 pritext = _('$Contact has invited you to group chat %(room_jid)s')\ 2596 % {'room_jid': room_jid} 2591 2597 contact = gajim.contacts.get_first_contact_from_jid(account, contact_jid) 2592 2598 if contact and contact.name: … … 2616 2622 self.dialog.destroy() 2617 2623 try: 2618 JoinGroupchatWindow(self.account, self.room_jid, 2619 password=self.password) 2624 if self.is_continued: 2625 gajim.interface.roster.join_gc_room(self.account, self.room_jid, 2626 gajim.nicks[self.account], None, is_continued=True) 2627 else: 2628 JoinGroupchatWindow(self.account, self.room_jid) 2620 2629 except GajimGeneralException: 2621 2630 pass … … 3284 3293 def on_close_window(self, widget): 3285 3294 self.window.destroy() 3295 3296 class TransformChatToMUC: 3297 def __init__(self, account, jids): 3298 '''This window is used to trasform a one-to-one chat to a MUC. 3299 We do 2 things: first select the server and then make a guests list.''' 3300 3301 self.account = account 3302 self.auto_jids = jids 3303 3304 self.xml = gtkgui_helpers.get_glade('chat_to_muc_window.glade') 3305 self.window = self.xml.get_widget('chat_to_muc_window') 3306 self.window.connect('key_press_event', self._on_keypress_event) 3307 3308 for widget_to_add in ('invite_button', 'cancel_button', 3309 'server_list_comboboxentry', 'guests_treeview', 3310 'server_and_guests_hseparator', 'server_select_label'): 3311 self.__dict__[widget_to_add] = self.xml.get_widget(widget_to_add) 3312 self.window.connect('key_press_event', self._on_keypress_event) 3313 3314 # set a list of servers which support it 3315 self.servers_support = {} 3316 3317 # set comboboxentry 3318 renderer_servers = gtk.CellRendererText() 3319 3320 server_list = [] 3321 self.servers = gtk.ListStore(str) 3322 self.server_list_comboboxentry.set_model(self.servers) 3323 3324 self.server_list_comboboxentry.set_text_column(0) 3325 3326 # get the muc server of our server 3327 if 'jabber' in gajim.connections[account].muc_jid: 3328 server_list.append(gajim.connections[account].muc_jid['jabber']) 3329 # add servers or recently joined groupchats 3330 recently_groupchat = gajim.config.get('recently_groupchat').split() 3331 for g in recently_groupchat: 3332 server = gajim.get_server_from_jid(g) 3333 if server not in server_list: 3334 server_list.append(gajim.get_server_from_jid(g)) 3335 # add a default server 3336 if not server_list: 3337 server_list.append('conference.jabber.org') 3338 3339 for s in server_list: 3340 self.servers.append([s]) 3341 3342 self.server_list_comboboxentry.set_active(0) 3343 3344 # set treeview 3345 # name, jid 3346 self.store = gtk.ListStore(str, str) 3347 self.guests_treeview.set_model(self.store) 3348 3349 renderer1 = gtk.CellRendererText() 3350 column = gtk.TreeViewColumn('Name', renderer1, text=0) 3351 self.guests_treeview.append_column(column) 3352 3353 self.guests_treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) 3354 3355 # set jabber id and pseudos 3356 for jid in gajim.contacts.get_jid_list(self.account): 3357 contact = \ 3358 gajim.contacts.get_contact_with_highest_priority(self.account, jid) 3359 if contact.jid not in self.auto_jids: 3360 if contact.show not in ('offline', 'error'): 3361 name = contact.name 3362 if name == '': 3363 name = jid.split('@')[0] 3364 self.store.append([name, jid]) 3365 3366 # show all but... 3367 self.window.show_all() 3368 3369 # ...hide this 3370 self.server_selection_visible = True 3371 self.toggle_server_selection_visible() 3372 3373 self.xml.signal_autoconnect(self) 3374 3375 def toggle_server_selection_visible(self): 3376 if self.server_selection_visible: 3377 self.server_selection_visible = False 3378 self.server_and_guests_hseparator.hide() 3379 self.server_list_comboboxentry.hide() 3380 self.server_select_label.hide() 3381 else: 3382 self.server_selection_visible = True 3383 self.server_and_guests_hseparator.show() 3384 self.server_list_comboboxentry.show() 3385 self.server_select_label.show() 3386 3387 def _on_keypress_event(self, widget, event): 3388 if (event.state & gtk.gdk.MOD1_MASK) and (event.keyval == gtk.keysyms.c \ 3389 or event.keyval == gtk.keysyms.C): 3390 self.toggle_server_selection_visible() 3391 return True 3392 3393 def on_invite_button_clicked(self, widget): 3394 server = self.server_list_comboboxentry.get_active_text() 3395 if server == '': 3396 return 3397 room_id = gajim.nicks[self.account] + str(randrange(9999999)) 3398 # if self.servers_support.has_key(server): 3399 # self.unique_room_id_supported(server, self.servers_support[server]) 3400 # return 3401 # gajim.connections[self.account].check_unique_room_id_support(server, self) 3402 3403 # def unique_room_id_supported(self, server, room_id): 3404 # if not self.servers_support.has_key(server): 3405 # self.servers_support[server] = room_id 3406 guest_list = [] 3407 guests = self.guests_treeview.get_selection().get_selected_rows() 3408 for guest in guests[1]: 3409 iter = self.store.get_iter(guest) 3410 guest_list.append(self.store[iter][1].decode('utf-8')) 3411 for guest in self.auto_jids: 3412 guest_list.append(guest) 3413 room_jid = room_id + '@' + server 3414 gajim.automatic_rooms[self.account][room_jid] = {} 3415 gajim.automatic_rooms[self.account][room_jid]['invities'] = guest_list 3416 gajim.automatic_rooms[self.account][room_jid]['continue_tag'] = True 3417 gajim.interface.roster.join_gc_room(self.account, room_jid, 3418 gajim.nicks[self.account], None, is_continued=True) 3419 self.window.destroy() 3420 3421 def on_cancel_button_clicked(self, widget): 3422 self.window.destroy() 3423 3424 def unique_room_id_error(self, server): 3425 self.unique_room_id_supported(server, 3426 gajim.nicks[self.account] + str(randrange(9999999))) -
trunk/src/gajim.py
r8476 r8535 1211 1211 gajim.connections[account].send_gc_config(room_jid, array[1]) 1212 1212 # invite contacts 1213 # check if it is necessary to add <continue /> 1214 continue_tag = False 1215 if gajim.automatic_rooms[account][room_jid].has_key('continue_tag'): 1216 continue_tag = True 1213 1217 if gajim.automatic_rooms[account][room_jid].has_key('invities'): 1214 1218 for jid in gajim.automatic_rooms[account][room_jid]['invities']: 1215 gajim.connections[account].send_invite(room_jid, jid) 1219 gajim.connections[account].send_invite(room_jid, jid, 1220 continue_tag=continue_tag) 1216 1221 del gajim.automatic_rooms[account][room_jid] 1217 1222 elif not self.instances[account]['gc_config'].has_key(room_jid): … … 1290 1295 1291 1296 def handle_event_gc_invitation(self, account, array): 1292 #('GC_INVITATION', (room_jid, jid_from, reason, password ))1297 #('GC_INVITATION', (room_jid, jid_from, reason, password, is_continued)) 1293 1298 jid = gajim.get_jid_without_resource(array[1]) 1294 1299 room_jid = array[0] 1295 1300 if helpers.allow_popup_window(account) or not self.systray_enabled: 1296 1301 dialogs.InvitationReceivedDialog(account, room_jid, jid, array[3], 1297 array[2] )1302 array[2], is_continued=array[4]) 1298 1303 return 1299 1304 1300 1305 self.add_event(account, jid, 'gc-invitation', (room_jid, array[2], 1301 array[3] ))1306 array[3], array[4])) 1302 1307 1303 1308 if helpers.allow_showing_notification(account): … … 1867 1872 _('You are already connected to this account with the same resource. Please type a new one'), input_str = gajim.connections[account].server_resource, 1868 1873 is_modal = False, ok_handler = on_ok) 1874 1875 def handle_event_unique_room_id_supported(self, account, data): 1876 '''Receive confirmation that unique_room_id are supported''' 1877 # ('UNIQUE_ROOM_ID_SUPPORTED', server, instance, room_id) 1878 instance = data[1] 1879 instance.unique_room_id_supported(data[0], data[2]) 1880 1881 def handle_event_unique_room_id_unsupported(self, account, data): 1882 # ('UNIQUE_ROOM_ID_UNSUPPORTED', server, instance) 1883 instance = data[1] 1884 instance.unique_room_id_error(data[0]) 1869 1885 1870 1886 def read_sleepy(self): … … 2196 2212 'SEARCH_RESULT': self.handle_event_search_result, 2197 2213 'RESOURCE_CONFLICT': self.handle_event_resource_conflict, 2214 'UNIQUE_ROOM_ID_UNSUPPORTED': \ 2215 self.handle_event_unique_room_id_unsupported, 2216 'UNIQUE_ROOM_ID_SUPPORTED': self.handle_event_unique_room_id_supported, 2198 2217 } 2199 2218 gajim.handlers = self.handlers … … 2288 2307 data = event.parameters 2289 2308 dialogs.InvitationReceivedDialog(account, data[0], jid, data[2], 2290 data[1] )2309 data[1], data[3]) 2291 2310 gajim.events.remove_events(account, jid, event) 2292 2311 self.roster.draw_contact(jid, account) -
trunk/src/groupchat_control.py
r8505 r8535 154 154 'part', 'names', 'say', 'topic'] 155 155
