new tabbed_chat window
if USE_TABBED_CHAT is set to 1, all chats are in a single window with tabs
This commit is contained in:
		
							parent
							
								
									9a20efc2db
								
							
						
					
					
						commit
						5ad779b0d9
					
				
					 2 changed files with 735 additions and 25 deletions
				
			
		| 
						 | 
					@ -9171,4 +9171,418 @@ on the server.</property>
 | 
				
			||||||
  </child>
 | 
					  </child>
 | 
				
			||||||
</widget>
 | 
					</widget>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<widget class="GtkWindow" id="tabbed_chat">
 | 
				
			||||||
 | 
					  <property name="visible">True</property>
 | 
				
			||||||
 | 
					  <property name="title" translatable="yes">Chat</property>
 | 
				
			||||||
 | 
					  <property name="type">GTK_WINDOW_TOPLEVEL</property>
 | 
				
			||||||
 | 
					  <property name="window_position">GTK_WIN_POS_NONE</property>
 | 
				
			||||||
 | 
					  <property name="modal">False</property>
 | 
				
			||||||
 | 
					  <property name="default_width">400</property>
 | 
				
			||||||
 | 
					  <property name="default_height">320</property>
 | 
				
			||||||
 | 
					  <property name="resizable">True</property>
 | 
				
			||||||
 | 
					  <property name="destroy_with_parent">False</property>
 | 
				
			||||||
 | 
					  <property name="decorated">True</property>
 | 
				
			||||||
 | 
					  <property name="skip_taskbar_hint">False</property>
 | 
				
			||||||
 | 
					  <property name="skip_pager_hint">False</property>
 | 
				
			||||||
 | 
					  <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
 | 
				
			||||||
 | 
					  <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
 | 
				
			||||||
 | 
					  <signal name="destroy" handler="gtk_widget_destroy" last_modification_time="Thu, 27 Jan 2005 08:30:06 GMT"/>
 | 
				
			||||||
 | 
					  <signal name="focus_in_event" handler="on_focus" last_modification_time="Thu, 27 Jan 2005 08:30:54 GMT"/>
 | 
				
			||||||
 | 
					  <signal name="key_press_event" handler="on_chat_key_press_event" last_modification_time="Thu, 27 Jan 2005 08:31:21 GMT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <child>
 | 
				
			||||||
 | 
					    <widget class="GtkVBox" id="vbox50">
 | 
				
			||||||
 | 
					      <property name="visible">True</property>
 | 
				
			||||||
 | 
					      <property name="homogeneous">False</property>
 | 
				
			||||||
 | 
					      <property name="spacing">0</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <child>
 | 
				
			||||||
 | 
						<widget class="GtkHButtonBox" id="hbuttonbox">
 | 
				
			||||||
 | 
						  <property name="visible">True</property>
 | 
				
			||||||
 | 
						  <property name="layout_style">GTK_BUTTONBOX_START</property>
 | 
				
			||||||
 | 
						  <property name="spacing">0</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  <child>
 | 
				
			||||||
 | 
						    <widget class="GtkButton" id="button_jid">
 | 
				
			||||||
 | 
						      <property name="visible">True</property>
 | 
				
			||||||
 | 
						      <property name="can_default">True</property>
 | 
				
			||||||
 | 
						      <property name="can_focus">True</property>
 | 
				
			||||||
 | 
						      <property name="label" translatable="yes">jid</property>
 | 
				
			||||||
 | 
						      <property name="use_underline">True</property>
 | 
				
			||||||
 | 
						      <property name="relief">GTK_RELIEF_NONE</property>
 | 
				
			||||||
 | 
						      <property name="focus_on_click">True</property>
 | 
				
			||||||
 | 
						      <signal name="clicked" handler="on_button_jid_clicked" last_modification_time="Thu, 27 Jan 2005 08:57:52 GMT"/>
 | 
				
			||||||
 | 
						    </widget>
 | 
				
			||||||
 | 
						  </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  <child>
 | 
				
			||||||
 | 
						    <widget class="GtkButton" id="button_close">
 | 
				
			||||||
 | 
						      <property name="visible">True</property>
 | 
				
			||||||
 | 
						      <property name="can_default">True</property>
 | 
				
			||||||
 | 
						      <property name="can_focus">True</property>
 | 
				
			||||||
 | 
						      <property name="relief">GTK_RELIEF_NONE</property>
 | 
				
			||||||
 | 
						      <property name="focus_on_click">True</property>
 | 
				
			||||||
 | 
						      <signal name="clicked" handler="on_button_close_clicked" last_modification_time="Thu, 27 Jan 2005 09:55:53 GMT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkImage" id="image183">
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
							  <property name="stock">gtk-close</property>
 | 
				
			||||||
 | 
							  <property name="icon_size">4</property>
 | 
				
			||||||
 | 
							  <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
							  <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
							  <property name="xpad">0</property>
 | 
				
			||||||
 | 
							  <property name="ypad">0</property>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
						    </widget>
 | 
				
			||||||
 | 
						  </child>
 | 
				
			||||||
 | 
						</widget>
 | 
				
			||||||
 | 
						<packing>
 | 
				
			||||||
 | 
						  <property name="padding">0</property>
 | 
				
			||||||
 | 
						  <property name="expand">False</property>
 | 
				
			||||||
 | 
						  <property name="fill">True</property>
 | 
				
			||||||
 | 
						</packing>
 | 
				
			||||||
 | 
					      </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <child>
 | 
				
			||||||
 | 
						<widget class="GtkVBox" id="vbox51">
 | 
				
			||||||
 | 
						  <property name="border_width">5</property>
 | 
				
			||||||
 | 
						  <property name="visible">True</property>
 | 
				
			||||||
 | 
						  <property name="homogeneous">False</property>
 | 
				
			||||||
 | 
						  <property name="spacing">0</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  <child>
 | 
				
			||||||
 | 
						    <widget class="GtkHBox" id="hbox2907">
 | 
				
			||||||
 | 
						      <property name="border_width">5</property>
 | 
				
			||||||
 | 
						      <property name="visible">True</property>
 | 
				
			||||||
 | 
						      <property name="homogeneous">False</property>
 | 
				
			||||||
 | 
						      <property name="spacing">5</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkButton" id="button_history">
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
							  <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							  <property name="relief">GTK_RELIEF_NORMAL</property>
 | 
				
			||||||
 | 
							  <property name="focus_on_click">True</property>
 | 
				
			||||||
 | 
							  <signal name="clicked" handler="on_history_clicked" last_modification_time="Sun, 04 Apr 2004 05:30:58 GMT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							  <child>
 | 
				
			||||||
 | 
							    <widget class="GtkAlignment" id="alignment36">
 | 
				
			||||||
 | 
							      <property name="visible">True</property>
 | 
				
			||||||
 | 
							      <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
							      <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
							      <property name="xscale">0</property>
 | 
				
			||||||
 | 
							      <property name="yscale">0</property>
 | 
				
			||||||
 | 
							      <property name="top_padding">0</property>
 | 
				
			||||||
 | 
							      <property name="bottom_padding">0</property>
 | 
				
			||||||
 | 
							      <property name="left_padding">0</property>
 | 
				
			||||||
 | 
							      <property name="right_padding">0</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							      <child>
 | 
				
			||||||
 | 
								<widget class="GtkHBox" id="hbox2908">
 | 
				
			||||||
 | 
								  <property name="visible">True</property>
 | 
				
			||||||
 | 
								  <property name="homogeneous">False</property>
 | 
				
			||||||
 | 
								  <property name="spacing">2</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								  <child>
 | 
				
			||||||
 | 
								    <widget class="GtkImage" id="image181">
 | 
				
			||||||
 | 
								      <property name="visible">True</property>
 | 
				
			||||||
 | 
								      <property name="stock">gtk-justify-fill</property>
 | 
				
			||||||
 | 
								      <property name="icon_size">4</property>
 | 
				
			||||||
 | 
								      <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="xpad">0</property>
 | 
				
			||||||
 | 
								      <property name="ypad">0</property>
 | 
				
			||||||
 | 
								    </widget>
 | 
				
			||||||
 | 
								    <packing>
 | 
				
			||||||
 | 
								      <property name="padding">0</property>
 | 
				
			||||||
 | 
								      <property name="expand">False</property>
 | 
				
			||||||
 | 
								      <property name="fill">False</property>
 | 
				
			||||||
 | 
								    </packing>
 | 
				
			||||||
 | 
								  </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								  <child>
 | 
				
			||||||
 | 
								    <widget class="GtkLabel" id="label183">
 | 
				
			||||||
 | 
								      <property name="visible">True</property>
 | 
				
			||||||
 | 
								      <property name="label" translatable="yes">History</property>
 | 
				
			||||||
 | 
								      <property name="use_underline">True</property>
 | 
				
			||||||
 | 
								      <property name="use_markup">False</property>
 | 
				
			||||||
 | 
								      <property name="justify">GTK_JUSTIFY_LEFT</property>
 | 
				
			||||||
 | 
								      <property name="wrap">False</property>
 | 
				
			||||||
 | 
								      <property name="selectable">False</property>
 | 
				
			||||||
 | 
								      <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="xpad">0</property>
 | 
				
			||||||
 | 
								      <property name="ypad">0</property>
 | 
				
			||||||
 | 
								    </widget>
 | 
				
			||||||
 | 
								    <packing>
 | 
				
			||||||
 | 
								      <property name="padding">0</property>
 | 
				
			||||||
 | 
								      <property name="expand">False</property>
 | 
				
			||||||
 | 
								      <property name="fill">False</property>
 | 
				
			||||||
 | 
								    </packing>
 | 
				
			||||||
 | 
								  </child>
 | 
				
			||||||
 | 
								</widget>
 | 
				
			||||||
 | 
							      </child>
 | 
				
			||||||
 | 
							    </widget>
 | 
				
			||||||
 | 
							  </child>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
							<packing>
 | 
				
			||||||
 | 
							  <property name="padding">0</property>
 | 
				
			||||||
 | 
							  <property name="expand">False</property>
 | 
				
			||||||
 | 
							  <property name="fill">False</property>
 | 
				
			||||||
 | 
							</packing>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkButton" id="button_clear">
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
							  <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							  <property name="relief">GTK_RELIEF_NORMAL</property>
 | 
				
			||||||
 | 
							  <property name="focus_on_click">True</property>
 | 
				
			||||||
 | 
							  <signal name="clicked" handler="on_clear_clicked" last_modification_time="Thu, 18 Mar 2004 19:12:00 GMT"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							  <child>
 | 
				
			||||||
 | 
							    <widget class="GtkAlignment" id="alignment37">
 | 
				
			||||||
 | 
							      <property name="visible">True</property>
 | 
				
			||||||
 | 
							      <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
							      <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
							      <property name="xscale">0</property>
 | 
				
			||||||
 | 
							      <property name="yscale">0</property>
 | 
				
			||||||
 | 
							      <property name="top_padding">0</property>
 | 
				
			||||||
 | 
							      <property name="bottom_padding">0</property>
 | 
				
			||||||
 | 
							      <property name="left_padding">0</property>
 | 
				
			||||||
 | 
							      <property name="right_padding">0</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							      <child>
 | 
				
			||||||
 | 
								<widget class="GtkHBox" id="hbox2909">
 | 
				
			||||||
 | 
								  <property name="visible">True</property>
 | 
				
			||||||
 | 
								  <property name="homogeneous">False</property>
 | 
				
			||||||
 | 
								  <property name="spacing">2</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								  <child>
 | 
				
			||||||
 | 
								    <widget class="GtkImage" id="image182">
 | 
				
			||||||
 | 
								      <property name="visible">True</property>
 | 
				
			||||||
 | 
								      <property name="stock">gtk-clear</property>
 | 
				
			||||||
 | 
								      <property name="icon_size">4</property>
 | 
				
			||||||
 | 
								      <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="xpad">0</property>
 | 
				
			||||||
 | 
								      <property name="ypad">0</property>
 | 
				
			||||||
 | 
								    </widget>
 | 
				
			||||||
 | 
								    <packing>
 | 
				
			||||||
 | 
								      <property name="padding">0</property>
 | 
				
			||||||
 | 
								      <property name="expand">False</property>
 | 
				
			||||||
 | 
								      <property name="fill">False</property>
 | 
				
			||||||
 | 
								    </packing>
 | 
				
			||||||
 | 
								  </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								  <child>
 | 
				
			||||||
 | 
								    <widget class="GtkLabel" id="label184">
 | 
				
			||||||
 | 
								      <property name="visible">True</property>
 | 
				
			||||||
 | 
								      <property name="label" translatable="yes">Clear</property>
 | 
				
			||||||
 | 
								      <property name="use_underline">True</property>
 | 
				
			||||||
 | 
								      <property name="use_markup">False</property>
 | 
				
			||||||
 | 
								      <property name="justify">GTK_JUSTIFY_LEFT</property>
 | 
				
			||||||
 | 
								      <property name="wrap">False</property>
 | 
				
			||||||
 | 
								      <property name="selectable">False</property>
 | 
				
			||||||
 | 
								      <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
								      <property name="xpad">0</property>
 | 
				
			||||||
 | 
								      <property name="ypad">0</property>
 | 
				
			||||||
 | 
								    </widget>
 | 
				
			||||||
 | 
								    <packing>
 | 
				
			||||||
 | 
								      <property name="padding">0</property>
 | 
				
			||||||
 | 
								      <property name="expand">False</property>
 | 
				
			||||||
 | 
								      <property name="fill">False</property>
 | 
				
			||||||
 | 
								    </packing>
 | 
				
			||||||
 | 
								  </child>
 | 
				
			||||||
 | 
								</widget>
 | 
				
			||||||
 | 
							      </child>
 | 
				
			||||||
 | 
							    </widget>
 | 
				
			||||||
 | 
							  </child>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
							<packing>
 | 
				
			||||||
 | 
							  <property name="padding">0</property>
 | 
				
			||||||
 | 
							  <property name="expand">False</property>
 | 
				
			||||||
 | 
							  <property name="fill">False</property>
 | 
				
			||||||
 | 
							</packing>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkImage" id="image_status">
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
							  <property name="stock">gtk-no</property>
 | 
				
			||||||
 | 
							  <property name="icon_size">4</property>
 | 
				
			||||||
 | 
							  <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
							  <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
							  <property name="xpad">0</property>
 | 
				
			||||||
 | 
							  <property name="ypad">0</property>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
							<packing>
 | 
				
			||||||
 | 
							  <property name="padding">0</property>
 | 
				
			||||||
 | 
							  <property name="expand">False</property>
 | 
				
			||||||
 | 
							  <property name="fill">False</property>
 | 
				
			||||||
 | 
							</packing>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkToggleButton" id="toggle_gpg">
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
							  <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							  <property name="relief">GTK_RELIEF_NONE</property>
 | 
				
			||||||
 | 
							  <property name="focus_on_click">False</property>
 | 
				
			||||||
 | 
							  <property name="active">False</property>
 | 
				
			||||||
 | 
							  <property name="inconsistent">False</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							  <child>
 | 
				
			||||||
 | 
							    <widget class="GtkImage" id="image_gpg">
 | 
				
			||||||
 | 
							      <property name="visible">True</property>
 | 
				
			||||||
 | 
							      <property name="stock">gtk-dialog-authentication</property>
 | 
				
			||||||
 | 
							      <property name="icon_size">4</property>
 | 
				
			||||||
 | 
							      <property name="xalign">0.5</property>
 | 
				
			||||||
 | 
							      <property name="yalign">0.5</property>
 | 
				
			||||||
 | 
							      <property name="xpad">0</property>
 | 
				
			||||||
 | 
							      <property name="ypad">0</property>
 | 
				
			||||||
 | 
							    </widget>
 | 
				
			||||||
 | 
							  </child>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
							<packing>
 | 
				
			||||||
 | 
							  <property name="padding">0</property>
 | 
				
			||||||
 | 
							  <property name="expand">False</property>
 | 
				
			||||||
 | 
							  <property name="fill">False</property>
 | 
				
			||||||
 | 
							</packing>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkFixed" id="fixed2">
 | 
				
			||||||
 | 
							  <property name="width_request">20</property>
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							  <child>
 | 
				
			||||||
 | 
							    <widget class="GtkButton" id="button_contact">
 | 
				
			||||||
 | 
							      <property name="width_request">0</property>
 | 
				
			||||||
 | 
							      <property name="height_request">0</property>
 | 
				
			||||||
 | 
							      <property name="visible">True</property>
 | 
				
			||||||
 | 
							      <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							      <property name="label" translatable="yes">Anonymous <id@server/res></property>
 | 
				
			||||||
 | 
							      <property name="use_underline">True</property>
 | 
				
			||||||
 | 
							      <property name="relief">GTK_RELIEF_NONE</property>
 | 
				
			||||||
 | 
							      <property name="focus_on_click">True</property>
 | 
				
			||||||
 | 
							      <signal name="clicked" handler="on_button_contact_clicked" last_modification_time="Sun, 15 Feb 2004 14:26:53 GMT"/>
 | 
				
			||||||
 | 
							    </widget>
 | 
				
			||||||
 | 
							    <packing>
 | 
				
			||||||
 | 
							      <property name="x">0</property>
 | 
				
			||||||
 | 
							      <property name="y">0</property>
 | 
				
			||||||
 | 
							    </packing>
 | 
				
			||||||
 | 
							  </child>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
							<packing>
 | 
				
			||||||
 | 
							  <property name="padding">0</property>
 | 
				
			||||||
 | 
							  <property name="expand">True</property>
 | 
				
			||||||
 | 
							  <property name="fill">True</property>
 | 
				
			||||||
 | 
							</packing>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
						    </widget>
 | 
				
			||||||
 | 
						    <packing>
 | 
				
			||||||
 | 
						      <property name="padding">0</property>
 | 
				
			||||||
 | 
						      <property name="expand">False</property>
 | 
				
			||||||
 | 
						      <property name="fill">True</property>
 | 
				
			||||||
 | 
						    </packing>
 | 
				
			||||||
 | 
						  </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						  <child>
 | 
				
			||||||
 | 
						    <widget class="GtkVPaned" id="vpaned3">
 | 
				
			||||||
 | 
						      <property name="visible">True</property>
 | 
				
			||||||
 | 
						      <property name="can_focus">True</property>
 | 
				
			||||||
 | 
						      <property name="position">170</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkScrolledWindow" id="scrolledwindow27">
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
							  <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
 | 
				
			||||||
 | 
							  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
 | 
				
			||||||
 | 
							  <property name="shadow_type">GTK_SHADOW_IN</property>
 | 
				
			||||||
 | 
							  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							  <child>
 | 
				
			||||||
 | 
							    <widget class="GtkTextView" id="conversation">
 | 
				
			||||||
 | 
							      <property name="visible">True</property>
 | 
				
			||||||
 | 
							      <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							      <property name="editable">False</property>
 | 
				
			||||||
 | 
							      <property name="overwrite">False</property>
 | 
				
			||||||
 | 
							      <property name="accepts_tab">True</property>
 | 
				
			||||||
 | 
							      <property name="justification">GTK_JUSTIFY_LEFT</property>
 | 
				
			||||||
 | 
							      <property name="wrap_mode">GTK_WRAP_WORD</property>
 | 
				
			||||||
 | 
							      <property name="cursor_visible">False</property>
 | 
				
			||||||
 | 
							      <property name="pixels_above_lines">0</property>
 | 
				
			||||||
 | 
							      <property name="pixels_below_lines">0</property>
 | 
				
			||||||
 | 
							      <property name="pixels_inside_wrap">0</property>
 | 
				
			||||||
 | 
							      <property name="left_margin">0</property>
 | 
				
			||||||
 | 
							      <property name="right_margin">0</property>
 | 
				
			||||||
 | 
							      <property name="indent">0</property>
 | 
				
			||||||
 | 
							      <property name="text" translatable="yes"></property>
 | 
				
			||||||
 | 
							    </widget>
 | 
				
			||||||
 | 
							  </child>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
							<packing>
 | 
				
			||||||
 | 
							  <property name="shrink">True</property>
 | 
				
			||||||
 | 
							  <property name="resize">True</property>
 | 
				
			||||||
 | 
							</packing>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						      <child>
 | 
				
			||||||
 | 
							<widget class="GtkScrolledWindow" id="scrolledwindow28">
 | 
				
			||||||
 | 
							  <property name="visible">True</property>
 | 
				
			||||||
 | 
							  <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							  <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
 | 
				
			||||||
 | 
							  <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
 | 
				
			||||||
 | 
							  <property name="shadow_type">GTK_SHADOW_IN</property>
 | 
				
			||||||
 | 
							  <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							  <child>
 | 
				
			||||||
 | 
							    <widget class="GtkTextView" id="message">
 | 
				
			||||||
 | 
							      <property name="visible">True</property>
 | 
				
			||||||
 | 
							      <property name="can_focus">True</property>
 | 
				
			||||||
 | 
							      <property name="editable">True</property>
 | 
				
			||||||
 | 
							      <property name="overwrite">False</property>
 | 
				
			||||||
 | 
							      <property name="accepts_tab">True</property>
 | 
				
			||||||
 | 
							      <property name="justification">GTK_JUSTIFY_LEFT</property>
 | 
				
			||||||
 | 
							      <property name="wrap_mode">GTK_WRAP_WORD</property>
 | 
				
			||||||
 | 
							      <property name="cursor_visible">True</property>
 | 
				
			||||||
 | 
							      <property name="pixels_above_lines">0</property>
 | 
				
			||||||
 | 
							      <property name="pixels_below_lines">0</property>
 | 
				
			||||||
 | 
							      <property name="pixels_inside_wrap">0</property>
 | 
				
			||||||
 | 
							      <property name="left_margin">0</property>
 | 
				
			||||||
 | 
							      <property name="right_margin">0</property>
 | 
				
			||||||
 | 
							      <property name="indent">0</property>
 | 
				
			||||||
 | 
							      <property name="text" translatable="yes"></property>
 | 
				
			||||||
 | 
							      <signal name="key_press_event" handler="on_msg_key_press_event" last_modification_time="Mon, 13 Oct 2003 17:48:48 GMT"/>
 | 
				
			||||||
 | 
							    </widget>
 | 
				
			||||||
 | 
							  </child>
 | 
				
			||||||
 | 
							</widget>
 | 
				
			||||||
 | 
							<packing>
 | 
				
			||||||
 | 
							  <property name="shrink">True</property>
 | 
				
			||||||
 | 
							  <property name="resize">True</property>
 | 
				
			||||||
 | 
							</packing>
 | 
				
			||||||
 | 
						      </child>
 | 
				
			||||||
 | 
						    </widget>
 | 
				
			||||||
 | 
						    <packing>
 | 
				
			||||||
 | 
						      <property name="padding">0</property>
 | 
				
			||||||
 | 
						      <property name="expand">True</property>
 | 
				
			||||||
 | 
						      <property name="fill">True</property>
 | 
				
			||||||
 | 
						    </packing>
 | 
				
			||||||
 | 
						  </child>
 | 
				
			||||||
 | 
						</widget>
 | 
				
			||||||
 | 
						<packing>
 | 
				
			||||||
 | 
						  <property name="padding">0</property>
 | 
				
			||||||
 | 
						  <property name="expand">True</property>
 | 
				
			||||||
 | 
						  <property name="fill">True</property>
 | 
				
			||||||
 | 
						</packing>
 | 
				
			||||||
 | 
					      </child>
 | 
				
			||||||
 | 
					    </widget>
 | 
				
			||||||
 | 
					  </child>
 | 
				
			||||||
 | 
					</widget>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</glade-interface>
 | 
					</glade-interface>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,6 +67,7 @@ from config import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
 | 
					GTKGUI_GLADE='plugins/gtkgui/gtkgui.glade'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					USE_TABBED_CHAT = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ImageCellRenderer(gtk.GenericCellRenderer):
 | 
					class ImageCellRenderer(gtk.GenericCellRenderer):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -180,6 +181,297 @@ class user:
 | 
				
			||||||
			self.keyID = args[9]
 | 
								self.keyID = args[9]
 | 
				
			||||||
		else: raise TypeError, _('bad arguments')
 | 
							else: raise TypeError, _('bad arguments')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class tabbed_chat_Window:
 | 
				
			||||||
 | 
						"""Class for tabbed chat window"""
 | 
				
			||||||
 | 
						def __init__(self, user, plugin, account):
 | 
				
			||||||
 | 
							self.xml = gtk.glade.XML(GTKGUI_GLADE, 'tabbed_chat', APP)
 | 
				
			||||||
 | 
							button = self.xml.get_widget('button_jid')
 | 
				
			||||||
 | 
							button.set_use_underline(FALSE)
 | 
				
			||||||
 | 
							conversation = self.xml.get_widget('conversation')
 | 
				
			||||||
 | 
							buffer_conv = conversation.get_buffer()
 | 
				
			||||||
 | 
							message = self.xml.get_widget('message')
 | 
				
			||||||
 | 
							message.grab_focus()
 | 
				
			||||||
 | 
							buffer_msg = message.get_buffer()
 | 
				
			||||||
 | 
							end_iter = buffer_conv.get_end_iter()
 | 
				
			||||||
 | 
							buffer_conv.create_mark('end', end_iter, 0)
 | 
				
			||||||
 | 
							button_close = self.xml.get_widget('button_close')
 | 
				
			||||||
 | 
							self.xml.get_widget('hbuttonbox').set_child_secondary(button_close, TRUE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							self.plugin = plugin
 | 
				
			||||||
 | 
							self.account = account
 | 
				
			||||||
 | 
							self.active_button = button
 | 
				
			||||||
 | 
							self.users = {button: user}
 | 
				
			||||||
 | 
							self.buffers = {button: [buffer_conv, buffer_msg]}
 | 
				
			||||||
 | 
							self.nb_unread = {button: 0}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							self.redraw_button(button)
 | 
				
			||||||
 | 
							self.window = self.xml.get_widget('tabbed_chat')
 | 
				
			||||||
 | 
							self.show_title()
 | 
				
			||||||
 | 
							self.redraw_widgets()
 | 
				
			||||||
 | 
							self.xml.signal_connect('gtk_widget_destroy', self.delete_event)
 | 
				
			||||||
 | 
							self.xml.signal_connect('on_clear_clicked', self.on_clear)
 | 
				
			||||||
 | 
							self.xml.signal_connect('on_focus', self.on_focus)
 | 
				
			||||||
 | 
							self.xml.signal_connect('on_history_clicked', self.on_history)
 | 
				
			||||||
 | 
							self.xml.signal_connect('on_button_jid_clicked', 
 | 
				
			||||||
 | 
								self.on_button_jid_clicked)
 | 
				
			||||||
 | 
							self.xml.signal_connect('on_button_close_clicked', 
 | 
				
			||||||
 | 
								self.on_button_close_clicked)
 | 
				
			||||||
 | 
							self.xml.signal_connect('on_msg_key_press_event', \
 | 
				
			||||||
 | 
								self.on_msg_key_press_event)
 | 
				
			||||||
 | 
							self.xml.signal_connect('on_chat_key_press_event', \
 | 
				
			||||||
 | 
								self.on_chat_key_press_event)
 | 
				
			||||||
 | 
							self.tagIn = buffer_conv.create_tag("incoming")
 | 
				
			||||||
 | 
							color = self.plugin.config['inmsgcolor']
 | 
				
			||||||
 | 
							self.tagIn.set_property("foreground", color)
 | 
				
			||||||
 | 
							self.tagOut = buffer_conv.create_tag("outgoing")
 | 
				
			||||||
 | 
							color = self.plugin.config['outmsgcolor']
 | 
				
			||||||
 | 
							self.tagOut.set_property("foreground", color)
 | 
				
			||||||
 | 
							self.tagStatus = buffer_conv.create_tag("status")
 | 
				
			||||||
 | 
							color = self.plugin.config['statusmsgcolor']
 | 
				
			||||||
 | 
							self.tagStatus.set_property("foreground", color)
 | 
				
			||||||
 | 
							self.tag_table = gtk.TextTagTable()
 | 
				
			||||||
 | 
							tag = gtk.TextTag("incoming")
 | 
				
			||||||
 | 
							color = self.plugin.config['inmsgcolor']
 | 
				
			||||||
 | 
							tag.set_property("foreground", color)
 | 
				
			||||||
 | 
							self.tag_table.add(tag)
 | 
				
			||||||
 | 
							tag = gtk.TextTag("outgoing")
 | 
				
			||||||
 | 
							color = self.plugin.config['outmsgcolor']
 | 
				
			||||||
 | 
							tag.set_property("foreground", color)
 | 
				
			||||||
 | 
							self.tag_table.add(tag)
 | 
				
			||||||
 | 
							tag = gtk.TextTag("status")
 | 
				
			||||||
 | 
							color = self.plugin.config['statusmsgcolor']
 | 
				
			||||||
 | 
							tag.set_property("foreground", color)
 | 
				
			||||||
 | 
							self.tag_table.add(tag)
 | 
				
			||||||
 | 
							#print queued messages
 | 
				
			||||||
 | 
							if plugin.queues[account].has_key(user.jid):
 | 
				
			||||||
 | 
								self.read_queue(plugin.queues[account][user.jid])
 | 
				
			||||||
 | 
							if user.show != 'online':
 | 
				
			||||||
 | 
								self.print_conversation(_("%s is now %s (%s)") % (user.name, \
 | 
				
			||||||
 | 
									user.show, user.status), user.jid, 'status')
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						def show_title(self):
 | 
				
			||||||
 | 
							unread = 0
 | 
				
			||||||
 | 
							for button in self.nb_unread:
 | 
				
			||||||
 | 
								unread += self.nb_unread[button]
 | 
				
			||||||
 | 
							start = ""
 | 
				
			||||||
 | 
							if unread > 1:
 | 
				
			||||||
 | 
								start = "[" + str(unread) + "] "
 | 
				
			||||||
 | 
							elif unread == 1:
 | 
				
			||||||
 | 
								start = "* "
 | 
				
			||||||
 | 
							self.window.set_title(start + "Chat (" + self.account + ")")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def redraw_widgets(self):
 | 
				
			||||||
 | 
							user = self.users[self.active_button]
 | 
				
			||||||
 | 
							widget_img = self.xml.get_widget('image_status')
 | 
				
			||||||
 | 
							image = self.plugin.roster.pixbufs[user.show]
 | 
				
			||||||
 | 
							if image.get_storage_type() == gtk.IMAGE_ANIMATION:
 | 
				
			||||||
 | 
								widget_img.set_from_animation(image.get_animation())
 | 
				
			||||||
 | 
							elif image.get_storage_type() == gtk.IMAGE_PIXBUF:
 | 
				
			||||||
 | 
								widget_img.set_from_pixbuf(image.get_pixbuf())
 | 
				
			||||||
 | 
							self.xml.get_widget('button_contact').set_label(user.name + ' <'\
 | 
				
			||||||
 | 
							         + user.jid + '>')
 | 
				
			||||||
 | 
							if not user.keyID:
 | 
				
			||||||
 | 
								self.xml.get_widget('toggle_gpg').set_sensitive(False)
 | 
				
			||||||
 | 
							conversation = self.xml.get_widget('conversation')
 | 
				
			||||||
 | 
							conversation.set_buffer(self.buffers[self.active_button][0])
 | 
				
			||||||
 | 
							message = self.xml.get_widget('message')
 | 
				
			||||||
 | 
							message.set_buffer(self.buffers[self.active_button][1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def redraw_button(self, button):
 | 
				
			||||||
 | 
							start = ''
 | 
				
			||||||
 | 
							if self.nb_unread[button] > 1:
 | 
				
			||||||
 | 
								start = "[" + str(self.nb_unread[button]) + "] "
 | 
				
			||||||
 | 
							elif self.nb_unread[button] == 1:
 | 
				
			||||||
 | 
								start = "* "
 | 
				
			||||||
 | 
							button.set_label(start + self.users[button].name)
 | 
				
			||||||
 | 
							#TODO: change button's color
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def delete_event(self, widget):
 | 
				
			||||||
 | 
							"""close window"""
 | 
				
			||||||
 | 
							#clean self.plugin.windows[self.account]['chats']
 | 
				
			||||||
 | 
							for button in self.xml.get_widget('hbuttonbox').get_children():
 | 
				
			||||||
 | 
								if self.users.has_key(button):
 | 
				
			||||||
 | 
									del self.plugin.windows[self.account]['chats'][self.users[button]. \
 | 
				
			||||||
 | 
										jid]
 | 
				
			||||||
 | 
							del self.plugin.windows[self.account]['chats']['tabbed']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def on_clear(self, widget):
 | 
				
			||||||
 | 
							"""When clear button is pressed :
 | 
				
			||||||
 | 
							clear the conversation"""
 | 
				
			||||||
 | 
							buffer = self.xml.get_widget('conversation').get_buffer()
 | 
				
			||||||
 | 
							deb, end = buffer.get_bounds()
 | 
				
			||||||
 | 
							buffer.delete(deb, end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def on_focus(self, widget, event):
 | 
				
			||||||
 | 
							"""When window get focus"""
 | 
				
			||||||
 | 
							user = self.users[self.active_button]
 | 
				
			||||||
 | 
							self.plugin.systray.remove_jid(user.jid, self.account)
 | 
				
			||||||
 | 
							if self.nb_unread[self.active_button] > 0:
 | 
				
			||||||
 | 
								self.nb_unread[self.active_button] = 0
 | 
				
			||||||
 | 
								self.redraw_button(self.active_button)
 | 
				
			||||||
 | 
								self.show_title()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def on_history(self, widget):
 | 
				
			||||||
 | 
							"""When history button is pressed : call log window"""
 | 
				
			||||||
 | 
							user = self.users[self.active_button]
 | 
				
			||||||
 | 
							if not self.plugin.windows['logs'].has_key(user.jid):
 | 
				
			||||||
 | 
								self.plugin.windows['logs'][user.jid] = log_Window(self.plugin, 
 | 
				
			||||||
 | 
									user.jid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def on_button_jid_clicked(self, button):
 | 
				
			||||||
 | 
							old_active = self.active_button
 | 
				
			||||||
 | 
							self.active_button = button
 | 
				
			||||||
 | 
							if self.users.has_key(old_active):
 | 
				
			||||||
 | 
								self.redraw_button(old_active)
 | 
				
			||||||
 | 
							if self.nb_unread[button] > 0:
 | 
				
			||||||
 | 
								self.nb_unread[button] = 0
 | 
				
			||||||
 | 
								self.show_title()
 | 
				
			||||||
 | 
								user = self.users[self.active_button]
 | 
				
			||||||
 | 
								self.plugin.systray.remove_jid(user.jid, self.account)
 | 
				
			||||||
 | 
							self.redraw_button(button)
 | 
				
			||||||
 | 
							self.redraw_widgets()
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						def new_user(self, user):
 | 
				
			||||||
 | 
							button = gtk.Button(user.name, use_underline=FALSE)
 | 
				
			||||||
 | 
							button.set_relief(gtk.RELIEF_NONE)
 | 
				
			||||||
 | 
							button.show()
 | 
				
			||||||
 | 
							button.connect("clicked", self.on_button_jid_clicked)
 | 
				
			||||||
 | 
							self.xml.get_widget('hbuttonbox').add(button)
 | 
				
			||||||
 | 
							self.users[button] = user
 | 
				
			||||||
 | 
							buffer_conv = gtk.TextBuffer(self.tag_table)
 | 
				
			||||||
 | 
							end_iter = buffer_conv.get_end_iter()
 | 
				
			||||||
 | 
							buffer_conv.create_mark('end', end_iter, 0)
 | 
				
			||||||
 | 
							buffer_msg = gtk.TextBuffer()
 | 
				
			||||||
 | 
							self.buffers[button] = [buffer_conv, buffer_msg]
 | 
				
			||||||
 | 
							self.nb_unread[button] = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def on_button_close_clicked(self, button):
 | 
				
			||||||
 | 
							if len(self.xml.get_widget('hbuttonbox').get_children()) == 2:
 | 
				
			||||||
 | 
								button.get_toplevel().destroy()
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								self.xml.get_widget('hbuttonbox').remove(self.active_button)
 | 
				
			||||||
 | 
								del self.plugin.windows[self.account]['chats'][self.users[\
 | 
				
			||||||
 | 
									self.active_button].jid]
 | 
				
			||||||
 | 
								del self.users[self.active_button]
 | 
				
			||||||
 | 
								del self.buffers[self.active_button]
 | 
				
			||||||
 | 
								del self.nb_unread[self.active_button]
 | 
				
			||||||
 | 
								i = 0
 | 
				
			||||||
 | 
								if self.xml.get_widget('hbuttonbox').get_children()[i] == \
 | 
				
			||||||
 | 
									self.xml.get_widget('button_close'):
 | 
				
			||||||
 | 
									i = 1
 | 
				
			||||||
 | 
								self.on_button_jid_clicked(self.xml.get_widget('hbuttonbox').\
 | 
				
			||||||
 | 
									get_children()[i])
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						def on_msg_key_press_event(self, widget, event):
 | 
				
			||||||
 | 
							"""When a key is pressed :
 | 
				
			||||||
 | 
							if enter is pressed without the shit key, message (if not empty) is sent
 | 
				
			||||||
 | 
							and printed in the conversation"""
 | 
				
			||||||
 | 
							user = self.users[self.active_button]
 | 
				
			||||||
 | 
							if event.keyval == gtk.keysyms.Return:
 | 
				
			||||||
 | 
								if (event.state & gtk.gdk.SHIFT_MASK):
 | 
				
			||||||
 | 
									return 0
 | 
				
			||||||
 | 
								txt_buffer = widget.get_buffer()
 | 
				
			||||||
 | 
								start_iter = txt_buffer.get_start_iter()
 | 
				
			||||||
 | 
								end_iter = txt_buffer.get_end_iter()
 | 
				
			||||||
 | 
								txt = txt_buffer.get_text(start_iter, end_iter, 0)
 | 
				
			||||||
 | 
								if txt != '':
 | 
				
			||||||
 | 
									keyID = ''
 | 
				
			||||||
 | 
									if self.xml.get_widget('toggle_gpg').get_active():
 | 
				
			||||||
 | 
										keyID = user.keyID
 | 
				
			||||||
 | 
									self.plugin.send('MSG', self.account, (user.jid, txt, keyID))
 | 
				
			||||||
 | 
									txt_buffer.set_text('', -1)
 | 
				
			||||||
 | 
									self.print_conversation(txt, user.jid, user.jid)
 | 
				
			||||||
 | 
									widget.grab_focus()
 | 
				
			||||||
 | 
								return 1
 | 
				
			||||||
 | 
							return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def on_chat_key_press_event(self, widget, event):
 | 
				
			||||||
 | 
							if event.keyval == gtk.keysyms.Escape:
 | 
				
			||||||
 | 
								widget.get_toplevel().destroy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def read_queue(self, q):
 | 
				
			||||||
 | 
							"""read queue and print messages containted in it"""
 | 
				
			||||||
 | 
							user = self.users[self.active_button]
 | 
				
			||||||
 | 
							while not q.empty():
 | 
				
			||||||
 | 
								evt = q.get()
 | 
				
			||||||
 | 
								self.print_conversation(evt[0], user.jid, tim = evt[1])
 | 
				
			||||||
 | 
								self.plugin.roster.nb_unread -= 1
 | 
				
			||||||
 | 
							self.plugin.roster.show_title()
 | 
				
			||||||
 | 
							del self.plugin.queues[self.account][user.jid]
 | 
				
			||||||
 | 
							self.plugin.roster.redraw_jid(user.jid, self.account)
 | 
				
			||||||
 | 
							self.plugin.systray.remove_jid(user.jid, self.account)
 | 
				
			||||||
 | 
							showOffline = self.plugin.config['showoffline']
 | 
				
			||||||
 | 
							if (user.show == 'offline' or user.show == 'error') and \
 | 
				
			||||||
 | 
								not showOffline:
 | 
				
			||||||
 | 
								if len(self.plugin.roster.contacts[self.account][user.jid]) == 1:
 | 
				
			||||||
 | 
									self.plugin.roster.remove_user(user, self.account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def print_conversation(self, txt, jid, contact = None, tim = None):
 | 
				
			||||||
 | 
							"""Print a line in the conversation :
 | 
				
			||||||
 | 
							if contact is set to status : it's a status message
 | 
				
			||||||
 | 
							if contact is set to another value : it's an outgoing message
 | 
				
			||||||
 | 
							if contact is not set : it's an incomming message"""
 | 
				
			||||||
 | 
							good_button = None
 | 
				
			||||||
 | 
							for button in self.xml.get_widget('hbuttonbox').get_children():
 | 
				
			||||||
 | 
								if self.users[button].jid == jid:
 | 
				
			||||||
 | 
									good_button = button
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
							if not good_button:
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							user = self.users[good_button]
 | 
				
			||||||
 | 
							conversation = self.xml.get_widget('conversation')
 | 
				
			||||||
 | 
							buffer = self.buffers[good_button][0]
 | 
				
			||||||
 | 
							if not txt:
 | 
				
			||||||
 | 
								txt = ""
 | 
				
			||||||
 | 
							end_iter = buffer.get_end_iter()
 | 
				
			||||||
 | 
							if not tim:
 | 
				
			||||||
 | 
								tim = time.localtime()
 | 
				
			||||||
 | 
							tims = time.strftime("[%H:%M:%S]", tim)
 | 
				
			||||||
 | 
							buffer.insert(end_iter, tims + ' ')
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							otxt = ''
 | 
				
			||||||
 | 
							ttxt = ''
 | 
				
			||||||
 | 
							if contact and contact == 'status':
 | 
				
			||||||
 | 
								tag = 'status'
 | 
				
			||||||
 | 
								ttxt = txt + '\n'
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								if contact:
 | 
				
			||||||
 | 
									tag = 'outgoing'
 | 
				
			||||||
 | 
									name = self.plugin.nicks[self.account] 
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									tag = 'incoming'
 | 
				
			||||||
 | 
									name = user.name
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								if string.find(txt, '/me ') == 0:
 | 
				
			||||||
 | 
									ttxt = name + ' ' + txt[4:] + '\n'
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									ttxt = '<' + name + '> '
 | 
				
			||||||
 | 
									otxt = txt + '\n'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							buffer.insert_with_tags_by_name(end_iter, ttxt, tag)
 | 
				
			||||||
 | 
							if len(otxt) > 0:
 | 
				
			||||||
 | 
								beg = 0
 | 
				
			||||||
 | 
								if self.plugin.config['useemoticons']:
 | 
				
			||||||
 | 
									index = 0
 | 
				
			||||||
 | 
									while index < len(otxt):
 | 
				
			||||||
 | 
										if otxt[index] in self.plugin.roster.begin_emot:
 | 
				
			||||||
 | 
											for s in self.plugin.roster.emoticons:
 | 
				
			||||||
 | 
												l = len(s)
 | 
				
			||||||
 | 
												if s == otxt[index:index+l]:
 | 
				
			||||||
 | 
													buffer.insert(end_iter, otxt[beg:index])
 | 
				
			||||||
 | 
													buffer.insert_pixbuf(end_iter, self.plugin.roster.emoticons[s])
 | 
				
			||||||
 | 
													index+=l
 | 
				
			||||||
 | 
													beg = index
 | 
				
			||||||
 | 
										index+=1
 | 
				
			||||||
 | 
								buffer.insert(end_iter, otxt[beg:])
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							#scroll to the end of the textview
 | 
				
			||||||
 | 
							conversation.scroll_to_mark(buffer.get_mark('end'), 0.1, 0, 0, 0)
 | 
				
			||||||
 | 
							if (good_button != self.active_button or not self.window.is_active()) and contact != 'status':
 | 
				
			||||||
 | 
								self.nb_unread[good_button] += 1
 | 
				
			||||||
 | 
								self.redraw_button(good_button)
 | 
				
			||||||
 | 
								self.show_title()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class message_Window:
 | 
					class message_Window:
 | 
				
			||||||
	"""Class for chat window"""
 | 
						"""Class for chat window"""
 | 
				
			||||||
| 
						 | 
					@ -187,7 +479,7 @@ class message_Window:
 | 
				
			||||||
		"""close window"""
 | 
							"""close window"""
 | 
				
			||||||
		del self.plugin.windows[self.account]['chats'][self.user.jid]
 | 
							del self.plugin.windows[self.account]['chats'][self.user.jid]
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	def print_conversation(self, txt, contact = None, tim = None):
 | 
						def print_conversation(self, txt, jid, contact = None, tim = None):
 | 
				
			||||||
		"""Print a line in the conversation :
 | 
							"""Print a line in the conversation :
 | 
				
			||||||
		if contact is set to status : it's a status message
 | 
							if contact is set to status : it's a status message
 | 
				
			||||||
		if contact is set to another value : it's an outgoing message
 | 
							if contact is set to another value : it's an outgoing message
 | 
				
			||||||
| 
						 | 
					@ -256,7 +548,7 @@ class message_Window:
 | 
				
			||||||
		"""read queue and print messages containted in it"""
 | 
							"""read queue and print messages containted in it"""
 | 
				
			||||||
		while not q.empty():
 | 
							while not q.empty():
 | 
				
			||||||
			evt = q.get()
 | 
								evt = q.get()
 | 
				
			||||||
			self.print_conversation(evt[0], tim = evt[1])
 | 
								self.print_conversation(evt[0], self.user.jid, tim = evt[1])
 | 
				
			||||||
			self.plugin.roster.nb_unread -= 1
 | 
								self.plugin.roster.nb_unread -= 1
 | 
				
			||||||
		self.plugin.roster.show_title()
 | 
							self.plugin.roster.show_title()
 | 
				
			||||||
		del self.plugin.queues[self.account][self.user.jid]
 | 
							del self.plugin.queues[self.account][self.user.jid]
 | 
				
			||||||
| 
						 | 
					@ -289,7 +581,7 @@ class message_Window:
 | 
				
			||||||
					keyID = self.keyID
 | 
										keyID = self.keyID
 | 
				
			||||||
				self.plugin.send('MSG', self.account, (self.user.jid, txt, keyID))
 | 
									self.plugin.send('MSG', self.account, (self.user.jid, txt, keyID))
 | 
				
			||||||
				txt_buffer.set_text('', -1)
 | 
									txt_buffer.set_text('', -1)
 | 
				
			||||||
				self.print_conversation(txt, self.user.jid)
 | 
									self.print_conversation(txt, self.user.jid, self.user.jid)
 | 
				
			||||||
				widget.grab_focus()
 | 
									widget.grab_focus()
 | 
				
			||||||
			return 1
 | 
								return 1
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
| 
						 | 
					@ -360,7 +652,7 @@ class message_Window:
 | 
				
			||||||
		if plugin.queues[account].has_key(user.jid):
 | 
							if plugin.queues[account].has_key(user.jid):
 | 
				
			||||||
			self.read_queue(plugin.queues[account][user.jid])
 | 
								self.read_queue(plugin.queues[account][user.jid])
 | 
				
			||||||
		if self.user.show != 'online':
 | 
							if self.user.show != 'online':
 | 
				
			||||||
			self.print_conversation(_("%s is now %s (%s)") % (user.name, \
 | 
								self.print_conversation(_("%s is now %s (%s)") % (user.name, user.jid,\
 | 
				
			||||||
				user.show, user.status), 'status')
 | 
									user.show, user.status), 'status')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class gc:
 | 
					class gc:
 | 
				
			||||||
| 
						 | 
					@ -444,7 +736,7 @@ class gc:
 | 
				
			||||||
		if show == 'offline' or show == 'error':
 | 
							if show == 'offline' or show == 'error':
 | 
				
			||||||
			if statusCode == '307':
 | 
								if statusCode == '307':
 | 
				
			||||||
				self.print_conversation(_("%s has been kicked by %s: %s") % (nick, \
 | 
									self.print_conversation(_("%s has been kicked by %s: %s") % (nick, \
 | 
				
			||||||
					actor, reason))
 | 
										jid, actor, reason))
 | 
				
			||||||
			self.remove_user(nick)
 | 
								self.remove_user(nick)
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			iter = self.get_user_iter(nick)
 | 
								iter = self.get_user_iter(nick)
 | 
				
			||||||
| 
						 | 
					@ -477,7 +769,7 @@ class gc:
 | 
				
			||||||
			return 1
 | 
								return 1
 | 
				
			||||||
		return 0
 | 
							return 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def print_conversation(self, txt, contact = None, tim = None):
 | 
						def print_conversation(self, txt, jid, contact = None, tim = None):
 | 
				
			||||||
		"""Print a line in the conversation :
 | 
							"""Print a line in the conversation :
 | 
				
			||||||
		if contact is set : it's a message from someone
 | 
							if contact is set : it's a message from someone
 | 
				
			||||||
		if contact is not set : it's a message from the server"""
 | 
							if contact is not set : it's a message from the server"""
 | 
				
			||||||
| 
						 | 
					@ -565,9 +857,6 @@ class gc:
 | 
				
			||||||
		"""Make user's popup menu"""
 | 
							"""Make user's popup menu"""
 | 
				
			||||||
		model = self.tree.get_model()
 | 
							model = self.tree.get_model()
 | 
				
			||||||
		nick = model.get_value(iter, 1)
 | 
							nick = model.get_value(iter, 1)
 | 
				
			||||||
#		jid = model.get_value(iter, 3)
 | 
					 | 
				
			||||||
#		path = model.get_path(iter)
 | 
					 | 
				
			||||||
#		user = self.contacts[account][jid][0]
 | 
					 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		menu = gtk.Menu()
 | 
							menu = gtk.Menu()
 | 
				
			||||||
		item = gtk.MenuItem(_("MUC"))
 | 
							item = gtk.MenuItem(_("MUC"))
 | 
				
			||||||
| 
						 | 
					@ -1160,7 +1449,7 @@ class roster_Window:
 | 
				
			||||||
			if user.resource != '':
 | 
								if user.resource != '':
 | 
				
			||||||
				name += '/'+user.resource
 | 
									name += '/'+user.resource
 | 
				
			||||||
			self.plugin.windows[account]['chats'][user.jid].print_conversation(\
 | 
								self.plugin.windows[account]['chats'][user.jid].print_conversation(\
 | 
				
			||||||
				_("%s is now %s (%s)") % (name, show, status), 'status')
 | 
									_("%s is now %s (%s)") % (name, show, status), user.jid, 'status')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def on_info(self, widget, user, account):
 | 
						def on_info(self, widget, user, account):
 | 
				
			||||||
		"""Call infoUser_Window class to display user's information"""
 | 
							"""Call infoUser_Window class to display user's information"""
 | 
				
			||||||
| 
						 | 
					@ -1529,6 +1818,19 @@ class roster_Window:
 | 
				
			||||||
		self.plugin.connected[account] = statuss.index(status)
 | 
							self.plugin.connected[account] = statuss.index(status)
 | 
				
			||||||
		self.set_cb()
 | 
							self.set_cb()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def new_chat(self, user, account):
 | 
				
			||||||
 | 
							if USE_TABBED_CHAT:
 | 
				
			||||||
 | 
								if not self.plugin.windows[account]['chats'].has_key('tabbed'):
 | 
				
			||||||
 | 
									self.plugin.windows[account]['chats']['tabbed'] = \
 | 
				
			||||||
 | 
										tabbed_chat_Window(user, self.plugin, account)
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									self.plugin.windows[account]['chats']['tabbed'].new_user(user)
 | 
				
			||||||
 | 
								self.plugin.windows[account]['chats'][user.jid] = \
 | 
				
			||||||
 | 
									self.plugin.windows[account]['chats']['tabbed']
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								self.plugin.windows[account]['chats'][user.jid] = \
 | 
				
			||||||
 | 
									message_Window(user, self.plugin, account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def on_message(self, jid, msg, tim, account):
 | 
						def on_message(self, jid, msg, tim, account):
 | 
				
			||||||
		"""when we receive a message"""
 | 
							"""when we receive a message"""
 | 
				
			||||||
		if not self.contacts[account].has_key(jid):
 | 
							if not self.contacts[account].has_key(jid):
 | 
				
			||||||
| 
						 | 
					@ -1566,16 +1868,14 @@ class roster_Window:
 | 
				
			||||||
			self.tree.set_cursor(path)
 | 
								self.tree.set_cursor(path)
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			if not self.plugin.windows[account]['chats'].has_key(jid):
 | 
								if not self.plugin.windows[account]['chats'].has_key(jid):
 | 
				
			||||||
				self.plugin.windows[account]['chats'][jid] = \
 | 
									self.new_chat(self.contacts[account][jid][0], account)
 | 
				
			||||||
					message_Window(self.contacts[account][jid][0], self.plugin, \
 | 
					 | 
				
			||||||
						account)
 | 
					 | 
				
			||||||
				if path:
 | 
									if path:
 | 
				
			||||||
					self.tree.expand_row(path[0:1], FALSE)
 | 
										self.tree.expand_row(path[0:1], FALSE)
 | 
				
			||||||
					self.tree.expand_row(path[0:2], FALSE)
 | 
										self.tree.expand_row(path[0:2], FALSE)
 | 
				
			||||||
					self.tree.scroll_to_cell(path)
 | 
										self.tree.scroll_to_cell(path)
 | 
				
			||||||
					self.tree.set_cursor(path)
 | 
										self.tree.set_cursor(path)
 | 
				
			||||||
			self.plugin.windows[account]['chats'][jid].print_conversation(msg, \
 | 
								self.plugin.windows[account]['chats'][jid].print_conversation(msg, \
 | 
				
			||||||
				tim = tim)
 | 
									jid, tim = tim)
 | 
				
			||||||
			if not self.plugin.windows[account]['chats'][jid].window.\
 | 
								if not self.plugin.windows[account]['chats'][jid].window.\
 | 
				
			||||||
				get_property('is-active'):
 | 
									get_property('is-active'):
 | 
				
			||||||
				self.plugin.systray.add_jid(jid, account)
 | 
									self.plugin.systray.add_jid(jid, account)
 | 
				
			||||||
| 
						 | 
					@ -1662,9 +1962,7 @@ class roster_Window:
 | 
				
			||||||
			if self.plugin.windows[account]['chats'].has_key(jid):
 | 
								if self.plugin.windows[account]['chats'].has_key(jid):
 | 
				
			||||||
				self.plugin.windows[account]['chats'][jid].window.present()
 | 
									self.plugin.windows[account]['chats'][jid].window.present()
 | 
				
			||||||
			elif self.contacts[account].has_key(jid):
 | 
								elif self.contacts[account].has_key(jid):
 | 
				
			||||||
				self.plugin.windows[account]['chats'][jid] = \
 | 
									self.new_chat(self.contacts[account][jid][0], account)
 | 
				
			||||||
					message_Window(self.contacts[account][jid][0], self.plugin, \
 | 
					 | 
				
			||||||
						account)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def on_row_expanded(self, widget, iter, path):
 | 
						def on_row_expanded(self, widget, iter, path):
 | 
				
			||||||
		"""When a row is expanded :
 | 
							"""When a row is expanded :
 | 
				
			||||||
| 
						 | 
					@ -2079,9 +2377,8 @@ class systray:
 | 
				
			||||||
		if self.plugin.windows[account]['chats'].has_key(jid):
 | 
							if self.plugin.windows[account]['chats'].has_key(jid):
 | 
				
			||||||
			self.plugin.windows[account]['chats'][jid].window.present()
 | 
								self.plugin.windows[account]['chats'][jid].window.present()
 | 
				
			||||||
		elif self.plugin.roster.contacts[account].has_key(jid):
 | 
							elif self.plugin.roster.contacts[account].has_key(jid):
 | 
				
			||||||
			self.plugin.windows[account]['chats'][jid] = \
 | 
								self.plugin.roster.new_chat(
 | 
				
			||||||
				message_Window(self.plugin.roster.contacts[account][jid][0], \
 | 
									self.plugin.roster.contacts[account][jid][0], account)
 | 
				
			||||||
				self.plugin, account)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def mk_menu(self, event):
 | 
						def mk_menu(self, event):
 | 
				
			||||||
		menu = gtk.Menu()
 | 
							menu = gtk.Menu()
 | 
				
			||||||
| 
						 | 
					@ -2167,9 +2464,8 @@ class systray:
 | 
				
			||||||
				if self.plugin.windows[account]['chats'].has_key(jid):
 | 
									if self.plugin.windows[account]['chats'].has_key(jid):
 | 
				
			||||||
					self.plugin.windows[account]['chats'][jid].window.present()
 | 
										self.plugin.windows[account]['chats'][jid].window.present()
 | 
				
			||||||
				else:
 | 
									else:
 | 
				
			||||||
					self.plugin.windows[account]['chats'][jid] = message_Window(\
 | 
										self.plugin.roster.new_chat(
 | 
				
			||||||
						self.plugin.roster.contacts[account][jid][0], self.plugin, \
 | 
											self.plugin.roster.contacts[account][jid][0], account)
 | 
				
			||||||
						account)
 | 
					 | 
				
			||||||
		if event.button == 3:
 | 
							if event.button == 3:
 | 
				
			||||||
			self.mk_menu(event)
 | 
								self.mk_menu(event)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2451,11 +2747,11 @@ class plugin:
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		if len(jids) == 1:
 | 
							if len(jids) == 1:
 | 
				
			||||||
			#message from server
 | 
								#message from server
 | 
				
			||||||
			self.windows[account]['gc'][jid].print_conversation(array[1], \
 | 
								self.windows[account]['gc'][jid].print_conversation(array[1], jid, \
 | 
				
			||||||
				tim = array[2])
 | 
									tim = array[2])
 | 
				
			||||||
		else:
 | 
							else:
 | 
				
			||||||
			#message from someone
 | 
								#message from someone
 | 
				
			||||||
			self.windows[account]['gc'][jid].print_conversation(array[1], \
 | 
								self.windows[account]['gc'][jid].print_conversation(array[1], jid, \
 | 
				
			||||||
				jids[1], array[2])
 | 
									jids[1], array[2])
 | 
				
			||||||
			if not self.windows[account]['gc'][jid].window.\
 | 
								if not self.windows[account]['gc'][jid].window.\
 | 
				
			||||||
				get_property('is-active'):
 | 
									get_property('is-active'):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue