void CTDLFindTaskExpressionListCtrl::UpdateValueColumnText(int nRow)
{
	ASSERT(nRow >= 0 && nRow < m_aSearchParams.GetSize());
	ASSERT(m_aSearchParams.GetSize() >= GetItemCount() - 1);

	if (nRow < 0 || nRow >= m_aSearchParams.GetSize())
		return;
	
	if (m_aSearchParams.GetSize() < GetItemCount() - 1)
		return;

	const SEARCHPARAM& sp = m_aSearchParams[nRow];
	CString sValue;
		
	// value (but not boolean)
	if (sp.GetOperator() != FOP_SET && sp.GetOperator() != FOP_NOT_SET)
	{
		try
		{
			switch (sp.GetAttribType())
			{
			case FT_STRING:
			case FT_DATE_REL:
			case FT_INTEGER:
			case FT_DOUBLE:
				sValue = sp.ValueAsString();
				break;
				
			case FT_DATE:
				sValue = sp.ValueAsDate().Format(VAR_DATEVALUEONLY);
				break;
				
			case FT_TIME:
				sValue = CTimeHelper().FormatTime(sp.ValueAsDouble(), sp.GetFlags(), 2);
				break;
				
			case FT_BOOL:
				// handled by operator
				break;
			}
		}
		catch (...)
		{
			// bad value but we continue
			sValue.Empty();
		}
	}
			
	SetItemText(nRow, VALUE, sValue);
}
double CTDLAddLoggedTimeDlg::GetLoggedTime() const // in hours
{ 
	return CTimeHelper().GetTime(m_dLoggedTime, m_nUnits, THU_HOURS);
}