From 04e0ec083436b8e3e49a1ef205c70c1833f8832f Mon Sep 17 00:00:00 2001 From: Martin Zagora Date: Fri, 28 Feb 2014 08:57:16 +1100 Subject: [PATCH 1/3] Added 'Collapse file tree' feature and 'Toggle siblings' feature --- src/project/ProjectManager.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/project/ProjectManager.js b/src/project/ProjectManager.js index 15be36604b9..6da3b58467d 100644 --- a/src/project/ProjectManager.js +++ b/src/project/ProjectManager.js @@ -671,6 +671,29 @@ define(function (require, exports, module) { ViewUtils.addScrollerShadow(_projectTree.get(0)); _projectTree + .off("click.jstree", "li > ins") + .on("click.jstree", "li > ins", function (event) { + var $node = $(event.target).parent("li"); + if (event.ctrlKey || event.metaKey) { + if (event.altKey) { + // collapse subtree + // note: expanding using open_all is a bad idea due to poor performance + if ($node.is(".jstree-open")) { + _projectTree.jstree("close_all", $node); + return; + } + } else { + // toggle siblings + var methodName = $node.is(".jstree-open") ? "close_node" : "open_node"; + $node.parent().children("li").each(function () { + _projectTree.jstree(methodName, $(this)); + }); + return; + } + } + // original behaviour + _projectTree.jstree("toggle_node", $node); + }) .unbind("dblclick.jstree") .bind("dblclick.jstree", function (event) { var entry = $(event.target).closest("li").data("entry"); From 151f3c16337498a9f2aa0f05cdbb8152df251208 Mon Sep 17 00:00:00 2001 From: Martin Zagora Date: Fri, 21 Mar 2014 09:10:24 +1100 Subject: [PATCH 2/3] Handle clicking on the label too --- src/project/ProjectManager.js | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/project/ProjectManager.js b/src/project/ProjectManager.js index 6da3b58467d..fd6364a616c 100644 --- a/src/project/ProjectManager.js +++ b/src/project/ProjectManager.js @@ -670,9 +670,20 @@ define(function (require, exports, module) { // install scroller shadows ViewUtils.addScrollerShadow(_projectTree.get(0)); - _projectTree - .off("click.jstree", "li > ins") - .on("click.jstree", "li > ins", function (event) { + var findEventHandler = function (type, namespace, selector) { + var events = $._data(_projectTree[0], "events"), + eventsForType = events ? events[type] : null, + event = eventsForType ? _.find(eventsForType, function (e) { + return e.namespace === namespace && e.selector === selector; + }) : null, + eventHandler = event ? event.handler : null; + if (!eventHandler) { + console.error(type + "." + namespace + " " + selector + " handler not found!"); + } + return eventHandler; + }; + var createCustomHandler = function(originalHandler) { + return function (event) { var $node = $(event.target).parent("li"); if (event.ctrlKey || event.metaKey) { if (event.altKey) { @@ -692,8 +703,17 @@ define(function (require, exports, module) { } } // original behaviour - _projectTree.jstree("toggle_node", $node); - }) + originalHandler.apply(this, arguments); + }; + }; + var originalHrefHandler = findEventHandler("click", "jstree", "a"); + var originalInsHandler = findEventHandler("click", "jstree", "li > ins"); + + _projectTree + .off("click.jstree", "a") + .on("click.jstree", "a", createCustomHandler(originalHrefHandler)) + .off("click.jstree", "li > ins") + .on("click.jstree", "li > ins", createCustomHandler(originalInsHandler)) .unbind("dblclick.jstree") .bind("dblclick.jstree", function (event) { var entry = $(event.target).closest("li").data("entry"); From f265e7485fef49518f8dff9738c25fd3a6acf7da Mon Sep 17 00:00:00 2001 From: Martin Zagora Date: Tue, 25 Mar 2014 08:23:16 +1100 Subject: [PATCH 3/3] Fix according to latest comment --- src/project/ProjectManager.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/project/ProjectManager.js b/src/project/ProjectManager.js index fd6364a616c..a3e5b6ac4d7 100644 --- a/src/project/ProjectManager.js +++ b/src/project/ProjectManager.js @@ -684,18 +684,18 @@ define(function (require, exports, module) { }; var createCustomHandler = function(originalHandler) { return function (event) { - var $node = $(event.target).parent("li"); + var $node = $(event.target).parent("li"), + methodName; if (event.ctrlKey || event.metaKey) { if (event.altKey) { // collapse subtree // note: expanding using open_all is a bad idea due to poor performance - if ($node.is(".jstree-open")) { - _projectTree.jstree("close_all", $node); - return; - } + methodName = $node.is(".jstree-open") ? "close_all" : "open_node"; + _projectTree.jstree(methodName, $node); + return; } else { // toggle siblings - var methodName = $node.is(".jstree-open") ? "close_node" : "open_node"; + methodName = $node.is(".jstree-open") ? "close_node" : "open_node"; $node.parent().children("li").each(function () { _projectTree.jstree(methodName, $(this)); });