// DlgMarker.cpp : 实现文件
//

#include "stdafx.h"
#include "DlgMarker.h"
#include "afxdialogex.h"


// CDlgMarker 对话框

IMPLEMENT_DYNAMIC(CDlgMarker, CBCGPDialog)

CDlgMarker::CDlgMarker(CWnd* pParent /*=NULL*/)
	: CBCGPDialog(CDlgMarker::IDD, pParent)
{
	EnableVisualManagerStyle(TRUE, TRUE);

	m_iSelectedIndex = -1;
}

CDlgMarker::~CDlgMarker()
{
}

void CDlgMarker::DoDataExchange(CDataExchange* pDX)
{
	CBCGPDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TREE_MARKERS, m_treeMarkers);
}


BEGIN_MESSAGE_MAP(CDlgMarker, CBCGPDialog)
	ON_BN_CLICKED(IDC_BUTTON_SELECTMARKER, &CDlgMarker::OnBnClickedButtonSelectMarker)
	ON_BN_CLICKED(IDC_BUTTON_ADDMARKER, &CDlgMarker::OnBnClickedButtonAddMarker)
	ON_BN_CLICKED(IDC_BUTTON_DELETEMARKER, &CDlgMarker::OnBnClickedButtonDeleteMarker)
	ON_NOTIFY(NM_CLICK, IDC_TREE_MARKERS, &CDlgMarker::OnNMClickTreeMarkers)
END_MESSAGE_MAP()


// CDlgMarker 消息处理程序


BOOL CDlgMarker::OnInitDialog()
{
	CBCGPDialog::OnInitDialog();

	m_strMarkerConfig = GetSoftwareCurrentDirectory() + _T("\\Markers.ini");

	m_treeMarkers.SetBkColor(RGB(53,53,57));       //设置为与对话框背景颜色一致
	m_treeMarkers.SetTextColor(RGB(255,255,255));  //设置树控件文本颜色

	//读取标记点配置文件(删去名称为空的标记点),更新树控件
	RewriteMarkerConfig();

	return TRUE;
}

//展开所有的子根节点
void CDlgMarker::MyExpandTree(HTREEITEM hTreeItem)
{
	HTREEITEM hNextItem = m_treeMarkers.GetNextItem(hTreeItem, TVGN_NEXT);

	while (hNextItem != NULL)
	{
		MyExpandTree(hNextItem);
		hNextItem = m_treeMarkers.GetNextItem(hNextItem, TVGN_NEXT);
	}

	m_treeMarkers.Expand(hTreeItem,TVE_EXPAND);
}

//功能:移动对话框到给定的显示区域
void CDlgMarker::MoveToGivenArea(const CRect rcArea)
{
	CRect m_rcDlgArea;

	m_rcDlgArea = rcArea;
	m_rcDlgArea.top += 90;

	SetWindowPos( &CWnd::wndTop, m_rcDlgArea.left, m_rcDlgArea.top, 0, 0,	SWP_NOSIZE | SWP_NOACTIVATE/* | SWP_HIDEWINDOW*/ );
}

//在地图上选择标记点
void CDlgMarker::OnBnClickedButtonSelectMarker()
{
	g_bSelectMarker = true;
	::PostMessage(g_mapHwnd, WM_SEND_MAPCURSORMODE, 4, 0);  //设置Map CurMode为None
}

//显示标记点坐标到编辑框
void CDlgMarker::ShowMarkerCoordinate(double& markerLon, double& markerLat)
{
	CString str;

	str.Format(_T("Marker%d"), g_iHaveMarkedPts+1);
	GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(str);

	str.Format(_T("%.7f"), markerLon);
	GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(str);

	str.Format(_T("%.7f"), markerLat);
	GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(str);
}

