📄 resorgsymbolslistview.cpp
字号:
CResourceSymbolManager* pMngr = GetDocument()->GetSymbolBuffer();
if ( (NULL != pMngr) && (NULL == m_ctrlSymbols.GetSymbolManager() ) )
{
if (Options.FilterMultiFileSymbolsDisplays() &&
pMngr->IsKindOf(RUNTIME_CLASS(CResourceSymbolManagerMultiFile) ) &&
(pMngr->GetProblemSymbolCount() > 0) )
{
m_ctrlSymbols.ShowProblemSymbolsOnly(true);
}
}
m_ctrlSymbols.AddSymbols(pMngr); // Sledgehammer approach - slow but effective
}
break;
case SYM_ADDED:
m_ctrlSymbols.AddSymbol( (CResourceSymbol*)pHint );
m_ctrlSymbols.Sort();
break;
case SYM_CHANGED:
m_ctrlSymbols.UpdateSymbol( (CResourceSymbol*)pHint );
m_ctrlSymbols.Sort();
break;
case SYM_DELETED:
m_ctrlSymbols.RemoveSymbol( (CResourceSymbol*)pHint );
break;
default:
break;
}
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsListView printing
BOOL CResOrgSymbolsListView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CResOrgSymbolsListView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CResOrgSymbolsListView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsListView diagnostics
#ifdef _DEBUG
void CResOrgSymbolsListView::AssertValid(void) const
{
CResOrgSymbolsListView_BASE::AssertValid();
}
void CResOrgSymbolsListView::Dump(CDumpContext& dc) const
{
CResOrgSymbolsListView_BASE::Dump(dc);
}
CResOrgSymbolsDoc* CResOrgSymbolsListView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CResOrgSymbolsDoc)));
return (CResOrgSymbolsDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsListView implementation
void CResOrgSymbolsListView::Initialise(void)
{
if (!m_bInitialised)
{
m_ctrlSymbols.Initialise(TRUE);
m_bInitialised = TRUE;
}
}
void CResOrgSymbolsListView::ConfigureScrollbars(void)
{
SCROLLINFO infoHorz;
m_ctrlSymbols.GetScrollInfo(SB_HORZ, &infoHorz);
SetScrollInfo(SB_HORZ, &infoHorz, true);
SCROLLINFO infoVert;
m_ctrlSymbols.GetScrollInfo(SB_VERT, &infoVert);
SetScrollInfo(SB_VERT, &infoVert, true);
}
BOOL CResOrgSymbolsListView::ConfirmDelete(const CString& sSymbol /*= _T("")*/ ) const
{
CNGMessageBox dlg;
if (!sSymbol.IsEmpty())
{
dlg.FormatMsgEx(MAKEINTRESOURCE(IDP_SYM_DELETE_WARNING_EX),
_T("RTF"),
sSymbol);
}
else
{
dlg.SetMsgEx( MAKEINTRESOURCE( IDP_SYM_DELETE_WARNING),
_T("RTF") );
}
dlg.SetRtf();
dlg.SetStandardIcon(IDI_WARNING);
dlg.AddButton(IDYES, FALSE, FALSE, _T("&Yes") );
dlg.AddButton(IDNO, TRUE, TRUE, _T("&No") );
return (IDYES == dlg.DoModal());
}
BOOL CResOrgSymbolsListView::IsValueUnique( CResourceSymbol* pSymbol,
UINT uValue)
{
BOOL bUnique = TRUE;
if ( (NULL != GetDocument()->GetSymbolBuffer()) && (NULL != pSymbol) )
{
CResourceSymbolList listSymbols;
GetDocument()->GetSymbolBuffer()->GetSymbols(uValue, listSymbols);
POSITION pos = listSymbols.GetHeadPosition();
while (pos != NULL)
{
CResourceSymbol* pNextSymbol = listSymbols.GetNext(pos);
if (pNextSymbol != NULL)
{
if (pNextSymbol != pSymbol)
{
bUnique = FALSE;
break;
}
}
}
}
return bUnique;
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsListView message handlers
int CResOrgSymbolsListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
int nResult = CResOrgSymbolsListView_BASE::OnCreate(lpCreateStruct);
if (-1 != nResult)
{
if (!m_ctrlSymbols.Create( WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS,
CRect(0,0,0,0),
this,
IDC_RESORG_SYMBOLS))
{
TRACE( _T("Failed to create symbols list control.\n"));
return -1;
}
}
return nResult;
}
void CResOrgSymbolsListView::OnSize(UINT nType, int cx, int cy)
{
CResOrgSymbolsListView_BASE::OnSize(nType, cx, cy);
if (m_ctrlSymbols.GetSafeHwnd() != NULL)
{
m_ctrlSymbols.SetWindowPos( NULL,
0,
0,
cx,
cy,
SWP_SHOWWINDOW|SWP_NOZORDER
);
ConfigureScrollbars();
}
}
LRESULT CResOrgSymbolsListView::OnMsgSetScrollInfo(WPARAM wParam, LPARAM lParam)
{
int eBar = (int)wParam;
LPSCROLLINFO pScrollInfo = (LPSCROLLINFO)lParam;
switch (eBar)
{
case SB_VERT:
m_nLastVPos = pScrollInfo->nPos;
SetScrollInfo(eBar, pScrollInfo);
break;
case SB_HORZ:
m_nLastHPos = pScrollInfo->nPos;
SetScrollInfo(eBar, pScrollInfo);
break;
default:
ASSERT(false);
break;
}
return 0L;
}
void CResOrgSymbolsListView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
UNREFERENCED_PARAMETER(nPos);
// Get the minimum, maximum and current scroll-box positions.
SCROLLINFO info;
pScrollBar->GetScrollInfo(&info);
int nNewPosition = m_nLastHPos;
// Act on the scroll bar operation
switch (nSBCode)
{
case SB_TOP: // Scroll to top
nNewPosition = info.nMin;
break;
case SB_PAGEUP: // Scroll one page up.
nNewPosition = m_nLastHPos - info.nPage;
break;
case SB_LINEUP: // Scroll up
nNewPosition = m_nLastHPos - 1;
break;
case SB_BOTTOM: // Scroll to bottom
nNewPosition = info.nMax;
break;
case SB_LINEDOWN: // Scroll down
if (m_nLastHPos + info.nPage <= info.nMax)
{
nNewPosition = m_nLastHPos + 1;
}
break;
case SB_PAGEDOWN: // Scroll one page down.
if (m_nLastHPos + info.nPage <= info.nMax)
{
nNewPosition = m_nLastHPos + info.nPage;
}
break;
case SB_THUMBPOSITION: // Scroll to absolute position. nTrackPos is the position
nNewPosition = info.nTrackPos; // of the scroll box at the end of the drag operation.
break;
case SB_THUMBTRACK: // Drag scroll box to specified position. nTrackPos is the
nNewPosition = info.nTrackPos; // position that the scroll box has been dragged to.
break;
case SB_ENDSCROLL:
nNewPosition = info.nPos;
break;
default:
ASSERT(false);
break;
}
if (nNewPosition < info.nMin)
{
nNewPosition = info.nMin;
}
else if (nNewPosition > info.nMax)
{
nNewPosition = info.nMax;
}
int nScrollBy = nNewPosition - m_nLastHPos;
m_nLastHPos = nNewPosition;
if (0 != nScrollBy)
{
m_ctrlSymbols.Scroll( CSize(nScrollBy, 0 ) );
SetScrollPos(SB_HORZ, nNewPosition, true);
}
}
void CResOrgSymbolsListView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
UNREFERENCED_PARAMETER(nPos);
// Get the minimum, maximum and current scroll-box positions.
SCROLLINFO info;
pScrollBar->GetScrollInfo(&info);
int nNewPosition = m_nLastVPos;
// Act on the scroll bar operation
switch (nSBCode)
{
case SB_TOP: // Scroll to top
nNewPosition = info.nMin;
break;
case SB_PAGEUP: // Scroll one page up.
nNewPosition = m_nLastVPos - info.nPage;
break;
case SB_LINEUP: // Scroll up
nNewPosition = m_nLastVPos - 1;
break;
case SB_BOTTOM: // Scroll to bottom
nNewPosition = info.nMax;
break;
case SB_LINEDOWN: // Scroll down
if (m_nLastVPos + info.nPage <= info.nMax)
{
nNewPosition = m_nLastVPos + 1;
}
break;
case SB_PAGEDOWN: // Scroll one page down.
if (m_nLastVPos + info.nPage <= info.nMax)
{
nNewPosition = m_nLastVPos + info.nPage;
}
break;
case SB_THUMBPOSITION: // Scroll to absolute position. nTrackPos is the position
nNewPosition = info.nTrackPos; // of the scroll box at the end of the drag operation.
break;
case SB_THUMBTRACK: // Drag scroll box to specified position. nTrackPos is the
nNewPosition = info.nTrackPos; // position that the scroll box has been dragged to.
break;
case SB_ENDSCROLL:
nNewPosition = info.nPos;
break;
default:
ASSERT(false);
break;
}
if (nNewPosition < info.nMin)
{
nNewPosition = info.nMin;
}
else if (nNewPosition > info.nMax)
{
nNewPosition = info.nMax;
}
int nScrollBy = nNewPosition - m_nLastVPos;
m_nLastVPos = nNewPosition;
if (0 != nScrollBy)
{
CRect rectItem;
m_ctrlSymbols.GetItemRect(m_ctrlSymbols.GetTopIndex(), rectItem, LVIR_BOUNDS);
m_ctrlSymbols.Scroll( CSize(0, nScrollBy * rectItem.Height() ) );
SetScrollPos(SB_VERT, nNewPosition, true);
}
}
// Context Menu handler
void CResOrgSymbolsListView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
// Make sure window is active
GetParentFrame()->ActivateFrame();
CCJMenu menu;
if (menu.LoadMenu(IDM_SYM_CONTEXT_MENU))
{
menu.LoadToolbar(IDR_MAINFRAME);
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(NULL != pPopup);
pPopup->SetDefaultItem(ID_SYM_PROPERTIES);
pPopup->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN,
point.x,
point.y,
AfxGetMainWnd() ); // Route commands through the main window
return;
}
Default(); // Default message handling if we didn't do anything
}
void CResOrgSymbolsListView::OnItemChangedListCtrl(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
*pResult = 0;
ConfigureScrollbars();
}
/******************************************************************************
* Called when the user double clicks on an item in the list
*
******************************************************************************/
void CResOrgSymbolsListView::OnDblClickListCtrl(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
*pResult = 0;
OnCmdSymbolProperties();
}
void CResOrgSymbolsListView::OnCmdAutosizeColumns(void)
{
m_ctrlSymbols.AutoSizeColumn();
}
/******************************************************************************
* Handlers for Edit|Select All menu command
*
******************************************************************************/
void CResOrgSymbolsListView::OnCmdEditSelectAll(void)
{
#if 0
CMapStringToPtr* pMap = GetDocument()->GetSymbolMap();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -