1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2007, 2008 Novell, Inc.
23 // Andreia Gaita <avidigal@novell.com>
29 using System.ComponentModel;
30 using System.Globalization;
31 using Mono.WebBrowser.DOM;
33 namespace System.Windows.Forms
35 public sealed class HtmlDocument
37 private EventHandlerList events;
38 private Mono.WebBrowser.IWebBrowser webHost;
39 private IDocument document;
40 private WebBrowser owner;
42 internal HtmlDocument (WebBrowser owner, Mono.WebBrowser.IWebBrowser webHost) :
43 this (owner, webHost, webHost.Document)
47 internal HtmlDocument (WebBrowser owner, Mono.WebBrowser.IWebBrowser webHost, IDocument doc)
49 this.webHost = webHost;
55 internal EventHandlerList Events {
58 events = new EventHandlerList ();
67 public void AttachEventHandler (string eventName, EventHandler eventHandler)
69 document.AttachEventHandler (eventName, eventHandler);
72 public HtmlElement CreateElement (string elementTag)
74 Mono.WebBrowser.DOM.IElement element = document.CreateElement (elementTag);
75 return new HtmlElement (owner, webHost, element);
78 public void DetachEventHandler (string eventName, EventHandler eventHandler)
80 document.DetachEventHandler (eventName, eventHandler);
83 public override bool Equals (object obj) {
84 return this == (HtmlDocument) obj;
87 public void ExecCommand (string command, bool showUI, Object value)
89 throw new NotImplementedException ("Not Supported");
92 [EditorBrowsable(EditorBrowsableState.Advanced)]
95 webHost.FocusIn (Mono.WebBrowser.FocusOption.None);
98 public HtmlElement GetElementById (string id)
100 IElement elem = document.GetElementById (id);
102 return new HtmlElement (owner, webHost, elem);
106 public HtmlElement GetElementFromPoint (Point point)
108 Mono.WebBrowser.DOM.IElement elem = document.GetElement (point.X, point.Y);
110 return new HtmlElement(owner, webHost, elem);
114 public HtmlElementCollection GetElementsByTagName (string tagName)
116 Mono.WebBrowser.DOM.IElementCollection col = document.GetElementsByTagName (tagName);
118 return new HtmlElementCollection (owner, webHost, col);
122 public override int GetHashCode ()
124 if (document == null)
126 return document.GetHashCode ();
129 public Object InvokeScript (string scriptName)
131 return document.InvokeScript ("eval ('" + scriptName + "()');");
134 public Object InvokeScript (string scriptName, object[] args)
136 string[] strArgs = new string[args.Length];
137 for (int i = 0; i < args.Length; i++) {
138 if (args[i] is string)
139 strArgs[i] = "\"" + args[i].ToString() + "\"";
141 strArgs[i] = args[i].ToString();
143 return document.InvokeScript ("eval ('" + scriptName + "(" + String.Join (",", strArgs) + ")');");
146 public static bool operator ==(HtmlDocument left, HtmlDocument right) {
147 if ((object)left == (object)right) {
151 if ((object)left == null || (object)right == null) {
155 return left.document.Equals (right.document);
158 public static bool operator !=(HtmlDocument left, HtmlDocument right) {
159 return !(left == right);
163 public HtmlDocument OpenNew (bool replaceInHistory)
165 Mono.WebBrowser.DOM.LoadFlags flags = Mono.WebBrowser.DOM.LoadFlags.None;
166 if (replaceInHistory)
167 flags |= Mono.WebBrowser.DOM.LoadFlags.ReplaceHistory;
168 webHost.Navigation.Go ("about:blank", flags);
172 public void Write (string text)
174 document.Write (text);
180 public HtmlElement ActiveElement {
182 Mono.WebBrowser.DOM.IElement element = document.Active;
185 return new HtmlElement (owner, webHost, element);
190 public Color ActiveLinkColor {
191 get { return ParseColor(document.ActiveLinkColor); }
192 set { document.ActiveLinkColor = value.ToArgb().ToString(); }
195 public HtmlElementCollection All {
197 return new HtmlElementCollection (owner, webHost, document.DocumentElement.All);
201 public Color BackColor {
202 get { return ParseColor(document.BackColor); }
203 set { document.BackColor = value.ToArgb().ToString(); }
206 public HtmlElement Body {
207 get { return new HtmlElement (owner, webHost, document.Body); }
210 public string Cookie {
211 get { return document.Cookie; }
212 set { document.Cookie = value; }
215 public string DefaultEncoding {
216 get { return document.Charset; }
219 public string Domain {
220 get { return document.Domain; }
221 set { throw new NotSupportedException ("Setting the domain is not supported per the DOM Level 2 HTML specification. Sorry."); }
224 public Object DomDocument {
225 get { throw new NotSupportedException ("Retrieving a reference to an mshtml interface is not supported. Sorry."); }
228 public string Encoding {
229 get { return document.Charset; }
230 set { document.Charset = value; }
233 public bool Focused {
234 get { return webHost.Window.Document == document; }
237 public Color ForeColor {
238 get { return ParseColor(document.ForeColor); }
239 set { document.ForeColor = value.ToArgb().ToString(); }
242 public HtmlElementCollection Forms {
243 get { return new HtmlElementCollection (owner, webHost, document.Forms); }
246 public HtmlElementCollection Images {
247 get { return new HtmlElementCollection (owner, webHost, document.Images); }
250 public Color LinkColor {
251 get { return ParseColor(document.LinkColor); }
252 set { document.LinkColor = value.ToArgb().ToString(); }
255 public HtmlElementCollection Links {
256 get { return new HtmlElementCollection (owner, webHost, document.Links); }
259 public bool RightToLeft {
261 IAttribute dir = document.Attributes["dir"];
262 return (dir != null && dir.Value == "rtl");
266 IAttribute dir = document.Attributes["dir"];
267 if (dir == null && value) {
268 IAttribute attr = document.CreateAttribute ("dir");
270 document.AppendChild (attr);
271 } else if (dir != null && !value) {
272 document.RemoveChild (dir);
277 public string Title {
279 if (document == null)
281 return document.Title;
283 set { document.Title = value; }
287 get { return new Uri (document.Url); }
290 public Color VisitedLinkColor {
291 get { return ParseColor(document.VisitedLinkColor); }
292 set { document.VisitedLinkColor = value.ToArgb().ToString(); }
295 public HtmlWindow Window {
296 get { return new HtmlWindow (owner, webHost, webHost.Window); }
304 private static object ClickEvent = new object ();
305 public event HtmlElementEventHandler Click {
307 Events.AddHandler (ClickEvent, value);
308 document.Click += new NodeEventHandler (OnClick);
311 Events.RemoveHandler (ClickEvent, value);
312 document.Click -= new NodeEventHandler (OnClick);
316 private void OnClick (object sender, EventArgs e)
318 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[ClickEvent];
320 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
325 private static object ContextMenuShowingEvent = new object ();
326 public event HtmlElementEventHandler ContextMenuShowing {
328 Events.AddHandler (ContextMenuShowingEvent, value);
329 owner.WebHost.ContextMenuShown += new Mono.WebBrowser.ContextMenuEventHandler (OnContextMenuShowing);
332 Events.RemoveHandler (ContextMenuShowingEvent, value);
333 owner.WebHost.ContextMenuShown -= new Mono.WebBrowser.ContextMenuEventHandler (OnContextMenuShowing);
336 private void OnContextMenuShowing (object sender, Mono.WebBrowser.ContextMenuEventArgs e)
338 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[ContextMenuShowingEvent];
340 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
342 if (ev.ReturnValue) {
343 owner.OnWebHostContextMenuShown (sender, e);
348 private static object FocusingEvent = new object ();
349 public event HtmlElementEventHandler Focusing {
351 Events.AddHandler (FocusingEvent, value);
352 document.OnFocus += new NodeEventHandler (OnFocusing);
355 Events.RemoveHandler (FocusingEvent, value);
356 document.OnFocus -= new NodeEventHandler (OnFocusing);
360 private void OnFocusing (object sender, EventArgs e)
362 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[FocusingEvent];
364 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
369 private static object LosingFocusEvent = new object ();
370 public event HtmlElementEventHandler LosingFocus {
372 Events.AddHandler (LosingFocusEvent, value);
373 document.OnBlur += new NodeEventHandler (OnLosingFocus);
376 Events.RemoveHandler (LosingFocusEvent, value);
377 document.OnBlur -= new NodeEventHandler (OnLosingFocus);
381 private void OnLosingFocus (object sender, EventArgs e)
383 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[LosingFocusEvent];
385 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
390 private static object MouseDownEvent = new object ();
391 public event HtmlElementEventHandler MouseDown {
393 Events.AddHandler (MouseDownEvent, value);
394 document.MouseDown += new NodeEventHandler (OnMouseDown);
397 Events.RemoveHandler (MouseDownEvent, value);
398 document.MouseDown -= new NodeEventHandler (OnMouseDown);
402 private void OnMouseDown (object sender, EventArgs e)
404 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseDownEvent];
406 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
411 private static object MouseLeaveEvent = new object ();
412 public event HtmlElementEventHandler MouseLeave {
414 Events.AddHandler (MouseLeaveEvent, value);
415 document.MouseLeave += new NodeEventHandler (OnMouseLeave);
418 Events.RemoveHandler (MouseLeaveEvent, value);
419 document.MouseLeave -= new NodeEventHandler (OnMouseLeave);
423 private void OnMouseLeave (object sender, EventArgs e)
425 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseLeaveEvent];
427 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
432 private static object MouseMoveEvent = new object ();
433 public event HtmlElementEventHandler MouseMove {
435 Events.AddHandler (MouseMoveEvent, value);
436 document.MouseMove += new NodeEventHandler (OnMouseMove);
439 Events.RemoveHandler (MouseMoveEvent, value);
440 document.MouseMove -= new NodeEventHandler (OnMouseMove);
444 private void OnMouseMove (object sender, EventArgs e)
446 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseMoveEvent];
448 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
453 private static object MouseOverEvent = new object ();
454 public event HtmlElementEventHandler MouseOver {
456 Events.AddHandler (MouseOverEvent, value);
457 document.MouseOver += new NodeEventHandler (OnMouseOver);
460 Events.RemoveHandler (MouseOverEvent, value);
461 document.MouseOver -= new NodeEventHandler (OnMouseOver);
465 private void OnMouseOver (object sender, EventArgs e)
467 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseOverEvent];
469 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
474 private static object MouseUpEvent = new object ();
475 public event HtmlElementEventHandler MouseUp {
477 Events.AddHandler (MouseUpEvent, value);
478 document.MouseUp += new NodeEventHandler (OnMouseUp);
481 Events.RemoveHandler (MouseUpEvent, value);
482 document.MouseUp -= new NodeEventHandler (OnMouseUp);
486 private void OnMouseUp (object sender, EventArgs e)
488 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseUpEvent];
490 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
495 private static object StopEvent = new object ();
496 public event HtmlElementEventHandler Stop {
498 Events.AddHandler (StopEvent, value);
499 document.LoadStopped += new EventHandler (OnStop);
502 Events.RemoveHandler (StopEvent, value);
503 document.LoadStopped -= new EventHandler (OnStop);
507 private void OnStop (object sender, EventArgs e)
509 HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[StopEvent];
511 HtmlElementEventArgs ev = new HtmlElementEventArgs ();
519 #region Internal and Private
520 private Color ParseColor (string color) {
521 if (color.IndexOf ("#") >= 0) {
522 return Color.FromArgb (int.Parse (color.Substring (color.IndexOf ("#") + 1), NumberStyles.HexNumber));
524 return Color.FromName (color);
527 internal string DocType {
529 if (this.document == null)
531 if (this.document.DocType != null)
532 return this.document.DocType.Name;