# HG changeset patch
# User insilmaril
# Date 1268051066 0
# Node ID 832e96c9abb6c51b1a82a1ad41ff07ca31e3627e
# Parent  fac2248e2afa7f5146b21ef0781fcb6434f14e4e
Introduce dockwidget to display all search results at once

diff -r fac2248e2afa -r 832e96c9abb6 demos/vym-contribute.vym
Binary file demos/vym-contribute.vym has changed
diff -r fac2248e2afa -r 832e96c9abb6 exporthtmldialog.cpp
--- a/exporthtmldialog.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/exporthtmldialog.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -254,7 +254,7 @@
 		settings.setLocalEntry 
 			(filepath,"/export/html/saveSettingsInMap","yes");
 
-	// Provide a smaller URL-icon to improve Layout //FIXME-1 add option to choose this
+	// Provide a smaller URL-icon to improve Layout //FIXME-2 add option to choose this
 	QPixmap pm;
 	if (!pm.load(ipath,"PNG") )
 		QMessageBox::warning( 0, tr( "Warning" ),tr("Could not open %1").arg(ipath));
diff -r fac2248e2afa -r 832e96c9abb6 findresultitem.cpp
--- a/findresultitem.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/findresultitem.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -1,11 +1,15 @@
 #include <QStringList>
 
 #include "findresultitem.h"
+#include "treeitem.h"
+#include "vymmodel.h"
 
 FindResultItem::FindResultItem(const QVector<QVariant> &data, FindResultItem *parent)
 {
     parentItem = parent;
     itemData = data;
+	orgID=-1;
+	orgModel=NULL;
 }
 
 FindResultItem::~FindResultItem()
@@ -41,6 +45,15 @@
     return itemData.value(column);
 }
 
+int FindResultItem::row() const
+{
+    if (parentItem)
+        return parentItem->childItems.indexOf(const_cast<FindResultItem*>(this));
+
+    return 0;
+}
+
+
 bool FindResultItem::insertChildren(int position, int count, int columns)
 {
     if (position < 0 || position > childItems.size())
@@ -107,3 +120,20 @@
     itemData[column] = value;
     return true;
 }
+
+void FindResultItem::setOriginal (TreeItem *ti)
+{
+	orgModel=ti->getModel();
+	orgID=ti->getID();
+}
+
+uint FindResultItem::getOrgID()
+{
+	return orgID;
+}
+
+VymModel* FindResultItem::getOrgModel()
+{
+	return orgModel;
+}
+
diff -r fac2248e2afa -r 832e96c9abb6 findresultitem.h
--- a/findresultitem.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/findresultitem.h	Mon Mar 08 12:24:26 2010 +0000
@@ -5,6 +5,9 @@
 #include <QVariant>
 #include <QVector>
 
+class TreeItem;
+class VymModel;
+
 class FindResultItem
 {
 public:
@@ -15,6 +18,7 @@
     int childCount() const;
     int columnCount() const;
     QVariant data(int column) const;
+	int row() const;
     bool insertChildren(int position, int count, int columns);
     bool insertColumns(int position, int columns);
     FindResultItem *parent();
@@ -22,11 +26,17 @@
     bool removeColumns(int position, int columns);
     int childNumber() const;
     bool setData(int column, const QVariant &value);
+	void setOriginal (TreeItem *ti);
+	uint getOrgID();
+	VymModel* getOrgModel();
 
 private:
     QList<FindResultItem*> childItems;
     QVector<QVariant> itemData;
     FindResultItem *parentItem;
+
+	uint orgID;
+	VymModel *orgModel;
 };
 
 #endif
diff -r fac2248e2afa -r 832e96c9abb6 findresultmodel.cpp
--- a/findresultmodel.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/findresultmodel.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -2,23 +2,32 @@
 
 #include "findresultitem.h"
 #include "findresultmodel.h"
+#include "treeitem.h"
 
 FindResultModel::FindResultModel( QObject *parent)
     : QAbstractItemModel(parent)
 {
     QVector<QVariant> rootData;
-	rootData << "Foo"<<"bar";
+	rootData << "Heading";
 
     rootItem = new FindResultItem(rootData);
     //setupModelData(data.split(QString("\n")), rootItem);
 }
 
-
 FindResultModel::~FindResultModel()
 {
     delete rootItem;
 }
 
+void FindResultModel::clear()
+{
+	if (rootItem->childCount()>0)
+	{
+		//QModelIndex ix=createIndex(0,0,rootItem);
+		removeRows (0,rowCount (QModelIndex ()));
+	}
+}
+
 int FindResultModel::columnCount(const QModelIndex & /* parent */) const
 {
     return rootItem->columnCount();
@@ -63,6 +72,15 @@
     return QVariant();
 }
 
+QModelIndex FindResultModel::index (FindResultItem *fri)
+{
+	if (!fri->parent())
+		return QModelIndex();
+	else	
+		return createIndex (fri->row(),0,fri);
+}
+
+
 QModelIndex FindResultModel::index(int row, int column, const QModelIndex &parent) const
 {
     if (parent.isValid() && parent.column() != 0)
@@ -176,54 +194,38 @@
     return result;
 }
 
-void FindResultModel::setupModelData(const QStringList &lines, FindResultItem *parent)
+void FindResultModel::addItem (TreeItem *ti)
 {
-    QList<FindResultItem*> parents;
-    QList<int> indentations;
-    parents << parent;
-    indentations << 0;
+	if (ti)
+	{
+		QModelIndex ix (index (rootItem));
+		//QAbstractItemModel *resultsModel = view->model();
+		
+		if (!insertRow(ix.row()+1, ix.parent()))
+			return;
 
-    int number = 0;
+		for (int column = 0; column < columnCount(ix.parent()); ++column) {
+			QModelIndex child = index(ix.row()+1, column, ix.parent());
+			setData(child, QVariant(ti->getHeading()), Qt::EditRole);
+			getItem(child)->setOriginal (ti);
+		}
+	}
+}
 
-    while (number < lines.count()) {
-        int position = 0;
-        while (position < lines[number].length()) {
-            if (lines[number].mid(position, 1) != " ")
-                break;
-            position++;
-        }
+void FindResultModel::addItem (const QString &s)
+{
+	if (!s.isEmpty())
+	{
+		QModelIndex ix ( index (rootItem));
+		
+		if (!insertRow(ix.row()+1, ix.parent()))
+			return;
 
-        QString lineData = lines[number].mid(position).trimmed();
+		for (int column = 0; column < columnCount(ix.parent()); ++column) {
+			QModelIndex child = index(ix.row()+1, column, ix.parent());
+			setData(child, QVariant(s), Qt::EditRole);
+		}
+	}
+}
 
-        if (!lineData.isEmpty()) {
-            // Read the column data from the rest of the line.
-            QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts);
-            QVector<QVariant> columnData;
-            for (int column = 0; column < columnStrings.count(); ++column)
-                columnData << columnStrings[column];
 
-            if (position > indentations.last()) {
-                // The last child of the current parent is now the new parent
-                // unless the current parent has no children.
-
-                if (parents.last()->childCount() > 0) {
-                    parents << parents.last()->child(parents.last()->childCount()-1);
-                    indentations << position;
-                }
-            } else {
-                while (position < indentations.last() && parents.count() > 0) {
-                    parents.pop_back();
-                    indentations.pop_back();
-                }
-            }
-
-            // Append a new item to the current parent's list of children.
-            FindResultItem *parent = parents.last();
-            parent->insertChildren(parent->childCount(), 1, rootItem->columnCount());
-            for (int column = 0; column < columnData.size(); ++column)
-                parent->child(parent->childCount() - 1)->setData(column, columnData[column]);
-        }
-
-        number++;
-    }
-}
diff -r fac2248e2afa -r 832e96c9abb6 findresultmodel.h
--- a/findresultmodel.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/findresultmodel.h	Mon Mar 08 12:24:26 2010 +0000
@@ -6,6 +6,7 @@
 #include <QVariant>
 
 class FindResultItem;
+class TreeItem;
 
 class FindResultModel : public QAbstractItemModel
 {
@@ -14,11 +15,13 @@
 public:
     FindResultModel( QObject *parent = 0);
     ~FindResultModel();
+	void clear();
 
     QVariant data(const QModelIndex &index, int role) const;
     QVariant headerData(int section, Qt::Orientation orientation,
                         int role = Qt::DisplayRole) const;
 
+	QModelIndex index (FindResultItem *fri);
     QModelIndex index(int row, int column,
                       const QModelIndex &parent = QModelIndex()) const;
     QModelIndex parent(const QModelIndex &index) const;
@@ -41,9 +44,12 @@
     bool removeRows(int position, int rows,
                     const QModelIndex &parent = QModelIndex());
 
+    FindResultItem *getItem(const QModelIndex &index) const;
+
+	void addItem (TreeItem *ti);
+	void addItem (const QString &s);
+
 private:
-    void setupModelData(const QStringList &lines, FindResultItem *parent);
-    FindResultItem *getItem(const QModelIndex &index) const;
 
     FindResultItem *rootItem;
 };
diff -r fac2248e2afa -r 832e96c9abb6 findresultwidget.cpp
--- a/findresultwidget.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/findresultwidget.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -1,54 +1,104 @@
 #include "findresultwidget.h"
 
-#include <QLineEdit>
 #include <QVBoxLayout>
-#include <QPushButton>
 #include <QTreeView>
 
-#include <QMenuBar>
-#include <QDebug>
-
+#include "findresultitem.h"
 #include "findresultmodel.h"
+#include "vymmodel.h"
 
 extern QString iconPath;
 
