summaryrefslogtreecommitdiff
path: root/js/dojo/dojox/html/metrics.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo/dojox/html/metrics.js')
-rw-r--r--js/dojo/dojox/html/metrics.js179
1 files changed, 179 insertions, 0 deletions
diff --git a/js/dojo/dojox/html/metrics.js b/js/dojo/dojox/html/metrics.js
new file mode 100644
index 0000000..776378f
--- /dev/null
+++ b/js/dojo/dojox/html/metrics.js
@@ -0,0 +1,179 @@
+//>>built
+define("dojox/html/metrics", ["dojo/_base/kernel","dojo/_base/lang", "dojo/_base/sniff", "dojo/ready", "dojo/_base/unload",
+ "dojo/_base/window", "dojo/dom-geometry"],
+ function(kernel,lang,has,ready,UnloadUtil,Window,DOMGeom){
+ var dhm = lang.getObject("dojox.html.metrics",true);
+ var dojox = lang.getObject("dojox");
+
+ // derived from Morris John's emResized measurer
+ dhm.getFontMeasurements = function(){
+ // summary
+ // Returns an object that has pixel equivilents of standard font size values.
+ var heights = {
+ '1em':0, '1ex':0, '100%':0, '12pt':0, '16px':0, 'xx-small':0, 'x-small':0,
+ 'small':0, 'medium':0, 'large':0, 'x-large':0, 'xx-large':0
+ };
+
+ if(has("ie")){
+ // we do a font-size fix if and only if one isn't applied already.
+ // NOTE: If someone set the fontSize on the HTML Element, this will kill it.
+ Window.doc.documentElement.style.fontSize="100%";
+ }
+
+ // set up the measuring node.
+ var div=Window.doc.createElement("div");
+ var ds = div.style;
+ ds.position="absolute";
+ ds.left="-100px";
+ ds.top="0";
+ ds.width="30px";
+ ds.height="1000em";
+ ds.borderWidth="0";
+ ds.margin="0";
+ ds.padding="0";
+ ds.outline="0";
+ ds.lineHeight="1";
+ ds.overflow="hidden";
+ Window.body().appendChild(div);
+
+ // do the measurements.
+ for(var p in heights){
+ ds.fontSize = p;
+ heights[p] = Math.round(div.offsetHeight * 12/16) * 16/12 / 1000;
+ }
+
+ Window.body().removeChild(div);
+ div = null;
+ return heights; // object
+ };
+
+ var fontMeasurements = null;
+
+ dhm.getCachedFontMeasurements = function(recalculate){
+ if(recalculate || !fontMeasurements){
+ fontMeasurements = dhm.getFontMeasurements();
+ }
+ return fontMeasurements;
+ };
+
+ var measuringNode = null, empty = {};
+ dhm.getTextBox = function(/* String */ text, /* Object */ style, /* String? */ className){
+ var m, s;
+ if(!measuringNode){
+ m = measuringNode = Window.doc.createElement("div");
+ // Container that we can set contraints on so that it doesn't
+ // trigger a scrollbar.
+ var c = Window.doc.createElement("div");
+ c.appendChild(m);
+ s = c.style;
+ s.overflow='scroll';
+ s.position = "absolute";
+ s.left = "0px";
+ s.top = "-10000px";
+ s.width = "1px";
+ s.height = "1px";
+ s.visibility = "hidden";
+ s.borderWidth = "0";
+ s.margin = "0";
+ s.padding = "0";
+ s.outline = "0";
+ Window.body().appendChild(c);
+ }else{
+ m = measuringNode;
+ }
+ // reset styles
+ m.className = "";
+ s = m.style;
+ s.borderWidth = "0";
+ s.margin = "0";
+ s.padding = "0";
+ s.outline = "0";
+ // set new style
+ if(arguments.length > 1 && style){
+ for(var i in style){
+ if(i in empty){ continue; }
+ s[i] = style[i];
+ }
+ }
+ // set classes
+ if(arguments.length > 2 && className){
+ m.className = className;
+ }
+ // take a measure
+ m.innerHTML = text;
+ var box = DOMGeom.position(m);
+ // position doesn't report right (reports 1, since parent is 1)
+ // So we have to look at the scrollWidth to get the real width
+ // Height is right.
+ box.w = m.parentNode.scrollWidth;
+ return box;
+ };
+
+ // determine the scrollbar sizes on load.
+ var scroll={ w:16, h:16 };
+ dhm.getScrollbar=function(){ return { w:scroll.w, h:scroll.h }; };
+
+ dhm._fontResizeNode = null;
+
+ dhm.initOnFontResize = function(interval){
+ var f = dhm._fontResizeNode = Window.doc.createElement("iframe");
+ var fs = f.style;
+ fs.position = "absolute";
+ fs.width = "5em";
+ fs.height = "10em";
+ fs.top = "-10000px";
+ if(has("ie")){
+ f.onreadystatechange = function(){
+ if(f.contentWindow.document.readyState == "complete"){
+ f.onresize = f.contentWindow.parent[dojox._scopeName].html.metrics._fontresize;
+ }
+ };
+ }else{
+ f.onload = function(){
+ f.contentWindow.onresize = f.contentWindow.parent[dojox._scopeName].html.metrics._fontresize;
+ };
+ }
+ //The script tag is to work around a known firebug race condition. See comments in bug #9046
+ f.setAttribute("src", "javascript:'<html><head><script>if(\"loadFirebugConsole\" in window){window.loadFirebugConsole();}</script></head><body></body></html>'");
+ Window.body().appendChild(f);
+ dhm.initOnFontResize = function(){};
+ };
+
+ dhm.onFontResize = function(){};
+ dhm._fontresize = function(){
+ dhm.onFontResize();
+ }
+
+ UnloadUtil.addOnUnload(function(){
+ // destroy our font resize iframe if we have one
+ var f = dhm._fontResizeNode;
+ if(f){
+ if(has("ie") && f.onresize){
+ f.onresize = null;
+ }else if(f.contentWindow && f.contentWindow.onresize){
+ f.contentWindow.onresize = null;
+ }
+ dhm._fontResizeNode = null;
+ }
+ });
+
+ ready(function(){
+ // getScrollbar metrics node
+ try{
+ var n=Window.doc.createElement("div");
+ n.style.cssText = "top:0;left:0;width:100px;height:100px;overflow:scroll;position:absolute;visibility:hidden;";
+ Window.body().appendChild(n);
+ scroll.w = n.offsetWidth - n.clientWidth;
+ scroll.h = n.offsetHeight - n.clientHeight;
+ Window.body().removeChild(n);
+ //console.log("Scroll bar dimensions: ", scroll);
+ delete n;
+ }catch(e){}
+
+ // text size poll setup
+ if("fontSizeWatch" in kernel.config && !!kernel.config.fontSizeWatch){
+ dhm.initOnFontResize();
+ }
+ });
+ return dhm;
+}); \ No newline at end of file