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.
360 lines
8.8 KiB
C++
360 lines
8.8 KiB
C++
// XTPSyntaxEditSelection.cpp: implementation of the CXTPSyntaxEditAutoCompleteWnd class.
|
|
//
|
|
// This file is a part of the XTREME TOOLKIT PRO 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 SYNTAX EDIT 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"
|
|
|
|
// common includes
|
|
#include "Common/XTPSmartPtrInternalT.h"
|
|
#include "Common/XTPColorManager.h"
|
|
|
|
// syntax editor includes
|
|
#include "XTPSyntaxEditDefines.h"
|
|
#include "XTPSyntaxEditStruct.h"
|
|
#include "XTPSyntaxEditSelection.h"
|
|
|
|
#include "XTPSyntaxEditBufferManager.h"
|
|
#include "XTPSyntaxEditCtrl.h"
|
|
#include "XTPSyntaxEditDrawTextProcessor.h"
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
IMPLEMENT_DYNAMIC(CXTPSyntaxEditSelection, CXTPCmdTarget)
|
|
|
|
|
|
|
|
// class CXTPSyntaxEditSelection =======================================================
|
|
CXTPSyntaxEditSelection::CXTPSyntaxEditSelection()
|
|
{
|
|
m_pOwnerCtrl = NULL;
|
|
|
|
selStart_disp = selEnd_disp = XTP_EDIT_LINECOL::MakeLineCol(1, 1);
|
|
selStart_str = selEnd_str = XTP_EDIT_LINECOL::MakeLineCol(1, 0);
|
|
|
|
bSelectingRunning = FALSE;
|
|
bWordSelectionMode = FALSE;
|
|
bBlockSelectionMode = FALSE;
|
|
nSelStartTextRowFromLeftBar = 0;
|
|
|
|
}
|
|
|
|
CXTPSyntaxEditSelection::CXTPSyntaxEditSelection(const CXTPSyntaxEditSelection& rSrc)
|
|
{
|
|
|
|
m_pOwnerCtrl = NULL;
|
|
|
|
*this = rSrc;
|
|
}
|
|
|
|
#define XTP_SE_AX_DETACH(pObject) if (pObject) { \
|
|
pObject->Detach(); \
|
|
pObject->InternalRelease(); }
|
|
|
|
CXTPSyntaxEditSelection::~CXTPSyntaxEditSelection()
|
|
{
|
|
}
|
|
|
|
void CXTPSyntaxEditSelection::SetStart_str(int nTextRow, int nStrPos)
|
|
{
|
|
selStart_str.nLine = nTextRow;
|
|
selStart_str.nCol = nStrPos;
|
|
|
|
selStart_disp.nLine = nTextRow;
|
|
|
|
if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
|
|
{
|
|
selStart_disp.nCol = m_pOwnerCtrl->GetEditBuffer()->StrPosToCol(nTextRow, nStrPos);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
selStart_disp.nCol = nStrPos;
|
|
}
|
|
}
|
|
|
|
void CXTPSyntaxEditSelection::SetEnd_str(int nTextRow, int nStrPos)
|
|
{
|
|
selEnd_str.nLine = nTextRow;
|
|
selEnd_str.nCol = nStrPos;
|
|
|
|
selEnd_disp.nLine = nTextRow;
|
|
|
|
if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
|
|
{
|
|
selEnd_disp.nCol = m_pOwnerCtrl->GetEditBuffer()->StrPosToCol(nTextRow, nStrPos);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
selEnd_disp.nCol = nStrPos;
|
|
}
|
|
}
|
|
|
|
void CXTPSyntaxEditSelection::SetStart_disp(int nTextRow, int nDispCol)
|
|
{
|
|
ASSERT(nDispCol > 0);
|
|
nDispCol = max(1, nDispCol);
|
|
|
|
selStart_disp.nLine = nTextRow;
|
|
selStart_disp.nCol = nDispCol;
|
|
|
|
selStart_str.nLine = nTextRow;
|
|
|
|
if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
|
|
{
|
|
selStart_str.nCol = m_pOwnerCtrl->GetEditBuffer()->ColToStrPos(nTextRow, nDispCol);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
selStart_str.nCol = nDispCol;
|
|
}
|
|
}
|
|
|
|
void CXTPSyntaxEditSelection::SetEnd_disp(int nTextRow, int nDispCol)
|
|
{
|
|
ASSERT(nDispCol > 0);
|
|
nDispCol = max(1, nDispCol);
|
|
|
|
selEnd_disp.nLine = nTextRow;
|
|
selEnd_disp.nCol = nDispCol;
|
|
|
|
selEnd_str.nLine = nTextRow;
|
|
|
|
if (m_pOwnerCtrl && m_pOwnerCtrl->GetEditBuffer())
|
|
{
|
|
selEnd_str.nCol = m_pOwnerCtrl->GetEditBuffer()->ColToStrPos(nTextRow, nDispCol);
|
|
}
|
|
else
|
|
{
|
|
ASSERT(FALSE);
|
|
selEnd_str.nCol = nDispCol;
|
|
}
|
|
}
|
|
|
|
BOOL CXTPSyntaxEditSelection::IsSelExist() const
|
|
{
|
|
XTP_EDIT_LINECOL normStart = GetNormalStart_disp();
|
|
XTP_EDIT_LINECOL normEnd = GetNormalEnd_disp();
|
|
|
|
return normStart < normEnd;
|
|
}
|
|
|
|
BOOL CXTPSyntaxEditSelection::_IsInSel(BOOL bStr, int nTextRow, int nColX) const
|
|
{
|
|
XTP_EDIT_LINECOL normStart = bStr ? GetNormalStart_str() : GetNormalStart_disp();
|
|
XTP_EDIT_LINECOL normEnd = bStr ? GetNormalEnd_str() : GetNormalEnd_disp();
|
|
|
|
if (!(normStart < normEnd))
|
|
return FALSE;
|
|
|
|
XTP_EDIT_LINECOL pos = XTP_EDIT_LINECOL::MakeLineCol(nTextRow, nColX);
|
|
|
|
if (bBlockSelectionMode)
|
|
{
|
|
return pos.nLine >= normStart.nLine && pos.nLine < normEnd.nLine &&
|
|
pos.nCol >= normStart.nCol && pos.nCol < normEnd.nCol;
|
|
}
|
|
return pos >= normStart && pos < normEnd;
|
|
}
|
|
|
|
BOOL CXTPSyntaxEditSelection::_IsIntersectSel(BOOL bStr, int nTextRow, int nCol1, int nCol2) const
|
|
{
|
|
XTP_EDIT_LINECOL normStart = bStr ? GetNormalStart_str() : GetNormalStart_disp();
|
|
XTP_EDIT_LINECOL normEnd = bStr ? GetNormalEnd_str() : GetNormalEnd_disp();
|
|
|
|
if (!(normStart < normEnd))
|
|
return FALSE;
|
|
|
|
if (nTextRow != normEnd.nLine)
|
|
{
|
|
// infinit sel by end
|
|
if (m_pOwnerCtrl->_IsVirtualSpaceActive())
|
|
{
|
|
normEnd.nCol = INT_MAX;
|
|
}
|
|
else
|
|
{
|
|
int nTextLenC = m_pOwnerCtrl->GetEditBuffer()->GetLineTextLengthC(nTextRow);
|
|
if (bStr)
|
|
normEnd.nCol = nTextLenC;
|
|
else
|
|
normEnd.nCol = m_pOwnerCtrl->GetEditBuffer()->StrPosToCol(nTextRow, nTextLenC);
|
|
}
|
|
}
|
|
|
|
XTP_EDIT_LINECOL pos1 = XTP_EDIT_LINECOL::MakeLineCol(nTextRow, nCol1);
|
|
XTP_EDIT_LINECOL pos2 = XTP_EDIT_LINECOL::MakeLineCol(nTextRow, nCol2);
|
|
|
|
BOOL bIntersect = !(pos2 <= normStart || pos1 >= normEnd);
|
|
|
|
if (bIntersect && bBlockSelectionMode)
|
|
{
|
|
// just condition by cols only
|
|
bIntersect = !(pos2.nCol <= normStart.nCol || pos1.nCol >= normEnd.nCol);
|
|
}
|
|
|
|
return bIntersect;
|
|
}
|
|
|
|
int CXTPSyntaxEditSelection::GetSelStartForRow_str(int nTextRow, int nDispLine)
|
|
{
|
|
XTP_EDIT_LINECOL normStart = GetNormalStart_str();
|
|
XTP_EDIT_LINECOL normEnd = GetNormalEnd_str();
|
|
|
|
if (nTextRow >= normStart.nLine && nTextRow <= normEnd.nLine)
|
|
{
|
|
if (bBlockSelectionMode)
|
|
{
|
|
int nDispPos = GetNormalStart_disp().nCol;
|
|
ASSERT(m_pOwnerCtrl);
|
|
if (m_pOwnerCtrl)
|
|
return m_pOwnerCtrl->GetDrawTextProcessor().DispPosToStrPos(nDispLine, nDispPos - 1, TRUE);
|
|
//m_pOwnerCtrl->_IsVirtualSpaceActive());
|
|
|
|
return normStart.nCol;
|
|
}
|
|
else
|
|
{
|
|
if (nTextRow == normStart.nLine)
|
|
return normStart.nCol;
|
|
else
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int CXTPSyntaxEditSelection::GetSelEndForRow_str(int nTextRow, int nDispLine, BOOL* pbInfinitSelEnd)
|
|
{
|
|
if (pbInfinitSelEnd)
|
|
*pbInfinitSelEnd = FALSE;
|
|
|
|
|
|
ASSERT(m_pOwnerCtrl);
|
|
if (!m_pOwnerCtrl)
|
|
return 0;
|
|
|
|
XTP_EDIT_LINECOL normStart = GetNormalStart_str();
|
|
XTP_EDIT_LINECOL normEnd = GetNormalEnd_str();
|
|
|
|
if (nTextRow >= normStart.nLine && nTextRow <= normEnd.nLine)
|
|
{
|
|
if (bBlockSelectionMode)
|
|
{
|
|
int nDispPos = GetNormalEnd_disp().nCol;
|
|
return m_pOwnerCtrl->GetDrawTextProcessor().DispPosToStrPos(nDispLine, nDispPos - 1, TRUE);
|
|
//m_pOwnerCtrl->_IsVirtualSpaceActive());
|
|
}
|
|
else
|
|
{
|
|
if (nTextRow == normEnd.nLine)
|
|
{
|
|
if (pbInfinitSelEnd && nSelStartTextRowFromLeftBar)
|
|
*pbInfinitSelEnd = m_pOwnerCtrl->_IsVirtualSpaceActive();
|
|
|
|
return normEnd.nCol;
|
|
}
|
|
else
|
|
{
|
|
int nDispPos = GetNormalEnd_disp().nCol;
|
|
|
|
int nPos = m_pOwnerCtrl->GetDrawTextProcessor().DispPosToStrPos(nDispLine, nDispPos - 1,
|
|
m_pOwnerCtrl->_IsVirtualSpaceActive());
|
|
if (pbInfinitSelEnd)
|
|
*pbInfinitSelEnd = m_pOwnerCtrl->_IsVirtualSpaceActive();
|
|
|
|
int nRowTextLen = m_pOwnerCtrl->GetEditBuffer()->GetLineTextLengthC(nTextRow);
|
|
nPos = max(nPos, nRowTextLen + 1);
|
|
|
|
return nPos;
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void CXTPSyntaxEditSelection::Reset_str(int nTextRow, int nStrPos)
|
|
{
|
|
bSelectingRunning = FALSE;
|
|
bWordSelectionMode = FALSE;
|
|
bBlockSelectionMode = FALSE;
|
|
nSelStartTextRowFromLeftBar = 0;
|
|
|
|
SetStart_str(nTextRow, nStrPos);
|
|
SetEnd_str(nTextRow, nStrPos);
|
|
}
|
|
|
|
void CXTPSyntaxEditSelection::Reset_disp(int nTextRow, int nDispCol)
|
|
{
|
|
bSelectingRunning = FALSE;
|
|
bWordSelectionMode = FALSE;
|
|
bBlockSelectionMode = FALSE;
|
|
nSelStartTextRowFromLeftBar = 0;
|
|
|
|
SetStart_disp(nTextRow, nDispCol);
|
|
SetEnd_disp(nTextRow, nDispCol);
|
|
}
|
|
|
|
const CXTPSyntaxEditSelection& CXTPSyntaxEditSelection::operator=(const CXTPSyntaxEditSelection& rSrc)
|
|
{
|
|
if (!m_pOwnerCtrl)
|
|
m_pOwnerCtrl = rSrc.m_pOwnerCtrl;
|
|
|
|
bSelectingRunning = rSrc.bSelectingRunning;
|
|
bWordSelectionMode = rSrc.bWordSelectionMode;
|
|
bBlockSelectionMode = rSrc.bBlockSelectionMode;
|
|
nSelStartTextRowFromLeftBar = rSrc.nSelStartTextRowFromLeftBar;
|
|
|
|
selStart_disp = rSrc.selStart_disp;
|
|
selEnd_disp = rSrc.selEnd_disp;
|
|
|
|
selStart_str = rSrc.selStart_str;
|
|
selEnd_str = rSrc.selEnd_str;
|
|
|
|
return *this;
|
|
}
|
|
|
|
BOOL CXTPSyntaxEditSelection::operator==(const CXTPSyntaxEditSelection& rSrc) const
|
|
{
|
|
return bSelectingRunning == rSrc.bSelectingRunning &&
|
|
bWordSelectionMode == rSrc.bWordSelectionMode &&
|
|
bBlockSelectionMode == rSrc.bBlockSelectionMode &&
|
|
nSelStartTextRowFromLeftBar == rSrc.nSelStartTextRowFromLeftBar &&
|
|
|
|
selStart_disp == rSrc.selStart_disp &&
|
|
selEnd_disp == rSrc.selEnd_disp &&
|
|
|
|
selStart_str == rSrc.selStart_str &&
|
|
selEnd_str == rSrc.selEnd_str;
|
|
}
|
|
|
|
BOOL CXTPSyntaxEditSelection::operator!=(const CXTPSyntaxEditSelection& rSrc) const
|
|
{
|
|
return !operator==(rSrc);
|
|
}
|
|
|