import QtQuick 2.0
import QtQuick.Window 2.0
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.0
import QtQuick.Controls.Styles 1.3
import "."


Rectangle
{
	Layout.fillWidth: true
	Layout.minimumHeight: hiddenHeightTopLevel()
	height: hiddenHeightTopLevel()
	Layout.maximumHeight: hiddenHeightTopLevel()
	id: wrapperItem
	signal documentSelected(string doc, string groupName)
	property alias model: filesList.model
	property string sectionName;
	property variant selManager;
	property int index;
	color: index % 2 === 0 ? "transparent" : ProjectFilesStyle.title.background

	function hiddenHeightTopLevel()
	{
		return section.state === "hidden" ? ProjectFilesStyle.documentsList.height : ProjectFilesStyle.documentsList.fileNameHeight * model.count + ProjectFilesStyle.documentsList.height;
	}

	function hiddenHeightRepeater()
	{
		return section.state === "hidden" ? 0 : ProjectFilesStyle.documentsList.fileNameHeight * wrapperItem.model.count;
	}

	function hiddenHeightElement()
	{
		return section.state === "hidden" ? 0 : ProjectFilesStyle.documentsList.fileNameHeight;
	}

	function getDocumentIndex(documentId)
	{
		for (var i = 0; i < model.count; i++)
			if (model.get(i).documentId === documentId)
				return i;
		return -1;
	}

	function removeDocument(documentId)
	{
		var i = getDocumentIndex(documentId);
		if (i !== -1)
			model.remove(i);
	}

	ColumnLayout {
		anchors.fill: parent
		spacing: 0

		SourceSansProRegular
		{
			id: fileNameFont
		}

		SourceSansProBold
		{
			id: boldFont
		}

		RowLayout
		{
			anchors.top: parent.top
			id: rowCol
			height: ProjectFilesStyle.documentsList.height
			Layout.fillWidth: true


			Image {
				source: "qrc:/qml/img/opentriangleindicator_filesproject.png"
				width: 15
				sourceSize.width: 12
				id: imgArrow
				anchors.right: section.left
				anchors.rightMargin: 8
				anchors.top: parent.top
				anchors.topMargin: 10
			}

			Text
			{
				id: section
				text: sectionName
				anchors.left: parent.left
				anchors.leftMargin: ProjectFilesStyle.general.leftMargin
				color: ProjectFilesStyle.documentsList.sectionColor
				font.family: boldFont.name
				font.pointSize: ProjectFilesStyle.documentsList.sectionFontSize
				states: [
					State {
						name: "hidden"
						PropertyChanges { target: filesList; visible: false; }
						PropertyChanges { target: rowCol; Layout.minimumHeight: ProjectFilesStyle.documentsList.height; Layout.maximumHeight: ProjectFilesStyle.documentsList.height; height: ProjectFilesStyle.documentsList.height; }
						PropertyChanges { target: imgArrow; source: "qrc:/qml/img/closedtriangleindicator_filesproject.png" }
					}
				]
			}

			MouseArea {
				id: titleMouseArea
				anchors.fill: parent
				hoverEnabled: true
				z: 2
				onClicked: {
					if (section.state === "hidden")
						section.state = "";
					else
						section.state = "hidden";
				}
			}
		}

		ColumnLayout {
			height: wrapperItem.hiddenHeightRepeater()
			Layout.minimumHeight: wrapperItem.hiddenHeightRepeater()
			Layout.preferredHeight: wrapperItem.hiddenHeightRepeater()
			Layout.maximumHeight: wrapperItem.hiddenHeightRepeater()
			width: parent.width
			visible: section.state !== "hidden"
			spacing: 0

			Repeater
			{
				id: filesList
				visible: section.state !== "hidden"
				Rectangle
				{
					visible: section.state !== "hidden"
					id: rootItem
					Layout.fillWidth: true
					Layout.minimumHeight: wrapperItem.hiddenHeightElement()
					Layout.preferredHeight: wrapperItem.hiddenHeightElement()
					Layout.maximumHeight: wrapperItem.hiddenHeightElement()
					height: wrapperItem.hiddenHeightElement()
					color: isSelected ? ProjectFilesStyle.documentsList.highlightColor : "transparent"
					property bool isSelected
					property bool renameMode
					Text {
						id: nameText
						height: parent.height
						visible: !renameMode
						color: rootItem.isSelected ? ProjectFilesStyle.documentsList.selectedColor : ProjectFilesStyle.documentsList.color
						text: name;
						font.family: fileNameFont.name
						font.pointSize: ProjectFilesStyle.documentsList.fontSize
						anchors.verticalCenter: parent.verticalCenter
						verticalAlignment:  Text.AlignVCenter
						anchors.left: parent.left
						anchors.leftMargin: ProjectFilesStyle.general.leftMargin + 2
						width: parent.width
						Connections
						{
							target: selManager
							onSelected: {
								if (groupName != sectionName)
									rootItem.isSelected = false;
								else if (doc === documentId)
									rootItem.isSelected = true;
								else
									rootItem.isSelected = false;

								if (rootItem.isSelected && section.state === "hidden")
									section.state = "";
							}
						}
					}

					TextInput {
						id: textInput
						text: nameText.text
						visible: renameMode
						anchors.verticalCenter: parent.verticalCenter
						anchors.left: parent.left
						anchors.leftMargin: ProjectFilesStyle.general.leftMargin
						MouseArea {
							id: textMouseArea
							anchors.fill: parent
							hoverEnabled: true
							z: 2
							onClicked: {
								textInput.forceActiveFocus();
							}
						}

						onVisibleChanged: {
							if (visible) {
								selectAll();
								forceActiveFocus();
							}
						}

						onAccepted: close(true);
						onCursorVisibleChanged: {
							if (!cursorVisible)
								close(false);
						}
						onFocusChanged: {
							if (!focus)
								close(false);
						}
						function close(accept) {
							rootItem.renameMode = false;
							if (accept)
							{
								var i = getDocumentIndex(documentId);
								projectModel.renameDocument(documentId, textInput.text);
								wrapperItem.model.set(i, projectModel.getDocument(documentId));
							}
						}
					}

					MouseArea {
						id: mouseArea
						z: 1
						hoverEnabled: false
						anchors.fill: parent
						acceptedButtons: Qt.LeftButton | Qt.RightButton
						onClicked:{
							if (mouse.button === Qt.RightButton && !isContract)
								contextMenu.popup();
							else if (mouse.button === Qt.LeftButton)
							{
								rootItem.isSelected = true;
								projectModel.openDocument(documentId);
								documentSelected(documentId, groupName);
							}
						}
					}

					Menu {
						id: contextMenu
						MenuItem {
							text: qsTr("Rename")
							onTriggered: {
								rootItem.renameMode = true;
							}
						}
						MenuItem {
							text: qsTr("Delete")
							onTriggered: {
								projectModel.removeDocument(documentId);
								wrapperItem.removeDocument(documentId);
							}
						}
					}
				}
			}
		}
	}
}