-FindResultWidget::FindResultWidget(QWidget *)
+FindResultWidget::FindResultWidget(VymModel *m, QWidget *)
 {
-	// Create model
-	model=new FindResultModel;
+	model=m;
+
+	// Create results model
+	resultsModel=new FindResultModel;
 
 	// Create TreeView
-	view = new QTreeView;
-	view->setModel (model);
+	view = new QTreeView (this);
+	view->setModel (resultsModel);
 
     QVBoxLayout* mainLayout = new QVBoxLayout;
-    QHBoxLayout *row2Layout = new QHBoxLayout;
     
-	// Create Buttons
-	cancelbutton = new QPushButton;
-	//cancelbutton->setText(tr("Cancel"));
-	cancelbutton->setIcon (QIcon (iconPath+"fileclose.png"));
-	cancelbutton->setShortcut (Qt::Key_Escape);
-	connect ( cancelbutton, SIGNAL( clicked() ), this, SLOT( cancelPressed() ) );
+	// FIXME-4 feature: show number of hits at bottom of FindResultWidget
 
-	row2Layout->addWidget (cancelbutton);
-	//row2Layout->addWidget(findcombo);
-	//row2Layout->addWidget(nextbutton);
-
-	QMenuBar *mb=new QMenuBar;
+	/* FIXME-3 testing QMenuBar *mb=new QMenuBar;
 	QAction *a=new  QAction ("Foo action",NULL);
 	mb->addAction (a);
 	mb->insertSeparator();
 	mainLayout->addWidget(mb);
+	*/
 	mainLayout->addWidget(view);
-	mainLayout->addLayout (row2Layout);
 
 	setLayout (mainLayout);
+
+	model=m;
+
+	// Selection
+	connect (view->selectionModel(),SIGNAL (selectionChanged (QItemSelection,QItemSelection)),
+		this, SLOT (updateSelection (QItemSelection,QItemSelection)));
+}
+
+void FindResultWidget::addItem (TreeItem *ti)
+{
+	if (ti)
+	{
+		QModelIndex index = view->selectionModel()->currentIndex();
+		//QAbstractItemModel *resultsModel = view->model();
+		
+		if (!resultsModel->insertRow(index.row()+1, index.parent()))
+			return;
+
+		for (int column = 0; column < resultsModel->columnCount(index.parent()); ++column) {
+			QModelIndex child = resultsModel->index(index.row()+1, column, index.parent());
+			resultsModel->setData(child, QVariant(ti->getHeading()), Qt::EditRole);
+			resultsModel->getItem(child)->setOriginal (ti);
+		}
+	}
+}
+
+void FindResultWidget::addItem (const QString &s)
+{
+	if (!s.isEmpty())
+	{
+		QModelIndex index = view->selectionModel()->currentIndex();
+		
+		if (!resultsModel->insertRow(index.row()+1, index.parent()))
+			return;
+
+		for (int column = 0; column < resultsModel->columnCount(index.parent()); ++column) {
+			QModelIndex child = resultsModel->index(index.row()+1, column, index.parent());
+			resultsModel->setData(child, QVariant(s), Qt::EditRole);
+		}
+	}
+}
+
+void FindResultWidget::setModel (VymModel *m)
+{
+	if (model !=NULL && m!=model)
+		qWarning ("FindResultWidget::setModel  m!=model");
+	model=m;	
+}
+
+FindResultModel* FindResultWidget::getResultModel()
+{
+	return resultsModel;
+}
+
+void FindResultWidget::addResult (const QString &category, TreeItem *ti)
+{
+	if (!category.isEmpty())
+		addItem (category);
+	else	
+		addItem (model->getSelectedItem());
 }
 
 void FindResultWidget::popup()
 {
 	show();
+	parentWidget()->show();
 }
 
 void FindResultWidget::cancelPressed()
@@ -56,10 +106,19 @@
 	emit (hideFindResultWidget() );
 }
 
-#include <QHideEvent>
-void FindResultWidget::hideEvent(QHideEvent *event) //FIXME-2 testing only
+void FindResultWidget::updateSelection(QItemSelection newsel,QItemSelection)
 {
-	qDebug()<<"FRW::hideEvent()";
-	event->ignore();
+	QModelIndex ix;
+	foreach (ix,newsel.indexes() )
+	{
+		FindResultItem *fri= static_cast<FindResultItem*>(ix.internalPointer());
+		if (fri->getOrgModel() && fri->getOrgID()>0)
+		{
+			TreeItem *ti=fri->getOrgModel()->findID(fri->getOrgID() );
+			if (ti)
+				fri->getOrgModel()->select (ti);
+		}
+	}
 }
 
+
diff -r fac2248e2afa -r 832e96c9abb6 findresultwidget.h
--- a/findresultwidget.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/findresultwidget.h	Mon Mar 08 12:24:26 2010 +0000
@@ -1,34 +1,39 @@
 #ifndef FINDRESULTWIDGET_H 
 #define FINDRESULTWIDGET_H
 
+#include <QItemSelection>
 #include <QWidget>
 
+class FindResultModel;
+class TreeItem;
+class VymModel;
 class QTreeView;
 class QPushButton;
