123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.html.metrics"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.html.metrics"] = true;
- dojo.provide("dojox.html.metrics");
- (function(){
- var dhm = dojox.html.metrics;
- // 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(dojo.isIE){
- // 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.
- dojo.doc.documentElement.style.fontSize="100%";
- }
-
- // set up the measuring node.
- var div=dojo.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";
- dojo.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;
- }
-
- dojo.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 = dojo.doc.createElement("div");
- // Container that we can set contraints on so that it doesn't
- // trigger a scrollbar.
- var c = dojo.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";
- dojo.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 = dojo.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 = dojo.doc.createElement("iframe");
- var fs = f.style;
- fs.position = "absolute";
- fs.width = "5em";
- fs.height = "10em";
- fs.top = "-10000px";
- if(dojo.isIE){
- 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>'");
- dojo.body().appendChild(f);
- dhm.initOnFontResize = function(){};
- };
- dhm.onFontResize = function(){};
- dhm._fontresize = function(){
- dhm.onFontResize();
- }
- dojo.addOnUnload(function(){
- // destroy our font resize iframe if we have one
- var f = dhm._fontResizeNode;
- if(f){
- if(dojo.isIE && f.onresize){
- f.onresize = null;
- }else if(f.contentWindow && f.contentWindow.onresize){
- f.contentWindow.onresize = null;
- }
- dhm._fontResizeNode = null;
- }
- });
- dojo.addOnLoad(function(){
- // getScrollbar metrics node
- try{
- var n=dojo.doc.createElement("div");
- n.style.cssText = "top:0;left:0;width:100px;height:100px;overflow:scroll;position:absolute;visibility:hidden;";
- dojo.body().appendChild(n);
- scroll.w = n.offsetWidth - n.clientWidth;
- scroll.h = n.offsetHeight - n.clientHeight;
- dojo.body().removeChild(n);
- //console.log("Scroll bar dimensions: ", scroll);
- delete n;
- }catch(e){}
- // text size poll setup
- if("fontSizeWatch" in dojo.config && !!dojo.config.fontSizeWatch){
- dhm.initOnFontResize();
- }
- });
- })();
- }
|