Code

Corrected initialization order.
[inkscape.git] / src / dom / stylesheets.h
1 #ifndef __STYLESHEETS_H__
2 #define __STYLESHEETS_H__
4 /**
5  * Phoebe DOM Implementation.
6  *
7  * This is a C++ approximation of the W3C DOM model, which follows
8  * fairly closely the specifications in the various .idl files, copies of
9  * which are provided for reference.  Most important is this one:
10  *
11  * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html
12  *
13  * Authors:
14  *   Bob Jamison
15  *
16  * Copyright (C) 2005-2008 Bob Jamison
17  *
18  *  This library is free software; you can redistribute it and/or
19  *  modify it under the terms of the GNU Lesser General Public
20  *  License as published by the Free Software Foundation; either
21  *  version 2.1 of the License, or (at your option) any later version.
22  *
23  *  This library is distributed in the hope that it will be useful,
24  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
25  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
26  *  Lesser General Public License for more details.
27  *
28  *  You should have received a copy of the GNU Lesser General Public
29  *  License along with this library; if not, write to the Free Software
30  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
31  *  
32  * =========================================================================
33  * NOTES    
34  * 
35  * Views, Stylesheets and CSS are DOM Level 2 for the purposes of supporting
36  * SVG.  Be prepared in the future when they make Level 3 and SVG is likewise
37  * updated.  The API here and many of the comments come from this document:
38  * http://www.w3.org/TR/DOM-Level-2-Style/stylesheets.html     
39  */
42 #include "dom.h"
44 #include <vector>
47 namespace org
48 {
49 namespace w3c
50 {
51 namespace dom
52 {
53 namespace stylesheets
54 {
58 //Make local definitions
59 typedef dom::DOMString DOMString;
60 typedef dom::Node Node;
64 /*#########################################################################
65 ## MediaList
66 #########################################################################*/
68 /**
69  * The MediaList interface provides the abstraction of an ordered collection of 
70  * media, without defining or constraining how this collection is implemented. An 
71  * empty list is the same as a list that contains the medium "all".
72  * 
73  * The items in the MediaList are accessible via an integral index, starting from 
74  * 0.
75  */
76 class MediaList
77 {
78 public:
80     /**
81      * The parsable textual representation of the media list. This is a
82      * comma-separated list of media.
83      */
84     virtual DOMString getMediaText()
85         {
86         return mediaText;
87         }
89     /**
90      * The parsable textual representation of the media list. This is a
91      * comma-separated list of media.
92      */
93     virtual void setMediaText(const DOMString &val) throw (dom::DOMException)
94         {
95         mediaText = val;
96         }
98     /**
99      * The number of media in the list. The range of valid media is 0 to
100      *   length-1 inclusive.
101      */
102     virtual unsigned long getLength()
103         {
104         return items.size();
105         }
107     /**
108      * Returns the indexth in the list. If index is greater than or equal to
109      *   the number of media in the list, this returns null. 
110      */
111     virtual DOMString item(unsigned long index)
112         {
113         if (index >= items.size())
114             return "";
115         return items[index];
116         }
118     /**
119      * Deletes the medium indicated by oldMedium from the list. 
120      */
121     virtual void deleteMedium(const DOMString& oldMedium)
122                               throw (dom::DOMException)
123         {
124         std::vector<DOMString>::iterator iter;
125         for (iter=items.begin() ; iter!=items.end() ; iter++)
126             {
127             if (*iter == oldMedium)
128                 items.erase(iter);
129             }
130         }
132     /**
133      * Adds the medium newMedium to the end of the list. If the newMedium
134      *   is already used, it is first removed. 
135      */
136     virtual void appendMedium(const DOMString& newMedium)
137                                throw (dom::DOMException)
138         {
139         items.push_back(newMedium);
140         }
143     //##################
144     //# Non-API methods
145     //##################
147     /**
148      *
149      */
150    MediaList() {}
153     /**
154      *
155      */
156    MediaList(const MediaList &other)
157        {
158        assign(other);
159        }
161     /**
162      *
163      */
164    MediaList &operator=(const MediaList &other)
165        {
166        assign(other);
167        return *this;
168        }
170     /**
171      *
172      */
173    void assign(const MediaList &other)
174        {
175        mediaText = other.mediaText;
176        items     = other.items;
177        }
179     /**
180      *
181      */
182     virtual ~MediaList() {}
184 protected:
186     DOMString mediaText;
188     std::vector<DOMString>items;
189 };
193 /*#########################################################################
194 ## StyleSheet
195 #########################################################################*/
197 /**
198  * The StyleSheet interface is the abstract base interface for any type of style 
199  * sheet. It represents a single style sheet associated with a structured 
200  * document. In HTML, the StyleSheet interface represents either an external 
201  * style sheet, included via the HTML LINK element, or an inline STYLE element. 
202  * In XML, this interface represents an external style sheet, included via a 
203  * style sheet processing instruction.
204  */
205 class StyleSheet
207 public:
209     /**
210      * This specifies the style sheet language for this style sheet. The style sheet 
211      * language is specified as a content type (e.g. "text/css"). The content type is 
212      * often specified in the ownerNode. Also see the type attribute definition for 
213      * the LINK element in HTML 4.0, and the type pseudo-attribute for the XML style 
214      * sheet processing instruction.
215      */
216     virtual DOMString getType()
217         {
218         return type;
219         }
221     /**
222      * false if the style sheet is applied to the document. true if it is not. 
223      * Modifying this attribute may cause a new resolution of style for the document. 
224      * A stylesheet only applies if both an appropriate medium definition is present 
225      * and the disabled attribute is false. So, if the media doesn't apply to the 
226      * current user agent, the disabled attribute is ignored.
227      */
228     virtual bool getDisabled()
229         {
230         return disabled;
231         }
233     /**
234      * Sets the value above.
235      */
236     virtual void setDisabled(bool val)
237         {
238         disabled = val;
239         }
241     /**
242      * The node that associates this style sheet with the document. For HTML, this 
243      * may be the corresponding LINK or STYLE element. For XML, it may be the linking 
244      * processing instruction. For style sheets that are included by other style 
245      * sheets, the value of this attribute is null.
246      */
247     virtual NodePtr getOwnerNode()
248         {
249         return ownerNode;
250         }
252     /**
253      * For style sheet languages that support the concept of style sheet inclusion, 
254      * this attribute represents the including style sheet, if one exists. If the 
255      * style sheet is a top-level style sheet, or the style sheet language does not 
256      * support inclusion, the value of this attribute is null.
257      */
258     virtual StyleSheet *getParentStyleSheet()
259         {
260         return parentStylesheet;
261         }
263     /**
264      * If the style sheet is a linked style sheet, the value of its attribute is its 
265      * location. For inline style sheets, the value of this attribute is null. See 
266      * the href attribute definition for the LINK element in HTML 4.0, and the href 
267      * pseudo-attribute for the XML style sheet processing instruction.
268      */
269     virtual DOMString getHref()
270         {
271         return href;
272         }
274     /**
275      * The advisory title. The title is often specified in the ownerNode. See the 
276      * title attribute definition for the LINK element in HTML 4.0, and the title 
277      * pseudo-attribute for the XML style sheet processing instruction.
278      */
279     virtual DOMString getTitle()
280         {
281         return title;
282         }
284     /**
285      * The intended destination media for style information. The media is often 
286      * specified in the ownerNode. If no media has been specified, the MediaList will 
287      * be empty. See the media attribute definition for the LINK element in HTML 4.0, 
288      * and the media pseudo-attribute for the XML style sheet processing 
289      * instruction . Modifying the media list may cause a change to the attribute 
290      * disabled.
291      */
292     virtual MediaList &getMedia()
293         {
294         MediaList &mediaListRef = mediaList;
295         return mediaListRef;
296         }
298     //##################
299     //# Non-API methods
300     //##################
302     /**
303      *
304      */
305     StyleSheet()
306         {
307         type             = "";
308         disabled         = false;
309         ownerNode        = NULL;
310         parentStylesheet = NULL;
311         href             = "";
312         title            = "";
313         }
316     /**
317      *
318      */
319     StyleSheet(const StyleSheet &other)
320         {
321         assign(other);
322         }
324     /**
325      *
326      */
327     StyleSheet &operator=(const StyleSheet &other)
328         {
329         assign(other);
330         return *this;
331         }
333     /**
334      *
335      */
336     void assign(const StyleSheet &other)
337         {
338         type             = other.type;
339         disabled         = other.disabled;
340         ownerNode        = other.ownerNode;
341         parentStylesheet = other.parentStylesheet;
342         href             = other.href;
343         title            = other.title;
344         mediaList        = other.mediaList;
345         }
347     /**
348      *
349      */
350     virtual ~StyleSheet() {}
352 protected:
354     DOMString type;
356     bool disabled;
358     NodePtr ownerNode;
360     StyleSheet *parentStylesheet;
362     DOMString href;
364     DOMString title;
366     MediaList mediaList;
367 };
372 /*#########################################################################
373 ## StyleSheetList
374 #########################################################################*/
376 /**
377  * The StyleSheetList interface provides the abstraction of an ordered collection 
378  * of style sheets.
379  * 
380  * The items in the StyleSheetList are accessible via an integral index, starting 
381  * from 0.
382  */
383 class StyleSheetList
385 public:
387     /**
388      * The number of StyleSheets in the list. The range of valid child stylesheet 
389      * indices is 0 to length-1 inclusive.
390      */
391     virtual unsigned long getLength()
392         {
393         return sheets.size();
394         }
396     /**
397      * Used to retrieve a style sheet by ordinal index. If index is greater than or 
398      * equal to the number of style sheets in the list, this returns null.
399      */
400     virtual StyleSheet *item(unsigned long index)
401         {
402         if (index >= sheets.size())
403             return NULL;
404         return sheets[index];
405         }
407     //##################
408     //# Non-API methods
409     //##################
411     /**
412      *
413      */
414     StyleSheetList() {}
416     /**
417      *
418      */
419     StyleSheetList(const StyleSheetList &other)
420         {
421         sheets = other.sheets;
422         }
424     /**
425      *
426      */
427     StyleSheetList &operator=(const StyleSheetList &other)
428         {
429         sheets = other.sheets;
430         return *this;
431         }
433     /**
434      *
435      */
436     virtual ~StyleSheetList() {}
438 protected:
440     std::vector<StyleSheet *>sheets;
442 };
448 /*#########################################################################
449 ## LinkStyle
450 #########################################################################*/
452 /**
453  * The LinkStyle interface provides a mechanism by which a style sheet can be 
454  * retrieved from the node responsible for linking it into a document. An 
455  * instance of the LinkStyle interface can be obtained using binding-specific 
456  * casting methods on an instance of a linking node (HTMLLinkElement, 
457  * HTMLStyleElement or ProcessingInstruction in DOM Level 2).
458  */
459 class LinkStyle
461 public:
463     /**
464      * The style sheet.
465      */
466     virtual StyleSheet &getSheet()
467         {
468         StyleSheet &sheetRef = sheet;
469         return sheetRef;
470         }
472     //##################
473     //# Non-API methods
474     //##################
476     /**
477      *
478      */
479     LinkStyle()
480         {
481         }
483     /**
484      *
485      */
486     LinkStyle(const LinkStyle &other)
487         {
488         sheet = other.sheet;
489         }
491     /**
492      *
493      */
494     LinkStyle &operator=(const LinkStyle &other)
495         {
496         sheet = other.sheet;
497         return *this;
498         }
500     /**
501      *
502      */
503     virtual ~LinkStyle() {}
505 protected:
507     StyleSheet sheet;
509 };
514 /*#########################################################################
515 ## DocumentStyle
516 #########################################################################*/
518 /**
519  * The DocumentStyle interface provides a mechanism by which the style sheets 
520  * embedded in a document can be retrieved. The expectation is that an instance 
521  * of the DocumentStyle interface can be obtained by using binding-specific 
522  * casting methods on an instance of the Document interface.
523  */
524 class DocumentStyle
526 public:
528     /**
529      * A list containing all the style sheets explicitly linked into or embedded in a 
530      * document. For HTML documents, this includes external style sheets, included 
531      * via the HTML LINK element, and inline STYLE elements. In XML, this includes 
532      * external style sheets, included via style sheet processing instructions (see 
533      * [XML-StyleSheet]).
534      */
535     virtual StyleSheetList &getStyleSheets()
536         {
537         StyleSheetList &listRef = styleSheets;
538         return listRef;
539         }
541     //##################
542     //# Non-API methods
543     //##################
545     /**
546      *
547      */
548     DocumentStyle() {}
550     /**
551      *
552      */
553     DocumentStyle(const DocumentStyle &other)
554         {
555         styleSheets = other.styleSheets;
556         }
558     /**
559      *
560      */
561     DocumentStyle &operator=(const DocumentStyle &other)
562         {
563         styleSheets = other.styleSheets;
564         return *this;
565         }
567     /**
568      *
569      */
570     virtual ~DocumentStyle() {}
572 protected:
574     StyleSheetList styleSheets;
575 };
581 }  //namespace stylesheets
582 }  //namespace dom
583 }  //namespace w3c
584 }  //namespace org
587 #endif   /* __STYLESHEETS_H__ */
588 /*#########################################################################
589 ## E N D    O F    F I L E
590 #########################################################################*/