OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 | 242 |
243 TreeOutline.prototype._forgetChildrenRecursive = function(parentElement) | 243 TreeOutline.prototype._forgetChildrenRecursive = function(parentElement) |
244 { | 244 { |
245 var child = parentElement.children[0]; | 245 var child = parentElement.children[0]; |
246 while (child) { | 246 while (child) { |
247 this._forgetTreeElement(child); | 247 this._forgetTreeElement(child); |
248 child = child.traverseNextTreeElement(false, this, true); | 248 child = child.traverseNextTreeElement(false, this, true); |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
252 TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor,
getParent, equal) | 252 TreeOutline.prototype.getCachedTreeElement = function(representedObject) |
253 { | 253 { |
254 if (!representedObject) | 254 if (!representedObject) |
255 return null; | 255 return null; |
256 | 256 |
257 if (!equal) | |
258 equal = function(a, b) { return a === b }; | |
259 | |
260 if ("__treeElementIdentifier" in representedObject) { | 257 if ("__treeElementIdentifier" in representedObject) { |
261 // If this representedObject has a tree element identifier, and it is a
known TreeElement | 258 // If this representedObject has a tree element identifier, and it is a
known TreeElement |
262 // in our tree we can just return that tree element. | 259 // in our tree we can just return that tree element. |
263 var elements = this._knownTreeElements[representedObject.__treeElementId
entifier]; | 260 var elements = this._knownTreeElements[representedObject.__treeElementId
entifier]; |
264 if (elements) { | 261 if (elements) { |
265 for (var i = 0; i < elements.length; ++i) | 262 for (var i = 0; i < elements.length; ++i) |
266 if (equal(elements[i].representedObject, representedObject)) | 263 if (elements[i].representedObject === representedObject) |
267 return elements[i]; | 264 return elements[i]; |
268 } | 265 } |
269 } | 266 } |
| 267 return null; |
| 268 } |
270 | 269 |
271 if (!isAncestor || !(isAncestor instanceof Function) || !getParent || !(getP
arent instanceof Function)) | 270 TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor,
getParent) |
| 271 { |
| 272 if (!representedObject) |
272 return null; | 273 return null; |
273 | 274 |
| 275 var cachedElement = this.getCachedTreeElement(representedObject); |
| 276 if (cachedElement) |
| 277 return cachedElement; |
| 278 |
274 // The representedObject isn't know, so we start at the top of the tree and
work down to find the first | 279 // The representedObject isn't know, so we start at the top of the tree and
work down to find the first |
275 // tree element that represents representedObject or one of its ancestors. | 280 // tree element that represents representedObject or one of its ancestors. |
276 var item; | 281 var item; |
277 var found = false; | 282 var found = false; |
278 for (var i = 0; i < this.children.length; ++i) { | 283 for (var i = 0; i < this.children.length; ++i) { |
279 item = this.children[i]; | 284 item = this.children[i]; |
280 if (equal(item.representedObject, representedObject) || isAncestor(item.
representedObject, representedObject)) { | 285 if (item.representedObject === representedObject || isAncestor(item.repr
esentedObject, representedObject)) { |
281 found = true; | 286 found = true; |
282 break; | 287 break; |
283 } | 288 } |
284 } | 289 } |
285 | 290 |
286 if (!found) | 291 if (!found) |
287 return null; | 292 return null; |
288 | 293 |
289 // Make sure the item that we found is connected to the root of the tree. | 294 // Make sure the item that we found is connected to the root of the tree. |
290 // Build up a list of representedObject's ancestors that aren't already in o
ur tree. | 295 // Build up a list of representedObject's ancestors that aren't already in o
ur tree. |
291 var ancestors = []; | 296 var ancestors = []; |
292 var currentObject = representedObject; | 297 var currentObject = representedObject; |
293 while (currentObject) { | 298 while (currentObject) { |
294 ancestors.unshift(currentObject); | 299 ancestors.unshift(currentObject); |
295 if (equal(currentObject, item.representedObject)) | 300 if (currentObject === item.representedObject) |
296 break; | 301 break; |
297 currentObject = getParent(currentObject); | 302 currentObject = getParent(currentObject); |
298 } | 303 } |
299 | 304 |
300 // For each of those ancestors we populate them to fill in the tree. | 305 // For each of those ancestors we populate them to fill in the tree. |
301 for (var i = 0; i < ancestors.length; ++i) { | 306 for (var i = 0; i < ancestors.length; ++i) { |
302 // Make sure we don't call findTreeElement with the same representedObje
ct | 307 // Make sure we don't call findTreeElement with the same representedObje
ct |
303 // again, to prevent infinite recursion. | 308 // again, to prevent infinite recursion. |
304 if (equal(ancestors[i], representedObject)) | 309 if (ancestors[i] === representedObject) |
305 continue; | 310 continue; |
306 // FIXME: we could do something faster than findTreeElement since we wil
l know the next | 311 // FIXME: we could do something faster than findTreeElement since we wil
l know the next |
307 // ancestor exists in the tree. | 312 // ancestor exists in the tree. |
308 item = this.findTreeElement(ancestors[i], isAncestor, getParent, equal); | 313 item = this.findTreeElement(ancestors[i], isAncestor, getParent); |
309 if (item && item.onpopulate) | 314 if (item && item.onpopulate) |
310 item.onpopulate(item); | 315 item.onpopulate(item); |
311 } | 316 } |
312 | 317 |
313 // Now that all the ancestors are populated, try to find the representedObje
ct again. This time | 318 return this.getCachedTreeElement(representedObject); |
314 // without the isAncestor and getParent functions to prevent an infinite rec
ursion if it isn't found. | |
315 return this.findTreeElement(representedObject, null, null, equal); | |
316 } | 319 } |
317 | 320 |
318 TreeOutline.prototype.treeElementFromPoint = function(x, y) | 321 TreeOutline.prototype.treeElementFromPoint = function(x, y) |
319 { | 322 { |
320 var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y); | 323 var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y); |
321 var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]); | 324 var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]); |
322 if (listNode) | 325 if (listNode) |
323 return listNode.parentTreeElement || listNode.treeElement; | 326 return listNode.parentTreeElement || listNode.treeElement; |
324 return null; | 327 return null; |
325 } | 328 } |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 return null; | 840 return null; |
838 | 841 |
839 return this.parent; | 842 return this.parent; |
840 } | 843 } |
841 | 844 |
842 TreeElement.prototype.isEventWithinDisclosureTriangle = function(event) | 845 TreeElement.prototype.isEventWithinDisclosureTriangle = function(event) |
843 { | 846 { |
844 var left = this._listItemNode.totalOffsetLeft; | 847 var left = this._listItemNode.totalOffsetLeft; |
845 return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth &&
this.hasChildren; | 848 return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth &&
this.hasChildren; |
846 } | 849 } |
OLD | NEW |