123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- <!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-layout-component-Button'>/**
- </span> * Component layout for buttons
- * @private
- */
- Ext.define('Ext.layout.component.Button', {
- /* Begin Definitions */
- alias: ['layout.button'],
- extend: 'Ext.layout.component.Auto',
- /* End Definitions */
- type: 'button',
- cellClsRE: /-btn-(tl|br)\b/,
- htmlRE: /<.*>/,
- constructor: function () {
- this.callParent(arguments);
- this.hackWidth = Ext.isIE && (!Ext.isStrict || Ext.isIE6 || Ext.isIE7 || Ext.isIE8);
- this.heightIncludesPadding = Ext.isIE6 && Ext.isStrict;
- },
- // TODO - use last run results if text has not changed?
- beginLayout: function (ownerContext) {
- this.callParent(arguments);
- this.cacheTargetInfo(ownerContext);
- },
- beginLayoutCycle: function(ownerContext) {
- var me = this,
- empty = '',
- owner = me.owner,
- btnEl = owner.btnEl,
- btnInnerEl = owner.btnInnerEl,
- text = owner.text,
- htmlAutoHeight;
- me.callParent(arguments);
- btnInnerEl.setStyle('overflow', empty);
- // Clear all element widths
- if (!ownerContext.widthModel.natural) {
- owner.el.setStyle('width', empty);
- }
- // If the text is HTML we need to let the browser automatically size things to cope with the case where the text
- // is multi-line. This incurs a cost as we then have to measure those elements to derive other sizes
- htmlAutoHeight = ownerContext.heightModel.shrinkWrap && text && me.htmlRE.test(text);
- btnEl.setStyle('width', empty);
- btnEl.setStyle('height', htmlAutoHeight ? 'auto' : empty);
- btnInnerEl.setStyle('width', empty);
- btnInnerEl.setStyle('height', htmlAutoHeight ? 'auto' : empty);
- btnInnerEl.setStyle('line-height', htmlAutoHeight ? 'normal' : empty);
- btnInnerEl.setStyle('padding-top', empty);
- owner.btnIconEl.setStyle('width', empty);
- },
- calculateOwnerHeightFromContentHeight: function (ownerContext, contentHeight) {
- return contentHeight;
- },
- calculateOwnerWidthFromContentWidth: function (ownerContext, contentWidth) {
- return contentWidth;
- },
- measureContentWidth: function (ownerContext) {
- var me = this,
- owner = me.owner,
- btnEl = owner.btnEl,
- btnInnerEl = owner.btnInnerEl,
- text = owner.text,
- btnFrameWidth, metrics, sizeIconEl, width, btnElContext, btnInnerElContext;
- // IE suffers from various sizing problems, usually caused by relying on it to size elements automatically. Even
- // if an element is sized correctly it can prove necessary to set that size explicitly on the element to get it
- // to size and position its children correctly. While the exact nature of the problems varies depending on the
- // browser version, doctype and button configuration there is a common solution: set the sizes manually.
- if (owner.text && me.hackWidth && btnEl) {
- btnFrameWidth = me.btnFrameWidth;
- // If the button text is something like '<' or '<<' then we need to escape it or it won't be measured
- // correctly. The button text is supposed to be HTML and strictly speaking '<' and '<<' aren't valid HTML.
- // However in practice they are commonly used and have worked 'correctly' in previous versions.
- if (text.indexOf('>') === -1) {
- text = text.replace(/</g, '&lt;');
- }
- metrics = Ext.util.TextMetrics.measure(btnInnerEl, text);
- width = metrics.width + btnFrameWidth + me.adjWidth;
- btnElContext = ownerContext.getEl('btnEl');
- btnInnerElContext = ownerContext.getEl('btnInnerEl');
- sizeIconEl = (owner.icon || owner.iconCls) &&
- (owner.iconAlign == "top" || owner.iconAlign == "bottom");
- // This cheat works (barely) with publishOwnerWidth which calls setProp also
- // to publish the width. Since it is the same value we set here, the dirty bit
- // we set true will not be cleared by publishOwnerWidth.
- ownerContext.setWidth(width); // not setWidth (no framing)
- btnElContext.setWidth(metrics.width + btnFrameWidth);
- btnInnerElContext.setWidth(metrics.width + btnFrameWidth);
- if (sizeIconEl) {
- owner.btnIconEl.setWidth(metrics.width + btnFrameWidth);
- }
- } else {
- width = ownerContext.el.getWidth();
- }
- return width;
- },
- measureContentHeight: function (ownerContext) {
- var me = this,
- owner = me.owner,
- btnInnerEl = owner.btnInnerEl,
- btnItem = ownerContext.getEl('btnEl'),
- btnInnerItem = ownerContext.getEl('btnInnerEl'),
- minTextHeight = me.minTextHeight,
- adjHeight = me.adjHeight,
- text = owner.getText(),
- height,
- textHeight,
- topPadding;
- if (owner.vertical) {
- height = Ext.util.TextMetrics.measure(btnInnerEl, owner.text).width;
- height += me.btnFrameHeight + adjHeight;
- // Vertical buttons need height explicitly set
- ownerContext.setHeight(height, /*dirty=*/true, /*force=*/true);
- }
- else {
- // If the button text is HTML we have to handle it specially as it could contain multiple lines
- if (text && me.htmlRE.test(text)) {
- textHeight = btnInnerEl.getHeight();
- // HTML content doesn't guarantee multiple lines: in the single line case it could now be too short for the icon
- if (textHeight < minTextHeight) {
- topPadding = Math.floor((minTextHeight - textHeight) / 2);
- // Resize the span and use padding to center the text vertically. The hack to remove the padding
- // from the height on IE6 is especially needed for link buttons
- btnInnerItem.setHeight(minTextHeight - (me.heightIncludesPadding ? topPadding : 0));
- btnInnerItem.setProp('padding-top', topPadding);
- textHeight = minTextHeight;
- }
- // Calculate the height relative to the text span, auto can't be trusted in IE quirks
- height = textHeight + adjHeight;
- }
- else {
- height = ownerContext.el.getHeight();
- }
- }
- // IE quirks needs the button height setting using style or it won't position the icon correctly (even if the height was already correct)
- btnItem.setHeight(height - adjHeight);
- return height;
- },
- publishInnerHeight: function(ownerContext, height) {
- var me = this,
- owner = me.owner,
- isNum = Ext.isNumber,
- btnItem = ownerContext.getEl('btnEl'),
- btnInnerEl = owner.btnInnerEl,
- btnInnerItem = ownerContext.getEl('btnInnerEl'),
- btnHeight = isNum(height) ? height - me.adjHeight : height,
- btnFrameHeight = me.btnFrameHeight,
- text = owner.getText(),
- textHeight,
- paddingTop;
- btnItem.setHeight(btnHeight);
- btnInnerItem.setHeight(btnHeight);
- // Only need the line-height setting for regular, horizontal Buttons
- if (!owner.vertical && btnHeight >= 0) {
- btnInnerItem.setProp('line-height', btnHeight - btnFrameHeight + 'px');
- }
- // Button text may contain markup that would force it to wrap to more than one line (e.g. 'Button<br>Label').
- // When this happens, we cannot use the line-height set above for vertical centering; we instead reset the
- // line-height to normal, measure the rendered text height, and add padding-top to center the text block
- // vertically within the button's height. This is more expensive than the basic line-height approach so
- // we only do it if the text contains markup.
- if (text && me.htmlRE.test(text)) {
- btnInnerItem.setProp('line-height', 'normal');
- btnInnerEl.setStyle('line-height', 'normal');
- textHeight = Ext.util.TextMetrics.measure(btnInnerEl, text).height;
- paddingTop = Math.floor(Math.max(btnHeight - btnFrameHeight - textHeight, 0) / 2);
- btnInnerItem.setProp('padding-top', me.btnFrameTop + paddingTop);
- btnInnerItem.setHeight(btnHeight - (me.heightIncludesPadding ? paddingTop : 0));
- }
- },
- publishInnerWidth: function(ownerContext, width) {
- var me = this,
- isNum = Ext.isNumber,
- btnItem = ownerContext.getEl('btnEl'),
- btnInnerItem = ownerContext.getEl('btnInnerEl'),
- btnWidth = isNum(width) ? width - me.adjWidth : width;
- btnItem.setWidth(btnWidth);
- btnInnerItem.setWidth(btnWidth);
- },
-
- clearTargetCache: function(){
- delete this.adjWidth;
- },
- cacheTargetInfo: function(ownerContext) {
- var me = this,
- owner = me.owner,
- scale = owner.scale,
- padding, frameSize, btnWrapPadding, btnInnerEl, innerFrameSize;
- // The cache is only valid for a particular scale
- if (!('adjWidth' in me) || me.lastScale !== scale) {
- // If there has been a previous layout run it could have sullied the line-height
- if (me.lastScale) {
- owner.btnInnerEl.setStyle('line-height', '');
- }
- me.lastScale = scale;
- padding = ownerContext.getPaddingInfo();
- frameSize = ownerContext.getFrameInfo();
- btnWrapPadding = ownerContext.getEl('btnWrap').getPaddingInfo();
- btnInnerEl = ownerContext.getEl('btnInnerEl');
- innerFrameSize = btnInnerEl.getPaddingInfo();
- Ext.apply(me, {
- // Width adjustment must take into account the arrow area. The btnWrap is the <em> which has padding to accommodate the arrow.
- adjWidth : btnWrapPadding.width + frameSize.width + padding.width,
- adjHeight : btnWrapPadding.height + frameSize.height + padding.height,
- btnFrameWidth : innerFrameSize.width,
- btnFrameHeight : innerFrameSize.height,
- btnFrameTop : innerFrameSize.top,
- // Use the line-height rather than height because if the text is multi-line then the height will be 'wrong'
- minTextHeight : parseInt(btnInnerEl.getStyle('line-height'), 10)
- });
- }
- me.callParent(arguments);
- },
-
- finishedLayout: function(){
- var owner = this.owner;
- this.callParent(arguments);
- // Fixes issue EXTJSIV-5989. Looks like a browser repaint bug
- // This hack can be removed once it is resolved.
- if (Ext.isWebKit) {
- owner.el.dom.offsetWidth;
- }
- }
- });
- </pre>
- </body>
- </html>
|