findtaskdlg.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 1,310 行 · 第 1/3 页

CPP
1,310
字号
	return m_bAllTasklists;
}

BOOL CFindTaskDlg::GetAutoSelectSingles()
{
	if (GetSafeHwnd())
		UpdateData();
	
	return m_bAutoSelectSingles;
}

POSITION CFindTaskDlg::GetFirstResultPos() const
{
	return m_mapResults.GetStartPosition();
}

BOOL CFindTaskDlg::GetNextResult(POSITION& pos, FTDRESULT& res) const
{
	if (!pos)
		return FALSE;
	
	DWORD dwKey = 0;
	m_mapResults.GetNextAssoc(pos, dwKey, res);
	
	return TRUE;
}

int CFindTaskDlg::GetResultCount() const
{
	return m_mapResults.GetCount();
}

int CFindTaskDlg::GetResultCount(int nTaskList) const
{
	int nCount = 0;
	
	POSITION pos = GetFirstResultPos();
	
	while (pos)
	{
		FTDRESULT res;
		GetNextResult(pos, res);
		
		if (res.nTaskList == nTaskList)
			nCount++;
	}
	
	return nCount;
}

int CFindTaskDlg::GetAllResults(CFTDResultsArray& results) const
{
	int nRes = GetResultCount();
	results.RemoveAll();
	results.SetSize(nRes);

	while (nRes--)
		m_mapResults.Lookup((DWORD)(nRes + 1), results[nRes]);

	return results.GetSize();
}

BOOL CFindTaskDlg::GetIncludeDone()
{
	if (GetSafeHwnd())
		UpdateData();
	
	return m_bIncludeDone;
}

BOOL CFindTaskDlg::GetSearchResults()
{
	if (GetSafeHwnd())
		UpdateData();
	
	return m_bSearchResults;
}

CString CFindTaskDlg::GetText()
{
	switch (m_nFindOption)
	{
	case FW_TITLECOMMENTS:
		return m_pageTitleComments.GetText();
		
	case FW_ALLOCBY:
		return m_pageAllocBy.GetText();
		
	case FW_STATUS:
		return m_pageStatus.GetText();
		
	case FW_CREATEDBY:
		return m_pageCreatedBy.GetText();
		
	case FW_EXTERNALID:
		return m_pageExtID.GetText();
		
	case FW_VERSION:
		return m_pageVersion.GetText();
	}
	
	// all else
	ASSERT(0);
	return "";
}

int CFindTaskDlg::GetItems(CStringArray& aItems)
{
	switch (m_nFindOption)
	{
	case FW_CATEGORY:
		return m_pageCategory.GetItems(aItems);
		
	case FW_ALLOCTO:
		return m_pageAllocTo.GetItems(aItems);
	}
	
	// all else
	ASSERT(0);
	return 0;
}

BOOL CFindTaskDlg::GetMatchAllItems()
{
	switch (m_nFindOption)
	{
	case FW_TITLECOMMENTS:
		return m_pageTitleComments.GetMatchAllItems();
		
	case FW_CATEGORY:
		return m_pageCategory.GetMatchAllItems();
		
	case FW_ALLOCTO:
		return m_pageAllocTo.GetMatchAllItems();
	}
	
	// all else
	ASSERT(0);
	return 0;
}

BOOL CFindTaskDlg::GetMatchCase()
{
	switch (m_nFindOption)
	{
	case FW_TITLECOMMENTS:
		return m_pageTitleComments.GetMatchCase();
		
	case FW_ALLOCBY:
		return m_pageAllocBy.GetMatchCase();
		
	case FW_STATUS:
		return m_pageStatus.GetMatchCase();
		
	case FW_CREATEDBY:
		return m_pageCreatedBy.GetMatchCase();
		
	case FW_EXTERNALID:
		return m_pageExtID.GetMatchCase();
		
	case FW_VERSION:
		return FALSE;
	}
	
	// all else
	ASSERT(0);
	return FALSE;
}

BOOL CFindTaskDlg::GetMatchWholeWord()
{
	switch (m_nFindOption)
	{
	case FW_TITLECOMMENTS:
		return m_pageTitleComments.GetMatchWholeWord();
		
	case FW_ALLOCBY:
		return m_pageAllocBy.GetMatchWholeWord();
		
	case FW_STATUS:
		return m_pageStatus.GetMatchWholeWord();
		
	case FW_CREATEDBY:
		return m_pageCreatedBy.GetMatchWholeWord();
		
	case FW_EXTERNALID:
		return m_pageExtID.GetMatchWholeWord();
		
	case FW_VERSION:
		return m_pageVersion.GetMatchWholeWord();
	}
	
	// all else
	ASSERT(0);
	return FALSE;
}

FIND_WHAT CFindTaskDlg::GetFindWhat()
{
	if (GetSafeHwnd())
		UpdateData();
	
	return m_nFindOption;
}

BOOL CFindTaskDlg::GetRange(COleDateTime& dateFrom, COleDateTime& dateTo)
{
	switch (m_nFindOption)
	{
	case FW_CREATIONDATE:
		m_pageCreationDate.GetDateRange(dateFrom, dateTo);
		return TRUE;
		
	case FW_STARTDATE:
		m_pageStartDate.GetDateRange(dateFrom, dateTo);
		return TRUE;
		
	case FW_DUEDATE:
		m_pageDueDate.GetDateRange(dateFrom, dateTo);
		return TRUE;
		
	case FW_DONEDATE:
		m_pageDoneDate.GetDateRange(dateFrom, dateTo);
		return TRUE;
		
	case FW_LASTMOD:
		m_pageLastMod.GetDateRange(dateFrom, dateTo);
		return TRUE;
	}
	
	// all else
	ASSERT(0);
	return FALSE;
}

BOOL CFindTaskDlg::GetRange(int& nFrom, int& nTo)
{
	switch (m_nFindOption)
	{
	case FW_PRIORITY:
		m_pagePriority.GetRange(nFrom, nTo);
		return TRUE;
		
	case FW_PERCENTDONE:
		m_pagePercent.GetNumberRange(nFrom, nTo);
		return TRUE;
		
	case FW_TASKID:
		m_pageTaskID.GetNumberRange(nFrom, nTo);
		return TRUE;
		
	case FW_RISK:
		m_pageRisk.GetRange(nFrom, nTo);
		return TRUE;
	}
	
	// all else
	ASSERT(0);
	return FALSE;
}

BOOL CFindTaskDlg::GetRange(double& dFrom, double& dTo)
{	
	switch (m_nFindOption)
	{
	case FW_TIMEEST:
		m_pageTimeEst.GetNumberRange(dFrom, dTo);
		return TRUE;
		
	case FW_TIMESPENT:
		m_pageTimeSpent.GetNumberRange(dFrom, dTo);
		return TRUE;
		
	case FW_COST:
		m_pageCost.GetNumberRange(dFrom, dTo);
		return TRUE;
	}
	
	// all else
	ASSERT(0);
	return FALSE;
}

void CFindTaskDlg::RefreshSearch()
{
	ASSERT (GetSafeHwnd());
	
	OnFind();
}

void CFindTaskDlg::OnFind() 
{
	// add typed text to combobox
	UpdateData();
	
	// notify parent
	GetParent()->PostMessage(WM_FTD_FIND);
	
	// clear results
	m_mapResults.RemoveAll();
	m_lcResults.DeleteAllItems();
	m_lcResults.SetFocus();
	m_sResultsLabel.Format(IDS_FTD_SOMERESULTS, 0);
	UpdateData(FALSE);
	
	// update field column
	InitFieldColumn();
	
	// update 'search results' button' state
	m_toolbar.RefreshButtonStates();
			
	// disable 'select all' button
	GetDlgItem(IDC_SELECTALL)->EnableWindow(FALSE);
}

void CFindTaskDlg::OnClose() 
{
	CDialog::OnClose();
	
	// hide
	ShowWindow(SW_HIDE);
	
	// notify parent
	GetParent()->SendMessage(WM_FTD_CLOSE);
}

void CFindTaskDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	ResizeDlg(cx, cy);

	if (m_toolbar.GetSafeHwnd())
		m_toolbar.RefreshButtonStates();
}

