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;
31 using Mono.WebBrowser.DOM;
33 namespace System.Windows.Forms
35 public sealed class HtmlWindow
37 private EventHandlerList event_handlers;
38 private IWindow window;
39 private Mono.WebBrowser.IWebBrowser webHost;
40 private WebBrowser owner;
42 internal HtmlWindow (WebBrowser owner, Mono.WebBrowser.IWebBrowser webHost, IWindow iWindow)
44 this.window = iWindow;
45 this.webHost = webHost;
47 this.window.Load += new EventHandler (OnLoad);
48 this.window.Unload += new EventHandler (OnUnload);
51 private EventHandlerList Events {
53 // Note: space vs. time tradeoff
54 // We create the object here if it's never be accessed before. This potentially
55 // saves space. However, we must check each time the propery is accessed to
56 // determine whether we need to create the object, which increases overhead.
57 // We could put the creation in the contructor, but that would waste space
58 // if it were never used. However, accessing this property would be faster.
59 if (null == event_handlers)
60 event_handlers = new EventHandlerList();
62 return event_handlers;
67 public HtmlDocument Document {
68 get { return new HtmlDocument (owner, webHost, this.window.Document); }
71 public object DomWindow {
72 get { throw new NotSupportedException ("Retrieving a reference to an mshtml interface is not supported. Sorry."); }
75 public HtmlWindowCollection Frames {
76 get { return new HtmlWindowCollection (owner, webHost, this.window.Frames); }
79 public HtmlHistory History {
80 get { return new HtmlHistory (this.webHost, window.History); }
83 [MonoTODO ("Windows are always open")]
84 public bool IsClosed {
89 get { return this.window.Name; }
90 set { this.window.Name = value; }
93 [MonoTODO ("Separate windows are not supported yet")]
94 public HtmlWindow Opener {
98 public HtmlWindow Parent {
99 get { return new HtmlWindow (owner, webHost, this.window.Parent); }
102 public Point Position {
103 get { return owner.Location; }
107 get { return owner.Size; }
111 public string StatusBarText {
112 get { return this.window.StatusText; }
116 public HtmlElement WindowFrameElement {
118 return new HtmlElement (owner, webHost, window.Document.DocumentElement);
123 get { return this.Document.Url; }
128 public void Alert (string message)
130 MessageBox.Show ("Alert", message);
133 public bool Confirm (string message)
135 DialogResult ret = MessageBox.Show (message, "Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation);
136 return ret == DialogResult.OK;
139 public string Prompt (string message, string defaultInputValue)
141 WebBrowserDialogs.Prompt prompt = new WebBrowserDialogs.Prompt ("Prompt", message, defaultInputValue);
146 public void Navigate (string urlString)
148 webHost.Navigation.Go (urlString);
151 public void Navigate (Uri url)
153 webHost.Navigation.Go (url.ToString ());
156 public void ScrollTo (Point point)
158 ScrollTo (point.X, point.Y);
161 public void ScrollTo (int x, int y)
163 this.window.ScrollTo (x, y);
166 [MonoTODO("Blank opens in current window at the moment. Missing media and search implementations. No options implemented")]
167 public HtmlWindow Open (Uri url, string target, string windowOptions, bool replaceEntry)
169 return Open (url.ToString(), target, windowOptions, replaceEntry);
172 [MonoTODO("Blank opens in current window at the moment. Missing media and search implementations. No options implemented")]
173 public HtmlWindow Open (string urlString, string target, string windowOptions, bool replaceEntry)
177 this.window.Open (urlString);
182 this.window.Parent.Open (urlString);
187 this.window.Open (urlString);
190 this.window.Top.Open (urlString);
196 [MonoTODO("Opens in current window at the moment.")]
197 public HtmlWindow OpenNew (string urlString, string windowOptions)
199 return Open (urlString, "_blank", windowOptions, false);
202 [MonoTODO("Opens in current window at the moment.")]
203 public HtmlWindow OpenNew (Uri url, string windowOptions)
205 return OpenNew (url.ToString (), windowOptions);
208 public void AttachEventHandler (string eventName, EventHandler eventHandler)
210 this.window.AttachEventHandler (eventName, eventHandler);
215 throw new NotImplementedException ();
218 public void DetachEventHandler (string eventName, EventHandler eventHandler)
220 this.window.DetachEventHandler (eventName, eventHandler);
225 this.window.Focus ();
228 public void MoveTo (Point point)
230 throw new NotImplementedException ();
233 public void MoveTo (int x, int y)
235 throw new NotImplementedException ();
238 public void RemoveFocus ()
243 public void ResizeTo (Size size)
245 throw new NotImplementedException ();
248 public void ResizeTo (int width, int height)
250 throw new NotImplementedException ();
255 static object ErrorEvent = new object ();
256 public event HtmlElementErrorEventHandler Error
259 Events.AddHandler (ErrorEvent, value);
260 window.Error += new EventHandler (OnError);
263 Events.RemoveHandler (ErrorEvent, value);
264 window.Error -= new EventHandler (OnError);
268 internal void OnError (object sender, EventArgs ev)
270 HtmlElementErrorEventHandler eh = (HtmlElementErrorEventHandler) (Events[ErrorEvent]);
272 HtmlElementErrorEventArgs e = new HtmlElementErrorEventArgs (String.Empty, 0, null);
277 static object GotFocusEvent = new object ();
278 public event HtmlElementEventHandler GotFocus
281 Events.AddHandler (GotFocusEvent, value);
282 window.OnFocus += new EventHandler (OnGotFocus);
285 Events.RemoveHandler (GotFocusEvent, value);
286 window.OnFocus -= new EventHandler (OnGotFocus);
290 internal void OnGotFocus (object sender, EventArgs ev)
292 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[GotFocusEvent]);
294 HtmlElementEventArgs e = new HtmlElementEventArgs ();
299 static object LostFocusEvent = new object ();
300 public event HtmlElementEventHandler LostFocus
303 Events.AddHandler (LostFocusEvent, value);
304 window.OnBlur += new EventHandler (OnLostFocus);
307 Events.RemoveHandler (LostFocusEvent, value);
308 window.OnBlur -= new EventHandler (OnLostFocus);
312 internal void OnLostFocus (object sender, EventArgs ev)
314 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[LostFocusEvent]);
316 HtmlElementEventArgs e = new HtmlElementEventArgs ();
321 static object LoadEvent = new object ();
322 public event HtmlElementEventHandler Load
325 Events.AddHandler (LoadEvent, value);
326 window.Load += new EventHandler (OnLoad);
329 Events.RemoveHandler (LoadEvent, value);
330 window.Load -= new EventHandler (OnLoad);
334 internal void OnLoad (object sender, EventArgs ev)
336 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[LoadEvent]);
338 HtmlElementEventArgs e = new HtmlElementEventArgs ();
343 static object UnloadEvent = new object ();
344 public event HtmlElementEventHandler Unload {
346 Events.AddHandler (UnloadEvent, value);
347 window.Unload += new EventHandler (OnUnload);
350 Events.RemoveHandler (UnloadEvent, value);
351 window.Unload -= new EventHandler (OnUnload);
355 internal void OnUnload (object sender, EventArgs ev)
357 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[UnloadEvent]);
359 HtmlElementEventArgs e = new HtmlElementEventArgs ();
364 static object ScrollEvent = new object ();
365 public event HtmlElementEventHandler Scroll {
367 Events.AddHandler (ScrollEvent, value);
368 window.Scroll += new EventHandler (OnScroll);
371 Events.RemoveHandler (ScrollEvent, value);
372 window.Scroll -= new EventHandler (OnScroll);
376 internal void OnScroll (object sender, EventArgs ev)
378 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[ScrollEvent]);
380 HtmlElementEventArgs e = new HtmlElementEventArgs ();
385 static object ResizeEvent = new object ();
386 public event HtmlElementEventHandler Resize {
387 add { Events.AddHandler (ResizeEvent, value); }
388 remove { Events.RemoveHandler (ResizeEvent, value); }
391 internal void OnResize (object sender, EventArgs ev)
393 HtmlElementEventHandler eh = (HtmlElementEventHandler) (Events[ResizeEvent]);
395 HtmlElementEventArgs e = new HtmlElementEventArgs ();
401 #region Standard stuff
402 public override int GetHashCode ()
406 return window.GetHashCode ();
409 public override bool Equals (object obj)
411 return this == (HtmlWindow) obj;
414 public static bool operator == (HtmlWindow left, HtmlWindow right)
416 if ((object)left == (object)right)
419 if ((object)left == null || (object)right == null)
422 return left.window.Equals (right.window);
425 public static bool operator != (HtmlWindow left, HtmlWindow right)
427 return !(left == right);