root/trunk/import/htmlayout/element.d

Revision 18, 28.1 kB (checked in by bobef, 4 years ago)

Updated HTMLayout wrapper to 0.7 (3.2.2.13)

Line 
1 module htmlayout.element;
2
3 import flowerd.common;
4 import htmlayout.htmlayout;
5 import htmlayout.events;
6 import tango.stdc.stringz;
7 import tango.text.convert.Utf;
8 import tango.text.Util;
9 import tango.core.Traits;
10 import tango.sys.win32.Types;
11
12 alias bool delegate(HElement e,UINT evtgm,LPVOID prms) HElement_event_callback_t;
13 alias bool delegate(HElement,PVOID param) HElement_callback_t;
14 alias bool delegate(HElement,LPVOID p,int pos,int postype,wchar code) HElement_enum_callback_t;
15
16 extern(Windows)
17 {
18     BOOL ReleaseCapture();
19     BOOL PtInRect(RECT *lprc,POINT pt);
20 }
21
22 template EVENT_HANDLER_STRING2(char[] NAME,char[] EVENT)
23 {
24     const EVENT_HANDLER_STRING2 =
25
26     "bool handleStatic(ReturnTypeOf!(on"~NAME~") delegate(ParameterTupleOf!(on"~NAME~")) dg,Object param=null){if(handleStatic("~EVENT~")) return dgs"~NAME~"(mHandle).add(dg,param); else return false;}"~
27     "bool unhandleStatic(ReturnTypeOf!(on"~NAME~") delegate(ParameterTupleOf!(on"~NAME~")) dg){return dgs"~NAME~"(mHandle).del(dg);}";
28 }
29
30 template EVENT_HANDLER_STRING1(char[] RETURNTYPE,char[] NAME,char[] TYPE,char[] EVENT)
31 {
32     const EVENT_HANDLER_STRING1 =
33
34     "protected static dg"~NAME~"_t[HELEMENT] mdgs"~NAME~";"~
35     "static dg"~NAME~"_t dgs"~NAME~"(HELEMENT handle){auto h=handle in mdgs"~NAME~"; if(h is null) {auto ret=mdgs"~NAME~"[handle]=new dg"~NAME~"_t; mdgs"~NAME~".rehash; return ret;} return *h;}";
36 }
37
38 class HElement : HEventHandler2
39 {
40     mixin(EVENT_HANDLER_STRING1!("bool","Init","HInitialization","HANDLE_INITIALIZATION"));
41     mixin(EVENT_HANDLER_STRING1!("bool","Mouse","HMouse","HANDLE_MOUSE"));
42     mixin(EVENT_HANDLER_STRING1!("bool","Key","HKey","HANDLE_KEY"));
43     mixin(EVENT_HANDLER_STRING1!("bool","Focus","HFocus","HANDLE_FOCUS"));
44     mixin(EVENT_HANDLER_STRING1!("bool","Draw","HDraw","HANDLE_DRAW"));
45     mixin(EVENT_HANDLER_STRING1!("bool","BehaviorEvent","HBehaviorEvent","HANDLE_BEHAVIOR_EVENT"));
46     mixin(EVENT_HANDLER_STRING1!("bool","MethodCall","HMethod","HANDLE_METHOD_CALL"));
47     mixin(EVENT_HANDLER_STRING1!("bool","DataArrived","HDataArrived","HANDLE_DATA_ARRIVED"));
48     mixin(EVENT_HANDLER_STRING1!("void","Size","HSize","HANDLE_SIZE"));
49     mixin(EVENT_HANDLER_STRING1!("bool","Timer","HTimer","HANDLE_TIMER"));
50     mixin(EVENT_HANDLER_STRING1!("bool","Scroll","HScroll","HANDLE_SCROLL"));
51     mixin(EVENT_HANDLER_STRING2!("Init","HANDLE_INITIALIZATION"));
52     mixin(EVENT_HANDLER_STRING2!("Mouse","HANDLE_MOUSE"));
53     mixin(EVENT_HANDLER_STRING2!("Key","HANDLE_KEY"));
54     mixin(EVENT_HANDLER_STRING2!("Focus","HANDLE_FOCUS"));
55     mixin(EVENT_HANDLER_STRING2!("Draw","HANDLE_DRAW"));
56     mixin(EVENT_HANDLER_STRING2!("BehaviorEvent","HANDLE_BEHAVIOR_EVENT"));
57     mixin(EVENT_HANDLER_STRING2!("MethodCall","HANDLE_METHOD_CALL"));
58     mixin(EVENT_HANDLER_STRING2!("DataArrived","HANDLE_DATA_ARRIVED"));
59     mixin(EVENT_HANDLER_STRING2!("Size","HANDLE_SIZE"));
60     mixin(EVENT_HANDLER_STRING2!("Timer","HANDLE_TIMER"));
61     mixin(EVENT_HANDLER_STRING2!("Scroll","HANDLE_SCROLL"));
62
63     class Styles
64     {
65         char[] opIndex(char[] name){return style(name);}
66         char[] opIndexAssign(char[] value,char[] name){if(style(name,value)) return value; else return null;}
67
68         char[] opCall(char[] name) //getter
69         {
70             LPCWSTR p_value;
71             if((lastResult=HTMLayoutGetStyleAttribute(mHandle,toStringz(name),&p_value))==HLDOM_OK) return .toString(fromString16z(p_value).dup);
72             else return null;
73         }
74    
75         bool opCall(char[] name,char[] value) //setter
76         {return (lastResult=HTMLayoutSetStyleAttribute(mHandle,toStringz(name),toString16z(toString16(value))))==HLDOM_OK;}
77     }
78
79     const Styles style;
80
81     this(HELEMENT h,bool use=false){mHandle=h;style=new Styles;if(use) keep();}
82     this(HElement element,bool use=false){this(element.mHandle,use);}
83     this(char[] tagname,char[] text=null)
84     {
85         HELEMENT phe;
86         if((lastResult=HTMLayoutCreateElement(toStringz(tagname),toString16z(toString16(text)),&phe))==HLDOM_OK)
87         {
88             style=new Styles;
89             mUsed=true;
90             mHandle=phe;
91         }
92         else throw new Exception("Error creating element");
93     }
94     ~this()
95     {
96         delete style;
97         if(mHandle)
98         {
99             HTMLayoutDetachEventHandler(mHandle,callback,htag);
100             release();
101         }
102     }
103
104     static HElement opCall(HELEMENT h,bool use=false) {return new HElement(h,use);}
105     static HElement opCall(HElement element,bool use=false) {return new HElement(element,use);}
106     static HElement opCall(char[] tagname,char[] text=null) {return new HElement(tagname,text);}
107
108     bool keep(bool dokeep=true)
109     {
110         if(dokeep)
111         {
112             if(mUsed==false && (lastResult=HTMLayout_UseElement(mHandle))==HLDOM_OK)
113             {
114                 mUsed=true;
115                 return true;
116             }
117             else return false;
118         }
119         else
120         {
121             if(mUsed==true && (lastResult=HTMLayout_UnuseElement(mHandle))==HLDOM_OK)
122             {
123                 mUsed=false;
124                 return true;
125             }
126             else return false;
127         }
128     }
129
130     bool release(){return keep(false);}
131
132     bool opEquals(HELEMENT h){return mHandle==h;}
133     bool opEquals(HElement h){return mHandle==h.mHandle;}
134     HELEMENT handle(){return mHandle;}
135     HELEMENT opCast(){return mHandle;}
136
137     int children()
138     {
139         UINT count;
140         if((lastResult=HTMLayoutGetChildrenCount(mHandle,&count))==HLDOM_OK) return cast(int)count;
141         else return -1;
142     }
143
144     HElement child(UINT n) //getter
145     {
146         HELEMENT phe;
147         if((lastResult=HTMLayoutGetNthChild(mHandle,n,&phe))==HLDOM_OK) return new HElement(phe);
148         else return null;
149     }
150
151     HElement parent() //getter
152     {
153         HELEMENT phe;
154         if((lastResult=HTMLayoutGetParentElement(mHandle,&phe))==HLDOM_OK) return new HElement(phe);
155         else return null;
156     }
157
158     char[] elementText() //getter
159     {
160         UINT length;
161         if((lastResult=HTMLayoutGetElementText(mHandle,null,&length))==HLDOM_OK && length>0)
162         {
163             wchar[] ret;
164             ret.length=length;
165             if((lastResult=HTMLayoutGetElementText(mHandle,ret.ptr,&length))==HLDOM_OK) return .toString(ret);
166         }
167         return null;
168     }
169
170     bool innerHTML(char[] html){return setHtml(html,SIH_REPLACE_CONTENT);}
171     char[] innerHTML(){return getHtml(false);}
172     bool outerHTML(char[] html){return setHtml(html,SOH_REPLACE);}
173     char[] outerHTML(){return getHtml(true);}
174     bool innerAppend(char[] html){return setHtml(html,SIH_APPEND_AFTER_LAST);}
175     bool innerPrepend(char[] html){return setHtml(html,SIH_INSERT_AT_START);}
176     bool outerAppend(char[] html){return setHtml(html,SOH_INSERT_AFTER);}
177     bool outerPrepend(char[] html){return setHtml(html,SOH_INSERT_BEFORE);}
178
179     char[] getHtml(bool outer)
180     {
181         LPCBYTE utf8bytes;
182         if((lastResult=HTMLayoutGetElementHtml(mHandle,&utf8bytes,outer))==HLDOM_OK) return fromStringz(cast(char*)utf8bytes).dup;
183         else return null;
184     }
185
186     bool setHtml(char[] html,UINT where=SIH_REPLACE_CONTENT)
187     {
188         return (lastResult=HTMLayoutSetElementHtml(mHandle,cast(LPCBYTE)html.ptr,html.length,where))==HLDOM_OK;
189     }
190
191     bool innerText(char[] txt){return (lastResult=HTMLayoutSetElementInnerText(mHandle,cast(LPCBYTE)txt.ptr,txt.length))==HLDOM_OK;}
192
193     char[] innerText()
194     {
195         LPCBYTE ret;
196         if((lastResult=HTMLayoutGetElementInnerText(mHandle,&ret))==HLDOM_OK) return fromStringz(cast(char*)ret).dup;
197         else return null;
198     }
199
200     wchar[] innerText16()
201     {
202         LPWSTR ret;
203         if((lastResult=HTMLayoutGetElementInnerText16(mHandle,&ret))==HLDOM_OK) return fromString16z(ret).dup;
204         else return null;
205     }
206
207     bool innerText16(wchar[] txt){return (lastResult=HTMLayoutSetElementInnerText(mHandle,cast(LPCBYTE)txt.ptr,txt.length))==HLDOM_OK;}
208
209     int attributes()
210     {
211         UINT count;
212         if((lastResult=HTMLayoutGetAttributeCount(mHandle,&count))==HLDOM_OK) return count;
213         else return -1;
214     }
215
216     bool attribute(UINT n,ref char[] name,ref char[] value) //getter
217     {
218         LPCSTR p_name;
219         LPCWSTR p_value;
220         if((lastResult=HTMLayoutGetNthAttribute(mHandle,n,&p_name,&p_value))==HLDOM_OK)
221         {
222             name=fromStringz(p_name).dup;
223             value=.toString(fromString16z(p_value).dup);
224             return true;
225         }
226         else return false;
227     }
228
229     char[] attributeName(UINT n)
230     {
231         LPCSTR p_name;
232         LPCWSTR p_value;
233         if((lastResult=HTMLayoutGetNthAttribute(mHandle,n,&p_name,null))==HLDOM_OK) return fromStringz(p_name).dup;
234         else return null;
235     }
236
237     char[] attributeValue(UINT n)
238     {
239         LPCSTR p_name;
240         LPCWSTR p_value;
241         if((lastResult=HTMLayoutGetNthAttribute(mHandle,n,null,&p_value))==HLDOM_OK) return .toString(fromString16z(p_value).dup);
242         else return null;
243     }
244
245     char[] opIndex(char[] name){return attribute(name);}
246     char[] opIndexAssign(char[] value,char[] name){if(attribute(name,value)) return value; else return null;}
247
248     char[] attribute(char[] name) //getter
249     {
250         LPCWSTR p_value;
251         if((lastResult=HTMLayoutGetAttributeByName(mHandle,toStringz(name),&p_value))==HLDOM_OK) return .toString(fromString16z(p_value).dup);
252         else return null;
253     }
254
255     bool attribute(char[] name,char[] value) //setter
256     {
257         return (lastResult=HTMLayoutSetAttributeByName(mHandle,toStringz(name),toString16z(.toString16(value))))==HLDOM_OK;
258     }
259
260     bool clearAttributes(){return (lastResult=HTMLayoutClearAttributes(mHandle))==HLDOM_OK;}
261
262     int index()
263     {
264         UINT index;
265         if((lastResult=HTMLayoutGetElementIndex(mHandle,&index))==HLDOM_OK) return index;
266         else return -1;
267     }
268
269     char[] tag()
270     {
271         LPCSTR p_type;
272         if((lastResult=HTMLayoutGetElementType(mHandle,&p_type))==HLDOM_OK) return fromStringz(p_type).dup;
273         else return null;
274     }
275
276     bool update(bool renderNow=false){return (lastResult=HTMLayoutUpdateElement(mHandle,renderNow))==HLDOM_OK;}
277     bool updateEx(UINT flags){return (lastResult=HTMLayoutUpdateElementEx(mHandle,flags))==HLDOM_OK;}
278     bool capture(bool capt=true)
279     {
280         if(capt) return (lastResult=HTMLayoutSetCapture(mHandle))==HLDOM_OK;
281         else return cast(bool)ReleaseCapture();
282     }
283     char[] combineURL(char[] url)
284     {
285         wchar[MAX_URL_LENGTH] buff=void;
286         auto str16=.toString16(url);
287         buff[0..str16.length]=str16;
288         DWORD size=MAX_URL_LENGTH;
289         if((lastResult=HTMLayoutCombineURL(mHandle,buff.ptr,size))==HLDOM_OK && size>0) return .toString(buff[0..size]);
290         return null;
291     }
292
293     HElement[] wildcard(char[] tagName,char[] attributeName=null,char[] attributeValue=null,DWORD depth=0,uint max=0)
294     {
295         auto ret=new GrowStack!(HElement)(max>0?max:15);
296         uint count;
297         bool each(HElement e,PVOID param)
298         {
299             ret.push(e);
300             return !(max==0||++count<max?1:0);
301         }
302         wildcard(tagName,attributeName,attributeValue,&each,null,depth);
303         return ret.slice;
304     }
305
306     bool wildcard(char[] tagName,char[] attributeName,char[] attributeValue,HElement_callback_t callback,LPVOID param=null,DWORD depth=0)
307     {synchronized{
308
309         if(!callback) return false;
310         mElementCallback=callback;
311         return (lastResult=HTMLayoutVisitElements(mHandle,.toStringz(tagName),toStringz(attributeName),toString16z(toString16(attributeValue)),&mVisitElementCallback,param,depth))==HLDOM_OK;
312     }}
313
314     HElement getId(char[] id) //getter
315     {
316         auto ret=wildcard(null,"id",id,0,1);
317         if(ret && ret.length) return ret[0];
318         else return null;
319     }
320
321     HElement[] getTag(char[] tag,uint max=0) //getter
322     {return wildcard(tag,null,null,0,max);}
323
324     bool id(char[] name) //setter
325     {return attribute("id",name);}
326
327     char[] id() //getter
328     {return attribute("id");}
329
330     bool className(char[] name) //setter
331     {return attribute("class",name);}
332
333     char[] className() //getter
334     {return attribute("class");}
335
336     bool hasClass(char[] clas)
337     {
338         auto cn=className;
339         uint i=0;
340         while(1)
341         {
342             i=locatePattern(cn,clas,i);
343             if(i==cn.length) return false;
344             if(i>0 && cn[i-1]!=' ') {i+=clas.length;continue;}
345             if(i+clas.length==cn.length) return true;
346             if(cn[i+clas.length]!=' ') {i+=clas.length;continue;}
347             return true;
348         }
349         return false;
350     }
351
352     bool addClass(char[] clas,bool check=true)
353     {
354         if(check && hasClass(clas)) return false;
355         return className=className~" "~clas;
356     }
357
358     bool delClass(char[] clas,bool check=true)
359     {
360         if(check && !hasClass(clas)) return false;
361         auto c=split(className," ");
362         auto d=Array.remove(c,clas);
363         return className=join(c," ");
364     }
365
366     bool display(char[] name) //setter
367     {return style("display",name);}
368
369     char[] display() //getter
370     {return style("display");}
371
372     HElement[] select(char[] CSS_selectors,uint max=0)
373     {
374         auto ret=new GrowStack!(HElement)(max>0?max:15);
375         uint count;
376         bool each(HElement e,PVOID param)
377         {
378             ret.push(e);
379             return !(max==0||++count<max?1:0);
380         }
381         select(CSS_selectors,&each);
382         return ret.slice;
383     }
384
385     bool select(char[] CSS_selectors,HElement_callback_t callback,LPVOID param=null)
386     {synchronized{
387        
388         if(!callback) return false;
389         mElementCallback=callback;
390         return (lastResult=HTMLayoutSelectElements(mHandle,toStringz(CSS_selectors),&mVisitElementCallback,param))==HLDOM_OK;
391     }}
392
393     HElement selectParent(char[] selector,UINT depth=0)
394     {
395         HELEMENT heFound;
396         if((lastResult=HTMLayoutSelectParent(mHandle,toStringz(selector),depth,&heFound))==HLDOM_OK && heFound) return new HElement(heFound);
397         else return null;
398     }
399
400     bool remove()
401     {
402         if((lastResult=HTMLayoutDeleteElement(mHandle))==HLDOM_OK)
403         {
404             mHandle=null;
405             return true;
406         }
407         else return false;
408     }
409
410     int UID()
411     {
412         UINT puid;
413         if((lastResult=HTMLayoutGetElementUID(mHandle,&puid))==HLDOM_OK) return puid;
414         else return -1;
415     }
416
417     bool showAsPopup(HElement anchor,UINT placement=2){return anchor.showPopup(this,placement);}
418     bool showPopup(HElement hePopup,UINT placement=2){return (lastResult=HTMLayoutShowPopup(hePopup.mHandle,mHandle,placement))==HLDOM_OK;}
419     bool showPopupAt(HElement hePopup,int x,int y,bool animate){return (lastResult=HTMLayoutShowPopupAt(hePopup.mHandle,POINT(x,y),animate))==HLDOM_OK;}
420     bool showAsPopupAt(int x,int y,bool animate){return showPopupAt(this,x,y,animate);}
421     bool hidePopup(HElement hePopup=null){return (lastResult=HTMLayoutHidePopup(hePopup?hePopup.mHandle:mHandle))==HLDOM_OK;}
422
423     uint state() //getter
424     {
425         UINT pstateBits;
426         if((lastResult=HTMLayoutGetElementState(mHandle,&pstateBits))==HLDOM_OK) return pstateBits;
427         else return 0;
428     }
429
430     bool state(UINT stateBitsToSet,UINT stateBitsToClear,bool updateView) //setter
431     {return (lastResult=HTMLayoutSetElementState(mHandle,stateBitsToSet,stateBitsToClear,updateView))==HLDOM_OK;}
432
433     bool link(){return (state&STATE_LINK)!=0;}
434     bool hovered(){return (state&STATE_HOVER)!=0;}
435     bool active(){return (state&STATE_ACTIVE)!=0;}
436     bool visited(){return (state&STATE_VISITED)!=0;}
437     bool current(){return (state&STATE_CURRENT)!=0;}
438     bool readOnly(){return (state&STATE_READONLY)!=0;}
439     bool readOnly(bool v){return state(v?STATE_READONLY:0,v?0:STATE_READONLY,true);}
440     bool expanded(){return (state&STATE_EXPANDED)!=0;}
441     bool collapsed(){return (state&STATE_COLLAPSED)!=0;}
442     bool incomplete(){return (state&STATE_INCOMPLETE)!=0;}
443     bool animating(){return (state&STATE_ANIMATING)!=0;}
444     bool synthetic(){return (state&STATE_SYNTHETIC)!=0;}
445     bool ownsPopup(){return (state&STATE_OWNS_POPUP)!=0;}
446     bool tabFocus(){return (state&STATE_TABFOCUS)!=0;}
447     bool empty(){return (state&STATE_EMPTY)!=0;}
448     bool busy(){return (state&STATE_BUSY)!=0;}
449     bool dragOver(){return (state&STATE_DRAG_OVER)!=0;}
450     bool dropTarget(){return (state&STATE_DROP_TARGET)!=0;}
451     bool moving(){return (state&STATE_MOVING)!=0;}
452     bool copying(){return (state&STATE_COPYING)!=0;}
453     bool dragSource(){return (state&STATE_DRAG_SOURCE)!=0;}
454     bool popup(){return (state&STATE_POPUP)!=0;}
455     bool pressed(){return (state&STATE_PRESSED)!=0;}
456     bool hasChildren(){return (state&STATE_HAS_CHILDREN)!=0;}
457     bool hasChild(){return (state&STATE_HAS_CHILD)!=0;}
458     bool focus(){return state(STATE_FOCUS,0,true);}
459     bool focused(){return (state&STATE_FOCUS)!=0;}
460     bool focusable(bool v){return state(v?STATE_FOCUSABLE:0,v?0:STATE_FOCUSABLE,true);}
461     bool focusable(){return (state&STATE_FOCUSABLE)!=0;}
462     bool checked(bool v){return state(v?STATE_CHECKED:0,v?0:STATE_CHECKED,true);}
463     bool checked(){return (state&STATE_CHECKED)!=0;}
464     bool disabled(bool v){return state(v?STATE_DISABLED:0,v?0:STATE_DISABLED,true);}
465     bool disabled(){return (state&STATE_DISABLED)!=0;}
466
467     HElement clone()
468     {
469         HELEMENT phe;
470         if((lastResult=HTMLayoutCloneElement(mHandle,&phe))==HLDOM_OK)
471         {
472             auto r=new HElement(phe,false);
473             r.mUsed=true;
474             return r;
475         }
476         return null;
477     }
478
479     bool insert(HElement hparent,UINT index=0){return (lastResult=HTMLayoutInsertElement(mHandle,hparent.mHandle,index))==HLDOM_OK;}
480     bool adopt(HElement child,UINT index=0){return child.insert(this,index);}
481     bool detach(){return (lastResult=HTMLayoutDetachElement(mHandle))==HLDOM_OK;}
482     bool timer(UINT milliseconds){return (lastResult=HTMLayoutSetTimer(mHandle,milliseconds))==HLDOM_OK;}
483
484     bool sendEvent(UINT appEventCode,HElement heSource,UINT reason,out bool handled)
485     {
486         BOOL mHandled;
487         if((lastResult=HTMLayoutSendEvent(mHandle,appEventCode,heSource?heSource.mHandle:null,reason,&mHandled))==HLDOM_OK)
488         {
489             handled=cast(bool)mHandled;
490             return true;
491         }
492         else return false;
493     }
494
495     bool postEvent(UINT appEventCode,HElement heSource,UINT reason){return (lastResult=HTMLayoutPostEvent(mHandle,appEventCode,heSource?heSource.mHandle:null,reason))==HLDOM_OK;}
496
497     protected bool callMethod(HMethodParams* params){return (lastResult=HTMLayoutCallBehaviorMethod(mHandle,params))==HLDOM_OK;}
498
499     bool click(){return callMethod(&HMethodParams(DO_CLICK));}
500     bool xcall(char[] name,HJson[] values=null)
501     {
502         JSON_VALUE[] vals;
503         vals.length=values.length;
504         foreach(i,v;values) vals[i]=*v.handle;
505         return callMethod(HXcall(name,vals).opCast);
506     }
507     bool xcall(char[] name,HJson value){return callMethod(HXcall(name,value.handle).opCast);}
508
509     bool requestData(char[] url,UINT dataType,HElement initiator){return (lastResult=HTMLayoutRequestElementData(mHandle,toString16z(toString16(url)),dataType,initiator?initiator.mHandle:null))==HLDOM_OK;}
510     bool scrollInfo(ref POINT scrollPos,ref RECT viewRect,ref SIZE contentSize) //getter
511     {return (lastResult=HTMLayoutGetScrollInfo(mHandle,&scrollPos,&viewRect,&contentSize))==HLDOM_OK;}
512     POINT scrollPos()
513     {
514         POINT a;RECT b;SIZE c;
515         scrollInfo(a,b,c);
516         return a;
517     }
518     RECT viewRect()
519     {
520         POINT a;RECT b;SIZE c;
521         scrollInfo(a,b,c);
522         return b;
523     }
524     SIZE viewSize()
525     {
526         auto r=viewRect;
527         return SIZE(r.right-r.left,r.bottom-r.top);
528     }
529     SIZE contentSize()
530     {
531         POINT a;RECT b;SIZE c;
532         scrollInfo(a,b,c);
533         return c;
534     }
535     bool scrollPos(POINT p,bool smooth=false) {return scrollPos(p.x,p.y,smooth);}
536     bool scrollPos(int x,int y,bool smooth=false) //setter
537     {return (lastResult=HTMLayoutSetScrollPos(mHandle,POINT(x,y),smooth))==HLDOM_OK;}
538
539     bool visible() //getter
540     {
541         BOOL pVisible;
542         return (lastResult=HTMLayoutIsElementVisible(mHandle,&pVisible))==HLDOM_OK && pVisible;
543     }
544
545     bool enabled() //getter
546     {
547         BOOL pEnabled;
548         return (lastResult=HTMLayoutIsElementEnabled(mHandle,&pEnabled))==HLDOM_OK && pEnabled;
549     }
550
551     bool sort(UINT firstIndex,UINT lastIndex,ELEMENT_COMPARATOR cmpFunc,LPVOID cmpFuncParam){return (lastResult=HTMLayoutSortElements(mHandle,firstIndex,lastIndex,cmpFunc,cmpFuncParam))==HLDOM_OK;}
552
553     bool swap(HElement he2){return (lastResult=HTMLayoutSwapElements(mHandle,he2.mHandle))==HLDOM_OK;}
554
555     int controlType()
556     {
557         UINT pType;
558         if((lastResult=HTMLayoutControlGetType(mHandle,&pType))==HLDOM_OK) return pType;
559         else return -1;
560     }
561     HJson value()
562     {
563         auto r=new JSON_VALUE;
564         if((lastResult=HTMLayoutControlGetValue(mHandle,r))==HLDOM_OK) return HJson(r);
565         else return null;
566     }
567     bool value(HJson pVal){return (lastResult=HTMLayoutControlSetValue(mHandle,pVal.handle))==HLDOM_OK;}
568
569     bool enumerate(HElement_enum_callback_t callback,LPVOID p,bool forward)
570     {
571         if(!callback) return false;
572         mEnumCallback=callback;
573         return (lastResult=HTMLayoutEnumerate(mHandle,&mEnumerationCallback,p,forward))==HLDOM_OK;
574     }
575
576     RECT* characterRect(int pos)
577     {
578         auto outRect=new RECT;
579         if((lastResult=HTMLayoutGetCharacterRect(mHandle,pos,outRect))==HLDOM_OK) return outRect;
580         else return null;
581     }
582
583     RECT* location(UINT areas /*ELEMENT_AREAS*/)
584     {
585         auto outRect=new RECT;
586         if((lastResult=HTMLayoutGetElementLocation(mHandle,outRect,areas))==HLDOM_OK) return outRect;
587         else return null;
588     }
589
590     bool isInside(POINT client_pt)
591     {
592         auto rc = location(ROOT_RELATIVE | BORDER_BOX);
593         if(rc) return PtInRect(rc,client_pt) != FALSE;
594         else return false;
595     }
596
597     HWND hwnd(BOOL rootWindow)
598     {
599         HWND hwnd;
600         if((lastResult=HTMLayoutGetElementHwnd(mHandle,&hwnd,rootWindow))==HLDOM_OK) return hwnd;
601         else return null;
602     }
603
604     HRange range(bool outer)
605     {
606         HRANGE pRange;
607         if((lastResult=HTMLayoutRangeCreate(mHandle,&pRange,outer ))==HLDOM_OK) return new HRange(pRange);
608         else return null;
609     }
610
611     HRange rangeFromSelection()
612     {
613         HRANGE pRange;
614         if((lastResult=HTMLayoutRangeFromSelection(mHandle,&pRange ))==HLDOM_OK) return new HRange(pRange);
615         else return null;
616     }
617
618     HRange rangeFromPositions(ref HPOSITION pStart,ref HPOSITION pEnd)
619     {
620         HRANGE pRange;
621         if((lastResult=HTMLayoutRangeFromPositions(mHandle,&pStart,&pEnd ))==HLDOM_OK) return new HRange(pRange);
622         else return null;
623     }
624
625     bool scrollToView(UINT flags=0){return (lastResult=HTMLayoutScrollToView(mHandle,flags))==HLDOM_OK;}
626
627     bool _handleEvent(UINT subscription){return (lastResult=HTMLayoutAttachEventHandlerEx(mHandle,callback,htag,subscription))==HLDOM_OK;}
628     bool _handleStatic(UINT subscription){return (lastResult=HTMLayoutAttachEventHandlerEx(mHandle,&mStaticHandler,mHandle,subscription))==HLDOM_OK;}
629     bool _unhandleEvents(){return (lastResult=HTMLayoutDetachEventHandler(mHandle,callback,htag))==HLDOM_OK;}
630     bool _unhandleStatic(){return (lastResult=HTMLayoutDetachEventHandler(mHandle,&mStaticHandler,mHandle))==HLDOM_OK;}
631
632     protected uint[HELEMENT] mStaticSubscriptions;
633     bool handleStatic(UINT subscription,bool force=false)
634     {
635         auto ms=mHandle in mStaticSubscriptions;
636         if(ms is null)
637         {
638             mStaticSubscriptions[mHandle]=0;
639             ms=mHandle in mStaticSubscriptions;
640         }
641         if(!force && *ms&subscription) return true;
642         else
643         {
644             if(_handleStatic(subscription))
645             {
646                 *ms|=subscription;
647                 return true;
648             }
649         }
650         return false;
651     }
652
653     bool unhandleStatic(bool removehandlers=true)
654     {
655         if(_unhandleStatic())
656         {
657             if(removehandlers)
658             {
659                 mdgsInit.remove(mHandle);
660                 mdgsMouse.remove(mHandle);
661                 mdgsKey.remove(mHandle);
662                 mdgsFocus.remove(mHandle);
663                 mdgsDraw.remove(mHandle);
664                 mdgsBehaviorEvent.remove(mHandle);
665                 mdgsMethodCall.remove(mHandle);
666                 mdgsDataArrived.remove(mHandle);
667                 mdgsSize.remove(mHandle);
668                 mdgsTimer.remove(mHandle);
669                 mdgsScroll.remove(mHandle);
670             }
671             return true;
672         }
673         else return false;
674     }
675
676     HLDOM_RESULT lastResult;
677     char[] lastResultMsg()
678     {
679         if(lastResult==HLDOM_OK) return "HLDOM_OK - function completed successfully";
680         else if(lastResult==HLDOM_INVALID_HWND) return "return HLDOM_INVALID_HWND - invalid HWND";
681         else if(lastResult==HLDOM_INVALID_HANDLE) return "return HLDOM_INVALID_HANDLE - invalid HELEMENT";
682         else if(lastResult==HLDOM_PASSIVE_HANDLE) return "return HLDOM_PASSIVE_HANDLE - attempt to use HELEMENT which is not marked by HTMLayout_UseElement()";
683         else if(lastResult==HLDOM_INVALID_PARAMETER) return "return HLDOM_INVALID_PARAMETER - parameter is invalid,e.g. pointer is null";
684         else if(lastResult==HLDOM_OPERATION_FAILED) return "return HLDOM_OPERATION_FAILED";
685         else return null;
686     }
687
688 private:
689
690     static HElement_enum_callback_t mEnumCallback;
691     extern(Windows) static BOOL mEnumerationCallback( LPVOID p,HELEMENT he,int pos,int postype,WCHAR code )
692     {
693         return mEnumCallback(new HElement(he),p,pos,postype,code);
694     }
695
696     static HElement_callback_t mElementCallback;
697     extern(Windows) static BOOL mVisitElementCallback(HELEMENT el,PVOID param)
698     {
699         return mElementCallback(new HElement(el),param);
700     }
701
702     extern(Windows) static BOOL mStaticHandler(LPVOID tag,HELEMENT target,UINT event,LPVOID params )
703     {
704         if(event==HANDLE_INITIALIZATION){return dgsInit(target).call(HInitialization(target,cast(INITIALIZATION_PARAMS*)params));}
705         else if(event==HANDLE_MOUSE){return dgsMouse(target).call(HMouse(target,cast(MOUSE_PARAMS*)params));}
706         else if(event==HANDLE_KEY){return dgsKey(target).call(HKey(target,cast(KEY_PARAMS*)params));}
707         else if(event==HANDLE_FOCUS){return dgsFocus(target).call(HFocus(target,cast(FOCUS_PARAMS*)params));}
708         else if(event==HANDLE_DRAW){return dgsDraw(target).call(HDraw(target,cast(DRAW_PARAMS*)params));}
709         else if(event==HANDLE_TIMER){return dgsTimer(target).call(HTimer(target));}
710         else if(event==HANDLE_BEHAVIOR_EVENT){return dgsBehaviorEvent(target).call(HBehaviorEvent(target,cast(BEHAVIOR_EVENT_PARAMS*)params));}
711         else if(event==HANDLE_METHOD_CALL){return dgsMethodCall(target).call(HMethod(target,cast(METHOD_PARAMS*)params));}
712         else if(event==HANDLE_DATA_ARRIVED){return dgsDataArrived(target).call(HDataArrived(target,cast(DATA_ARRIVED_PARAMS*)params));}
713         else if(event==HANDLE_SIZE){dgsSize(target).call(HSize(target));return false;}
714         else if(event==HANDLE_SCROLL){return dgsScroll(target).call(HScroll(target,cast(SCROLL_PARAMS*)params));}
715         else throw new Exception("Error handling behavior event");
716         return false;
717     }
718
719     bool mUsed;
720     HELEMENT mHandle;
721 }
722
723 class HEditBox : HElement
724 {
725     this(HELEMENT h,bool use=false){super(h,use);}
726     this(HElement el,bool use=false){super(el,use);}
727     static HEditBox opCall(HELEMENT h,bool use=false) {return new HEditBox(h,use);}
728     static HEditBox opCall(HElement el,bool use=false) {return new HEditBox(el,use);}
729
730     char[] textValue()
731     {
732         auto p=HTextValue();
733         if(callMethod(p.opCast) && p.text && p.length) return p.toString;
734         else return null;
735     }
736     bool textValue(char[] value) {return callMethod(HTextValue(value).opCast);}
737
738     bool select(uint start,uint end) {return callMethod(HTextEditSelection(start,end).opCast);}
739     HTextEditSelection* selection()
740     {
741         auto p=HTextEditSelection();
742         if(callMethod(p.opCast)) return p;
743         else return null;
744     }
745
746     bool replace(char[] text) {return callMethod(HTextEditReplaceSelection(text).opCast);}
747
748     HTextCaretPosition* caretPos()
749     {
750         auto p=HTextCaretPosition();
751         if(callMethod(p.opCast)) return p;
752         else return null;
753     }
754
755     char[] selectedText()
756     {
757         auto p=HTextSelection(false);
758         if(callMethod(p.opCast)) return p.toString;
759         else return null;
760     }
761
762     char[] selectedHTML()
763     {
764         auto p=HTextSelection(true);
765         if(callMethod(p.opCast)) return p.toString;
766         else return null;
767     }
768 }
769
770 class HScrollBar : HElement
771 {
772     this(HELEMENT h,bool use=false){super(h,use);}
773     this(HElement el,bool use=false){super(el,use);}
774     static HScrollBar opCall(HELEMENT h,bool use=false) {return new HScrollBar(h,use);}
775     static HScrollBar opCall(HElement el,bool use=false) {return new HScrollBar(el,use);}
776
777     HScrollbarValue* getValue()
778     {
779         auto p=HScrollbarValue();
780         if(callMethod(p.opCast)) return p;
781         else return null;
782     }
783
784     bool setValue(int value,int min=0,int max=0,int page=0,int step=0)
785     {
786         return callMethod(HScrollbarValue(value,min,max,page,step).opCast);
787     }
788 }
789
790 class HRange
791 {
792     this(HRANGE range){mHandle=range;}
793     ~this(){if(mHandle) release();}
794     static HRange opCall(HRANGE h) {return new HRange(h);}
795
796     bool release(){if((lastResult=HTMLayoutRangeRelease(mHandle))==HLDOM_OK) {mHandle=null;return true;} return false;}
797     bool advance(UINT cmd,ref INT c,ref HPOSITION pPos ){return (lastResult=HTMLayoutRangeAdvancePos( mHandle,cmd,&c,&pPos ))==HLDOM_OK;}
798     char[] html()
799     {
800         LPCBYTE ret;
801         uint len;
802         if((lastResult=HTMLayoutRangeToHtml( mHandle,&ret,&len))==HLDOM_OK) return (cast(char*)ret)[0..len].dup;
803         else return null;
804     }
805     bool replace(char[] html){return (lastResult=HTMLayoutRangeReplace( mHandle,cast(LPCBYTE)html.ptr,html.length))==HLDOM_OK;}
806     bool insert(HPOSITION pPos,char[] html){return (lastResult=HTMLayoutRangeInsertHtml( &pPos,cast(LPBYTE) html.ptr,html.length ))==HLDOM_OK;}
807     bool isEmpty()
808     {
809         BOOL pResult;
810         lastResult=HTMLayoutRangeIsEmpty( mHandle,&pResult );
811         return cast(bool)pResult;
812     }
813
814     HLDOM_RESULT lastResult;
815     char[] lastResultMsg()
816     {
817         if(lastResult==HLDOM_OK) return "HLDOM_OK - function completed successfully";
818         else if(lastResult==HLDOM_INVALID_HWND) return "HLDOM_INVALID_HWND - invalid HWND";
819         else if(lastResult==HLDOM_INVALID_HANDLE) return "HLDOM_INVALID_HANDLE - invalid HELEMENT";
820         else if(lastResult==HLDOM_PASSIVE_HANDLE) return "HLDOM_PASSIVE_HANDLE - attempt to use HELEMENT which is not marked by HTMLayout_UseElement()";
821         else if(lastResult==HLDOM_INVALID_PARAMETER) return "HLDOM_INVALID_PARAMETER - parameter is invalid,e.g. pointer is null";
822         else if(lastResult==HLDOM_OPERATION_FAILED) return "HLDOM_OPERATION_FAILED";
823         else return null;
824     }
825
826 protected:
827     HRANGE mHandle;
828 }
Note: See TracBrowser for help on using the browser.