You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
9.1 KiB
C++
352 lines
9.1 KiB
C++
// XTPReportIconNavigator.cpp : implementation of the CXTPReportIconNavigator class.
|
|
//
|
|
// This file is a part of the XTREME REPORTCONTROL MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "Common/XTPDrawHelpers.h"
|
|
#include "Common/XTPSystemHelpers.h"
|
|
#include "Common/XTPImageManager.h"
|
|
#include "Common/XTPPropExchange.h"
|
|
#include "Common/XTPToolTipContext.h"
|
|
#include "Common/XTPResourceManager.h"
|
|
#include "Common/XTPMarkupRender.h"
|
|
#include "Common/XTPCustomHeap.h"
|
|
#include "Common/XTPSmartPtrInternalT.h"
|
|
#include "Common/XTPColorManager.h"
|
|
|
|
#include "XTPReportDefines.h"
|
|
#include "XTPReportNavigator.h"
|
|
#include "XTPReportControl.h"
|
|
#include "XTPReportRow.h"
|
|
#include "XTPReportRows.h"
|
|
#include "XTPReportSection.h"
|
|
#include "XTPReportRecord.h"
|
|
#include "XTPReportRecordItem.h"
|
|
#include "XTPReportColumn.h"
|
|
#include "XTPReportColumns.h"
|
|
#include "XTPReportInplaceControls.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPReportIconNavigator
|
|
|
|
CXTPReportIconNavigator::CXTPReportIconNavigator(CXTPReportControl *pReportControl)
|
|
: CXTPReportNavigator(pReportControl)
|
|
{
|
|
}
|
|
|
|
CXTPReportIconNavigator::~CXTPReportIconNavigator()
|
|
{
|
|
}
|
|
|
|
void CXTPReportIconNavigator::MoveDown(BOOL bShiftKey, BOOL bControlKey)
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
if (m_pReportControl->IsMultiSelectionMode())
|
|
bControlKey = TRUE;
|
|
|
|
CXTPReportRow* pNextRow = NULL;
|
|
CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
|
|
if (!pFocusedRow)
|
|
return;
|
|
|
|
int iPrevRowIndex = -1;
|
|
int iFocusRow = pFocusedRow->GetIndex();
|
|
int nRpL = m_pReportControl->GetRowsPerLine();
|
|
int iRowOffset = iFocusRow % nRpL;
|
|
// body rows
|
|
pNextRow = m_pReportControl->GetRows()->GetNext(pFocusedRow, m_pReportControl->IsSkipGroupsFocusEnabled());
|
|
|
|
if (pNextRow)
|
|
{
|
|
while(
|
|
pNextRow
|
|
&& pNextRow->GetIndex() != iPrevRowIndex
|
|
&& iRowOffset != pNextRow->GetIndex() % nRpL)
|
|
{
|
|
iPrevRowIndex = pNextRow->GetIndex();
|
|
pNextRow = m_pReportControl->GetRows()->GetNext(pNextRow, m_pReportControl->IsSkipGroupsFocusEnabled());
|
|
}
|
|
|
|
if (pNextRow && pNextRow->GetIndex() != iPrevRowIndex)
|
|
{
|
|
// from the last body row jump to the first header row
|
|
if (iFocusRow >= pNextRow->GetIndex())
|
|
{
|
|
if (m_pReportControl->IsFooterRowsVisible() && m_pReportControl->IsFooterRowsAllowAccess())
|
|
MoveFirstVisibleRow(xtpRowTypeFooter);
|
|
}
|
|
else
|
|
{
|
|
m_pReportControl->SetFocusedRow(pNextRow, bShiftKey, bControlKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPReportIconNavigator::MoveUp(BOOL bShiftKey, BOOL bControlKey)
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
if (m_pReportControl->IsMultiSelectionMode())
|
|
bControlKey = TRUE;
|
|
|
|
CXTPReportRow* pPrevRow = NULL;
|
|
CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
|
|
if (!pFocusedRow)
|
|
return;
|
|
|
|
int iPrevRowIndex = -1;
|
|
int iFocusRow = pFocusedRow->GetIndex();
|
|
int nRpL = m_pReportControl->GetRowsPerLine();
|
|
int iRowOffset = iFocusRow % nRpL;
|
|
// body rows
|
|
pPrevRow = m_pReportControl->GetRows()->GetPrev(pFocusedRow, m_pReportControl->IsSkipGroupsFocusEnabled());
|
|
if (pPrevRow)
|
|
{
|
|
while(
|
|
pPrevRow
|
|
&& pPrevRow->GetIndex() != iPrevRowIndex
|
|
&& iRowOffset != pPrevRow->GetIndex() % nRpL)
|
|
{
|
|
iPrevRowIndex = pPrevRow->GetIndex();
|
|
pPrevRow = m_pReportControl->GetRows()->GetPrev(pPrevRow, m_pReportControl->IsSkipGroupsFocusEnabled());
|
|
}
|
|
if (pPrevRow && pPrevRow->GetIndex() != iPrevRowIndex)
|
|
{
|
|
// from the first body row jump to the last header row
|
|
if (iFocusRow <= pPrevRow->GetIndex())
|
|
{
|
|
if (m_pReportControl->IsHeaderRowsVisible() && m_pReportControl->IsHeaderRowsAllowAccess())
|
|
MoveLastVisibleRow(xtpRowTypeHeader);
|
|
}
|
|
else
|
|
{
|
|
m_pReportControl->SetFocusedRow(pPrevRow, bShiftKey, bControlKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPReportIconNavigator::MoveDownStep(BOOL bShiftKey, BOOL bControlKey)
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
if (m_pReportControl->IsMultiSelectionMode())
|
|
bControlKey = TRUE;
|
|
|
|
CXTPReportRow* pNextRow = NULL;
|
|
CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
|
|
if (!pFocusedRow)
|
|
return;
|
|
|
|
if (m_pReportControl->IsIconView())
|
|
{
|
|
int iPrevRowIndex = -1;
|
|
int iFocusRow = pFocusedRow->GetIndex();
|
|
// body rows
|
|
pNextRow = m_pReportControl->GetRows()->GetNext(pFocusedRow, m_pReportControl->IsSkipGroupsFocusEnabled());
|
|
if (pNextRow)
|
|
{
|
|
if (pNextRow && pNextRow->GetIndex() != iPrevRowIndex)
|
|
{
|
|
// from the last body row jump to the first header row
|
|
if (iFocusRow >= pNextRow->GetIndex())
|
|
{
|
|
if (m_pReportControl->IsFooterRowsVisible() && m_pReportControl->IsFooterRowsAllowAccess())
|
|
MoveFirstVisibleRow(xtpRowTypeFooter);
|
|
}
|
|
else
|
|
{
|
|
m_pReportControl->SetFocusedRow(pNextRow, bShiftKey, bControlKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CXTPReportIconNavigator::MoveUpStep(BOOL bShiftKey, BOOL bControlKey)
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
if (m_pReportControl->IsMultiSelectionMode())
|
|
bControlKey = TRUE;
|
|
|
|
CXTPReportRow* pPrevRow = NULL;
|
|
CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
|
|
if (!pFocusedRow)
|
|
return;
|
|
|
|
if (m_pReportControl->IsIconView())
|
|
{
|
|
int iPrevRowIndex = -1;
|
|
int iFocusRow = pFocusedRow->GetIndex();
|
|
// body rows
|
|
pPrevRow = m_pReportControl->GetRows()->GetPrev(pFocusedRow, m_pReportControl->IsSkipGroupsFocusEnabled());
|
|
if (pPrevRow)
|
|
{
|
|
if (pPrevRow && pPrevRow->GetIndex() != iPrevRowIndex)
|
|
{
|
|
// from the first body row jump to the last header row
|
|
if (iFocusRow <= pPrevRow->GetIndex())
|
|
{
|
|
if (m_pReportControl->IsHeaderRowsVisible() && m_pReportControl->IsHeaderRowsAllowAccess())
|
|
MoveLastVisibleRow(xtpRowTypeHeader);
|
|
}
|
|
else
|
|
{
|
|
m_pReportControl->SetFocusedRow(pPrevRow, bShiftKey, bControlKey);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void CXTPReportIconNavigator::MovePageDown(BOOL bShiftKey, BOOL bControlKey)
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
if (m_pReportControl->IsMultiSelectionMode())
|
|
bControlKey = TRUE;
|
|
|
|
int nCurrentRowIndex = m_pReportControl->GetFocusedRow() ?
|
|
m_pReportControl->GetFocusedRow()->GetIndex() : 0;
|
|
int iNextRowIndex = nCurrentRowIndex;
|
|
while(iNextRowIndex % m_pReportControl->GetRowsPerLine())
|
|
{
|
|
iNextRowIndex--;
|
|
}
|
|
iNextRowIndex = min(
|
|
m_pReportControl->GetRows()->GetCount() - 1,
|
|
nCurrentRowIndex + m_pReportControl->GetReportAreaRows(iNextRowIndex, TRUE));
|
|
|
|
int nRpL = m_pReportControl->GetRowsPerLine();
|
|
// Now go backwards until we get the same equivalency class.
|
|
while(
|
|
nCurrentRowIndex < iNextRowIndex
|
|
&& (nCurrentRowIndex % nRpL) !=
|
|
(iNextRowIndex % nRpL))
|
|
{
|
|
iNextRowIndex--;
|
|
}
|
|
if (nCurrentRowIndex == iNextRowIndex)
|
|
{
|
|
MoveLastRow(bShiftKey, bControlKey);
|
|
}
|
|
else
|
|
{
|
|
m_pReportControl->SetFocusedRow(
|
|
m_pReportControl->GetRows()->GetAt(iNextRowIndex),
|
|
bShiftKey,
|
|
bControlKey);
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPReportIconNavigator::MovePageUp(BOOL bShiftKey, BOOL bControlKey)
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
if (m_pReportControl->IsMultiSelectionMode())
|
|
bControlKey = TRUE;
|
|
|
|
int nCurrentRowIndex = m_pReportControl->GetFocusedRow() ?
|
|
m_pReportControl->GetFocusedRow()->GetIndex() : 0;
|
|
int iNextRowIndex = nCurrentRowIndex;
|
|
while(iNextRowIndex % m_pReportControl->GetRowsPerLine())
|
|
{
|
|
iNextRowIndex--;
|
|
}
|
|
iNextRowIndex = max(0, nCurrentRowIndex - m_pReportControl->GetReportAreaRows(iNextRowIndex, FALSE));
|
|
|
|
int nRpL = m_pReportControl->GetRowsPerLine();
|
|
// Now go forward until we get the same equivalency class.
|
|
while(
|
|
nCurrentRowIndex > iNextRowIndex
|
|
&& (nCurrentRowIndex % nRpL) != (iNextRowIndex % nRpL))
|
|
{
|
|
iNextRowIndex++;
|
|
}
|
|
|
|
if (nCurrentRowIndex == iNextRowIndex)
|
|
{
|
|
MoveFirstRow(bShiftKey, bControlKey);
|
|
}
|
|
else
|
|
{
|
|
m_pReportControl->SetFocusedRow(
|
|
m_pReportControl->GetRows()->GetAt(iNextRowIndex),
|
|
bShiftKey,
|
|
bControlKey);
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPReportIconNavigator::BeginEdit()
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
CXTPReportRow* pFocusedRow = m_pReportControl->GetFocusedRow();
|
|
if (!pFocusedRow)
|
|
return;
|
|
|
|
CXTPReportColumn* pIconColumn = m_pReportControl->GetColumns()->Find(m_pReportControl->m_iIconViewColumn);
|
|
|
|
if (pIconColumn &&
|
|
pFocusedRow && pFocusedRow->GetRecord())
|
|
{
|
|
XTP_REPORTRECORDITEM_ARGS itemArgs(m_pReportControl, pFocusedRow, pIconColumn);
|
|
|
|
if (itemArgs.pItem && itemArgs.pItem->IsAllowEdit(&itemArgs))
|
|
m_pReportControl->EditItem(&itemArgs);
|
|
}
|
|
}
|
|
|
|
|
|
void CXTPReportIconNavigator::MoveLeftRight(BOOL bBack, BOOL bShiftKey, BOOL bControlKey)
|
|
{
|
|
if (!m_pReportControl)
|
|
return;
|
|
|
|
if (m_pReportControl->IsMultiSelectionMode())
|
|
bControlKey = TRUE;
|
|
|
|
if (bBack)
|
|
MoveUpStep(bShiftKey, bControlKey);
|
|
else
|
|
MoveDownStep(bShiftKey, bControlKey);
|
|
}
|