From 49e0b2ba9f50cfd0def3d1a55c2a56309c3875cf Mon Sep 17 00:00:00 2001 From: Ross Boucher Date: Tue, 16 Mar 2010 16:00:36 -0700 Subject: [PATCH] Fix for sizeWithFont: in Internet Explorer. --- AppKit/Platform/DOM/CPPlatformString.j | 106 +++++++++++++------------ AppKit/_CPImageAndTextView.j | 25 +++--- 2 files changed, 66 insertions(+), 65 deletions(-) diff --git a/AppKit/Platform/DOM/CPPlatformString.j b/AppKit/Platform/DOM/CPPlatformString.j index 96c1dccb2..592a3b332 100644 --- a/AppKit/Platform/DOM/CPPlatformString.j +++ b/AppKit/Platform/DOM/CPPlatformString.j @@ -22,9 +22,10 @@ #include "../CoreGraphics/CGGeometry.h" -var DOMSpanElement = nil, - DOMIFrameElement = nil, - DefaultFont = nil; +var DOMFixedWidthSpanElement = nil, + DOMFlexibleWidthSpanElement = nil, + DOMIFrameElement = nil, + DefaultFont = nil; @implementation CPPlatformString : CPBasePlatformString { @@ -37,25 +38,30 @@ var DOMSpanElement = nil, + (void)createDOMElements { + var style; + DOMIFrameElement = document.createElement("iframe"); // necessary for Safari caching bug: DOMIFrameElement.name = "iframe_" + FLOOR(RAND() * 10000); - DOMIFrameElement.style.position = "absolute"; - DOMIFrameElement.style.left = "-100px"; - DOMIFrameElement.style.top = "-100px"; - DOMIFrameElement.style.width = "1px"; - DOMIFrameElement.style.height = "1px"; - DOMIFrameElement.style.borderWidth = "0px"; - DOMIFrameElement.style.overflow = "hidden"; - DOMIFrameElement.style.zIndex = 100000000000; DOMIFrameElement.className = "cpdontremove"; + style = DOMIFrameElement.style; + style.position = "absolute"; + style.left = "-100px"; + style.top = "-100px"; + style.width = "1px"; + style.height = "1px"; + style.borderWidth = "0px"; + style.overflow = "hidden"; + style.zIndex = 100000000000; + var bodyElement = [CPPlatform mainBodyElement]; bodyElement.appendChild(DOMIFrameElement); var DOMIFrameDocument = (DOMIFrameElement.contentDocument || DOMIFrameElement.contentWindow.document); - DOMIFrameDocument.write(""); + DOMIFrameDocument.write(''+ + ''); DOMIFrameDocument.close(); // IE needs this wide
to prevent unwanted text wrapping: @@ -65,18 +71,39 @@ var DOMSpanElement = nil, DOMIFrameDocument.body.appendChild(DOMDivElement); - DOMSpanElement = DOMIFrameDocument.createElement("span"); - DOMSpanElement.style.position = "absolute"; - DOMSpanElement.style.visibility = "visible"; - DOMSpanElement.style.padding = "0px"; - DOMSpanElement.style.margin = "0px"; + DOMFlexibleWidthSpanElement = DOMIFrameDocument.createElement("span"); + style = DOMFlexibleWidthSpanElement.style; + style.position = "absolute"; + style.visibility = "visible"; + style.padding = "0px"; + style.margin = "0px"; + style.whiteSpace = "pre"; - try { - DOMSpanElement.style.whiteSpace = "pre"; + DOMFixedWidthSpanElement = DOMIFrameDocument.createElement("span"); + style = DOMFixedWidthSpanElement.style; + style.display = "block"; + style.position = "absolute"; + style.visibility = "visible"; + style.padding = "0px"; + style.margin = "0px"; + style.width = "1px"; + style.wordWrap = "break-word"; + try + { + style.whiteSpace = "pre"; + style.whiteSpace = "-o-pre-wrap"; + style.whiteSpace = "-pre-wrap"; + style.whiteSpace = "-moz-pre-wrap"; + style.whiteSpace = "pre-wrap"; + } + catch(e) + { + //some versions of IE throw exceptions for unsupported properties. + style.whiteSpace = "pre"; } - catch (e) {} - DOMDivElement.appendChild(DOMSpanElement); + DOMDivElement.appendChild(DOMFlexibleWidthSpanElement); + DOMDivElement.appendChild(DOMFixedWidthSpanElement); } + (CGSize)sizeOfString:(CPString)aString withFont:(CPFont)aFont forWidth:(float)aWidth @@ -92,44 +119,23 @@ var DOMSpanElement = nil, if (!DOMIFrameElement) [self createDOMElements]; - var style = DOMSpanElement.style; - + var span; if (!aWidth) - { - style.width = ""; - - try { - style.whiteSpace = "pre"; - } - catch (e) {} - - style.wordWrap = "normal"; - } + span = DOMFlexibleWidthSpanElement; else { - style.width = ROUND(aWidth) + "px"; - try - { - style.whiteSpace = "-o-pre-wrap"; - style.whiteSpace = "-pre-wrap"; - style.whiteSpace = "-moz-pre-wrap"; - style.whiteSpace = "pre-wrap"; - } catch(e) - { - //some versions of IE throw exceptions for unsupported properties. - } - - style.wordWrap = "break-word"; + span = DOMFixedWidthSpanElement; + span.style.width = ROUND(aWidth) + "px"; } - style.font = [aFont cssString]; + span.style.font = [aFont cssString]; if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature)) - DOMSpanElement.innerText = aString; + span.innerText = aString; else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature)) - DOMSpanElement.textContent = aString; + span.textContent = aString; - return _CGSizeMake(DOMSpanElement.clientWidth, DOMSpanElement.clientHeight); + return _CGSizeMake(span.clientWidth, span.clientHeight); } @end diff --git a/AppKit/_CPImageAndTextView.j b/AppKit/_CPImageAndTextView.j index c611c4c0a..e17e86de1 100644 --- a/AppKit/_CPImageAndTextView.j +++ b/AppKit/_CPImageAndTextView.j @@ -386,6 +386,7 @@ var HORIZONTAL_MARGIN = 3.0, shadowStyle.font = [_font ? _font : [CPFont systemFontOfSize:12.0] cssString]; shadowStyle.position = "absolute"; shadowStyle.whiteSpace = textStyle.whiteSpace; + shadowStyle.wordWrap = textStyle.wordWrap; shadowStyle.color = [_textShadowColor cssString]; shadowStyle.zIndex = 150; @@ -394,7 +395,6 @@ var HORIZONTAL_MARGIN = 3.0, if (document.attachEvent) { shadowStyle.overflow = textStyle.overflow; - shadowStyle.wordWrap = textStyle.wordWrap; } else { @@ -447,9 +447,7 @@ var HORIZONTAL_MARGIN = 3.0, case CPLineBreakByClipping: textStyle.overflow = "hidden"; textStyle.textOverflow = "clip"; textStyle.whiteSpace = "pre"; - - if (document.attachEvent) - textStyle.wordWrap = "normal"; + textStyle.wordWrap = "normal"; break; @@ -459,26 +457,23 @@ var HORIZONTAL_MARGIN = 3.0, case CPLineBreakByTruncatingTail: textStyle.textOverflow = "ellipsis"; textStyle.whiteSpace = "nowrap"; textStyle.overflow = "hidden"; - - if (document.attachEvent) - textStyle.wordWrap = "normal"; + textStyle.wordWrap = "normal"; break; case CPLineBreakByCharWrapping: - case CPLineBreakByWordWrapping: if (document.attachEvent) - { + case CPLineBreakByWordWrapping: textStyle.wordWrap = "break-word"; + try { textStyle.whiteSpace = "pre"; - textStyle.wordWrap = "break-word"; - } - - else - { textStyle.whiteSpace = "-o-pre-wrap"; textStyle.whiteSpace = "-pre-wrap"; textStyle.whiteSpace = "-moz-pre-wrap"; textStyle.whiteSpace = "pre-wrap"; } + catch (e) { + //internet explorer doesn't like these properties + textStyle.whiteSpace = "pre"; + } textStyle.overflow = "hidden"; textStyle.textOverflow = "clip"; @@ -490,7 +485,6 @@ var HORIZONTAL_MARGIN = 3.0, { if (document.attachEvent) { - shadowStyle.wordWrap = textStyle.wordWrap; shadowStyle.overflow = textStyle.overflow; } else @@ -499,6 +493,7 @@ var HORIZONTAL_MARGIN = 3.0, shadowStyle.overflowY = textStyle.overflowY; } + shadowStyle.wordWrap = textStyle.wordWrap; shadowStyle.whiteSpace = textStyle.whiteSpace; shadowStyle.textOverflow = textStyle.textOverflow; }