1*f6dc9357SAndroid Build Coastguard Worker // Windows/Clipboard.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE
6*f6dc9357SAndroid Build Coastguard Worker #include <winuserm.h>
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StringConvert.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #include "Clipboard.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "MemoryGlobal.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "Shell.h"
15*f6dc9357SAndroid Build Coastguard Worker
16*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
17*f6dc9357SAndroid Build Coastguard Worker
Open(HWND wndNewOwner)18*f6dc9357SAndroid Build Coastguard Worker bool CClipboard::Open(HWND wndNewOwner) throw()
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker m_Open = BOOLToBool(::OpenClipboard(wndNewOwner));
21*f6dc9357SAndroid Build Coastguard Worker return m_Open;
22*f6dc9357SAndroid Build Coastguard Worker }
23*f6dc9357SAndroid Build Coastguard Worker
Close()24*f6dc9357SAndroid Build Coastguard Worker bool CClipboard::Close() throw()
25*f6dc9357SAndroid Build Coastguard Worker {
26*f6dc9357SAndroid Build Coastguard Worker if (!m_Open)
27*f6dc9357SAndroid Build Coastguard Worker return true;
28*f6dc9357SAndroid Build Coastguard Worker m_Open = !BOOLToBool(CloseClipboard());
29*f6dc9357SAndroid Build Coastguard Worker return !m_Open;
30*f6dc9357SAndroid Build Coastguard Worker }
31*f6dc9357SAndroid Build Coastguard Worker
ClipboardIsFormatAvailableHDROP()32*f6dc9357SAndroid Build Coastguard Worker bool ClipboardIsFormatAvailableHDROP()
33*f6dc9357SAndroid Build Coastguard Worker {
34*f6dc9357SAndroid Build Coastguard Worker return BOOLToBool(IsClipboardFormatAvailable(CF_HDROP));
35*f6dc9357SAndroid Build Coastguard Worker }
36*f6dc9357SAndroid Build Coastguard Worker
37*f6dc9357SAndroid Build Coastguard Worker /*
38*f6dc9357SAndroid Build Coastguard Worker bool ClipboardGetTextString(AString &s)
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker s.Empty();
41*f6dc9357SAndroid Build Coastguard Worker if (!IsClipboardFormatAvailable(CF_TEXT))
42*f6dc9357SAndroid Build Coastguard Worker return false;
43*f6dc9357SAndroid Build Coastguard Worker CClipboard clipboard;
44*f6dc9357SAndroid Build Coastguard Worker
45*f6dc9357SAndroid Build Coastguard Worker if (!clipboard.Open(NULL))
46*f6dc9357SAndroid Build Coastguard Worker return false;
47*f6dc9357SAndroid Build Coastguard Worker
48*f6dc9357SAndroid Build Coastguard Worker HGLOBAL h = ::GetClipboardData(CF_TEXT);
49*f6dc9357SAndroid Build Coastguard Worker if (h != NULL)
50*f6dc9357SAndroid Build Coastguard Worker {
51*f6dc9357SAndroid Build Coastguard Worker NMemory::CGlobalLock globalLock(h);
52*f6dc9357SAndroid Build Coastguard Worker const char *p = (const char *)globalLock.GetPointer();
53*f6dc9357SAndroid Build Coastguard Worker if (p != NULL)
54*f6dc9357SAndroid Build Coastguard Worker {
55*f6dc9357SAndroid Build Coastguard Worker s = p;
56*f6dc9357SAndroid Build Coastguard Worker return true;
57*f6dc9357SAndroid Build Coastguard Worker }
58*f6dc9357SAndroid Build Coastguard Worker }
59*f6dc9357SAndroid Build Coastguard Worker return false;
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker */
62*f6dc9357SAndroid Build Coastguard Worker
63*f6dc9357SAndroid Build Coastguard Worker /*
64*f6dc9357SAndroid Build Coastguard Worker bool ClipboardGetFileNames(UStringVector &names)
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker names.Clear();
67*f6dc9357SAndroid Build Coastguard Worker if (!IsClipboardFormatAvailable(CF_HDROP))
68*f6dc9357SAndroid Build Coastguard Worker return false;
69*f6dc9357SAndroid Build Coastguard Worker CClipboard clipboard;
70*f6dc9357SAndroid Build Coastguard Worker
71*f6dc9357SAndroid Build Coastguard Worker if (!clipboard.Open(NULL))
72*f6dc9357SAndroid Build Coastguard Worker return false;
73*f6dc9357SAndroid Build Coastguard Worker
74*f6dc9357SAndroid Build Coastguard Worker HGLOBAL h = ::GetClipboardData(CF_HDROP);
75*f6dc9357SAndroid Build Coastguard Worker if (h != NULL)
76*f6dc9357SAndroid Build Coastguard Worker {
77*f6dc9357SAndroid Build Coastguard Worker NMemory::CGlobalLock globalLock(h);
78*f6dc9357SAndroid Build Coastguard Worker void *p = (void *)globalLock.GetPointer();
79*f6dc9357SAndroid Build Coastguard Worker if (p != NULL)
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker NShell::CDrop drop(false);
82*f6dc9357SAndroid Build Coastguard Worker drop.Attach((HDROP)p);
83*f6dc9357SAndroid Build Coastguard Worker drop.QueryFileNames(names);
84*f6dc9357SAndroid Build Coastguard Worker return true;
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker return false;
88*f6dc9357SAndroid Build Coastguard Worker }
89*f6dc9357SAndroid Build Coastguard Worker */
90*f6dc9357SAndroid Build Coastguard Worker
ClipboardSetData(UINT uFormat,const void * data,size_t size)91*f6dc9357SAndroid Build Coastguard Worker static bool ClipboardSetData(UINT uFormat, const void *data, size_t size) throw()
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker NMemory::CGlobal global;
94*f6dc9357SAndroid Build Coastguard Worker if (!global.Alloc(GMEM_DDESHARE | GMEM_MOVEABLE, size))
95*f6dc9357SAndroid Build Coastguard Worker return false;
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker NMemory::CGlobalLock globalLock(global);
98*f6dc9357SAndroid Build Coastguard Worker LPVOID p = globalLock.GetPointer();
99*f6dc9357SAndroid Build Coastguard Worker if (!p)
100*f6dc9357SAndroid Build Coastguard Worker return false;
101*f6dc9357SAndroid Build Coastguard Worker memcpy(p, data, size);
102*f6dc9357SAndroid Build Coastguard Worker }
103*f6dc9357SAndroid Build Coastguard Worker if (::SetClipboardData(uFormat, global) == NULL)
104*f6dc9357SAndroid Build Coastguard Worker return false;
105*f6dc9357SAndroid Build Coastguard Worker global.Detach();
106*f6dc9357SAndroid Build Coastguard Worker return true;
107*f6dc9357SAndroid Build Coastguard Worker }
108*f6dc9357SAndroid Build Coastguard Worker
ClipboardSetText(HWND owner,const UString & s)109*f6dc9357SAndroid Build Coastguard Worker bool ClipboardSetText(HWND owner, const UString &s)
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker CClipboard clipboard;
112*f6dc9357SAndroid Build Coastguard Worker if (!clipboard.Open(owner))
113*f6dc9357SAndroid Build Coastguard Worker return false;
114*f6dc9357SAndroid Build Coastguard Worker if (!::EmptyClipboard())
115*f6dc9357SAndroid Build Coastguard Worker return false;
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker bool res;
118*f6dc9357SAndroid Build Coastguard Worker res = ClipboardSetData(CF_UNICODETEXT, (const wchar_t *)s, (s.Len() + 1) * sizeof(wchar_t));
119*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
120*f6dc9357SAndroid Build Coastguard Worker AString a (UnicodeStringToMultiByte(s, CP_ACP));
121*f6dc9357SAndroid Build Coastguard Worker if (ClipboardSetData(CF_TEXT, (const char *)a, (a.Len() + 1) * sizeof(char)))
122*f6dc9357SAndroid Build Coastguard Worker res = true;
123*f6dc9357SAndroid Build Coastguard Worker a = UnicodeStringToMultiByte(s, CP_OEMCP);
124*f6dc9357SAndroid Build Coastguard Worker if (ClipboardSetData(CF_OEMTEXT, (const char *)a, (a.Len() + 1) * sizeof(char)))
125*f6dc9357SAndroid Build Coastguard Worker res = true;
126*f6dc9357SAndroid Build Coastguard Worker #endif
127*f6dc9357SAndroid Build Coastguard Worker return res;
128*f6dc9357SAndroid Build Coastguard Worker }
129*f6dc9357SAndroid Build Coastguard Worker
130*f6dc9357SAndroid Build Coastguard Worker }
131