-class FindResultModel;
 
 class FindResultWidget: public QWidget
 {
 	Q_OBJECT
 
 public:
-	FindResultWidget (QWidget *parent=NULL);
+	FindResultWidget (VymModel *m=NULL, QWidget *parent=NULL);
+	void setModel (VymModel *m);
+	FindResultModel* getResultModel();
+	void addItem (TreeItem *ti);
+	void addItem (const QString &s);
+	void addResult (const QString &category, TreeItem *ti);
 
 public slots:	
 	void popup();
 	void cancelPressed();
-
-protected:
-	virtual void hideEvent (QHideEvent *event);
-
+	void updateSelection(QItemSelection ,QItemSelection);
 
 signals:
 	void hideFindResultWidget();
 
 private:
-	FindResultModel *model;
+	VymModel *model;
+	FindResultModel *resultsModel;
 	QTreeView *view;
-	QPushButton *cancelbutton;
 };
 
 #endif
diff -r fac2248e2afa -r 832e96c9abb6 findwidget.cpp
--- a/findwidget.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/findwidget.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -1,3 +1,5 @@
+#include <QAction>
+#include <QDebug>
 #include <QLineEdit>
 #include <QVBoxLayout>
 #include <QLabel>
@@ -9,9 +11,11 @@
 
 
 #include "findwidget.h"
+#include "mainwindow.h"
 
 
 extern QString iconPath;
+extern Main *mainWindow;
 
 FindWidget::FindWidget(QWidget *)
 {
@@ -44,13 +48,18 @@
 	nextbutton->setText (tr("Next","Find widget"));
 	nextbutton->setDefault (true);
 	nextbutton->setShortcut (Qt::Key_Return);
-	//nextbutton->setShortcutContext (Qt::WidgetShortcut);
 	connect ( nextbutton, SIGNAL( clicked() ), this, SLOT( nextPressed() ) );
 
+	showAllButton = new QPushButton;
+	showAllButton->setText (tr("Show all","Find widget"));
+	//connect ( showAllButton, SIGNAL( clicked() ), this, SLOT( showAllPressed() ) );
+	connect ( showAllButton, SIGNAL( clicked() ), mainWindow, SLOT( editOpenFindWidget() ) );
+
 	row2Layout->addWidget (cancelbutton);
 	row2Layout->addWidget (label);
 	row2Layout->addWidget(findcombo);
 	row2Layout->addWidget(nextbutton);
+	row2Layout->addWidget(showAllButton);
 
 	mainLayout->addLayout (row2Layout);
 
@@ -69,7 +78,7 @@
 void FindWidget::cancelPressed()
 {
 	hide();
-	emit (hideFindWidget() );
+	emit (hideFindWidget() );//Restore focus
 }
 
 void FindWidget::nextPressed()
@@ -82,6 +91,11 @@
 	setStatus (Undefined);
 }
 
+void FindWidget::setFocus()
+{
+	findcombo->setFocus();
+}
+
 void FindWidget::setStatus (Status st)
 {
 	if (st==status) return;
diff -r fac2248e2afa -r 832e96c9abb6 findwidget.h
--- a/findwidget.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/findwidget.h	Mon Mar 08 12:24:26 2010 +0000
@@ -3,6 +3,7 @@
 
 #include <QWidget>
 
+class QAction;
 class QGroupBox;
 class QComboBox;
 class QPushButton;
@@ -21,6 +22,7 @@
 	void cancelPressed();
 	void nextPressed();
 	void findTextChanged(const QString&);
+	void setFocus();
 	void setStatus (Status st);
 
 private:
@@ -35,6 +37,7 @@
 	QGroupBox *findbox;
 	QComboBox *findcombo;
 	QPushButton *nextbutton;
+	QPushButton *showAllButton;
 	QPushButton *cancelbutton;
 };
 
diff -r fac2248e2afa -r 832e96c9abb6 main.cpp
--- a/main.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/main.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -4,6 +4,8 @@
 #include <iostream>
 using namespace std;
 
+#include "findwidget.h"
+#include "findresultwidget.h"
 #include "flagrow.h"
 #include "flagrowobj.h"
 #include "mainwindow.h"
@@ -29,10 +31,11 @@
 QString vymInstanceName;
 
 Main *mainWindow;				// used in BranchObj::select()								
+FindWidget *findWidget;
+FindResultWidget *findResultWidget;
 
 QDBusConnection dbusConnection= QDBusConnection::sessionBus();
 
-
 QString tmpVymDir;				// All temp files go there, created in mainwindow
 QString clipboardDir;			// Clipboard used in all mapEditors
 QString clipboardFile;			// Clipboard used in all mapEditors
diff -r fac2248e2afa -r 832e96c9abb6 mainwindow.cpp
--- a/mainwindow.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/mainwindow.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -12,6 +12,7 @@
 #include "exports.h"
 #include "file.h"
 #include "findresultwidget.h"
+#include "findwidget.h"
 #include "flagrow.h"
 #include "historywindow.h"
 #include "imports.h"
@@ -42,6 +43,8 @@
 
 extern TextEditor *textEditor;
 extern Main *mainWindow;
