1370b324cSopenharmony_ci// Windows/Clipboard.cpp
2370b324cSopenharmony_ci
3370b324cSopenharmony_ci#include "StdAfx.h"
4370b324cSopenharmony_ci
5370b324cSopenharmony_ci#ifdef UNDER_CE
6370b324cSopenharmony_ci#include <winuserm.h>
7370b324cSopenharmony_ci#endif
8370b324cSopenharmony_ci
9370b324cSopenharmony_ci#include "../Common/StringConvert.h"
10370b324cSopenharmony_ci
11370b324cSopenharmony_ci#include "Clipboard.h"
12370b324cSopenharmony_ci#include "Defs.h"
13370b324cSopenharmony_ci#include "MemoryGlobal.h"
14370b324cSopenharmony_ci#include "Shell.h"
15370b324cSopenharmony_ci
16370b324cSopenharmony_cinamespace NWindows {
17370b324cSopenharmony_ci
18370b324cSopenharmony_cibool CClipboard::Open(HWND wndNewOwner) throw()
19370b324cSopenharmony_ci{
20370b324cSopenharmony_ci  m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));
21370b324cSopenharmony_ci  return m_Open;
22370b324cSopenharmony_ci}
23370b324cSopenharmony_ci
24370b324cSopenharmony_cibool CClipboard::Close() throw()
25370b324cSopenharmony_ci{
26370b324cSopenharmony_ci  if (!m_Open)
27370b324cSopenharmony_ci    return true;
28370b324cSopenharmony_ci  m_Open = !BOOLToBool(CloseClipboard());
29370b324cSopenharmony_ci  return !m_Open;
30370b324cSopenharmony_ci}
31370b324cSopenharmony_ci
32370b324cSopenharmony_cibool ClipboardIsFormatAvailableHDROP()
33370b324cSopenharmony_ci{
34370b324cSopenharmony_ci  return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));
35370b324cSopenharmony_ci}
36370b324cSopenharmony_ci
37370b324cSopenharmony_ci/*
38370b324cSopenharmony_cibool ClipboardGetTextString(AString &s)
39370b324cSopenharmony_ci{
40370b324cSopenharmony_ci  s.Empty();
41370b324cSopenharmony_ci  if (!IsClipboardFormatAvailable(CF_TEXT))
42370b324cSopenharmony_ci    return false;
43370b324cSopenharmony_ci  CClipboard clipboard;
44370b324cSopenharmony_ci
45370b324cSopenharmony_ci  if (!clipboard.Open(NULL))
46370b324cSopenharmony_ci    return false;
47370b324cSopenharmony_ci
48370b324cSopenharmony_ci  HGLOBAL h = ::GetClipboardData(CF_TEXT);
49370b324cSopenharmony_ci  if (h != NULL)
50370b324cSopenharmony_ci  {
51370b324cSopenharmony_ci    NMemory::CGlobalLock globalLock(h);
52370b324cSopenharmony_ci    const char *p = (const char *)globalLock.GetPointer();
53370b324cSopenharmony_ci    if (p != NULL)
54370b324cSopenharmony_ci    {
55370b324cSopenharmony_ci      s = p;
56370b324cSopenharmony_ci      return true;
57370b324cSopenharmony_ci    }
58370b324cSopenharmony_ci  }
59370b324cSopenharmony_ci  return false;
60370b324cSopenharmony_ci}
61370b324cSopenharmony_ci*/
62370b324cSopenharmony_ci
63370b324cSopenharmony_ci/*
64370b324cSopenharmony_cibool ClipboardGetFileNames(UStringVector &names)
65370b324cSopenharmony_ci{
66370b324cSopenharmony_ci  names.Clear();
67370b324cSopenharmony_ci  if (!IsClipboardFormatAvailable(CF_HDROP))
68370b324cSopenharmony_ci    return false;
69370b324cSopenharmony_ci  CClipboard clipboard;
70370b324cSopenharmony_ci
71370b324cSopenharmony_ci  if (!clipboard.Open(NULL))
72370b324cSopenharmony_ci    return false;
73370b324cSopenharmony_ci
74370b324cSopenharmony_ci  HGLOBAL h = ::GetClipboardData(CF_HDROP);
75370b324cSopenharmony_ci  if (h != NULL)
76370b324cSopenharmony_ci  {
77370b324cSopenharmony_ci    NMemory::CGlobalLock globalLock(h);
78370b324cSopenharmony_ci    void *p = (void *)globalLock.GetPointer();
79370b324cSopenharmony_ci    if (p != NULL)
80370b324cSopenharmony_ci    {
81370b324cSopenharmony_ci      NShell::CDrop drop(false);
82370b324cSopenharmony_ci      drop.Attach((HDROP)p);
83370b324cSopenharmony_ci      drop.QueryFileNames(names);
84370b324cSopenharmony_ci      return true;
85370b324cSopenharmony_ci    }
86370b324cSopenharmony_ci  }
87370b324cSopenharmony_ci  return false;
88370b324cSopenharmony_ci}
89370b324cSopenharmony_ci*/
90370b324cSopenharmony_ci
91370b324cSopenharmony_cistatic bool ClipboardSetData(UINT uFormat, const void *data, size_t size) throw()
92370b324cSopenharmony_ci{
93370b324cSopenharmony_ci  NMemory::CGlobal global;
94370b324cSopenharmony_ci  if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))
95370b324cSopenharmony_ci    return false;
96370b324cSopenharmony_ci  {
97370b324cSopenharmony_ci    NMemory::CGlobalLock globalLock(global);
98370b324cSopenharmony_ci    LPVOID p = globalLock.GetPointer();
99370b324cSopenharmony_ci    if (!p)
100370b324cSopenharmony_ci      return false;
101370b324cSopenharmony_ci    memcpy(p, data, size);
102370b324cSopenharmony_ci  }
103370b324cSopenharmony_ci  if (::SetClipboardData(uFormat, global) == NULL)
104370b324cSopenharmony_ci    return false;
105370b324cSopenharmony_ci  global.Detach();
106370b324cSopenharmony_ci  return true;
107370b324cSopenharmony_ci}
108370b324cSopenharmony_ci
109370b324cSopenharmony_cibool ClipboardSetText(HWND owner, const UString &s)
110370b324cSopenharmony_ci{
111370b324cSopenharmony_ci  CClipboard clipboard;
112370b324cSopenharmony_ci  if (!clipboard.Open(owner))
113370b324cSopenharmony_ci    return false;
114370b324cSopenharmony_ci  if (!::EmptyClipboard())
115370b324cSopenharmony_ci    return false;
116370b324cSopenharmony_ci
117370b324cSopenharmony_ci  bool res;
118370b324cSopenharmony_ci  res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Len() + 1) * sizeof(wchar_t));
119370b324cSopenharmony_ci  #ifndef _UNICODE
120370b324cSopenharmony_ci  AString a (UnicodeStringToMultiByte(s, CP_ACP));
121370b324cSopenharmony_ci  if (ClipboardSetData(CF_TEXT, (const char *)a, (a.Len() + 1) * sizeof(char)))
122370b324cSopenharmony_ci    res = true;
123370b324cSopenharmony_ci  a = UnicodeStringToMultiByte(s, CP_OEMCP);
124370b324cSopenharmony_ci  if (ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Len() + 1) * sizeof(char)))
125370b324cSopenharmony_ci    res = true;
126370b324cSopenharmony_ci  #endif
127370b324cSopenharmony_ci  return res;
128370b324cSopenharmony_ci}
129370b324cSopenharmony_ci
130370b324cSopenharmony_ci}
131