<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -117,7 +117,7 @@
       &lt;/layout&gt;
      &lt;/item&gt;
      &lt;item&gt;
-      &lt;widget class=&quot;Q3ListView&quot; name=&quot;lv_disco&quot; /&gt;
+      &lt;widget class=&quot;QTreeWidget&quot; name=&quot;lv_disco&quot; /&gt;
      &lt;/item&gt;
      &lt;item&gt;
       &lt;widget class=&quot;QCheckBox&quot; name=&quot;ck_autoItems&quot; &gt;
@@ -206,13 +206,6 @@
    &lt;container&gt;0&lt;/container&gt;
    &lt;pixmap&gt;&lt;/pixmap&gt;
   &lt;/customwidget&gt;
-  &lt;customwidget&gt;
-   &lt;class&gt;Q3ListView&lt;/class&gt;
-   &lt;extends&gt;&lt;/extends&gt;
-   &lt;header&gt;q3listview.h&lt;/header&gt;
-   &lt;container&gt;0&lt;/container&gt;
-   &lt;pixmap&gt;&lt;/pixmap&gt;
-  &lt;/customwidget&gt;
  &lt;/customwidgets&gt;
  &lt;resources/&gt;
  &lt;connections/&gt;</diff>
      <filename>src/disco.ui</filename>
    </modified>
    <modified>
      <diff>@@ -20,10 +20,8 @@
 
 #include &quot;discodlg.h&quot;
 
-#include &lt;q3listview.h&gt;
-#include &lt;q3popupmenu.h&gt;
-#include &lt;Q3PtrList&gt;
-#include &lt;Q3Dict&gt;
+#include &lt;QTreeWidget&gt;
+#include &lt;QMenu&gt;
 
 #include &lt;QComboBox&gt;
 #include &lt;QCheckBox&gt;
@@ -149,7 +147,7 @@ public:
 	: QObject(parent) {}
 
 signals:
-	void itemUpdated(Q3ListViewItem *);
+	void itemUpdated(QTreeWidgetItem *);
 
 private:
 	friend class DiscoListItem;
@@ -174,16 +172,15 @@ struct DiscoData {
 // DiscoListItem
 //----------------------------------------------------------------------------
 
-class DiscoListItem : public QObject, public Q3ListViewItem
+class DiscoListItem : public QObject, public QTreeWidgetItem
 {
 	Q_OBJECT
 public:
-	DiscoListItem(DiscoItem it, DiscoData *d, Q3ListView *parent);
-	DiscoListItem(DiscoItem it, DiscoData *d, Q3ListViewItem *parent);
+	DiscoListItem(DiscoItem it, DiscoData *d, QTreeWidget *parent);
+	DiscoListItem(DiscoItem it, DiscoData *d, QTreeWidgetItem *parent);
 	~DiscoListItem();
 
-	QString text(int columns) const;
-	void setOpen(bool open);
+	void setExpanded(bool expand);
 	const DiscoItem &amp;item() const;
 
 	void itemSelected();
@@ -226,16 +223,16 @@ private:
 	DiscoDlg *dlg() const;
 };
 
-DiscoListItem::DiscoListItem(DiscoItem it, DiscoData *_d, Q3ListView *parent)
-: Q3ListViewItem (parent)
+DiscoListItem::DiscoListItem(DiscoItem it, DiscoData *_d, QTreeWidget *parent)
+: QTreeWidgetItem (parent)
 {
 	isRoot = true;
 
 	init(it, _d);
 }
 
-DiscoListItem::DiscoListItem(DiscoItem it, DiscoData *_d, Q3ListViewItem *parent)
-: Q3ListViewItem (parent)
+DiscoListItem::DiscoListItem(DiscoItem it, DiscoData *_d, QTreeWidgetItem *parent)
+: QTreeWidgetItem (parent)
 {
 	isRoot = false;
 
@@ -255,7 +252,7 @@ void DiscoListItem::init(DiscoItem _item, DiscoData *_d)
 	alreadyItems = alreadyInfo = false;
 
 	if ( !autoItemsEnabled() )
-		setExpandable (true);
+		setChildIndicatorPolicy(ShowIndicator);
 
 	autoInfo = false;
 	if ( autoInfoEnabled() || isRoot ) {
@@ -310,40 +307,31 @@ void DiscoListItem::copyItem(const DiscoItem &amp;it)
 		}
 	}
 
-	bool pixmapOk = false;
+	setText(0, di.name().simplified());
+	setText(1, di.jid().full());
+	setText(2, di.node().simplified());
+
+	bool iconOk = false;
 	if ( !di.identities().isEmpty() ) {
 		DiscoItem::Identity id = di.identities().first();
 
 		if ( !id.category.isEmpty() ) {
-			PsiIcon ic = category2icon(id.category, id.type);
+			QIcon icon = category2icon(id.category, id.type).icon();
 
-			if ( !ic.impix().isNull() ) {
-				setPixmap (0, ic.impix());
-				pixmapOk = true;
+			if ( !icon.isNull() ) {
+				setIcon(0, icon);
+				iconOk = true;
 			}
 		}
 	}
 
-	if ( !pixmapOk )
-		setPixmap(0, PsiIconset::instance()-&gt;status(di.jid(), STATUS_ONLINE).impix());
-
-	repaint();
+	if ( !iconOk )
+		setIcon(0, PsiIconset::instance()-&gt;status(di.jid(), STATUS_ONLINE).icon());
 
 	if ( isSelected() ) // update actions
 		emit d-&gt;d-&gt;itemUpdated( this );
 }
 
-QString DiscoListItem::text (int c) const
-{
-	if (c == 0)
-		return di.name().simplified();
-	else if (c == 1)
-		return di.jid().full();
-	else if (c == 2)
-		return di.node().simplified();
-	return &quot;&quot;;
-}
-
 QString DiscoListItem::getErrorInfo() const
 {
 	return errorInfo;
@@ -356,7 +344,7 @@ const DiscoItem &amp;DiscoListItem::item() const
 
 DiscoDlg *DiscoListItem::dlg() const
 {
-	return (DiscoDlg *)listView()-&gt;parent();
+	return (DiscoDlg *)treeWidget()-&gt;parent();
 }
 
 bool DiscoListItem::autoItemsEnabled() const
@@ -369,16 +357,16 @@ bool DiscoListItem::autoInfoEnabled() const
 	return dlg()-&gt;ck_autoInfo-&gt;isChecked();
 }
 
-void DiscoListItem::setOpen (bool o)
+void DiscoListItem::setExpanded (bool expand)
 {
-	if ( o ) {
+	if ( expand ) {
 		if ( !alreadyItems )
 			updateItems();
 		else
 			autoItemsChildren();
 	}
 
-	Q3ListViewItem::setOpen(o);
+	QTreeWidgetItem::setExpanded(expand);
 }
 
 void DiscoListItem::itemSelected()
@@ -578,12 +566,12 @@ QString DiscoListItem::computeHash( QString jid, QString node )
 
 void DiscoListItem::updateItemsFinished(const DiscoList &amp;list)
 {
-	Q3Dict&lt;DiscoListItem&gt; children;
-	DiscoListItem *child = (DiscoListItem *)firstChild();
-	while ( child ) {
+	QHash&lt;QString, DiscoListItem*&gt; children;
+	DiscoListItem *child = (DiscoListItem *)QTreeWidgetItem::child(0);
+	for ( int i = 1; child; ++i ) {
 		children.insert( child-&gt;hash(), child );
 
-		child = (DiscoListItem *)child-&gt;nextSibling();
+		child = (DiscoListItem *)QTreeWidgetItem::child(i);
 	}
 
 	// add/update items
@@ -591,7 +579,7 @@ void DiscoListItem::updateItemsFinished(const DiscoList &amp;list)
 		const DiscoItem a = *it;
 
 		QString key = computeHash(a.jid().full(), a.node());
-		DiscoListItem *child = children[ key ];
+		child = children[ key ];
 
 		if ( child ) {
 			child-&gt;copyItem ( a );
@@ -603,20 +591,21 @@ void DiscoListItem::updateItemsFinished(const DiscoList &amp;list)
 	}
 
 	// remove all items that are not on new DiscoList
-	children.setAutoDelete( true );
+	qDeleteAll(children);
 	children.clear();
 
-	if ( autoItems &amp;&amp; isOpen() )
+	if ( autoItems &amp;&amp; isExpanded() )
 		autoItemsChildren();
 
-	// don't forget to remove '+' (or '-') sign in case, that the child list is empty
-	setExpandable ( !list.isEmpty() );
-
-	repaint();
+	if (list.isEmpty())
+	{
+		setChildIndicatorPolicy(DontShowIndicator);
+		emitDataChanged();
+	}
 
 	// root item is initially hidden
-	if ( isRoot &amp;&amp; !isVisible() )
-		setVisible (true);
+	if ( isRoot &amp;&amp; isHidden() )
+		setHidden(false);
 }
 
 void DiscoListItem::autoItemsChildren() const
@@ -624,11 +613,11 @@ void DiscoListItem::autoItemsChildren() const
 	if ( !autoItemsEnabled() )
 		return;
 
-	DiscoListItem *child = (DiscoListItem *)firstChild();
-	while ( child ) {
+	DiscoListItem *child = (DiscoListItem *)QTreeWidgetItem::child(0);
+	for ( int i = 1; child; ++i ) {
 		child-&gt;updateItems(true);
 
-		child = (DiscoListItem *)child-&gt;nextSibling();
+		child = (DiscoListItem *)QTreeWidgetItem::child(i);
 	}
 }
 
@@ -654,7 +643,7 @@ void DiscoListItem::discoInfoFinished()
 	else {
 		QString error_str = jt-&gt;statusString();
 		int error_code = jt-&gt;statusCode();
-		setExpandable(false);
+		setChildIndicatorPolicy(DontShowIndicator);
 
 		// we change the icon for the items with disco#info returning type==&quot;cancel&quot; || type==&quot;wait&quot; error codes
 		// based on http://www.jabber.org/jeps/jep-0086.html
@@ -662,22 +651,22 @@ void DiscoListItem::discoInfoFinished()
 		// FIXME: use another method for checking XMPP error-types when Iris will provide one
 		if ( error_code==400 || error_code==404 || error_code==405 || error_code==409 ||
 		     error_code==500 || error_code==501 || error_code==503 || error_code==504 ) {
-			bool pixmapOk = false;
+			bool iconOk = false;
 			if ( !di.identities().isEmpty() ) {
 				DiscoItem::Identity id = di.identities().first();
 				if ( !id.category.isEmpty() ) {
-					PsiIcon ic = category2icon(id.category, id.type, STATUS_ERROR);
+					QIcon icon = category2icon(id.category, id.type, STATUS_ERROR).icon();
 
-					if ( !ic.impix().isNull() ) {
-						setPixmap (0, ic.impix());
-						pixmapOk = true;
+					if ( !icon.isNull() ) {
+						setIcon (0, icon);
+						iconOk = true;
 					}
 				}
 			}
-			if ( !pixmapOk )
-				setPixmap(0, PsiIconset::instance()-&gt;status(di.jid(), STATUS_ERROR).impix());
+			if ( !iconOk )
+				setIcon(0, PsiIconset::instance()-&gt;status(di.jid(), STATUS_ERROR).icon());
 		} else {
-			repaint(); //for setExpandable() called earlier
+			emitDataChanged(); // Remove child indicator
 		}
 
 		errorInfo=QString(&quot;%1&quot;).arg(QString(error_str).replace('\n', &quot;&lt;br&gt;&quot;));
@@ -695,15 +684,15 @@ void DiscoListItem::updateInfo(const DiscoItem &amp;item)
 {
 	copyItem( item );
 
-	if ( isRoot &amp;&amp; !isVisible() )
-		setVisible (true);
+	if ( isRoot &amp;&amp; isHidden() )
+		setHidden(false);
 }
 
 //----------------------------------------------------------------------------
 // DiscoList
 //----------------------------------------------------------------------------
 
-class DiscoListView : public Q3ListView
+class DiscoListView : public QTreeWidget
 {
 	Q_OBJECT
 public:
@@ -714,30 +703,28 @@ protected:
 
 	// reimplemented
 	bool eventFilter(QObject* o, QEvent* e);
-	void resizeEvent(QResizeEvent*);
+	//void resizeEvent(QResizeEvent*);
 };
 
 DiscoListView::DiscoListView(QWidget *parent)
-: Q3ListView(parent)
+: QTreeWidget(parent)
 {
-	addColumn( tr( &quot;Name&quot; ) );
-	addColumn( tr( &quot;JID&quot; ) );
-	addColumn( tr( &quot;Node&quot; ) );
-	for (int i = 0; i &lt; 3; i++)
-		setColumnWidthMode(i, Q3ListView::Manual);
-	header()-&gt;setStretchEnabled(true, 0);
+	installEventFilter(this);
+	setHeaderLabels( QStringList() &lt;&lt; tr( &quot;Name&quot; ) &lt;&lt; tr( &quot;JID&quot; ) &lt;&lt; tr( &quot;Node&quot; ) );
+	header()-&gt;setResizeMode(0, QHeaderView::Stretch);
 }
 
-void DiscoListView::resizeEvent(QResizeEvent* e)
+/*void DiscoListView::resizeEvent(QResizeEvent* e)
 {
-	Q3ListView::resizeEvent(e);
+	QTreeWidget::resizeEvent(e);
 
-	setColumnWidth(2, header()-&gt;fontMetrics().width(columnText(2)) * 2);
-	float remainingWidth = visibleWidth() - columnWidth(2);
-	setColumnWidth(1, int(remainingWidth * 0.3));
+	QHeaderView* h = header();
+	h-&gt;resizeSection(2, h-&gt;fontMetrics().width(columnText(2)) * 2);
+	float remainingWidth = visibleWidth() - h-&gt;columnWidth(2);
+	h-&gt;resizeSection(1, int(remainingWidth * 0.3));
 
-	header()-&gt;adjustHeaderSize();
-}
+	h-&gt;adjustHeaderSize();
+}*/
 
 /**
  * \param pos should be in global coordinate system.
@@ -817,7 +804,7 @@ bool DiscoListView::maybeTip(const QPoint &amp;pos)
 	}
 
 	text += &quot;&lt;/qt&gt;&quot;;
-	QRect r( itemRect(i) );
+	QRect r( visualItemRect(i) );
 	PsiToolTip::showText(pos, text, this);
 	return true;
 }
@@ -830,7 +817,7 @@ bool DiscoListView::eventFilter(QObject* o, QEvent* e)
 		maybeTip(w-&gt;mapToGlobal(he-&gt;pos()));
 		return true;
 	}
-	return Q3ListView::eventFilter(o, e);
+	return QTreeWidget::eventFilter(o, e);
 }
 
 //----------------------------------------------------------------------------
@@ -860,23 +847,14 @@ private:
 
 	// helper class to store browser history
 	class History {
-	private:
-		Q3ListViewItem *item;
 	public:
-		History(Q3ListViewItem *it) {
-			item = it;
-		}
-
-		~History() {
-			if ( item )
-				delete item;
-		}
+		History(const XMPP::Jid&amp; _jid, const QString&amp; _node)
+			: jid(_jid)
+			, node(_node)
+		{}
 
-		Q3ListViewItem *takeItem() {
-			Q3ListViewItem *i = item;
-			item = 0;
-			return i;
-		}
+		XMPP::Jid jid;
+		QString node;
 	};
 
 public: // data
@@ -892,7 +870,7 @@ public: // data
 	// custom actions, that will be added to toolbar and context menu
 	IconAction *actRegister, *actSearch, *actJoin, *actAHCommand, *actVCard, *actAdd;
 
-	typedef Q3PtrList&lt;History&gt; HistoryList;
+	typedef QList&lt;History*&gt; HistoryList;
 	HistoryList backHistory, forwardHistory;
 
 	BusyWidget *busy;
@@ -902,7 +880,7 @@ public: // functions
 	~Private();
 
 public slots:
-	void doDisco(QString host = QString::null, QString node = QString::null);
+	void doDisco(QString host = QString::null, QString node = QString::null, bool doHistory = true);
 
 	void actionStop();
 	void actionRefresh();
@@ -911,7 +889,6 @@ public slots:
 	void actionBack();
 	void actionForward();
 	void updateBackForward();
-	void backForwardHelper(Q3ListViewItem *);
 
 	void updateComboBoxes(Jid j, QString node);
 
@@ -921,8 +898,9 @@ public slots:
 	void disableButtons();
 	void enableButtons(const DiscoItem &amp;);
 
-	void itemSelected (Q3ListViewItem *);
-	void itemDoubleclicked (Q3ListViewItem *);
+	void itemSelected (QTreeWidgetItem *);
+	void itemExpanded (QTreeWidgetItem *);
+	void itemDoubleclicked (QTreeWidgetItem *);
 	bool eventFilter (QObject *, QEvent *);
 
 	void setProtocol(int);
@@ -944,23 +922,21 @@ DiscoDlg::Private::Private(DiscoDlg *parent, PsiAccount *pa)
 	connect(data.tasks, SIGNAL(started()),  SLOT(itemUpdateStarted()));
 	connect(data.tasks, SIGNAL(finished()), SLOT(itemUpdateFinished()));
 	data.d = new DiscoConnector(this);
-	connect(data.d, SIGNAL(itemUpdated(Q3ListViewItem *)), SLOT(itemSelected (Q3ListViewItem *)));
+	connect(data.d, SIGNAL(itemUpdated(QTreeWidgetItem *)), SLOT(itemSelected (QTreeWidgetItem *)));
 	data.protocol = DiscoData::Auto;
 
-	backHistory.setAutoDelete(true);
-	forwardHistory.setAutoDelete(true);
-
 	// mess with widgets
 	busy = parent-&gt;busy;
 	connect(busy, SIGNAL(destroyed(QObject *)), SLOT(objectDestroyed(QObject *)));
 
-	Q3ListView *lv_discoOld = dlg-&gt;lv_disco;
+	QTreeWidget *lv_discoOld = dlg-&gt;lv_disco;
 	dlg-&gt;lv_disco = new DiscoListView(dlg);
 	replaceWidget(lv_discoOld, dlg-&gt;lv_disco);
 
 	dlg-&gt;lv_disco-&gt;installEventFilter (this);
-	connect(dlg-&gt;lv_disco, SIGNAL(selectionChanged (Q3ListViewItem *)), SLOT(itemSelected (Q3ListViewItem *)));;
-	connect(dlg-&gt;lv_disco, SIGNAL(doubleClicked (Q3ListViewItem *)),    SLOT(itemDoubleclicked (Q3ListViewItem *)));;
+	connect(dlg-&gt;lv_disco, SIGNAL(currentItemChanged (QTreeWidgetItem *, QTreeWidgetItem *)), SLOT(itemSelected (QTreeWidgetItem *)));;
+	connect(dlg-&gt;lv_disco, SIGNAL(itemExpanded (QTreeWidgetItem *)), SLOT(itemExpanded (QTreeWidgetItem *)));
+	connect(dlg-&gt;lv_disco, SIGNAL(itemDoubleClicked (QTreeWidgetItem *, int)), SLOT(itemDoubleclicked (QTreeWidgetItem *)));;
 
 	// protocol actions
 	QSignalMapper *pm = new QSignalMapper(this);
@@ -1059,10 +1035,12 @@ DiscoDlg::Private::Private(DiscoDlg *parent, PsiAccount *pa)
 
 DiscoDlg::Private::~Private()
 {
+	qDeleteAll(backHistory);
+	qDeleteAll(forwardHistory);
 	delete data.tasks;
 }
 
-void DiscoDlg::Private::doDisco(QString _host, QString _node)
+void DiscoDlg::Private::doDisco(QString _host, QString _node, bool doHistory)
 {
 	PsiAccount *pa = data.pa;
 	if ( !pa-&gt;checkConnected(dlg) )
@@ -1073,22 +1051,19 @@ void DiscoDlg::Private::doDisco(QString _host, QString _node)
 	QString host = _host;
 	if ( host.isEmpty() )
 		host = dlg-&gt;cb_address-&gt;currentText();
-	j = host.stripWhiteSpace();
+	j = host.trimmed();
 	if ( !j.isValid() )
 		return;
 
-	QString n = _node.stripWhiteSpace();
+	QString n = _node.trimmed();
 	if ( n.isEmpty() )
-		n = dlg-&gt;cb_node-&gt;currentText().stripWhiteSpace();
+		n = dlg-&gt;cb_node-&gt;currentText().trimmed();
 
 	// check, whether we need to update history
 	if ( (jid.full() != j.full()) || (node != n) ) {
-		Q3ListViewItem *item = dlg-&gt;lv_disco-&gt;firstChild(); // get the root item
-
-		if ( item ) {
-			dlg-&gt;lv_disco-&gt;takeItem( item );
-
-			backHistory.append( new History(item) );
+		if (doHistory) {
+			backHistory.append(new History(jid, node));
+			qDeleteAll(forwardHistory);
 			forwardHistory.clear();
 		}
 	}
@@ -1110,20 +1085,19 @@ void DiscoDlg::Private::doDisco(QString _host, QString _node)
 	di.setNode( node );
 
 	DiscoListItem *root = new DiscoListItem (di, &amp;data, dlg-&gt;lv_disco);
-	root-&gt;setVisible (false); // don't confuse users with empty root
-
-	root-&gt;setOpen(true); // begin browsing
+	root-&gt;setHidden (false); // don't confuse users with empty root
+	root-&gt;setExpanded(true); // begin browsing
 }
 
 void DiscoDlg::Private::updateComboBoxes(Jid j, QString n)
 {
 	data.pa-&gt;psi()-&gt;recentBrowseAdd( j.full() );
 	dlg-&gt;cb_address-&gt;clear();
-	dlg-&gt;cb_address-&gt;insertStringList(data.pa-&gt;psi()-&gt;recentBrowseList());
+	dlg-&gt;cb_address-&gt;addItems(data.pa-&gt;psi()-&gt;recentBrowseList());
 
 	data.pa-&gt;psi()-&gt;recentNodeAdd( n );
 	dlg-&gt;cb_node-&gt;clear();
-	dlg-&gt;cb_node-&gt;insertStringList(data.pa-&gt;psi()-&gt;recentNodeList());
+	dlg-&gt;cb_node-&gt;addItems(data.pa-&gt;psi()-&gt;recentNodeList());
 }
 
 void DiscoDlg::Private::actionStop()
@@ -1133,7 +1107,7 @@ void DiscoDlg::Private::actionStop()
 
 void DiscoDlg::Private::actionRefresh()
 {
-	DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;selectedItem();
+	DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;currentItem();
 	if ( !it )
 		return;
 
@@ -1143,7 +1117,7 @@ void DiscoDlg::Private::actionRefresh()
 
 void DiscoDlg::Private::actionBrowse()
 {
-	DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;selectedItem();
+	DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;currentItem();
 	if ( !it )
 		return;
 
@@ -1152,65 +1126,18 @@ void DiscoDlg::Private::actionBrowse()
 
 void DiscoDlg::Private::actionBack()
 {
-	// add current selection to forward history
-	Q3ListViewItem *item = dlg-&gt;lv_disco-&gt;firstChild();
-	if ( item ) {
-		dlg-&gt;lv_disco-&gt;takeItem( item );
-
-		forwardHistory.append( new History(item) );
-	}
-
-	// now, take info from back history...
-	Q3ListViewItem *i = backHistory.last()-&gt;takeItem();
-	backHistory.removeLast();
-
-	// and restore view
-	backForwardHelper(i);
+	forwardHistory.append(new History(jid, node));
+	History *h = backHistory.takeLast();
+	doDisco(h-&gt;jid.full(), h-&gt;node, false);
+	delete h;
 }
 
 void DiscoDlg::Private::actionForward()
 {
-	// add current selection to back history
-	Q3ListViewItem *item = dlg-&gt;lv_disco-&gt;firstChild();
-	if ( item ) {
-		dlg-&gt;lv_disco-&gt;takeItem( item );
-
-		backHistory.append( new History(item) );
-	}
-
-	// now, take info from forward history...
-	Q3ListViewItem *i = forwardHistory.last()-&gt;takeItem();
-	forwardHistory.removeLast();
-
-	// and restore view
-	backForwardHelper(i);
-}
-
-void DiscoDlg::Private::backForwardHelper(Q3ListViewItem *root)
-{
-	DiscoListItem *i = (DiscoListItem *)root;
-
-	jid  = i-&gt;item().jid();
-	node = i-&gt;item().node();
-
-	updateComboBoxes(jid, node);
-
-	data.tasks-&gt;clear(); // also will call all all necessary functions
-	disableButtons();
-	updateBackForward();
-
-	dlg-&gt;lv_disco-&gt;insertItem( root );
-
-	// fixes multiple selection bug
-	Q3ListViewItemIterator it( dlg-&gt;lv_disco );
-	while ( it.current() ) {
-		Q3ListViewItem *item = it.current();
-		++it;
-
-		if ( item-&gt;isSelected() )
-			for (int i = 0; i &lt;= 1; i++) // it's boring to write same line twice :-)
-				dlg-&gt;lv_disco-&gt;setSelected(item, (bool)i);
-	}
+	backHistory.append(new History(jid, node));
+	History *h = forwardHistory.takeLast();
+	doDisco(h-&gt;jid.full(), h-&gt;node, false);
+	delete h;
 }
 
 void DiscoDlg::Private::updateBackForward()
@@ -1255,7 +1182,7 @@ void DiscoDlg::Private::enableButtons(const DiscoItem &amp;it)
 	actAHCommand-&gt;setEnabled( f.canCommand() );
 }
 
-void DiscoDlg::Private::itemSelected (Q3ListViewItem *item)
+void DiscoDlg::Private::itemSelected (QTreeWidgetItem *item)
 {
 	DiscoListItem *it = (DiscoListItem *)item;
 	if ( !it ) {
@@ -1269,7 +1196,14 @@ void DiscoDlg::Private::itemSelected (Q3ListViewItem *item)
 	enableButtons ( di );
 }
 
-void DiscoDlg::Private::itemDoubleclicked (Q3ListViewItem *item)
+void DiscoDlg::Private::itemExpanded (QTreeWidgetItem *item)
+{
+	DiscoListItem *it = (DiscoListItem *)item;
+	if (it)
+		it-&gt;setExpanded(true);
+}
+
+void DiscoDlg::Private::itemDoubleclicked (QTreeWidgetItem *item)
 {
 	DiscoListItem *it = (DiscoListItem *)item;
 	if ( !it )
@@ -1303,12 +1237,12 @@ void DiscoDlg::Private::itemDoubleclicked (Q3ListViewItem *item)
 	}
 
 	if ( id &gt; 0 ) {
-		if ( !it-&gt;isOpen() ) {
-			if ( it-&gt;isExpandable() || it-&gt;childCount() )
-				it-&gt;setOpen( true );
+		if ( !it-&gt;isExpanded() ) {
+			if ( it-&gt;childCount() )
+				it-&gt;setExpanded( true );
 		}
 		else {
-			it-&gt;setOpen( false );
+			it-&gt;setExpanded( false );
 		}
 		emit dlg-&gt;featureActivated( Features::feature(id), d.jid(), d.node() );
 	}
@@ -1320,7 +1254,7 @@ bool DiscoDlg::Private::eventFilter (QObject *object, QEvent *event)
 		if ( event-&gt;type() == QEvent::ContextMenu ) {
 			QContextMenuEvent *e = (QContextMenuEvent *)event;
 
-			DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;selectedItem();
+			DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;currentItem();
 			if ( !it )
 				return true;
 
@@ -1358,29 +1292,30 @@ bool DiscoDlg::Private::eventFilter (QObject *object, QEvent *event)
 			}
 
 			// prepare popup menu
-			Q3PopupMenu p;
+			QMenu p;
 
 			actBrowse-&gt;addTo (&amp;p);
 			actRefresh-&gt;addTo (&amp;p);
 			actStop-&gt;addTo (&amp;p);
 
 			// custom actions
-			p.insertSeparator();
+			p.addSeparator();
 			actRegister-&gt;addTo(&amp;p);
 			actSearch-&gt;addTo(&amp;p);
 			actJoin-&gt;addTo(&amp;p);
 
-			p.insertSeparator();
+			p.addSeparator();
 			actAdd-&gt;addTo(&amp;p);
 			actVCard-&gt;addTo(&amp;p);
 			actAHCommand-&gt;addTo(&amp;p);
 
 			// popup with all available features
-			Q3PopupMenu *fm = new Q3PopupMenu(&amp;p);
+			QMenu *fm = new QMenu(&amp;p);
+			QHash&lt;QAction*, int&gt; actions;
 			{
 				QList&lt;long&gt;::Iterator it = ids.begin();
 				for ( ; it != ids.end(); ++it)
-					fm-&gt;insertItem(Features::name(*it), *it + 10000); // TODO: add pixmap
+					actions.insert(fm-&gt;addAction(Features::name(*it)), *it + 10000); // TODO: add pixmap
 			}
 
 			//p.insertSeparator();
@@ -1389,7 +1324,7 @@ bool DiscoDlg::Private::eventFilter (QObject *object, QEvent *event)
 
 			// display popup
 			e-&gt;accept();
-			int r = p.exec ( e-&gt;globalPos() );
+			int r = actions.value(p.exec ( e-&gt;globalPos() ));
 
 			if ( r &gt; 10000 )
 				actionActivated(r-10000);
@@ -1403,7 +1338,7 @@ bool DiscoDlg::Private::eventFilter (QObject *object, QEvent *event)
 
 void DiscoDlg::Private::actionActivated(int id)
 {
-	DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;selectedItem();
+	DiscoListItem *it = (DiscoListItem *)dlg-&gt;lv_disco-&gt;currentItem();
 	if ( !it )
 		return;
 
@@ -1440,7 +1375,7 @@ DiscoDlg::DiscoDlg(PsiAccount *pa, const Jid &amp;jid, const QString &amp;node)
 	d-&gt;node = node;
 	d-&gt;data.pa-&gt;dialogRegister(this);
 
-	setWindowTitle(CAP(caption()));
+	//setWindowTitle(CAP(caption()));
 	setWindowIcon(PsiIconset::instance()-&gt;transportStatus(&quot;transport&quot;, STATUS_ONLINE).icon());
 	X11WM_CLASS(&quot;disco&quot;);
 
@@ -1452,14 +1387,14 @@ DiscoDlg::DiscoDlg(PsiAccount *pa, const Jid &amp;jid, const QString &amp;node)
 	pb_close-&gt;setDefault(false);
 	pb_close-&gt;setAutoDefault(false);
 
-	cb_address-&gt;insertStringList(pa-&gt;psi()-&gt;recentBrowseList()); // FIXME
+	cb_address-&gt;addItems(pa-&gt;psi()-&gt;recentBrowseList()); // FIXME
 	cb_address-&gt;setFocus();
 	connect(cb_address, SIGNAL(activated(const QString &amp;)), d, SLOT(doDisco()));
-	cb_address-&gt;setCurrentText(d-&gt;jid.full());
+	cb_address-&gt;setCurrentIndex(cb_address-&gt;findText(d-&gt;jid.full()));
 
-	cb_node-&gt;insertStringList(pa-&gt;psi()-&gt;recentNodeList());
+	cb_node-&gt;addItems(pa-&gt;psi()-&gt;recentNodeList());
 	connect(cb_node, SIGNAL(activated(const QString &amp;)), d, SLOT(doDisco()));
-	cb_node-&gt;setCurrentText(node);
+	cb_node-&gt;setCurrentIndex(cb_node-&gt;findText(node));
 
 	if ( pa-&gt;loggedIn() )
 		doDisco();</diff>
      <filename>src/discodlg.cpp</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>b29bafac6ebeb5bb09ddfdeb70f583ff6780c3b4</id>
    </parent>
  </parents>
  <author>
    <name>Michail Pishchagin</name>
    <email>mblsha@users.sourceforge.net</email>
  </author>
  <url>http://github.com/mblsha/psi/commit/f7839d09e6e43586f08ed74f9c0be044596dceff</url>
  <id>f7839d09e6e43586f08ed74f9c0be044596dceff</id>
  <committed-date>2009-11-04T12:05:20-08:00</committed-date>
  <authored-date>2009-11-04T12:05:20-08:00</authored-date>
  <message>Disco dialog is now de-qt3support-ified. Thanks to Constantin Makshin for the original patch.</message>
  <tree>69d96009f4263da1c5c4dfaff947dcd3c1cd68cc</tree>
  <committer>
    <name>Michail Pishchagin</name>
    <email>mblsha@users.sourceforge.net</email>
  </committer>
</commit>
