mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-21 15:55:02 +00:00
Fix for sizeWithFont: in Internet Explorer.
This commit is contained in:
1 parent
02462cdca6
commit
49e0b2ba9f
2 files changed
+66
-65
No files matched your search
@@ -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("<html><head></head><body></body></html>");
|
||||
DOMIFrameDocument.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+
|
||||
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head></head><body></body></html>');
|
||||
DOMIFrameDocument.close();
|
||||
|
||||
// IE needs this wide <div> 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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user