1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00
DxWnd.reloaded/host/SpecialEdit.cpp

182 lines
3.2 KiB
C++
Raw Normal View History

#include "stdafx.h"
#include "SpecialEdit.h"
#include <afxole.h>
#include <vector>
#include <algorithm>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
BaseFormat::BaseFormat()
{
}
BaseFormat::~BaseFormat()
{
}
void BaseFormat::SetAllowedChars(std::vector<TCHAR> chars)
{
m_listChars = chars;
}
void BaseFormat::SetAllowedChars(LPCTSTR chars, int size)
{
m_listChars.erase(m_listChars.begin(), m_listChars.end());
m_listChars.reserve(size);
m_listChars.assign(chars, chars+size);
}
RelIntegerFormat::RelIntegerFormat()
{
LPCTSTR format = _T("-+0123456789");
SetAllowedChars(format, _tcslen(format));
}
RelIntegerFormat::~RelIntegerFormat()
{
}
bool BaseFormat::IsCharAllowed(TCHAR nChar)
{
std::vector<TCHAR>::iterator pos = std::find(m_listChars.begin(), m_listChars.end(), nChar);
return (pos != m_listChars.end());
}
CSpecialEdit::CSpecialEdit()
{
m_formatter = NULL;
}
CSpecialEdit::~CSpecialEdit()
{
}
BEGIN_MESSAGE_MAP(CSpecialEdit, CEdit)
//{{AFX_MSG_MAP(CSpecialEdit)
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSpecialEdit message handlers
void CSpecialEdit::SetFormatter(IFormat *formatter)
{
ASSERT(formatter != NULL);
m_formatter = formatter;
}
bool CSpecialEdit::IsCharAllowed(TCHAR nChar)
{
switch(nChar){
case _T('\b'):
case 10:
case 13:
return true;
}
ASSERT(m_formatter != NULL);
return m_formatter->IsCharAllowed(nChar);
}
bool CSpecialEdit::IsClipboardOK()
{
bool isOK = true;
COleDataObject obj;
if (obj.AttachClipboard()) {
HGLOBAL hmem = NULL;
TCHAR *pUniText = NULL;
DWORD dwLen = 0;
bool bText = false;
if (obj.IsDataAvailable(CF_TEXT)){
hmem = obj.GetGlobalData(CF_TEXT);
char *pCharText = (char*)::GlobalLock(hmem);
#ifdef UNICODE
int lenA = strlen(pCharText);
int lenW = MultiByteToWideChar(CP_ACP, 0, pCharText, lenA, 0, 0);
if (lenW > 0){
pUniText = ::SysAllocStringLen(0, lenW);
MultiByteToWideChar(CP_ACP, 0, pCharText, lenA, pUniText, lenW);
bText = true;
}
else{
::GlobalUnlock(hmem);
return false;
}
#else
pUniText = pCharText;
#endif
}
#ifdef UNICODE
else if(obj.IsDataAvailable(CF_UNICODETEXT)){
hmem = obj.GetGlobalData(CF_UNICODETEXT);
pUniText = (TCHAR*)::GlobalLock(hmem);
}
#endif
if(hmem){
DWORD dwLen = _tcslen(pUniText);
for(DWORD i=0; i<dwLen && isOK; i++)
isOK = IsCharAllowed(pUniText[i]);
::GlobalUnlock(hmem);
#ifdef UNICODE
if(bText)
::SysFreeString(pUniText);
#endif
}
else
return false;
}
return isOK;
}
LRESULT CSpecialEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_PASTE:
if(!IsClipboardOK()){
MessageBeep(-1);
return 0;
}
}
return CEdit::WindowProc(message, wParam, lParam);
}
void CSpecialEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(GetKeyState(VK_CONTROL) & 0x80000000){
switch(nChar){
case 0x03:
Copy();
return;
case 0x16:
Paste();
return;
case 0x18:
Cut();
return;
case 0x1a:
Undo();
return;
}
}
if(!IsCharAllowed(nChar)){
MessageBeep(-1);
return;
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
IFormat::~IFormat()
{
}