summaryrefslogtreecommitdiff
path: root/plugins/ExternalAPI/m_text.h
blob: 0099be9a77451929956929ca06c00c0f44bad137 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
#ifndef __mtext_h__
#define __mtext_h__

// NEW mtextcontrol interface:
//
// obtain the full mtextcontrol interface from the library. it is much faster as use of 
// miranda core CallService to access to mtextcontrol (no core traffic).
// This interface provides full access to mtextcontrol internal functions,
// thus enabling devs to fully utilize the mtextcontrol API.
// All functions will be exported as miranda services for compatibility.
//
// the interface is populated during the Load(PLUGINLINK *link) handler, so you can assume it is ready when Miranda
// throw the ME_SYSTEM_MODULESLOADED event and you can generate a warning in your ModulesLoaded() when
// it depends on the mtextcontrol interface and the mtextcontrol plugin is missing.
// 
// example:
// 
// MTEXT_INTERFACE MText = {0};
// 
// 	mir_getMTI(&MText);
// 
// all interface function designed as old mtextcontrol helper functions.
// therefore it is easy to convert your old plugin code to new interface.
//
// example:
//
// old code: MTextCreate (...
// new code: MText.Create(...

// Text control
#define MTEXTCONTROLCLASS "MTextControl"
#define MTM_SETUSER WM_USER
#define MTM_UPDATE  WM_USER+1

#if defined(_WIN32) || defined(__WIN32__)
	#define DLL_CALLCONV __stdcall
#endif 

typedef struct _tagMTEXT_interface {
	size_t	cbSize;
	DWORD	version;
	HANDLE	(DLL_CALLCONV *Register)	(const char *userTitle, DWORD options);
	HANDLE	(DLL_CALLCONV *Create)		(HANDLE userHandle, TCHAR *text);
	HANDLE	(DLL_CALLCONV *CreateEx)	(HANDLE userHandle, void *text, DWORD flags);
	int		(DLL_CALLCONV *Measure)		(HDC dc, SIZE *sz, HANDLE text);
	int		(DLL_CALLCONV *Display)		(HDC dc, POINT pos, SIZE sz, HANDLE text);
	int		(DLL_CALLCONV *SetParent)	(HANDLE text, HWND hwnd, RECT rect);
	int		(DLL_CALLCONV *SendMsg)		(HWND hwnd, HANDLE text, UINT msg, WPARAM wParam, LPARAM lParam);
	HWND	(DLL_CALLCONV *CreateProxy)	(HANDLE text);
	int		(DLL_CALLCONV *Destroy)		(HANDLE text);
} MTEXT_INTERFACE;

// get access to the interface
// wParam = 0
// lParam = (LPARAM)(MTEXT_INTERFACE*)Mtext
// dont vorget to set cbSize before call service
#define MS_TEXT_GETINTERFACE "MText/GetInterface"

__forceinline INT_PTR mir_getMTI( MTEXT_INTERFACE* dest )
{
	dest->cbSize = sizeof(*dest);
	INT_PTR result = CallService(MS_TEXT_GETINTERFACE, 0, (LPARAM)dest);
	return result;
}

enum
{
	// visual text options, used in MS_TEXT_REGISTER
	MTEXT_FANCY_SMILEYS   = 0x00000010, // SmileyAdd smileys
	MTEXT_FANCY_BBCODES   = 0x00000020, // [b], [u], [i]
	MTEXT_FANCY_MATHMOD   = 0x00000040, // enable math module formula parsing
	MTEXT_FANCY_URLS      = 0x00000080, // underline urls
	MTEXT_FANCY_BBCODES2  = 0x00000100, // [color], [img], [url], not implemented yet
	MTEXT_FANCY_SIMPLEFMT = 0x00000200, // simple formatting ("_", "/" and "*")
	MTEXT_FANCY_MASK      = 0x00007fff,
	MTEXT_FANCY_DEFAULT   = 0x00008000, // Use default options

	// text options, used in MS_TEXT_REGISTER
	MTEXT_SYSTEM_HICONS   = 0x00010000, // [$handle=i<HICON as dword>$]
	MTEXT_SYSTEM_HBITMAPS = 0x00010000, // [$handle=b<HBITMAP as dword>$], not implemented yet
	MTEXT_SYSTEM_ESCAPED  = 0x00020000, // passed text is escaped with slashes, not implemented yet
	MTEXT_SYSTEM_MASK     = 0x7fff0000,
	MTEXT_SYSTEM_DEFAULT  = 0x80000000,  // Use default option -- just nothing system is used :)

	// text object flags
	MTEXT_FLG_CHAR        = 0x00000000,
	MTEXT_FLG_WCHAR       = 0x00000001,
	MTEXT_FLG_BIDI_RTL    = 0x00000002
};

