@@ -16,6 +16,11 @@ var ClassTree = function (parent, treeViewContainer) {
1616 this . SELECTED_ELEMENT = null ;
1717 this . SELECTED_LEVEL = null ;
1818 this . treeObject = null ;
19+ /**
20+ * @private
21+ * @type {string[] }
22+ */
23+ this . selectedClassList = [ ] ;
1924
2025 this . cacheClassExplorer . elements . classTreeSearch . addEventListener ( "input" , function ( e ) {
2126 self . searchChanged . call ( self , ( e . target || e . srcElement ) . value ) ;
@@ -29,6 +34,13 @@ var ClassTree = function (parent, treeViewContainer) {
2934
3035} ;
3136
37+ ClassTree . prototype . setSelectedClassList = function ( list ) {
38+
39+ // this enables saved view to be consistent for any class names order
40+ this . selectedClassList = list . sort ( ) ;
41+
42+ } ;
43+
3244ClassTree . prototype . updateSizes = function ( ) {
3345
3446 var dh = this . cacheClassExplorer . elements . searchBlock . clientHeight ,
@@ -63,6 +75,11 @@ ClassTree.prototype.removeLoader = function () {
6375
6476} ;
6577
78+ /**
79+ * @deprecated
80+ * @param element
81+ * @param className
82+ */
6683ClassTree . prototype . classSelected = function ( element , className ) {
6784
6885 if ( element !== this . SELECTED_ELEMENT ) {
@@ -91,6 +108,18 @@ ClassTree.prototype.packageSelected = function (element, packageName) {
91108
92109} ;
93110
111+ /**
112+ * @param {string[] } classList
113+ */
114+ ClassTree . prototype . classesSelected = function ( classList ) {
115+
116+ if ( this . SELECTED_ELEMENT ) this . SELECTED_ELEMENT . classList . remove ( "selected" ) ;
117+ this . SELECTED_ELEMENT = null ;
118+
119+ this . cacheClassExplorer . classView . loadClasses ( classList ) ;
120+
121+ } ;
122+
94123ClassTree . prototype . searchChanged = function ( query ) {
95124
96125 var o = this . treeObject ;
@@ -116,6 +145,14 @@ ClassTree.prototype.searchChanged = function (query) {
116145
117146} ;
118147
148+ ClassTree . prototype . uncheckAll = function ( ) {
149+ this . setSelectedClassList ( [ ] ) ;
150+ [ ] . slice . call ( document . querySelectorAll ( "#treeView input[type=checkbox]" ) )
151+ . forEach ( function ( cb ) {
152+ cb . checked = false ;
153+ } ) ;
154+ } ;
155+
119156/**
120157 * @param treeObject
121158 * @param {boolean } [doNotChangeRoot] - Determines to restrict assign of this.treeObject.
@@ -142,24 +179,46 @@ ClassTree.prototype.updateTree = function (treeObject, doNotChangeRoot) {
142179
143180 } ;
144181
145- var classClick = function ( e ) {
182+ function checkboxClick ( e , checked , className ) {
146183
147- var el = e . target || e . srcElement ;
184+ e . cancelBubble = true ;
185+
186+ self . setSelectedClassList (
187+ self . selectedClassList . filter ( function ( n ) { return n !== className ; } )
188+ ) ;
189+ if ( checked ) {
190+ self . setSelectedClassList ( self . selectedClassList . concat ( className ) ) ;
191+ }
148192
149- self . classSelected ( el , el . CLASS_NAME ) ;
193+ self . classesSelected ( self . selectedClassList ) ;
150194
151- } ;
195+ }
196+
197+ function inPath ( path , classList ) {
198+ var inside = false ,
199+ s = path + "." ;
200+ console . log ( s ) ;
201+ classList . forEach ( function ( e ) {
202+ if ( e . indexOf ( s ) === 0 )
203+ inside = true ;
204+ } ) ;
205+ return inside ;
206+ }
152207
153208 var append = function ( rootElement , elementName , isPackage , path , level ) {
154209
155210 var sel = selectedClassElement . length
156211 && sce === level && selectedClassElement [ sce ] === elementName ? ++ sce : null ,
157212 el1 = div ( ) ,
158- el2 , el3 , el4 ;
213+ el2 , el3 , el4 , checkbox , span ,
214+ selectedNames = self . SELECTED_NAME ? self . SELECTED_NAME . split ( "," ) : [ ] ;
159215
160216 if ( isPackage ) {
161217 el1 . className = "tv-package" ;
162- ( el2 = div ( ) ) . className = "tv-package-name" + ( sel ? "" : " minimized" ) ;
218+ ( el2 = div ( ) ) . className = "tv-package-name" + (
219+ sel || inPath ( ( path ? path + "." : path ) + elementName , self . selectedClassList )
220+ ? ""
221+ : " minimized" ) ;
163222 el2 . textContent = elementName ;
164223 if ( sel && sce === selectedClassElement . length ) {
165224 el2 . className += " selected" ;
@@ -176,9 +235,27 @@ ClassTree.prototype.updateTree = function (treeObject, doNotChangeRoot) {
176235 } else {
177236 if ( sel ) self . SELECTED_ELEMENT = el1 ;
178237 el1 . className = "tv-class-name" + ( sel ? " selected" : "" ) ;
179- el1 . textContent = elementName ;
180- el1 . addEventListener ( "click" , classClick ) ;
181238 el1 . CLASS_NAME = path + ( path ? "." : "" ) + elementName ;
239+ checkbox = document . createElement ( "input" ) ;
240+ checkbox . setAttribute ( "type" , "checkbox" ) ;
241+ if ( selectedNames . indexOf ( el1 . CLASS_NAME ) !== - 1 )
242+ checkbox . setAttribute ( "checked" , "true" ) ;
243+ span = document . createElement ( "span" ) ;
244+ span . textContent = elementName ;
245+ span . setAttribute ( "title" , elementName ) ;
246+ el1 . appendChild ( checkbox ) ;
247+ el1 . appendChild ( span ) ;
248+ el1 . addEventListener ( "click" , ( function ( el , cbx , clsName ) {
249+ return function ( e ) {
250+ cbx [ "checked" ] = ! cbx [ "checked" ] ;
251+ checkboxClick ( e , cbx [ "checked" ] , clsName ) ;
252+ } ;
253+ } ) ( el1 , checkbox , el1 . CLASS_NAME ) ) ;
254+ checkbox . addEventListener ( "click" , ( function ( cb , name ) {
255+ return function ( e ) {
256+ checkboxClick ( e , cb [ "checked" ] , name ) ;
257+ } ;
258+ } ) ( checkbox , el1 . CLASS_NAME ) ) ;
182259 }
183260
184261 rootElement . appendChild ( el1 ) ;
0 commit comments