[qet] qet/qet: [5526] Start the work on a new feature : search and replace.

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 5526
Author:   blacksun
Date:     2018-09-25 18:05:24 +0200 (Tue, 25 Sep 2018)
Log Message:
-----------
Start the work on a new feature : search and replace.
This commit let user find for : texts, conductors and elements.
WIP.

Modified Paths:
--------------
    trunk/qelectrotech.pro
    trunk/sources/diagramcontent.cpp
    trunk/sources/diagramcontent.h
    trunk/sources/diagramview.cpp
    trunk/sources/qetdiagrameditor.cpp
    trunk/sources/qetdiagrameditor.h
    trunk/sources/ui/masterpropertieswidget.cpp

Added Paths:
-----------
    trunk/sources/SearchAndReplace/
    trunk/sources/SearchAndReplace/ui/
    trunk/sources/SearchAndReplace/ui/searchandreplacewidget.cpp
    trunk/sources/SearchAndReplace/ui/searchandreplacewidget.h
    trunk/sources/SearchAndReplace/ui/searchandreplacewidget.ui

Modified: trunk/qelectrotech.pro
===================================================================
--- trunk/qelectrotech.pro	2018-09-25 13:12:01 UTC (rev 5525)
+++ trunk/qelectrotech.pro	2018-09-25 16:05:24 UTC (rev 5526)
@@ -92,7 +92,9 @@
                sources/ElementsCollection/ui \
                sources/autoNum \
                sources/autoNum/ui \
-               sources/ui/configpage
+               sources/ui/configpage \
+			   sources/SearchAndReplace \
+			   sources/SearchAndReplace/ui
 
 
 # Fichiers sources
@@ -113,7 +115,9 @@
            $$files(sources/ElementsCollection/ui/*.h) \
            $$files(sources/autoNum/*.h) \
            $$files(sources/autoNum/ui/*.h) \
-           $$files(sources/ui/configpage/*.h)
+           $$files(sources/ui/configpage/*.h) \
+           $$files(sources/SearchAndReplace/*.h) \
+		   $$files(sources/SearchAndReplace/ui/*.h)
 
 SOURCES += $$files(sources/*.cpp) \
            $$files(sources/editor/*.cpp) \
@@ -133,7 +137,9 @@
            $$files(sources/ElementsCollection/ui/*.cpp) \
            $$files(sources/autoNum/*.cpp) \
            $$files(sources/autoNum/ui/*.cpp) \
-           $$files(sources/ui/configpage/*.cpp)
+           $$files(sources/ui/configpage/*.cpp) \
+		   $$files(sources/SearchAndReplace/*.cpp) \
+		   $$files(sources/SearchAndReplace/ui/*.cpp)
 
 # Liste des fichiers qui seront incorpores au binaire en tant que ressources Qt
 RESOURCES += qelectrotech.qrc
@@ -153,7 +159,8 @@
          $$files(sources/editor/ui/*.ui) \
          $$files(sources/ElementsCollection/ui/*.ui) \
          $$files(sources/autoNum/ui/*.ui) \
-         $$files(sources/ui/configpage/*.ui)
+         $$files(sources/ui/configpage/*.ui) \
+		 $$files(sources/SearchAndReplace/ui/*.ui)
 
 UI_SOURCES_DIR = sources/ui/
 UI_HEADERS_DIR = sources/ui/

Added: trunk/sources/SearchAndReplace/ui/searchandreplacewidget.cpp
===================================================================
--- trunk/sources/SearchAndReplace/ui/searchandreplacewidget.cpp	                        (rev 0)
+++ trunk/sources/SearchAndReplace/ui/searchandreplacewidget.cpp	2018-09-25 16:05:24 UTC (rev 5526)
@@ -0,0 +1,690 @@
+/*
+	Copyright 2006-2018 The QElectroTech Team
+	This file is part of QElectroTech.
+	
+	QElectroTech is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 2 of the License, or
+	(at your option) any later version.
+	
+	QElectroTech is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+	
+	You should have received a copy of the GNU General Public License
+	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "searchandreplacewidget.h"
+#include "ui_searchandreplacewidget.h"
+#include "qetdiagrameditor.h"
+#include "qetproject.h"
+#include "diagram.h"
+#include "qeticons.h"
+#include "element.h"
+#include "independenttextitem.h"
+#include "conductor.h"
+
+/**
+ * @brief SearchAndReplaceWidget::SearchAndReplaceWidget
+ * Constructor
+ * @param parent
+ */
+SearchAndReplaceWidget::SearchAndReplaceWidget(QWidget *parent) :
+	QWidget(parent),
+	ui(new Ui::SearchAndReplaceWidget)
+{
+	ui->setupUi(this);
+	setHideAdvanced(true);
+	setUpTreeItems();
+	
+	connect(ui->m_search_le, &QLineEdit::textEdited, this, &SearchAndReplaceWidget::search);
+}
+
+/**
+ * @brief SearchAndReplaceWidget::~SearchAndReplaceWidget
+ * Destructor
+ */
+SearchAndReplaceWidget::~SearchAndReplaceWidget() {
+	delete ui;
+}
+
+/**
+ * @brief SearchAndReplaceWidget::event
+ * Reimplemented to clear the the lines edit and hide
+ * the advanced widgets, when this widget become hidden
+ * @param event
+ * @return 
+ */
+bool SearchAndReplaceWidget::event(QEvent *event)
+{
+	if (event->type() == QEvent::Hide)
+	{
+		clear();
+		setHideAdvanced(true);
+		if (m_highlighted_element)
+		{
+			m_highlighted_element.data()->setHighlighted(false);
+			m_highlighted_element.clear();
+		}
+	}
+	else if (event->type() == QEvent::Show)
+	{
+		ui->m_search_le->setFocus();
+		fillItemsList();
+		m_root_qtwi->setExpanded(true);
+	}
+	
+	return QWidget::event(event);
+}
+
+/**
+ * @brief SearchAndReplaceWidget::clear
+ * Clear the content of the search and replace line edit
+ * Clear all tree items in the tree widget (except the category items).
+ */
+void SearchAndReplaceWidget::clear()
+{
+	disconnect(ui->m_tree_widget, &QTreeWidget::itemChanged, this, &SearchAndReplaceWidget::itemChanged);
+	
+	qDeleteAll(m_element_hash.keys());
+	m_element_hash.clear();
+	
+	qDeleteAll(m_text_hash.keys());
+	m_text_hash.clear();
+	
+	qDeleteAll(m_conductor_hash.keys());
+	m_conductor_hash.clear();
+	
+	for (QTreeWidgetItem *qtwi : m_category_qtwi)
+		qtwi->setHidden(false);
+	
+	ui->m_tree_widget->collapseAll();
+	ui->m_tree_widget->clearSelection();
+	
+	ui->m_search_le->clear();
+	ui->m_replace_le->clear();
+	updateNextPreviousButtons();
+	ui->m_search_le->setPalette(QPalette());
+}
+
+/**
+ * @brief SearchAndReplaceWidget::setEditor
+ * Set the diagram editor of this widget
+ * @param editor
+ */
+void SearchAndReplaceWidget::setEditor(QETDiagramEditor *editor) {
+	m_editor = editor;
+}
+
+/**
+ * @brief SearchAndReplaceWidget::setUpTreeItems
+ * Set up the main tree widget items
+ */
+void SearchAndReplaceWidget::setUpTreeItems()
+{
+	m_root_qtwi = new QTreeWidgetItem(ui->m_tree_widget);
+	m_root_qtwi->setIcon(0, QET::Icons::ProjectProperties);
+	m_root_qtwi->setText(0, tr("Correspondance :"));
+	m_root_qtwi->setCheckState(0, Qt::Checked);
+	m_category_qtwi.append(m_root_qtwi);
+	
+	m_folio_qtwi = new QTreeWidgetItem(m_root_qtwi);
+	m_folio_qtwi->setIcon(0, QET::Icons::Diagram);
+	m_folio_qtwi->setText(0, tr("Folios"));
+	m_folio_qtwi->setCheckState(0, Qt::Checked);
+	m_category_qtwi.append(m_folio_qtwi);
+	
+	m_indi_text_qtwi = new QTreeWidgetItem(m_root_qtwi);
+	m_indi_text_qtwi->setIcon(0, QET::Icons::PartText);
+	m_indi_text_qtwi->setText(0, tr("Champs texte"));
+	m_indi_text_qtwi->setCheckState(0, Qt::Checked);
+	m_category_qtwi.append(m_indi_text_qtwi);
+	
+	m_elements_qtwi = new QTreeWidgetItem(m_root_qtwi);
+	m_elements_qtwi->setIcon(0, QET::Icons::Element);
+	m_elements_qtwi->setText(0, tr("Elements"));
+	m_elements_qtwi->setCheckState(0, Qt::Checked);
+	m_category_qtwi.append(m_elements_qtwi);
+	
+	m_simple_elmt_qtwi = new QTreeWidgetItem(m_elements_qtwi);
+	m_simple_elmt_qtwi->setText(0, tr("Elements simple"));
+	m_simple_elmt_qtwi->setIcon(0, QET::Icons::Element);
+	m_simple_elmt_qtwi->setCheckState(0, Qt::Checked);
+	m_qtwi_elmts.append(m_simple_elmt_qtwi);
+	
+	m_master_elmt_qtwi= new QTreeWidgetItem(m_elements_qtwi);
+	m_master_elmt_qtwi->setText(0, tr("Elements maître"));
+	m_master_elmt_qtwi->setCheckState(0, Qt::Checked);
+	m_qtwi_elmts.append(m_master_elmt_qtwi);
+	
+	m_slave_elmt_qtwi = new QTreeWidgetItem(m_elements_qtwi);
+	m_slave_elmt_qtwi->setText(0, tr("Elements esclave"));
+	m_slave_elmt_qtwi->setCheckState(0, Qt::Checked);
+	m_qtwi_elmts.append(m_slave_elmt_qtwi);
+	
+	m_report_elmt_qtwi = new QTreeWidgetItem(m_elements_qtwi);
+	m_report_elmt_qtwi->setText(0, tr("Elements report de folio"));
+	m_report_elmt_qtwi->setCheckState(0, Qt::Checked);
+	m_qtwi_elmts.append(m_report_elmt_qtwi);
+	
+	m_terminal_elmt_qtwi = new QTreeWidgetItem(m_elements_qtwi);
+	m_terminal_elmt_qtwi->setText(0, tr("Elements bornier"));
+	m_terminal_elmt_qtwi->setCheckState(0, Qt::Checked);
+	m_qtwi_elmts.append(m_terminal_elmt_qtwi);
+	m_category_qtwi.append(m_qtwi_elmts);
+	
+	m_conductor_qtwi = new QTreeWidgetItem(m_root_qtwi);
+	m_conductor_qtwi->setIcon(0, QET::Icons::ConductorSettings);
+	m_conductor_qtwi->setText(0, tr("Conducteurs"));
+	m_conductor_qtwi->setCheckState(0, Qt::Checked);
+	m_category_qtwi.append(m_conductor_qtwi);
+	
+	updateNextPreviousButtons();
+}
+
+/**
+ * @brief SearchAndReplaceWidget::setHideAdvanced
+ * Hide advanced widgets
+ * @param hide
+ */
+void SearchAndReplaceWidget::setHideAdvanced(bool hide) const
+{
+	ui->m_advanced_pb   ->setChecked(!hide);
+	ui->m_replace       ->setHidden(hide);
+	ui->m_replace_le    ->setHidden(hide);
+	ui->m_mode          ->setHidden(hide);
+	ui->m_mode_cb       ->setHidden(hide);
+	ui->m_tree_widget   ->setHidden(hide);
+	ui->m_replace_pb    ->setHidden(hide);
+	ui->m_replace_all_pb->setHidden(hide);
+	QSize size = ui->m_v_spacer->sizeHint();
+	ui->m_v_spacer->changeSize(size.width(), size.height(), QSizePolicy::Minimum, hide ? QSizePolicy::Expanding : QSizePolicy::Ignored);
+}
+
+/**
+ * @brief SearchAndReplaceWidget::fillItemsList
+ * Fill the tree
+ */
+void SearchAndReplaceWidget::fillItemsList()
+{
+	disconnect(ui->m_tree_widget, &QTreeWidget::itemChanged, this, &SearchAndReplaceWidget::itemChanged);
+	
+	qDeleteAll(m_element_hash.keys());
+	m_element_hash.clear();
+	
+	QETProject *project_ = m_editor->currentProject();
+	if (!project_) {
+		return;
+	}
+
+	
+	DiagramContent dc;
+	for (Diagram *diagram : project_->diagrams()) {
+		dc += DiagramContent(diagram, false);
+	}
+	
+	for (Element *elmt : dc.m_elements)
+		addElement(elmt);
+	
+		//Sort child of each "element type" tree item.
+		//we hide, "element type" tree item, if they do not have children 
+	for(QTreeWidgetItem *qtwi : m_qtwi_elmts)
+	{
+		qtwi->sortChildren(0, Qt::AscendingOrder);
+		qtwi->setHidden(qtwi->childCount() ? false : true);
+	}
+	
+	for (IndependentTextItem *iti : dc.m_text_fields)
+	{
+		QTreeWidgetItem *qtwi = new QTreeWidgetItem(m_indi_text_qtwi);
+		qtwi->setText(0, iti->toPlainText());
+		qtwi->setCheckState(0, Qt::Checked);
+		m_text_hash.insert(qtwi, QPointer<IndependentTextItem>(iti));
+	}
+	m_indi_text_qtwi->sortChildren(0, Qt::AscendingOrder);
+
+	for (Conductor *c : dc.m_potential_conductors)
+	{
+		QTreeWidgetItem *qtwi = new QTreeWidgetItem(m_conductor_qtwi);
+		qtwi->setText(0, c->properties().text);
+		qtwi->setCheckState(0, Qt::Checked);
+		m_conductor_hash.insert(qtwi, QPointer<Conductor>(c));
+	}
+	m_conductor_qtwi->sortChildren(0, Qt::AscendingOrder);
+	
+	updateNextPreviousButtons();
+	connect(ui->m_tree_widget, &QTreeWidget::itemChanged, this, &SearchAndReplaceWidget::itemChanged);
+}
+
+/**
+ * @brief SearchAndReplaceWidget::addElement
+ * Add a tree widget item for @element
+ * @param element
+ */
+void SearchAndReplaceWidget::addElement(Element *element)
+{
+	QTreeWidgetItem *parent = m_elements_qtwi;
+	switch (element->linkType()) {
+		case Element::Simple:
+			parent = m_simple_elmt_qtwi;
+			break;
+		case Element::NextReport:
+			parent = m_report_elmt_qtwi;
+			break;
+		case Element::PreviousReport:
+			parent = m_report_elmt_qtwi;
+			break;
+		case Element::Master:
+			parent = m_master_elmt_qtwi;
+			break;
+		case Element::Slave:
+			parent = m_slave_elmt_qtwi;
+			break;
+		case Element::Terminale:
+			parent = m_terminal_elmt_qtwi;
+			break;
+		default:
+			break;
+	}
+	QTreeWidgetItem *qtwi = new QTreeWidgetItem(parent);
+	m_element_hash.insert(qtwi, QPointer<Element>(element));
+	
+	QString str;
+	str += element->elementInformations().value("label").toString();
+	if(!str.isEmpty())
+		str += ("   ");
+	str += element->elementInformations().value("comment").toString();
+	if (str.isEmpty())
+		str = tr("Inconnue");
+	qtwi->setText(0, str);
+	qtwi->setCheckState(0, Qt::Checked);
+}
+
+/**
+ * @brief SearchAndReplaceWidget::search
+ * Start the search
+ */
+void SearchAndReplaceWidget::search()
+{
+	QString str = ui->m_search_le->text();
+	if(str.isEmpty())
+	{
+		for (QTreeWidgetItemIterator it(m_root_qtwi) ; *it ; ++it) {
+			(*it)->setHidden(false);
+		}
+		
+		for (QTreeWidgetItem *item : m_category_qtwi) {
+			item->setExpanded(false);
+		}
+		m_root_qtwi->setExpanded(true);
+		
+		ui->m_tree_widget->setCurrentItem(m_root_qtwi);
+		ui->m_search_le->setPalette(QPalette());
+	}
+	else
+	{
+		for (QTreeWidgetItemIterator it(m_root_qtwi) ; *it ; ++it) {
+			(*it)->setHidden(true);
+		}
+		
+		bool match = false;
+		for(QTreeWidgetItem *qtwi : ui->m_tree_widget->findItems(str, Qt::MatchContains | Qt::MatchRecursive))
+		{
+			match = true;
+			qtwi->setHidden(false);
+			setVisibleAllParents(qtwi);
+		}
+		
+		QPalette background = ui->m_search_le->palette();
+		background.setColor(QPalette::Base, match ? QColor("#E0FFF0") : QColor("#FFE0EF"));
+		ui->m_search_le->setPalette(background);
+		
+			//Go to the first occurence
+		ui->m_tree_widget->setCurrentItem(m_root_qtwi);
+		on_m_next_pb_clicked();
+	}
+}
+
+/**
+ * @brief SearchAndReplaceWidget::setVisibleAllParents
+ * Set visible all parents of @item until the invisible root item
+ * @param item
+ * @param expend_parent
+ */
+void SearchAndReplaceWidget::setVisibleAllParents(QTreeWidgetItem *item, bool expend_parent)
+{
+	if (item->parent())
+	{
+		QTreeWidgetItem *parent = item->parent();
+		parent->setHidden(false);
+		setVisibleAllParents(parent);
+		parent->setExpanded(expend_parent);
+	}
+}
+
+/**
+ * @brief SearchAndReplaceWidget::nextItem
+ * @param item : find the next item from @item, if @item is nullptr, start the search for the root of the tree
+ * @param flags
+ * @return the next item according to flag or nullptr if there is not a next item
+ */
+QTreeWidgetItem *SearchAndReplaceWidget::nextItem(QTreeWidgetItem *item, QTreeWidgetItemIterator::IteratorFlag flags) const
+{
+	QTreeWidgetItem *qtwi = item;
+	if (!item) {
+		qtwi = ui->m_tree_widget->currentItem();
+	}
+	
+	if (!qtwi) {
+		qtwi = m_root_qtwi;
+	}
+	
+	QTreeWidgetItemIterator it(qtwi, flags);
+
+	++it;
+	QTreeWidgetItem *next_ = *it;
+	if (next_) {
+		return next_;
+	}
+	else {
+		return nullptr;
+	}
+}
+
+/**
+ * @brief SearchAndReplaceWidget::previousItem
+ * @param item : find the previous item from @item, if @item is nullptr, start the search for the root of the tree
+ * @param flags
+ * @return the previous item according to flag or nullptr if there is not a previous item
+ */
+QTreeWidgetItem *SearchAndReplaceWidget::previousItem(QTreeWidgetItem *item, QTreeWidgetItemIterator::IteratorFlag flags) const
+{
+	QTreeWidgetItem *qtwi = item;
+	if (!item) {
+		qtwi = ui->m_tree_widget->currentItem();
+	}
+	
+	if (!qtwi) {
+		qtwi = m_root_qtwi;
+	}
+	
+	QTreeWidgetItemIterator it(qtwi, flags);
+	
+	--it;
+	QTreeWidgetItem *previous_ = *it;
+	if (previous_) {
+		return previous_;
+	}
+	else {
+		return nullptr;
+	}
+}
+
+/**
+ * @brief SearchAndReplaceWidget::updateNextPreviousButtons
+ * According to the current item, if there is a next or a previous item,
+ * we enable/disable the buttons next/previous item. 
+ */
+void SearchAndReplaceWidget::updateNextPreviousButtons()
+{
+	QTreeWidgetItem *item_ = ui->m_tree_widget->currentItem();
+	if (!item_)
+	{
+		ui->m_next_pb->setEnabled(true);
+		ui->m_previous_pb->setDisabled(true);
+		return;
+	}
+	
+	QTreeWidgetItem *next_ = item_;
+	do
+	{
+		next_ = nextItem(next_, QTreeWidgetItemIterator::NotHidden);
+		if (!next_)
+		{
+			ui->m_next_pb->setDisabled(true);
+			break;
+		}
+		else if (!m_category_qtwi.contains(next_))
+		{
+				 ui->m_next_pb->setEnabled(true);
+				 break;
+		}
+	} while (m_category_qtwi.contains(next_));
+	
+	QTreeWidgetItem *previous_ = item_;
+	do
+	{
+		previous_ = previousItem(previous_, QTreeWidgetItemIterator::NotHidden);
+		if (!previous_)
+		{
+			ui->m_previous_pb->setDisabled(true);
+			break;
+		}
+		else if (!m_category_qtwi.contains(previous_))
+		{
+				 ui->m_previous_pb->setEnabled(true);
+				 break;
+		}
+	} while (m_category_qtwi.contains(previous_));
+}
+
+/**
+ * @brief SearchAndReplaceWidget::itemChanged
+ * Reimplemented from QTreeWidget.
+ * Use to update the check state of items.
+ * @param item
+ * @param column
+ */
+void SearchAndReplaceWidget::itemChanged(QTreeWidgetItem *item, int column)
+{
+	Q_UNUSED(column);
+	ui->m_tree_widget->blockSignals(true);
+	
+	setChildCheckState(item, item->checkState(0));
+	updateParentCheckState(item);
+	
+	ui->m_tree_widget->blockSignals(false);
+}
+
+/**
+ * @brief SearchAndReplaceWidget::setChildCheckState
+ * @param item : Parent of the items to be evaluated
+ * @param check : check state
+ * @param deep : if true, we evaluate every subchilds.
+ */
+void SearchAndReplaceWidget::setChildCheckState(QTreeWidgetItem *item, Qt::CheckState check, bool deep)
+{
+	for (int i=0 ; i<item->childCount() ; ++i)
+	{
+		item->child(i)->setCheckState(0, check);
+		if (deep && item->child(i)->childCount()) {
+			setChildCheckState(item->child(i), check, deep);
+		}
+	}
+}
+
+/**
+ * @brief SearchAndReplaceWidget::updateParentCheckState
+ * @param item : a child item of the parent to be evaluated.
+ * @param all_parents : if true, we evaluate every parents, until the root item.
+ */
+void SearchAndReplaceWidget::updateParentCheckState(QTreeWidgetItem *item, bool all_parents)
+{
+	QTreeWidgetItem *parent = item->parent();
+	
+	if (!parent) {
+		parent = item;
+	}
+	
+	int check=0,
+		partially=0;
+			
+	for (int i=0 ; i<parent->childCount() ; ++i)
+	{
+		switch (parent->child(i)->checkState(0)) {
+			case Qt::Checked:
+				++check;
+				break;
+			case Qt::PartiallyChecked:
+				++partially;
+				break;
+			default:
+				break;
+		}
+	}
+
+	if (check == parent->childCount()) {
+		parent->setCheckState(0, Qt::Checked);
+	}
+	else if (partially || check) {
+		parent->setCheckState(0, Qt::PartiallyChecked);
+	}
+	else {
+		parent->setCheckState(0, Qt::Unchecked);
+	}
+	
+	if (all_parents && item->parent()) {
+		updateParentCheckState(parent, all_parents);
+	}
+}
+
+void SearchAndReplaceWidget::on_m_quit_button_clicked() {
+    this->setHidden(true);
+}
+
+void SearchAndReplaceWidget::on_m_advanced_pb_toggled(bool checked) {
+    setHideAdvanced(!checked);
+}
+
+void SearchAndReplaceWidget::on_m_tree_widget_itemDoubleClicked(QTreeWidgetItem *item, int column)
+{
+    Q_UNUSED(column);
+	
+	if (m_element_hash.keys().contains(item))
+	{
+		QPointer<Element> elmt = m_element_hash.value(item);
+		if (elmt) {
+			elmt.data()->diagram()->showMe();
+		}
+	}
+	else if (m_text_hash.keys().contains(item))
+	{
+		QPointer<IndependentTextItem> text = m_text_hash.value(item);
+		if (text) {
+			text.data()->diagram()->showMe();
+		}
+	}
+	else if (m_conductor_hash.keys().contains(item))
+	{
+		QPointer<Conductor> cond = m_conductor_hash.value(item);
+		if (cond) {
+			cond.data()->diagram()->showMe();
+		}
+	}
+}
+
+void SearchAndReplaceWidget::on_m_reload_pb_clicked()
+{
+	clear();
+	if (m_highlighted_element)
+	{
+		m_highlighted_element.data()->setHighlighted(false);
+		m_highlighted_element.clear();
+	}
+	if (m_last_selected)
+	{
+		m_last_selected.data()->setSelected(false);
+		m_last_selected.clear();
+	}
+	
+	ui->m_search_le->setFocus();
+	fillItemsList();
+	m_root_qtwi->setExpanded(true);
+}
+
+void SearchAndReplaceWidget::on_m_tree_widget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
+{
+	Q_UNUSED(previous);
+	
+	if(m_highlighted_element) {
+		m_highlighted_element.data()->setHighlighted(false);
+	}
+	if (m_last_selected) {
+		m_last_selected.data()->setSelected(false);
+	}
+	
+	if (m_element_hash.keys().contains(current))
+	{
+		QPointer<Element> elmt = m_element_hash.value(current);
+		if (elmt)
+		{
+			m_highlighted_element = elmt;
+			elmt.data()->setHighlighted(true);
+		}
+	}
+	else if (m_text_hash.keys().contains(current))
+	{
+		QPointer<IndependentTextItem> text = m_text_hash.value(current);
+		if (text) 
+		{
+			text.data()->setSelected(true);
+			m_last_selected = text;
+		}
+	}
+	else if (m_conductor_hash.keys().contains(current))
+	{
+		QPointer<Conductor> cond = m_conductor_hash.value(current);
+		if (cond)
+		{
+			cond.data()->setSelected(true);
+			m_last_selected = cond;
+		}
+	}
+	
+	updateNextPreviousButtons();
+}
+
+void SearchAndReplaceWidget::on_m_next_pb_clicked()
+{
+	QTreeWidgetItem *item = nullptr;
+	
+	do
+	{
+		item = nextItem(nullptr, QTreeWidgetItemIterator::NotHidden);
+		if (item) {
+			ui->m_tree_widget->setCurrentItem(item);
+		} else {
+			return;
+		}
+	} while (m_category_qtwi.contains(item));
+	
+	ui->m_tree_widget->setCurrentItem(item);
+	ui->m_tree_widget->scrollToItem(item);
+	on_m_tree_widget_itemDoubleClicked(item, 0);
+}
+
+void SearchAndReplaceWidget::on_m_previous_pb_clicked()
+{	
+	QTreeWidgetItem *item = nullptr;
+	
+	do
+	{
+		item = previousItem(nullptr, QTreeWidgetItemIterator::NotHidden);
+		if (item) {
+			ui->m_tree_widget->setCurrentItem(item);
+		}
+		else
+		{
+				//There is not a previous selected item, so the current item is m_root_qtwi but we know he must not be selected
+				//we user click on the button 'next item'.
+				//So we select the first selectable item by calling on_m_next_pb_clicked
+			on_m_next_pb_clicked();
+			return;
+		}
+	} while (m_category_qtwi.contains(item));
+	
+	ui->m_tree_widget->setCurrentItem(item);
+	ui->m_tree_widget->scrollToItem(item);
+	on_m_tree_widget_itemDoubleClicked(item, 0);
+}

Added: trunk/sources/SearchAndReplace/ui/searchandreplacewidget.h
===================================================================
--- trunk/sources/SearchAndReplace/ui/searchandreplacewidget.h	                        (rev 0)
+++ trunk/sources/SearchAndReplace/ui/searchandreplacewidget.h	2018-09-25 16:05:24 UTC (rev 5526)
@@ -0,0 +1,92 @@
+/*
+	Copyright 2006-2018 The QElectroTech Team
+	This file is part of QElectroTech.
+	
+	QElectroTech is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 2 of the License, or
+	(at your option) any later version.
+	
+	QElectroTech is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+	
+	You should have received a copy of the GNU General Public License
+	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef SEARCHANDREPLACEWIDGET_H
+#define SEARCHANDREPLACEWIDGET_H
+
+#include <QWidget>
+#include <QTreeWidgetItemIterator>
+#include "element.h"
+#include "independenttextitem.h"
+
+class QTreeWidgetItem;
+
+namespace Ui {
+	class SearchAndReplaceWidget;
+}
+
+class QETDiagramEditor;
+
+class SearchAndReplaceWidget : public QWidget
+{
+	Q_OBJECT
+	
+	public:
+		explicit SearchAndReplaceWidget(QWidget *parent = nullptr);
+		~SearchAndReplaceWidget();
+	
+		bool event(QEvent *event) override;
+		void clear();
+		void setEditor(QETDiagramEditor *editor);
+	
+	private:
+		void setUpTreeItems();
+		void setHideAdvanced(bool hide) const;
+		void fillItemsList();
+		void addElement(Element *element);
+		void search();
+		
+		void setVisibleAllParents(QTreeWidgetItem *item, bool expend_parent = true);
+		QTreeWidgetItem *nextItem(QTreeWidgetItem *item=nullptr, QTreeWidgetItemIterator::IteratorFlag flags = QTreeWidgetItemIterator::All) const;
+		QTreeWidgetItem *previousItem(QTreeWidgetItem *item=nullptr, QTreeWidgetItemIterator::IteratorFlag flags = QTreeWidgetItemIterator::All) const;
+		void updateNextPreviousButtons();
+		void itemChanged(QTreeWidgetItem *item, int column);
+		void setChildCheckState(QTreeWidgetItem *item, Qt::CheckState check, bool deep = true);
+		void updateParentCheckState(QTreeWidgetItem *item, bool all_parents = true);
+		
+	private slots:
+		void on_m_quit_button_clicked();
+		void on_m_advanced_pb_toggled(bool checked);
+		void on_m_tree_widget_itemDoubleClicked(QTreeWidgetItem *item, int column);
+		void on_m_reload_pb_clicked();	
+		void on_m_tree_widget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
+		void on_m_next_pb_clicked();
+		void on_m_previous_pb_clicked();
+		
+	private:
+		Ui::SearchAndReplaceWidget *ui;
+		QETDiagramEditor *m_editor;
+		QTreeWidgetItem *m_root_qtwi          = nullptr,
+						*m_folio_qtwi         = nullptr,
+						*m_indi_text_qtwi     = nullptr,
+						*m_elements_qtwi      = nullptr,
+						*m_simple_elmt_qtwi   = nullptr,
+						*m_master_elmt_qtwi   = nullptr,
+						*m_slave_elmt_qtwi    = nullptr,
+						*m_report_elmt_qtwi   = nullptr,
+						*m_terminal_elmt_qtwi = nullptr,
+						*m_conductor_qtwi     = nullptr;
+		QList<QTreeWidgetItem *> m_qtwi_elmts;
+		QList<QTreeWidgetItem *> m_category_qtwi;
+		QHash<QTreeWidgetItem *, QPointer <Element>> m_element_hash;
+		QHash<QTreeWidgetItem *, QPointer <IndependentTextItem>> m_text_hash;
+		QHash<QTreeWidgetItem *, QPointer <Conductor>> m_conductor_hash;
+		QPointer<Element> m_highlighted_element;
+		QPointer<QGraphicsObject> m_last_selected;
+};
+
+#endif // SEARCHANDREPLACEWIDGET_H

Added: trunk/sources/SearchAndReplace/ui/searchandreplacewidget.ui
===================================================================
--- trunk/sources/SearchAndReplace/ui/searchandreplacewidget.ui	                        (rev 0)
+++ trunk/sources/SearchAndReplace/ui/searchandreplacewidget.ui	2018-09-25 16:05:24 UTC (rev 5526)
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SearchAndReplaceWidget</class>
+ <widget class="QWidget" name="SearchAndReplaceWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>897</width>
+    <height>596</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2" rowstretch="0,0,0,0,1,0">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item row="0" column="4">
+    <widget class="QPushButton" name="m_next_pb">
+     <property name="toolTip">
+      <string>Aller à la correspondance suivante</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="icon">
+      <iconset theme="arrow-down-double">
+       <normaloff>.</normaloff>.</iconset>
+     </property>
+     <property name="flat">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="0" colspan="8">
+    <widget class="QTreeWidget" name="m_tree_widget">
+     <property name="uniformRowHeights">
+      <bool>true</bool>
+     </property>
+     <property name="allColumnsShowFocus">
+      <bool>true</bool>
+     </property>
+     <attribute name="headerVisible">
+      <bool>false</bool>
+     </attribute>
+     <column>
+      <property name="text">
+       <string notr="true">1</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item row="0" column="5">
+    <widget class="QPushButton" name="m_previous_pb">
+     <property name="toolTip">
+      <string>Aller à la correspondance précédente</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="icon">
+      <iconset theme="arrow-up-double">
+       <normaloff>.</normaloff>.</iconset>
+     </property>
+     <property name="flat">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="0">
+    <widget class="QPushButton" name="m_quit_button">
+     <property name="toolTip">
+      <string>Quitter</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="icon">
+      <iconset theme="window-close">
+       <normaloff>.</normaloff>.</iconset>
+     </property>
+     <property name="flat">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="3" rowspan="3">
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="1" column="1" colspan="4">
+      <widget class="QLineEdit" name="m_replace_le">
+       <property name="clearButtonEnabled">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="m_replace">
+       <property name="text">
+        <string>Remplacer :</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="2">
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item row="2" column="3">
+      <widget class="QPushButton" name="m_replace_pb">
+       <property name="toolTip">
+        <string>Remplacer la correspondance séléctionner</string>
+       </property>
+       <property name="text">
+        <string>Remplacer</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="4">
+      <widget class="QPushButton" name="m_replace_all_pb">
+       <property name="toolTip">
+        <string>Remplacer les correspondances coché</string>
+       </property>
+       <property name="text">
+        <string>Tout remplacer</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="m_mode">
+       <property name="text">
+        <string>Mode :</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QComboBox" name="m_mode_cb">
+       <item>
+        <property name="text">
+         <string>Texte brut</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>Mots entiers</string>
+        </property>
+       </item>
+      </widget>
+     </item>
+     <item row="0" column="1" colspan="4">
+      <widget class="QLineEdit" name="m_search_le">
+       <property name="clearButtonEnabled">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="0">
+      <widget class="QLabel" name="m_search">
+       <property name="text">
+        <string>Chercher :</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="0" column="7">
+    <widget class="QPushButton" name="m_advanced_pb">
+     <property name="toolTip">
+      <string>Avancé</string>
+     </property>
+     <property name="text">
+      <string/>
+     </property>
+     <property name="icon">
+      <iconset resource="../../../qelectrotech.qrc">
+       <normaloff>:/ico/16x16/configure-toolbars.png</normaloff>:/ico/16x16/configure-toolbars.png</iconset>
+     </property>
+     <property name="checkable">
+      <bool>true</bool>
+     </property>
+     <property name="checked">
+      <bool>false</bool>
+     </property>
+     <property name="flat">
+      <bool>false</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="5" column="0">
+    <spacer name="m_v_spacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="0" column="6">
+    <widget class="QPushButton" name="m_reload_pb">
+     <property name="text">
+      <string/>
+     </property>
+     <property name="icon">
+      <iconset theme="view-refresh"/>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../../../qelectrotech.qrc"/>
+ </resources>
+ <connections/>
+</ui>

Modified: trunk/sources/diagramcontent.cpp
===================================================================
--- trunk/sources/diagramcontent.cpp	2018-09-25 13:12:01 UTC (rev 5525)
+++ trunk/sources/diagramcontent.cpp	2018-09-25 16:05:24 UTC (rev 5526)
@@ -37,12 +37,20 @@
  * @brief DiagramContent::DiagramContent
  * Constructor
  * @param diagram : Construct a diagramContent and fill it with the selected item of @diagram
+ * @param selected : this diagramcontent get only selected items if true.
  */
-DiagramContent::DiagramContent(Diagram *diagram) :
+DiagramContent::DiagramContent(Diagram *diagram, bool selected) :
 	m_selected_items(diagram->selectedItems())
 {
-		//Get the selected items
-	for (QGraphicsItem *item : m_selected_items)
+	QList <QGraphicsItem *> item_list;
+	if (selected) {
+		item_list = m_selected_items;
+	} else {
+		item_list = diagram->items();
+	}
+
+	
+	for (QGraphicsItem *item : item_list)
 	{
 		if (Element *elmt = qgraphicsitem_cast<Element *>(item))
 			m_elements << elmt;
@@ -55,6 +63,15 @@
 				!c->terminal2->parentItem()->isSelected()) {
 				m_other_conductors << c;
 			}
+			
+			if (m_potential_conductors.isEmpty()) {
+				m_potential_conductors << c;
+			}
+			else
+			{
+				if (!potentialIsManaged(c->relatedPotentialConductors(true).toList()))
+					m_potential_conductors << c;
+			}
 		}
 		else if (DiagramImageItem *dii = qgraphicsitem_cast<DiagramImageItem *>(item))
 			m_images << dii;
@@ -66,6 +83,7 @@
 			if(ElementTextItemGroup *etig = dynamic_cast<ElementTextItemGroup *>(group))
 				m_texts_groups << etig;
 	}
