161 lines
3.1 KiB
C++
161 lines
3.1 KiB
C++
// Windows/Clipboard.cpp
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
|
#include "Windows/Clipboard.h"
|
|
#include "Windows/Defs.h"
|
|
#ifdef _WIN32
|
|
#include "Windows/Memory.h"
|
|
#include "Windows/Shell.h"
|
|
#include "Windows/Memory.h"
|
|
#else
|
|
#include <wx/clipbrd.h>
|
|
#include <wx/dataobj.h>
|
|
#undef _WIN32
|
|
#endif
|
|
|
|
#include "Common/StringConvert.h"
|
|
|
|
namespace NWindows {
|
|
|
|
bool CClipboard::Open(HWND wndNewOwner)
|
|
{
|
|
#ifdef _WIN32
|
|
m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));
|
|
#else
|
|
m_Open = wxTheClipboard->Open();
|
|
#endif
|
|
return m_Open;
|
|
}
|
|
|
|
CClipboard::~CClipboard()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
bool CClipboard::Close()
|
|
{
|
|
if (!m_Open)
|
|
return true;
|
|
#ifdef _WIN32
|
|
m_Open = !BOOLToBool(CloseClipboard());
|
|
#else
|
|
wxTheClipboard->Close();
|
|
m_Open = false;
|
|
#endif
|
|
return !m_Open;
|
|
}
|
|
|
|
#ifdef _WIN32
|
|
bool ClipboardIsFormatAvailableHDROP()
|
|
{
|
|
return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
bool ClipboardGetTextString(AString &s)
|
|
{
|
|
s.Empty();
|
|
if (!IsClipboardFormatAvailable(CF_TEXT))
|
|
return false;
|
|
CClipboard clipboard;
|
|
|
|
if (!clipboard.Open(NULL))
|
|
return false;
|
|
|
|
HGLOBAL h = ::GetClipboardData(CF_TEXT);
|
|
if (h != NULL)
|
|
{
|
|
NMemory::CGlobalLock globalLock(h);
|
|
const char *p = (const char *)globalLock.GetPointer();
|
|
if (p != NULL)
|
|
{
|
|
s = p;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
*/
|
|
|
|
/*
|
|
bool ClipboardGetFileNames(UStringVector &names)
|
|
{
|
|
names.Clear();
|
|
if (!IsClipboardFormatAvailable(CF_HDROP))
|
|
return false;
|
|
CClipboard clipboard;
|
|
|
|
if (!clipboard.Open(NULL))
|
|
return false;
|
|
|
|
HGLOBAL h = ::GetClipboardData(CF_HDROP);
|
|
if (h != NULL)
|
|
{
|
|
NMemory::CGlobalLock globalLock(h);
|
|
void *p = (void *)globalLock.GetPointer();
|
|
if (p != NULL)
|
|
{
|
|
NShell::CDrop drop(false);
|
|
drop.Attach((HDROP)p);
|
|
drop.QueryFileNames(names);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
*/
|
|
|
|
#ifdef _WIN32
|
|
static bool ClipboardSetData(UINT uFormat, const void *data, size_t size)
|
|
{
|
|
NMemory::CGlobal global;
|
|
if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))
|
|
return false;
|
|
{
|
|
NMemory::CGlobalLock globalLock(global);
|
|
LPVOID p = globalLock.GetPointer();
|
|
if (p == NULL)
|
|
return false;
|
|
memcpy(p, data, size);
|
|
}
|
|
if (::SetClipboardData(uFormat, global) == NULL)
|
|
return false;
|
|
global.Detach();
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
bool ClipboardSetText(HWND owner, const UString &s)
|
|
{
|
|
CClipboard clipboard;
|
|
if (!clipboard.Open(owner))
|
|
return false;
|
|
#ifdef _WIN32
|
|
if (!::EmptyClipboard())
|
|
return false;
|
|
|
|
bool res;
|
|
res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Length() + 1) * sizeof(wchar_t));
|
|
#ifndef _UNICODE
|
|
AString a;
|
|
a = UnicodeStringToMultiByte(s, CP_ACP);
|
|
res |= ClipboardSetData(CF_TEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
|
|
a = UnicodeStringToMultiByte(s, CP_OEMCP);
|
|
res |= ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Length() + 1) * sizeof(char));
|
|
#endif
|
|
return res;
|
|
#else
|
|
wxTheClipboard->Clear();
|
|
// This data objects are held by the clipboard,
|
|
// so do not delete them in the app.
|
|
wxString ws(s);
|
|
wxTheClipboard->SetData( new wxTextDataObject(ws) );
|
|
return true;
|
|
#endif
|
|
}
|
|
|
|
}
|