📄 resorgprojectsview.cpp
字号:
{
CResOrgProjectsView_BASE::AssertValid();
}
void CResOrgProjectsView::Dump(CDumpContext& dc) const
{
CResOrgProjectsView_BASE::Dump(dc);
}
CResOrgProjectsDoc* CResOrgProjectsView::GetDocument(void) // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CResOrgProjectsDoc)));
return (CResOrgProjectsDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CResOrgProjectsView implementation
void CResOrgProjectsView::FillListCtrl(void)
{
GetListCtrl().SetRedraw(FALSE);
GetListCtrl().DeleteAllItems();
CResOrgProjectsDoc* pDoc = GetDocument();
if (NULL != pDoc)
{
int nItem = -1;
for (int n = 0; n < m_arrayProjects.GetSize(); n++)
{
IGenericProject* pProject = m_arrayProjects[n];
if (NULL != pProject)
{
CString sProject = Workspace.GetName(pProject);
VERIFY(-1 != GetListCtrl().InsertItem(++nItem, sProject) );
GetListCtrl().SetItemData(nItem, (DWORD)pProject);
}
}
}
SortList(m_nSortColumn, m_bSortAscending);
GetListCtrl().SetRedraw(TRUE);
}
void CResOrgProjectsView::Clear(void)
{
for (int n = 0; n < m_arrayProjects.GetSize(); n++)
{
IGenericProject* pProject = m_arrayProjects[n];
if (NULL != pProject)
{
pProject->Release();
}
}
m_arrayProjects.RemoveAll();
}
/******************************************************************************
* Static callback function for List Control sorting
*
* The list control will then repeatedly call this to determine how to sort
* its data
*
******************************************************************************/
int CALLBACK CResOrgProjectsView::ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
IGenericProject* pItem1 = (IGenericProject*)lParam1;
IGenericProject* pItem2 = (IGenericProject*)lParam2;
int nResult = 0; // Default => Equal
if ( (NULL != pItem1) && (NULL != pItem2) )
{
int nColumn = LOWORD(lParamSort);
BOOL bSortAscending = HIWORD(lParamSort);
switch (nColumn)
{
case 0:
{
CString sItem1 = Workspace.GetName(pItem1);
CString sItem2 = Workspace.GetName(pItem2);
nResult = lstrcmpi(sItem1, sItem2);
if ( (sItem1.IsEmpty()) || (sItem2.IsEmpty()) )
{
nResult = -nResult; // Modify sort so a blank entry is HIGHER than one with something in it
}
}
break;
default:
return 0;
}
if (!bSortAscending)
{
nResult = -nResult; // Sneaky way to reverse sort order...
}
}
return nResult;
}
CDocument* CResOrgProjectsView::OpenProject(const CString& sProject)
{
CDocument* pDoc = NULL;
// TO DO: Extract rc file name, then symbol file name
// Open symbols file
CString sResourceFile = Workspace.GetResourceFileName(sProject);
if (!sResourceFile.IsEmpty())
{
CString sSymbolFile = ::GetSymbolFileName(sResourceFile);
if (!sSymbolFile.IsEmpty())
{
pDoc = GetDocument()->GetOpenDocument(sSymbolFile);
if (NULL != pDoc)
{
// If the file is already open, just activate it
GetDocument()->SetActiveDocument(pDoc);
}
else
{
// ...otherwise, we have to open it...
// To Do: convert to flash box
//AfxMessageBox( "Displaying symbols for: " + sSymbolFile);
Workspace.CloseResourceFile(sResourceFile);
pDoc = AfxGetApp()->OpenDocumentFile(sSymbolFile);
}
}
else
{
ASSERT(FALSE); // Unable to identify symbol file
}
}
else
{
ASSERT(FALSE); // Unable to identify RC file
}
return pDoc;
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgProjectsView message handlers
void CResOrgProjectsView::OnSize(UINT nType, int cx, int cy)
{
CResOrgProjectsView_BASE::OnSize(nType, cx, cy);
if (m_bInitialised)
{
AutoSizeColumn();
}
}
// Context Menu handler
void CResOrgProjectsView::OnContextMenu(CWnd* pWnd, CPoint point)
{
UNREFERENCED_PARAMETER(pWnd);
// Make sure window is active
GetParentFrame()->ActivateFrame();
// Convert to client coordinates for hit testing
// Note that TrackPopupMenu() expects its coordinates to be screen, not client!
CPoint ptClient = point;
ScreenToClient(&ptClient);
UINT nFlags = 0;
int nIndex = GetListCtrl().HitTest(ptClient, &nFlags);
if (nIndex >= 0)
{
CCJMenu menu;
if (menu.LoadMenu(IDM_PRJ_CONTEXT_MENU))
{
menu.LoadToolbar(IDM_PRJ_CONTEXT_MENU);
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(NULL != pPopup);
pPopup->SetDefaultItem(ID_PROJ_OPEN);
pPopup->TrackPopupMenu(TPM_RIGHTBUTTON | TPM_LEFTALIGN,
point.x,
point.y,
AfxGetMainWnd()); // route commands through main window
return;
}
}
Default(); // Default message handling if we didn't do anything
}
void CResOrgProjectsView::OnDblClick(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
*pResult = 0;
OnCmdOpenProject();
}
void CResOrgProjectsView::OnCmdOpenProject(void)
{
if (GetListCtrl().GetSelectedCount() > 0)
{
CResOrgProjectsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (NULL != pDoc)
{
POSITION pos = GetListCtrl().GetFirstSelectedItemPosition();
while (pos != NULL)
{
int nItem = GetListCtrl().GetNextSelectedItem(pos);
if (nItem >= 0)
{
CString sProject = GetListCtrl().GetItemText(nItem, 0);
if (NULL == OpenProject(sProject) )
{
CString sMsg;
sMsg.Format(IDP_PRJ_NO_SYM_FILE, sProject);
AfxMessageBox( sMsg,
MB_OK | MB_ICONEXCLAMATION);
}
}
}
}
}
}
void CResOrgProjectsView::OnCmdRenumberProject(void)
{
if (GetListCtrl().GetSelectedCount() > 0)
{
CResOrgProjectsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (NULL != pDoc)
{
POSITION pos = GetListCtrl().GetFirstSelectedItemPosition();
while (pos != NULL)
{
int nItem = GetListCtrl().GetNextSelectedItem(pos);
if (nItem >= 0)
{
CString sProject = GetListCtrl().GetItemText(nItem, 0);
CResOrgSymbolsDoc* pDoc = dynamic_cast<CResOrgSymbolsDoc*>( OpenProject(sProject) );
if (NULL != pDoc)
{
if (pDoc->GetSymbolBuffer()->GetSymbolCount() > 0)
{
AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_TOOLS_RENUMBER);
}
else
{
AfxMessageBox( _T("This file contains no symbols"),
MB_OK | MB_ICONSTOP);
}
}
}
}
}
}
}
void CResOrgProjectsView::OnUpdateRenumberProject(CCmdUI* pCmdUI)
{
pCmdUI->Enable( GetListCtrl().GetSelectedCount() == 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -