reman3/Rayman_X/cpa/tempgrp/TIA/Src/richeditctrlwithlinemanagem...

262 lines
6.9 KiB
C++

// RichEditCtrlWithLineManagement.cpp : implementation file
//
#include "stdafx.h"
#include "RichEditCtrlWithLineManagement.hpp"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define EDIT_EOLN "\r\n"
/////////////////////////////////////////////////////////////////////////////
// CRichEditCtrlWithLineManagement
//**********************************************************************************
CRichEditCtrlWithLineManagement::CRichEditCtrlWithLineManagement()
: CRichEditCtrl ()
{
}
//**********************************************************************************
CRichEditCtrlWithLineManagement::~CRichEditCtrlWithLineManagement()
{
}
//**********************************************************************************
CString CRichEditCtrlWithLineManagement::m_fn_csGetLine (long lLineNumber)
{
static char buf[500];
long lLength = GetLine (lLineNumber, & buf [0], 496);
// without the eol!
buf [lLength - strlen (EDIT_EOLN)] = 0;
return (CString) buf;
}
//**********************************************************************************
void CRichEditCtrlWithLineManagement::m_fn_vDeleteLine (long lLineNumber)
{
long lLineIndex = LineIndex (lLineNumber);
if (lLineIndex >= 0)
{
long lNextLineIndex = LineIndex (lLineNumber + 1);
if (lNextLineIndex < 0)
{
// last line
lNextLineIndex = lLineIndex + LineLength (lLineNumber);
}
SetSel (lLineIndex, lNextLineIndex);
ReplaceSel ("");
}
}
//**********************************************************************************
void CRichEditCtrlWithLineManagement::m_fn_vAddLine (long lLineNumber, CString csLineText)
{
long lLineIndex = LineIndex (lLineNumber);
if (lLineIndex >= 0)
{
SetSel (lLineIndex, lLineIndex);
csLineText += EDIT_EOLN;
ReplaceSel (csLineText);
}
}
//**********************************************************************************
void CRichEditCtrlWithLineManagement::m_fn_vReplaceLine (long lLineNumber, CString csLineText)
{
long lLineIndex = LineIndex (lLineNumber);
if (lLineIndex >= 0)
{
long lNextLineIndex = LineIndex (lLineNumber + 1);
if (lNextLineIndex < 0)
{
// last line
lNextLineIndex = lLineIndex + LineLength (lLineNumber);
}
else
{
// append as a line
csLineText += EDIT_EOLN;
}
SetSel (lLineIndex, lNextLineIndex);
ReplaceSel (csLineText);
}
}
//**********************************************************************************
void CRichEditCtrlWithLineManagement::m_fn_vAppendLine (CString csLineText)
{
long lLastCharIndex = GetTextLength ();
SetSel (lLastCharIndex, lLastCharIndex);
char buf[2];
GetSelText (& buf [0]);
csLineText = (CString) buf + EDIT_EOLN + csLineText;
ReplaceSel (csLineText);
}
//**********************************************************************************
void CRichEditCtrlWithLineManagement::m_fn_vHideLines (CList <long, long> & clHiddenLinesNumbers)
{
long lHiddenLineNumber;
CString csHiddenLineText;
// put back the old hidden lines
POSITION posNumber = m_clHiddenLinesNumbers . GetHeadPosition ();
POSITION posText = m_cslHiddenLines . GetHeadPosition ();
while (posNumber && posText)
{
lHiddenLineNumber = m_clHiddenLinesNumbers . GetNext (posNumber);
csHiddenLineText = m_cslHiddenLines . GetNext (posText);
if (lHiddenLineNumber <= GetLineCount ())
m_fn_vAddLine (lHiddenLineNumber, csHiddenLineText);
else
m_fn_vAppendLine (csHiddenLineText);
}
// clean up
m_clHiddenLinesNumbers . RemoveAll ();
m_cslHiddenLines . RemoveAll ();
// hide the new ones
POSITION pos = clHiddenLinesNumbers . GetHeadPosition ();
long lAlreadyHiddenCount = 0;
long lLastHiddenLineNumber = -1;
while (pos)
{
lHiddenLineNumber = clHiddenLinesNumbers . GetNext (pos);
if (lHiddenLineNumber >= 0 && lHiddenLineNumber < GetLineCount () + lAlreadyHiddenCount && lHiddenLineNumber > lLastHiddenLineNumber)
{
// assuming ascending order, plus only one appearance, ignore anything breaking the rule
m_clHiddenLinesNumbers . AddTail (lHiddenLineNumber);
csHiddenLineText = m_fn_csGetLine (lHiddenLineNumber - lAlreadyHiddenCount);
m_cslHiddenLines . AddTail (csHiddenLineText);
m_fn_vDeleteLine (lHiddenLineNumber - lAlreadyHiddenCount);
// update cycle parameters
lLastHiddenLineNumber = lHiddenLineNumber;
lAlreadyHiddenCount ++;
}
}
}
//**********************************************************************************
/*
void CRichEditCtrlWithLineManagement::m_fn_vMarkLines (CList <long, long> & clLineNumbers, COLORREF rgbMarkColor)
{
m_rgbMarkColor = rgbMarkColor;
POSITION pos = clLineNumbers . GetHeadPosition ();
}
*/
//**********************************************************************************
void CRichEditCtrlWithLineManagement::m_fn_vSetSelLine (long lLineNumber)
{
long lHiddenLineNumber;
long lRealLineNumber = lLineNumber;
POSITION pos = m_clHiddenLinesNumbers . GetHeadPosition ();
while (pos)
{
lHiddenLineNumber = m_clHiddenLinesNumbers . GetNext (pos);
if (lHiddenLineNumber < lLineNumber)
lRealLineNumber --;
else
break;
}
long lIndex = LineIndex (lRealLineNumber);
SetSel (lIndex, lIndex);
// scroll to the sel line
// scroll to the sel line
//Stefan Dumitrean 8-06-98 (new scroll)
// CPoint clCurPos = GetCharPos (lIndex);
//Sets scroll position
// clCurPos . x=0;
// ((CScrollView *) GetParent ()) -> ScrollToPosition (clCurPos);
//End Stefan Dumitrean 8-06-98
}
//**********************************************************************************
void CRichEditCtrlWithLineManagement::m_fn_vMarkLine (long lLineNumber)
{
long lHiddenLineNumber;
long lRealLineNumber = lLineNumber;
POSITION pos = m_clHiddenLinesNumbers . GetHeadPosition ();
while (pos)
{
lHiddenLineNumber = m_clHiddenLinesNumbers . GetNext (pos);
if (lHiddenLineNumber < lLineNumber)
lRealLineNumber --;
else
break;
}
long lIndexStart = LineIndex (lRealLineNumber);
long lIndexEnd = LineIndex (lRealLineNumber + 1);
SetSel (lIndexStart, lIndexEnd);
}
//**********************************************************************************
long CRichEditCtrlWithLineManagement::m_fn_lGetSelLine (void)
{
long lStartIndex, lEndIndex;
GetSel (lStartIndex, lEndIndex);
// get the sel line nb
long lCurLine = 0;
long lLineCount = GetLineCount ();
long lCurIndex = 0;
while (lCurLine < lLineCount && lCurIndex <= lStartIndex)
{
lCurLine ++;
lCurIndex = LineIndex (lCurLine);
}
lCurLine --;
if (lCurLine < 0)
lCurLine = 0;
// update with hidden lines
long lHiddenLineNumber;
POSITION pos = m_clHiddenLinesNumbers . GetHeadPosition ();
while (pos)
{
lHiddenLineNumber = m_clHiddenLinesNumbers . GetNext (pos);
if (lHiddenLineNumber <= lCurLine)
lCurLine ++;
else
break;
}
return lCurLine;
}
BEGIN_MESSAGE_MAP(CRichEditCtrlWithLineManagement, CRichEditCtrl)
//{{AFX_MSG_MAP(CRichEditCtrlWithLineManagement)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRichEditCtrlWithLineManagement message handlers