mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
182 lines
3.2 KiB
C++
182 lines
3.2 KiB
C++
#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()
|
|
{
|
|
} |