/*
* $Id$
*
* (C) 2006-2010 see AUTHORS
*
* This file is part of mplayerc.
*
* Mplayerc 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 3 of the License, or
* (at your option) any later version.
*
* Mplayerc 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 this program. If not, see .
*
*/
#include "stdafx.h"
#include "resource.h"
#include "EditListEditor.h"
#include "../../DSUtil/DSUtil.h"
CClip::CClip()
{
m_rtIn = _I64_MIN;
m_rtOut = _I64_MIN;
}
void CClip::SetIn(LPCTSTR strVal)
{
m_rtIn = StringToReftime (strVal);
}
void CClip::SetOut(LPCTSTR strVal)
{
m_rtOut = StringToReftime (strVal);
}
void CClip::SetIn (REFERENCE_TIME rtVal)
{
m_rtIn = rtVal;
if (m_rtIn > m_rtOut) m_rtOut = _I64_MIN;
};
void CClip::SetOut (REFERENCE_TIME rtVal)
{
m_rtOut = rtVal;
if (m_rtIn > m_rtOut) m_rtIn = _I64_MIN;
};
CString CClip::GetIn()
{
if (m_rtIn == _I64_MIN)
return _T("");
else
return ReftimeToString(m_rtIn);
}
CString CClip::GetOut()
{
if (m_rtOut == _I64_MIN)
return _T("");
else
return ReftimeToString(m_rtOut);
}
IMPLEMENT_DYNAMIC(CEditListEditor, CSizingControlBarG)
CEditListEditor::CEditListEditor(void)
{
m_CurPos = NULL;
m_bDragging = FALSE;
m_nDragIndex = -1;
m_nDropIndex = -1;
m_bFileOpen = false;
}
CEditListEditor::~CEditListEditor(void)
{
SaveEditListToFile();
}
BEGIN_MESSAGE_MAP(CEditListEditor, CSizingControlBarG)
ON_WM_SIZE()
ON_NOTIFY(LVN_ITEMCHANGED, IDC_EDITLIST, OnLvnItemchanged)
ON_NOTIFY(LVN_KEYDOWN, IDC_EDITLIST, OnLvnKeyDown)
ON_WM_DRAWITEM()
ON_NOTIFY(LVN_BEGINDRAG, IDC_EDITLIST, OnBeginDrag)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_EDITLIST, OnBeginlabeleditList)
ON_NOTIFY(LVN_DOLABELEDIT, IDC_EDITLIST, OnDolabeleditList)
ON_NOTIFY(LVN_ENDLABELEDIT, IDC_EDITLIST, OnEndlabeleditList)
END_MESSAGE_MAP()
BOOL CEditListEditor::Create(CWnd* pParentWnd)
{
if(!CSizingControlBarG::Create(_T("Edit list editor"), pParentWnd, ID_VIEW_EDITLISTEDITOR))
return FALSE;
m_stUsers.Create (_T("User :"), WS_VISIBLE|WS_CHILD, CRect (5,5,100,21), this, 0);
m_cbUsers.Create (WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST, CRect (90,0, 260, 21), this, 0);
FillCombo(_T("Users.txt"), m_cbUsers, false);
m_stHotFolders.Create (_T("Hot folder :"), WS_VISIBLE|WS_CHILD, CRect (5,35,100,51), this, 0);
m_cbHotFolders.Create (WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST, CRect (90,30, 260, 21), this, 0);
FillCombo(_T("HotFolders.txt"), m_cbHotFolders, true);
m_list.CreateEx(
WS_EX_DLGMODALFRAME|WS_EX_CLIENTEDGE,
WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_TABSTOP
|LVS_OWNERDRAWFIXED
|LVS_REPORT|LVS_SINGLESEL|LVS_AUTOARRANGE|LVS_NOSORTHEADER,
CRect(0,0,100,100), this, IDC_EDITLIST);
m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER);
m_list.InsertColumn(COL_IN, _T("Nb."), LVCFMT_LEFT, 35);
m_list.InsertColumn(COL_IN, _T("In"), LVCFMT_LEFT, 100);
m_list.InsertColumn(COL_OUT, _T("Out"), LVCFMT_LEFT, 100);
m_list.InsertColumn(COL_NAME, _T("Name"), LVCFMT_LEFT, 150);
m_fakeImageList.Create(1, 16, ILC_COLOR4, 10, 10);
m_list.SetImageList(&m_fakeImageList, LVSIL_SMALL);
return TRUE;
}
void CEditListEditor::OnSize(UINT nType, int cx, int cy)
{
CSizingControlBarG::OnSize(nType, cx, cy);
ResizeListColumn();
}
void CEditListEditor::ResizeListColumn()
{
if(::IsWindow(m_list.m_hWnd))
{
CRect r;
GetClientRect(r);
r.DeflateRect(2, 2);
r.top += 60;
m_list.SetRedraw(FALSE);
m_list.MoveWindow(r);
m_list.GetClientRect(r);
m_list.SetRedraw(TRUE);
}
}
void CEditListEditor::SaveEditListToFile()
{
if ((m_bFileOpen || m_EditList.GetCount() >0) && !m_strFileName.IsEmpty())
{
CStdioFile EditListFile;
if (EditListFile.Open (m_strFileName, CFile::modeCreate|CFile::modeWrite))
{
CString strLine;
int nIndex;
CString strUser;
CString strHotFolders;
nIndex = m_cbUsers.GetCurSel();
if (nIndex >= 0)
{
m_cbUsers.GetLBText(nIndex, strUser);
}
nIndex = m_cbHotFolders.GetCurSel();
if (nIndex >= 0)
{
m_cbHotFolders.GetLBText(nIndex, strHotFolders);
}
POSITION pos = m_EditList.GetHeadPosition();
for(int i = 0; pos; i++, m_EditList.GetNext(pos))
{
CClip& CurClip = m_EditList.GetAt(pos);
if (CurClip.HaveIn() && CurClip.HaveOut())
{
strLine.Format(_T("%s\t%s\t%s\t%s\t%s\n"), CurClip.GetIn(), CurClip.GetOut(), CurClip.GetName(), strUser, strHotFolders);
EditListFile.WriteString (strLine);
}
}
EditListFile.Close();
}
}
}
void CEditListEditor::CloseFile()
{
SaveEditListToFile();
m_EditList.RemoveAll();
m_list.DeleteAllItems();
m_CurPos = NULL;
m_strFileName = "";
m_bFileOpen = false;
m_cbHotFolders.SetCurSel(0);
}
void CEditListEditor::OpenFile(LPCTSTR lpFileName)
{
CString strLine;
CStdioFile EditListFile;
CString strUser;
CString strHotFolders;
CloseFile();
m_strFileName.Format(_T("%s.edl"), lpFileName);
if (EditListFile.Open (m_strFileName, CFile::modeRead))
{
m_bFileOpen = true;
while (EditListFile.ReadString(strLine))
{
//int nPos = 0;
CString strIn; // = strLine.Tokenize(_T(" \t"), nPos);
CString strOut; // = strLine.Tokenize(_T(" \t"), nPos);
CString strName; // = strLine.Tokenize(_T(" \t"), nPos);
AfxExtractSubString (strIn, strLine, 0, _T('\t'));
AfxExtractSubString (strOut, strLine, 1, _T('\t'));
AfxExtractSubString (strName, strLine, 2, _T('\t'));
if (strUser.IsEmpty())
{
AfxExtractSubString (strUser, strLine, 3, _T('\t'));
SelectCombo(strUser, m_cbUsers);
}
if (strHotFolders.IsEmpty())
{
AfxExtractSubString (strHotFolders, strLine, 4, _T('\t'));
SelectCombo(strHotFolders, m_cbHotFolders);
}
if (!strIn.IsEmpty() && !strOut.IsEmpty())
{
CClip NewClip;
NewClip.SetIn (strIn);
NewClip.SetOut (strOut);
NewClip.SetName(strName);
InsertClip (NULL, NewClip);
}
}
EditListFile.Close();
}
else
m_bFileOpen = false;
if (m_NameList.GetCount() == 0)
{
CStdioFile NameFile;
CString str;
if (NameFile.Open (_T("EditListNames.txt"), CFile::modeRead))
{
while(NameFile.ReadString(str))
{
m_NameList.Add(str);
}
NameFile.Close();
}
}
}
void CEditListEditor::SetIn (REFERENCE_TIME rtIn)
{
if (m_CurPos != NULL)
{
CClip& CurClip = m_EditList.GetAt (m_CurPos);
CurClip.SetIn (rtIn);
m_list.Invalidate();
}
}
void CEditListEditor::SetOut(REFERENCE_TIME rtOut)
{
if (m_CurPos != NULL)
{
CClip& CurClip = m_EditList.GetAt (m_CurPos);
CurClip.SetOut (rtOut);
m_list.Invalidate();
}
}
void CEditListEditor::NewClip(REFERENCE_TIME rtVal)
{
CClip NewClip;
if (m_CurPos != NULL)
{
CClip& CurClip = m_EditList.GetAt (m_CurPos);
if (CurClip.HaveIn())
{
if (!CurClip.HaveOut())
CurClip.SetOut (rtVal);
}
}
m_CurPos = InsertClip (m_CurPos, NewClip);
m_list.Invalidate();
}
void CEditListEditor::Save()
{
SaveEditListToFile();
}
int CEditListEditor::FindIndex(POSITION pos)
{
int iItem = 0;
POSITION CurPos = m_EditList.GetHeadPosition();
while (CurPos && CurPos != pos)
{
m_EditList.GetNext (CurPos);
iItem++;
}
return iItem;
}
POSITION CEditListEditor::InsertClip(POSITION pos, CClip& NewClip)
{
LVITEM lv;
POSITION NewClipPos;
if (pos == NULL)
NewClipPos = m_EditList.AddTail (NewClip);
else
NewClipPos = m_EditList.InsertAfter (pos, NewClip);
lv.mask = LVIF_STATE | LVIF_TEXT;
lv.iItem = FindIndex (pos);
lv.iSubItem = 0;
lv.pszText = _T("");
lv.state = m_list.GetItemCount()==0 ? LVIS_SELECTED : 0;
m_list.InsertItem(&lv);
return NewClipPos;
}
void CEditListEditor::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(nIDCtl != IDC_EDITLIST) return;
int nItem = lpDrawItemStruct->itemID;
CRect rcItem = lpDrawItemStruct->rcItem;
POSITION pos = m_EditList.FindIndex(nItem);
if (pos != NULL)
{
bool fSelected = (pos == m_CurPos);
UNUSED_ALWAYS(fSelected);
CClip& CurClip = m_EditList.GetAt(pos);
CString strTemp;
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
if(!!m_list.GetItemState(nItem, LVIS_SELECTED))
{
FillRect(pDC->m_hDC, rcItem, CBrush(0xf1dacc));
FrameRect(pDC->m_hDC, rcItem, CBrush(0xc56a31));
}
else
{
FillRect(pDC->m_hDC, rcItem, CBrush(GetSysColor(COLOR_WINDOW)));
}
COLORREF textcolor = RGB(0,0,0);
if(!CurClip.HaveIn() || !CurClip.HaveOut()) textcolor = RGB(255,0,0);
for (int i=0; iSetTextColor(textcolor);
switch (i)
{
case COL_INDEX :
strTemp.Format (_T("%d"), nItem+1);
pDC->DrawText (strTemp, rcItem, DT_CENTER | DT_VCENTER);
break;
case COL_IN :
pDC->DrawText (CurClip.GetIn(), rcItem, DT_CENTER | DT_VCENTER);
break;
case COL_OUT :
pDC->DrawText (CurClip.GetOut(), rcItem, DT_CENTER | DT_VCENTER);
break;
case COL_NAME :
pDC->DrawText (CurClip.GetName(), rcItem, DT_LEFT | DT_VCENTER);
break;
}
}
}
}
void CEditListEditor::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);
if(pNMLV->iItem >= 0)
{
m_CurPos = m_EditList.FindIndex (pNMLV->iItem);
}
}
void CEditListEditor::OnLvnKeyDown(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLVKEYDOWN pLVKeyDown = reinterpret_cast(pNMHDR);
*pResult = FALSE;
if(pLVKeyDown->wVKey == VK_DELETE)
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
POSITION ClipPos;
int nItem = -1;
while(pos)
{
nItem = m_list.GetNextSelectedItem(pos);
ClipPos = m_EditList.FindIndex (nItem);
if (ClipPos)
{
m_EditList.RemoveAt (ClipPos);
}
m_list.DeleteItem (nItem);
}
if (nItem != -1)
m_list.SetItemState (min (nItem, m_list.GetItemCount()-1), LVIS_SELECTED, LVIS_SELECTED);
m_list.Invalidate();
}
}
void CEditListEditor::OnBeginDrag(NMHDR* pNMHDR, LRESULT* pResult)
{
ModifyStyle(WS_EX_ACCEPTFILES, 0);
m_nDragIndex = ((LPNMLISTVIEW)pNMHDR)->iItem;
CPoint p(0, 0);
m_pDragImage = m_list.CreateDragImageEx(&p);
CPoint p2 = ((LPNMLISTVIEW)pNMHDR)->ptAction;
m_pDragImage->BeginDrag(0, p2 - p);
m_pDragImage->DragEnter(GetDesktopWindow(), ((LPNMLISTVIEW)pNMHDR)->ptAction);
m_bDragging = TRUE;
m_nDropIndex = -1;
SetCapture();
}
void CEditListEditor::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bDragging)
{
m_ptDropPoint = point;
ClientToScreen(&m_ptDropPoint);
m_pDragImage->DragMove(m_ptDropPoint);
m_pDragImage->DragShowNolock(FALSE);
WindowFromPoint(m_ptDropPoint)->ScreenToClient(&m_ptDropPoint);
m_pDragImage->DragShowNolock(TRUE);
{
int iOverItem = m_list.HitTest(m_ptDropPoint);
int iTopItem = m_list.GetTopIndex();
int iBottomItem = m_list.GetBottomIndex();
if(iOverItem == iTopItem && iTopItem != 0) // top of list
SetTimer(1, 100, NULL);
else
KillTimer(1);
if(iOverItem >= iBottomItem && iBottomItem != (m_list.GetItemCount() - 1)) // bottom of list
SetTimer(2, 100, NULL);
else
KillTimer(2);
}
}
__super::OnMouseMove(nFlags, point);
}
void CEditListEditor::OnTimer(UINT_PTR nIDEvent)
{
int iTopItem = m_list.GetTopIndex();
int iBottomItem = iTopItem + m_list.GetCountPerPage() - 1;
if(m_bDragging)
{
m_pDragImage->DragShowNolock(FALSE);
if(nIDEvent == 1)
{
m_list.EnsureVisible(iTopItem - 1, false);
m_list.UpdateWindow();
if(m_list.GetTopIndex() == 0) KillTimer(1);
}
else if(nIDEvent == 2)
{
m_list.EnsureVisible(iBottomItem + 1, false);
m_list.UpdateWindow();
if(m_list.GetBottomIndex() == (m_list.GetItemCount() - 1)) KillTimer(2);
}
m_pDragImage->DragShowNolock(TRUE);
}
__super::OnTimer(nIDEvent);
}
void CEditListEditor::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bDragging)
{
::ReleaseCapture();
m_bDragging = FALSE;
m_pDragImage->DragLeave(GetDesktopWindow());
m_pDragImage->EndDrag();
delete m_pDragImage;
m_pDragImage = NULL;
KillTimer(1);
KillTimer(2);
CPoint pt(point);
ClientToScreen(&pt);
if(WindowFromPoint(pt) == &m_list)
DropItemOnList();
}
ModifyStyle(0, WS_EX_ACCEPTFILES);
__super::OnLButtonUp(nFlags, point);
}
void CEditListEditor::DropItemOnList()
{
m_ptDropPoint.y -= 10; //
m_nDropIndex = m_list.HitTest(CPoint(10, m_ptDropPoint.y));
POSITION DragPos = m_EditList.FindIndex (m_nDragIndex);
POSITION DropPos = m_EditList.FindIndex (m_nDropIndex);
if ((DragPos!=NULL) && (DropPos!=NULL))
{
CClip& DragClip = m_EditList.GetAt(DragPos);
m_EditList.InsertAfter (DropPos, DragClip);
m_EditList.RemoveAt (DragPos);
m_list.Invalidate();
}
}
void CEditListEditor::OnBeginlabeleditList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem = &pDispInfo->item;
*pResult = FALSE;
if(pItem->iItem < 0)
return;
if(pItem->iSubItem == COL_NAME)
{
*pResult = TRUE;
}
}
void CEditListEditor::OnDolabeleditList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem = &pDispInfo->item;
*pResult = FALSE;
if(pItem->iItem < 0)
return;
if (m_CurPos != NULL && pItem->iSubItem == COL_NAME)
{
CClip& CurClip = m_EditList.GetAt (m_CurPos);
int nSel = FindNameIndex (CurClip.GetName());
CAtlList sl;
for (int i=0; iiItem, pItem->iSubItem, sl, nSel, true);
*pResult = TRUE;
}
}
void CEditListEditor::OnEndlabeleditList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
LV_ITEM* pItem = &pDispInfo->item;
*pResult = FALSE;
if(!m_list.m_fInPlaceDirty)
return;
if(pItem->iItem < 0)
return;
CString& CurName = m_NameList.GetAt(pItem->lParam);
if(m_CurPos != NULL && pItem->iSubItem == COL_NAME)
{
CClip& CurClip = m_EditList.GetAt (m_CurPos);
CurClip.SetName(CurName);
*pResult = TRUE;
}
}
int CEditListEditor::FindNameIndex(LPCTSTR strName)
{
int nResult = -1;
for(int i = 0; i