1 /* ************************************************************************
3 qooxdoo - the new era of web development
8 2004-2007 1&1 Internet AG, Germany, http://www.1and1.org
11 LGPL: http://www.gnu.org/licenses/lgpl.html
12 EPL: http://www.eclipse.org/org/documents/epl-v10.php
13 See the LICENSE file in the project's top-level directory for details.
16 * Sebastian Werner (wpbasti)
17 * Andreas Ecker (ecker)
19 ************************************************************************ */
21 /* ************************************************************************
25 ************************************************************************ */
27 qx.OO.defineClass("qx.ui.tree.Tree", qx.ui.tree.TreeFolder,
28 function(vLabel, vIcon, vIconSelected)
30 qx.ui.tree.TreeFolder.call(this, vLabel, vIcon, vIconSelected);
32 // ************************************************************************
33 // INITILISIZE MANAGER
34 // ************************************************************************
35 this._manager = new qx.manager.selection.TreeSelectionManager(this);
38 this._iconObject.setAppearance("tree-icon");
39 this._labelObject.setAppearance("tree-label");
42 // ************************************************************************
44 // ************************************************************************
45 // The tree should be open by default
48 // Fix vertical alignment of empty tree
52 // ************************************************************************
54 // ************************************************************************
55 this.addEventListener("keydown", this._onkeydown);
56 this.addEventListener("keypress", this._onkeypress);
57 this.addEventListener("keyup", this._onkeyup);
65 ---------------------------------------------------------------------------
67 ---------------------------------------------------------------------------
70 qx.OO.addProperty({ name : "useDoubleClick", type : "boolean", defaultValue : false, getAlias : "useDoubleClick" });
71 qx.OO.addProperty({ name : "useTreeLines", type : "boolean", defaultValue : true, getAlias : "useTreeLines" });
79 ---------------------------------------------------------------------------
81 ---------------------------------------------------------------------------
84 qx.Proto.getManager = function() {
88 qx.Proto.getSelectedElement = function() {
89 return this.getManager().getSelectedItem();
98 ---------------------------------------------------------------------------
100 ---------------------------------------------------------------------------
103 qx.Proto.addChildToTreeQueue = function(vChild)
105 if (!vChild._isInTreeQueue && !vChild._isDisplayable) {
106 this.debug("Ignoring invisible child: " + vChild);
109 if (!vChild._isInTreeQueue && vChild._isDisplayable)
111 qx.ui.core.Widget.addToGlobalWidgetQueue(this);
113 if (!this._treeQueue) {
114 this._treeQueue = {};
117 this._treeQueue[vChild.toHashCode()] = vChild;
119 vChild._isInTreeQueue = true;
123 qx.Proto.removeChildFromTreeQueue = function(vChild)
125 if (vChild._isInTreeQueue)
127 if (this._treeQueue) {
128 delete this._treeQueue[vChild.toHashCode()];
131 delete vChild._isInTreeQueue;
135 qx.Proto.flushWidgetQueue = function() {
136 this.flushTreeQueue();
139 qx.Proto.flushTreeQueue = function()
141 if (!qx.lang.Object.isEmpty(this._treeQueue))
143 for (var vHashCode in this._treeQueue)
145 // this.debug("Flushing Tree Child: " + this._treeQueue[vHashCode]);
146 this._treeQueue[vHashCode].flushTree();
147 delete this._treeQueue[vHashCode]._isInTreeQueue;
150 delete this._treeQueue;
161 ---------------------------------------------------------------------------
163 ---------------------------------------------------------------------------
166 qx.Proto._modifyUseTreeLines = function(propValue, propOldValue, propData)
168 if (this._initialLayoutDone) {
169 this._updateIndent();
182 ---------------------------------------------------------------------------
184 ---------------------------------------------------------------------------
187 qx.Proto.getTree = function() {
191 qx.Proto.getParentFolder = function() {
195 qx.Proto.getLevel = function() {
207 ---------------------------------------------------------------------------
209 ---------------------------------------------------------------------------
212 qx.ui.tree.Tree.isTreeFolder = function(vObject) {
213 return vObject && vObject instanceof qx.ui.tree.TreeFolder && !(vObject instanceof qx.ui.tree.Tree);
216 qx.ui.tree.Tree.isOpenTreeFolder = function(vObject) {
217 return vObject instanceof qx.ui.tree.TreeFolder && vObject.getOpen() && vObject.hasContent();
227 ---------------------------------------------------------------------------
229 ---------------------------------------------------------------------------
232 qx.Proto._onkeydown = function(e)
234 var vSelectedItem = this.getManager().getSelectedItem();
236 if (e.getKeyIdentifier() == "Enter") {
239 if (qx.ui.tree.Tree.isTreeFolder(vSelectedItem)) {
240 return vSelectedItem.toggle();
246 qx.Proto._onkeypress = function(e)
248 var vManager = this.getManager();
249 var vSelectedItem = vManager.getSelectedItem();
251 switch(e.getKeyIdentifier())
256 if (qx.ui.tree.Tree.isTreeFolder(vSelectedItem))
258 if (!vSelectedItem.getOpen())
260 var vParent = vSelectedItem.getParentFolder();
261 if (vParent instanceof qx.ui.tree.TreeFolder) {
262 if (!(vParent instanceof qx.ui.tree.Tree)) {
266 this.setSelectedElement(vParent);
271 return vSelectedItem.close();
274 else if (vSelectedItem instanceof qx.ui.tree.TreeFile)
276 var vParent = vSelectedItem.getParentFolder();
277 if (vParent instanceof qx.ui.tree.TreeFolder) {
278 if (!(vParent instanceof qx.ui.tree.Tree)) {
282 this.setSelectedElement(vParent);
291 if (qx.ui.tree.Tree.isTreeFolder(vSelectedItem))
293 if (!vSelectedItem.getOpen())
295 return vSelectedItem.open();
297 else if (vSelectedItem.hasContent())
299 var vFirst = vSelectedItem.getFirstVisibleChildOfFolder();
300 this.setSelectedElement(vFirst);
302 if (vFirst instanceof qx.ui.tree.TreeFolder) {
313 if (!this._fastUpdate)
315 this._fastUpdate = true;
316 this._oldItem = vSelectedItem;
319 vManager.handleKeyPress(e);
324 qx.Proto._onkeyup = function(e)
326 if (this._fastUpdate)
328 var vOldItem = this._oldItem;
329 var vNewItem = this.getManager().getSelectedItem();
331 vNewItem.getIconObject().addState("selected");
333 delete this._fastUpdate;
334 delete this._oldItem;
339 qx.Proto.getLastTreeChild = function()
343 while (vLast instanceof qx.ui.tree.AbstractTreeElement)
345 if (!(vLast instanceof qx.ui.tree.TreeFolder) || !vLast.getOpen()) {
349 vLast = vLast.getLastVisibleChildOfFolder();
356 qx.Proto.getFirstTreeChild = function() {
361 qx.Proto.setSelectedElement = function(vElement)
363 var vManager = this.getManager();
365 vManager.setSelectedItem(vElement);
366 vManager.setLeadItem(vElement);
376 ---------------------------------------------------------------------------
378 ---------------------------------------------------------------------------
381 qx.Proto.dispose = function()
383 if (this.getDisposed()) {
387 this.removeEventListener("keydown", this._onkeydown);
388 this.removeEventListener("keypress", this._onkeypress);
389 this.removeEventListener("keyup", this._onkeyup);
393 this._manager.dispose();
394 this._manager = null;
397 delete this._oldItem;
399 return qx.ui.tree.TreeFolder.prototype.dispose.call(this);