123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-grid-ColumnLayout'>/**
- </span> * @private
- *
- * This class is used only by the grid's HeaderContainer docked child.
- *
- * It adds the ability to shrink the vertical size of the inner container element back if a grouped
- * column header has all its child columns dragged out, and the whole HeaderContainer needs to shrink back down.
- *
- * Also, after every layout, after all headers have attained their 'stretchmax' height, it goes through and calls
- * `setPadding` on the columns so that they lay out correctly.
- */
- Ext.define('Ext.grid.ColumnLayout', {
- extend: 'Ext.layout.container.HBox',
- alias: 'layout.gridcolumn',
- type : 'gridcolumn',
- reserveOffset: false,
- firstHeaderCls: Ext.baseCSSPrefix + 'column-header-first',
- lastHeaderCls: Ext.baseCSSPrefix + 'column-header-last',
- initLayout: function() {
- this.grid = this.owner.up('[scrollerOwner]');
- this.callParent();
- },
- // Collect the height of the table of data upon layout begin
- beginLayout: function (ownerContext) {
- var me = this,
- grid = me.grid,
- view = grid.view,
- i = 0,
- items = me.getVisibleItems(),
- len = items.length,
- item;
- ownerContext.gridContext = ownerContext.context.getCmp(me.grid);
- // If we are one side of a locking grid, then if we are on the "normal" side, we have to grab the normal view
- // for use in determining whether to subtract scrollbar width from available width.
- // The locked side does not have scrollbars, so it should not look at the view.
- if (grid.lockable) {
- if (me.owner.up('tablepanel') === view.normalGrid) {
- view = view.normalGrid.getView();
- } else {
- view = null;
- }
- }
- me.callParent(arguments);
- // Unstretch child items before the layout which stretches them.
- for (; i < len; i++) {
- item = items[i];
- item.removeCls([me.firstHeaderCls, me.lastHeaderCls]);
- item.el.setStyle({
- height: 'auto'
- });
- item.titleEl.setStyle({
- height: 'auto',
- paddingTop: '' // reset back to default padding of the style
- });
- }
- // Add special first/last classes
- if (len > 0) {
- items[0].addCls(me.firstHeaderCls);
- items[len - 1].addCls(me.lastHeaderCls);
- }
- // If the owner is the grid's HeaderContainer, and the UI displays old fashioned scrollbars and there is a rendered View with data in it,
- // AND we are scrolling vertically:
- // collect the View context to interrogate it for overflow, and possibly invalidate it if there is overflow
- if (!me.owner.isHeader && Ext.getScrollbarSize().width && !grid.collapsed && view &&
- view.table.dom && (view.autoScroll || view.overflowY)) {
- ownerContext.viewContext = ownerContext.context.getCmp(view);
- }
- },
- roundFlex: function(width) {
- return Math.floor(width);
- },
- calculate: function(ownerContext) {
- var me = this,
- viewContext = ownerContext.viewContext,
- tableHeight,
- viewHeight;
- me.callParent(arguments);
- if (ownerContext.state.parallelDone) {
- ownerContext.setProp('columnWidthsDone', true);
- }
- // If we have a viewContext (Only created if there is an existing <table> within the view, AND we are scolling vertically AND scrollbars take up space)
- // we are not already in the second pass, and we are not shrinkWrapping...
- // Then we have to see if we know enough to determine whether there is vertical opverflow so that we can
- // invalidate and loop back for the second pass with a narrower target width.
- if (viewContext && !ownerContext.state.overflowAdjust.width && !ownerContext.gridContext.heightModel.shrinkWrap) {
- tableHeight = viewContext.tableContext.getProp('height');
- viewHeight = viewContext.getProp('height');
- // Heights of both view and its table content have not both been published; we cannot complete
- if (isNaN(tableHeight + viewHeight)) {
- me.done = false;
- }
- // Heights have been published, and there is vertical overflow; invalidate with a width adjustment to allow for the scrollbar
- else if (tableHeight >= viewHeight) {
- ownerContext.gridContext.invalidate({
- after: function() {
- ownerContext.state.overflowAdjust = {
- width: Ext.getScrollbarSize().width,
- height: 0
- };
- }
- });
- }
- }
- },
-
- completeLayout: function(ownerContext) {
- var me = this,
- owner = me.owner,
- state = ownerContext.state,
- needsInvalidate = false,
- calculated = me.sizeModels.calculated,
- childItems, len, i, childContext, item;
- me.callParent(arguments);
- // If we have not been through this already, and the owning Container is configured
- // forceFit, is not a group column and and there is a valid width, then convert
- // widths to flexes, and loop back.
- if (!state.flexesCalculated && owner.forceFit && !owner.isHeader) {
- childItems = ownerContext.childItems;
- len = childItems.length;
- for (i = 0; i < len; i++) {
- childContext = childItems[i];
- item = childContext.target;
- // For forceFit, just use allocated width as the flex value, and the proportions
- // will end up the same whatever HeaderContainer width they are being forced into.
- if (item.width) {
- item.flex = ownerContext.childItems[i].flex = item.width;
- delete item.width;
- childContext.widthModel = calculated;
- needsInvalidate = true;
- }
- }
- // Recalculate based upon all columns now being flexed instead of sized.
- // Set flag, so that we do not do this infinitely
- if (needsInvalidate) {
- me.cacheFlexes(ownerContext);
- ownerContext.invalidate({
- state: {
- flexesCalculated: true
- }
- });
- }
- }
- },
- finalizeLayout: function() {
- var me = this,
- i = 0,
- items,
- len,
- itemsHeight,
- owner = me.owner,
- titleEl = owner.titleEl;
- // Set up padding in items
- items = me.getVisibleItems();
- len = items.length;
- // header container's items take up the whole height
- itemsHeight = owner.el.getViewSize().height;
- if (titleEl) {
- // if owner is a grouped column with children, we need to subtract the titleEl's height
- // to determine the remaining available height for the child items
- itemsHeight -= titleEl.getHeight();
- }
- for (; i < len; i++) {
- items[i].setPadding(itemsHeight);
- }
- },
- // FIX: when flexing we actually don't have enough space as we would
- // typically because of the scrollOffset on the GridView, must reserve this
- publishInnerCtSize: function(ownerContext) {
- var me = this,
- size = ownerContext.state.boxPlan.targetSize,
- cw = ownerContext.peek('contentWidth'),
- view;
- // InnerCt MUST stretch to accommodate all columns so that left/right scrolling is enabled in the header container.
- if ((cw != null) && !me.owner.isHeader) {
- size.width = cw;
- // innerCt must also encompass any vertical scrollbar width if there may be one
- view = me.owner.ownerCt.view;
- if (view.autoScroll || view.overflowY) {
- size.width += Ext.getScrollbarSize().width;
- }
- }
- return me.callParent(arguments);
- }
- });
- </pre>
- </body>
- </html>
|