//添加标记点
void CDlgMarker::OnBnClickedButtonAddMarker()
{
	//最多支持20个标记点
	if (g_iHaveMarkedPts >= 20)
	{
		BCGPMessageBoxEx(NULL,_T("最多支持20个标记点!"),_T("Tip"),MB_OK,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US));

		return ;
	}

	g_iHaveMarkedPts++;

	CString str;

	GetDlgItem(IDC_EDIT_MARKER_NAME)->GetWindowText(str);
	g_iMarkerName[g_iHaveMarkedPts-1] = str;

	GetDlgItem(IDC_EDIT_MARKER_LON)->GetWindowText(str);
	g_iMarkerLon[g_iHaveMarkedPts-1] = atof(str);

	GetDlgItem(IDC_EDIT_MARKER_LAT)->GetWindowText(str);
	g_iMarkerLat[g_iHaveMarkedPts-1] = atof(str);

	//在地图上显示标记点
	::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, g_iHaveMarkedPts-1, 0);

	//标记点写配置文件
	CString strTitle;
	strTitle.Format(_T("Marker%d"),g_iHaveMarkedPts);

	str.Format(_T("%s"), g_iMarkerName[g_iHaveMarkedPts-1]);
	WritePrivateProfileString(strTitle,_T("Name"),str,m_strMarkerConfig);

	str.Format(_T("%.7f"), g_iMarkerLon[g_iHaveMarkedPts-1]);
	WritePrivateProfileString(strTitle,_T("Lon"),str,m_strMarkerConfig);

	str.Format(_T("%.7f"), g_iMarkerLat[g_iHaveMarkedPts-1]);
	WritePrivateProfileString(strTitle,_T("Lat"),str,m_strMarkerConfig);

	//插入节点
	HTREEITEM hItem;
	hItem = m_treeMarkers.InsertItem(strTitle, 1, 1, m_treeMarkers.GetRootItem(), TVI_LAST);
	m_treeMarkers.SetItemData(hItem, g_iHaveMarkedPts);

	//选中节点
	m_treeMarkers.SetCheck(hItem, TRUE);

	//焦点移到节点上
	m_treeMarkers.SelectItem(hItem);
	m_treeMarkers.SetFocus();

	//获取选中节点的索引
	m_iSelectedIndex = m_treeMarkers.GetItemData(hItem);
}

//读取标记点配置文件(删去名称为空的标记点),更新树控件
void CDlgMarker::RewriteMarkerConfig()
{
	g_iHaveMarkedPts = 0;

	CString str, strTitle;

	//读取配置文件中的所有标记点信息(名称为空的除外)
	for (int i=0;i<g_iMarkerPtNum;i++)
	{
		g_lMarkerLayerID[i] = -1;

		strTitle.Format(_T("Marker%d"),i+1);

		TCHAR inBuf[30];

		CString sLon, sLat;
		GetPrivateProfileString(strTitle,_T("Lon"),0,inBuf,20,m_strMarkerConfig);
		sLon.Format(_T("%s"), inBuf);
		GetPrivateProfileString(strTitle,_T("Lat"),0,inBuf,20,m_strMarkerConfig);
		sLat.Format(_T("%s"), inBuf);

		if ((sLon != _T("")) && (sLat != _T("")))
		{
			g_iHaveMarkedPts++;

			GetPrivateProfileString(strTitle,_T("Name"),0,inBuf,20,m_strMarkerConfig);
			g_iMarkerName[g_iHaveMarkedPts-1].Format(_T("%s"), inBuf);

			GetPrivateProfileString(strTitle,_T("Lon"),0,inBuf,20,m_strMarkerConfig);
			g_iMarkerLon[g_iHaveMarkedPts-1] = atof(inBuf);

			GetPrivateProfileString(strTitle,_T("Lat"),0,inBuf,20,m_strMarkerConfig);
			g_iMarkerLat[g_iHaveMarkedPts-1] = atof(inBuf);
		}
	}

	//将读取的标记信息写进配置文件(目的是筛去空的标记点)
	for (int i=0;i<g_iHaveMarkedPts;i++)
	{
		strTitle.Format(_T("Marker%d"),i+1);

		str.Format(_T("%s"), g_iMarkerName[i]);
		WritePrivateProfileString(strTitle,_T("Name"),str,m_strMarkerConfig);

		str.Format(_T("%.7f"), g_iMarkerLon[i]);
		WritePrivateProfileString(strTitle,_T("Lon"),str,m_strMarkerConfig);

		str.Format(_T("%.7f"), g_iMarkerLat[i]);
		WritePrivateProfileString(strTitle,_T("Lat"),str,m_strMarkerConfig);
	}

	//剩余的标记点信息置空
	for (int i=g_iHaveMarkedPts;i<g_iMarkerPtNum;i++)
	{
		strTitle.Format(_T("Marker%d"),i+1);

		WritePrivateProfileString(strTitle,_T("Name"),_T(""),m_strMarkerConfig);

		WritePrivateProfileString(strTitle,_T("Lon"),_T(""),m_strMarkerConfig);

		WritePrivateProfileString(strTitle,_T("Lat"),_T(""),m_strMarkerConfig);
	}

	//树控件删除所有节点
	m_treeMarkers.DeleteAllItems();

	//插入根节点
	HTREEITEM hRoot;
	hRoot = m_treeMarkers.InsertItem(_T("标记点"), 0, 0);

	//设置根节点数据,可以用来代表节点索引
	m_treeMarkers.SetItemData(hRoot, 0);

	//插入子节点(标记点名称)
	for (int i=0;i<g_iHaveMarkedPts;i++)
	{
		str.Format(_T("Marker%d"),i+1);

		HTREEITEM hChild;
		hChild = m_treeMarkers.InsertItem(str, 1, 1, hRoot, TVI_LAST);

		//设置子节点数据,可以用来代表节点索引
		m_treeMarkers.SetItemData(hChild, i+1);
	}

	//展开所有根节点
	MyExpandTree(m_treeMarkers.GetRootItem());
}