#if defined(UNICODE) || defined (_UNICODE)
	#define MTEXT_FLG_TCHAR MTEXT_FLG_WCHAR
#else
	#define MTEXT_FLG_TCHAR MTEXT_FLG_CHAR
#endif

// used in MS_TEXT_CREATEEX
typedef struct tagMTEXTCREATE
{
	DWORD cbSize;
	MCONTACT hContact;
	void *text; // this is 'char *' or 'WCHAR *'
	DWORD flags;

	#ifdef __cplusplus
		tagMTEXTCREATE():
			text(nullptr), hContact(0), flags(0)
			{
				cbSize = sizeof(*this);
			}
	#endif
} MTEXTCREATE, *LPMTEXTCREATE;

// used in MS_TEXT_MEASURE and MS_TEXT_DISPLAY
typedef struct tagMTEXTDISPLAY
{
	DWORD cbSize;
	HDC dc;
	POINT pos;
	SIZE sz;
	HANDLE text;

	#ifdef __cplusplus
		tagMTEXTDISPLAY():
			dc(nullptr), text(nullptr)
			{
				cbSize = sizeof(*this);
				pos.x = pos.y = 0;
				sz.cx = sz.cy = 0;
			}
	#endif
} MTEXTDISPLAY, *LPMTEXTDISPLAY;

// used in MS_TEXT_SETPARENT
typedef struct tagMTEXTSETPARENT
{
	HANDLE text;
	HWND hwnd;
	RECT rc;

	#ifdef __cplusplus
		tagMTEXTSETPARENT():
			hwnd(nullptr), text(nullptr)
			{
			}
	#endif
} MTEXTSETPARENT, *LPMTEXTSETPARENT;

// used in MS_TEXT_SENDMESSAGE
typedef struct tagMTEXTMESSAGE
{
	HWND hwnd;
	HANDLE text;
	UINT msg;
	WPARAM wParam;
	LPARAM lParam;

	#ifdef __cplusplus
		tagMTEXTMESSAGE():
			hwnd(nullptr), text(nullptr), msg(0), wParam(0), lParam(0)
			{
			}
	#endif
} MTEXTMESSAGE, *LPMTEXTMESSAGE;

//---------------------------------------------------------------------------
// deprecatet service and helper functions
// replaced by new mtext interface !!!!!!!
//---------------------------------------------------------------------------
#if defined(NOHELPERS) || defined(MIRANDA_NOHELPERS)
	#define MTEXT_NOHELPERS
#endif

// subscribe to MText services
// wParam = (WPARAM)(DOWRD)defaultOptions
// lParam = (LPARAM)(char *)userTitle
// result = (LRESULT)(HANDLE)userHandle
#define MS_TEXT_REGISTER "MText/Register"

#ifndef MTEXT_NOHELPERS
__inline HANDLE MTextRegister(const char *userTitle, DWORD options)
{
	return (HANDLE)CallService(MS_TEXT_REGISTER, (WPARAM)options, (LPARAM)userTitle);
}
#endif // MTEXT_NOHELPERS

// allocate text object (unicode)
// wParam = (WPARAM)(HANDLE)userHandle
// lParam = (LPARAM)(WCHAR *)text
// result = (LRESULT)(HANDLE)textHandle
#define MS_TEXT_CREATEW "MText/CreateW"

#ifndef MTEXT_NOHELPERS
__inline HANDLE MTextCreateW(HANDLE userHandle, WCHAR *text)
{
	return (HANDLE)CallService(MS_TEXT_CREATEW, (WPARAM)userHandle, (LPARAM)text);
}
#endif // MTEXT_NOHELPERS

// allocate text object (advanced)
// wParam = (WPARAM)(HANDLE)userHandle
// lParam = (LPARAM)(LPMTEXTCREATE)createInfo
// result = (LRESULT)(HANDLE)textHandle
#define MS_TEXT_CREATEEX "MText/CreateEx"

#ifndef MTEXT_NOHELPERS
__inline HANDLE MTextCreateEx(HANDLE userHandle, MCONTACT hContact, void *text, DWORD flags)
{
	#ifdef __cplusplus
		MTEXTCREATE textCreate;
	#else
		MTEXTCREATE textCreate = {0};
		textCreate.cbSize = sizeof(textCreate);
	#endif
	textCreate.hContact = hContact;
	textCreate.text = text;
	textCreate.flags = flags;
	return (HANDLE)CallService(MS_TEXT_CREATEEX, (WPARAM)userHandle, (LPARAM)&textCreate);
}
#endif // MTEXT_NOHELPERS

