File indexing completed on 2024-12-01 12:33:33

0001 /*
0002  *  This file is part of the KDE libraries
0003  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
0004  *  Copyright (C) 2009 Maksim Orlovich (maksim@kde.org)
0005  *
0006  *  This library is free software; you can redistribute it and/or
0007  *  modify it under the terms of the GNU Library General Public
0008  *  License as published by the Free Software Foundation; either
0009  *  version 2 of the License, or (at your option) any later version.
0010  *
0011  *  This library is distributed in the hope that it will be useful,
0012  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0013  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014  *  Library General Public License for more details.
0015  *
0016  *  You should have received a copy of the GNU Library General Public
0017  *  License along with this library; if not, write to the Free Software
0018  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
0019  */
0020 
0021 #ifndef _KJS_RANGE_H_
0022 #define _KJS_RANGE_H_
0023 
0024 #include <QPointer>
0025 
0026 #include "ecma/kjs_dom.h"
0027 #include "xml/dom_docimpl.h"
0028 #include "xml/dom2_rangeimpl.h"
0029 #include "xml/dom_selection.h"
0030 
0031 namespace KJS
0032 {
0033 
0034 class DOMRange : public DOMObject
0035 {
0036 public:
0037     DOMRange(ExecState *exec, DOM::RangeImpl *r);
0038     ~DOMRange();
0039     using KJS::JSObject::getOwnPropertySlot;
0040     bool getOwnPropertySlot(ExecState *exec, const Identifier &propertyName, PropertySlot &slot) override;
0041     JSValue *getValueProperty(ExecState *exec, int token) const;
0042     // no put - all read-only
0043     const ClassInfo *classInfo() const override
0044     {
0045         return &info;
0046     }
0047     static const ClassInfo info;
0048     enum { StartContainer, StartOffset, EndContainer, EndOffset, Collapsed,
0049            CommonAncestorContainer,
0050            SetStart, SetEnd, SetStartBefore, SetStartAfter, SetEndBefore,
0051            SetEndAfter, Collapse, SelectNode, SelectNodeContents,
0052            CompareBoundaryPoints, DeleteContents, ExtractContents,
0053            CloneContents, InsertNode, SurroundContents, CloneRange, ToString,
0054            Detach, CreateContextualFragment
0055          };
0056     DOM::RangeImpl *impl() const
0057     {
0058         return m_impl.get();
0059     }
0060 protected:
0061     SharedPtr<DOM::RangeImpl> m_impl;
0062 };
0063 
0064 class DOMSelection: public JSObject
0065 {
0066 public:
0067     DOMSelection(ExecState *exec, DOM::DocumentImpl *parentDocument);
0068 
0069     using KJS::JSObject::getOwnPropertySlot;
0070     bool getOwnPropertySlot(ExecState *exec, const Identifier &propertyName, PropertySlot &slot) override;
0071     JSValue *getValueProperty(ExecState *exec, int token) const;
0072     // no put - all read-only
0073 
0074     const ClassInfo *classInfo() const override
0075     {
0076         return &info;
0077     }
0078     static const ClassInfo info;
0079 
0080     enum { AnchorNode, AnchorOffset, FocusNode, FocusOffset, IsCollapsed,
0081            Collapsed, CollapseToStart, CollapseToEnd, SelectAllChildren,
0082            DeleteFromDocument, RangeCount, GetRangeAt, AddRange, RemoveRange, RemoveAllRanges, ToString
0083          };
0084 
0085     DOM::Selection currentSelection() const;
0086     bool           attached() const; // if document & part are still alive..
0087     QPointer<DOM::DocumentImpl> m_document;
0088 };
0089 
0090 // Constructor object Range
0091 class RangeConstructor : public DOMObject
0092 {
0093 public:
0094     RangeConstructor(ExecState *);
0095     using KJS::JSObject::getOwnPropertySlot;
0096     bool getOwnPropertySlot(ExecState *exec, const Identifier &propertyName, PropertySlot &slot) override;
0097     JSValue *getValueProperty(ExecState *, int token) const;
0098     // no put - all read-only
0099     const ClassInfo *classInfo() const override
0100     {
0101         return &info;
0102     }
0103     static const ClassInfo info;
0104 };
0105 
0106 JSValue *getDOMRange(ExecState *exec, DOM::RangeImpl *r);
0107 JSValue *getRangeConstructor(ExecState *exec);
0108 JSObject *getRangeExceptionConstructor(ExecState *exec);
0109 
0110 /**
0111  * Convert an object to a RangeImpl. Returns 0 if not possible
0112  */
0113 DOM::RangeImpl *toRange(JSValue *);
0114 
0115 DEFINE_PSEUDO_CONSTRUCTOR(RangeExceptionPseudoCtor)
0116 
0117 class RangeException : public DOMObject
0118 {
0119 public:
0120     RangeException(ExecState *exec);
0121     const ClassInfo *classInfo() const override
0122     {
0123         return &info;
0124     }
0125     static const ClassInfo info;
0126 };
0127 
0128 } // namespace
0129 
0130 #endif