root/trunk/import/htmlayout/events.d

Revision 24, 15.1 kB (checked in by yidabu, 1 year ago)

some changes for works with tango 0.99.9, dmd 1.056

Line 
1 module htmlayout.events;
2
3 import htmlayout.htmlayout;
4 import htmlayout.element;
5 import tango.core.Traits;
6 import tango.stdc.stringz;
7 import tango.text.convert.Utf;
8 import Int=tango.text.convert.Integer;
9 import tango.sys.win32.Types;
10
11 /*class MultiHandlers(EVENTYPE=uint,RETURNTYPE=bool,DELEGATE...)
12 {
13     struct HANDLER
14     {
15         RETURNTYPE delegate(DELEGATE,Object) dg;
16         Object param;
17     }
18
19     bool add(EVENTYPE event,RETURNTYPE delegate(DELEGATE,Object) dg,Object param=null)
20     {
21         if(!dg) return false;
22         auto a=event in handlers;
23         if(a) *a~=HANDLER(dg,param);
24         else handlers[event]=[HANDLER(dg,param)];
25         return true;
26     }
27
28     void del(EVENTYPE event){handlers.remove(event);}
29
30     bool del(EVENTYPE event,RETURNTYPE delegate(DELEGATE,Object) dg)
31     {
32         if(!dg) return false;
33         auto a=event in handlers;
34         if(a)
35         {
36             foreach(i,d;*a)
37             {
38                 if(d.dg is dg)
39                 {
40                     if((*a).length==1) handlers.remove(event);
41                     else
42                     {
43                         if(i==0) *a=(*a)[1..$];
44                         else if(i==(*a).length-1) *a=(*a)[0..i];
45                         else *a=(*a)[0..i]~(*a)[i+1..$];
46                         return true;
47                     }
48                 }
49             }
50         }
51         return false;
52     }
53
54     bool toggle(EVENTYPE event,RETURNTYPE delegate(DELEGATE,Object) dg)
55     {
56         if(!del(event,dg)) return add(event,dg);
57     }
58
59     bool call(EVENTYPE event,DELEGATE data)
60     {
61         auto a=event in handlers;
62         if(a)
63         {
64             static if(is(RETURNTYPE == void)) foreach(d;*a)
65             {
66                 static if(data.length)
67                 {
68                     data[0].param=d.param;
69                     scope(exit) data[0].param=null;
70                 }
71                 d.dg(data);
72             }
73             else foreach(d;*a)
74             {
75                 static if(data.length)
76                 {
77                     data[0].param=d.param;
78                     scope(exit) data[0].param=null;
79                 }
80                 if(d.dg(data)) return true;
81             }
82         }
83         return false;
84     }
85
86     bool canHandle(EVENTYPE event){return (event in handlers) !is null;}
87
88 //protected:
89     HANDLER[][EVENTYPE] handlers;
90 }*/
91
92 class Handlers(RETURNTYPE=bool,DATA...)
93 {
94     struct HANDLER
95     {
96         RETURNTYPE delegate(DATA) dg;
97         Object param;
98     }
99
100     bool add(RETURNTYPE delegate(DATA) dg,Object param=null)
101     {
102         if(!dg) return false;
103         handlers~=HANDLER(dg,param);
104         return true;
105     }
106
107     void del(){delete handlers; handlers=null;}
108
109     bool del(RETURNTYPE delegate(DATA) dg)
110     {
111         if(!dg) return false;
112         return flowerd.common.Array.remove(handlers,delegate(HANDLER h){return h.dg is dg;})>0;
113     }
114
115     bool toggle(RETURNTYPE delegate(DATA) dg)
116     {
117         if(!del(dg)) return add(dg);
118         return false;
119     }
120
121     bool call(DATA data)
122     {
123         static if(is(RETURNTYPE == void)) foreach(d;handlers)
124         {
125             static if(data.length)
126             {
127                 data[0].param=d.param;
128                 scope(exit) data[0].param=null;
129             }
130             d.dg(data);
131         }
132         else foreach(d;handlers)
133         {
134             static if(data.length)
135             {
136                 data[0].param=d.param;
137                 scope(exit) data[0].param=null;
138             }
139             if(d.dg(data)) return true;
140         }
141         return false;
142     }
143
144 //protected:
145     HANDLER[] handlers;
146 }
147
148 template EVENT_HANDLER_STRING1(char[] RETURNTYPE,char[] NAME,char[] TYPE,char[] EVENT)
149 {
150     const EVENT_HANDLER_STRING1 =
151
152     RETURNTYPE~" on"~NAME~"("~TYPE~" ev) {return  dg"~NAME~".call(ev);}"~
153     "alias Handlers!("~RETURNTYPE~","~TYPE~") dg"~NAME~"_t;"~
154     "protected dg"~NAME~"_t mdg"~NAME~";"~
155     "dg"~NAME~"_t dg"~NAME~"(){if(mdg"~NAME~" is null) mdg"~NAME~"=new dg"~NAME~"_t; return mdg"~NAME~";}";
156 }
157
158 abstract class HEventHandler
159 {
160     mixin(EVENT_HANDLER_STRING1!("bool","Init","HInitialization","HANDLE_INITIALIZATION"));
161     mixin(EVENT_HANDLER_STRING1!("bool","Mouse","HMouse","HANDLE_MOUSE"));
162     mixin(EVENT_HANDLER_STRING1!("bool","Key","HKey","HANDLE_KEY"));
163     mixin(EVENT_HANDLER_STRING1!("bool","Focus","HFocus","HANDLE_FOCUS"));
164     mixin(EVENT_HANDLER_STRING1!("bool","Draw","HDraw","HANDLE_DRAW"));
165     mixin(EVENT_HANDLER_STRING1!("bool","BehaviorEvent","HBehaviorEvent","HANDLE_BEHAVIOR_EVENT"));
166     mixin(EVENT_HANDLER_STRING1!("bool","MethodCall","HMethod","HANDLE_METHOD_CALL"));
167     mixin(EVENT_HANDLER_STRING1!("bool","DataArrived","HDataArrived","HANDLE_DATA_ARRIVED"));
168     mixin(EVENT_HANDLER_STRING1!("void","Size","HSize","HANDLE_SIZE"));
169     mixin(EVENT_HANDLER_STRING1!("bool","Timer","HTimer","HANDLE_TIMER"));
170     mixin(EVENT_HANDLER_STRING1!("bool","Scroll","HScroll","HANDLE_SCROLL"));
171
172     this(uint events=DISABLE_INITIALIZATION)
173     {
174         mHandlers[mTag=++mLastId]=this;
175         mEvents=events;
176     }
177
178     bool dispatch(HELEMENT target,UINT event,LPVOID params)
179     {
180         if(event==HANDLE_INITIALIZATION){return onInit(HInitialization(target,cast(INITIALIZATION_PARAMS*)params));}
181         else if(event==HANDLE_MOUSE){return onMouse(HMouse(target,cast(MOUSE_PARAMS*)params));}
182         else if(event==HANDLE_KEY){return onKey(HKey(target,cast(KEY_PARAMS*)params));}
183         else if(event==HANDLE_FOCUS){return onFocus(HFocus(target,cast(FOCUS_PARAMS*)params));}
184         else if(event==HANDLE_DRAW){return onDraw(HDraw(target,cast(DRAW_PARAMS*)params));}
185         else if(event==HANDLE_TIMER){return onTimer(HTimer(target));}
186         else if(event==HANDLE_BEHAVIOR_EVENT){return onBehaviorEvent(HBehaviorEvent(target,cast(BEHAVIOR_EVENT_PARAMS*)params));}
187         else if(event==HANDLE_METHOD_CALL){return onMethodCall(HMethod(target,cast(METHOD_PARAMS*)params));}
188         else if(event==HANDLE_DATA_ARRIVED){return onDataArrived(HDataArrived(target,cast(DATA_ARRIVED_PARAMS*)params));}
189         else if(event==HANDLE_SIZE){onSize(HSize(target));return false;}
190         else if(event==HANDLE_SCROLL){return onScroll(HScroll(target,cast(SCROLL_PARAMS*)params));}
191         else throw new Exception("Error handling behavior event");
192         return false;
193     }
194
195     static HEventHandler find(void* tag)
196     {
197         auto h=cast(uint)tag in mHandlers;
198         if(h) return *h;
199         else return null;
200     }
201
202     uint events(){return mEvents;}
203     void* htag(){return cast(void*)mTag;}
204     ElementEventProc callback(){return &mHandler;}
205
206 protected:
207
208     static uint mLastId;
209     uint mTag,mEvents;
210
211     static HEventHandler[uint] mHandlers;
212
213     extern(Windows) static BOOL mHandler(LPVOID tag, HELEMENT he, UINT event, LPVOID params )
214     {
215         auto l=find(tag);
216         if(l) return l.dispatch(he,event,params);
217         return false;
218     }
219 }
220
221 template EVENT_HANDLER_STRING2(char[] NAME,char[] EVENT)
222 {
223     const EVENT_HANDLER_STRING2 =
224
225     "bool handleEvent(ReturnTypeOf!(on"~NAME~") delegate(ParameterTupleOf!(on"~NAME~")) dg,Object param=null){if(handleEvent("~EVENT~")) return dg"~NAME~".add(dg,param); else return false;}"~
226     "bool unhandleEvent(ReturnTypeOf!(on"~NAME~") delegate(ParameterTupleOf!(on"~NAME~")) dg){return dg"~NAME~".del(dg);}";
227 }
228
229 abstract class HEventHandler2 : HEventHandler
230 {
231     mixin(EVENT_HANDLER_STRING2!("Init","HANDLE_INITIALIZATION"));
232     mixin(EVENT_HANDLER_STRING2!("Mouse","HANDLE_MOUSE"));
233     mixin(EVENT_HANDLER_STRING2!("Key","HANDLE_KEY"));
234     mixin(EVENT_HANDLER_STRING2!("Focus","HANDLE_FOCUS"));
235     mixin(EVENT_HANDLER_STRING2!("Draw","HANDLE_DRAW"));
236     mixin(EVENT_HANDLER_STRING2!("BehaviorEvent","HANDLE_BEHAVIOR_EVENT"));
237     mixin(EVENT_HANDLER_STRING2!("MethodCall","HANDLE_METHOD_CALL"));
238     mixin(EVENT_HANDLER_STRING2!("DataArrived","HANDLE_DATA_ARRIVED"));
239     mixin(EVENT_HANDLER_STRING2!("Size","HANDLE_SIZE"));
240     mixin(EVENT_HANDLER_STRING2!("Timer","HANDLE_TIMER"));
241     mixin(EVENT_HANDLER_STRING2!("Scroll","HANDLE_SCROLL"));
242
243     protected uint mSubscriptions;
244     bool _handleEvent(UINT subscription){return false;}
245     bool handleEvent(UINT subscription,bool force=false)
246     {
247         if(!force && mSubscriptions&subscription) return true;
248         else
249         {
250             if(_handleEvent(subscription))
251             {
252                 mSubscriptions|=subscription;
253                 return true;
254             }
255         }
256         return false;
257     }
258
259     bool _unhandleEvents(){return false;}
260
261     bool unhandleEvents(bool removehandlers=true)
262     {
263         if(_unhandleEvents())
264         {
265             if(removehandlers)
266             {
267                 dgInit.del();
268                 dgMouse.del();
269                 dgKey.del();
270                 dgFocus.del();
271                 dgDraw.del();
272                 dgBehaviorEvent.del();
273                 dgMethodCall.del();
274                 dgDataArrived.del();
275                 dgSize.del();
276                 dgTimer.del();
277                 dgScroll.del();
278             }
279             return true;
280         }
281         else return false;
282     }
283 }
284
285 abstract class HBehavior : HEventHandler
286 {
287     this(char[] name,uint events=DISABLE_INITIALIZATION)
288     {
289         if(name.length==0) throw new Exception("Missing behavior name");
290         super(events);
291         mBehaviors[mName=name]=this;
292     }
293
294     void reset(){}
295
296     static void resetAll() {foreach(b;mBehaviors) b.reset();}
297
298     final static HBehavior find(char[] name)
299     {
300         auto h=name in mBehaviors;
301         if(h) return *h;
302         else return null;
303     }
304
305     char[] name(){return mName;}
306
307 private:
308     char[] mName;
309     static HBehavior[char[]] mBehaviors;
310 }
311
312 struct HLoadData
313 {
314     LPNMHL_LOAD_DATA event;
315     Object param;
316
317     HElement Element;
318     char[] uri(){return .toString(fromString16z(event.uri));}
319     uint type(){return event.dataType;}
320     HElement element(){if(Element) return Element; else return Element=new HElement(event.principal);}
321 }
322
323 struct HDataLoaded
324 {
325     LPNMHL_DATA_LOADED event;
326     Object param;
327
328     char[] uri(){return .toString(fromString16z(event.uri));}
329     char[] data(){return cast(char[])event.data[0..event.dataSize];}
330     uint type(){return event.dataType;}
331     uint status(){return event.status;}
332 }
333
334 struct HCreateControl
335 {
336     LPNMHL_CREATE_CONTROL event;
337     Object param;
338
339     HElement Element;
340     HElement element() {if(Element) return Element; else return Element=new HElement(event.helement);}
341     HWND parent() {return event.inHwndParent;}
342     HWND control(HWND ctrl) {return event.outControlHwnd=ctrl;}
343 }
344
345 typedef HCreateControl HControlCreated;
346
347 struct HDestroyControl
348 {
349     LPNMHL_DESTROY_CONTROL event;
350     Object param;
351
352     HElement Element;
353     HElement element(){if(Element) return Element; else return Element=new HElement(event.helement);}
354     HWND control() {return event.inoutControlHwnd;}
355     HWND control(HWND ctrl) {return event.inoutControlHwnd=ctrl;}
356 }
357
358 struct HAttachBehavior
359 {
360     LPNMHL_ATTACH_BEHAVIOR event;
361     Object param;
362      
363     HElement Element;
364     HElement element(){if(Element) return Element; else return Element=new HElement(event.element);}
365     char[] name(){return fromStringz(event.behaviorName);}
366
367     ElementEventProc elementProc(ElementEventProc e){return event.elementProc=e;}
368     LPVOID elementTag(LPVOID e){return event.elementTag=e;}
369     UINT elementEvents(UINT e){return event.elementEvents=e;}
370 }
371
372 struct HBehaviorChanged
373 {
374     LPNMHL_BEHAVIOR_CHANGED event;
375     Object param;
376
377     HElement Element;
378     HElement element(){if(Element) return Element; else return Element=new HElement(event.element);}
379     char[] oldName(){return fromStringz(event.oldNames);}
380     char[] newName(){return fromStringz(event.newNames);}
381 }
382
383 struct HRefreshArea
384 {
385     LPNMHL_REFRESH_AREA event;
386     Object param;
387
388     RECT area(){return event.area;}
389 }
390
391 struct HSetTimer
392 {
393     LPNMHL_SET_TIMER event;
394     Object param;
395
396     uint id(){return cast(uint)event.timerId;}
397     uint time(){return event.elapseTime;}
398 }
399
400 struct HSetCursor
401 {
402     LPNMHL_SET_CURSOR event;
403     Object param;
404
405     uint id(){return event.cursorId;}
406     char* res()
407     {
408         static auto cursor_ids =
409         [
410             "#32512\0", //IDC_ARROW
411             "#32513\0", //IDC_IBEAM
412             "#32514\0", //IDC_WAIT
413             "#32515\0", //IDC_CROSS
414             "#32516\0", //IDC_UPARROW
415             "#32642\0", //IDC_SIZENWSE
416             "#32643\0", //IDC_SIZENESW
417             "#32644\0", //IDC_SIZEWE
418             "#32645\0", //IDC_SIZENS
419             "#32646\0", //IDC_SIZEALL
420             "#32648\0", //IDC_NO
421             "#32650\0", //IDC_APPSTARTING
422             "#32651\0", //IDC_HELP
423             "#32649\0", //IDC_HAND
424         ];
425         return cursor_ids[id].ptr;
426     }
427 }
428
429 struct HDialogCloseRQ
430 {
431     LPNMHL_DIALOG_CLOSE_RQ event;
432     Object param;
433
434     bool cancel(bool c){return cast(bool)(event.outCancel=c);}
435 }
436
437 struct HDialogCreated
438 {
439     LPNMHDR event;
440     Object param;
441 }
442
443 alias HInitialization HInit;
444 struct HInitialization
445 {
446     HELEMENT hElement;
447     INITIALIZATION_PARAMS* event;
448     Object param;
449
450     HElement Element;
451     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
452
453     UINT cmd(){return event.cmd;}
454 }
455
456 struct HMouse
457 {
458     HELEMENT hElement;
459     MOUSE_PARAMS* event;
460     Object param;
461
462     HElement Element;
463     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
464
465     UINT cmd(){return event.cmd;}
466     HELEMENT target(){return event.target;}
467     POINT pos(){return event.pos;}
468     POINT pos_document(){return event.pos_document;}
469     UINT button_state(){return event.button_state;}
470     UINT alt_state(){return event.alt_state;}
471     UINT cursor_type(){return event.cursor_type;}
472     BOOL is_on_icon(){return event.is_on_icon;}
473     HELEMENT dragging() {return event.dragging;}
474     UINT dragging_mode() {return event.dragging_mode;}
475 }
476
477 struct HKey
478 {
479     HELEMENT hElement;
480     KEY_PARAMS* event;
481     Object param;
482
483     HElement Element;
484     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
485
486     UINT cmd(){return event.cmd;}
487     HELEMENT target(){return event.target;}
488     UINT key_code(){return event.key_code;}
489     UINT alt_state(){return event.alt_state;}
490 }
491
492 struct HFocus
493 {
494     HELEMENT hElement;
495     FOCUS_PARAMS* event;
496     Object param;
497
498     HElement Element;
499     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
500
501     UINT cmd(){return event.cmd;}
502     HELEMENT target(){return event.target;}
503     BOOL by_mouse_click(){return event.by_mouse_click;}
504     BOOL cancel(){return event.cancel;}
505     BOOL cancel(BOOL c){return event.cancel=c;}
506 }
507
508 struct HDraw
509 {
510     HELEMENT hElement;
511     DRAW_PARAMS* event;
512     Object param;
513
514     HElement Element;
515     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
516
517     UINT cmd(){return event.cmd;}
518     HDC hdc(){return event.hdc;}
519     RECT area(){return event.area;}
520     UINT reserved(){return event.reserved;}
521 }
522
523 struct HTimer
524 {
525     HELEMENT hElement;
526     Object param;
527
528     HElement Element;
529     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
530 }
531
532 struct HBehaviorEvent
533 {
534     HELEMENT hElement;
535     BEHAVIOR_EVENT_PARAMS* event;
536     Object param;
537
538     HElement Element;
539     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
540
541     UINT cmd(){return event.cmd;}
542     HELEMENT heTarget(){return event.heTarget;}
543     HELEMENT he(){return event.he;}
544     UINT reason(){return event.reason;}
545 }
546
547 struct HMethod
548 {
549     HELEMENT hElement;
550     METHOD_PARAMS* event;
551     Object param;
552
553     HElement Element;
554     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
555
556     UINT methodID(){return event.methodID;}
557 }
558
559 struct HDataArrived
560 {
561     HELEMENT hElement;
562     DATA_ARRIVED_PARAMS* event;
563     Object param;
564
565     HElement Element;
566     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
567
568     HELEMENT initiator(){return event.initiator;}
569     LPCBYTE data(){return event.data;}
570     UINT dataSize(){return event.dataSize;}
571     UINT dataType(){return event.dataType;}
572     UINT status(){return event.status;}
573     LPCWSTR uri(){return event.uri;}
574 }
575
576 struct HSize
577 {
578     HELEMENT hElement;
579     Object param;
580
581     HElement Element;
582     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
583 }
584
585 struct HScroll
586 {
587     HELEMENT hElement;
588     SCROLL_PARAMS* event;
589     Object param;
590
591     HElement Element;
592     HElement element(){if(Element) return Element; else return Element=new HElement(hElement);}
593
594     UINT cmd(){return event.cmd;}
595     HELEMENT target(){return event.target;}
596     INT pos(){return event.pos;}
597     BOOL vertical(){return event.vertical;}
598 }
599
600 struct HReady
601 {
602     uint event;
603     Object param;
604 }
Note: See TracBrowser for help on using the browser.