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)
30 using System.ComponentModel;
32 using Mono.WebBrowser.DOM;
34 namespace System.Windows.Forms
36 public sealed class HtmlWindow
38 private EventHandlerList event_handlers;
39 private IWindow window;
40 private Mono.WebBrowser.IWebBrowser webHost;
41 private WebBrowser owner;
43 internal HtmlWindow (WebBrowser owner, Mono.WebBrowser.IWebBrowser webHost, IWindow iWindow)
45 this.window = iWindow;
46 this.webHost = webHost;
48 this.window.Load += new EventHandler (OnLoad);
49 this.window.Unload += new EventHandler (OnUnload);
52 private EventHandlerList Events {
54 // Note: space vs. time tradeoff
55 // We create the object here if it's never be accessed before. This potentially
56 // saves space. However, we must check each time the propery is accessed to
57 // determine whether we need to create the object, which increases overhead.
58 // We could put the creation in the contructor, but that would waste space
59 // if it were never used. However, accessing this property would be faster.
60 if (null == event_handlers)
61 event_handlers = new EventHandlerList();
63 return event_handlers;
68 public HtmlDocument Document {
69 get { return new HtmlDocument (owner, webHost, this.window.Document); }
72 public object DomWindow {
73 get { throw new NotSupportedException ("Retrieving a reference to an mshtml interface is not supported. Sorry."); }
76 public HtmlWindowCollection Frames {
77 get { return new HtmlWindowCollection (owner, webHost, this.window.Frames); }
80 public HtmlHistory History {
81 get { return new HtmlHistory (this.webHost, window.History); }
84 [MonoTODO ("Windows are always open")]
85 public bool IsClosed {
90 get { return this.window.Name; }
91 set { this.window.Name = value; }
94 [MonoTODO ("Separate windows are not supported yet")]
95 public HtmlWindow Opener {
99 public HtmlWindow Parent {
100 get { return new HtmlWindow (owner, webHost, this.window.Parent); }
103 public Point Position {
104 get { return owner.Location; }
108 get { return owner.Size; }
112 public string StatusBarText {
113 get { return this.window.StatusText; }
117 public HtmlElement WindowFrameElement {
119 return new HtmlElement (owner, webHost, window.Document.DocumentElement);
124 get { return this.Document.Url; }
129 public void Alert (string message)
131 MessageBox.Show ("Alert", message);
134 public bool Confirm (string message)
136 DialogResult ret = MessageBox.Show (message, "Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
137 return ret == DialogResult.OK;
140 public string Prompt (string message, string defaultInputValue)
142 WebBrowserDialogs.Prompt prompt = new WebBrowserDialogs.Prompt ("Prompt", message, defaultInputValue);
143 DialogResult ret = prompt.Show ();
147 public void Navigate (string urlString)
149 webHost.Navigation.Go (urlString);
152 public void Navigate (Uri url)
154 webHost.Navigation.Go (url.ToString ());
157 public void ScrollTo (Point point)
159 ScrollTo (point.X, point.Y);
162 public void ScrollTo (int x, int y)
164 this.window.ScrollTo (x, y);
167 [MonoTODO("Blank opens in current window at the moment. Missing media and search implementations. No options implemented")]
168 public HtmlWindow Open (Uri url, string target, string windowOptions, bool replaceEntry)
170 return Open (url.ToString(), target, windowOptions, replaceEntry);
173 [MonoTODO("Blank opens in current window at the moment. Missing media and search implementations. No options implemented")]
174 public HtmlWindow Open (string urlString, string target, string windowOptions, bool replaceEntry)
178 this.window.Open (urlString);
183 this.window.Parent.Open (urlString);
188 this.window.Open (urlString);
191 this.window.Top.Open (urlString);
197 [MonoTODO("Opens in current window at the moment.")]
198 public HtmlWindow OpenNew (string urlString, string windowOptions)
200 return Open (urlString, "_blank", windowOptions, false);
203 [MonoTODO("Opens in current window at the moment.")]
204 public HtmlWindow OpenNew (Uri url, string windowOptions)
206 return OpenNew (url.ToString (), windowOptions);
209 public void AttachEventHandler (string eventName, EventHandler eventHandler)
211 this.window.AttachEventHandler (eventName, eventHandler);
216 throw new NotImplementedException ();
219 public void DetachEventHandler (string eventName, EventHandler eventHandler)
221 this.window.DetachEventHandler (eventName, eventHandler);
226 this.window.Focus ();
229 public void MoveTo (Point point)
231 throw new NotImplementedException ();
234 public void MoveTo (int x, int y)
236 throw new NotImplementedException ();
239 public void RemoveFocus ()
244 public void ResizeTo (Size size)
246 throw new NotImplementedException ();
249 public void ResizeTo (int width, int height)
251 throw new NotImplementedException ();
256 static object ErrorEvent = new object ();
257 public event HtmlElementErrorEventHandler Error
260 Events.AddHandler (ErrorEvent, value);
261 window.Error += new EventHandler (OnError);
264 Events.RemoveHandler (ErrorEvent, value);
265 window.Error -= new EventHandler (OnError);
269 internal void OnError (object sender, EventArgs ev)
271 HtmlElementErrorEventHandler eh = (HtmlElementErrorEventHandler) (Events[ErrorEvent]);
273 HtmlElementErrorEventArgs e = new HtmlElementErrorEventArgs (String.Empty, 0, null);
278 static object GotFocusEvent = new object ();
279 public event HtmlElementEventHandler GotFocus
282 Events.AddHandler (GotFocusEvent, value);
283 window.OnFocus += new EventHandler (OnGotFocus);
286 Events.RemoveHandler (GotFocusEvent, value);
287 window.OnFocus -= new EventHandler (OnGotFocus);
291 internal void OnGotFocus (object sender, EventArgs ev)
293 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[GotFocusEvent]);
295 HtmlElementEventArgs e = new HtmlElementEventArgs ();
300 static object LostFocusEvent = new object ();
301 public event HtmlElementEventHandler LostFocus
304 Events.AddHandler (LostFocusEvent, value);
305 window.OnBlur += new EventHandler (OnLostFocus);
308 Events.RemoveHandler (LostFocusEvent, value);
309 window.OnBlur -= new EventHandler (OnLostFocus);
313 internal void OnLostFocus (object sender, EventArgs ev)
315 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[LostFocusEvent]);
317 HtmlElementEventArgs e = new HtmlElementEventArgs ();
322 static object LoadEvent = new object ();
323 public event HtmlElementEventHandler Load
326 Events.AddHandler (LoadEvent, value);
327 window.Load += new EventHandler (OnLoad);
330 Events.RemoveHandler (LoadEvent, value);
331 window.Load -= new EventHandler (OnLoad);
335 internal void OnLoad (object sender, EventArgs ev)
337 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[LoadEvent]);
339 HtmlElementEventArgs e = new HtmlElementEventArgs ();
344 static object UnloadEvent = new object ();
345 public event HtmlElementEventHandler Unload {
347 Events.AddHandler (UnloadEvent, value);
348 window.Unload += new EventHandler (OnUnload);
351 Events.RemoveHandler (UnloadEvent, value);
352 window.Unload -= new EventHandler (OnUnload);
356 internal void OnUnload (object sender, EventArgs ev)
358 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[UnloadEvent]);
360 HtmlElementEventArgs e = new HtmlElementEventArgs ();
365 static object ScrollEvent = new object ();
366 public event HtmlElementEventHandler Scroll {
368 Events.AddHandler (ScrollEvent, value);
369 window.Scroll += new EventHandler (OnScroll);
372 Events.RemoveHandler (ScrollEvent, value);
373 window.Scroll -= new EventHandler (OnScroll);
377 internal void OnScroll (object sender, EventArgs ev)
379 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[ScrollEvent]);
381 HtmlElementEventArgs e = new HtmlElementEventArgs ();
386 static object ResizeEvent = new object ();
387 public event HtmlElementEventHandler Resize {
388 add { Events.AddHandler (ResizeEvent, value); }
389 remove { Events.RemoveHandler (ResizeEvent, value); }
392 internal void OnResize (object sender, EventArgs ev)
394 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[ResizeEvent]);
396 HtmlElementEventArgs e = new HtmlElementEventArgs ();
402 #region Standard stuff
403 public override int GetHashCode ()
405 return window.GetHashCode ();
408 public override bool Equals (object obj)
410 return this == (HtmlWindow) obj;
413 public static bool operator == (HtmlWindow left, HtmlWindow right)
415 if ((object)left == (object)right)
418 if ((object)left == null || (object)right == null)
421 return left.Equals (right);
424 public static bool operator != (HtmlWindow left, HtmlWindow right)
426 return !(left == right);