Merge pull request #2223 from lobrien/master
[mono.git] / mcs / class / System.Windows.Forms / System.Windows.Forms / HtmlElement.cs
1 // Permission is hereby granted, free of charge, to any person obtaining\r
2 // a copy of this software and associated documentation files (the\r
3 // "Software"), to deal in the Software without restriction, including\r
4 // without limitation the rights to use, copy, modify, merge, publish,\r
5 // distribute, sublicense, and/or sell copies of the Software, and to\r
6 // permit persons to whom the Software is furnished to do so, subject to\r
7 // the following conditions:\r
8 // \r
9 // The above copyright notice and this permission notice shall be\r
10 // included in all copies or substantial portions of the Software.\r
11 // \r
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
19 //\r
20 // Copyright (c) 2007, 2008 Novell, Inc.\r
21 //\r
22 // Authors:\r
23 //      Andreia Gaita   <avidigal@novell.com>\r
24 \r
25 \r
26 using System;\r
27 using System.Drawing;\r
28 using System.ComponentModel;\r
29 using Mono.WebBrowser.DOM;\r
30 \r
31 namespace System.Windows.Forms\r
32 {\r
33         public sealed class HtmlElement\r
34         {\r
35                 private EventHandlerList events;\r
36                 private Mono.WebBrowser.IWebBrowser webHost;\r
37                 internal IElement element;\r
38                 private WebBrowser owner;\r
39                 \r
40                 internal HtmlElement (WebBrowser owner, Mono.WebBrowser.IWebBrowser webHost, IElement element)\r
41                 {\r
42                         this.webHost = webHost;\r
43                         this.element = element;\r
44                         this.owner = owner;\r
45                 }\r
46 \r
47                 internal EventHandlerList Events {\r
48                         get {\r
49                                 if (events == null)\r
50                                         events = new EventHandlerList();\r
51 \r
52                                 return events;\r
53                         }\r
54                 }\r
55 \r
56                 #region Properties\r
57                 public HtmlElementCollection All {\r
58                         get {\r
59                                 return new HtmlElementCollection (owner, webHost, this.element.All);\r
60                         }\r
61                 }\r
62 \r
63                 // from http://www.w3.org/TR/html401/index/elements.html\r
64                 public bool CanHaveChildren {\r
65                         get {\r
66                                 string tag = this.TagName;\r
67                                 switch (tag.ToLowerInvariant ()) {\r
68                                         case "area":\r
69                                         case "base":\r
70                                         case "basefont":\r
71                                         case "br":\r
72                                         case "col":\r
73                                         case "frame":\r
74                                         case "hr":\r
75                                         case "img":\r
76                                         case "input":\r
77                                         case "isindex":\r
78                                         case "link":\r
79                                         case "meta":\r
80                                         case "param":\r
81                                                 return false;\r
82                                         default:\r
83                                                 return true;\r
84                                 }\r
85                         }\r
86                 }\r
87 \r
88                 public HtmlElementCollection Children {\r
89                         get {\r
90                                 return new HtmlElementCollection (owner, webHost, this.element.Children);\r
91                         }\r
92                 }\r
93 \r
94                 public Rectangle ClientRectangle {\r
95                         get { return new Rectangle (0, 0, this.element.ClientWidth, this.element.ClientHeight); }\r
96                 }\r
97                 \r
98                 public Rectangle OffsetRectangle {\r
99                         get { return new Rectangle (this.element.OffsetLeft, this.element.OffsetTop, this.element.OffsetWidth, this.element.OffsetHeight); }\r
100                 }\r
101 \r
102                 public Rectangle ScrollRectangle {\r
103                         get { return new Rectangle (this.element.ScrollLeft, this.element.ScrollTop, this.element.ScrollWidth, this.element.ScrollHeight); }\r
104                 }\r
105 \r
106                 public int ScrollLeft {\r
107                         get { return this.element.ScrollLeft; }\r
108                         set { this.element.ScrollLeft = value; }\r
109                 }\r
110 \r
111                 public int ScrollTop {\r
112                         get { return this.element.ScrollTop; }\r
113                         set { this.element.ScrollTop = value; }\r
114                 }\r
115 \r
116                 public HtmlElement OffsetParent {\r
117                         get { return new HtmlElement (owner, this.webHost, this.element.OffsetParent); }\r
118                 }\r
119 \r
120                 public HtmlDocument Document {\r
121                         get {\r
122                                 return new HtmlDocument (owner, webHost, element.Owner);\r
123                         }\r
124                 }\r
125 \r
126                 public bool Enabled     {\r
127                         get { return !this.element.Disabled; }\r
128                         set { this.element.Disabled = !value; }\r
129                 }\r
130 \r
131                 public string InnerHtml {\r
132                         get { return this.element.InnerHTML; }\r
133                         set { this.element.InnerHTML = value; }\r
134                 }\r
135 \r
136                 public string InnerText {\r
137                         get { return this.element.InnerText; }\r
138                         set { this.element.InnerText = value; }\r
139                 }\r
140 \r
141                 public string Id {\r
142                         get { return GetAttribute("id"); }\r
143                         set { SetAttribute ("id", value); }\r
144                 }\r
145 \r
146                 public string Name {\r
147                         get { return GetAttribute ("name"); }\r
148                         set { SetAttribute ("name", value); }\r
149                 }\r
150 \r
151                 public HtmlElement FirstChild {\r
152                         get {\r
153                                 return new HtmlElement (owner, webHost, (IElement)element.FirstChild); \r
154                         }\r
155                 }\r
156 \r
157                 public HtmlElement NextSibling {\r
158                         get { return new HtmlElement (owner, webHost, (IElement)element.Next); }\r
159                 }\r
160                 \r
161                 public HtmlElement Parent {\r
162                         get { return new HtmlElement (owner, webHost, (IElement)element.Parent); }\r
163                 }\r
164 \r
165                 public string TagName {\r
166                         get { return element.TagName; }\r
167                 }\r
168 \r
169                 public short TabIndex {\r
170                         get { return (short)element.TabIndex; }\r
171                         set { element.TabIndex = value; }\r
172                 }\r
173 \r
174                 public object DomElement {\r
175                         get { throw new NotSupportedException ("Retrieving a reference to an mshtml interface is not supported. Sorry."); } \r
176                 }\r
177 \r
178                 public string OuterHtml {\r
179                         get { return this.element.OuterHTML; }\r
180                         set { this.element.OuterHTML = value; }\r
181                 }\r
182 \r
183                 public string OuterText {\r
184                         get { return this.element.OuterText; }\r
185                         set { this.element.OuterText = value; }\r
186                 }\r
187 \r
188                 public string Style {\r
189                         get { return this.element.Style; }\r
190                         set { this.element.Style = value; }\r
191                 }\r
192 \r
193                 #endregion\r
194                 \r
195                 #region Methods\r
196                 public HtmlElement AppendChild (HtmlElement newElement)\r
197                 {\r
198                         IElement newChild = this.element.AppendChild (newElement.element);\r
199                         newElement.element = newChild;\r
200                         return newElement;\r
201                 }\r
202                 \r
203                 public void AttachEventHandler (string eventName, EventHandler eventHandler)\r
204                 {\r
205                         element.AttachEventHandler (eventName, eventHandler);\r
206                 }\r
207 \r
208                 public void DetachEventHandler (string eventName, EventHandler eventHandler)\r
209                 {\r
210                         element.DetachEventHandler (eventName, eventHandler);\r
211                 }\r
212                 \r
213                 public void Focus ()\r
214                 {\r
215                         throw new NotImplementedException ();\r
216                 }\r
217 \r
218                 public string GetAttribute (string attributeName)\r
219                 {\r
220                         return element.GetAttribute (attributeName);\r
221                 }\r
222 \r
223                 public HtmlElementCollection GetElementsByTagName (string tagName)\r
224                 {\r
225                         Mono.WebBrowser.DOM.IElementCollection col = element.GetElementsByTagName (tagName);\r
226                         return new HtmlElementCollection (owner, webHost, col);\r
227                 }\r
228                 \r
229                 public override int GetHashCode ()\r
230                 {\r
231                         if (element == null)\r
232                                 return 0;\r
233                         return element.GetHashCode ();\r
234                 }\r
235 \r
236                 internal bool HasAttribute (string name)\r
237                 {\r
238                         return element.HasAttribute (name);\r
239                 }\r
240 \r
241                 public HtmlElement InsertAdjacentElement (HtmlElementInsertionOrientation orient, HtmlElement newElement)\r
242                 {\r
243                         switch (orient) {\r
244                                 case HtmlElementInsertionOrientation.BeforeBegin:\r
245                                         element.Parent.InsertBefore (newElement.element, element);\r
246                                         return newElement;\r
247                                 case HtmlElementInsertionOrientation.AfterBegin:\r
248                                         element.InsertBefore (newElement.element, element.FirstChild);\r
249                                         return newElement;\r
250                                 case HtmlElementInsertionOrientation.BeforeEnd:\r
251                                         return this.AppendChild (newElement);\r
252                                 case HtmlElementInsertionOrientation.AfterEnd:\r
253                                         return this.AppendChild (newElement);\r
254                         }\r
255                         return null;\r
256                 }\r
257                 \r
258                 public object InvokeMember (string methodName)\r
259                 {\r
260                         return this.element.Owner.InvokeScript ("eval ('" + methodName + "()');");\r
261                 }\r
262 \r
263                 public object InvokeMember (string methodName, params object[] parameter)\r
264                 {\r
265                         string[] strArgs = new string[parameter.Length];\r
266                         for (int i = 0; i < parameter.Length; i++) {\r
267                                 strArgs[i] = parameter.ToString();\r
268                         }\r
269                         return this.element.Owner.InvokeScript ("eval ('" + methodName + "(" + String.Join (",", strArgs) + ")');");\r
270                 }\r
271                 \r
272                 public void RaiseEvent (string eventName) \r
273                 {\r
274                         this.element.FireEvent (eventName);\r
275                 }\r
276 \r
277                 public void RemoveFocus () \r
278                 {\r
279                         this.element.Blur ();\r
280                 }\r
281 \r
282                 public void ScrollIntoView (bool alignWithTop) \r
283                 {\r
284                         this.element.ScrollIntoView (alignWithTop);\r
285                 }\r
286                 \r
287                 public void SetAttribute (string attributeName, string value)\r
288                 {\r
289                         this.element.SetAttribute (attributeName, value);\r
290                 }\r
291 \r
292                 public override bool Equals (object obj)\r
293                 {\r
294                         return this == (HtmlElement) obj;\r
295                 }\r
296                 \r
297                 public static bool operator == (HtmlElement left, HtmlElement right)\r
298                 {\r
299                         if ((object)left == (object)right)\r
300                                 return true;\r
301                         if ((object)left == null || (object)right == null)\r
302                                 return false;\r
303                         return left.element.Equals (right.element); \r
304                 }\r
305 \r
306                 public static bool operator != (HtmlElement left, HtmlElement right)\r
307                 {\r
308                         return !(left == right);\r
309                 }\r
310                 #endregion\r
311 \r
312                 #region Events\r
313                 private void OnClick (object sender, EventArgs e)\r
314                 {\r
315                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[ClickEvent];\r
316                         if (eh != null) {\r
317                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
318                                 eh (this, ev);\r
319                         }\r
320                 }\r
321 \r
322                 private static object ClickEvent = new object ();\r
323                 public event HtmlElementEventHandler Click {\r
324                         add { \r
325                                 Events.AddHandler (ClickEvent, value);\r
326                                 element.Click += new NodeEventHandler (OnClick);\r
327                         }\r
328                         remove { \r
329                                 Events.RemoveHandler (ClickEvent, value);\r
330                                 element.Click -= new NodeEventHandler (OnClick);\r
331                         }\r
332                 }\r
333 \r
334                 private void OnDoubleClick (object sender, EventArgs e)\r
335                 {\r
336                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DoubleClickEvent];\r
337                         if (eh != null) {\r
338                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
339                                 eh (this, ev);\r
340                         }\r
341                 }\r
342 \r
343                 private static object DoubleClickEvent = new object ();\r
344                 public event HtmlElementEventHandler DoubleClick {\r
345                         add {\r
346                                 Events.AddHandler (DoubleClickEvent, value);\r
347                                 element.DoubleClick += new NodeEventHandler (OnDoubleClick);\r
348                         }\r
349                         remove {\r
350                                 Events.RemoveHandler (DoubleClickEvent, value);\r
351                                 element.DoubleClick -= new NodeEventHandler (OnDoubleClick);\r
352                         }\r
353                 }\r
354 \r
355                 private void OnMouseDown (object sender, EventArgs e)\r
356                 {\r
357                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseDownEvent];\r
358                         if (eh != null) {\r
359                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
360                                 eh (this, ev);\r
361                         }\r
362                 }\r
363 \r
364                 private static object MouseDownEvent = new object ();\r
365                 public event HtmlElementEventHandler MouseDown {\r
366                         add {\r
367                                 Events.AddHandler (MouseDownEvent, value);\r
368                                 element.MouseDown += new NodeEventHandler (OnMouseDown);\r
369                         }\r
370                         remove {\r
371                                 Events.RemoveHandler (MouseDownEvent, value);\r
372                                 element.MouseDown -= new NodeEventHandler (OnMouseDown);\r
373                         }\r
374                 }\r
375 \r
376                 private void OnMouseUp (object sender, EventArgs e)\r
377                 {\r
378                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseUpEvent];\r
379                         if (eh != null) {\r
380                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
381                                 eh (this, ev);\r
382                         }\r
383                 }\r
384 \r
385                 private static object MouseUpEvent = new object ();\r
386                 public event HtmlElementEventHandler MouseUp {\r
387                         add {\r
388                                 Events.AddHandler (MouseUpEvent, value);\r
389                                 element.MouseUp += new NodeEventHandler (OnMouseUp);\r
390                         }\r
391                         remove {\r
392                                 Events.RemoveHandler (MouseUpEvent, value);\r
393                                 element.MouseUp -= new NodeEventHandler (OnMouseUp);\r
394                         }\r
395                 }\r
396 \r
397                 private void OnMouseMove (object sender, EventArgs e)\r
398                 {\r
399                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseMoveEvent];\r
400                         if (eh != null) {\r
401                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
402                                 eh (this, ev);\r
403                         }\r
404                 }\r
405 \r
406                 private static object MouseMoveEvent = new object ();\r
407                 public event HtmlElementEventHandler MouseMove {\r
408                         add {\r
409                                 Events.AddHandler (MouseMoveEvent, value);\r
410                                 element.MouseMove += new NodeEventHandler (OnMouseMove);\r
411                         }\r
412                         remove {\r
413                                 Events.RemoveHandler (MouseMoveEvent, value);\r
414                                 element.MouseMove -= new NodeEventHandler (OnMouseMove);\r
415                         }\r
416                 }\r
417 \r
418                 private void OnMouseOver (object sender, EventArgs e)\r
419                 {\r
420                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseOverEvent];\r
421                         if (eh != null) {\r
422                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
423                                 eh (this, ev);\r
424                         }\r
425                 }\r
426 \r
427                 private static object MouseOverEvent = new object ();\r
428                 public event HtmlElementEventHandler MouseOver {\r
429                         add { \r
430                                 Events.AddHandler (MouseOverEvent, value);\r
431                                 element.MouseOver += new NodeEventHandler (OnMouseOver);\r
432                         }\r
433                         remove { \r
434                                 Events.RemoveHandler (MouseOverEvent, value);\r
435                                 element.MouseOver -= new NodeEventHandler (OnMouseOver);\r
436                         }\r
437                 }\r
438                 \r
439                 private void OnMouseEnter (object sender, EventArgs e)\r
440                 {\r
441                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseEnterEvent];\r
442                         if (eh != null) {\r
443                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
444                                 eh (this, ev);\r
445                         }\r
446                 }\r
447                 \r
448                 private static object MouseEnterEvent = new object ();\r
449                 public event HtmlElementEventHandler MouseEnter {\r
450                         add {\r
451                                 Events.AddHandler (MouseEnterEvent, value);\r
452                                 element.MouseEnter += new NodeEventHandler (OnMouseEnter);\r
453                         }\r
454                         remove {\r
455                                 Events.RemoveHandler (MouseEnterEvent, value);\r
456                                 element.MouseEnter -= new NodeEventHandler (OnMouseEnter);\r
457                         }\r
458                 }\r
459                 \r
460                 private void OnMouseLeave (object sender, EventArgs e)\r
461                 {\r
462                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseLeaveEvent];\r
463                         if (eh != null) {\r
464                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
465                                 eh (this, ev);\r
466                         }\r
467                 }\r
468                 \r
469                 private static object MouseLeaveEvent = new object ();\r
470                 public event HtmlElementEventHandler MouseLeave {\r
471                         add {\r
472                                 Events.AddHandler (MouseLeaveEvent, value);\r
473                                 element.MouseLeave += new NodeEventHandler (OnMouseLeave);\r
474                         }\r
475                         remove {\r
476                                 Events.RemoveHandler (MouseLeaveEvent, value);\r
477                                 element.MouseLeave -= new NodeEventHandler (OnMouseLeave);\r
478                         }\r
479                 }\r
480 \r
481                 private void OnKeyDown (object sender, EventArgs e)\r
482                 {\r
483                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyDownEvent];\r
484                         if (eh != null) {\r
485                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
486                                 eh (this, ev);\r
487                         }\r
488                 }\r
489                 \r
490                 private static object KeyDownEvent = new object ();\r
491                 public event HtmlElementEventHandler KeyDown {\r
492                         add {\r
493                                 Events.AddHandler (KeyDownEvent, value);\r
494                                 element.KeyDown += new NodeEventHandler (OnKeyDown);\r
495                         }\r
496                         remove {\r
497                                 Events.RemoveHandler (KeyDownEvent, value);\r
498                                 element.KeyDown -= new NodeEventHandler (OnKeyDown);\r
499                         }\r
500                 }\r
501 \r
502                 private void OnKeyPress (object sender, EventArgs e)\r
503                 {\r
504                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyPressEvent];\r
505                         if (eh != null) {\r
506                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
507                                 eh (this, ev);\r
508                         }\r
509                 }\r
510                 \r
511                 private static object KeyPressEvent = new object ();\r
512                 public event HtmlElementEventHandler KeyPress {\r
513                         add {\r
514                                 Events.AddHandler (KeyPressEvent, value);\r
515                                 element.KeyPress += new NodeEventHandler (OnKeyPress);\r
516                         }\r
517                         remove {\r
518                                 Events.RemoveHandler (KeyPressEvent, value);\r
519                                 element.KeyPress -= new NodeEventHandler (OnKeyPress);\r
520                         }\r
521                 }\r
522 \r
523                 private void OnKeyUp (object sender, EventArgs e)\r
524                 {\r
525                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyUpEvent];\r
526                         if (eh != null) {\r
527                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
528                                 eh (this, ev);\r
529                         }\r
530                 }\r
531                 \r
532                 private static object KeyUpEvent = new object ();\r
533                 public event HtmlElementEventHandler KeyUp {\r
534                         add {\r
535                                 Events.AddHandler (KeyUpEvent, value);\r
536                                 element.KeyUp += new NodeEventHandler (OnKeyUp);\r
537                         }\r
538                         remove {\r
539                                 Events.RemoveHandler (KeyUpEvent, value);\r
540                                 element.KeyUp -= new NodeEventHandler (OnKeyUp);\r
541                         }\r
542                 }\r
543 \r
544                 private static object DragEvent = new object ();\r
545                 public event HtmlElementEventHandler Drag {\r
546                         add {\r
547                                 Events.AddHandler (DragEvent, value);\r
548                         }\r
549                         remove {\r
550                                 Events.RemoveHandler (DragEvent, value);\r
551                         }\r
552                 }\r
553 \r
554                 private void OnDrag (object sender, EventArgs e)\r
555                 {\r
556                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragEvent];\r
557                         if (eh != null) {\r
558                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
559                                 eh (this, ev);\r
560                         }\r
561                 }\r
562 \r
563 \r
564                 private static object DragEndEvent = new object ();\r
565                 public event HtmlElementEventHandler DragEnd {\r
566                         add     {\r
567                                 Events.AddHandler (DragEndEvent, value);\r
568                         }\r
569                         remove {\r
570                                 Events.RemoveHandler (DragEndEvent, value);\r
571                         }\r
572                 }\r
573 \r
574                 private void OnDragEnd (object sender, EventArgs e)\r
575                 {\r
576                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragEndEvent];\r
577                         if (eh != null) {\r
578                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
579                                 eh (this, ev);\r
580                         }\r
581                 }\r
582                 private static object DragLeaveEvent = new object ();\r
583                 public event HtmlElementEventHandler DragLeave {\r
584                         add {\r
585                                 Events.AddHandler (DragLeaveEvent, value);\r
586                         }\r
587                         remove {\r
588                                 Events.RemoveHandler (DragLeaveEvent, value);\r
589                         }\r
590                 }\r
591 \r
592                 private void OnDragLeave (object sender, EventArgs e)\r
593                 {\r
594                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragLeaveEvent];\r
595                         if (eh != null) {\r
596                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
597                                 eh (this, ev);\r
598                         }\r
599                 }\r
600                 private static object DragOverEvent = new object ();\r
601                 public event HtmlElementEventHandler DragOver {\r
602                         add {\r
603                                 Events.AddHandler (DragOverEvent, value);\r
604                         }\r
605                         remove {\r
606                                 Events.RemoveHandler (DragOverEvent, value);\r
607                         }\r
608                 }\r
609 \r
610                 private void OnDragOver (object sender, EventArgs e)\r
611                 {\r
612                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragOverEvent];\r
613                         if (eh != null) {\r
614                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
615                                 eh (this, ev);\r
616                         }\r
617                 }\r
618                 private static object FocusingEvent = new object ();\r
619                 public event HtmlElementEventHandler Focusing {\r
620                         add {\r
621                                 Events.AddHandler (FocusingEvent, value);\r
622                                 ((INode)element).OnFocus += new NodeEventHandler (OnFocusing);\r
623                         }\r
624                         remove {\r
625                                 Events.RemoveHandler (FocusingEvent, value);\r
626                                 ((INode)element).OnFocus -= new NodeEventHandler (OnFocusing);\r
627                         }\r
628                 }\r
629 \r
630                 private void OnFocusing (object sender, EventArgs e)\r
631                 {\r
632                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[FocusingEvent];\r
633                         if (eh != null) {\r
634                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
635                                 eh (this, ev);\r
636                         }\r
637                 }\r
638 \r
639                 private static object GotFocusEvent = new object ();\r
640                 public event HtmlElementEventHandler GotFocus {\r
641                         add {\r
642                                 Events.AddHandler (GotFocusEvent, value);\r
643                                 ((INode)element).OnFocus += new NodeEventHandler (OnGotFocus);\r
644                         }\r
645                         remove {\r
646                                 Events.RemoveHandler (GotFocusEvent, value);\r
647                                 ((INode)element).OnFocus -= new NodeEventHandler (OnGotFocus);\r
648                         }\r
649                 }\r
650 \r
651                 private void OnGotFocus (object sender, EventArgs e)\r
652                 {\r
653                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[GotFocusEvent];\r
654                         if (eh != null) {\r
655                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
656                                 eh (this, ev);\r
657                         }\r
658                 }\r
659                 private static object LosingFocusEvent = new object ();\r
660                 public event HtmlElementEventHandler LosingFocus {\r
661                         add {\r
662                                 Events.AddHandler (LosingFocusEvent, value);\r
663                                 ((INode)element).OnBlur += new NodeEventHandler (OnLosingFocus);\r
664                         }\r
665                         remove {\r
666                                 Events.RemoveHandler (LosingFocusEvent, value);\r
667                                 ((INode)element).OnBlur -= new NodeEventHandler (OnLosingFocus);\r
668                         }\r
669                 }\r
670 \r
671                 private void OnLosingFocus (object sender, EventArgs e)\r
672                 {\r
673                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[LosingFocusEvent];\r
674                         if (eh != null) {\r
675                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
676                                 eh (this, ev);\r
677                         }\r
678                 }\r
679                 private static object LostFocusEvent = new object ();\r
680                 public event HtmlElementEventHandler LostFocus {\r
681                         add {\r
682                                 Events.AddHandler (LostFocusEvent, value);\r
683                                 ((INode)element).OnBlur += new NodeEventHandler (OnLostFocus);\r
684                         }\r
685                         remove {\r
686                                 Events.RemoveHandler (LostFocusEvent, value);\r
687                                 ((INode)element).OnBlur -= new NodeEventHandler (OnLostFocus);\r
688                         }\r
689                 }\r
690 \r
691                 private void OnLostFocus (object sender, EventArgs e)\r
692                 {\r
693                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[LostFocusEvent];\r
694                         if (eh != null) {\r
695                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
696                                 eh (this, ev);\r
697                         }\r
698                 }\r
699 \r
700                 #endregion\r
701         }\r
702 }\r