910 lines
18 KiB
C++
910 lines
18 KiB
C++
// OXNotesEditView.cpp : implementation of the COXNotesEditView class
|
|
//
|
|
// Version: 9.3
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "OXNotesEditView.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXNotesEditView
|
|
|
|
IMPLEMENT_DYNCREATE(COXNotesEditView, CEditView)
|
|
|
|
BEGIN_MESSAGE_MAP(COXNotesEditView, CEditView)
|
|
//{{AFX_MSG_MAP(COXNotesEditView)
|
|
ON_WM_CREATE()
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_CTLCOLOR_REFLECT()
|
|
ON_WM_MOUSEMOVE()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
ON_WM_VSCROLL()
|
|
ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
|
|
ON_WM_CHAR()
|
|
ON_MESSAGE(EM_SETMARGINS, OnSetMargins)
|
|
ON_MESSAGE(EM_GETMARGINS, OnGetMargins)
|
|
ON_MESSAGE(WM_SETTEXT, OnSetText)
|
|
//}}AFX_MSG_MAP
|
|
// Standard printing commands
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXNotesEditView construction/destruction
|
|
|
|
COXNotesEditView::COXNotesEditView(UINT nSide, UINT nWidth,
|
|
UINT nMode)
|
|
{
|
|
|
|
m_clrLines=m_clrFont=::GetSysColor(COLOR_WINDOWTEXT);
|
|
m_nMargins=0;
|
|
m_nSide=nSide;
|
|
if (nWidth==OX_NOTES_WIDTH_DEFAULT)
|
|
m_nNotesWidth=::GetSystemMetrics(SM_CXVSCROLL);
|
|
else
|
|
m_nNotesWidth=nWidth;
|
|
m_bUpdatingMargins=FALSE;
|
|
m_nPosition=NONE;
|
|
m_nMode=nMode;
|
|
m_pLinesFont=NULL;
|
|
}
|
|
|
|
COXNotesEditView::~COXNotesEditView()
|
|
{
|
|
::DeleteObject(m_hNotesCursor);
|
|
if (m_pLinesFont)
|
|
{
|
|
m_pLinesFont->DeleteObject();
|
|
delete m_pLinesFont;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXNotesEditView diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void COXNotesEditView::AssertValid() const
|
|
{
|
|
CEditView::AssertValid();
|
|
}
|
|
|
|
void COXNotesEditView::Dump(CDumpContext& dc) const
|
|
{
|
|
CEditView::Dump(dc);
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// COXNotesEditView message handlers
|
|
|
|
|
|
|
|
int COXNotesEditView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
#if defined (_WINDLL)
|
|
#if defined (_AFXDLL)
|
|
AFX_MANAGE_STATE(AfxGetAppModuleState());
|
|
#else
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
#endif
|
|
#endif
|
|
|
|
if (CEditView::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
CBitmap bmp;
|
|
VERIFY(bmp.LoadBitmap(OX_NOTES_BRUSH));
|
|
VERIFY(m_bshNotes.CreatePatternBrush(&bmp));
|
|
bmp.DeleteObject();
|
|
|
|
m_hNotesCursor=::LoadCursor(/*AfxGetApp()->m_hInstance*/
|
|
AfxGetInstanceHandle(),(LPCTSTR)
|
|
MAKEINTRESOURCE(OX_CURSOR_NOTES));
|
|
ASSERT(m_hNotesCursor);
|
|
|
|
LoadNotesImageList();
|
|
|
|
VERIFY(m_bshClient.CreateSolidBrush(::GetSysColor(COLOR_WINDOW)));
|
|
CEdit& edt=GetEditCtrl();
|
|
m_bUpdatingMargins=TRUE;
|
|
m_nMargins=edt.GetMargins();
|
|
|
|
switch (m_nSide)
|
|
{
|
|
case SIDE_LEFT:
|
|
edt.SetMargins(LOWORD(m_nMargins)+m_nNotesWidth,
|
|
HIWORD(m_nMargins));
|
|
break;
|
|
case SIDE_RIGHT:
|
|
edt.SetMargins(LOWORD(m_nMargins),
|
|
HIWORD(m_nMargins)+m_nNotesWidth);
|
|
break;
|
|
}
|
|
m_bUpdatingMargins=FALSE;
|
|
|
|
::SetClassLong(m_hWnd, GCL_HCURSOR,NULL);
|
|
return NULL;
|
|
}
|
|
|
|
BOOL COXNotesEditView::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
CRect rctClient;
|
|
|
|
GetClientRect(&rctClient);
|
|
CRect rctNotes(rctClient);
|
|
|
|
switch (m_nSide)
|
|
{
|
|
case SIDE_LEFT:
|
|
rctNotes.right=min(m_nNotesWidth,(UINT) rctNotes.right);
|
|
rctClient.left=rctNotes.right;
|
|
break;
|
|
case SIDE_RIGHT:
|
|
rctNotes.left=max(0, rctNotes.right-m_nNotesWidth);
|
|
rctClient.right=rctNotes.left;
|
|
break;
|
|
default:
|
|
rctNotes.SetRectEmpty();
|
|
}
|
|
if (!rctClient.IsRectEmpty())
|
|
{
|
|
if (IsWindowEnabled())
|
|
pDC->FillRect( &rctClient,&m_bshClient);
|
|
else
|
|
pDC->FillRect(&rctClient, CBrush::FromHandle(::GetSysColorBrush(COLOR_BTNFACE)));
|
|
}
|
|
|
|
|
|
if (!rctNotes.IsRectEmpty())
|
|
{
|
|
pDC->FillRect(&rctNotes, &m_bshNotes);
|
|
}
|
|
DrawBookmarks(pDC);
|
|
return TRUE;
|
|
}
|
|
|
|
void COXNotesEditView::OnLButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
|
|
if (IsWindowEnabled())
|
|
{
|
|
if (m_nPosition==NOTES)
|
|
{
|
|
UINT nChar=GetEditCtrl().CharFromPos(point);
|
|
UINT nLine=GetEditCtrl().LineFromChar(LOWORD(nChar));
|
|
nChar=GetEditCtrl().LineIndex(nLine);
|
|
UINT nLength=GetEditCtrl().LineLength(nChar);
|
|
UINT nEnd=nChar+nLength;
|
|
GetEditCtrl().SetSel(nChar,nEnd,FALSE);
|
|
return;
|
|
}
|
|
}
|
|
|
|
CEditView::OnLButtonDown(nFlags, point);
|
|
}
|
|
|
|
|
|
HBRUSH COXNotesEditView::CtlColor(CDC* pDC, UINT nCtlColor)
|
|
{
|
|
CRect rect;
|
|
|
|
GetClientRect(&rect);
|
|
CRect rctNotes(rect);
|
|
|
|
switch (m_nSide)
|
|
{
|
|
case SIDE_LEFT:
|
|
rect.right=min((UINT) rect.left+m_nNotesWidth, (UINT) rect.right);
|
|
break;
|
|
case SIDE_RIGHT:
|
|
rect.left=max(0,rect.right-m_nNotesWidth);
|
|
break;
|
|
default:
|
|
rect.SetRectEmpty();
|
|
}
|
|
if (!rect.IsRectEmpty())
|
|
pDC->ExcludeClipRect(&rect);
|
|
if (CTLCOLOR_EDIT==nCtlColor)
|
|
{
|
|
pDC->SetTextColor(m_clrFont);
|
|
return (HBRUSH) m_bshClient;
|
|
}
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
LRESULT COXNotesEditView::OnSetMargins(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (m_bUpdatingMargins)
|
|
return Default();
|
|
switch (wParam)
|
|
{
|
|
case EC_USEFONTINFO:
|
|
{
|
|
LRESULT lRslt=Default();
|
|
m_bUpdatingMargins=TRUE;
|
|
m_nMargins=PtrToUint(SendMessage(EM_GETMARGINS,0,0));
|
|
switch (m_nSide)
|
|
{
|
|
case SIDE_LEFT:
|
|
GetEditCtrl().SetMargins(LOWORD(m_nMargins)+m_nNotesWidth,
|
|
HIWORD(m_nMargins));
|
|
break;
|
|
case SIDE_RIGHT:
|
|
GetEditCtrl().SetMargins(LOWORD(m_nMargins),
|
|
HIWORD(m_nMargins)+m_nNotesWidth);
|
|
break;
|
|
}
|
|
m_bUpdatingMargins=FALSE;
|
|
return lRslt;
|
|
}
|
|
break;
|
|
case EC_LEFTMARGIN:
|
|
m_nMargins=MAKELONG(lParam,HIWORD(m_nMargins));
|
|
if (m_nSide==SIDE_LEFT)
|
|
{
|
|
m_bUpdatingMargins=TRUE;
|
|
LPARAM lPrm=MAKELONG(LOWORD(m_nMargins)+m_nNotesWidth,
|
|
HIWORD(m_nMargins));
|
|
LRESULT lRslt=SendMessage(EM_SETMARGINS,wParam,lPrm);
|
|
m_bUpdatingMargins=FALSE;
|
|
return lRslt;
|
|
}
|
|
else
|
|
return Default();
|
|
break;
|
|
case EC_RIGHTMARGIN:
|
|
m_nMargins=MAKELONG(LOWORD(m_nMargins),lParam);
|
|
if (m_nSide==SIDE_RIGHT)
|
|
{
|
|
m_bUpdatingMargins=TRUE;
|
|
LPARAM lPrm=MAKELONG(LOWORD(m_nMargins),
|
|
HIWORD(m_nMargins)+m_nNotesWidth);
|
|
LRESULT lRslt=SendMessage(EM_SETMARGINS,wParam,lPrm);
|
|
m_bUpdatingMargins=FALSE;
|
|
return lRslt;
|
|
}
|
|
else
|
|
return Default();
|
|
break;
|
|
default:
|
|
return Default();
|
|
}
|
|
}
|
|
|
|
void COXNotesEditView::OnMouseMove(UINT nFlags, CPoint point)
|
|
{
|
|
HCURSOR hCursor;
|
|
CRect rect;
|
|
UINT nPosition;
|
|
|
|
GetNotesRect(&rect);
|
|
if (rect.PtInRect(point))
|
|
{
|
|
hCursor=m_hNotesCursor;
|
|
nPosition=NOTES;
|
|
}
|
|
else
|
|
{
|
|
hCursor=::LoadCursor(NULL,IDC_IBEAM);
|
|
nPosition=EDIT;
|
|
}
|
|
|
|
if (nPosition!=m_nPosition)
|
|
OnChangeCursor(&hCursor,nPosition);
|
|
|
|
m_nPosition=nPosition;
|
|
SetCursor(hCursor);
|
|
CEditView::OnMouseMove(nFlags, point);
|
|
}
|
|
|
|
void COXNotesEditView::OnLButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
CRect rct;
|
|
GetNotesRect(&rct);
|
|
|
|
if (rct.PtInRect(point))
|
|
{
|
|
int n=HIWORD(GetEditCtrl().CharFromPos(point));
|
|
int nChar=GetEditCtrl().LineIndex(n);
|
|
if (IsMarked(nChar))
|
|
RemoveBookmarks(nChar,nChar);
|
|
else
|
|
SetBookmark(nChar);
|
|
}
|
|
CEditView::OnLButtonDblClk(nFlags, point);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOL COXNotesEditView::InsertNotes(UINT nSide, UINT nWidth)
|
|
{
|
|
m_nSide=nSide;
|
|
m_nNotesWidth=nWidth;
|
|
RedrawWindow();
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void COXNotesEditView::DeleteNotes()
|
|
{
|
|
m_nSide=SIDE_NONE;
|
|
m_nNotesWidth=0;
|
|
ClearBookmarks();
|
|
RedrawWindow();
|
|
}
|
|
|
|
|
|
BOOL COXNotesEditView::IsMarked(UINT nChar) const
|
|
{
|
|
|
|
for (int n=0; n<m_arBookmarks.GetSize();n++)
|
|
{
|
|
if ((0x00FFFFFF & m_arBookmarks.GetAt(n))==nChar)
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
void COXNotesEditView::SetBookmark(UINT nChar, BYTE nType)
|
|
{
|
|
DWORD dwChar;
|
|
DWORD dwInsert=nType;
|
|
if (!OnSetBookmark(nChar, &dwInsert))
|
|
return;
|
|
|
|
nChar=nChar & 0x00FFFFFF;
|
|
dwInsert=(dwInsert<<24) | nChar;
|
|
int n=0;
|
|
|
|
CDC* pDC=GetDC();
|
|
|
|
while (n<m_arBookmarks.GetSize())
|
|
{
|
|
dwChar=0x00FFFFFF & m_arBookmarks.GetAt(n);
|
|
if (dwChar==nChar)
|
|
{
|
|
m_arBookmarks.SetAt(n,dwInsert);
|
|
DrawBookmarks(pDC);
|
|
return;
|
|
}
|
|
else
|
|
if (dwChar>nChar)
|
|
{
|
|
m_arBookmarks.InsertAt(n,dwInsert);
|
|
DrawBookmarks(pDC);
|
|
return;
|
|
}
|
|
n++;
|
|
}
|
|
m_arBookmarks.Add(dwInsert);
|
|
DrawBookmarks(pDC);
|
|
ReleaseDC(pDC);
|
|
|
|
}
|
|
|
|
|
|
BOOL COXNotesEditView::ShowBookmark(UINT nChar)
|
|
{
|
|
|
|
if (IsMarked(nChar))
|
|
{
|
|
UINT nLine=GetEditCtrl().LineFromChar(nChar);
|
|
UINT nFirstVisible=GetEditCtrl().GetFirstVisibleLine();
|
|
UINT nLastVisible=GetLastVisibleLine();
|
|
if (nFirstVisible>nLine || nLastVisible<nLine)
|
|
GetEditCtrl().LineScroll(nLine-nFirstVisible);
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
void COXNotesEditView::SetNotesBackground(COLORREF clrNotesBkgnd)
|
|
{
|
|
if (m_bshNotes.m_hObject)
|
|
m_bshNotes.DeleteObject();
|
|
m_bshNotes.CreateSolidBrush(clrNotesBkgnd);
|
|
}
|
|
|
|
|
|
void COXNotesEditView::SetNotesBackground(CBrush* pBrush)
|
|
{
|
|
if (m_bshNotes.m_hObject)
|
|
m_bshNotes.DeleteObject();
|
|
LOGBRUSH LogBrush;
|
|
VERIFY(pBrush->GetLogBrush(&LogBrush));
|
|
VERIFY(m_bshNotes.CreateBrushIndirect(&LogBrush));
|
|
}
|
|
|
|
|
|
|
|
int COXNotesEditView::ImageFromLine(UINT nLine) const
|
|
{
|
|
int nRet=-1;
|
|
|
|
CEdit& edt=GetEditCtrl();
|
|
UINT nFirst=edt.LineIndex(nLine);
|
|
UINT nLast=edt.LineLength(edt.LineIndex(nLine));
|
|
if (nLast)
|
|
nLast=nLast+nFirst-1;
|
|
else
|
|
nLast=nFirst;
|
|
|
|
for (int n=0;n<m_arBookmarks.GetSize();n++)
|
|
{
|
|
//every value in the m_arBookmarks array
|
|
//consists of index of the char the bookmark set to
|
|
//(that is 24 least significant bits in the value) and
|
|
//8 most significant bits represents image index of
|
|
//the bookmark in m_imgBookmarks
|
|
DWORD dwIndex=m_arBookmarks.GetAt(n);
|
|
DWORD dwChar=0x00FFFFFF & dwIndex;
|
|
|
|
if (dwChar>=nFirst)
|
|
{
|
|
if (dwChar<=nLast)
|
|
nRet=dwIndex>>24;
|
|
else
|
|
return nRet;
|
|
}
|
|
}
|
|
return nRet;
|
|
}
|
|
|
|
int COXNotesEditView::GetLastVisibleLine()
|
|
{
|
|
CRect rect;
|
|
|
|
CEdit& edt=GetEditCtrl();
|
|
edt.GetRect(&rect);
|
|
UINT nHeight=GetLineHeight();
|
|
UINT nLast=edt.GetFirstVisibleLine()+rect.Height()/nHeight;
|
|
return nLast;
|
|
}
|
|
|
|
int COXNotesEditView::GetLineHeight()
|
|
{
|
|
CDC* pdc=GetDC();
|
|
TEXTMETRIC Metrics;
|
|
VERIFY(pdc->GetTextMetrics(&Metrics));
|
|
ReleaseDC(pdc);
|
|
return Metrics.tmHeight;
|
|
}
|
|
|
|
void COXNotesEditView::OnChangeCursor(HCURSOR *phCursor, UINT nPosition)
|
|
{
|
|
UNUSED_ALWAYS(phCursor);
|
|
UNUSED_ALWAYS(nPosition);
|
|
//does nothing
|
|
//here you can change HCURSOR to your custom cursor
|
|
//on the fly, depends of cursor position
|
|
}
|
|
|
|
void COXNotesEditView::GetNotesRect(LPRECT pRect)
|
|
{
|
|
GetClientRect(pRect);
|
|
switch (m_nSide)
|
|
{
|
|
case SIDE_LEFT:
|
|
pRect->right=pRect->left+m_nNotesWidth;
|
|
break;
|
|
case SIDE_RIGHT:
|
|
pRect->left=pRect->right-m_nNotesWidth;
|
|
break;
|
|
default:
|
|
::ZeroMemory(&pRect, sizeof(pRect));
|
|
}
|
|
}
|
|
|
|
void COXNotesEditView::DrawBookmarks(CDC *pDC)
|
|
{
|
|
CRect rect;
|
|
GetNotesRect(&rect);
|
|
if (!rect.IsRectEmpty())
|
|
{
|
|
pDC->FillRect(&rect, &m_bshNotes);
|
|
CRect rctClient;
|
|
GetClientRect(&rctClient);
|
|
int nLine=GetEditCtrl().GetFirstVisibleLine();
|
|
int nLastLine=GetLastVisibleLine();
|
|
CRect rct;
|
|
GetNotesRect(&rct);
|
|
UINT nMode=pDC->SetBkMode(TRANSPARENT);
|
|
CFont* pOldFont=NULL;
|
|
if (m_pLinesFont)
|
|
pOldFont=pDC->SelectObject(m_pLinesFont);
|
|
COLORREF clrOld=pDC->SetTextColor(m_clrLines);
|
|
|
|
TEXTMETRIC Metrics;
|
|
VERIFY(pDC->GetTextMetrics(&Metrics));
|
|
int nHeight=Metrics.tmHeight;
|
|
|
|
TCHAR szBuffer[_MAX_PATH];
|
|
for (nLine;nLine<nLastLine;nLine++)
|
|
{
|
|
if (GetEditCtrl().LineIndex(nLine)!=-1)
|
|
{
|
|
int nCount=GetEditCtrl().GetLine(nLine,(LPTSTR) &szBuffer, _MAX_PATH);
|
|
if (!nCount && GetEditCtrl().GetLineCount()==(nLine+1))
|
|
break;
|
|
CPoint pt=GetEditCtrl().PosFromChar(GetEditCtrl().LineIndex(nLine));
|
|
pt.x=(rct.Width()-GetBookmarkImageSize().cx)/2+rct.left;
|
|
if (m_nMode==MODE_BKMARKS)
|
|
{
|
|
int nIndex=ImageFromLine(nLine);
|
|
if (nIndex!=-1 && nIndex<m_imgBookmarks.GetImageCount())
|
|
{
|
|
VERIFY(m_imgBookmarks.DrawIndirect(pDC, nIndex,
|
|
pt, GetBookmarkImageSize(),CPoint(0,0)));
|
|
}
|
|
}
|
|
else
|
|
if (m_nMode==MODE_LINES)
|
|
{
|
|
CString sLine;
|
|
SIZE sz;
|
|
|
|
sLine.Format(_T("%d"),nLine+1);
|
|
|
|
VERIFY(::GetTextExtentExPoint(pDC->m_hDC,
|
|
(LPCTSTR) sLine,sLine.GetLength(),
|
|
rect.Width(), NULL,NULL,//&nCount, &nWidth,
|
|
&sz));
|
|
ASSERT(GetNotesSide()!=SIDE_NONE);
|
|
pt.x=(GetNotesSide()==SIDE_LEFT)?0:rctClient.right-rect.Width();
|
|
pt.y+=(nHeight>=GetLineHeight())?0:
|
|
(GetLineHeight()-nHeight);
|
|
pDC->TextOut(pt.x+rect.Width()-sz.cx,pt.y,(LPCTSTR) sLine/*,nCount*/);
|
|
|
|
}
|
|
else
|
|
ASSERT(FALSE);//not valid mode
|
|
}
|
|
}
|
|
pDC->SetBkMode(nMode);
|
|
pDC->SetTextColor(clrOld);
|
|
if (m_pLinesFont)
|
|
pDC->SelectObject(pOldFont);
|
|
}
|
|
}
|
|
|
|
CSize COXNotesEditView::GetBookmarkImageSize()
|
|
{
|
|
|
|
CSize sz(0,0);
|
|
if (m_imgBookmarks.GetImageCount())
|
|
{
|
|
//all bitmaps in the image list
|
|
//supposed to have equal size
|
|
IMAGEINFO ImgInfo;
|
|
VERIFY(m_imgBookmarks.GetImageInfo(0,&ImgInfo));
|
|
sz.cy=ImgInfo.rcImage.bottom-ImgInfo.rcImage.top;
|
|
sz.cx=ImgInfo.rcImage.right-ImgInfo.rcImage.left;
|
|
}
|
|
return sz;
|
|
}
|
|
|
|
|
|
|
|
|
|
LRESULT COXNotesEditView::OnGetMargins(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UNUSED_ALWAYS(wParam);
|
|
UNUSED_ALWAYS(lParam);
|
|
|
|
LRESULT lRslt=Default();
|
|
// ASSERT((UINT) lRslt==m_nMargins);
|
|
|
|
if (m_bUpdatingMargins)
|
|
return lRslt;
|
|
|
|
switch (m_nSide)
|
|
{
|
|
case SIDE_LEFT:
|
|
lRslt=MAKELONG(LOWORD(lRslt)+m_nNotesWidth,
|
|
HIWORD(lRslt));
|
|
break;
|
|
case SIDE_RIGHT:
|
|
lRslt=MAKELONG(LOWORD(lRslt),
|
|
HIWORD(lRslt)+m_nNotesWidth);
|
|
break;
|
|
}
|
|
|
|
return lRslt;
|
|
|
|
}
|
|
|
|
void COXNotesEditView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
|
{
|
|
|
|
CEditView::OnVScroll(nSBCode, nPos, pScrollBar);
|
|
CDC* pDC=GetDC();
|
|
DrawBookmarks(pDC);
|
|
ReleaseDC(pDC);
|
|
}
|
|
|
|
void COXNotesEditView::OnChange()
|
|
{
|
|
CString sText;
|
|
UINT nStartPos=0;
|
|
UINT nEndPos;
|
|
|
|
GetWindowText(sText);
|
|
UINT nOldLength=m_sCopy.GetLength();
|
|
UINT nNewLength=sText.GetLength();
|
|
UINT nDirection=LENGTH_THESAME;
|
|
if (nNewLength>nOldLength)
|
|
nDirection=LENGTH_MORE;
|
|
else
|
|
if (nNewLength<nOldLength)
|
|
nDirection=LENGTH_LESS;
|
|
|
|
int nDiff=nNewLength-nOldLength;
|
|
|
|
while(nStartPos<(UINT) sText.GetLength() &&
|
|
nStartPos<(UINT) m_sCopy.GetLength() &&
|
|
sText.GetAt(nStartPos)==m_sCopy.GetAt(nStartPos))
|
|
nStartPos++;
|
|
switch (nDirection)
|
|
{
|
|
case LENGTH_THESAME:
|
|
nEndPos=sText.GetLength()-1;
|
|
while (nEndPos>nStartPos)
|
|
{
|
|
if (sText.GetAt(nEndPos)!=m_sCopy.GetAt(nEndPos))
|
|
{
|
|
if (nEndPos>nStartPos)
|
|
{
|
|
RemoveBookmarks(nStartPos, nEndPos);
|
|
}
|
|
}
|
|
nEndPos--;
|
|
}
|
|
break;
|
|
case LENGTH_MORE:
|
|
if (m_sCopy.GetLength())
|
|
{
|
|
nEndPos=m_sCopy.GetLength()-1;
|
|
while (nEndPos>nStartPos)
|
|
{
|
|
if (m_sCopy.GetAt(nEndPos)!=sText.GetAt(nEndPos+nDiff))
|
|
{
|
|
RemoveBookmarks(nStartPos,nEndPos);
|
|
|
|
}
|
|
nEndPos--;
|
|
}
|
|
}
|
|
OffsetBookmarks(nStartPos,nDiff);
|
|
break;
|
|
case LENGTH_LESS:
|
|
if (sText.GetLength())
|
|
{
|
|
nEndPos=sText.GetLength()-1;
|
|
while (nEndPos>nStartPos)
|
|
{
|
|
if (sText.GetAt(nEndPos)!=m_sCopy.GetAt(nEndPos-nDiff))
|
|
{
|
|
RemoveBookmarks(nStartPos,nEndPos);
|
|
|
|
}
|
|
nEndPos--;
|
|
}
|
|
}
|
|
OffsetBookmarks(nStartPos,nDiff);
|
|
break;
|
|
}
|
|
nEndPos=nStartPos;
|
|
|
|
m_sCopy=sText;
|
|
CDC* pDC=GetDC();
|
|
DrawBookmarks(pDC);
|
|
ReleaseDC(pDC);
|
|
|
|
}
|
|
|
|
LRESULT COXNotesEditView::OnSetText(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
UNUSED_ALWAYS(wParam);
|
|
UNUSED_ALWAYS(lParam);
|
|
|
|
LRESULT lRslt=Default();
|
|
OnChange();
|
|
return lRslt;
|
|
}
|
|
|
|
void COXNotesEditView::RemoveBookmarks( UINT nStartChar=OX_NOTES_ALL, UINT nEndChar=OX_NOTES_ALL)
|
|
{
|
|
//remove the bookmarks that are in [nStartPos...nEndPos] range
|
|
if (nStartChar==OX_NOTES_ALL)
|
|
nStartChar=0;
|
|
if (nEndChar==OX_NOTES_ALL)
|
|
nEndChar=GetWindowTextLength();
|
|
for (int n=0;n<m_arBookmarks.GetSize();n++)
|
|
{
|
|
DWORD dwChar=m_arBookmarks.GetAt(n) & 0x00FFFFFF;
|
|
if (dwChar>=nStartChar)
|
|
{
|
|
if (dwChar<=nEndChar)
|
|
{
|
|
m_arBookmarks.RemoveAt(n);
|
|
n--;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
}
|
|
CRect rctNotes;
|
|
GetNotesRect(&rctNotes);
|
|
InvalidateRect(&rctNotes);
|
|
RedrawWindow();
|
|
}
|
|
|
|
|
|
void COXNotesEditView::OffsetBookmarks(UINT nStart, int nOffset)
|
|
{
|
|
for (int n=0; n<m_arBookmarks.GetSize(); n++)
|
|
{
|
|
DWORD dwIndex=m_arBookmarks.GetAt(n) ;
|
|
if ((dwIndex & 0x00FFFFFF)>=nStart)
|
|
{
|
|
int nNew=nOffset+(dwIndex &0x00FFFFFF);
|
|
if (nNew>0)
|
|
{
|
|
nNew|=0xFF000000 & dwIndex;
|
|
m_arBookmarks.SetAt(n,nNew);
|
|
}
|
|
else
|
|
{
|
|
m_arBookmarks.RemoveAt(n);
|
|
n--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void COXNotesEditView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
|
{
|
|
int nStart, nEnd;
|
|
|
|
if (nChar==VK_TAB)
|
|
{
|
|
GetEditCtrl().GetSel(nStart, nEnd);
|
|
if (nEnd>nStart)
|
|
{
|
|
int i=::GetAsyncKeyState(VK_SHIFT);
|
|
BOOL bInsert=(i<0?FALSE:TRUE);
|
|
|
|
UINT nFirstLine=GetEditCtrl().LineFromChar(nStart);
|
|
UINT nLastLine=GetEditCtrl().LineFromChar(nEnd);
|
|
for (int nLine=nFirstLine;(UINT) nLine<=nLastLine;nLine++)
|
|
{
|
|
int nChar=GetEditCtrl().LineIndex(nLine);
|
|
CString sText;
|
|
GetWindowText(sText);
|
|
if (!bInsert)
|
|
{
|
|
if (sText.GetAt(nChar)==TEXT('\t'))
|
|
{
|
|
sText=sText.Left(nChar)+sText.Right(sText.GetLength()
|
|
-nChar-1);
|
|
SetWindowText((LPCTSTR) sText);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sText.Insert(nChar,TEXT('\t'));
|
|
SetWindowText((LPCTSTR) sText);
|
|
}
|
|
}
|
|
nStart=GetEditCtrl().LineIndex(nFirstLine);
|
|
nEnd=GetEditCtrl().LineIndex(nLastLine);
|
|
int nLength=GetEditCtrl().LineLength(GetEditCtrl().LineIndex(nLastLine));
|
|
|
|
nEnd+=nLength;//?(nLength-1):NULL;
|
|
GetEditCtrl().SetSel(nStart, nEnd);
|
|
return;
|
|
}
|
|
}
|
|
CEditView::OnChar(nChar, nRepCnt, nFlags);
|
|
}
|
|
|
|
BOOL COXNotesEditView::OnSetBookmark(UINT nChar, DWORD *pType)
|
|
{
|
|
UNUSED_ALWAYS(nChar);
|
|
UNUSED_ALWAYS(pType);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void COXNotesEditView::SetMode(UINT nMode, BOOL bRedraw)
|
|
{
|
|
if (nMode!=m_nMode)
|
|
{
|
|
m_nMode=nMode;
|
|
if (bRedraw)
|
|
RedrawWindow();
|
|
}
|
|
}
|
|
|
|
UINT COXNotesEditView::GetMode() const
|
|
{
|
|
return m_nMode;
|
|
}
|
|
|
|
BOOL COXNotesEditView::SetLinesFont(CFont *pFont, BOOL bRedraw)
|
|
{
|
|
BOOL bRet=TRUE;
|
|
if (m_pLinesFont)
|
|
{
|
|
m_pLinesFont->DeleteObject();
|
|
delete m_pLinesFont;
|
|
m_pLinesFont=NULL;
|
|
}
|
|
if (pFont)
|
|
{
|
|
m_pLinesFont= new CFont;
|
|
LOGFONT LogFont;
|
|
if (pFont->GetLogFont(&LogFont))
|
|
{
|
|
if (!m_pLinesFont->CreateFontIndirect(&LogFont))
|
|
{
|
|
delete m_pLinesFont;
|
|
m_pLinesFont=NULL;
|
|
bRet=FALSE;
|
|
}
|
|
}
|
|
else
|
|
bRet=FALSE;
|
|
}
|
|
|
|
if (bRedraw)
|
|
RedrawWindow();
|
|
|
|
return bRet;
|
|
}
|
|
|
|
const CFont* COXNotesEditView::GetLinesFont() const
|
|
{
|
|
return m_pLinesFont;
|
|
}
|
|
|
|
void COXNotesEditView::SetLinesColor(COLORREF clr, BOOL bRedraw)
|
|
{
|
|
m_clrLines=clr;
|
|
if (bRedraw)
|
|
RedrawWindow();
|
|
}
|
|
|
|
COLORREF COXNotesEditView::GetLinesColor() const
|
|
{
|
|
return m_clrLines;
|
|
}
|