+		
 	
 		//For each selected element, we determine if conductors must be moved or updated.
 	for(Element *elmt : m_elements)
@@ -103,17 +121,15 @@
 	m_conductors_to_update(other.m_conductors_to_update),
 	m_conductors_to_move(other.m_conductors_to_move),
 	m_other_conductors(other.m_other_conductors),
+	m_potential_conductors(other.m_potential_conductors),
 	m_element_texts(other.m_element_texts),
 	m_texts_groups(other.m_texts_groups),
 	m_selected_items(other.m_selected_items)
 {}
 
-/**
- * @brief DiagramContent::~DiagramContent
- */
-DiagramContent::~DiagramContent() {}
+DiagramContent::~DiagramContent()
+{}
 
-
 /**
  * @brief DiagramContent::selectedTexts
  * @return a list of every selected texts (every kind of texts)
@@ -309,10 +325,37 @@
 		if(!m_selected_items.contains(qgi))
 			m_selected_items << qgi;
 	
+	for (Conductor *c : other.m_potential_conductors)
+	{
+		QList<Conductor *> c_list = c->relatedPotentialConductors(true).toList();
+		c_list << c;
+		if (!potentialIsManaged(c_list)) {
+			m_potential_conductors << c;
+		}
+	}
+	
 	return *this;
 }
 
 /**
+ * @brief DiagramContent::potentialIsManaged
+ * @param conductors a list of conductors at the same potential.
+ * @return true, if m_potential_conductors already have a conductor of this potential.
+ */
+bool DiagramContent::potentialIsManaged(QList<Conductor *> conductors)
+{
+	bool b = false;
+	
+	for (Conductor *c : conductors)
+	{
+		if (m_potential_conductors.contains(c))
+			b = true;
+	}
+	
+	return b;
+}
+
+/**
  * @brief DiagramContent::items
  * @param filter
  * @return The items of this diagram content according to @filter

Modified: trunk/sources/diagramcontent.h
===================================================================
--- trunk/sources/diagramcontent.h	2018-09-25 13:12:01 UTC (rev 5525)
+++ trunk/sources/diagramcontent.h	2018-09-25 16:05:24 UTC (rev 5526)
@@ -44,7 +44,7 @@
 {
 	public:
 		DiagramContent();
-		DiagramContent(Diagram *diagram);
+		DiagramContent(Diagram *diagram, bool selected = true);
 		DiagramContent(const DiagramContent &);
 		~DiagramContent();
 		
@@ -71,6 +71,7 @@
 		QList<Conductor *> m_conductors_to_update;
 		QList<Conductor *> m_conductors_to_move;
 		QList<Conductor *> m_other_conductors;
+		QList<Conductor *> m_potential_conductors;
 		QSet<DynamicElementTextItem *> m_element_texts;
 		QSet<ElementTextItemGroup *> m_texts_groups;
 		QList<QGraphicsItem *> m_selected_items;
@@ -87,6 +88,7 @@
 		int removeNonMovableItems();
 		
 		DiagramContent& operator+=(const DiagramContent& other);
+		bool potentialIsManaged(QList<Conductor *>conductors);
 };
 QDebug &operator<<(QDebug, DiagramContent &);
 #endif

Modified: trunk/sources/diagramview.cpp
===================================================================
--- trunk/sources/diagramview.cpp	2018-09-25 13:12:01 UTC (rev 5525)
+++ trunk/sources/diagramview.cpp	2018-09-25 16:05:24 UTC (rev 5526)
@@ -539,7 +539,7 @@
 	if (m_event_interface && m_event_interface->keyPressEvent(e))
 		return;
 	
-	ProjectView *current_project = this->diagramEditor()->acessCurrentProject();
+	ProjectView *current_project = this->diagramEditor()->currentProjectView();
 	DiagramContent dc(m_diagram);
 	switch(e -> key())
 	{

Modified: trunk/sources/qetdiagrameditor.cpp
===================================================================
--- trunk/sources/qetdiagrameditor.cpp	2018-09-25 13:12:01 UTC (rev 5525)
+++ trunk/sources/qetdiagrameditor.cpp	2018-09-25 16:05:24 UTC (rev 5526)
@@ -72,9 +72,16 @@
 	open_dialog_dir            (QStandardPaths::writableLocation(QStandardPaths::DesktopLocation))
 {
 	activeSubWindowIndex = 0;
-	//Setup the mdi area at center of application
-	setCentralWidget(&m_workspace);
 	
+	QSplitter *splitter_ = new QSplitter(this);
+	splitter_->setChildrenCollapsible(false);
+	splitter_->setOrientation(Qt::Vertical);
+	splitter_->addWidget(&m_workspace);
+	splitter_->addWidget(&m_search_and_replace_widget);
+	m_search_and_replace_widget.setHidden(true);
+	m_search_and_replace_widget.setEditor(this);
+	setCentralWidget(splitter_);
+	
 		//Set object name to be retrieved by the stylesheets
 	m_workspace.setBackground(QBrush(Qt::NoBrush));
 	m_workspace.setObjectName("mdiarea");
@@ -606,6 +613,12 @@
 	connect(m_depth_action_group, &QActionGroup::triggered, [this](QAction *action) {
 		this->currentDiagramView()->diagram()->changeZValue(action->data().value<QET::DepthOption>());
 	});
+	
+	m_find = new QAction(tr("Chercher"), this);
+	m_find->setShortcut(QKeySequence::Find);
+	connect(m_find, &QAction::triggered, [this]() {
+		this->m_search_and_replace_widget.setHidden(!m_search_and_replace_widget.isHidden());
+	});
 }
 
 /**
@@ -712,6 +725,8 @@
 	menu_edition -> addActions(m_row_column_actions_group.actions());
 	menu_edition -> addSeparator();
 	menu_edition -> addActions(m_depth_action_group->actions());
+	menu_edition -> addSeparator();
+	menu_edition -> addAction(m_find);
 
 	// menu Projet
 	menu_project -> addAction(m_project_edit_properties);
@@ -1096,6 +1111,22 @@
 }
 
 /**
+ * @brief QETDiagramEditor::currentProject
+ * @return the current edited project.
+ * This function can return nullptr.
+ */
+QETProject *QETDiagramEditor::currentProject() const
+{
+	ProjectView *view = currentProjectView();
+	if (view) {
+		return view->project();
+	}
+	else {
+		return nullptr;
+	}
+}
+
+/**
 	@return Le schema actuellement edite (= l'onglet ouvert dans le projet
 	courant) ou 0 s'il n'y en a pas
 */
@@ -1676,23 +1707,6 @@
 }
 
 /**
- * @brief QETDiagramEditor::acessCurrentProject
- * Retrieve current Project open in diagram editor
- */
-ProjectView *QETDiagramEditor::acessCurrentProject (){
-	QMdiSubWindow *current_window = m_workspace.activeSubWindow();
-	if (!current_window) return(nullptr);
-
-	QWidget *current_widget = current_window -> widget();
-	if (!current_widget) return(nullptr);
-
-	if (ProjectView *project_view = qobject_cast<ProjectView *>(current_widget)) {
-	return(project_view);
-	}
-	return(nullptr);
-}
-
-/**
  * @brief QETDiagramEditor::drawGrid
  * @return true if the grid of folio must be displayed
  */
@@ -1701,17 +1715,6 @@
 }
 
 /**
- * @brief QETDiagramEditor::acessCurrentDiagramView
- * Retrieve current DiagramView used in diagram editor
- */
-DiagramView *QETDiagramEditor::acessCurrentDiagramView () {
-	if (ProjectView *project_view = currentProjectView()) {
-		return(project_view -> currentDiagram());
-	}
-	return(nullptr);
-}
-
-/**
 	met a jour le menu "Fenetres"
 */
 void QETDiagramEditor::slot_updateWindowsMenu() {

Modified: trunk/sources/qetdiagrameditor.h
===================================================================
--- trunk/sources/qetdiagrameditor.h	2018-09-25 13:12:01 UTC (rev 5525)
+++ trunk/sources/qetdiagrameditor.h	2018-09-25 16:05:24 UTC (rev 5526)
@@ -25,6 +25,7 @@
 #include <QUndoGroup>
 
 #include "qetmainwindow.h"
+#include "searchandreplacewidget.h"
 
 class QMdiSubWindow;
 class QETProject;
@@ -63,8 +64,8 @@
 		bool                 openAndAddProject (const QString &, bool = true);
 		QList<QString>       editedFiles       () const;
 		ProjectView         *viewForFile       (const QString &) const;
-		ProjectView         *acessCurrentProject ();
-		DiagramView         *acessCurrentDiagramView ();
+		ProjectView *currentProjectView() const;
+		QETProject *currentProject() const;
 		bool drawGrid() const;
 		
 	protected:
@@ -81,7 +82,6 @@
 		void setUpMenu          ();
 		
 		bool addProject(QETProject *, bool = true);
-		ProjectView *currentProjectView() const;
 		DiagramView *currentDiagramView() const;
 		Element *currentElement() const;
 		ProjectView *findProject(DiagramView *) const;
@@ -197,6 +197,7 @@
 		QAction *m_close_file;			   ///< Close current project file
 		QAction *m_save_file;				   ///< Save current project
 		QAction *m_save_file_as;			   ///< Save current project as a specific file
+		QAction *m_find = nullptr;
 
 		QMdiArea m_workspace;
 		QSignalMapper windowMapper;
@@ -221,5 +222,6 @@
 		AutoNumberingDockWidget *m_autonumbering_dock;
 		int activeSubWindowIndex;
 		bool m_first_show = true;
+		SearchAndReplaceWidget m_search_and_replace_widget;
 };
 #endif

Modified: trunk/sources/ui/masterpropertieswidget.cpp
===================================================================
--- trunk/sources/ui/masterpropertieswidget.cpp	2018-09-25 13:12:01 UTC (rev 5525)
+++ trunk/sources/ui/masterpropertieswidget.cpp	2018-09-25 16:05:24 UTC (rev 5526)
@@ -79,7 +79,7 @@
 	QHeaderView *qhv = ui->m_free_tree_widget->header();
 	qhv->setContextMenuPolicy(Qt::CustomContextMenu);
 	connect(qhv, &QHeaderView::customContextMenuRequested, this, &MasterPropertiesWidget::headerCustomContextMenuRequested);
-	connect(m_save_header_state, &QAction::triggered, [this, qhv]()
+	connect(m_save_header_state, &QAction::triggered, [qhv]()
 	{
 		QByteArray qba = qhv->saveState();
 		QSettings settings;


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/