UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

954 lines (784 loc) 27.3 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Fabian Jakobs (fjakobs) ************************************************************************ */ qx.Class.define("qx.test.ui.virtual.Pane", { extend: qx.test.ui.LayoutTestCase, members: { setUp() { super.setUp(); this.defaultWidth = 30; this.defaultHeight = 10; this.rowCount = 1000; this.colCount = 200; var pane = new qx.ui.virtual.core.Pane( this.rowCount, this.colCount, this.defaultHeight, this.defaultWidth ); this.getRoot().add(pane); this.pane = pane; }, tearDown() { this.pane.destroy(); super.tearDown(); this.flush(); }, assertUpdateArgs(rowIndex, colIndex, rowSizes, colSizes, args, msg) { this.assertEquals(rowIndex, args[0], msg); this.assertEquals(colIndex, args[1], msg); this.assertArrayEquals(rowSizes, args[2], msg); this.assertArrayEquals(colSizes, args[3], msg); }, assertScrollArgs(rowIndex, colIndex, rowSizes, colSizes, args, msg) { this.assertEquals(rowIndex, args[0], msg); this.assertEquals(colIndex, args[1], msg); this.assertArrayEquals(rowSizes, args[2], msg); this.assertArrayEquals(colSizes, args[3], msg); }, assertScroll(scrollTop, scrollLeft, pane, msg) { var layerContainer = this.pane._getChildren()[0]; this.assertEquals(-scrollTop, layerContainer.getBounds().top, msg); this.assertEquals(-scrollLeft, layerContainer.getBounds().left, msg); }, testConstructor() { this.assertNotUndefined(this.pane); }, testScrollProperties() { this.flush(); this.pane.setScrollY(30); this.assertEquals(30, this.pane.getScrollY()); this.pane.setScrollX(40); this.assertEquals(40, this.pane.getScrollX()); }, testGetScrollSize() { var size = this.pane.getScrollSize(); this.assertEquals(this.defaultWidth * this.colCount, size.width); this.assertEquals(this.defaultHeight * this.rowCount, size.height); var rowConfig = this.pane.getRowConfig(); rowConfig.setDefaultItemSize(50); rowConfig.setItemCount(123); rowConfig.setItemSize(10, 30); this.assertEquals(50 * 123 - 20, this.pane.getScrollSize().height); }, testLayerAdd() { var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.assertEquals(layer, this.pane.getLayers()[0]); }, testUpdateEvent() { var called = 0; var pane = new qx.ui.virtual.core.Pane(100, 20, 10, 50); pane.addListener("update", () => { called++; }); pane.set({ width: 300, height: 200 }); // no update after creation this.getRoot().add(pane); this.assertEquals(0, called, "Expect no update after creation"); // one update after appear this.flush(); this.assertEquals(1, called, "Expect one update after appear"); // one update after pane resize called = 0; pane.setWidth(400); this.flush(); this.assertEquals(1, called, "Expect one update after pane resize"); // one update after data resize called = 0; pane.getRowConfig().setItemCount(200); this.flush(); this.assertEquals(1, called, "Expect one update after data resize"); // one update after data and pane resize called = 0; pane.getRowConfig().setItemCount(300); pane.setWidth(500); this.flush(); this.assertEquals( 2, called, "Expect two updates after data and pane resize" ); pane.destroy(); }, testFullUpdate() { var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: 100, height: 50 }); this.flush(); layer.calls = []; this.pane.fullUpdate(); this.flush(); this.assertEquals(2, layer.calls.length); this.assertEquals("fullUpdate", layer.calls[0][0]); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 0, [10, 10, 10, 10, 10], [30, 30, 30, 30], args); this.assertScroll(0, 0, this.pane); this.pane.setScrollY(4); layer.calls = []; this.pane.fullUpdate(); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs( 0, 0, [10, 10, 10, 10, 10, 10], [30, 30, 30, 30], args ); this.assertScroll(4, 0, this.pane); this.pane.setScrollY(10); layer.calls = []; this.pane.fullUpdate(); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(1, 0, [10, 10, 10, 10, 10], [30, 30, 30, 30], args); this.assertScroll(0, 0, this.pane); this.pane.setScrollY(16); layer.calls = []; this.pane.fullUpdate(); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs( 1, 0, [10, 10, 10, 10, 10, 10], [30, 30, 30, 30], args ); this.assertScroll(6, 0, this.pane); this.pane.setScrollY(0); this.flush(); this.pane.setScrollX(4); layer.calls = []; this.pane.fullUpdate(); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 0, [10, 10, 10, 10, 10], [30, 30, 30, 30], args); this.assertScroll(0, 4, this.pane); this.pane.setScrollX(30); layer.calls = []; this.pane.fullUpdate(); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 1, [10, 10, 10, 10, 10], [30, 30, 30, 30], args); this.assertScroll(0, 0, this.pane); this.pane.setScrollX(36); layer.calls = []; this.pane.fullUpdate(); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 1, [10, 10, 10, 10, 10], [30, 30, 30, 30], args); this.assertScroll(0, 6, this.pane); }, testNoRows() { var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); layer.calls = []; this.pane.setWidth(100); this.pane.getColumnConfig().setDefaultItemSize(100); this.pane.getColumnConfig().setItemCount(1); this.pane.getRowConfig().setItemCount(0); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 0, [], [100], args); this.assertScroll(0, 0, this.pane); // resize layer.calls = []; this.pane.setWidth(30); this.pane.getColumnConfig().setDefaultItemSize(30); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 0, [], [30], args); this.assertScroll(0, 0, this.pane); }, testNoColumns() { var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); layer.calls = []; this.pane.setHeight(100); this.pane.getRowConfig().setDefaultItemSize(100); this.pane.getRowConfig().setItemCount(1); this.pane.getColumnConfig().setItemCount(0); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 0, [100], [], args); this.assertScroll(0, 0, this.pane); // resize layer.calls = []; this.pane.setHeight(30); this.pane.getRowConfig().setDefaultItemSize(30); this.flush(); var args = layer.calls[0][1]; this.assertUpdateArgs(0, 0, [30], [], args); this.assertScroll(0, 0, this.pane); }, testPrefetchYAtTop() { var layerHeight = 400; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: 300, height: layerHeight }); this.flush(); // scroll top is 0 and prefetch above this.pane.prefetchY(100, 200, 0, 0); this.flush(); this.assertEquals(layerHeight, layer.getBounds().height); this.assertScroll(0, 0, this.pane); }, testPrefetchYLimitedAtTop() { var layerHeight = 400; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: 300, height: layerHeight }); this.flush(); // scroll top is 100 and prefetch above 200 this.pane.setScrollY(100); this.pane.prefetchY(100, 200, 0, 0); this.flush(); this.assertEquals(layerHeight + 100, layer.getBounds().height); this.assertScroll(100, 0, this.pane); }, testPrefetchYAtBottom() { var layerHeight = 400; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: 300, height: layerHeight }); this.flush(); // scroll top to bottom and prefetch below 200 this.pane.setScrollY(this.pane.getScrollMaxY()); this.pane.prefetchY(0, 0, 100, 200); this.flush(); this.assertEquals(layerHeight, layer.getBounds().height); this.assertScroll(0, 0, this.pane); }, testPrefetchYLimitedAtBottom() { var layerHeight = 400; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: 300, height: layerHeight }); this.flush(); // scroll top to bottom and prefetch below 200 this.pane.setScrollY(this.pane.getScrollMaxY() - 100); this.pane.prefetchY(0, 0, 100, 200); this.flush(); this.assertEquals(layerHeight + 100, layer.getBounds().height); this.assertScroll(0, 0, this.pane); }, testPrefetchYInMiddle() { var layerHeight = 400; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: 300, height: layerHeight }); this.flush(); // scroll top is 500 and prefetch above 200 this.pane.setScrollY(500); this.pane.prefetchY(100, 200, 100, 200); this.flush(); this.assertEquals(layerHeight + 400, layer.getBounds().height); this.assertScroll(200, 0, this.pane); // already prefetched 200 pixel above. Scrolling up 20px and prefetching // again should not change the layers this.pane.setScrollY(480); this.pane.prefetchY(100, 200, 100, 200); this.flush(); this.assertEquals(layerHeight + 400, layer.getBounds().height); this.assertScroll(180, 0, this.pane); // scroll more than minAbove up. Prefetching should update the layers this.pane.setScrollY(390); this.pane.prefetchY(100, 200, 100, 200); this.flush(); this.assertEquals(layerHeight + 400, layer.getBounds().height); this.assertScroll(200, 0, this.pane); // already prefetched 200 pixel below. Scrolling down 20px and prefetching // again should not change the layers this.pane.setScrollY(410); this.pane.prefetchY(100, 200, 100, 200); this.flush(); this.assertEquals(layerHeight + 400, layer.getBounds().height); this.assertScroll(220, 0, this.pane); // scroll more than minBelow down. Prefetching should update the layers this.pane.setScrollY(520); this.pane.prefetchY(100, 200, 100, 200); this.flush(); this.assertEquals(layerHeight + 400, layer.getBounds().height); this.assertScroll(200, 0, this.pane); }, testPrefetchXAtLeft() { var layerWidth = 300; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: layerWidth, height: 400 }); this.flush(); // scroll left is 0 and prefetch left this.pane.prefetchX(100, 200, 0, 0); this.flush(); this.assertEquals(layerWidth, layer.getBounds().width); this.assertScroll(0, 0, this.pane); }, testPrefetchXLimitedAtLeft() { var layerWidth = 300; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.getColumnConfig().setDefaultItemSize(10); this.pane.set({ width: layerWidth, height: 400 }); this.flush(); // scroll top is 100 and prefetch above 200 this.pane.setScrollX(100); this.pane.prefetchX(100, 200, 0, 0); this.flush(); this.assertEquals(layerWidth + 100, layer.getBounds().width); this.assertScroll(0, 100, this.pane); }, testPrefetchXAtBottom() { var layerWidth = 300; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.getColumnConfig().setDefaultItemSize(10); this.pane.set({ width: layerWidth, height: 400 }); this.flush(); // scroll left to right and prefetch right 200 this.pane.setScrollX(this.pane.getScrollMaxX()); this.pane.prefetchX(0, 0, 100, 200); this.flush(); this.assertEquals(layerWidth, layer.getBounds().width); this.assertScroll(0, 0, this.pane); }, testPrefetchXLimitedAtBottom() { var layerWidth = 300; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.getColumnConfig().setDefaultItemSize(10); this.pane.set({ width: layerWidth, height: 400 }); this.flush(); // scroll left to right-100 and prefetch right 200 this.pane.setScrollX(this.pane.getScrollMaxX() - 100); this.pane.prefetchX(0, 0, 100, 200); this.flush(); this.assertEquals(layerWidth + 100, layer.getBounds().width); this.assertScroll(0, 0, this.pane); }, testPrefetchXInMiddle() { var layerWidth = 300; var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: layerWidth, height: 400 }); this.pane.getColumnConfig().setDefaultItemSize(10); this.flush(); // scroll left is 500 and prefetch left 200 this.pane.setScrollX(500); this.pane.prefetchX(100, 200, 100, 200); this.flush(); this.assertEquals(layerWidth + 400, layer.getBounds().width); this.assertScroll(0, 200, this.pane); // already prefetched 200 pixel at the left. Scrolling left 20px and prefetching // again should not change the layers this.pane.setScrollX(480); this.pane.prefetchX(100, 200, 100, 200); this.flush(); this.assertEquals(layerWidth + 400, layer.getBounds().width); this.assertScroll(0, 180, this.pane); // scroll more than minLeft left. Prefetching should update the layers this.pane.setScrollX(390); this.pane.prefetchX(100, 200, 100, 200); this.flush(); this.assertEquals(layerWidth + 400, layer.getBounds().width); this.assertScroll(0, 200, this.pane); // already prefetched 200 pixel right. Scrolling right 20px and prefetching // again should not change the layers this.pane.setScrollX(410); this.pane.prefetchX(100, 200, 100, 200); this.flush(); this.assertEquals(layerWidth + 400, layer.getBounds().width); this.assertScroll(0, 220, this.pane); // scroll more than minRight right. Prefetching should update the layers this.pane.setScrollX(520); this.pane.prefetchX(100, 200, 100, 200); this.flush(); this.assertEquals(layerWidth + 400, layer.getBounds().width); this.assertScroll(0, 200, this.pane); }, testUpdateLayerWindow() { var layer = new qx.test.ui.virtual.layer.LayerMock(); this.pane.addLayer(layer); this.pane.set({ width: 100, height: 50 }); this.flush(); layer.calls = []; this.pane.setScrollY(4); this.flush(); this.assertEquals("updateLayerWindow", layer.calls[0][0]); var args = layer.calls[0][1]; this.assertScrollArgs( 0, 0, [10, 10, 10, 10, 10, 10], [30, 30, 30, 30], args ); this.assertScroll(4, 0, this.pane); layer.calls = []; this.pane.setScrollY(5); this.flush(); this.assertEquals(0, layer.calls.length); this.assertScroll(5, 0, this.pane); layer.calls = []; this.pane.setScrollY(10); this.flush(); this.assertEquals(0, layer.calls.length); this.assertScroll(10, 0, this.pane); layer.calls = []; this.pane.setScrollY(16); this.flush(); this.assertEquals("updateLayerWindow", layer.calls[0][0]); var args = layer.calls[0][1]; this.assertScrollArgs( 1, 0, [10, 10, 10, 10, 10, 10], [30, 30, 30, 30], args ); this.assertScroll(6, 0, this.pane); this.pane.setScrollY(0); this.flush(); layer.calls = []; this.pane.setScrollX(4); this.flush(); this.assertEquals(0, layer.calls.length); this.assertScroll(0, 4, this.pane); layer.calls = []; this.pane.setScrollX(30); this.flush(); this.assertEquals("updateLayerWindow", layer.calls[0][0]); var args = layer.calls[0][1]; this.assertScrollArgs(0, 1, [10, 10, 10, 10, 10], [30, 30, 30, 30], args); this.assertScroll(0, 0, this.pane); layer.calls = []; this.pane.setScrollX(36); this.flush(); this.assertEquals(0, layer.calls.length); this.assertScroll(0, 6, this.pane); }, testSrollRowIntoView() { this.pane.set({ width: 400, height: 305 }); this.pane.getColumnConfig().setItemCount(1); var layer = new qx.test.ui.virtual.layer.LayerSimple(); this.pane.addLayer(layer); this.flush(); this.pane.scrollRowIntoView(100); this.flush(); var children = layer.getContentElement().getDomElement().childNodes; this.assertScroll(5, 0, this.pane); this.assertEquals("70 / 0", children[0].innerHTML); this.assertEquals("100 / 0", children[children.length - 1].innerHTML); }, testSrollColumnIntoView() { this.pane.set({ width: 405, height: 305 }); this.pane.getRowConfig().setItemCount(1); var layer = new qx.test.ui.virtual.layer.LayerSimple(); this.pane.addLayer(layer); this.flush(); this.pane.scrollColumnIntoView(100); this.flush(); var children = layer.getContentElement().getDomElement().childNodes; this.assertScroll(0, 15, this.pane); this.assertEquals("0 / 87", children[0].innerHTML); this.assertEquals("0 / 100", children[children.length - 1].innerHTML); }, _testSrollRowIntoViewEdgeCase() { this.pane.set({ width: 400, height: 305 }); this.pane.getColumnConfig().setItemCount(1); var layer = new qx.test.ui.virtual.layer.LayerSimple(); this.pane.addLayer(layer); this.flush(); this.pane.scrollRowIntoView(2000); this.flush(); var children = layer.getContentElement().getDomElement().childNodes; this.assertScroll(5, 0, this.pane); this.assertEquals("0 / 969", children[0].innerHTML); this.assertEquals("0 / 999", children[children.length - 1].innerHTML); }, _testSrollColumnIntoViewEdgeCase() { this.pane.set({ width: 405, height: 305 }); this.pane.getRowConfig().setItemCount(1); var layer = new qx.test.ui.virtual.layer.LayerSimple(); this.pane.addLayer(layer); this.flush(); this.pane.scrollColumnIntoView(400); this.flush(); var children = layer.getContentElement().getDomElement().childNodes; this.assertScroll(0, 15, this.pane); this.assertEquals("186 / 0", children[0].innerHTML); this.assertEquals("199 / 0", children[children.length - 1].innerHTML); }, testGetCellAtPosition() { this.pane.getRowConfig().setItemCount(3); this.pane.getColumnConfig().setItemCount(3); var layer = new qx.test.ui.virtual.layer.LayerSimple(); this.pane.addLayer(layer); this.flush(); this.assertJsonEquals( { row: 0, column: 0 }, this.pane.getCellAtPosition(0, 0) ); this.assertEquals(null, this.pane.getCellAtPosition(400, 0)); this.assertEquals(null, this.pane.getCellAtPosition(0, 300)); this.assertEquals(null, this.pane.getCellAtPosition(400, 300)); this.assertJsonEquals( { row: 2, column: 2 }, this.pane.getCellAtPosition(89, 29) ); }, testGetItemAtPositionEmptySpace() { var pane = this.pane; pane.setHeight(100); pane.setWidth(50); this.pane.getRowConfig().setItemCount(1); this.pane.getRowConfig().setDefaultItemSize(50); this.flush(); this.assertJsonEquals( { row: 0, column: 0 }, this.pane.getCellAtPosition(1, 49) ); this.assertEquals(null, this.pane.getCellAtPosition(1, 50)); this.assertEquals(null, this.pane.getCellAtPosition(1, 70)); }, testMouseCellEvents() { var rowCount = 2; var colCount = 2; var defaultHeight = 10; var defaultWidth = 50; var pane = new qx.ui.virtual.core.Pane( rowCount, colCount, defaultHeight, defaultWidth ).set({ width: 150, height: 30 }); this.getRoot().add(pane, { left: 100, top: 100 }); this.flush(); var calls = []; var listener = function (e) { calls.push(e); }; pane.addListener("cellTap", listener); pane.addListener("cellDbltap", listener); pane.addListener("cellContextmenu", listener); var PointerEventMock = qx.test.ui.virtual.PointerEventMock; var eventPointerToCellEvents = { tap: "cellTap", dbltap: "cellDbltap", contextmenu: "cellContextmenu" }; for (var pointerEvent in eventPointerToCellEvents) { var cellEvent = eventPointerToCellEvents[pointerEvent]; calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 99, documentTop: 99 }) ); pane.dispatchEvent( new PointerEventMock(pointerEvent, { documentLeft: 99, documentTop: 99 }) ); this.assertEquals(0, calls.length); calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 100, documentTop: 100 }) ); pane.dispatchEvent( new PointerEventMock(pointerEvent, { documentLeft: 100, documentTop: 100 }) ); this.assertEquals(1, calls.length, cellEvent); this.assertEquals(0, calls[0].getRow(), cellEvent); this.assertEquals(0, calls[0].getColumn(), cellEvent); this.assertEquals(cellEvent, calls[0].getType(), cellEvent); calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 160, documentTop: 103 }) ); pane.dispatchEvent( new PointerEventMock(pointerEvent, { documentLeft: 160, documentTop: 103 }) ); this.assertEquals(1, calls.length, cellEvent); this.assertEquals(0, calls[0].getRow(), cellEvent); this.assertEquals(1, calls[0].getColumn(), cellEvent); this.assertEquals(cellEvent, calls[0].getType(), cellEvent); calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 105, documentTop: 110 }) ); pane.dispatchEvent( new PointerEventMock(pointerEvent, { documentLeft: 105, documentTop: 110 }) ); this.assertEquals(1, calls.length, cellEvent); this.assertEquals(1, calls[0].getRow(), cellEvent); this.assertEquals(0, calls[0].getColumn(), cellEvent); this.assertEquals(cellEvent, calls[0].getType(), cellEvent); calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 105, documentTop: 125 }) ); pane.dispatchEvent( new PointerEventMock(pointerEvent, { documentLeft: 105, documentTop: 125 }) ); this.assertEquals(0, calls.length); calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 275, documentTop: 105 }) ); pane.dispatchEvent( new PointerEventMock(pointerEvent, { documentLeft: 275, documentTop: 105 }) ); this.assertEquals(0, calls.length); calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 275, documentTop: 105 }) ); pane.dispatchEvent( new PointerEventMock(pointerEvent, { documentLeft: 275, documentTop: 105 }) ); this.assertEquals(0, calls.length); } pane.destroy(); this.flush(); }, "test mouse click bug #6695"() { var rowCount = 2; var colCount = 2; var defaultHeight = 10; var defaultWidth = 50; var pane = new qx.ui.virtual.core.Pane( rowCount, colCount, defaultHeight, defaultWidth ).set({ width: 150, height: 30 }); this.getRoot().add(pane, { left: 100, top: 100 }); this.flush(); var calls = []; var listener = function (e) { calls.push(e); }; pane.addListener("cellTap", listener); var PointerEventMock = qx.test.ui.virtual.PointerEventMock; calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 100, documentTop: 100 }) ); pane.dispatchEvent( new PointerEventMock("tap", { documentLeft: 100, documentTop: 100 }) ); this.assertEquals(1, calls.length); this.assertEquals(0, calls[0].getRow()); this.assertEquals(0, calls[0].getColumn()); this.assertEquals("cellTap", calls[0].getType()); calls = []; pane.dispatchEvent( new PointerEventMock("pointerdown", { documentLeft: 100, documentTop: 100 }) ); pane.dispatchEvent( new PointerEventMock("tap", { documentLeft: 160, documentTop: 103 }) ); this.assertEquals(0, calls.length); pane.destroy(); this.flush(); }, testDestroy() { this.pane.destroy(); this.flush(); this.assertDestroy(function () { var pane = new qx.ui.virtual.core.Pane( this.rowCount, this.colCount, this.defaultHeight, this.defaultWidth ); this.getRoot().add(pane); pane.destroy(); }, this); } }, destruct() { this.pane = null; } });