void QReportTreeManager::on_actionNewConnection_triggered()
{
    QReportDataConnection *conn = _designer->addDataConnection();
    if(conn)
        addConnectionNode(conn);

//    QReportDatabaseInfoDialog info(_report);

//    if(info.exec() != QDialog::Accepted) return;

//    QReportDataConnection *conn = info.dataConnection();

//    _report->addConnection(conn);
}
void QReportTreeManager::initTreeItems()
{
    bool isDatatableOpen = nodeDataTable && nodeDataTable->isExpanded();
    bool isParameteresOpen = nodeParameters && nodeParameters->isExpanded();

    clear();

    nodeDataTable = new QTreeWidgetItem;
    nodeDataTable->setIcon(0, QIcon(":/designer/database"));
    nodeDataTable->setData(0, 0, "DataTable");
    addTopLevelItem(nodeDataTable);

    nodeParameters = new QTreeWidgetItem;
    nodeParameters->setIcon(0, QIcon(":/designer/form"));
    nodeParameters->setData(0, 0, "params");
    addTopLevelItem(nodeParameters);

    /*for(int i = 0; i < nodeDataTable->childCount(); i++)
        nodeDataTable->removeChild(nodeDataTable->child(i));

    for(int i = 0; i < nodeParameters->childCount(); i++)
        nodeParameters->removeChild(nodeParameters->child(i));*/

    for(int i = 0; i < _report->parameters().count(); i++)
        addParametereNode(_report->parameters().at(i));

    for(int i = 0; i < _report->connections().count(); i++){
        QTreeWidgetItem *newConnectionItem = addConnectionNode(_report->connections().at(i));

        QList<QReportDataTable*> DataTables = _report->dataTablesByConnections(_report->connections().at(i)->objectName());

        //add DataTables if current connection
        foreach (QReportDataTable *dataTable, DataTables) {
            QTreeWidgetItem *newTableItem = addTableNode(newConnectionItem, dataTable);

            for(int k = 0; k < dataTable->fields().count(); k++)
                addFieldNode(newTableItem, dataTable->fields().at(k));
        }
    }//for
bool ConnectionManager::mousePressEvent(QMouseEvent *event) {
	if (event->button() == Qt::RightButton) {
		if (m_fromPin != -1) {
			m_fromPin = -1;
			m_points.clear();
			return true;
		}

		int point;
		Connection *c = getPoint(NORM(event->x()), NORM(event->y()), point);
		if (point != -1) {
			// User can't remove first or last point like that
			if (point == 0 || point == c->points.size() - 1) {
				return false;
			}
			QList<QAction *> actions;
			actions.append(new QAction("Remove point", 0));
			QAction *action = QMenu::exec(actions, event->globalPos(), 0, 0);
			if (action) {
				removePoint(c, point);
			}
			return true;
		}

		c = getConnection(NORM(event->x()), NORM(event->y()), point);
		if (c) {
			QList<QAction *> actions;
			actions.append(new QAction("Remove connection", 0));
			QAction *action = QMenu::exec(actions, event->globalPos(), 0, 0);
			if (action) {
				removeConnection(c);
			}
			return true;
		}
	}
	else if (event->button() == Qt::LeftButton) {
		if (m_fromPin != -1) {
			QPoint from = QPoint(m_movingX, m_movingY);
			QPoint to(NORM(event->pos().x()), NORM(event->pos().y()));
			ScreenObject *object = m_screen->getObject(NORM(event->x()), NORM(event->y()));
			if (object) {
				int pin = m_screen->getPin(object, NORM(event->x()), NORM(event->y()));
				if (pin != -1) {
					to = object->getPins()[pin].rect.center();
				}
			}

			bool firstPoints = m_points.empty();

			if (firstPoints) {
				m_points.push_back(from);
			}

			if (m_screen->getObject(from.x(), to.y()) == m_fromObject/* &&
				m_screen->getPin(m_moving, from.x(), to.y()) != -1*/) {
				m_points.push_back(QPoint(to.x(), from.y()));
			}
			else {
				m_points.push_back(QPoint(from.x(), to.y()));
			}

// 			if (!firstPoints) {
				m_points.push_back(to);
// 			}

			int point;
			Connection *c = getPoint(NORM(event->x()), NORM(event->y()), point);
			if (point != -1) {
                ScreenObject *object = m_screen->getObject(NORM(event->x()), NORM(event->y()));
                if (object) {
                    m_points.erase(m_points.end() - 1);
                    m_points.erase(m_points.end() - 1);
                    return false;
                }

				addConnectionNode(c, point, event->x(), event->y(), m_points);

				m_fromPin = -1;
				m_points.clear();
// 				qDebug() << newPoints.size() << c->points.size() << "\n";
				return true;
			}
			else {
				QPointF intersectPnt;
				int point;
				c = getConnection(NORM(event->x()), NORM(event->y()), point, &intersectPnt);
				if (c) {
					QPoint p = intersectPnt.toPoint();
					p = QPoint(NORM(p.x()), NORM(p.y()));
					c->points.insert(c->points.begin() + point, p);
					addConnectionNode(c, point, event->x(), event->y(), m_points);
					m_fromPin = -1;
					m_points.clear();
					return true;
				}
			}

			if (object) {
				int pin = m_screen->getPin(object, NORM(event->x()), NORM(event->y()));
				if (pin != -1) {
					addConnection(m_fromObject, m_fromPin, object, pin, m_points);
					m_fromPin = -1;
					m_points.clear();
					return true;
				}
			}

			m_movingX = NORM(event->x());
			m_movingY = NORM(event->y());
			return true;
		}

// 		qDebug() << NORM(event->x()) << NORM(event->y());
		int point;
		Connection *c = getPoint(NORM(event->x()), NORM(event->y()), point);
		if (point != -1) {
			if (point == 0) {
				m_fromObject = c->from;
			}
			else if (point == c->points.size() - 1) {
				m_fromObject = c->to;
			}
			else {
				m_fromObject = 0;
			}
			m_movingConn = c;
			m_moving = &c->points[point];
			m_movingX = NORM(event->x());
			m_movingY = NORM(event->y());
			return true;
		}

		ScreenObject *object = m_screen->getObject(NORM(event->x()), NORM(event->y()));
		if (!object) {
			return false;
		}

		m_fromPin = m_screen->getPin(object, NORM(event->x()), NORM(event->y()));
		if (m_fromPin != -1) {
			m_fromObject = object;
			m_movingX = object->getPins()[m_fromPin].rect.center().x();
			m_movingY = object->getPins()[m_fromPin].rect.center().y();
			return true;
		}
	}
	return false;
}