Index: src/ictranslate/ICTranslateDlg.cpp
===================================================================
diff -u -N -rbee51aca3d5d9b67ecac4f528a3203738cc63455 -r50fea83cc4ee863edac0fd3960e2249f99c33b03
--- src/ictranslate/ICTranslateDlg.cpp	(.../ICTranslateDlg.cpp)	(revision bee51aca3d5d9b67ecac4f528a3203738cc63455)
+++ src/ictranslate/ICTranslateDlg.cpp	(.../ICTranslateDlg.cpp)	(revision 50fea83cc4ee863edac0fd3960e2249f99c33b03)
@@ -4,6 +4,7 @@
 #include "stdafx.h"
 #include "ictranslate.h"
 #include "ICTranslateDlg.h"
+#include <assert.h>
 
 #ifdef _DEBUG
 #define new DEBUG_NEW
@@ -55,13 +56,21 @@
 void CICTranslateDlg::DoDataExchange(CDataExchange* pDX)
 {
 	CDialog::DoDataExchange(pDX);
+	DDX_Control(pDX, IDC_SRCDATA_LIST, m_ctlBaseLanguageList);
+	DDX_Control(pDX, IDC_DSTDATA_LIST, m_ctlCustomLanguageList);
+	DDX_Control(pDX, IDC_SRCDATA_EDIT, m_ctlSrcText);
+	DDX_Control(pDX, IDC_DSTDATA_EDIT, m_ctlDstText);
 }
 
 BEGIN_MESSAGE_MAP(CICTranslateDlg, CDialog)
 	ON_WM_SYSCOMMAND()
 	ON_WM_PAINT()
 	ON_WM_QUERYDRAGICON()
 	//}}AFX_MSG_MAP
+	ON_COMMAND(ID_FILE_OPENBASETRANSLATION, &CICTranslateDlg::OnFileOpenBaseTranslation)
+	ON_COMMAND(ID_FILE_OPENYOURTRANSLATION, &CICTranslateDlg::OnFileOpenYourTranslation)
+	ON_NOTIFY(LVN_ITEMCHANGED, IDC_SRCDATA_LIST, &CICTranslateDlg::OnItemChangedSrcDataList)
+	ON_NOTIFY(LVN_ITEMCHANGED, IDC_DSTDATA_LIST, &CICTranslateDlg::OnItemChangedDstDataList)
 END_MESSAGE_MAP()
 
 
@@ -81,8 +90,7 @@
 	if (pSysMenu != NULL)
 	{
 		CString strAboutMenu;
-		strAboutMenu.LoadString(IDS_ABOUTBOX);
-		if (!strAboutMenu.IsEmpty())
+		if(strAboutMenu.LoadString(IDS_ABOUTBOX))
 		{
 			pSysMenu->AppendMenu(MF_SEPARATOR);
 			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
@@ -94,8 +102,24 @@
 	SetIcon(m_hIcon, TRUE);			// Set big icon
 	SetIcon(m_hIcon, FALSE);		// Set small icon
 
-	// TODO: Add extra initialization here
+	m_ctlBaseLanguageList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
+	m_ctlCustomLanguageList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
 
+	// setup the lists
+	LVCOLUMN lvc;
+	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
+	lvc.fmt = LVCFMT_LEFT;
+	lvc.cx = 50;
+	lvc.pszText = _T("ID");
+
+	m_ctlBaseLanguageList.InsertColumn(0, &lvc);
+	m_ctlCustomLanguageList.InsertColumn(0, &lvc);
+
+	lvc.cx = 150;
+	lvc.pszText = _T("Text");
+	m_ctlBaseLanguageList.InsertColumn(1, &lvc);
+	m_ctlCustomLanguageList.InsertColumn(1, &lvc);
+
 	return TRUE;  // return TRUE  unless you set the focus to a control
 }
 
@@ -148,3 +172,147 @@
 	return static_cast<HCURSOR>(m_hIcon);
 }
 
