Project

General

Profile

Bug #22349 » rtehtmlarea_bugfix_13956_trunk.patch

Administrator Admin, 2010-04-08 01:39

View differences:

typo3/sysext/rtehtmlarea/htmlarea/htmlarea.js (copie de travail)
* Initialize event listeners and the document after the iframe has rendered
*/
initEventListeners: function () {
// The editor iframe may become hidden with style.display = "none"
// This breaks the editor in Firefox: the designMode attribute needs to be reset after the style.display of the containing div is reset to "block"
if (Ext.isGecko && this.isNested) {
Ext.each(this.nestedParentElements.sorted, function (nested) {
this.mon(Ext.get(nested), 'DOMAttrModified', this.onNestedShow, this, {delay: 100});
}, this);
}
this.initStyleChangeEventListener();
if (Ext.isOpera) {
this.mon(this.getEl(), 'load', this.initializeIframe , this, {single: true});
} else {
......
}
},
/*
* The editor iframe may become hidden with style.display = "none" on some parent div
* This breaks the editor in Firefox: the designMode attribute needs to be reset after the style.display of the container div is reset to "block"
* In all browsers, it breaks the evaluation of the framework dimensions
*/
initStyleChangeEventListener: function () {
if (this.isNested && !Ext.isWebKit) {
Ext.each(this.nestedParentElements.sorted, function (nested) {
this.mon(
Ext.get(nested),
Ext.isIE ? 'propertychange' : 'DOMAttrModified',
this.onNestedShow,
this,
{
delay: 50,
single: true,
stopEvent: true,
target: Ext.get(nested)
}
);
}, this);
}
},
/*
* editorId should be set in config
*/
editorId: null,
......
*/
onNestedShow: function (event, target) {
var styleEvent = true;
// In older versions of Mozilla ev.attrName is not yet set and refering to it causes a non-catchable crash
// We are assuming that this was fixed in Firefox 2.0.0.11
if (navigator.productSub > 20071127) {
// In older versions of Gecko attrName is not set and refering to it causes a non-catchable crash
if ((Ext.isGecko && navigator.productSub > 20071127) || Ext.isOpera) {
styleEvent = (event.browserEvent.attrName == 'style');
} else if (Ext.isIE) {
styleEvent = (event.browserEvent.propertyName == 'style.display');
}
if (styleEvent && this.nestedParentElements.sorted.indexOf(target.id) != -1 && this.getEditor().getMode() === 'wysiwyg' && (target.style.display == '' || target.style.display == 'block')) {
// Check if all affected nested elements are displayed (style.display!='none'):
if (styleEvent && this.nestedParentElements.sorted.indexOf(target.id) != -1 && (target.style.display == '' || target.style.display == 'block')) {
// Check if all container nested elements are displayed
if (HTMLArea.util.TYPO3.allElementsAreDisplayed(this.nestedParentElements.sorted)) {
this.setDesignMode(true);
this.fireEvent('show');
this.getEditor().updateToolbar();
if (this.getEditor().getMode() === 'wysiwyg') {
if (Ext.isGecko) {
this.setDesignMode(true);
}
this.fireEvent('show');
} else {
this.ownerCt.textAreaContainer.fireEvent('show');
}
this.getToolbar().update();
}
}
event.stopEvent();
this.initStyleChangeEventListener();
},
/*
* Get the HTML content of the iframe
......
// Make the framework resizable, if configured by the user
this.makeResizable();
// Monitor textArea container becoming shown or hidden as it may change the height of the status bar
this.mon(this.textAreaContainer, 'show', this.onTextAreaShow, this);
if (this.resizable) {
// Monitor iframe becoming shown or hidden as it may change the height of the status bar
this.mon(this.iframe, 'show', this.onIframeShow, this);
}
this.mon(this.textAreaContainer, 'show', this.resizable ? this.onTextAreaShow : this.onWindowResize, this);
// Monitor iframe becoming shown or hidden as it may change the height of the status bar
this.mon(this.iframe, 'show', this.resizable ? this.onIframeShow : this.onWindowResize, this);
// Monitor window resizing
if (this.resizable || this.textAreaInitialSize.width.indexOf('%') !== -1) {
Ext.EventManager.onWindowResize(this.onWindowResize, this);
}
Ext.EventManager.onWindowResize(this.onWindowResize, this);
// If the textarea is inside a form, on reset, re-initialize the HTMLArea content and update the toolbar
var form = this.textArea.dom.form;
if (form) {
......
this.mon(Ext.get(form), 'reset', this.onReset, this);
}
this.addListener({
resize: {
fn: this.onFrameworkResize
},
beforedestroy: {
fn: this.onBeforeDestroy
}
......
height: 0
},
/*
* doLayout will fail if inside a hidden tab or inline element
*/
doLayout: function () {
if (!this.isNested || HTMLArea.util.TYPO3.allElementsAreDisplayed(this.nestedParentElements.sorted)) {
HTMLArea.Framework.superclass.doLayout.call(this);
} else {
// Clone the array of nested tabs and inline levels instead of using a reference as HTMLArea.util.TYPO3.accessParentElements will modify the array
var parentElements = [].concat(this.nestedParentElements.sorted);
// Walk through all nested tabs and inline levels to get correct sizes
HTMLArea.util.TYPO3.accessParentElements(parentElements, 'HTMLArea.Framework.superclass.doLayout.call(args[0])', [this]);
}
},
/*
* Make the framework resizable, if configured
*/
makeResizable: function () {
......
}
},
/*
* Resize the framework when the resizer handles are used
*/
onHtmlAreaResize: function (resizer, width, height, event) {
// Set width first as it may change the height of the toolbar and of the statusBar
this.setWidth(width);
// Set height of iframe and textarea
this.iframe.setHeight(this.getInnerHeight());
this.textArea.setSize(this.getInnerWidth(), this.getInnerHeight());
},
/*
* Size the iframe according to initial textarea size as set by Page and User TSConfig
*/
onWindowResize: function(width, height) {
onWindowResize: function (width, height) {
if (!this.isNested || HTMLArea.util.TYPO3.allElementsAreDisplayed(this.nestedParentElements.sorted)) {
this.resizeFramework(width, height);
} else {
......
* Resize the framework to its initial size
*/
resizeFramework: function (width, height) {
var frameworkHeight = this.fullScreen ? HTMLArea.util.TYPO3.getWindowSize().height - 20 : parseInt(this.textAreaInitialSize.height);
var frameworkHeight = parseInt(this.textAreaInitialSize.height);
if (this.textAreaInitialSize.width.indexOf('%') === -1) {
// Width is specified in pixels
var frameworkWidth = parseInt(this.textAreaInitialSize.width) - this.getFrameWidth();
} else {
// Width is specified in %
if (Ext.isDefined(width)) {
if (Ext.isNumber(width)) {
// Framework sizing on actual window resize
var frameworkWidth = parseInt(((width - this.textAreaInitialSize.nextSiblingWidth - (this.fullScreen ? 10 : Ext.getScrollBarWidth()) - this.getBox().x - 15) * parseInt(this.textAreaInitialSize.width))/100);
var frameworkWidth = parseInt(((width - this.textAreaInitialSize.wizardsWidth - (this.fullScreen ? 10 : Ext.getScrollBarWidth()) - this.getBox().x - 15) * parseInt(this.textAreaInitialSize.width))/100);
} else {
// Initial framework sizing
var frameworkWidth = parseInt(((HTMLArea.util.TYPO3.getWindowSize().width - this.textAreaInitialSize.nextSiblingWidth - (this.fullScreen ? 10 : Ext.getScrollBarWidth()) - this.getBox().x - 15) * parseInt(this.textAreaInitialSize.width))/100);
var frameworkWidth = parseInt(((HTMLArea.util.TYPO3.getWindowSize().width - this.textAreaInitialSize.wizardsWidth - (this.fullScreen ? 10 : Ext.getScrollBarWidth()) - this.getBox().x - 15) * parseInt(this.textAreaInitialSize.width))/100);
}
}
if (this.resizable) {
this.resizer.resizeTo(frameworkWidth, frameworkHeight);
} else {
this.setSize(frameworkWidth, frameworkHeight);
// Adjust height of iframe and textarea to height of toolbar and statusbar
this.iframe.setSize(this.getInnerWidth(), this.getInnerHeight());
this.textArea.setSize(this.getInnerWidth(), this.getInnerHeight());
}
},
/*
* Resize the components when the editor framework was resized
* Resize the framework components
*/
onHtmlAreaResize: function (resizer, width, height, event) {
// Set width first as it may change the height of the toolbar and of the statusBar
this.setWidth(width);
// Set height of iframe and textarea
this.iframe.setHeight(this.getInnerHeight());
onFrameworkResize: function () {
this.iframe.setSize(this.getInnerWidth(), this.getInnerHeight());
this.textArea.setSize(this.getInnerWidth(), this.getInnerHeight());
},
/*
......
* Adjust the height to the changing size of the statusbar when the iframe is shown
*/
onIframeShow: function () {
this.iframe.setHeight(this.getInnerHeight());
this.textArea.setHeight(this.getInnerHeight());
if (this.getInnerHeight() <= 0) {
this.onWindowResize();
} else {
this.iframe.setHeight(this.getInnerHeight());
this.textArea.setHeight(this.getInnerHeight());
}
},
/*
* Fire the editor when all components of the framework are rendered and ready
......
* Cleanup on framework destruction
*/
onBeforeDestroy: function () {
if (this.resizable) {
Ext.EventManager.removeResizeListener(this.onWindowResize, this);
}
Ext.EventManager.removeResizeListener(this.onWindowResize, this);
var form = this.textArea.dom.form;
if (form) {
form.htmlAreaPreviousOnReset = null;
......
this.textAreaInitialSize = {
width: this.config.RTEWidthOverride ? this.config.RTEWidthOverride : this.textArea.getStyle('width'),
height: this.config.fullScreen ? HTMLArea.util.TYPO3.getWindowSize().height - 20 : this.textArea.getStyle('height'),
nextSiblingWidth: 0
wizardsWidth: 0
};
// TYPO3 Inline elements and tabs
this.nestedParentElements = {
......
};
this.isNested = !Ext.isEmpty(this.nestedParentElements.sorted);
// Get width of wizards
var nextSibling = this.textArea.parent().parent().next();
if (nextSibling) {
this.wizards = this.textArea.parent().parent().next();
if (this.wizards) {
if (!this.isNested || HTMLArea.util.TYPO3.allElementsAreDisplayed(this.nestedParentElements.sorted)) {
this.textAreaInitialSize.nextSiblingWidth = nextSibling.getWidth();
this.textAreaInitialSize.wizardsWidth = this.wizards.getWidth();
} else {
// Clone the array of nested tabs and inline levels instead of using a reference as HTMLArea.util.TYPO3.accessParentElements will modify the array
var parentElements = [].concat(this.nestedParentElements.sorted);
// Walk through all nested tabs and inline levels to get correct size
this.textAreaInitialSize.nextSiblingWidth = HTMLArea.util.TYPO3.accessParentElements(parentElements, 'args[0].getWidth()', [nextSibling]);
this.textAreaInitialSize.wizardsWidth = HTMLArea.util.TYPO3.accessParentElements(parentElements, 'args[0].getWidth()', [this.wizards]);
}
}
// Hide the wizards so that they do not move around while the editor framework is being sized
this.wizards.hide();
// Plugins register
this.plugins = {};
// Register the plugins included in the configuration
......
this.generatePlugins();
// Make the editor visible
this.show();
// Make the wizards visible again
this.wizards.show();
// Focus on the first editor that is not hidden
Ext.iterate(RTEarea, function (editorId, RTE) {
if (!Ext.isDefined(RTE.editor) || (RTE.editor.isNested && !HTMLArea.util.TYPO3.allElementsAreDisplayed(RTE.editor.nestedParentElements.sorted))) {
......
var result = {};
if (parentElements.length) {
var currentElement = parentElements.pop();
var elementStyle = document.getElementById(currentElement).style;
var actionRequired = (elementStyle.display == 'none' ? true : false);
currentElement = Ext.get(currentElement);
var actionRequired = (currentElement.getStyle('display') == 'none');
if (actionRequired) {
var originalVisibility = elementStyle.visibility;
var originalPosition = elementStyle.position;
elementStyle.visibility = 'hidden';
elementStyle.position = 'absolute';
elementStyle.display = '';
var originalStyles = currentElement.getStyles('visibility', 'position', 'top', 'display');
currentElement.setStyle({
visibility: 'hidden',
position: 'absolute',
top: '-10000px',
display: ''
});
}
result = this.accessParentElements(parentElements, callbackFunc, args);
if (actionRequired) {
elementStyle.display = 'none';
elementStyle.position = originalPosition;
elementStyle.visibility = originalVisibility;
currentElement.setStyle(originalStyles);
}
} else {
result = eval(callbackFunc);
(2-2/2)