www.pudn.com > UsefulListView.zip > GFXINEDIT.CPP


// GfxInEdit.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "CGfxListView.h" 
 
#include "GfxInEdit.h" 
#include "GfxInCombo.h" 
 
#include "GfxListView.h" 
 
#include "GfxPopupMenu.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CGfxInEdit 
 
 
CGfxInEdit::CGfxInEdit(int iItem, int iSubItem, CString sInitText, bool _bMouseSelect) : m_sInitText(sInitText) 
{ 
	bMouseSelect = _bMouseSelect; 
	m_iItem = iItem; 
	m_iSubItem = iSubItem; 
	m_bESC = FALSE; 
} 
 
CGfxInEdit::~CGfxInEdit() 
{ 
} 
 
//CEdit) 
BEGIN_MESSAGE_MAP(CGfxInEdit, CRichEditCtrl) 
	//{{AFX_MSG_MAP(CGfxInEdit) 
	ON_WM_CHAR() 
	ON_WM_CREATE() 
	ON_WM_KILLFOCUS() 
	ON_WM_NCDESTROY() 
	ON_WM_LBUTTONDBLCLK() 
	ON_WM_RBUTTONDOWN() 
	//}}AFX_MSG_MAP 
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) 
	ON_COMMAND(ID_EDIT_CUT, OnEditCut) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut) 
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) 
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGfxInEdit message handlers 
 
void CGfxInEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	if (nChar == VK_ESCAPE || nChar == VK_RETURN || nChar == VK_TAB) 
	{ 
		if (nChar == VK_ESCAPE) m_bESC = TRUE; 
		if (nChar == VK_TAB) 
		{ 
			SHORT sh = GetKeyState(VK_SHIFT); 
 
			ProcessSelect(); 
			CWnd * pParent = GetParent(); 
			int ip[2] = { m_iItem, m_iSubItem }; 
			DestroyWindow(); 
			if (sh < 0) pParent->SendMessage(WM_USER_TAB, 1, (LPARAM) &ip); 
			else pParent->SendMessage(WM_USER_TAB, 0, (LPARAM) &ip); 
			return; 
		} 
		GetParent()->SetFocus(); 
		return; 
	} 
 
	CRichEditCtrl::OnChar(nChar, nRepCnt, nFlags); 
 
	CString str; 
 
	GetWindowText( str ); 
	CWindowDC dc(this); 
	CFont *pFont = GetParent()->GetFont(); 
	CFont *pFontDC = dc.SelectObject(pFont); 
	CSize size = dc.GetTextExtent(str); 
	dc.SelectObject(pFontDC); 
	size.cx += 5; 
 
	CRect rect, parentrect; 
	GetClientRect(&rect); 
	GetParent()->GetClientRect(&parentrect); 
 
	ClientToScreen(&rect); 
	GetParent()->ScreenToClient(&rect); 
 
	if (size.cx > rect.Width()) 
	{ 
		if (size.cx + rect.left > parentrect.right) rect.right = rect.left + size.cx; 
		else rect.right = parentrect.right; 
		MoveWindow(&rect); 
	} 
} 
 
int CGfxInEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CRichEditCtrl::OnCreate(lpCreateStruct) == -1) return -1; 
	CFont* font = GetParent()->GetFont(); 
	SetFont(font); 
 
	SetWindowText(m_sInitText); 
	SetFocus(); 
 
	SetSel(0, -1); 
 
	if (bMouseSelect) 
	{ 
		CPoint pt; 
		GetCursorPos(&pt); 
		ScreenToClient(&pt); 
		PostMessage(WM_LBUTTONDOWN, 0, MAKELONG(pt.x, pt.y)); 
		PostMessage(WM_LBUTTONUP, 0, MAKELONG(pt.x, pt.y)); 
	} 
 
	return 0; 
} 
 
void CGfxInEdit::OnKillFocus(CWnd* pNewWnd)  
{ 
	CRichEditCtrl::OnKillFocus(pNewWnd); 
 
	if (m_bESC) 
	{ 
		DestroyWindow(); 
		return; 
	} 
	ProcessSelect(); 
	DestroyWindow(); 
} 
 
void CGfxInEdit::OnNcDestroy()  
{ 
	CRichEditCtrl::OnNcDestroy(); 
//	delete this; 
} 
 