//删除选中的标记点
void CDlgMarker::OnBnClickedButtonDeleteMarker()
{
	if (m_iSelectedIndex == 0) //删除所有标记点
	{
		//确认是否删除所有标记点
		if (IDYES != BCGPMessageBoxEx(NULL, _T("确认删除所有标记点?"), _T("Tip"), MB_YESNO,MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US)))
		{
			return;
		}

		HTREEITEM item = m_treeMarkers.GetChildItem(m_treeMarkers.GetRootItem());

		while (item)
		{
			m_iSelectedIndex = m_treeMarkers.GetItemData(item);

			g_iMarkerName[m_iSelectedIndex-1] = _T("");
			g_iMarkerLon[m_iSelectedIndex-1] = 0;
			g_iMarkerLat[m_iSelectedIndex-1] = 0;

			CString strTitle;
			strTitle.Format(_T("Marker%d"),m_iSelectedIndex);

			WritePrivateProfileString(strTitle,_T("Name"),_T(""),m_strMarkerConfig);
			WritePrivateProfileString(strTitle,_T("Lon"),_T(""),m_strMarkerConfig);
			WritePrivateProfileString(strTitle,_T("Lat"),_T(""),m_strMarkerConfig);

			::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 1);

			HTREEITEM childItem = m_treeMarkers.GetNextItem(item, TVGN_NEXT);

			m_treeMarkers.DeleteItem(item);

			item = childItem;
		}

		g_iHaveMarkedPts = 0;
	}
	else if (m_iSelectedIndex > 0) //删除选中的标记点
	{
		CString strTitle, str;

		for (int i=m_iSelectedIndex;i<g_iHaveMarkedPts;i++)
		{
			//g_iMarkerName[i-1] = g_iMarkerName[i];
			g_iMarkerLon[i-1]  = g_iMarkerLon[i];
			g_iMarkerLat[i-1]  = g_iMarkerLat[i];
			g_bMarkerPlot[i-1] = g_bMarkerPlot[i];

			if (g_bMarkerPlot[i-1])
			{
				::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i-1, 0);
			}
			else
			{
				::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i-1, 1);
			}

			strTitle.Format(_T("Marker%d"),i);

			str.Format(_T("%s"), g_iMarkerName[i-1]);
			WritePrivateProfileString(strTitle,_T("Name"),str,m_strMarkerConfig);

			str.Format(_T("%.7f"), g_iMarkerLon[i-1]);
			WritePrivateProfileString(strTitle,_T("Lon"),str,m_strMarkerConfig);

			str.Format(_T("%.7f"), g_iMarkerLat[i-1]);
			WritePrivateProfileString(strTitle,_T("Lat"),str,m_strMarkerConfig);
		}

		g_iMarkerName[g_iHaveMarkedPts-1] = _T("");
		g_iMarkerLon[g_iHaveMarkedPts-1] = 0;
		g_iMarkerLat[g_iHaveMarkedPts-1] = 0;
		g_bMarkerPlot[g_iHaveMarkedPts-1] = false;

		::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, g_iHaveMarkedPts-1, 1);

		strTitle.Format(_T("Marker%d"),g_iHaveMarkedPts);

		WritePrivateProfileString(strTitle,_T("Name"),_T(""),m_strMarkerConfig);
		WritePrivateProfileString(strTitle,_T("Lon"),_T(""),m_strMarkerConfig);
		WritePrivateProfileString(strTitle,_T("Lat"),_T(""),m_strMarkerConfig);

		m_treeMarkers.DeleteItem(m_treeMarkers.GetSelectedItem());

		g_iHaveMarkedPts--;

		{
			HTREEITEM item = m_treeMarkers.GetChildItem(m_treeMarkers.GetRootItem());
			int _iIndex = 0;

			while (item)
			{
				_iIndex++;

				m_treeMarkers.SetItemData(item, _iIndex);

				str.Format(_T("Marker%d"), _iIndex);

				m_treeMarkers.SetItemText(item, str);

				item = m_treeMarkers.GetNextItem(item, TVGN_NEXT);
			}
		}
	}

	GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(_T(""));
	GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(_T(""));
	GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(_T(""));

	m_iSelectedIndex = -1;
}