// measure text object
// wParam = (LPARAM)(LPMTEXTDISPLAY)displayInfo
// result = 1 (success), 0 (failure)
// displayInfo->size.cx is interpreted as maximum width allowed.
// wrapped text size is stored in displayInfo->size, text
#define MS_TEXT_MEASURE "MText/Measure"

#ifndef MTEXT_NOHELPERS
__inline int MTextMeasure(HDC dc, SIZE *sz, HANDLE text)
{
	#ifdef __cplusplus
		MTEXTDISPLAY displayInfo;
	#else
		MTEXTDISPLAY displayInfo = {0};
		displayInfo.cbSize = sizeof(displayInfo);
	#endif
	displayInfo.dc = dc;
	displayInfo.pos.x = displayInfo.pos.y = 0;
	displayInfo.sz = *sz;
	displayInfo.text = text;
	int result = (int)CallService(MS_TEXT_MEASURE, (WPARAM)&displayInfo, 0);
	*sz = displayInfo.sz;
	return result;
}
#endif // MTEXT_NOHELPERS

// display text object
// wParam = (LPARAM)(LPMTEXTDISPLAY)displayInfo
// result = 1 (success), 0 (failure)
#define MS_TEXT_DISPLAY "MText/Display"

#ifndef MTEXT_NOHELPERS
__inline int MTextDisplay(HDC dc, POINT pos, SIZE sz, HANDLE text)
{
	#ifdef __cplusplus
		MTEXTDISPLAY displayInfo;
	#else
		MTEXTDISPLAY displayInfo = {0};
		displayInfo.cbSize = sizeof(displayInfo);
	#endif
	displayInfo.dc = dc;
	displayInfo.pos = pos;
	displayInfo.sz = sz;
	displayInfo.text = text;
	return (int)CallService(MS_TEXT_DISPLAY, (WPARAM)&displayInfo, 0);
}
#endif // MTEXT_NOHELPERS

// set parent window for text object (this is required for mouse handling, etc)
// wParam = (WPARAM)(LPMTEXTSETPARENT)info
// result = message result
#define MS_TEXT_SETPARENT "MText/SetParent"

#ifndef MTEXT_NOHELPERS
__inline int MTextSetParent(HANDLE text, HWND hwnd, RECT rect)
{
	MTEXTSETPARENT info;
	info.text = text;
	info.hwnd = hwnd;
	info.rc = rect;
	return (int)CallService(MS_TEXT_SETPARENT, (WPARAM)&info, 0);
}
#endif // MTEXT_NOHELPERS

// send message to an object
// wParam = (WPARAM)(LPMTEXTMESSAGE)message
// result = message result
#define MS_TEXT_SENDMESSAGE "MText/SendMessage"

#ifndef MTEXT_NOHELPERS
__inline int MTextSendMessage(HWND hwnd, HANDLE text, UINT msg, WPARAM wParam, LPARAM lParam)
{
	#ifdef __cplusplus
		MTEXTMESSAGE message;
	#else
		MTEXTMESSAGE message = {0};
	#endif
	message.hwnd = hwnd;
	message.text = text;
	message.msg = msg;
	message.wParam = wParam;
	message.lParam = lParam;
	return (int)CallService(MS_TEXT_SENDMESSAGE, (WPARAM)&message, 0);
}
#endif // MTEXT_NOHELPERS

// create a proxy window
// wParam = (LPARAM)(HANDLE)textHandle
#define MS_TEXT_CREATEPROXY "MText/CreateProxy"

#ifndef MTEXT_NOHELPERS
__inline HWND MTextCreateProxy(HANDLE text)
{
	return (HWND)CallService(MS_TEXT_CREATEPROXY, (WPARAM)text, 0);
}
#endif // MTEXT_NOHELPERS

// destroy text object
// wParam = (LPARAM)(HANDLE)textHandle
#define MS_TEXT_DESTROY "MText/Destroy"

#ifndef MTEXT_NOHELPERS
__inline int MTextDestroy(HANDLE text)
{
	return (int)CallService(MS_TEXT_DESTROY, (WPARAM)text, 0);
}
#endif // MTEXT_NOHELPERS

//#define MS_TEXT_QDISPLAY "MText/QDisplay"
//#define MS_TEXT_QDISPLAYW "MText/QDisplayW"

// T-definitions for unicode
#if defined(UNICODE) || defined (_UNICODE)
	#define MS_TEXT_CREATET MS_TEXT_CREATEW
	#ifndef MTEXT_NOHELPERS
		#define MTextCreateT MTextCreateW
	#endif
#else
	#define MS_TEXT_CREATET MS_TEXT_CREATE
	#ifndef MTEXT_NOHELPERS
		#define MTextCreateT MTextCreate
	#endif
#endif

#endif // __mtext_h__