00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "../CoreGraphics/CGGeometry.h"
00024
00025 var DOMFixedWidthSpanElement = nil,
00026 DOMFlexibleWidthSpanElement = nil,
00027 DOMIFrameElement = nil,
00028 DefaultFont = nil;
00029
00030 @implementation CPPlatformString : CPBasePlatformString
00031 {
00032 }
00033
00034 + (void)bootstrap
00035 {
00036 [self createDOMElements];
00037 }
00038
00039 + (void)createDOMElements
00040 {
00041 var style;
00042
00043 DOMIFrameElement = document.createElement("iframe");
00044
00045 DOMIFrameElement.name = "iframe_" + FLOOR(RAND() * 10000);
00046 DOMIFrameElement.className = "cpdontremove";
00047
00048 style = DOMIFrameElement.style;
00049 style.position = "absolute";
00050 style.left = "-100px";
00051 style.top = "-100px";
00052 style.width = "1px";
00053 style.height = "1px";
00054 style.borderWidth = "0px";
00055 style.overflow = "hidden";
00056 style.zIndex = 100000000000;
00057
00058 var bodyElement = [CPPlatform mainBodyElement];
00059
00060 bodyElement.appendChild(DOMIFrameElement);
00061
00062 var DOMIFrameDocument = (DOMIFrameElement.contentDocument || DOMIFrameElement.contentWindow.document);
00063 DOMIFrameDocument.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'+
00064 '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head></head><body></body></html>');
00065 DOMIFrameDocument.close();
00066
00067
00068 var DOMDivElement = DOMIFrameDocument.createElement("div");
00069 DOMDivElement.style.position = "absolute";
00070 DOMDivElement.style.width = "100000px";
00071
00072 DOMIFrameDocument.body.appendChild(DOMDivElement);
00073
00074 DOMFlexibleWidthSpanElement = DOMIFrameDocument.createElement("span");
00075 style = DOMFlexibleWidthSpanElement.style;
00076 style.position = "absolute";
00077 style.visibility = "visible";
00078 style.padding = "0px";
00079 style.margin = "0px";
00080 style.whiteSpace = "pre";
00081
00082 DOMFixedWidthSpanElement = DOMIFrameDocument.createElement("span");
00083 style = DOMFixedWidthSpanElement.style;
00084 style.display = "block";
00085 style.position = "absolute";
00086 style.visibility = "visible";
00087 style.padding = "0px";
00088 style.margin = "0px";
00089 style.width = "1px";
00090 style.wordWrap = "break-word";
00091 try
00092 {
00093 style.whiteSpace = "pre";
00094 style.whiteSpace = "-o-pre-wrap";
00095 style.whiteSpace = "-pre-wrap";
00096 style.whiteSpace = "-moz-pre-wrap";
00097 style.whiteSpace = "pre-wrap";
00098 }
00099 catch(e)
00100 {
00101
00102 style.whiteSpace = "pre";
00103 }
00104
00105 DOMDivElement.appendChild(DOMFlexibleWidthSpanElement);
00106 DOMDivElement.appendChild(DOMFixedWidthSpanElement);
00107 }
00108
00109 + (CGSize)sizeOfString:(CPString)aString withFont:(CPFont)aFont forWidth:(float)aWidth
00110 {
00111 if (!aFont)
00112 {
00113 if (!DefaultFont)
00114 DefaultFont = [CPFont systemFontOfSize:12.0];
00115
00116 aFont = DefaultFont;
00117 }
00118
00119 if (!DOMIFrameElement)
00120 [self createDOMElements];
00121
00122 var span;
00123 if (!aWidth)
00124 span = DOMFlexibleWidthSpanElement;
00125 else
00126 {
00127 span = DOMFixedWidthSpanElement;
00128 span.style.width = ROUND(aWidth) + "px";
00129 }
00130
00131 span.style.font = [aFont cssString];
00132
00133 if (CPFeatureIsCompatible(CPJavascriptInnerTextFeature))
00134 span.innerText = aString;
00135 else if (CPFeatureIsCompatible(CPJavascriptTextContentFeature))
00136 span.textContent = aString;
00137
00138 return _CGSizeMake(span.clientWidth, span.clientHeight);
00139 }
00140
00141 @end