kjs_range.cpp

00001 // -*- c-basic-offset: 2 -*-
00002 /*
00003  *  This file is part of the KDE libraries
00004  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
00005  *  Copyright (C) 2003 Apple Computer, Inc.
00006  *
00007  *  This library is free software; you can redistribute it and/or
00008  *  modify it under the terms of the GNU Library General Public
00009  *  License as published by the Free Software Foundation; either
00010  *  version 2 of the License, or (at your option) any later version.
00011  *
00012  *  This library is distributed in the hope that it will be useful,
00013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  *  Library General Public License for more details.
00016  *
00017  *  You should have received a copy of the GNU Library General Public
00018  *  License along with this library; if not, write to the Free Software
00019  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00020  */
00021 
00022 #include "kjs_range.h"
00023 #include "kjs_range.lut.h"
00024 #include <kdebug.h>
00025 
00026 using namespace KJS;
00027 
00028 // -------------------------------------------------------------------------
00029 
00030 const ClassInfo DOMRange::info = { "Range", 0, &DOMRangeTable, 0 };
00031 /*
00032 @begin DOMRangeTable 7
00033   startContainer    DOMRange::StartContainer    DontDelete|ReadOnly
00034   startOffset       DOMRange::StartOffset       DontDelete|ReadOnly
00035   endContainer      DOMRange::EndContainer      DontDelete|ReadOnly
00036   endOffset     DOMRange::EndOffset     DontDelete|ReadOnly
00037   collapsed     DOMRange::Collapsed     DontDelete|ReadOnly
00038   commonAncestorContainer DOMRange::CommonAncestorContainer DontDelete|ReadOnly
00039 @end
00040 @begin DOMRangeProtoTable 17
00041 setStart            DOMRange::SetStart          DontDelete|Function 2
00042   setEnd            DOMRange::SetEnd            DontDelete|Function 2
00043   setStartBefore        DOMRange::SetStartBefore        DontDelete|Function 1
00044   setStartAfter         DOMRange::SetStartAfter     DontDelete|Function 1
00045   setEndBefore          DOMRange::SetEndBefore      DontDelete|Function 1
00046   setEndAfter           DOMRange::SetEndAfter       DontDelete|Function 1
00047   collapse          DOMRange::Collapse          DontDelete|Function 1
00048   selectNode            DOMRange::SelectNode        DontDelete|Function 1
00049   selectNodeContents        DOMRange::SelectNodeContents    DontDelete|Function 1
00050   compareBoundaryPoints     DOMRange::CompareBoundaryPoints DontDelete|Function 2
00051   deleteContents        DOMRange::DeleteContents        DontDelete|Function 0
00052   extractContents       DOMRange::ExtractContents       DontDelete|Function 0
00053   cloneContents         DOMRange::CloneContents     DontDelete|Function 0
00054   insertNode            DOMRange::InsertNode        DontDelete|Function 1
00055   surroundContents      DOMRange::SurroundContents      DontDelete|Function 1
00056   cloneRange            DOMRange::CloneRange        DontDelete|Function 0
00057   toString          DOMRange::ToString          DontDelete|Function 0
00058   detach            DOMRange::Detach            DontDelete|Function 0
00059   createContextualFragment  DOMRange::CreateContextualFragment  DontDelete|Function 1
00060 @end
00061 */
00062 DEFINE_PROTOTYPE("DOMRange",DOMRangeProto)
00063 IMPLEMENT_PROTOFUNC_DOM(DOMRangeProtoFunc)
00064 IMPLEMENT_PROTOTYPE(DOMRangeProto,DOMRangeProtoFunc)
00065 
00066 DOMRange::DOMRange(ExecState *exec, DOM::Range r)
00067  : DOMObject(DOMRangeProto::self(exec)), range(r) {}
00068 
00069 DOMRange::~DOMRange()
00070 {
00071   ScriptInterpreter::forgetDOMObject(range.handle());
00072 }
00073 
00074 Value DOMRange::tryGet(ExecState *exec, const Identifier &p) const
00075 {
00076   return DOMObjectLookupGetValue<DOMRange,DOMObject>(exec,p,&DOMRangeTable,this);
00077 }
00078 
00079 Value DOMRange::getValueProperty(ExecState *exec, int token) const
00080 {
00081   switch (token) {
00082   case StartContainer:
00083     return getDOMNode(exec,range.startContainer());
00084   case StartOffset:
00085     return Number(range.startOffset());
00086   case EndContainer:
00087     return getDOMNode(exec,range.endContainer());
00088   case EndOffset:
00089     return Number(range.endOffset());
00090   case Collapsed:
00091     return Boolean(range.collapsed());
00092   case CommonAncestorContainer: {
00093     DOM::Range range2 = range; // avoid const error
00094     return getDOMNode(exec,range2.commonAncestorContainer());
00095   }
00096   default:
00097     kdDebug(6070) << "WARNING: Unhandled token in DOMRange::getValueProperty : " << token << endl;
00098     return Value();
00099   }
00100 }
00101 
00102 Value DOMRangeProtoFunc::tryCall(ExecState *exec, Object &thisObj, const List &args)
00103 {
00104   KJS_CHECK_THIS( KJS::DOMRange, thisObj );
00105   DOM::Range range = static_cast<DOMRange *>(thisObj.imp())->toRange();
00106   Value result;
00107 
00108   switch (id) {
00109     case DOMRange::SetStart:
00110       range.setStart(toNode(args[0]),args[1].toInteger(exec));
00111       result = Undefined();
00112       break;
00113     case DOMRange::SetEnd:
00114       range.setEnd(toNode(args[0]),args[1].toInteger(exec));
00115       result = Undefined();
00116       break;
00117     case DOMRange::SetStartBefore:
00118       range.setStartBefore(toNode(args[0]));
00119       result = Undefined();
00120       break;
00121     case DOMRange::SetStartAfter:
00122       range.setStartAfter(toNode(args[0]));
00123       result = Undefined();
00124       break;
00125     case DOMRange::SetEndBefore:
00126       range.setEndBefore(toNode(args[0]));
00127       result = Undefined();
00128       break;
00129     case DOMRange::SetEndAfter:
00130       range.setEndAfter(toNode(args[0]));
00131       result = Undefined();
00132       break;
00133     case DOMRange::Collapse:
00134       range.collapse(args[0].toBoolean(exec));
00135       result = Undefined();
00136       break;
00137     case DOMRange::SelectNode:
00138       range.selectNode(toNode(args[0]));
00139       result = Undefined();
00140       break;
00141     case DOMRange::SelectNodeContents:
00142       range.selectNodeContents(toNode(args[0]));
00143       result = Undefined();
00144       break;
00145     case DOMRange::CompareBoundaryPoints:
00146       result = Number(range.compareBoundaryPoints(static_cast<DOM::Range::CompareHow>(args[0].toInteger(exec)),toRange(args[1])));
00147       break;
00148     case DOMRange::DeleteContents:
00149       range.deleteContents();
00150       result = Undefined();
00151       break;
00152     case DOMRange::ExtractContents:
00153       result = getDOMNode(exec,range.extractContents());
00154       break;
00155     case DOMRange::CloneContents:
00156       result = getDOMNode(exec,range.cloneContents());
00157       break;
00158     case DOMRange::InsertNode:
00159       range.insertNode(toNode(args[0]));
00160       result = Undefined();
00161       break;
00162     case DOMRange::SurroundContents:
00163       range.surroundContents(toNode(args[0]));
00164       result = Undefined();
00165       break;
00166     case DOMRange::CloneRange:
00167       result = getDOMRange(exec,range.cloneRange());
00168       break;
00169     case DOMRange::ToString:
00170       result = String(range.toString());
00171       break;
00172     case DOMRange::Detach:
00173       range.detach();
00174       result = Undefined();
00175       break;
00176     case DOMRange::CreateContextualFragment:
00177       Value value = args[0];
00178       DOM::DOMString str = value.isA(NullType) ? DOM::DOMString() : value.toString(exec).string();
00179       result = getDOMNode(exec, range.createContextualFragment(str));
00180       break;
00181   };
00182 
00183   return result;
00184 }
00185 
00186 Value KJS::getDOMRange(ExecState *exec, DOM::Range r)
00187 {
00188   return cacheDOMObject<DOM::Range, KJS::DOMRange>(exec, r);
00189 }
00190 
00191 // -------------------------------------------------------------------------
00192 
00193 const ClassInfo RangeConstructor::info = { "RangeConstructor", 0, &RangeConstructorTable, 0 };
00194 /*
00195 @begin RangeConstructorTable 5
00196   START_TO_START    DOM::Range::START_TO_START  DontDelete|ReadOnly
00197   START_TO_END      DOM::Range::START_TO_END    DontDelete|ReadOnly
00198   END_TO_END        DOM::Range::END_TO_END      DontDelete|ReadOnly
00199   END_TO_START      DOM::Range::END_TO_START    DontDelete|ReadOnly
00200 @end
00201 */
00202 
00203 RangeConstructor::RangeConstructor(ExecState *exec)
00204   : DOMObject(exec->interpreter()->builtinObjectPrototype()) { }
00205 
00206 Value RangeConstructor::tryGet(ExecState *exec, const Identifier &p) const
00207 {
00208   return DOMObjectLookupGetValue<RangeConstructor,DOMObject>(exec,p,&RangeConstructorTable,this);
00209 }
00210 
00211 Value RangeConstructor::getValueProperty(ExecState *, int token) const
00212 {
00213   return Number(token);
00214 }
00215 
00216 Value KJS::getRangeConstructor(ExecState *exec)
00217 {
00218   return cacheGlobalObject<RangeConstructor>(exec, "[[range.constructor]]");
00219 }
00220 
00221 
00222 DOM::Range KJS::toRange(const Value& val)
00223 {
00224   Object obj = Object::dynamicCast(val);
00225   if (!obj.isValid() || !obj.inherits(&DOMRange::info))
00226     return DOM::Range();
00227 
00228   const DOMRange *dobj = static_cast<const DOMRange*>(obj.imp());
00229   return dobj->toRange();
00230 }
KDE Home | KDE Accessibility Home | Description of Access Keys