+extern FindWidget *findWidget;
+extern FindResultWidget *findResultWidget;
 extern QString tmpVymDir;
 extern QString clipboardDir;
 extern QString clipboardFile;
@@ -124,15 +127,16 @@
 	makeSubDirs (clipboardDir);
 	clipboardEmpty=true;
 
+	// Remember PID of our friendly webbrowser
 	browserPID=new qint64;
 	*browserPID=0;
 
-	// Dock widgets //FIXME-2 testing...
-
-	FindResultWidget *findResultWidget=new FindResultWidget;
-	QDockWidget *dw= new QDockWidget ("Dock Widget",this);
+	// Dock widgets 
+	findResultWidget=new FindResultWidget ();
+	QDockWidget *dw= new QDockWidget (tr ("Search results","FindResultWidget"),this);
 	dw->setWidget (findResultWidget);
-	dw->hide();
+	dw->setObjectName ("FindResultWidget");
+	dw->hide();	
 	addDockWidget (Qt::RightDockWidgetArea,dw);
 
 	// Satellite windows //////////////////////////////////////////
@@ -197,12 +201,28 @@
 	// width of xLinksMenu
 	xLinkMenuWidth=60;
 
+	// Create Layout
+	QWidget* centralWidget = new QWidget (this);
+	QVBoxLayout *layout=new QVBoxLayout (centralWidget);
+	setCentralWidget(centralWidget);	
+
 	// Create tab widget which holds the maps
-	tabWidget= new QTabWidget (this);
+	tabWidget= new QTabWidget (centralWidget);
 	connect( tabWidget, SIGNAL( currentChanged( QWidget * ) ), 
 		this, SLOT( editorChanged( QWidget * ) ) );
 
-	setCentralWidget(tabWidget);	
+	// Create findWidget
+	findWidget = new FindWidget (centralWidget);
+	findWidget->hide();
+	layout->addWidget (tabWidget);
+	layout->addWidget (findWidget);
+
+	connect (
+		findWidget, SIGNAL (nextButton (QString) ), 
+		this, SLOT (editFindNext(QString) ) );
+    connect (
+        findWidget , SIGNAL (hideFindWidget() ),
+        this, SLOT (editHideFindWidget() ) );
 
 	setupFileActions();
 	setupEditActions();
@@ -753,7 +773,7 @@
 	a->addTo( tb );
 	switchboard.addConnection(a,tr("Edit","Shortcut group"));
 	editMenu->addAction (a);
-	actionSortBackChildren=a;
+	actionSortBackChildren=a;	//FIXME-2 is toggle action? why?
 
 	alt = new QAction( QPixmap(flagsPath+"flag-scrolled-right.png"), tr( "Scroll branch","Edit menu" ), this);
 	alt->setShortcut ( Qt::Key_S );					// Scroll branch
@@ -1675,7 +1695,7 @@
 // Test Actions
 void Main::setupTestActions()
 {
-	QMenu *testMenu = menuBar()->addMenu( tr( "&Test" ));
+	QMenu *testMenu = menuBar()->addMenu( tr( "Test" ));
 
 	QAction *a;
 	a = new QAction( "Test function 1" , this);
@@ -1905,8 +1925,9 @@
 	return NULL;	
 }
 
-VymModel* Main::getModel(uint id) const
+VymModel* Main::getModel(uint id) const	//FIXME-2 id not used
 {
+	// Used in BugAgent
 	if ( tabWidget->currentPage())
 		return vymViews.at(tabWidget->currentIndex())->getModel();
 	return NULL;	
@@ -2667,13 +2688,49 @@
 	if (m) m->cut();
 }
 
-void Main::editOpenFindWidget()
+void Main::editOpenFindWidget()  
 {
+	if (!findWidget->isVisible())
+	{
+		findWidget->show();
+		findWidget->setFocus();
+	} else if (!findResultWidget->parentWidget()->isVisible())
+		findResultWidget->parentWidget()->show();
+	else 
+	{
+		findWidget->hide();
+		findResultWidget->parentWidget()->hide();
+	}
+}
+
+void Main::editHideFindWidget()
+{
+    // findWidget hides itself, but we want
+    // to have focus back at mapEditor usually
+	MapEditor *me=currentMapEditor();
+    if (me) me->setFocus();
+}
+
+void Main::editFindNext(QString s)  
+{
+	Qt::CaseSensitivity cs=Qt::CaseInsensitive;
+	QTextCursor cursor;
 	VymModel *m=currentModel();
-	if (m) m->emitShowFindWidget();
+	if (m) 
+	{
+		m->findAll (findResultWidget->getResultModel(),s,cs);
+
+		BranchItem *bi=m->findText(s, cs,cursor);
+		if (bi)
+		{
+			findWidget->setStatus (FindWidget::Success);
+		}	
+		else
+			findWidget->setStatus (FindWidget::Failed);
+	}
 }
 
