e13348a9ebef67a97740f0e5a28083b5975616c8
[reactos.git] / base / applications / clipbrd / cliputils.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Clipboard Viewer
4 * FILE: base/applications/clipbrd/cliputils.c
5 * PURPOSE: Clipboard helper functions.
6 * PROGRAMMERS: Ricardo Hanke
7 */
8
9 #include "precomp.h"
10
11 static int
12 GetPredefinedClipboardFormatName(HINSTANCE hInstance,
13 UINT uFormat,
14 BOOL Unicode,
15 PVOID lpszFormat,
16 UINT cch)
17 {
18 static
19 struct FORMAT_NAME
20 {
21 UINT uFormat;
22 UINT uResID;
23 } uFormatList[] = {
24 /* Table sorted in increasing order of CF_xxx values, please keep it this way! */
25 {CF_TEXT , STRING_CF_TEXT }, // 1
26 {CF_BITMAP , STRING_CF_BITMAP }, // 2
27 {CF_METAFILEPICT, STRING_CF_METAFILEPICT}, // 3
28 {CF_SYLK , STRING_CF_SYLK }, // 4
29 {CF_DIF , STRING_CF_DIF }, // 5
30 {CF_TIFF , 0/*STRING_CF_TIFF*/ }, // 6
31 {CF_OEMTEXT , STRING_CF_OEMTEXT }, // 7
32 {CF_DIB , STRING_CF_DIB }, // 8
33 {CF_PALETTE , STRING_CF_PALETTE }, // 9
34 {CF_PENDATA , 0/*STRING_CF_PENDATA*/ }, // 10
35 {CF_RIFF , 0/*STRING_CF_RIFF*/ }, // 11
36 {CF_WAVE , 0/*STRING_CF_WAVE*/ }, // 12
37 {CF_UNICODETEXT , STRING_CF_UNICODETEXT }, // 13
38 {CF_ENHMETAFILE , STRING_CF_ENHMETAFILE }, // 14
39 #if(WINVER >= 0x0400)
40 {CF_HDROP , STRING_CF_HDROP }, // 15
41 {CF_LOCALE , STRING_CF_LOCALE }, // 16
42 #endif
43 #if(WINVER >= 0x0500)
44 {CF_DIBV5 , STRING_CF_DIBV5 }, // 17
45 #endif
46 };
47
48 switch (uFormat)
49 {
50 case CF_TEXT: case CF_BITMAP: case CF_METAFILEPICT:
51 case CF_SYLK: case CF_DIF: // case CF_TIFF:
52 case CF_OEMTEXT: case CF_DIB: case CF_PALETTE:
53 // case CF_PENDATA: // case CF_RIFF: // case CF_WAVE:
54 case CF_UNICODETEXT: case CF_ENHMETAFILE:
55 #if(WINVER >= 0x0400)
56 case CF_HDROP: case CF_LOCALE:
57 #endif
58 #if(WINVER >= 0x0500)
59 case CF_DIBV5:
60 #endif
61 {
62 if (Unicode)
63 return LoadStringW(hInstance, uFormatList[uFormat-1].uResID, (LPWSTR)lpszFormat, cch);
64 else
65 return LoadStringA(hInstance, uFormatList[uFormat-1].uResID, (LPSTR)lpszFormat, cch);
66 }
67
68 default:
69 {
70 return 0;
71 }
72 }
73 }
74
75 void
76 RetrieveClipboardFormatName(HINSTANCE hInstance,
77 UINT uFormat,
78 BOOL Unicode,
79 PVOID lpszFormat,
80 UINT cch)
81 {
82 if (!GetPredefinedClipboardFormatName(hInstance, uFormat, Unicode, lpszFormat, cch))
83 {
84 if (Unicode)
85 {
86 if (!GetClipboardFormatNameW(uFormat, (LPWSTR)lpszFormat, cch))
87 LoadStringW(hInstance, STRING_CF_UNKNOWN, (LPWSTR)lpszFormat, cch);
88 }
89 else
90 {
91 if (!GetClipboardFormatNameA(uFormat, (LPSTR)lpszFormat, cch))
92 LoadStringA(hInstance, STRING_CF_UNKNOWN, (LPSTR)lpszFormat, cch);
93 }
94 }
95 }
96
97 void DeleteClipboardContent(void)
98 {
99 if (!OpenClipboard(Globals.hMainWnd))
100 {
101 ShowLastWin32Error(Globals.hMainWnd);
102 return;
103 }
104
105 if (!EmptyClipboard())
106 {
107 ShowLastWin32Error(Globals.hMainWnd);
108 }
109
110 CloseClipboard();
111 }
112
113 UINT GetAutomaticClipboardFormat(void)
114 {
115 static UINT uFormatList[] = {
116 CF_UNICODETEXT,
117 CF_ENHMETAFILE,
118 CF_METAFILEPICT,
119 CF_DIBV5,
120 CF_DIB,
121 CF_BITMAP
122 };
123
124 return GetPriorityClipboardFormat(uFormatList, ARRAYSIZE(uFormatList));
125 }
126
127 BOOL IsClipboardFormatSupported(UINT uFormat)
128 {
129 switch (uFormat)
130 {
131 case CF_UNICODETEXT:
132 case CF_BITMAP:
133 case CF_ENHMETAFILE:
134 case CF_METAFILEPICT:
135 case CF_DIB:
136 case CF_DIBV5:
137 {
138 return TRUE;
139 }
140
141 default:
142 {
143 return FALSE;
144 }
145 }
146 }