Initial Commit
This commit is contained in:
156
common/CLIPBRD.CPP
Normal file
156
common/CLIPBRD.CPP
Normal file
@@ -0,0 +1,156 @@
|
||||
#include <common/clipbrd.hpp>
|
||||
#include <common/string.hpp>
|
||||
|
||||
Clipboard::Clipboard(GUIWindow &parentWindow)
|
||||
: mParentWindow(parentWindow), mhNextViewerWnd(0)
|
||||
{
|
||||
if(!parentWindow.isValid())return;
|
||||
mChangeCBChainHandler.setCallback(this,&Clipboard::changeCBChainHandler);
|
||||
mDrawClipboardHandler.setCallback(this,&Clipboard::drawClipboardHandler);
|
||||
mDestroyHandler.setCallback(this,&Clipboard::destroyHandler);
|
||||
mParentWindow.insertHandler(VectorHandler::ChangeCBChainHandler,&mChangeCBChainHandler);
|
||||
mParentWindow.insertHandler(VectorHandler::DrawClipboardHandler,&mDrawClipboardHandler);
|
||||
mParentWindow.insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
||||
mhNextViewerWnd=::SetClipboardViewer(mParentWindow);
|
||||
}
|
||||
|
||||
Clipboard::~Clipboard()
|
||||
{
|
||||
removeCBChain();
|
||||
mParentWindow.removeHandler(VectorHandler::DrawClipboardHandler,&mDrawClipboardHandler);
|
||||
mParentWindow.removeHandler(VectorHandler::ChangeCBChainHandler,&mChangeCBChainHandler);
|
||||
mParentWindow.removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
||||
}
|
||||
|
||||
void Clipboard::setDrawDataHandler(PureCallback *pCallback)
|
||||
{
|
||||
mDrawDataHandler=CallbackPointer(pCallback);
|
||||
}
|
||||
|
||||
bool Clipboard::isOkay(void)const
|
||||
{
|
||||
return mParentWindow.isValid();
|
||||
}
|
||||
|
||||
CallbackData::ReturnType Clipboard::destroyHandler(CallbackData &someCallbackData)
|
||||
{
|
||||
removeCBChain();
|
||||
return (CallbackData::ReturnType)false;
|
||||
}
|
||||
|
||||
CallbackData::ReturnType Clipboard::changeCBChainHandler(CallbackData &someCallbackData)
|
||||
{
|
||||
if(!isOkay())return (CallbackData::ReturnType)false;
|
||||
if((HWND)someCallbackData.wParam()==mhNextViewerWnd)mhNextViewerWnd=(HWND)someCallbackData.loWord();
|
||||
else ::SendMessage(mhNextViewerWnd,WM_CHANGECBCHAIN,someCallbackData.wParam(),someCallbackData.lParam());
|
||||
return (CallbackData::ReturnType)false;
|
||||
}
|
||||
|
||||
CallbackData::ReturnType Clipboard::drawClipboardHandler(CallbackData &someCallbackData)
|
||||
{
|
||||
if(!isOkay())return (CallbackData::ReturnType)false;
|
||||
::SendMessage(mhNextViewerWnd,WM_DRAWCLIPBOARD,someCallbackData.wParam(),someCallbackData.lParam());
|
||||
if(::OpenClipboard(mParentWindow)){drawClipboard();::CloseClipboard();}
|
||||
return (CallbackData::ReturnType)false;
|
||||
}
|
||||
|
||||
void Clipboard::removeCBChain(void)
|
||||
{
|
||||
if(!isOkay())return;
|
||||
::ChangeClipboardChain(mParentWindow,mhNextViewerWnd);
|
||||
}
|
||||
|
||||
bool Clipboard::setClipboard(Format format,HANDLE hData)
|
||||
{
|
||||
bool returnCode(false);
|
||||
|
||||
if(!isOkay()||!hData)return returnCode;
|
||||
if(!::OpenClipboard(mParentWindow))return returnCode;
|
||||
emptyClipboard();
|
||||
returnCode=(hData==::SetClipboardData(format,hData));
|
||||
::CloseClipboard();
|
||||
return returnCode;
|
||||
}
|
||||
|
||||
bool Clipboard::setClipboard(const String &strText)
|
||||
{
|
||||
bool returnCode(false);
|
||||
|
||||
if(!isOkay()||strText.isNull()||!::OpenClipboard(mParentWindow))return returnCode;
|
||||
emptyClipboard();
|
||||
int strLen(strText.length());
|
||||
char *ptrData=(char*)::GlobalAlloc(GMEM_FIXED,strLen+1);
|
||||
if(!ptrData){::CloseClipboard();return returnCode;}
|
||||
::memset(ptrData,0,strLen+1);
|
||||
::memcpy(ptrData,(char*)(String&)strText,strLen);
|
||||
returnCode=ptrData==::SetClipboardData(CF_TEXT,(HANDLE)ptrData);
|
||||
::CloseClipboard();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Clipboard::setClipboard(UINT format,const String &strText)
|
||||
{
|
||||
bool returnCode(false);
|
||||
|
||||
if(!isOkay()||strText.isNull()||!::OpenClipboard(mParentWindow))return returnCode;
|
||||
emptyClipboard();
|
||||
int strLen(strText.length());
|
||||
char *ptrData=(char*)::GlobalAlloc(GMEM_FIXED,strLen+1);
|
||||
if(!ptrData){::CloseClipboard();return returnCode;}
|
||||
::memset(ptrData,0,strLen+1);
|
||||
::memcpy(ptrData,(char*)(String&)strText,strLen);
|
||||
returnCode=ptrData==::SetClipboardData(format,(HANDLE)ptrData);
|
||||
::CloseClipboard();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Clipboard::getClipboard(String &strText)const
|
||||
{
|
||||
bool returnCode(false);
|
||||
HANDLE handle=0;
|
||||
|
||||
if(!isOkay()||!::OpenClipboard(mParentWindow))return returnCode;
|
||||
if(0==(handle=::GetClipboardData(CF_TEXT))){::CloseClipboard();return false;}
|
||||
strText=(LPSTR)::GlobalLock(handle);
|
||||
::GlobalUnlock(handle);
|
||||
::CloseClipboard();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Clipboard::getClipboard(UINT format,String &strText)const
|
||||
{
|
||||
bool returnCode(false);
|
||||
HANDLE handle=0;
|
||||
|
||||
if(!isOkay()||!::OpenClipboard(mParentWindow))return returnCode;
|
||||
if(0==(handle=::GetClipboardData(format))){::CloseClipboard();return false;}
|
||||
strText=(LPSTR)::GlobalLock(handle);
|
||||
::GlobalUnlock(handle);
|
||||
::CloseClipboard();
|
||||
return true;
|
||||
}
|
||||
|
||||
UINT Clipboard::registerClipboardFormat(const String &strFormatName)
|
||||
{
|
||||
return ::RegisterClipboardFormat(strFormatName.str());
|
||||
}
|
||||
|
||||
bool Clipboard::hasData(Format format)
|
||||
{
|
||||
return ::IsClipboardFormatAvailable(format);
|
||||
}
|
||||
|
||||
bool Clipboard::hasData(UINT format)
|
||||
{
|
||||
return ::IsClipboardFormatAvailable(format);
|
||||
}
|
||||
|
||||
// virtuals
|
||||
|
||||
void Clipboard::drawClipboard(void)
|
||||
{
|
||||
mDrawDataHandler.callback(CallbackData());
|
||||
}
|
||||
|
||||
// (ie) HANDLE hData=::GetClipboardData(CF_DIB);
|
||||
|
||||
Reference in New Issue
Block a user