void CFindTaskDlg::ResizeDlg(int cx, int cy)
{
	if (m_lcResults.GetSafeHwnd())
	{
		if (!cx && !cy)
		{
			CRect rClient;
			GetClientRect(rClient);
			
			cx = rClient.right;
			cy = rClient.bottom;
			
			// check again 
			if (!cx && !cy)
				return;
		}
		
		// we compare the new size with the lower right hand corner
		// of the gripper list
		CRect rect;
		GetDlgItem(IDC_GRIPPER)->GetWindowRect(rect);
		ScreenToClient(rect);
		
		int nXOffset = cx - rect.right;
		int nYOffset = cy - rect.bottom;
		
		BOOL bDockedBelow = (m_dockMgr.GetDockPos() == DMP_BELOW);
		
		{
			CDeferWndMove dwm(10);
			
			CRect rHDiv = dwm.ResizeCtrl(this, IDC_HDIVIDER, nXOffset);
			CRect rVDiv = dwm.ResizeCtrl(this, IDC_VDIVIDER);
			rVDiv = dwm.ResizeCtrl(this, IDC_VDIVIDER, 0, cy - rVDiv.bottom - 10);
			
			dwm.OffsetCtrl(this, IDC_GRIPPER, nXOffset, nYOffset);
			
			// move 'select all', results and other assorted items
			// depending on where we are docked
			CRect rSelAll = dwm.ResizeCtrl(this, IDC_SELECTALL);
			
			if (bDockedBelow)
			{
				nXOffset = rVDiv.right - rSelAll.left + 10;
				nYOffset = rVDiv.top - rSelAll.top;
			}
			else
			{
				nXOffset = rHDiv.left - rSelAll.left;
				nYOffset = rHDiv.top - rSelAll.top + 10;
			}
			
			dwm.OffsetCtrl(this, IDC_SELECTALL, nXOffset, nYOffset);
			dwm.OffsetCtrl(this, IDC_RESULTSLABEL, nXOffset, nYOffset);
			
			CRect rAuto = dwm.OffsetCtrl(this, IDC_AUTOSELECTSINGLES);
			rAuto = dwm.OffsetCtrl(this, IDC_AUTOSELECTSINGLES, nXOffset, cy - rAuto.bottom - 10);
			
			CRect rResults = dwm.OffsetCtrl(this, IDC_RESULTS, nXOffset, nYOffset);
			
			rResults.right = cx - 10;
			rResults.bottom = rAuto.top - 10;
			
			dwm.MoveWindow(&m_lcResults, rResults);
		}
		
		// hide the gripper if we are maximized
		GetDlgItem(IDC_GRIPPER)->ShowWindow(m_dockMgr.Maximized() ? SW_HIDE : SW_SHOW);
		
		// hide appropriate divider
		GetDlgItem(IDC_HDIVIDER)->ShowWindow(bDockedBelow ? SW_HIDE : SW_SHOW);
		GetDlgItem(IDC_VDIVIDER)->ShowWindow(bDockedBelow ? SW_SHOW : SW_HIDE);
		
		// resize the column headers to fit the available space
		// provided it does not get less than 100
		int nFixed = m_lcResults.GetColumnWidth(COL_PATH) + m_lcResults.GetColumnWidth(COL_MATCH);
		
		if (!(m_lcResults.GetStyle() & WS_VSCROLL))
			nFixed += GetSystemMetrics(SM_CXVSCROLL);
		
		m_lcResults.GetClientRect(rect);
		m_lcResults.SetColumnWidth(COL_TASK, max(100, rect.Width() - nFixed));
	}	
}

void CFindTaskDlg::OnItemActivated(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	ASSERT (pNMListView->iItem >= 0);
	
	FTDRESULT res;
	DWORD dwKey = m_lcResults.GetItemData(pNMListView->iItem);
	
	if (dwKey != HEADERROW && m_mapResults.Lookup(dwKey, res))
		GetParent()->SendMessage(WM_FTD_SELECTRESULT, dwKey, (LPARAM)&res);
	
	*pResult = 0;
}

void CFindTaskDlg::OnDestroy() 
{

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?