-void Main::editFindDuplicateURLs()
+void Main::editFindDuplicateURLs() //FIXME-4 feature: use FindResultWidget for display
 {
 	VymModel *m=currentModel();
 	if (m) m->findDuplicateURLs();
@@ -3925,6 +3982,11 @@
 
 void Main::testFunction2()
 {
+	findResultWidget->setModel (currentModel());
+	findResultWidget->addResult ("Test",currentModel()->getSelectedItem());
+	
+	return;
+
 	if (!currentMapEditor()) return;
 	currentMapEditor()->testFunction2();
 }
diff -r fac2248e2afa -r 832e96c9abb6 mainwindow.h
--- a/mainwindow.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/mainwindow.h	Mon Mar 08 12:24:26 2010 +0000
@@ -16,7 +16,6 @@
 #include "texteditor.h"
 #include "vymview.h"
 
-
 class Main : public QMainWindow 
 {
     Q_OBJECT
@@ -123,6 +122,8 @@
     void editPaste();	
     void editCut();	
     void editOpenFindWidget();
+    void editHideFindWidget();
+	void editFindNext(QString s);
     void editFindDuplicateURLs();
 private:
 	void openTabs(QStringList);
diff -r fac2248e2afa -r 832e96c9abb6 texteditor.cpp
--- a/texteditor.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/texteditor.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -232,12 +232,18 @@
 	setFontHint (note.getFontHint() );
 }
 
-bool TextEditor::findText(const QString &t, const QTextDocument::FindFlags &flags)
+bool TextEditor::findText(const QString &t, const QTextDocument::FindFlags &flags, QTextCursor &cursor)
 {
 	if (e->find (t,flags))
+	{
+		cursor=e->textCursor();
 		return true;
+	}	
 	else	
+	{
+		cursor=QTextCursor();
 		return false;
+	}
 }
 
 void TextEditor::setupFileActions()
diff -r fac2248e2afa -r 832e96c9abb6 texteditor.h
--- a/texteditor.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/texteditor.h	Mon Mar 08 12:24:26 2010 +0000
@@ -28,7 +28,7 @@
 	NoteObj getNoteObj();
 	void setNote(const NoteObj &note);
 
-	bool findText(const QString &, const QTextDocument::FindFlags &); // find Text 
+	bool findText(const QString &, const QTextDocument::FindFlags &,QTextCursor &cursor); 
 
 protected:
 	void setupFileActions();
diff -r fac2248e2afa -r 832e96c9abb6 version.h
--- a/version.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/version.h	Mon Mar 08 12:24:26 2010 +0000
@@ -7,7 +7,7 @@
 #define __VYM_VERSION "1.13.0"
 //#define __VYM_CODENAME "Codename: RC-1"
 #define __VYM_CODENAME "Codename: development version, not for production!"
-#define __VYM_BUILD_DATE "2010-02-26"
+#define __VYM_BUILD_DATE "2010-03-08"
 
 
 bool checkVersion(const QString &);
diff -r fac2248e2afa -r 832e96c9abb6 vymmodel.cpp
--- a/vymmodel.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/vymmodel.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -12,6 +12,7 @@
 #include "exporthtmldialog.h"
 #include "exportxhtmldialog.h"
 #include "file.h"
+#include "findresultmodel.h"
 #include "geometry.h"		// for addBBox
 #include "mainwindow.h"
 #include "misc.h"
@@ -1608,7 +1609,24 @@
 	}
 }
 
