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
9 // The above copyright notice and this permission notice shall be
\r
10 // included in all copies or substantial portions of the Software.
\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
20 // Copyright (c) 2007, 2008 Novell, Inc.
\r
23 // Andreia Gaita <avidigal@novell.com>
\r
27 using System.Drawing;
\r
28 using System.ComponentModel;
\r
29 using Mono.WebBrowser.DOM;
\r
31 namespace System.Windows.Forms
\r
33 public sealed class HtmlElement
\r
35 private EventHandlerList events;
\r
36 private Mono.WebBrowser.IWebBrowser webHost;
\r
37 internal IElement element;
\r
38 private WebBrowser owner;
\r
40 internal HtmlElement (WebBrowser owner, Mono.WebBrowser.IWebBrowser webHost, IElement element)
\r
42 this.webHost = webHost;
\r
43 this.element = element;
\r
47 internal EventHandlerList Events {
\r
50 events = new EventHandlerList();
\r
57 public HtmlElementCollection All {
\r
59 return new HtmlElementCollection (owner, webHost, this.element.All);
\r
63 // from http://www.w3.org/TR/html401/index/elements.html
\r
64 public bool CanHaveChildren {
\r
66 string tag = this.TagName;
\r
67 switch (tag.ToLowerInvariant ()) {
\r
88 public HtmlElementCollection Children {
\r
90 return new HtmlElementCollection (owner, webHost, this.element.Children);
\r
94 public Rectangle ClientRectangle {
\r
95 get { return new Rectangle (0, 0, this.element.ClientWidth, this.element.ClientHeight); }
\r
98 public Rectangle OffsetRectangle {
\r
99 get { return new Rectangle (this.element.OffsetLeft, this.element.OffsetTop, this.element.OffsetWidth, this.element.OffsetHeight); }
\r
102 public Rectangle ScrollRectangle {
\r
103 get { return new Rectangle (this.element.ScrollLeft, this.element.ScrollTop, this.element.ScrollWidth, this.element.ScrollHeight); }
\r
106 public int ScrollLeft {
\r
107 get { return this.element.ScrollLeft; }
\r
108 set { this.element.ScrollLeft = value; }
\r
111 public int ScrollTop {
\r
112 get { return this.element.ScrollTop; }
\r
113 set { this.element.ScrollTop = value; }
\r
116 public HtmlElement OffsetParent {
\r
117 get { return new HtmlElement (owner, this.webHost, this.element.OffsetParent); }
\r
120 public HtmlDocument Document {
\r
122 return new HtmlDocument (owner, webHost, element.Owner);
\r
126 public bool Enabled {
\r
127 get { return !this.element.Disabled; }
\r
128 set { this.element.Disabled = !value; }
\r
131 public string InnerHtml {
\r
132 get { return this.element.InnerHTML; }
\r
133 set { this.element.InnerHTML = value; }
\r
136 public string InnerText {
\r
137 get { return this.element.InnerText; }
\r
138 set { this.element.InnerText = value; }
\r
142 get { return GetAttribute("id"); }
\r
143 set { SetAttribute ("id", value); }
\r
146 public string Name {
\r
147 get { return GetAttribute ("name"); }
\r
148 set { SetAttribute ("name", value); }
\r
151 public HtmlElement FirstChild {
\r
153 return new HtmlElement (owner, webHost, (IElement)element.FirstChild);
\r
157 public HtmlElement NextSibling {
\r
158 get { return new HtmlElement (owner, webHost, (IElement)element.Next); }
\r
161 public HtmlElement Parent {
\r
162 get { return new HtmlElement (owner, webHost, (IElement)element.Parent); }
\r
165 public string TagName {
\r
166 get { return element.TagName; }
\r
169 public short TabIndex {
\r
170 get { return (short)element.TabIndex; }
\r
171 set { element.TabIndex = value; }
\r
174 public object DomElement {
\r
175 get { throw new NotSupportedException ("Retrieving a reference to an mshtml interface is not supported. Sorry."); }
\r
178 public string OuterHtml {
\r
179 get { return this.element.OuterHTML; }
\r
180 set { this.element.OuterHTML = value; }
\r
183 public string OuterText {
\r
184 get { return this.element.OuterText; }
\r
185 set { this.element.OuterText = value; }
\r
188 public string Style {
\r
189 get { return this.element.Style; }
\r
190 set { this.element.Style = value; }
\r
196 public HtmlElement AppendChild (HtmlElement newElement)
\r
198 IElement newChild = this.element.AppendChild (newElement.element);
\r
199 newElement.element = newChild;
\r
203 public void AttachEventHandler (string eventName, EventHandler eventHandler)
\r
205 element.AttachEventHandler (eventName, eventHandler);
\r
208 public void DetachEventHandler (string eventName, EventHandler eventHandler)
\r
210 element.DetachEventHandler (eventName, eventHandler);
\r
213 public void Focus ()
\r
215 throw new NotImplementedException ();
\r
218 public string GetAttribute (string attributeName)
\r
220 return element.GetAttribute (attributeName);
\r
223 public HtmlElementCollection GetElementsByTagName (string tagName)
\r
225 Mono.WebBrowser.DOM.IElementCollection col = element.GetElementsByTagName (tagName);
\r
226 return new HtmlElementCollection (owner, webHost, col);
\r
229 public override int GetHashCode ()
\r
231 if (element == null)
\r
233 return element.GetHashCode ();
\r
236 internal bool HasAttribute (string name)
\r
238 return element.HasAttribute (name);
\r
241 public HtmlElement InsertAdjacentElement (HtmlElementInsertionOrientation orient, HtmlElement newElement)
\r
244 case HtmlElementInsertionOrientation.BeforeBegin:
\r
245 element.Parent.InsertBefore (newElement.element, element);
\r
247 case HtmlElementInsertionOrientation.AfterBegin:
\r
248 element.InsertBefore (newElement.element, element.FirstChild);
\r
250 case HtmlElementInsertionOrientation.BeforeEnd:
\r
251 return this.AppendChild (newElement);
\r
252 case HtmlElementInsertionOrientation.AfterEnd:
\r
253 return this.AppendChild (newElement);
\r
258 public object InvokeMember (string methodName)
\r
260 return this.element.Owner.InvokeScript ("eval ('" + methodName + "()');");
\r
263 public object InvokeMember (string methodName, params object[] parameter)
\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
269 return this.element.Owner.InvokeScript ("eval ('" + methodName + "(" + String.Join (",", strArgs) + ")');");
\r
272 public void RaiseEvent (string eventName)
\r
274 this.element.FireEvent (eventName);
\r
277 public void RemoveFocus ()
\r
279 this.element.Blur ();
\r
282 public void ScrollIntoView (bool alignWithTop)
\r
284 this.element.ScrollIntoView (alignWithTop);
\r
287 public void SetAttribute (string attributeName, string value)
\r
289 this.element.SetAttribute (attributeName, value);
\r
292 public override bool Equals (object obj)
\r
294 return this == (HtmlElement) obj;
\r
297 public static bool operator == (HtmlElement left, HtmlElement right)
\r
299 if ((object)left == (object)right)
\r
301 if ((object)left == null || (object)right == null)
\r
303 return left.element.Equals (right.element);
\r
306 public static bool operator != (HtmlElement left, HtmlElement right)
\r
308 return !(left == right);
\r
313 private void OnClick (object sender, EventArgs e)
\r
315 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[ClickEvent];
\r
317 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
322 private static object ClickEvent = new object ();
\r
323 public event HtmlElementEventHandler Click {
\r
325 Events.AddHandler (ClickEvent, value);
\r
326 element.Click += new NodeEventHandler (OnClick);
\r
329 Events.RemoveHandler (ClickEvent, value);
\r
330 element.Click -= new NodeEventHandler (OnClick);
\r
334 private void OnDoubleClick (object sender, EventArgs e)
\r
336 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DoubleClickEvent];
\r
338 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
343 private static object DoubleClickEvent = new object ();
\r
344 public event HtmlElementEventHandler DoubleClick {
\r
346 Events.AddHandler (DoubleClickEvent, value);
\r
347 element.DoubleClick += new NodeEventHandler (OnDoubleClick);
\r
350 Events.RemoveHandler (DoubleClickEvent, value);
\r
351 element.DoubleClick -= new NodeEventHandler (OnDoubleClick);
\r
355 private void OnMouseDown (object sender, EventArgs e)
\r
357 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseDownEvent];
\r
359 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
364 private static object MouseDownEvent = new object ();
\r
365 public event HtmlElementEventHandler MouseDown {
\r
367 Events.AddHandler (MouseDownEvent, value);
\r
368 element.MouseDown += new NodeEventHandler (OnMouseDown);
\r
371 Events.RemoveHandler (MouseDownEvent, value);
\r
372 element.MouseDown -= new NodeEventHandler (OnMouseDown);
\r
376 private void OnMouseUp (object sender, EventArgs e)
\r
378 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseUpEvent];
\r
380 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
385 private static object MouseUpEvent = new object ();
\r
386 public event HtmlElementEventHandler MouseUp {
\r
388 Events.AddHandler (MouseUpEvent, value);
\r
389 element.MouseUp += new NodeEventHandler (OnMouseUp);
\r
392 Events.RemoveHandler (MouseUpEvent, value);
\r
393 element.MouseUp -= new NodeEventHandler (OnMouseUp);
\r
397 private void OnMouseMove (object sender, EventArgs e)
\r
399 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseMoveEvent];
\r
401 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
406 private static object MouseMoveEvent = new object ();
\r
407 public event HtmlElementEventHandler MouseMove {
\r
409 Events.AddHandler (MouseMoveEvent, value);
\r
410 element.MouseMove += new NodeEventHandler (OnMouseMove);
\r
413 Events.RemoveHandler (MouseMoveEvent, value);
\r
414 element.MouseMove -= new NodeEventHandler (OnMouseMove);
\r
418 private void OnMouseOver (object sender, EventArgs e)
\r
420 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseOverEvent];
\r
422 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
427 private static object MouseOverEvent = new object ();
\r
428 public event HtmlElementEventHandler MouseOver {
\r
430 Events.AddHandler (MouseOverEvent, value);
\r
431 element.MouseOver += new NodeEventHandler (OnMouseOver);
\r
434 Events.RemoveHandler (MouseOverEvent, value);
\r
435 element.MouseOver -= new NodeEventHandler (OnMouseOver);
\r
439 private void OnMouseEnter (object sender, EventArgs e)
\r
441 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseEnterEvent];
\r
443 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
448 private static object MouseEnterEvent = new object ();
\r
449 public event HtmlElementEventHandler MouseEnter {
\r
451 Events.AddHandler (MouseEnterEvent, value);
\r
452 element.MouseEnter += new NodeEventHandler (OnMouseEnter);
\r
455 Events.RemoveHandler (MouseEnterEvent, value);
\r
456 element.MouseEnter -= new NodeEventHandler (OnMouseEnter);
\r
460 private void OnMouseLeave (object sender, EventArgs e)
\r
462 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseLeaveEvent];
\r
464 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
469 private static object MouseLeaveEvent = new object ();
\r
470 public event HtmlElementEventHandler MouseLeave {
\r
472 Events.AddHandler (MouseLeaveEvent, value);
\r
473 element.MouseLeave += new NodeEventHandler (OnMouseLeave);
\r
476 Events.RemoveHandler (MouseLeaveEvent, value);
\r
477 element.MouseLeave -= new NodeEventHandler (OnMouseLeave);
\r
481 private void OnKeyDown (object sender, EventArgs e)
\r
483 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyDownEvent];
\r
485 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
490 private static object KeyDownEvent = new object ();
\r
491 public event HtmlElementEventHandler KeyDown {
\r
493 Events.AddHandler (KeyDownEvent, value);
\r
494 element.KeyDown += new NodeEventHandler (OnKeyDown);
\r
497 Events.RemoveHandler (KeyDownEvent, value);
\r
498 element.KeyDown -= new NodeEventHandler (OnKeyDown);
\r
502 private void OnKeyPress (object sender, EventArgs e)
\r
504 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyPressEvent];
\r
506 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
511 private static object KeyPressEvent = new object ();
\r
512 public event HtmlElementEventHandler KeyPress {
\r
514 Events.AddHandler (KeyPressEvent, value);
\r
515 element.KeyPress += new NodeEventHandler (OnKeyPress);
\r
518 Events.RemoveHandler (KeyPressEvent, value);
\r
519 element.KeyPress -= new NodeEventHandler (OnKeyPress);
\r
523 private void OnKeyUp (object sender, EventArgs e)
\r
525 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyUpEvent];
\r
527 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
532 private static object KeyUpEvent = new object ();
\r
533 public event HtmlElementEventHandler KeyUp {
\r
535 Events.AddHandler (KeyUpEvent, value);
\r
536 element.KeyUp += new NodeEventHandler (OnKeyUp);
\r
539 Events.RemoveHandler (KeyUpEvent, value);
\r
540 element.KeyUp -= new NodeEventHandler (OnKeyUp);
\r
544 private static object DragEvent = new object ();
\r
545 public event HtmlElementEventHandler Drag {
\r
547 Events.AddHandler (DragEvent, value);
\r
550 Events.RemoveHandler (DragEvent, value);
\r
554 private void OnDrag (object sender, EventArgs e)
\r
556 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragEvent];
\r
558 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
564 private static object DragEndEvent = new object ();
\r
565 public event HtmlElementEventHandler DragEnd {
\r
567 Events.AddHandler (DragEndEvent, value);
\r
570 Events.RemoveHandler (DragEndEvent, value);
\r
574 private void OnDragEnd (object sender, EventArgs e)
\r
576 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragEndEvent];
\r
578 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
582 private static object DragLeaveEvent = new object ();
\r
583 public event HtmlElementEventHandler DragLeave {
\r
585 Events.AddHandler (DragLeaveEvent, value);
\r
588 Events.RemoveHandler (DragLeaveEvent, value);
\r
592 private void OnDragLeave (object sender, EventArgs e)
\r
594 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragLeaveEvent];
\r
596 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
600 private static object DragOverEvent = new object ();
\r
601 public event HtmlElementEventHandler DragOver {
\r
603 Events.AddHandler (DragOverEvent, value);
\r
606 Events.RemoveHandler (DragOverEvent, value);
\r
610 private void OnDragOver (object sender, EventArgs e)
\r
612 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragOverEvent];
\r
614 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
618 private static object FocusingEvent = new object ();
\r
619 public event HtmlElementEventHandler Focusing {
\r
621 Events.AddHandler (FocusingEvent, value);
\r
622 ((INode)element).OnFocus += new NodeEventHandler (OnFocusing);
\r
625 Events.RemoveHandler (FocusingEvent, value);
\r
626 ((INode)element).OnFocus -= new NodeEventHandler (OnFocusing);
\r
630 private void OnFocusing (object sender, EventArgs e)
\r
632 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[FocusingEvent];
\r
634 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
639 private static object GotFocusEvent = new object ();
\r
640 public event HtmlElementEventHandler GotFocus {
\r
642 Events.AddHandler (GotFocusEvent, value);
\r
643 ((INode)element).OnFocus += new NodeEventHandler (OnGotFocus);
\r
646 Events.RemoveHandler (GotFocusEvent, value);
\r
647 ((INode)element).OnFocus -= new NodeEventHandler (OnGotFocus);
\r
651 private void OnGotFocus (object sender, EventArgs e)
\r
653 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[GotFocusEvent];
\r
655 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
659 private static object LosingFocusEvent = new object ();
\r
660 public event HtmlElementEventHandler LosingFocus {
\r
662 Events.AddHandler (LosingFocusEvent, value);
\r
663 ((INode)element).OnBlur += new NodeEventHandler (OnLosingFocus);
\r
666 Events.RemoveHandler (LosingFocusEvent, value);
\r
667 ((INode)element).OnBlur -= new NodeEventHandler (OnLosingFocus);
\r
671 private void OnLosingFocus (object sender, EventArgs e)
\r
673 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[LosingFocusEvent];
\r
675 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
679 private static object LostFocusEvent = new object ();
\r
680 public event HtmlElementEventHandler LostFocus {
\r
682 Events.AddHandler (LostFocusEvent, value);
\r
683 ((INode)element).OnBlur += new NodeEventHandler (OnLostFocus);
\r
686 Events.RemoveHandler (LostFocusEvent, value);
\r
687 ((INode)element).OnBlur -= new NodeEventHandler (OnLostFocus);
\r
691 private void OnLostFocus (object sender, EventArgs e)
\r
693 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[LostFocusEvent];
\r
695 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r