| 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 |
} |
|---|