-BranchItem* VymModel::findText (QString s, bool cs)   
+void  VymModel::findAll (FindResultModel *rmodel, QString s, Qt::CaseSensitivity cs)   
+{
+	rmodel->clear();
+	BranchItem *cur=NULL;
+	BranchItem *prev=NULL;
+	nextBranch(cur,prev);
+	while (cur) 
+	{
+		if (cur->getHeading().contains (s,cs))
+		{
+			rmodel->addItem (cur);
+		}	
+		//if (cur->getNote().contains (s,cs))	//FIXME-2 does not detect multiple occurences
+		nextBranch(cur,prev);
+	}
+}
+
+BranchItem* VymModel::findText (QString s,Qt::CaseSensitivity cs,QTextCursor &cursor)   
 {
 	if (!s.isEmpty() && s!=findString)
 	{
@@ -1617,7 +1635,7 @@
 	}
 
 	QTextDocument::FindFlags flags=0;
-	if (cs) flags=QTextDocument::FindCaseSensitively;
+	if (cs==Qt::CaseSensitive) flags=QTextDocument::FindCaseSensitively;
 
 	if (!findCurrent) 
 	{	// Nothing found or new find process
@@ -1638,14 +1656,7 @@
 			if (findCurrent->getNote().contains(findString,cs))
 			{
 				select (findCurrent);
-				/*
-				if (getSelectedBranch()!=itFind) 
-				{
-					select(itFind);
-					emitShowSelection();
-				}
-				*/
-				if (textEditor->findText(findString,flags)) 
+				if (textEditor->findText(findString,flags,cursor)) 
 				{
 					searching=false;
 					foundNote=true;
@@ -1663,7 +1674,6 @@
 			if (!nextBranch(findCurrent,findPrevious) )
 				EOFind=true;
 		}
-	//cout <<"still searching...  "<<qPrintable( itFind->getHeading())<<endl;
 	}	
 	if (!searching)
 		return getSelectedBranch();
@@ -1679,11 +1689,6 @@
 	EOFind=false;
 }
 
-void VymModel::emitShowFindWidget()
-{
-	emit (showFindWidget());
-}
-
 void VymModel::setScene (QGraphicsScene *s)
 {
 	mapScene=s;	
@@ -2549,7 +2554,7 @@
 		if (selbi->depth()<2) return;
 
 		pi=(BranchItem*)(selbi->parent());
-		// Check if we have childs at all to keep
+		// Check if we have children at all to keep
 		if (selbi->branchCount()==0) 
 		{
 			deleteSelection();
diff -r fac2248e2afa -r 832e96c9abb6 vymmodel.h
--- a/vymmodel.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/vymmodel.h	Mon Mar 08 12:24:26 2010 +0000
@@ -7,6 +7,8 @@
 #include <QtDBus/QDBusAbstractAdaptor>
 #include <QtDBus/QDBusVariant>
 
+#include <QTextCursor>
+
 #include "adaptormodel.h"
 #include "file.h"
 #include "imageitem.h"
@@ -17,6 +19,7 @@
 
 class AttributeItem;
 class BranchItem;
+class FindResultModel;
 class MapEditor;
 class XLinkItem;
 
@@ -269,13 +272,11 @@
 
 public:
 	void findDuplicateURLs();				// find duplicate URLs, testing only so far
-    BranchItem* findText(QString,bool);		// Find object
+    void findAll (FindResultModel*, QString s, Qt::CaseSensitivity cs);	// Search all objects at once, also notes
+    BranchItem* findText(QString s,Qt::CaseSensitivity cs,QTextCursor &cursor);	// Find object, also in note
     void findReset();						// Reset Search
-	void emitShowFindWidget();				// Tell views to show FindWidget
 private:	
 	QString findString;
-signals:
-	void showFindWidget();				
 
 public:
 	void setURL(const QString &url);
diff -r fac2248e2afa -r 832e96c9abb6 vymview.cpp
--- a/vymview.cpp	Mon Mar 08 12:22:15 2010 +0000
+++ b/vymview.cpp	Mon Mar 08 12:24:26 2010 +0000
@@ -1,7 +1,6 @@
 #include "vymview.h"
 
 #include "branchitem.h"
-#include "findwidget.h"
 #include "mainwindow.h"
 #include "mapeditor.h"
 #include "treeeditor.h"
@@ -13,10 +12,6 @@
 {
 	model=m;
 
-	// Create findWidget
-	findWidget=new FindWidget (this);
-	findWidget->hide();
-
 	// Create TreeView
 	treeEditor=new TreeEditor (model);
 	//treeEditor->setModel ((QAbstractItemModel*)model);
@@ -25,10 +20,8 @@
 	treeEditor->setColumnWidth (0,150);
 	treeEditor->setAnimated (true);
 
-	// FIXME-3 use proxySelModel=treeEditor->selectionModel();
 	selModel=new QItemSelectionModel (model);
 
-	//model->setSelectionModel (proxySelModel);
 	model->setSelectionModel (selModel);
 	treeEditor->setSelectionModel (selModel);
 
@@ -37,26 +30,15 @@
 	if (!mapEditor) mapEditor=new MapEditor (model);
 
 	// Create Layout 
-	QVBoxLayout* mainLayout = new QVBoxLayout (this);
-	QSplitter *splitter= new QSplitter;
+	QVBoxLayout* mainLayout = new QVBoxLayout (this); //FIXME-4 not needed
+	QSplitter *splitter= new QSplitter (this);
 
 	QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    //sizePolicy.setHorizontalStretch(0);
-    //sizePolicy.setVerticalStretch(0);
-    //sizePolicy.setHeightForWidth(this->sizePolicy().hasHeightForWidth());
     splitter->setSizePolicy(sizePolicy);
 	mainLayout->addWidget (splitter);
-	mainLayout->addWidget (findWidget);
 
 	// Connect selections
 
-		// Proxymodel changed
-		/*
-		connect (
-			proxySelModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), 
-			this,SLOT (changeProxySelection(const QItemSelection &,const QItemSelection &)));
-*/
-
 		// Selection in Model changed	
 		connect (
 			selModel, SIGNAL (selectionChanged(const QItemSelection &, const QItemSelection &)), 
@@ -103,19 +85,6 @@
 		model, SIGNAL (showSelection() ),
 		this, SLOT (showSelection() ) );
 		
-	// Find	
-	connect (
-		model, SIGNAL (showFindWidget() ),
-		this, SLOT (showFindWidget() ) );
-		
-	connect (
-		findWidget , SIGNAL (hideFindWidget() ),
-		this, SLOT (hideFindWidget() ) );
-		
-	connect (
-		findWidget, SIGNAL (nextButton (QString) ),
-		this, SLOT (findNext(QString) ) );
-		
 	mapEditor->setAntiAlias (mainWindow->isAliased());
 	mapEditor->setSmoothPixmap(mainWindow->hasSmoothPixmapTransform());
 
@@ -159,11 +128,6 @@
 	if (newsel.indexes().count()>0)
 	{
 
-	/* FIXME-3 use proxymodel
-		proxySelModel->select (
-			treeEditor->getProxyModel()->mapSelectionFromSource (newsel),
-			QItemSelectionModel::ClearAndSelect );
-		*/
 		
 		QModelIndex ix=newsel.indexes().first();
 		selModel->setCurrentIndex (ix,QItemSelectionModel::ClearAndSelect  );
@@ -173,30 +137,6 @@
 	}
 }
 
-void VymView::changeProxySelection (const QItemSelection &newsel, const QItemSelection &)
-{
-	// Notify mainwindow to update satellites, but map selection to 
-	// original model first
-
-	//cout << "VV::changeProxySelection   newsel.count="<<newsel.indexes().count()<<endl;
-	if (!newsel.indexes().isEmpty())
-	{
-	/* FIXME-3 need to set current, too
-	*/
-		proxySelModel->setCurrentIndex (
-			newsel.indexes().first(),
-			QItemSelectionModel::ClearAndSelect );
-	treeEditor->setCurrentIndex (newsel.indexes().first() );
-	}
-
-	// Re-emit but map selection first
-	selModel->select (
-		treeEditor->getProxyModel()->mapSelectionToSource (newsel),
-		QItemSelectionModel::ClearAndSelect );
-
-	showSelection();
-}
-
 void VymView::expandAll()
 {
 	treeEditor->expandAll();
@@ -214,7 +154,6 @@
 	model->nextBranch(cur,prev);
 	while (cur) 
 	{
-		// FIXME-3 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
 		pix=model->index (cur);
 		d=cur->depth();
 		if (!treeEditor->isExpanded(pix) && d < level)
@@ -228,7 +167,6 @@
 	model->nextBranch(cur,prev);
 	while (cur) 
 	{
-		// FIXME-3 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
 		pix=model->index (cur);
 		d=cur->depth();
 		if (!treeEditor->isExpanded(pix) && d <= level && cur->branchCount()>0)
@@ -258,7 +196,6 @@
 	model->nextBranch(cur,prev);
 	while (cur) 
 	{
-		// FIXME-3 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
 		pix=model->index (cur);
 		d=cur->depth();
 		if (treeEditor->isExpanded(pix) && d > level)
@@ -272,7 +209,6 @@
 	model->nextBranch(cur,prev);
 	while (cur) 
 	{
-		// FIXME-3 use proxy pix=treeEditor->getProxyModel()->mapFromSource (model->index (cur));
 		pix=model->index (cur);
 		d=cur->depth();
 		if (treeEditor->isExpanded(pix) && d >= level)
@@ -288,34 +224,6 @@
 	mapEditor->scrollTo ( ix);	// FIXME-3 also called from MapEditor::updateSelection...
 }
 
-void VymView::showFindWidget()
-{
-	findWidget->popup();
-}
-
-void VymView::hideFindWidget()
-{
-	// findWidget hides itself, but we want to have focus back at mapEditor usually
-	if (mapEditor) mapEditor->setFocus();
-}
-
-void VymView::findNext (QString s)
-{
-	bool cs=false;
-	BranchItem *bi=model->findText(s, cs);
-	if (bi)
-		findWidget->setStatus (FindWidget::Success);
-	else
-		findWidget->setStatus (FindWidget::Failed);
-
-}
-
-void VymView::findReset()
-{
-	model->findReset();
-	if (mapEditor) mapEditor->setFocus();
-}
-
 void VymView::toggleTreeEditor()
 {
 	if (treeEditor->isVisible() )
diff -r fac2248e2afa -r 832e96c9abb6 vymview.h
--- a/vymview.h	Mon Mar 08 12:22:15 2010 +0000
+++ b/vymview.h	Mon Mar 08 12:24:26 2010 +0000
@@ -7,7 +7,6 @@
 class VymModel;
 class MapEditor;
 class TreeEditor;
-class FindWidget;
 
 class QTreeView;
 
@@ -23,24 +22,17 @@
 
 public slots:
 	void changeSelection (const QItemSelection &newSel, const QItemSelection &delSel);
-	void changeProxySelection (const QItemSelection &newSel, const QItemSelection &delSel);
 	void expandAll ();
 	void expandOneLevel ();
 	void collapseOneLevel ();
 	void showSelection ();
-	void showFindWidget();
-	void hideFindWidget();
-	void findNext (QString s);
-	void findReset();
 	void toggleTreeEditor();
 
 private:
 	VymModel *model;
 	TreeEditor *treeEditor;
-	QItemSelectionModel *proxySelModel;
 	QItemSelectionModel *selModel;
 	MapEditor *mapEditor;
-	FindWidget *findWidget;
 };