Форк Rambox
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
4.9 KiB

/**
* Component layout for grid column headers which have a title element at the top followed by content.
* @private
*/
Ext.define('Ext.grid.ColumnComponentLayout', {
extend: 'Ext.layout.component.Auto',
alias: 'layout.columncomponent',
type: 'columncomponent',
setWidthInDom: true,
_paddingReset: {
paddingTop: '', // reset back to default padding of the style
paddingBottom: ''
},
columnAutoCls: Ext.baseCSSPrefix + 'column-header-text-container-auto',
beginLayout: function(ownerContext) {
this.callParent(arguments);
ownerContext.titleContext = ownerContext.getEl('titleEl');
},
beginLayoutCycle: function(ownerContext) {
var me = this,
owner = me.owner,
shrinkWrap = ownerContext.widthModel.shrinkWrap;
me.callParent(arguments);
// If shrinkwrapping, allow content width to stretch the element
if (shrinkWrap) {
owner.el.setWidth('');
}
owner.textContainerEl[shrinkWrap ? 'addCls' : 'removeCls'](me.columnAutoCls);
owner.titleEl.setStyle(me._paddingReset);
},
// If not shrink wrapping, push height info down into child items
publishInnerHeight: function(ownerContext, outerHeight) {
var me = this,
owner = me.owner,
innerHeight;
// TreePanels (and grids with hideHeaders: true) set their column container height to zero to hide them.
// This is because they need to lay out in order to calculate widths for the columns (eg flexes).
// If there is no height to lay out, bail out early.
if (owner.getRootHeaderCt().hiddenHeaders) {
ownerContext.setProp('innerHeight', 0);
return;
}
// If this ia a group header; that is, it contains subheaders...
// hasRawContent = !(target.isContainer && target.items.items.length > 0)
if (!ownerContext.hasRawContent) {
// We do not have enough information to get the height of the titleEl
if (owner.headerWrap && !ownerContext.hasDomProp('width')) {
me.done = false;
return;
}
innerHeight = outerHeight - ownerContext.getBorderInfo().height;
ownerContext.setProp('innerHeight', innerHeight - owner.titleEl.getHeight(), false);
}
},
// We do not need the Direct2D sub pixel measurement here. Just the offsetHeight will do.
// TODO: When https://sencha.jira.com/browse/EXTJSIV-7734 is fixed to not do subpixel adjustment on height,
// remove this override.
measureContentHeight: function(ownerContext) {
return ownerContext.el.dom.offsetHeight;
},
// If not shrink wrapping, push width info down into child items
publishInnerWidth: function(ownerContext, outerWidth) {
// If we are acting as a container, publish the innerWidth for the ColumnLayout to use
if (!ownerContext.hasRawContent) {
ownerContext.setProp('innerWidth', outerWidth - ownerContext.getBorderInfo().width, false);
}
},
// Push content height outwards when we are shrinkwrapping
calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
var result = this.callParent(arguments),
owner = this.owner;
// If we are NOT a group header, we just use the auto component's measurement
if (!ownerContext.hasRawContent) {
if (!owner.headerWrap || ownerContext.hasDomProp('width')) {
return contentHeight + owner.titleEl.getHeight() + ownerContext.getBorderInfo().height;
}
// We do not have the information to return the height yet because we cannot know
// the final height of the text el
return null;
}
return result;
},
// Push content width outwards when we are shrinkwrapping
calculateOwnerWidthFromContentWidth: function (ownerContext, contentWidth) {
var owner = this.owner,
padWidth = ownerContext.getPaddingInfo().width,
triggerOffset = this.getTriggerOffset(owner, ownerContext),
inner;
// Only measure the content if we're not grouped, otherwise
// the size should be governed by the children
if (owner.isGroupHeader) {
inner = contentWidth;
} else {
inner = Math.max(contentWidth, owner.textEl.getWidth() + ownerContext.titleContext.getPaddingInfo().width);
}
return inner + padWidth + triggerOffset;
},
getTriggerOffset: function(owner, ownerContext) {
var width = 0;
if (ownerContext.widthModel.shrinkWrap && !owner.menuDisabled) {
// If we have any children underneath, then we already have space reserved
if (owner.query('>:not([hidden])').length === 0) {
width = owner.getTriggerElWidth();
}
}
return width;
}
});