+void CICTranslateDlg::OnFileOpenBaseTranslation()
+{
+	CFileDialog fd(TRUE, _T(".lng"), _T(""), OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, _T("Language files (*.lng)|*.lng|All files(*.*)|*.*||"), this);
+	if(fd.DoModal() == IDOK)
+	{
+		if(!m_ldBase.ReadTranslation(fd.GetPathName()))
+			AfxMessageBox(_T("Reading file failed"));
+
+		// add texts to the list
+		m_ldBase.EnumStrings(&EnumLngStrings, &m_ctlBaseLanguageList);
+	}
+}
+
+void CICTranslateDlg::OnFileOpenYourTranslation()
+{
+	CFileDialog fd(TRUE, _T(".lng"), _T(""), OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST, _T("Language files (*.lng)|*.lng|All files(*.*)|*.*||"), this);
+	if(fd.DoModal() == IDOK)
+	{
+		if(!m_ldCustom.ReadTranslation(fd.GetPathName()))
+			AfxMessageBox(_T("Reading file failed"));
+
+		// add texts to the list
+		m_ctlCustomLanguageList.DeleteAllItems();
+		m_ldCustom.EnumStrings(&EnumLngStrings, &m_ctlCustomLanguageList);
+	}
+}
+
+void CICTranslateDlg::EnumLngStrings(uint_t uiID, const ictranslate::CTranslationItem* pTranslationItem, ptr_t pData)
+{
+	CListCtrl* pList = (CListCtrl*)pData;
+	assert(pTranslationItem);
+	if(!pTranslationItem)
+		return;
+	CString strID;
+	strID.Format(UIFMT, uiID);
+
+	LVITEM lvi;
+	lvi.mask = LVIF_TEXT | LVIF_PARAM;
+	lvi.pszText = (PTSTR)(PCTSTR)strID;
+	lvi.iItem = 0;
+	lvi.iSubItem = 0;
+	lvi.lParam = uiID;
+	
+	pList->InsertItem(&lvi);
+
+	lvi.mask = LVIF_TEXT;
+	lvi.pszText = (PTSTR)pTranslationItem->GetText();
+	lvi.iItem = 0;
+	lvi.iSubItem = 1;
+
+	pList->SetItem(&lvi);
+}
+
+void CICTranslateDlg::OnItemChangedSrcDataList(NMHDR *pNMHDR, LRESULT *pResult)
+{
+	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
+	*pResult = 0;
+
+	if(pNMLV->uNewState & LVIS_SELECTED)
+	{
+		// set the text to the edit box
+		m_ctlSrcText.SetWindowText(m_ctlBaseLanguageList.GetItemText(pNMLV->iItem, 1));
+
+		uint_t uiID = pNMLV->lParam;
+
+		// to avoid infinite loop of selections, check if the current selection is already valid
+		POSITION pos = m_ctlCustomLanguageList.GetFirstSelectedItemPosition();
+		if(pos)
+		{
+			int iPos = m_ctlCustomLanguageList.GetNextSelectedItem(pos);
+			uint_t uiCurrentID = m_ctlCustomLanguageList.GetItemData(iPos);
+			if(uiID == uiCurrentID)
+				return;
+		}
+//		m_ctlCustomLanguageList.SetItemState(-1, 0, LVIS_SELECTED);
+
+		// search in the second list for the specified id
+		int iCount = m_ctlCustomLanguageList.GetItemCount();
+		for(int i = 0; i < iCount; i++)
+		{
+			uint_t uiCustomID = m_ctlCustomLanguageList.GetItemData(i);
+			if(uiCustomID == uiID)
+			{
+				m_ctlCustomLanguageList.EnsureVisible(i, FALSE);
+				m_ctlCustomLanguageList.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
+				break;
+			}
+		}
+	}
+	else if(pNMLV->uOldState & LVIS_SELECTED)
+	{
+		m_ctlCustomLanguageList.SetItemState(-1, 0, LVIS_SELECTED);
+		m_ctlDstText.SetWindowText(_T(""));
+	}
+}
+
+void CICTranslateDlg::OnItemChangedDstDataList(NMHDR *pNMHDR, LRESULT *pResult)
+{
+	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
+	*pResult = 0;
+
+	if(pNMLV->uNewState & LVIS_SELECTED)
+	{
+		// set the text to the edit box
+		m_ctlDstText.SetWindowText(m_ctlCustomLanguageList.GetItemText(pNMLV->iItem, 1));
+
+		uint_t uiID = pNMLV->lParam;
+
+		// to avoid infinite loop of selections, check if the current selection is already valid
+		POSITION pos = m_ctlBaseLanguageList.GetFirstSelectedItemPosition();
+		if(pos)
+		{
+			int iPos = m_ctlBaseLanguageList.GetNextSelectedItem(pos);
+			uint_t uiCurrentID = m_ctlBaseLanguageList.GetItemData(iPos);
+			if(uiID == uiCurrentID)
+				return;
+		}
+//		m_ctlBaseLanguageList.SetItemState(-1, 0, LVIS_SELECTED);
+
+		// search in the second list for the specified id
+		int iCount = m_ctlBaseLanguageList.GetItemCount();
+		for(int i = 0; i < iCount; i++)
+		{
+			uint_t uiCustomID = m_ctlBaseLanguageList.GetItemData(i);
+			if(uiCustomID == uiID)
+			{
+				m_ctlBaseLanguageList.EnsureVisible(i, FALSE);
+				m_ctlBaseLanguageList.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
+				break;
+			}
+		}
+	}
+	else if(pNMLV->uOldState & LVIS_SELECTED)
+	{
+		m_ctlBaseLanguageList.SetItemState(-1, 0, LVIS_SELECTED);
+		m_ctlSrcText.SetWindowText(_T(""));
+	}
+}
+
+void CICTranslateDlg::UpdateCustomListImages()
+{
+	int iCount = m_ctlCustomLanguageList.GetItemCount();
+
+}