2008-03-27 Carlos Alberto Cortez <calberto.cortez@gmail.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / HtmlElement.cs
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
8 // \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
11 // \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
19 //\r
20 // Copyright (c) 2007, 2008 Novell, Inc.\r
21 //\r
22 // Authors:\r
23 //      Andreia Gaita   <avidigal@novell.com>\r
24 \r
25 #if NET_2_0\r
26 \r
27 using System;\r
28 using System.ComponentModel;
29 using Mono.WebBrowser.DOM;\r
30 \r
31 namespace System.Windows.Forms\r
32 {\r
33         public sealed class HtmlElement\r
34         {
35                 private EventHandlerList events;                
36                 private Mono.WebBrowser.IWebBrowser webHost;\r
37                 internal IElement element;
38                 \r
39                 internal HtmlElement (Mono.WebBrowser.IWebBrowser webHost, IElement element)\r
40                 {
41                         this.webHost = webHost;\r
42                         this.element = element;\r
43                 }\r
44 \r
45                 internal EventHandlerList Events {\r
46                         get {\r
47                                 if (events == null)\r
48                                         events = new EventHandlerList();\r
49 \r
50                                 return events;\r
51                         }\r
52                 }\r
53
54                 #region Properties\r
55                 public HtmlElementCollection All {\r
56                         get {\r
57                                 return new HtmlElementCollection (webHost, this.element.All);\r
58                         }\r
59                 }\r
60
61                 // from http://www.w3.org/TR/html401/index/elements.html
62                 public bool CanHaveChildren {
63                         get {
64                                 string tag = this.TagName;
65                                 switch (tag.ToLower ()) {
66                                         case "area":
67                                         case "base":
68                                         case "basefont":
69                                         case "br":
70                                         case "col":
71                                         case "frame":
72                                         case "hr":
73                                         case "img":
74                                         case "input":
75                                         case "isindex":
76                                         case "link":
77                                         case "meta":
78                                         case "param":
79                                                 return false;
80                                         break;
81                                         default:
82                                                 return true;
83                                                 break;
84                                 }
85                         }
86                 }
87 \r
88                 public HtmlElementCollection Children {\r
89                         get {\r
90                                 return new HtmlElementCollection (webHost, this.element.Children);\r
91                         }\r
92                 }
93                 
94                 public HtmlDocument Document {
95                         get {
96                                 return new HtmlDocument (webHost, element.Owner);
97                         }
98                 }\r
99
100                 public string InnerHtml\r
101                 {\r
102                         get { return this.element.InnerHTML; }\r
103                         set { throw new NotImplementedException (); }\r
104                 }\r
105 \r
106                 public string InnerText\r
107                 {\r
108                         get { return this.element.InnerText; }\r
109                         set { this.element.InnerText = value; }\r
110                 }\r
111 \r
112                 public string Id\r
113                 {\r
114                         get { return GetAttribute("id"); }
115                         set { SetAttribute ("id", value); }\r
116                 }\r
117 \r
118                 public string Name\r
119                 {\r
120                         get { return GetAttribute ("name"); }
121                         set { SetAttribute ("name", value); }\r
122                 }\r
123 \r
124                 public HtmlElement FirstChild\r
125                 {\r
126                         get { return new HtmlElement (webHost, (IElement)element.FirstChild); }\r
127                 }
128
129                 public HtmlElement NextSibling {
130                         get { return new HtmlElement (webHost, (IElement)element.Next); }
131                 }
132                 
133                 public HtmlElement Parent {
134                         get { return new HtmlElement (webHost, (IElement)element.Parent); }
135                 }
136
137                 public string TagName {
138                         get { return element.TagName; }
139                 }\r
140                 #endregion
141                 
142                 #region Methods
143                 public HtmlElement AppendChild (HtmlElement child)
144                 {
145                         IElement newChild = this.element.AppendChild (child.element);
146                         child.element = newChild;
147                         return child;
148                 }
149                 
150                 public void AttachEventHandler (string eventName, EventHandler eventHandler)\r
151                 { 
152                         throw new NotImplementedException ();
153                 }\r
154
155                 public void DetachEventHandler (string eventName, EventHandler eventHandler) \r
156                 {\r
157                         throw new NotImplementedException ();\r
158                 }\r
159                 
160                 public void Focus () 
161                 {\r
162                         throw new NotImplementedException ();\r
163                 }\r
164
165                 public string GetAttribute (string name) {
166                         return element.GetAttribute (name);
167                 }
168
169                 public HtmlElementCollection GetElementsByTagName (string tagName) \r
170                 {
171                         Mono.WebBrowser.DOM.IElementCollection col = element.GetElementsByTagName (tagName);\r
172                         return new HtmlElementCollection (webHost, col);\r
173                 }               
174                 
175                 public override int GetHashCode () \r
176                 { \r
177                         return element.GetHashCode (); \r
178                 }
179
180                 internal bool HasAttribute (string name) {
181                         return element.HasAttribute (name);
182                 }
183
184                 public HtmlElement InsertAdjacentElement (HtmlElementInsertionOrientation orientation, HtmlElement newElement) {
185                         
186                         switch (orientation) {
187                                 case HtmlElementInsertionOrientation.BeforeBegin:
188                                         IElement newChild1 = this.element.Parent.InsertBefore (newElement.element, this.element);
189                                         newElement.element = newChild1;
190                                         return newElement;                                      
191                                 break;
192                                 case HtmlElementInsertionOrientation.AfterBegin:
193                                         IElement newChild2 = this.element.InsertBefore (newElement.element, this.element.FirstChild);
194                                         newElement.element = newChild2;
195                                         return newElement;                                      
196                                 break;
197                                 case HtmlElementInsertionOrientation.BeforeEnd:
198                                         return this.AppendChild (newElement);                                   
199                                 break;
200                                 case HtmlElementInsertionOrientation.AfterEnd:
201                                         return this.AppendChild (newElement);
202                                 break;
203                         }
204                         return null;
205                 }\r
206                 
207                 public object InvokeMember (string method) {
208                         throw new NotImplementedException ();
209                 }\r              
210                 public object InvokeMember (string method, object[] parameters) {
211                         throw new NotImplementedException ();
212                 }
213                 
214                 public void RaiseEvent (string name) 
215                 {\r
216                         throw new NotImplementedException ();\r
217                 }\r
218
219                 public void RemoveFocus () 
220                 {\r
221                         throw new NotImplementedException ();\r
222                 }\r
223
224                 public void ScrollIntoView (bool alignWithTop) 
225                 {\r
226                         throw new NotImplementedException ();\r
227                 }
228                 
229                 public void SetAttribute (string name, string value)
230                 {
231                         this.element.SetAttribute (name, value);
232                 }\r
233
234                 public override bool Equals (object obj) {
235                         return this == (HtmlElement) obj;
236                 }
237                 
238                 public static bool operator ==(HtmlElement left, HtmlElement right) {
239                         if ((object)left == (object)right) {
240                                 return true;
241                         }
242
243                         if ((object)left == null || (object)right == null) {
244                                 return false;
245                         }
246
247                         return left.Equals (right); 
248                 }
249
250                 public static bool operator !=(HtmlElement left, HtmlElement right) {
251                         return !(left == right);
252                 }
253                 #endregion\r
254
255 #region Events\r
256                 private void OnClick (object sender, EventArgs e)\r
257                 {\r
258                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[ClickEvent];\r
259                         if (eh != null) {\r
260                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
261                                 eh (this, ev);\r
262                         }\r
263                 }\r
264 \r
265                 private static object ClickEvent = new object ();\r
266                 public event HtmlElementEventHandler Click {\r
267                         add { \r
268                                 Events.AddHandler (ClickEvent, value);\r
269                                 element.Click += new NodeEventHandler (OnClick);\r
270                         }\r
271                         remove { \r
272                                 Events.RemoveHandler (ClickEvent, value);\r
273                                 element.Click -= new NodeEventHandler (OnClick);\r
274                         }\r
275                 }\r
276 \r
277                 private void OnDoubleClick (object sender, EventArgs e)\r
278                 {\r
279                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[DoubleClickEvent];\r
280                         if (eh != null) {\r
281                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
282                                 eh (this, ev);\r
283                         }\r
284                 }\r
285
286                 private static object DoubleClickEvent = new object ();\r
287                 public event HtmlElementEventHandler DoubleClick {\r
288                         add { \r
289                                 Events.AddHandler (DoubleClickEvent, value);\r
290                                 element.DoubleClick += new NodeEventHandler (OnDoubleClick);\r
291                         }\r
292                         remove { \r
293                                 Events.RemoveHandler (DoubleClickEvent, value);\r
294                                 element.DoubleClick -= new NodeEventHandler (OnDoubleClick);\r
295                         }\r
296                 }\r
297
298                 private void OnMouseDown (object sender, EventArgs e)\r
299                 {\r
300                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseDownEvent];\r
301                         if (eh != null) {\r
302                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
303                                 eh (this, ev);\r
304                         }\r
305                 }\r
306 \r
307                 private static object MouseDownEvent = new object ();\r
308                 public event HtmlElementEventHandler MouseDown {\r
309                         add { \r
310                                 Events.AddHandler (MouseDownEvent, value);\r
311                                 element.MouseDown += new NodeEventHandler (OnMouseDown);\r
312                         }\r
313                         remove { \r
314                                 Events.RemoveHandler (MouseDownEvent, value);\r
315                                 element.MouseDown -= new NodeEventHandler (OnMouseDown);\r
316                         }\r
317                 }\r
318
319                 private void OnMouseUp (object sender, EventArgs e)\r
320                 {\r
321                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseUpEvent];\r
322                         if (eh != null) {\r
323                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
324                                 eh (this, ev);\r
325                         }\r
326                 }
327 \r
328                 private static object MouseUpEvent = new object ();\r
329                 public event HtmlElementEventHandler MouseUp {\r
330                         add { \r
331                                 Events.AddHandler (MouseUpEvent, value);\r
332                                 element.MouseUp += new NodeEventHandler (OnMouseUp);\r
333                         }\r
334                         remove { \r
335                                 Events.RemoveHandler (MouseUpEvent, value);\r
336                                 element.MouseUp -= new NodeEventHandler (OnMouseUp);\r
337                         }\r
338                 }\r
339
340                 private void OnMouseMove (object sender, EventArgs e)\r
341                 {\r
342                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseMoveEvent];\r
343                         if (eh != null) {\r
344                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
345                                 eh (this, ev);\r
346                         }\r
347                 }
348 \r
349                 private static object MouseMoveEvent = new object ();\r
350                 public event HtmlElementEventHandler MouseMove {\r
351                         add { \r
352                                 Events.AddHandler (MouseMoveEvent, value);\r
353                                 element.MouseMove += new NodeEventHandler (OnMouseMove);\r
354                         }\r
355                         remove { \r
356                                 Events.RemoveHandler (MouseMoveEvent, value);\r
357                                 element.MouseMove -= new NodeEventHandler (OnMouseMove);\r
358                         }\r
359                 }\r
360
361                 private void OnMouseOver (object sender, EventArgs e)\r
362                 {\r
363                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseOverEvent];\r
364                         if (eh != null) {\r
365                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
366                                 eh (this, ev);\r
367                         }\r
368                 }
369 \r
370                 private static object MouseOverEvent = new object ();\r
371                 public event HtmlElementEventHandler MouseOver {\r
372                         add { \r
373                                 Events.AddHandler (MouseOverEvent, value);\r
374                                 element.MouseOver += new NodeEventHandler (OnMouseOver);\r
375                         }\r
376                         remove { \r
377                                 Events.RemoveHandler (MouseOverEvent, value);\r
378                                 element.MouseOver -= new NodeEventHandler (OnMouseOver);\r
379                         }\r
380                 }
381                 
382                 private void OnMouseEnter (object sender, EventArgs e)\r
383                 {\r
384                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseEnterEvent];\r
385                         if (eh != null) {\r
386                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
387                                 eh (this, ev);\r
388                         }\r
389                 }
390                 \r
391                 private static object MouseEnterEvent = new object ();\r
392                 public event HtmlElementEventHandler MouseEnter {\r
393                         add { \r
394                                 Events.AddHandler (MouseEnterEvent, value);\r
395                                 element.MouseEnter += new NodeEventHandler (OnMouseEnter);\r
396                         }\r
397                         remove { \r
398                                 Events.RemoveHandler (MouseEnterEvent, value);\r
399                                 element.MouseEnter -= new NodeEventHandler (OnMouseEnter);\r
400                         }\r
401                 }
402                 
403                 private void OnMouseLeave (object sender, EventArgs e)\r
404                 {\r
405                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[MouseLeaveEvent];\r
406                         if (eh != null) {\r
407                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
408                                 eh (this, ev);\r
409                         }\r
410                 }               
411                 \r
412                 private static object MouseLeaveEvent = new object ();\r
413                 public event HtmlElementEventHandler MouseLeave {\r
414                         add { \r
415                                 Events.AddHandler (MouseLeaveEvent, value);\r
416                                 element.MouseLeave += new NodeEventHandler (OnMouseLeave);\r
417                         }\r
418                         remove { \r
419                                 Events.RemoveHandler (MouseLeaveEvent, value);\r
420                                 element.MouseLeave -= new NodeEventHandler (OnMouseLeave);\r
421                         }\r
422                 }
423
424                 private void OnKeyDown (object sender, EventArgs e)\r
425                 {\r
426                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyDownEvent];\r
427                         if (eh != null) {\r
428                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
429                                 eh (this, ev);\r
430                         }\r
431                 }               
432                 \r
433                 private static object KeyDownEvent = new object ();\r
434                 public event HtmlElementEventHandler KeyDown {\r
435                         add { \r
436                                 Events.AddHandler (KeyDownEvent, value);\r
437                                 element.KeyDown += new NodeEventHandler (OnKeyDown);\r
438                         }\r
439                         remove { \r
440                                 Events.RemoveHandler (KeyDownEvent, value);\r
441                                 element.KeyDown -= new NodeEventHandler (OnKeyDown);\r
442                         }\r
443                 }
444
445                 private void OnKeyPress (object sender, EventArgs e)\r
446                 {\r
447                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyPressEvent];\r
448                         if (eh != null) {\r
449                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
450                                 eh (this, ev);\r
451                         }\r
452                 }               
453                 \r
454                 private static object KeyPressEvent = new object ();\r
455                 public event HtmlElementEventHandler KeyPress {\r
456                         add { \r
457                                 Events.AddHandler (KeyPressEvent, value);\r
458                                 element.KeyPress += new NodeEventHandler (OnKeyPress);\r
459                         }\r
460                         remove { \r
461                                 Events.RemoveHandler (KeyPressEvent, value);\r
462                                 element.KeyPress -= new NodeEventHandler (OnKeyPress);\r
463                         }\r
464                 }
465
466                 private void OnKeyUp (object sender, EventArgs e)\r
467                 {\r
468                         HtmlElementEventHandler eh = (HtmlElementEventHandler) Events[KeyUpEvent];\r
469                         if (eh != null) {\r
470                                 HtmlElementEventArgs ev = new HtmlElementEventArgs ();\r
471                                 eh (this, ev);\r
472                         }\r
473                 }               
474                 \r
475                 private static object KeyUpEvent = new object ();\r
476                 public event HtmlElementEventHandler KeyUp {\r
477                         add { \r
478                                 Events.AddHandler (KeyUpEvent, value);\r
479                                 element.KeyUp += new NodeEventHandler (OnKeyUp);\r
480                         }\r
481                         remove { \r
482                                 Events.RemoveHandler (KeyUpEvent, value);\r
483                                 element.KeyUp -= new NodeEventHandler (OnKeyUp);\r
484                         }\r
485                 }\r
486 \r
487 #endregion\r
488 \r
489         }\r
490 }\r
491 \r
492 #endif