Thanks Tracy, I'll try that. I'll take some time @ startup to build the
dictionary, but doing it once is of course better than doing it x times
every minute :).

On Fri, Jan 1, 2010 at 6:53 PM, Tracy Spratt <[email protected]> wrote:

>
>
>  One thing I have considered trying is to put a reference to every node
> into an associative array Object), based on a string key.  That would
> essentially give you random access to any node at hash table speeds.  Or
> maybe use a Dictionary, with the node as the key.
>
>
>
> I have not actually tried this.
>
>
>
> Tracy Spratt,
>
> Lariat Services, development services available
>   ------------------------------
>
> *From:* [email protected] [mailto:[email protected]] *On
> Behalf Of *Jeroen Beckers
> *Sent:* Thursday, December 31, 2009 8:34 AM
> *To:* [email protected]
> *Subject:* [SPAM] Re: [flexcoders] Selecting xml nodes in a tree
>
>
>
>
>
> I fine-tuned it to the following (some lines are commented, just to give a
> complete example for future google-visitors)
>
> private function displayTreeNode(node:XML):void
>         {
>             var t:Number = getTimer();
>             //expand all the parents
>             expandToTop(node.parent());
>             //item is now selectable
>             tree.selectedItem = node;
>             //open the item itself
>             //tree.expandItem(node,true,false);
>
>
>             //make the node visible (=position scrollbar)
>             var idx:int = tree.getItemIndex(node);
>             tree.scrollToIndex(idx);
>             //tree.firstVisibleItem = node;
>
>             trace("Looking up the item in the tree took " + (getTimer() -
> t) + "ms");
>         }
>
>         private function expandToTop(node:XML):void
>         {
>             //open if it's not open yet
>             //if(!tree.isItemOpen(node)) tree.expandItem(node, true);
>             tree.expandItem(node, true);
>
>             //if there's a parent, continue recursion
>             if(node.parent()) expandToTop(node.parent());
>         }
>
> The only problem now is that my treeData is really big and the E4X
> statement takes about 1200ms on average. Updating the tree takes up another
> 800ms. I'll have to optimize the crap out of this :).
>
>
>  On Wed, Dec 30, 2009 at 5:21 PM, Jim Hayes <[email protected]>
> wrote:
>
>
>
> It strikes me now that if it meets an open node on the way up the tree it
> will stop there (and probably shouldn't)
> You might want to allow for that / fix it.
> It's something that I put in as a feature request that was subsequently
> depreciated because when the client saw it in practice they decided they
> didn't like it after all!
> So it's not all that well tested I'm afraid.
>
>
>
> -----Original Message-----
> From: [email protected] <flexcoders%40yahoogroups.com> on behalf
> of Jeroen Beckers
> Sent: Wed 12/30/2009 3:20 PM
> To: [email protected] <flexcoders%40yahoogroups.com>
>
> Subject: Re: [flexcoders] Selecting xml nodes in a tree
>
> Hi Jim,
>
> I think that'll be enough to get me going, thanks! :).
>
> And if not, you'll hear from me soon enough :).
>
> Greets,
> Dauntless
> On Wed, Dec 30, 2009 at 3:36 PM, Jim Hayes 
> <[email protected]<jim%40primalpictures.com>>
> wrote:
>
> >
> >
> > I've used something like this (which is possibly a bit flaky, I admit. I
> > wrote this a long time ago and haven't revisited it since).
> >
> > private function displayTreeNode(node:XML):void
> > {
> > expandTreeParents(node);
> > movieTree.selectedItem = node;
> > movieTree.expandItem(node,true,false);
> > var idx:int = movieTree.getItemIndex(node);
> > movieTree.scrollToIndex(idx);
> > movieTree.firstVisibleItem = node;
> > }
> >
> > private function expandTreeParents(node:XML):void {
> > if (node && !movieTree.isItemOpen(node)) {
> > movieTree.expandItem(node, true);
> > expandTreeParents(node.parent());
> > }
> > }
> >
> > where movieTree is my tree instance.
> > You need to traverse up the tree from the node you want to display and
> open
> > each item ( expandTreeParents() above ),
> > then select the node you want to display. This may not be visible even
> > then, hence the scroll to index stuff.
> >
> > Hope that's enough to get you going, in any case.
> >
> >
> > -----Original Message-----
>
> > From: [email protected] <flexcoders%40yahoogroups.com><flexcoders%
> 40yahoogroups.com> on behalf
> > of thedauntless_ff
> > Sent: Wed 12/30/2009 1:31 PM
>
> > To: [email protected] <flexcoders%40yahoogroups.com><flexcoders%
> 40yahoogroups.com>
> > Subject: [flexcoders] Selecting xml nodes in a tree
> >
> > Hi,
> >
> > My situation:
> > - 1 Tree component (id=tree)
> > - 1 XMLListCollection as a dataprovider for the tree (id=treeData)
> > - 1 String, a url, that has to be found & selected.
> >
> > My XMLListCollection looks like this:
> > <page title="page1" href="url1">
> > <page title="subpage1" href="url2"/>
> > <page title="subpage2" href="url3">
> > <page title="subsubpage1" href="url4">
> > </page>
> > </page>
> > <page title="page2" href="url5">
> > <page .../>
> > <page .../>
> > </page>
> >
> > Etc. All nodes are named 'page' and have a href property.
> >
> > What I need now, is a way to select the node in the tree for the given
> url.
> > For example, all nodes are collapsed and I want to select the node with
> > href=url4. How can I do this?
> >
> > This is what I tried:
> >
> > var t:XMLListCollection = this.treeData;
> > var url:String = "myURL";
> > for(var i:Number = 0; i<t.length; i++)
> > {
> > //this works, nodes now contains a list of xml items with the correct
> url.
> > var nodes:XMLList = t[i]..page.(@href==url);
> > if(nodes.length() > 0)
> > {
> > //I only want to select the first occurence
> > tree.selectedItem = nodes[0];
> > break;
> > }
> > }
> >
> > This, however, gives me a weird error (probably not that helpfull):
> >
> > TypeError: Error #1010: A term is undefined and has no properties.
> > at
> >
> mx.controls.listClasses::ListBase/setSelectionDataLoop()[E:\dev\beta1\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:7360]
> > at
> >
> mx.controls.listClasses::ListBase/commitSelectedItems()[E:\dev\beta1\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:7251]
> > at
> >
> mx.controls.listClasses::ListBase/commitSelectedItem()[E:\dev\beta1\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:7216]
> > at mx.controls.listClasses::ListBase/set
> >
> selectedItem()[E:\dev\beta1\frameworks\projects\framework\src\mx\controls\listClasses\ListBase.as:3474]
> > at classes::Logic/onBrowserLocationChange()[C:\Users\ser\Documents\Flex
> > Builder 3\application\src\classes\Logic.as:346]
> > at flash.events::EventDispatcher/dispatchEventFunction()
> > at flash.events::EventDispatcher/dispatchEvent()
> > at
> >
> mx.core::UIComponent/dispatchEvent()[E:\dev\beta1\frameworks\projects\framework\src\mx\core\UIComponent.as:11260]
> > at Classes::Logic/onBrowserLocationChange()[C:\Users\user\Documents\Flex
> > Builder 3\application\src\classes\Logic.as:73]
> > at flash.events::EventDispatcher/dispatchEventFunction()
> > at flash.events::EventDispatcher/dispatchEvent()
> > at
> >
> mx.core::UIComponent/dispatchEvent()[E:\dev\beta1\frameworks\projects\framework\src\mx\core\UIComponent.as:11260]
> > at
> >
> mx.controls::HTML/htmlLoader_locationChangeHandler()[E:\dev\beta1\frameworks\projects\airframework\src\mx\controls\HTML.as:1438]
> > at flash.events::EventDispatcher/dispatchEventFunction()
> > at flash.events::EventDispatcher/dispatchEvent()
> > at flash.html::HTMLLoader/onLocationChangeTimer()
> > at flash.utils::Timer/_timerDispatch()
> > at flash.utils::Timer/tick()
> >
> > Greets,
> > Dauntless
> >
> > __________________________________________________________
> > This communication is from Primal Pictures Ltd., a company registered in
> > England and Wales with registration No. 02622298 and registered office:
> 4th
> > Floor, Tennyson House, 159-165 Great Portland Street, London, W1W 5PA,
> UK.
> > VAT registration No. 648874577.
> >
> > This e-mail is confidential and may be privileged. It may be read, copied
> > and used only by the intended recipient. If you have received it in
> error,
> > please contact the sender immediately by return e-mail or by telephoning
> > +44(0)20 7637 1010. Please then delete the e-mail and do not disclose its
> > contents to any person.
> > This email has been scanned for Primal Pictures by the MessageLabs Email
> > Security System.
> > __________________________________________________________
> >
> >
>
> __________________________________________________________
> This communication is from Primal Pictures Ltd., a company registered in
> England and Wales with registration No. 02622298 and registered office: 4th
> Floor, Tennyson House, 159-165 Great Portland Street, London, W1W 5PA, UK.
> VAT registration No. 648874577.
>
> This e-mail is confidential and may be privileged. It may be read, copied
> and used only by the intended recipient. If you have received it in error,
> please contact the sender immediately by return e-mail or by telephoning
> +44(0)20 7637 1010. Please then delete the e-mail and do not disclose its
> contents to any person.
> This email has been scanned for Primal Pictures by the MessageLabs Email
> Security System.
> __________________________________________________________
>
>
>   
>

Reply via email to