/*
	Copyright (c) 2004-2006, The Dojo Foundation
	All Rights Reserved.

	Licensed under the Academic Free License version 2.1 or above OR the
	modified BSD license. For more information on Dojo licensing, see:

		http://dojotoolkit.org/community/licensing.shtml
*/


dojo.provide("dojo.widget.TreeExpandToNodeOnSelect");

dojo.require("dojo.widget.HtmlWidget");

/**
 * when a node is selected, expands tree to make it visible
 * useful for program expansion
 */
dojo.widget.defineWidget(
	"dojo.widget.TreeExpandToNodeOnSelect",
	dojo.widget.HtmlWidget,
{
	selector: "",
	controller: "",

	/**
	* if true, then selected node will be expanded too
	*/
	withSelected: false,

	initialize: function() {
		this.selector = dojo.widget.byId(this.selector);
		this.controller = dojo.widget.byId(this.controller);

		dojo.event.topic.subscribe(this.selector.eventNames.select, this, "onSelect");
	},


	onSelectEvent: function(message) {
		this.controller.expandToNode(message.node, this.withSelected)
	}




});