BOOL CGfxInEdit::PreTranslateMessage(MSG* pMsg)  
{ 
	if (pMsg->message == WM_KEYDOWN) 
	{ 
		if (pMsg->wParam == VK_LEFT) 
		{ 
			long ls,le; 
			GetSel(ls, le); 
			if (ls == 0 && ls == le) 
			{ 
				ProcessSelect(); 
				CWnd * pParent = GetParent(); 
				int ip[2] = { m_iItem, m_iSubItem }; 
				DestroyWindow(); 
				pParent->SendMessage(WM_USER_TAB, 2, (LPARAM) &ip); 
				return TRUE; 
			} 
		} 
		if (pMsg->wParam == VK_RIGHT) 
		{ 
			long ls,le; 
			GetSel(ls, le); 
			CString cs; 
			GetWindowText(cs); 
 
			if (ls == cs.GetLength() && ls == le) 
			{ 
				ProcessSelect(); 
				CWnd * pParent = GetParent(); 
				int ip[2] = { m_iItem, m_iSubItem }; 
				DestroyWindow(); 
				pParent->SendMessage(WM_USER_TAB, 3, (LPARAM) &ip); 
				return TRUE; 
			} 
		} 
 
		if (pMsg->wParam == VK_UP) 
		{ 
			ProcessSelect(); 
			CWnd * pParent = GetParent(); 
			int ip[2] = { m_iItem, m_iSubItem }; 
			DestroyWindow(); 
			pParent->SendMessage(WM_USER_TAB, 4, (LPARAM) &ip); 
			return TRUE; 
		} 
		if (pMsg->wParam == VK_DOWN) 
		{ 
			ProcessSelect(); 
			CWnd * pParent = GetParent(); 
			int ip[2] = { m_iItem, m_iSubItem }; 
			DestroyWindow(); 
			pParent->SendMessage(WM_USER_TAB, 5, (LPARAM) &ip); 
			return TRUE; 
		} 
 
 
		if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_DELETE || pMsg->wParam == VK_ESCAPE ||  
			pMsg->wParam == VK_RIGHT || pMsg->wParam == VK_LEFT || pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN ||  
			pMsg->wParam == VK_TAB || GetKeyState(VK_CONTROL)) 
		{ 
			::TranslateMessage(pMsg); 
			::DispatchMessage(pMsg); 
			return TRUE; 
		} 
	} 
	 
	return CRichEditCtrl::PreTranslateMessage(pMsg); 
} 
 
void CGfxInEdit::ProcessSelect() 
{ 
	CString str; 
	GetWindowText(str); 
 
	if (m_sInitText != str)  
	{ 
		LV_DISPINFO dispinfo; 
		dispinfo.hdr.hwndFrom = GetParent()->m_hWnd; 
		dispinfo.hdr.idFrom = GetDlgCtrlID(); 
		dispinfo.hdr.code = LVN_ENDLABELEDIT; 
 
		dispinfo.item.mask = LVIF_TEXT; 
		dispinfo.item.iItem = m_iItem; 
		dispinfo.item.iSubItem = m_iSubItem; 
		dispinfo.item.pszText = m_bESC ? NULL : LPTSTR((LPCTSTR)str); 
		dispinfo.item.cchTextMax = str.GetLength(); 
		GetParent()->SendMessage(WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM)&dispinfo); 
	} 
} 
 
void CGfxInEdit::OnLButtonDblClk(UINT nFlags, CPoint point)  
{ 
	CRichEditCtrl::OnLButtonDblClk(nFlags, point); 
 
	NMHDR nh; 
	nh.hwndFrom = GetParent()->GetSafeHwnd(); 
	nh.idFrom = GetParent()->GetDlgCtrlID(); 
	nh.code = NM_DBLCLK; 
 
	CWnd * pWnd = ((CGfxListView *)GetParent())->GetReciper();//GetParent(); 
	pWnd->SendMessage(WM_NOTIFY, GetParent()->GetDlgCtrlID(), (LPARAM) &nh); 
} 
 
void CGfxInEdit::PostNcDestroy()  
{ 
	CRichEditCtrl::PostNcDestroy(); 
	delete this;	 
} 
 
void CGfxInEdit::OnRButtonDown(UINT nFlags, CPoint point)  
{ 
	CGfxPopupMenu cMenu; 
	cMenu.CreatePopupMenu(); 
 
	cMenu.AppendMenu(MF_STRING, ID_EDIT_UNDO, "&Annulla"); 
	cMenu.AppendMenu(MF_SEPARATOR); 
	cMenu.AppendMenu(MF_STRING, ID_EDIT_CUT, "&Taglia"); 
	cMenu.AppendMenu(MF_STRING, ID_EDIT_COPY, "&Copia"); 
	cMenu.AppendMenu(MF_STRING, ID_EDIT_PASTE, "&Incolla"); 
 
	CPoint pt(GetMessagePos()); 
 
	cMenu.LoadToolBarResource(IDR_LISTMENUBMP);//IDR_MAINFRAME); 
	cMenu.RemapMenu(&cMenu); 
	cMenu.EnableMenuItems(&cMenu, this); 
 
	cMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, this); 
 
	cMenu.DestroyMenu(); 
} 
 
bool CGfxInEdit::UpdateCopy() 
{ 
	long ns = 0, ne = 0; 
	GetSel(ns, ne); 
	return (ns != ne) ? true : false; 
} 
 
bool CGfxInEdit::UpdatePaste() 
{ 
	return CanPaste() ? true : false; 
} 
 
bool CGfxInEdit::UpdateCut() 
{ 
	long ns = 0, ne = 0; 
	GetSel(ns, ne); 
	return (ns != ne) ? true : false; 
} 
 
bool CGfxInEdit::UpdateUndo() 
{ 
	return CanUndo() ? true : false; 
} 
 
 
void CGfxInEdit::OnEditCopy()  
{ 
	Copy();	 
} 
 
void CGfxInEdit::OnUpdateEditCopy(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(UpdateCopy()); 
} 
 
void CGfxInEdit::OnEditCut()  
{ 
	Cut();	 
} 
 
void CGfxInEdit::OnUpdateEditCut(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(UpdateCut()); 
} 
 
void CGfxInEdit::OnEditPaste()  
{ 
	Paste();	 
} 
 
void CGfxInEdit::OnUpdateEditPaste(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(UpdatePaste()); 
} 
 
void CGfxInEdit::OnEditUndo()  
{ 
	Undo(); 
} 
 
void CGfxInEdit::OnUpdateEditUndo(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(UpdateUndo()); 
}