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
28 using System.Drawing;
\r
29 using System.ComponentModel;
\r
30 using Mono.WebBrowser.DOM;
\r
32 namespace System.Windows.Forms
\r
34 public sealed class HtmlElement
\r
36 private EventHandlerList events;
\r
37 private Mono.WebBrowser.IWebBrowser webHost;
\r
38 internal IElement element;
\r
39 private WebBrowser owner;
\r
41 internal HtmlElement (WebBrowser owner, Mono.WebBrowser.IWebBrowser webHost, IElement element)
\r
43 this.webHost = webHost;
\r
44 this.element = element;
\r
48 internal EventHandlerList Events {
\r
51 events = new EventHandlerList();
\r
58 public HtmlElementCollection All {
\r
60 return new HtmlElementCollection (owner, webHost, this.element.All);
\r
64 // from http://www.w3.org/TR/html401/index/elements.html
\r
65 public bool CanHaveChildren {
\r
67 string tag = this.TagName;
\r
68 switch (tag.ToLowerInvariant ()) {
\r
89 public HtmlElementCollection Children {
\r
91 return new HtmlElementCollection (owner, webHost, this.element.Children);
\r
95 public Rectangle ClientRectangle {
\r
96 get { return new Rectangle (0, 0, this.element.ClientWidth, this.element.ClientHeight); }
\r
99 public Rectangle OffsetRectangle {
\r
100 get { return new Rectangle (this.element.OffsetLeft, this.element.OffsetTop, this.element.OffsetWidth, this.element.OffsetHeight); }
\r
103 public Rectangle ScrollRectangle {
\r
104 get { return new Rectangle (this.element.ScrollLeft, this.element.ScrollTop, this.element.ScrollWidth, this.element.ScrollHeight); }
\r
107 public int ScrollLeft {
\r
108 get { return this.element.ScrollLeft; }
\r
109 set { this.element.ScrollLeft = value; }
\r
112 public int ScrollTop {
\r
113 get { return this.element.ScrollTop; }
\r
114 set { this.element.ScrollTop = value; }
\r
117 public HtmlElement OffsetParent {
\r
118 get { return new HtmlElement (owner, this.webHost, this.element.OffsetParent); }
\r
121 public HtmlDocument Document {
\r
123 return new HtmlDocument (owner, webHost, element.Owner);
\r
127 public bool Enabled {
\r
128 get { return !this.element.Disabled; }
\r
129 set { this.element.Disabled = !value; }
\r
132 public string InnerHtml {
\r
133 get { return this.element.InnerHTML; }
\r
134 set { this.element.InnerHTML = value; }
\r
137 public string InnerText {
\r
138 get { return this.element.InnerText; }
\r
139 set { this.element.InnerText = value; }
\r
143 get { return GetAttribute("id"); }
\r
144 set { SetAttribute ("id", value); }
\r
147 public string Name {
\r
148 get { return GetAttribute ("name"); }
\r
149 set { SetAttribute ("name", value); }
\r
152 public HtmlElement FirstChild {
\r
154 return new HtmlElement (owner, webHost, (IElement)element.FirstChild);
\r
158 public HtmlElement NextSibling {
\r
159 get { return new HtmlElement (owner, webHost, (IElement)element.Next); }
\r
162 public HtmlElement Parent {
\r
163 get { return new HtmlElement (owner, webHost, (IElement)element.Parent); }
\r
166 public string TagName {
\r
167 get { return element.TagName; }
\r
170 public short TabIndex {
\r
171 get { return (short)element.TabIndex; }
\r
172 set { element.TabIndex = value; }
\r
175 public object DomElement {
\r
176 get { throw new NotSupportedException ("Retrieving a reference to an mshtml interface is not supported. Sorry."); }
\r
179 public string OuterHtml {
\r
180 get { return this.element.OuterHTML; }
\r
181 set { this.element.OuterHTML = value; }
\r
184 public string OuterText {
\r
185 get { return this.element.OuterText; }
\r
186 set { this.element.OuterText = value; }
\r
189 public string Style {
\r
190 get { return this.element.Style; }
\r
191 set { this.element.Style = value; }
\r
197 public HtmlElement AppendChild (HtmlElement newElement)
\r
199 IElement newChild = this.element.AppendChild (newElement.element);
\r
200 newElement.element = newChild;
\r
204 public void AttachEventHandler (string eventName, EventHandler eventHandler)
\r
206 element.AttachEventHandler (eventName, eventHandler);
\r
209 public void DetachEventHandler (string eventName, EventHandler eventHandler)
\r
211 element.DetachEventHandler (eventName, eventHandler);
\r
214 public void Focus ()
\r
216 throw new NotImplementedException ();
\r
219 public string GetAttribute (string attributeName)
\r
221 return element.GetAttribute (attributeName);
\r
224 public HtmlElementCollection GetElementsByTagName (string tagName)
\r
226 Mono.WebBrowser.DOM.IElementCollection col = element.GetElementsByTagName (tagName);
\r
227 return new HtmlElementCollection (owner, webHost, col);
\r
230 public override int GetHashCode ()
\r
232 if (element == null)
\r
234 return element.GetHashCode ();
\r
237 internal bool HasAttribute (string name)
\r
239 return element.HasAttribute (name);
\r
242 public HtmlElement InsertAdjacentElement (HtmlElementInsertionOrientation orient, HtmlElement newElement)
\r
245 case HtmlElementInsertionOrientation.BeforeBegin:
\r
246 element.Parent.InsertBefore (newElement.element, element);
\r
248 case HtmlElementInsertionOrientation.AfterBegin:
\r
249 element.InsertBefore (newElement.element, element.FirstChild);
\r
251 case HtmlElementInsertionOrientation.BeforeEnd:
\r
252 return this.AppendChild (newElement);
\r
253 case HtmlElementInsertionOrientation.AfterEnd:
\r
254 return this.AppendChild (newElement);
\r
259 public object InvokeMember (string methodName)
\r
261 return this.element.Owner.InvokeScript ("eval ('" + methodName + "()');");
\r
264 public object InvokeMember (string methodName, params object[] parameter)
\r
266 string[] strArgs = new string[parameter.Length];
\r
267 for (int i = 0; i < parameter.Length; i++) {
\r
268 strArgs[i] = parameter.ToString();
\r
270 return this.element.Owner.InvokeScript ("eval ('" + methodName + "(" + String.Join (",", strArgs) + ")');");
\r
273 public void RaiseEvent (string eventName)
\r
275 this.element.FireEvent (eventName);
\r
278 public void RemoveFocus ()
\r
280 this.element.Blur ();
\r
283 public void ScrollIntoView (bool alignWithTop)
\r
285 this.element.ScrollIntoView (alignWithTop);
\r
288 public void SetAttribute (string attributeName, string value)
\r
290 this.element.SetAttribute (attributeName, value);
\r
293 public override bool Equals (object obj)
\r
295 return this == (HtmlElement) obj;
\r
298 public static bool operator == (HtmlElement left, HtmlElement right)
\r
300 if ((object)left == (object)right)
\r
302 if ((object)left == null || (object)right == null)
\r
304 return left.element.Equals (right.element);
\r
307 public static bool operator != (HtmlElement left, HtmlElement right)
\r
309 return !(left == right);
\r
314 private void OnClick (object sender, EventArgs e)
\r
316 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[ClickEvent];
\r
318 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
323 private static object ClickEvent = new object ();
\r
324 public event HtmlElementEventHandler Click {
\r
326 Events.AddHandler (ClickEvent, value);
\r
327 element.Click += new NodeEventHandler (OnClick);
\r
330 Events.RemoveHandler (ClickEvent, value);
\r
331 element.Click -= new NodeEventHandler (OnClick);
\r
335 private void OnDoubleClick (object sender, EventArgs e)
\r
337 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DoubleClickEvent];
\r
339 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
344 private static object DoubleClickEvent = new object ();
\r
345 public event HtmlElementEventHandler DoubleClick {
\r
347 Events.AddHandler (DoubleClickEvent, value);
\r
348 element.DoubleClick += new NodeEventHandler (OnDoubleClick);
\r
351 Events.RemoveHandler (DoubleClickEvent, value);
\r
352 element.DoubleClick -= new NodeEventHandler (OnDoubleClick);
\r
356 private void OnMouseDown (object sender, EventArgs e)
\r
358 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseDownEvent];
\r
360 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
365 private static object MouseDownEvent = new object ();
\r
366 public event HtmlElementEventHandler MouseDown {
\r
368 Events.AddHandler (MouseDownEvent, value);
\r
369 element.MouseDown += new NodeEventHandler (OnMouseDown);
\r
372 Events.RemoveHandler (MouseDownEvent, value);
\r
373 element.MouseDown -= new NodeEventHandler (OnMouseDown);
\r
377 private void OnMouseUp (object sender, EventArgs e)
\r
379 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseUpEvent];
\r
381 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
386 private static object MouseUpEvent = new object ();
\r
387 public event HtmlElementEventHandler MouseUp {
\r
389 Events.AddHandler (MouseUpEvent, value);
\r
390 element.MouseUp += new NodeEventHandler (OnMouseUp);
\r
393 Events.RemoveHandler (MouseUpEvent, value);
\r
394 element.MouseUp -= new NodeEventHandler (OnMouseUp);
\r
398 private void OnMouseMove (object sender, EventArgs e)
\r
400 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseMoveEvent];
\r
402 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
407 private static object MouseMoveEvent = new object ();
\r
408 public event HtmlElementEventHandler MouseMove {
\r
410 Events.AddHandler (MouseMoveEvent, value);
\r
411 element.MouseMove += new NodeEventHandler (OnMouseMove);
\r
414 Events.RemoveHandler (MouseMoveEvent, value);
\r
415 element.MouseMove -= new NodeEventHandler (OnMouseMove);
\r
419 private void OnMouseOver (object sender, EventArgs e)
\r
421 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseOverEvent];
\r
423 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
428 private static object MouseOverEvent = new object ();
\r
429 public event HtmlElementEventHandler MouseOver {
\r
431 Events.AddHandler (MouseOverEvent, value);
\r
432 element.MouseOver += new NodeEventHandler (OnMouseOver);
\r
435 Events.RemoveHandler (MouseOverEvent, value);
\r
436 element.MouseOver -= new NodeEventHandler (OnMouseOver);
\r
440 private void OnMouseEnter (object sender, EventArgs e)
\r
442 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseEnterEvent];
\r
444 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
449 private static object MouseEnterEvent = new object ();
\r
450 public event HtmlElementEventHandler MouseEnter {
\r
452 Events.AddHandler (MouseEnterEvent, value);
\r
453 element.MouseEnter += new NodeEventHandler (OnMouseEnter);
\r
456 Events.RemoveHandler (MouseEnterEvent, value);
\r
457 element.MouseEnter -= new NodeEventHandler (OnMouseEnter);
\r
461 private void OnMouseLeave (object sender, EventArgs e)
\r
463 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseLeaveEvent];
\r
465 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
470 private static object MouseLeaveEvent = new object ();
\r
471 public event HtmlElementEventHandler MouseLeave {
\r
473 Events.AddHandler (MouseLeaveEvent, value);
\r
474 element.MouseLeave += new NodeEventHandler (OnMouseLeave);
\r
477 Events.RemoveHandler (MouseLeaveEvent, value);
\r
478 element.MouseLeave -= new NodeEventHandler (OnMouseLeave);
\r
482 private void OnKeyDown (object sender, EventArgs e)
\r
484 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyDownEvent];
\r
486 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
491 private static object KeyDownEvent = new object ();
\r
492 public event HtmlElementEventHandler KeyDown {
\r
494 Events.AddHandler (KeyDownEvent, value);
\r
495 element.KeyDown += new NodeEventHandler (OnKeyDown);
\r
498 Events.RemoveHandler (KeyDownEvent, value);
\r
499 element.KeyDown -= new NodeEventHandler (OnKeyDown);
\r
503 private void OnKeyPress (object sender, EventArgs e)
\r
505 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyPressEvent];
\r
507 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
512 private static object KeyPressEvent = new object ();
\r
513 public event HtmlElementEventHandler KeyPress {
\r
515 Events.AddHandler (KeyPressEvent, value);
\r
516 element.KeyPress += new NodeEventHandler (OnKeyPress);
\r
519 Events.RemoveHandler (KeyPressEvent, value);
\r
520 element.KeyPress -= new NodeEventHandler (OnKeyPress);
\r
524 private void OnKeyUp (object sender, EventArgs e)
\r
526 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyUpEvent];
\r
528 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
533 private static object KeyUpEvent = new object ();
\r
534 public event HtmlElementEventHandler KeyUp {
\r
536 Events.AddHandler (KeyUpEvent, value);
\r
537 element.KeyUp += new NodeEventHandler (OnKeyUp);
\r
540 Events.RemoveHandler (KeyUpEvent, value);
\r
541 element.KeyUp -= new NodeEventHandler (OnKeyUp);
\r
545 private static object DragEvent = new object ();
\r
546 public event HtmlElementEventHandler Drag {
\r
548 Events.AddHandler (DragEvent, value);
\r
551 Events.RemoveHandler (DragEvent, value);
\r
555 private void OnDrag (object sender, EventArgs e)
\r
557 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragEvent];
\r
559 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
565 private static object DragEndEvent = new object ();
\r
566 public event HtmlElementEventHandler DragEnd {
\r
568 Events.AddHandler (DragEndEvent, value);
\r
571 Events.RemoveHandler (DragEndEvent, value);
\r
575 private void OnDragEnd (object sender, EventArgs e)
\r
577 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragEndEvent];
\r
579 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
583 private static object DragLeaveEvent = new object ();
\r
584 public event HtmlElementEventHandler DragLeave {
\r
586 Events.AddHandler (DragLeaveEvent, value);
\r
589 Events.RemoveHandler (DragLeaveEvent, value);
\r
593 private void OnDragLeave (object sender, EventArgs e)
\r
595 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragLeaveEvent];
\r
597 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
601 private static object DragOverEvent = new object ();
\r
602 public event HtmlElementEventHandler DragOver {
\r
604 Events.AddHandler (DragOverEvent, value);
\r
607 Events.RemoveHandler (DragOverEvent, value);
\r
611 private void OnDragOver (object sender, EventArgs e)
\r
613 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DragOverEvent];
\r
615 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
619 private static object FocusingEvent = new object ();
\r
620 public event HtmlElementEventHandler Focusing {
\r
622 Events.AddHandler (FocusingEvent, value);
\r
623 ((INode)element).OnFocus += new NodeEventHandler (OnFocusing);
\r
626 Events.RemoveHandler (FocusingEvent, value);
\r
627 ((INode)element).OnFocus -= new NodeEventHandler (OnFocusing);
\r
631 private void OnFocusing (object sender, EventArgs e)
\r
633 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[FocusingEvent];
\r
635 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
640 private static object GotFocusEvent = new object ();
\r
641 public event HtmlElementEventHandler GotFocus {
\r
643 Events.AddHandler (GotFocusEvent, value);
\r
644 ((INode)element).OnFocus += new NodeEventHandler (OnGotFocus);
\r
647 Events.RemoveHandler (GotFocusEvent, value);
\r
648 ((INode)element).OnFocus -= new NodeEventHandler (OnGotFocus);
\r
652 private void OnGotFocus (object sender, EventArgs e)
\r
654 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[GotFocusEvent];
\r
656 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
660 private static object LosingFocusEvent = new object ();
\r
661 public event HtmlElementEventHandler LosingFocus {
\r
663 Events.AddHandler (LosingFocusEvent, value);
\r
664 ((INode)element).OnBlur += new NodeEventHandler (OnLosingFocus);
\r
667 Events.RemoveHandler (LosingFocusEvent, value);
\r
668 ((INode)element).OnBlur -= new NodeEventHandler (OnLosingFocus);
\r
672 private void OnLosingFocus (object sender, EventArgs e)
\r
674 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[LosingFocusEvent];
\r
676 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r
680 private static object LostFocusEvent = new object ();
\r
681 public event HtmlElementEventHandler LostFocus {
\r
683 Events.AddHandler (LostFocusEvent, value);
\r
684 ((INode)element).OnBlur += new NodeEventHandler (OnLostFocus);
\r
687 Events.RemoveHandler (LostFocusEvent, value);
\r
688 ((INode)element).OnBlur -= new NodeEventHandler (OnLostFocus);
\r
692 private void OnLostFocus (object sender, EventArgs e)
\r
694 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[LostFocusEvent];
\r
696 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
\r