@@ -111,62 +111,53 @@ export class TabLayout extends Layout {
111111 }
112112
113113 /**
114- * Dispose of the resources held by the widget.
114+ * Create an iterator over the widgets in the layout.
115+ *
116+ * @returns A new iterator over the widgets in the layout.
115117 */
116- dispose ( ) : void {
117- this . _grid . destroy ( ) ;
118- super . dispose ( ) ;
118+ * [ Symbol . iterator ] ( ) : IterableIterator < Widget > {
119+ yield * this . _gridItems . values ( ) ;
119120 }
120121
121122 /**
122- * Init the gridstack layout
123+ * Helper to get access to underlying GridStack object
123124 */
124- init ( ) : void {
125- super . init ( ) ;
126- if ( this . parent ) {
127- this . parent . node . appendChild ( this . _gridHost ) ;
128- }
129- // fake window resize event to resize bqplot
130- window . dispatchEvent ( new Event ( 'resize' ) ) ;
125+ get grid ( ) : GridStack {
126+ return this . _grid ;
131127 }
132128
133129 /**
134- * Handle `update-request` messages sent to the widget .
130+ * Get the list of `GridStackItem` (Lumino widgets) .
135131 */
136- protected onUpdateRequest ( msg : Message ) : void {
137- const items = this . _grid ?. getGridItems ( ) ;
138- items ?. forEach ( item => {
139- this . _grid . removeWidget ( item , true , false ) ;
140- this . _grid . addWidget ( item ) ;
141- } ) ;
132+ get gridItems ( ) : Map < string , GridStackItem > {
133+ return this . _gridItems ;
142134 }
143135
144136 /**
145- * Handle `resize-request` messages sent to the widget .
137+ * Get the list of `GridItemHTMLElement` .
146138 */
147- protected onResize ( msg : Message ) : void {
148- // Using timeout to wait until the resize stop
149- // rerendering all the widgets every time uses
150- // too much resources
151- clearTimeout ( this . _resizeTimeout ) ;
152- this . _resizeTimeout = setTimeout ( this . _onResizeStops , 500 ) ;
153- this . _prepareGrid ( ) ;
139+ get gridElements ( ) : GridItemHTMLElement [ ] {
140+ return this . _grid . getGridItems ( ) ?? [ ] ;
154141 }
155142
156143 /**
157- * Handle `fit-request` messages sent to the widget.
144+ * Dispose of the resources held by the widget.
158145 */
159- protected onFitRequest ( msg : Message ) : void {
160- this . _prepareGrid ( ) ;
146+ dispose ( ) : void {
147+ this . _grid . destroy ( ) ;
148+ super . dispose ( ) ;
161149 }
162150
163151 /**
164- * Create an iterator over the widgets in the layout.
165- *
166- * @returns A new iterator over the widgets in the layout.
152+ * Init the gridstack layout
167153 */
168- * [ Symbol . iterator ] ( ) : IterableIterator < Widget > {
169- yield * this . _gridItems . values ( ) ;
154+ init ( ) : void {
155+ super . init ( ) ;
156+ if ( this . parent ) {
157+ this . parent . node . appendChild ( this . _gridHost ) ;
158+ }
159+ // fake window resize event to resize bqplot
160+ window . dispatchEvent ( new Event ( 'resize' ) ) ;
170161 }
171162
172163 /**
@@ -178,27 +169,6 @@ export class TabLayout extends Layout {
178169 return ;
179170 }
180171
181- /**
182- * Helper to get access to underlying GridStack object
183- */
184- get grid ( ) : GridStack {
185- return this . _grid ;
186- }
187-
188- /**
189- * Get the list of `GridStackItem` (Lumino widgets).
190- */
191- get gridItems ( ) : Map < string , GridStackItem > {
192- return this . _gridItems ;
193- }
194-
195- /**
196- * Get the list of `GridItemHTMLElement`.
197- */
198- get gridElements ( ) : GridItemHTMLElement [ ] {
199- return this . _grid . getGridItems ( ) ?? [ ] ;
200- }
201-
202172 /**
203173 * Add new cell to gridstack.
204174 *
@@ -273,11 +243,75 @@ export class TabLayout extends Layout {
273243 items ?. forEach ( item => this . _grid . removeWidget ( item , true , false ) ) ;
274244 }
275245
246+ /**
247+ * Unselect all items of the grid layout.
248+ */
249+ unselectGridItems ( ) : void {
250+ this . _grid . getGridItems ( ) . forEach ( i => i . classList . remove ( 'grid-selected' ) ) ;
251+ }
252+
253+ /**
254+ * Handle `update-request` messages sent to the widget.
255+ */
256+ protected onUpdateRequest ( msg : Message ) : void {
257+ const items = this . _grid ?. getGridItems ( ) ;
258+ items ?. forEach ( item => {
259+ this . _grid . removeWidget ( item , true , false ) ;
260+ this . _grid . addWidget ( item ) ;
261+ } ) ;
262+ }
263+
264+ /**
265+ * Handle `resize-request` messages sent to the widget.
266+ */
267+ protected onResize ( msg : Message ) : void {
268+ // Using timeout to wait until the resize stop
269+ // rerendering all the widgets every time uses
270+ // too much resources
271+ clearTimeout ( this . _resizeTimeout ) ;
272+ this . _resizeTimeout = setTimeout ( this . _onResizeStops , 500 ) ;
273+ this . _prepareGrid ( ) ;
274+ }
275+
276+ /**
277+ * Handle `fit-request` messages sent to the widget.
278+ */
279+ protected onFitRequest ( msg : Message ) : void {
280+ this . _prepareGrid ( ) ;
281+ }
282+
283+ /**
284+ * Handle `after-attach` messages sent to the widget.
285+ */
286+ protected onAfterAttach ( msg : Message ) : void {
287+ super . onAfterAttach ( msg ) ;
288+ this . _gridHost . addEventListener ( 'click' , this . _onClick . bind ( this ) ) ;
289+ }
290+
291+ /**
292+ * Handle `before-attach` messages sent to the widget.
293+ */
294+ protected onBeforeDetach ( msg : Message ) : void {
295+ this . _gridHost . removeEventListener ( 'click' , this . _onClick . bind ( this ) ) ;
296+
297+ super . onBeforeDetach ( msg ) ;
298+ }
299+
300+ /**
301+ * Handle click event to the widget.
302+ */
303+ private _onClick ( event : MouseEvent ) {
304+ if ( event . target === event . currentTarget ) {
305+ this . _commands . execute ( CommandIDs . closeControlPanel ) ;
306+ this . unselectGridItems ( ) ;
307+ }
308+ }
309+
276310 /**
277311 * Handle edit request of a grid item.
278312 */
279313 private _handleEdit ( item : GridStackItem ) : void {
280- this . _grid . getGridItems ( ) . forEach ( i => i . classList . remove ( 'grid-selected' ) ) ;
314+ this . unselectGridItems ( ) ;
281315 item . node . classList . add ( 'grid-selected' ) ;
282316 this . _commands . execute ( CommandIDs . openControlPanel , {
283317 cellId : item . cellIdentity ,
0 commit comments