kjs_range.cpp
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
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 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
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; 
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 = getString(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 
00196 
00197 
00198 
00199 
00200 
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.isNull() || !obj.inherits(&DOMRange::info))
00226     return DOM::Range();
00227 
00228   const DOMRange *dobj = static_cast<const DOMRange*>(obj.imp());
00229   return dobj->toRange();
00230 }
 
This file is part of the documentation for khtml Library Version 3.2.0.