void CXTPDatePickerItemMonth::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (!m_pControl)
		return;

	BOOL bMultiselect = !!(nFlags & MK_CONTROL) || m_pControl->IsMultiSelectionMode();

	// check left scroll item
	if (m_bShowLeftScroll
		&& !m_rcLeftScroll.IsRectEmpty()
		&& m_rcLeftScroll.PtInRect(point))
	{
		m_pControl->m_mouseMode = CXTPDatePickerControl::mouseScrollingLeft;
		m_pControl->m_nTimerID = (UINT)m_pControl->SetTimer(XTP_DATEPICKER_TIMERID, XTP_DATEPICKER_TIMER_INTERVAL, NULL);
		if (m_pControl->m_bYearsTriangle)
		{
			if (point.x < m_rcLeftScroll.left + 9)
			{
				if (m_dtMonth.GetYear() >= 100 ||
					(m_dtMonth.GetYear() == 100 && m_dtMonth.GetMonth() >= 3))
					m_pControl->ScrollLeft(m_pControl->GetMonthDelta());
			}
			else if (point.x > m_rcLeftScroll.right - 9)
			{
				if (m_dtMonth.GetYear() >= 101 ||
					(m_dtMonth.GetYear() == 101 && m_dtMonth.GetMonth() >= 3))
					m_pControl->ScrollLeft(12 * m_pControl->GetMonthDelta());
			}
		}
		else
		{
			m_pControl->ScrollLeft(m_pControl->GetMonthDelta());
		}
		return;
	}
	// check right scroll item
	if (m_bShowRightScroll
		&& !m_rcRightScroll.IsRectEmpty()
		&& m_rcRightScroll.PtInRect(point))
	{
		m_pControl->m_mouseMode = CXTPDatePickerControl::mouseScrollingRight;
		m_pControl->m_nTimerID = (UINT)m_pControl->SetTimer(XTP_DATEPICKER_TIMERID, XTP_DATEPICKER_TIMER_INTERVAL, NULL);

		if (m_pControl->m_bYearsTriangle)
		{
			if (point.x < m_rcRightScroll.left + 9)
				m_pControl->ScrollRight(12 * m_pControl->GetMonthDelta());
			else if (point.x > m_rcLeftScroll.right - 9)
				m_pControl->ScrollRight(m_pControl->GetMonthDelta());
		}
		else
		{
			m_pControl->ScrollRight(m_pControl->GetMonthDelta());
		}
		return;
	}
	// check header click
	if (!m_rcHeader.IsRectEmpty()
		&& CRect(m_rcHeader.left + 20, m_rcHeader.top, m_rcHeader.right - 20, m_rcHeader.bottom).PtInRect(point))
		//m_rcHeader.PtInRect(point))
	{
		// call month popup list
		m_pControl->ShowListHeader(m_rcHeader, m_dtMonth);
		return;
	}
	// check week numbers click
	m_pControl->m_bSelectWeek = !m_rcWeekNumbers.IsRectEmpty() && m_rcWeekNumbers.PtInRect(point);
	CPoint ptFirstWeekDay(point);
	ptFirstWeekDay.x = m_rcWeekNumbers.right + 3;

	// check day item
	CXTPDatePickerItemDay* pDay = HitTest(m_pControl->m_bSelectWeek ? ptFirstWeekDay : point, FALSE);
	if (pDay)
	{
		m_pControl->ClearFocus();

		BOOL bAllowNoncontinuousSelection = m_pControl->IsAllowNoncontinuousSelection();

		COleDateTime dtDay(pDay->GetDate());
		BOOL bSelected = m_pControl->IsSelected(dtDay);
		if (m_pControl->m_bSelectWeek)
		{
//week is selected only when all week days are selected
			for (int i = 0; i < 7; i++)
			{
				COleDateTime dtDay_i = dtDay + COleDateTimeSpan(i, 0, 0, 0);
				bSelected &= m_pControl->IsSelected(dtDay_i);
			}
		}
		if (bSelected && bMultiselect && bAllowNoncontinuousSelection)
			m_pControl->m_mouseMode = CXTPDatePickerControl::mouseDeselecting;
		else
			m_pControl->m_mouseMode = CXTPDatePickerControl::mouseSelecting;

		if (!bMultiselect || !bAllowNoncontinuousSelection)
			m_pControl->m_pSelectedDays->Clear();

		if (nFlags & MK_SHIFT)
		{
			if (m_pControl->m_dtFirstClicked.GetStatus() == COleDateTime::valid)
			{
				m_pControl->m_dtLastClicked = dtDay;
			}
			else if (m_pControl->m_dtLastClicked.GetStatus() == COleDateTime::valid)
			{
				m_pControl->m_dtFirstClicked = m_pControl->m_dtLastClicked;
				m_pControl->m_dtLastClicked = dtDay;
			}
			else if (m_pControl->GetSelRange(m_pControl->m_dtFirstClicked, m_pControl->m_dtLastClicked))
			{
				if (m_pControl->m_dtFirstClicked < dtDay)
					m_pControl->m_dtLastClicked = dtDay;
				else
					m_pControl->m_dtFirstClicked = dtDay;
			}
			else
			{
				m_pControl->m_dtFirstClicked = dtDay;
				m_pControl->m_dtLastClicked = dtDay;
			}
		}
		else
		{
			m_pControl->m_dtFirstClicked = dtDay;
			m_pControl->m_dtLastClicked = m_pControl->m_bSelectWeek ?
				dtDay + COleDateTimeSpan(6, 0, 0, 0) : dtDay;
		}

		m_pControl->_RedrawControl(FALSE);
	}
}
Exemplo n.º 2
0
void CDxDatePickerMonth::OnLButtonDown(UINT nFlags, CPoint point)
{
    if (!m_pControl)
        return;

    // check left scroll item
    if (m_bShowLeftScroll && !m_rcLeftScroll.IsRectEmpty() && m_rcLeftScroll.PtInRect(point))
    {
        m_pControl->m_mouseMode = CDxMonthPicker::mouseScrollingLeft;
        if (m_pControl->m_bYearsTriangle)
        {
            if (point.x < m_rcLeftScroll.left + 9)
            {
                if (m_dtMonth.GetYear() >= 100 || (m_dtMonth.GetYear() == 100 && m_dtMonth.GetMonth() >= 3))
                    m_pControl->ScrollLeft(m_pControl->GetMonthDelta());
            }
            else if (point.x > m_rcLeftScroll.right - 9)
            {
                if (m_dtMonth.GetYear() >= 101 || (m_dtMonth.GetYear() == 101 && m_dtMonth.GetMonth() >= 3))
                    m_pControl->ScrollLeft(12 * m_pControl->GetMonthDelta());
            }
        }
        else
        {
            m_pControl->ScrollLeft(m_pControl->GetMonthDelta());
        }
        return;
    }

    // check right scroll item
    if (m_bShowRightScroll && !m_rcRightScroll.IsRectEmpty() && m_rcRightScroll.PtInRect(point))
    {
        m_pControl->m_mouseMode = CDxMonthPicker::mouseScrollingRight;

        if (m_pControl->m_bYearsTriangle)
        {
            if (point.x < m_rcRightScroll.left + 9)
                m_pControl->ScrollRight(12 * m_pControl->GetMonthDelta());
            else if (point.x > m_rcLeftScroll.right - 9)
                m_pControl->ScrollRight(m_pControl->GetMonthDelta());
        }
        else
        {
            m_pControl->ScrollRight(m_pControl->GetMonthDelta());
        }
        return;
    }

    //  check header click
    if (!m_rcHeader.IsRectEmpty() && CRect(m_rcHeader.left + 20, m_rcHeader.top, m_rcHeader.right - 20, m_rcHeader.bottom).PtInRect(point))
    {
        // call month popup list
        //m_pControl->ShowListHeader(m_rcHeader, m_dtMonth);
        return;
    }

    // check week numbers click
    m_pControl->m_bSelectWeek = !m_rcWeekNumbers.IsRectEmpty() && m_rcWeekNumbers.PtInRect(point);

    CPoint ptFirstWeekDay(point);
    ptFirstWeekDay.x = m_rcWeekNumbers.right + 3;

    //  check day item
    CDxDatePickerDay* pDay = HitTest(m_pControl->m_bSelectWeek ? ptFirstWeekDay : point, FALSE);
    if (pDay)
    {
        COleDateTime dtDay(pDay->GetDate());
        BOOL bSelected = m_pControl->IsSelected(dtDay);
        if (m_pControl->m_bSelectWeek)
        {
            //  week is selected only when all week days are selected
            for (int i = 0; i < 7; i++)
            {
                COleDateTime dtDay_i = dtDay + COleDateTimeSpan(i, 0, 0, 0);
                bSelected &= m_pControl->IsSelected(dtDay_i);
            }
        }

        m_pControl->m_mouseMode = CDxMonthPicker::mouseSelecting;

        m_pControl->m_dtFSelBase = dtDay;

        m_pControl->NotifyInvalidate();
    }
}