//单击树控件的响应事件函数
void CDlgMarker::OnNMClickTreeMarkers(NMHDR *pNMHDR, LRESULT *pResult)
{
	//获取当前鼠标点击消息的坐标点
	CPoint pt = GetCurrentMessage()->pt;

	//转换成树控件的客户区坐标
	m_treeMarkers.ScreenToClient(&pt);

	UINT uFlags = 0;

	//获取鼠标点击坐标处的节点
	HTREEITEM hItem = m_treeMarkers.HitTest(pt, &uFlags);

	if ((hItem != nullptr) && (TVHT_ONITEMSTATEICON & uFlags)) //鼠标点击节点复选框
	{
		//选中该节点
		m_treeMarkers.SelectItem(hItem);

		//获取点击前节点的选中状态
		BOOL bCheck = m_treeMarkers.GetCheck(hItem);

		SetChildCheck(hItem, !bCheck);
		SetParentCheck(hItem, !bCheck);

		//获取选中节点的数据
		m_iSelectedIndex = m_treeMarkers.GetItemData(hItem);

		if (m_iSelectedIndex > 0)
		{
			CString str;

			str.Format(_T("%s"), g_iMarkerName[m_iSelectedIndex-1]);
			GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(str);

			str.Format(_T("%.7f"), g_iMarkerLon[m_iSelectedIndex-1]);
			GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(str);

			str.Format(_T("%.7f"), g_iMarkerLat[m_iSelectedIndex-1]);
			GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(str);

			//根据选中状态显示或隐藏标记点
			if (!bCheck)
			{
				::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 0);
			}
			else
			{
				::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 1);
			}
		}
		else if (m_iSelectedIndex == 0)
		{
			for (int i=0;i<g_iHaveMarkedPts;i++)
			{
				//if (g_iMarkerName[i] != _T(""))
				{
					//根据选中状态显示或隐藏标记点
					if (!bCheck)
					{
						::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i, 0);
					}
					else
					{
						::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, i, 1);
					}
				}
			}

			GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(_T(""));
			GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(_T(""));
			GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(_T(""));
		}
	}
	else if ((hItem != nullptr) && (TVHT_ONITEMLABEL & uFlags)) //鼠标点击节点名称
	{
		//选中该节点
		m_treeMarkers.SelectItem(hItem);

		//获取选中节点的数据
		m_iSelectedIndex = m_treeMarkers.GetItemData(hItem);

		if (m_iSelectedIndex > 0)
		{
			CString str;

			str.Format(_T("%s"), g_iMarkerName[m_iSelectedIndex-1]);
			GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(str);

			str.Format(_T("%.7f"), g_iMarkerLon[m_iSelectedIndex-1]);
			GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(str);

			str.Format(_T("%.7f"), g_iMarkerLat[m_iSelectedIndex-1]);
			GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(str);

			//当前节点置为选中状态
			m_treeMarkers.SetCheck(hItem, TRUE);

			SetChildCheck(hItem, TRUE);
			SetParentCheck(hItem, TRUE);

			//显示当前选中标记点
			::PostMessage(g_mapHwnd, WM_SEND_DRAWMARKER, m_iSelectedIndex-1, 0);
		}
		else if (m_iSelectedIndex == 0)
		{
			GetDlgItem(IDC_EDIT_MARKER_NAME)->SetWindowText(_T(""));
			GetDlgItem(IDC_EDIT_MARKER_LON)->SetWindowText(_T(""));
			GetDlgItem(IDC_EDIT_MARKER_LAT)->SetWindowText(_T(""));
		}
	}

	*pResult = 0;
}

//设置某节点的子节点的选中状态
void CDlgMarker::SetChildCheck(HTREEITEM item, BOOL bCheck)
{
	HTREEITEM childItem = m_treeMarkers.GetChildItem(item);

	while (childItem)
	{
		m_treeMarkers.SetCheck(childItem, bCheck);
		SetChildCheck(childItem, bCheck);
		childItem = m_treeMarkers.GetNextItem(childItem, TVGN_NEXT);
	}
}

//设置某节点的父节点的选中状态
void CDlgMarker::SetParentCheck(HTREEITEM item, BOOL bCheck)
{
	HTREEITEM parent = m_treeMarkers.GetParentItem(item);

	if (parent == NULL)
	{
		return ;
	}

	if (bCheck)
	{
		m_treeMarkers.SetCheck(parent, bCheck);
	}
	else
	{
		HTREEITEM bro = m_treeMarkers.GetNextItem(item, TVGN_NEXT);

		bool bFlag = false;

		while (bro)
		{
			if (m_treeMarkers.GetCheck(bro))
			{
				bFlag = true;
				break;
			}

			bro = m_treeMarkers.GetNextItem(bro, TVGN_NEXT);
		}

		if (!bFlag)
		{
			bro = m_treeMarkers.GetNextItem(item, TVGN_PREVIOUS);

			while (bro)
			{
				if (m_treeMarkers.GetCheck(bro))
				{
					bFlag = true;
					break;
				}

				bro = m_treeMarkers.GetNextItem(bro, TVGN_PREVIOUS);
			}
		}

		if (!bFlag)
		{
			m_treeMarkers.SetCheck(parent, false);
		}
	}

	SetParentCheck(parent, m_treeMarkers.GetCheck(parent));
}