void CPlayerSubresyncBar::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR; if (lpnmlv->iItem >= 0 && lpnmlv->iSubItem >= 0) { enum { TOGSEP = 1, DUPITEM, DELITEM, RESETS, SETOS, SETCS, RESETE, SETOE, SETCE, STYLEFIRST, STYLELAST = STYLEFIRST + 1000, STYLEEDIT, UNICODEYES, UNICODENO, LAYERDEC, LAYERINC, ACTORFIRST, ACTORLAST = ACTORFIRST + 1000, EFFECTFIRST, EFFECTLAST = EFFECTFIRST + 1000 }; CStringArray styles; CStringArray actors; CStringArray effects; CMenu m; m.CreatePopupMenu(); if (m_mode == VOBSUB || m_mode == TEXTSUB) { m.AppendMenu(MF_STRING | MF_ENABLED, TOGSEP, ResStr(IDS_SUBRESYNC_SEPARATOR)); m.AppendMenu(MF_SEPARATOR); if (m_mode == TEXTSUB) { m.AppendMenu(MF_STRING | MF_ENABLED, DUPITEM, ResStr(IDS_SUBRESYNC_DUPLICATE)); } m.AppendMenu(MF_STRING | MF_ENABLED, DELITEM, ResStr(IDS_SUBRESYNC_DELETE)); } switch (lpnmlv->iSubItem) { case COL_START: if (m_mode == VOBSUB || m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, RESETS, ResStr(IDS_SUBRESYNC_RESET) + _T("\tF1")); m.AppendMenu(MF_STRING | MF_ENABLED, SETOS, ResStr(IDS_SUBRESYNC_ORIGINAL) + _T("\tF3")); m.AppendMenu(MF_STRING | MF_ENABLED, SETCS, ResStr(IDS_SUBRESYNC_CURRENT) + _T("\tF5")); } break; case COL_END: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, RESETE, ResStr(IDS_SUBRESYNC_RESET) + _T("\tF2")); m.AppendMenu(MF_STRING | MF_ENABLED, SETOE, ResStr(IDS_SUBRESYNC_ORIGINAL) + _T("\tF4")); m.AppendMenu(MF_STRING | MF_ENABLED, SETCE, ResStr(IDS_SUBRESYNC_CURRENT) + _T("\tF6")); } break; case COL_STYLE: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); int id = STYLEFIRST; POSITION pos = m_sts.m_styles.GetStartPosition(); while (pos && id <= STYLELAST) { CString key; STSStyle* val; m_sts.m_styles.GetNextAssoc(pos, key, val); styles.Add(key); m.AppendMenu(MF_STRING | MF_ENABLED, id++, key); } if (id > STYLEFIRST && m_list.GetSelectedCount() == 1) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, STYLEEDIT, ResStr(IDS_SUBRESYNC_EDIT)); } } break; case COL_UNICODE: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, UNICODEYES, ResStr(IDS_SUBRESYNC_YES)); m.AppendMenu(MF_STRING | MF_ENABLED, UNICODENO, ResStr(IDS_SUBRESYNC_NO)); } break; case COL_LAYER: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, LAYERDEC, ResStr(IDS_SUBRESYNC_DECREASE)); m.AppendMenu(MF_STRING | MF_ENABLED, LAYERINC, ResStr(IDS_SUBRESYNC_INCREASE)); } break; case COL_ACTOR: if (m_mode == TEXTSUB) { CMapStringToPtr actormap; for (size_t i = 0, j = m_sts.GetCount(); i < j; i++) { actormap[m_sts[i].actor] = NULL; } actormap.RemoveKey(_T("")); if (!actormap.IsEmpty()) { m.AppendMenu(MF_SEPARATOR); int id = ACTORFIRST; POSITION pos = actormap.GetStartPosition(); while (pos && id <= ACTORLAST) { CString key; void* val; actormap.GetNextAssoc(pos, key, val); actors.Add(key); m.AppendMenu(MF_STRING | MF_ENABLED, id++, key); } } } break; case COL_EFFECT: if (m_mode == TEXTSUB) { CMapStringToPtr effectmap; for (size_t i = 0, j = m_sts.GetCount(); i < j; i++) { effectmap[m_sts[i].effect] = NULL; } effectmap.RemoveKey(_T("")); if (!effectmap.IsEmpty()) { m.AppendMenu(MF_SEPARATOR); int id = EFFECTFIRST; POSITION pos = effectmap.GetStartPosition(); while (pos && id <= EFFECTLAST) { CString key; void* val; effectmap.GetNextAssoc(pos, key, val); effects.Add(key); m.AppendMenu(MF_STRING | MF_ENABLED, id++, key); } } } break; } CPoint p = lpnmlv->ptAction; ::MapWindowPoints(pNMHDR->hwndFrom, HWND_DESKTOP, &p, 1); UINT id = m.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RETURNCMD, p.x, p.y, this); bool fNeedsUpdate = false; POSITION pos = m_list.GetFirstSelectedItemPosition(); while (pos) { int iItem = m_list.GetNextSelectedItem(pos); SubTime& st = m_subtimes[iItem]; switch (id) { case TOGSEP: m_list.SetItemData(iItem, m_list.GetItemData(iItem) ^ TSEP); m_list.Invalidate(); fNeedsUpdate = true; break; case DUPITEM: { CUIntArray items; pos = m_list.GetFirstSelectedItemPosition(); while (pos) { items.Add(m_list.GetNextSelectedItem(pos)); } qsort(items.GetData(), items.GetCount(), sizeof(UINT), uintcomp); for (INT_PTR i = 0, l = items.GetCount(); i < l; i++) { iItem = items[i]; STSEntry stse = m_sts[iItem]; m_sts.InsertAt(iItem + 1, stse); SubTime st = m_subtimes[iItem]; m_subtimes.InsertAt(iItem + 1, st); CHeaderCtrl* pHeader = (CHeaderCtrl*)m_list.GetDlgItem(0); int nColumnCount = pHeader->GetItemCount(); CStringArray sa; sa.SetSize(nColumnCount); for (int col = 0; col < nColumnCount; col++) { sa[col] = m_list.GetItemText(iItem, col); } DWORD_PTR data = m_list.GetItemData(iItem); m_list.InsertItem(iItem + 1, sa[0]); m_list.SetItemData(iItem + 1, data); for (int col = 1; col < nColumnCount; col++) { m_list.SetItemText(iItem + 1, col, sa[col]); } } } fNeedsUpdate = true; break; case DELITEM: { CUIntArray items; pos = m_list.GetFirstSelectedItemPosition(); while (pos) { items.Add(m_list.GetNextSelectedItem(pos)); } qsort(items.GetData(), items.GetCount(), sizeof(UINT), uintcomp); for (INT_PTR i = 0, l = items.GetCount(); i < l; i++) { iItem = items[i]; m_sts.RemoveAt(iItem); m_subtimes.RemoveAt(iItem); m_list.DeleteItem(iItem); } iItem = items[items.GetCount() - 1]; if (iItem >= m_list.GetItemCount()) { iItem = m_list.GetItemCount() - 1; } m_list.SetSelectionMark(iItem); } fNeedsUpdate = true; break; case RESETS: /*if (*/ ModStart(iItem, st.orgstart, true);/*)*/ fNeedsUpdate = true; break; case SETOS: /*if (*/ ModStart(iItem, st.orgstart);/*)*/ fNeedsUpdate = true; break; case SETCS: /*if (*/ ModStart(iItem, (int)(m_rt / 10000)); /*)*/ fNeedsUpdate = true; break; case RESETE: /*if (*/ ModEnd(iItem, st.orgend, true);/*)*/ fNeedsUpdate = true; break; case SETOE: /*if (*/ ModEnd(iItem, st.orgend);/*)*/ fNeedsUpdate = true; break; case SETCE: /*if (*/ ModEnd(iItem, (int)(m_rt / 10000)); /*)*/ fNeedsUpdate = true; break; default: if (STYLEFIRST <= id && id <= STYLELAST) { CString s = styles[id - STYLEFIRST]; if (m_sts[iItem].style != s) { fNeedsUpdate = true; } m_sts[iItem].style = s; m_list.SetItemText(iItem, lpnmlv->iSubItem, s); } else if (id == STYLEEDIT) { CAutoPtrArray<CPPageSubStyle> pages; CAtlArray<STSStyle*> styles; STSStyle* stss = m_sts.GetStyle(iItem); int iSelPage = 0; POSITION pos = m_sts.m_styles.GetStartPosition(); for (int i = 0; pos; i++) { CString key; STSStyle* val; m_sts.m_styles.GetNextAssoc(pos, key, val); CAutoPtr<CPPageSubStyle> page(DNew CPPageSubStyle()); page->InitSubStyle(key, val); pages.Add(page); styles.Add(val); if (stss == val) { iSelPage = i; } } CPropertySheet dlg(_T("Styles..."), this, iSelPage); for (size_t i = 0, l = pages.GetCount(); i < l; i++) { dlg.AddPage(pages[i]); } if (dlg.DoModal() == IDOK) { for (size_t j = 0, l = pages.GetCount(); j < l; j++) { stss = styles[j]; pages[j]->GetSubStyle(stss); for (int i = 0; i < (int)m_sts.GetCount(); i++) { if (m_sts.GetStyle(i) == stss) { CString str; m_list.SetItemText(i, COL_TEXT, m_sts.GetStrW(i, true)); m_list.SetItemText(i, COL_FONT, stss->fontName); str.Format(_T("%d"), stss->charSet); m_list.SetItemText(i, COL_CHARSET, str); str.Format(_T("%d"), m_sts[i].layer); } } } fNeedsUpdate = true; } } else if (id == UNICODEYES || id == UNICODENO) { m_sts.ConvertUnicode(iItem, id == UNICODEYES); m_list.SetItemText(iItem, COL_TEXT, m_sts.GetStrW(iItem, true)); m_list.SetItemText(iItem, COL_UNICODE, m_sts.IsEntryUnicode(iItem) ? _T("yes") : _T("no")); fNeedsUpdate = true; } else if (id == LAYERDEC || id == LAYERINC) { int d = (id == LAYERDEC) ? -1 : 1; fNeedsUpdate = true; m_sts[iItem].layer += d; CString s; s.Format(_T("%d"), m_sts[iItem].layer); m_list.SetItemText(iItem, lpnmlv->iSubItem, s); } else if (ACTORFIRST <= id && id <= ACTORLAST) { CString s = actors[id - ACTORFIRST]; if (m_sts[iItem].actor != s) { fNeedsUpdate = true; } m_sts[iItem].actor = s; m_list.SetItemText(iItem, lpnmlv->iSubItem, s); } else if (EFFECTFIRST <= id && id <= EFFECTLAST) { CString s = effects[id - EFFECTFIRST]; if (m_sts[iItem].effect != s) { fNeedsUpdate = true; } m_sts[iItem].effect = s; m_list.SetItemText(iItem, lpnmlv->iSubItem, s); } break; } } if (fNeedsUpdate) { UpdatePreview(); } } *pResult = 0; }
void CPlayerSubresyncBar::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW lpnmlv = (LPNMLISTVIEW)pNMHDR; if (lpnmlv->iItem >= 0 && lpnmlv->iSubItem >= 0) { enum { TOGSEP = 1, DUPITEM, DELITEM, RESETS, SETOS, SETCS, RESETE, SETOE, SETCE, STYLEFIRST, STYLELAST = STYLEFIRST + 1000, STYLEEDIT, UNICODEYES, UNICODENO, LAYERDEC, LAYERINC, ACTORFIRST, ACTORLAST = ACTORFIRST + 1000, EFFECTFIRST, EFFECTLAST = EFFECTFIRST + 1000 }; CStringArray styles; CStringArray actors; CStringArray effects; CMenu m; m.CreatePopupMenu(); if (m_mode == VOBSUB || m_mode == TEXTSUB) { m.AppendMenu(MF_STRING | MF_ENABLED, TOGSEP, ResStr(IDS_SUBRESYNC_SEPARATOR)); m.AppendMenu(MF_SEPARATOR); if (m_mode == TEXTSUB) { m.AppendMenu(MF_STRING | MF_ENABLED, DUPITEM, ResStr(IDS_SUBRESYNC_DUPLICATE)); } m.AppendMenu(MF_STRING | MF_ENABLED, DELITEM, ResStr(IDS_SUBRESYNC_DELETE)); } switch (lpnmlv->iSubItem) { case COL_START: if (m_mode == VOBSUB || m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, RESETS, ResStr(IDS_SUBRESYNC_RESET) + _T("\tF1")); m.AppendMenu(MF_STRING | MF_ENABLED, SETOS, ResStr(IDS_SUBRESYNC_ORIGINAL) + _T("\tF3")); m.AppendMenu(MF_STRING | MF_ENABLED, SETCS, ResStr(IDS_SUBRESYNC_CURRENT) + _T("\tF5")); } break; case COL_END: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, RESETE, ResStr(IDS_SUBRESYNC_RESET) + _T("\tF2")); m.AppendMenu(MF_STRING | MF_ENABLED, SETOE, ResStr(IDS_SUBRESYNC_ORIGINAL) + _T("\tF4")); m.AppendMenu(MF_STRING | MF_ENABLED, SETCE, ResStr(IDS_SUBRESYNC_CURRENT) + _T("\tF6")); } break; case COL_STYLE: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); int id = STYLEFIRST; POSITION pos = m_sts.m_styles.GetStartPosition(); while (pos && id <= STYLELAST) { CString key; STSStyle* val; m_sts.m_styles.GetNextAssoc(pos, key, val); styles.Add(key); m.AppendMenu(MF_STRING | MF_ENABLED, id++, key); } if (id > STYLEFIRST && m_list.GetSelectedCount() == 1) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, STYLEEDIT, ResStr(IDS_SUBRESYNC_EDIT)); } } break; case COL_UNICODE: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, UNICODEYES, m_strYesMenu); m.AppendMenu(MF_STRING | MF_ENABLED, UNICODENO, m_strNoMenu); } break; case COL_LAYER: if (m_mode == TEXTSUB) { m.AppendMenu(MF_SEPARATOR); m.AppendMenu(MF_STRING | MF_ENABLED, LAYERDEC, ResStr(IDS_SUBRESYNC_DECREASE)); m.AppendMenu(MF_STRING | MF_ENABLED, LAYERINC, ResStr(IDS_SUBRESYNC_INCREASE)); } break; case COL_ACTOR: if (m_mode == TEXTSUB) { CMapStringToPtr actormap; for (size_t i = 0, j = m_sts.GetCount(); i < j; i++) { actormap[m_sts[i].actor] = nullptr; } actormap.RemoveKey(_T("")); if (!actormap.IsEmpty()) { m.AppendMenu(MF_SEPARATOR); int id = ACTORFIRST; POSITION pos = actormap.GetStartPosition(); while (pos && id <= ACTORLAST) { CString key; void* val; actormap.GetNextAssoc(pos, key, val); actors.Add(key); m.AppendMenu(MF_STRING | MF_ENABLED, id++, key); } } } break; case COL_EFFECT: if (m_mode == TEXTSUB) { CMapStringToPtr effectmap; for (size_t i = 0, j = m_sts.GetCount(); i < j; i++) { effectmap[m_sts[i].effect] = nullptr; } effectmap.RemoveKey(_T("")); if (!effectmap.IsEmpty()) { m.AppendMenu(MF_SEPARATOR); int id = EFFECTFIRST; POSITION pos = effectmap.GetStartPosition(); while (pos && id <= EFFECTLAST) { CString key; void* val; effectmap.GetNextAssoc(pos, key, val); effects.Add(key); m.AppendMenu(MF_STRING | MF_ENABLED, id++, key); } } } break; } CPoint p = lpnmlv->ptAction; ::MapWindowPoints(pNMHDR->hwndFrom, HWND_DESKTOP, &p, 1); UINT id = m.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RETURNCMD, p.x, p.y, this); bool bNeedsUpdate = false; POSITION pos = m_list.GetFirstSelectedItemPosition(); while (pos) { int iItem = m_list.GetNextSelectedItem(pos); SubTime& st = m_subtimes[iItem]; switch (id) { case TOGSEP: m_displayData[iItem].flags ^= TSEP; m_list.Invalidate(); bNeedsUpdate = true; break; case DUPITEM: { CUIntArray items; pos = m_list.GetFirstSelectedItemPosition(); while (pos) { items.Add(m_list.GetNextSelectedItem(pos)); } qsort(items.GetData(), items.GetCount(), sizeof(UINT), uintcomp); for (INT_PTR i = 0, l = items.GetCount(); i < l; i++) { iItem = items[i]; STSEntry entry = m_sts[iItem]; m_sts.InsertAt(iItem + 1, entry); SubTime subtime = m_subtimes[iItem]; m_subtimes.InsertAt(iItem + 1, subtime); DisplayData displayData = m_displayData[iItem]; m_displayData.InsertAt(iItem + 1, displayData); } m_list.SetItemCount((int)m_sts.GetCount()); bNeedsUpdate = true; break; } case DELITEM: { CUIntArray items; pos = m_list.GetFirstSelectedItemPosition(); while (pos) { items.Add(m_list.GetNextSelectedItem(pos)); } qsort(items.GetData(), items.GetCount(), sizeof(UINT), uintcomp); for (INT_PTR i = 0, l = items.GetCount(); i < l; i++) { iItem = items[i]; m_sts.RemoveAt(iItem); m_subtimes.RemoveAt(iItem); m_displayData.RemoveAt(iItem); } m_list.SetItemCount((int)m_sts.GetCount()); iItem = items[items.GetCount() - 1]; if (iItem >= m_list.GetItemCount()) { iItem = m_list.GetItemCount() - 1; } m_list.SetSelectionMark(iItem); bNeedsUpdate = true; break; } case RESETS: ModStart(iItem, st.orgStart, true); bNeedsUpdate = true; break; case SETOS: ModStart(iItem, st.orgStart); bNeedsUpdate = true; break; case SETCS: ModStart(iItem, (int)(m_rt / 10000)); bNeedsUpdate = true; break; case RESETE: ModEnd(iItem, st.orgEnd, true); bNeedsUpdate = true; break; case SETOE: ModEnd(iItem, st.orgEnd); bNeedsUpdate = true; break; case SETCE: ModEnd(iItem, (int)(m_rt / 10000)); bNeedsUpdate = true; break; default: if (STYLEFIRST <= id && id <= STYLELAST) { CString s = styles[id - STYLEFIRST]; if (m_sts[iItem].style != s) { m_sts[iItem].style = s; bNeedsUpdate = true; } } else if (id == STYLEEDIT) { CAutoPtrArray<CPPageSubStyle> pages; CAtlArray<STSStyle*> styles; STSStyle* stss = m_sts.GetStyle(iItem); int iSelPage = 0; POSITION pos = m_sts.m_styles.GetStartPosition(); for (int i = 0; pos; i++) { CString key; STSStyle* val; m_sts.m_styles.GetNextAssoc(pos, key, val); CAutoPtr<CPPageSubStyle> page(DEBUG_NEW CPPageSubStyle()); page->InitStyle(key, *val); pages.Add(page); styles.Add(val); if (stss == val) { iSelPage = i; } } CPropertySheet dlg(ResStr(IDS_SUBTITLES_STYLES_CAPTION), this, iSelPage); for (size_t i = 0, l = pages.GetCount(); i < l; i++) { dlg.AddPage(pages[i]); } if (dlg.DoModal() == IDOK) { for (size_t j = 0, l = pages.GetCount(); j < l; j++) { pages[j]->GetStyle(*styles[j]); } bNeedsUpdate = true; } } else if (id == UNICODEYES || id == UNICODENO) { m_sts.ConvertUnicode(iItem, id == UNICODEYES); bNeedsUpdate = true; } else if (id == LAYERDEC || id == LAYERINC) { int d = (id == LAYERDEC) ? -1 : 1; m_sts[iItem].layer += d; bNeedsUpdate = true; } else if (ACTORFIRST <= id && id <= ACTORLAST) { CString s = actors[id - ACTORFIRST]; if (m_sts[iItem].actor != s) { m_sts[iItem].actor = s; bNeedsUpdate = true; } } else if (EFFECTFIRST <= id && id <= EFFECTLAST) { CString s = effects[id - EFFECTFIRST]; if (m_sts[iItem].effect != s) { m_sts[iItem].effect = s; bNeedsUpdate = true; } } break; } if (bNeedsUpdate) { m_list.Update(iItem); } } if (bNeedsUpdate) { UpdatePreview(); } } *pResult = 0; }