You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xap-commits@incubator.apache.org by mt...@apache.org on 2007/06/15 12:41:22 UTC

svn commit: r547656 - /incubator/xap/trunk/codebase/src/xap/widgets/dojo/TreeTable.js

Author: mturyn
Date: Fri Jun 15 05:41:21 2007
New Revision: 547656

URL: http://svn.apache.org/viewvc?view=rev&rev=547656
Log:
some fixes.  a timeout was added for _fixColumnwidths... we should look into removing

Modified:
    incubator/xap/trunk/codebase/src/xap/widgets/dojo/TreeTable.js

Modified: incubator/xap/trunk/codebase/src/xap/widgets/dojo/TreeTable.js
URL: http://svn.apache.org/viewvc/incubator/xap/trunk/codebase/src/xap/widgets/dojo/TreeTable.js?view=diff&rev=547656&r1=547655&r2=547656
==============================================================================
--- incubator/xap/trunk/codebase/src/xap/widgets/dojo/TreeTable.js (original)
+++ incubator/xap/trunk/codebase/src/xap/widgets/dojo/TreeTable.js Fri Jun 15 05:41:21 2007
@@ -17,6 +17,8 @@
  *
  */
  
+ // MMs latest.
+ // + gates against null nodes
 
 
 Xap.provide("xap.widgets.dojo.TreeTable");
@@ -137,141 +139,149 @@
 	 * After a table has been built to the screen go through and make sure
 	 * the widths of columns and headers match up.
 	 */
-	_resizeTable: function(){
+	_resizeTable: function() {
+	
+		// Need to do this manually for IE.
+		// TODO: Figure out why this is so.
+		var naturalWidthPx = 0 ; 
+	
+		// clear timeout as soon as we get here
+		window.clearTimeout(this._resizeTableTask);
+		this._resizeTableTask = null;
 	
-		var tableWidth = 0;
-		
 		//don't user tbody.childNodes[0] here because in the case
 		//where we need to fix up IE we want to fixup and THEN remove
 		//and re-add rows in the new order.
-		var firstRow = this._rows.length>0?this._rows[0].domNode:null;
+		var firstRow = (this._rows.length > 0) ? this._rows[0].domNode : null;
 
-		// Spacing gets screwed-up under IE if the first row isn't complete,
-		// so complete it if need be:
-		var len = -1 ;
-		if( dojo.render.html.ie
-				&& firstRow 
-				&& this._columns 
-				&& (len=this._columns.length)>1
-			){
-			while(firstRow.childNodes.length<len){
-				var filler = document.createElement("td");
-				filler.style.backgroundColor = "transparent" ;
-				firstRow.appendChild(filler) ;
+		for (var i = 0; i < this._columns.length; i++) {
+			
+			// not set any width
+			var width = 0;
+			
+			/* if the user explicitly set, we use those */
+			if ( this._columns[i]._headerWidth ) {
+				var setHeaderWidth = this._getSizeFromString (this._columns[i]._headerWidth);
+				if(setHeaderWidth) { width = setHeaderWidth; }
+			} 
+			// get maximum value
+			if( this._columns[i]._sStatedWidth) {
+				var setColumnWidth = this._getSizeFromString (this._columns[i]._sStatedWidth);
+				if(setColumnWidth) { width = Math.max(width, setColumnWidth); }
 			}
-		}
-
-		var tableWidth = 0;
-		// No need to test for these each iteration:
-		var hasHeaders = this.headerRow && this.headerRow.childNodes ;
-		var hasFirstRow = firstRow && firstRow.childNodes ;	
-		var hasHeaderTable = this.headerTable && this.headerTable.childNodes ;
-		var hasBodyTable = this.table && this.table.childNodes ;		
-		
-		for (var i=0; i<this._columns.length;i++){
-					
-			var headerWidth = 0;
-			var columnWidth  = 0;
-			var setWidth = 0;
-			var node = null ;
+						
 			//In IE get/set of column width dynamically doesn't seem to work 
 			//too well so use first row instead
 			if (dojo.render.html.ie){
-				if( hasHeaders && (node = this.headerRow.childNodes[i])){
-					headerWidth = node.offsetWidth ;				
+				if(width === 0 
+					&& this.headerRow
+					&& this.headerRow.childNodes[i]					
+					) {
+					width = this.headerRow.childNodes[i].offsetWidth;
+				}
+				if (firstRow && firstRow.childNodes[i]) {
+					firstRow.childNodes[i].style.width = width + 'px';
 				}
-				node = null ;
-				if ( hasFirstRow && (node = firstRow.childNodes[i]) ){
-					columnWidth = node.offsetWidth ;
+			} else {
+				if(width === 0
+					&& this.headerTable				
+					&& this.headerTable.childNodes[i]				
+				) {
+					width = this.headerTable.childNodes[i].offsetWidth;
 				}
+				this.table.childNodes[i].style.width = width + 'px';
 			}
-			else{
-				if( hasHeaderTable
-						&& (node = this.headerTable.childNodes[i])
-						){			
-					headerWidth 
-						= node.offsetWidth ;
-				}
-				node=null;
-				if( hasBodyTable
-					&& (node = this.table.childNodes[i])){
-					columnWidth 
-						= node.offsetWidth ;				
+			
+			// save final width
+			this._columns[i]._calculatedWidth = width;
+
+			naturalWidthPx += width ;
+
+		} // end for(...)
+		
+		// Unset-width tables' widths are screwed up under IE:
+		if( dojo.render.html.ie 
+			&& (typeof this._resetWidth == "undefined")
+		 ){
+			dojo.html.setContentBox(this.domNode,{width:naturalWidthPx+25}) ;					
+		 	this.scrollDiv.style.width="100%" ;	
+		 	if(typeof this._resetHeight == "undefined"){
+				this.domNode.style.height
+					= this.table.offsetHeight 
+						+this.headerTable.offsetHeight + 25 +"px" ;
+		 		this.scrollDiv.style.height = "100%" ;
+		 	}		
+		}	
+
+		// delay call to _fixColumnWidths
+		dojo.lang.setTimeout(this, this._fixColumnWidths, 1000);
+	},
+	
+	_fixColumnWidths : function(){
+		var tableWidth = 0;
+		var firstRow = (this._rows.length > 0) ? this._rows[0].domNode : null;
+		for (var i = 0; i< this._columns.length; i++) {
+		
+			// this is header width
+			var calculatedWidth = this._columns[i]._calculatedWidth;
+			var contentWidth = 0;
+			
+			if (dojo.render.html.ie){
+				
+				if( firstRow && firstRow.childNodes[i]){
+					contentWidth = firstRow.childNodes[i].offsetWidth;
+				}
+				if(contentWidth > calculatedWidth) { 
+					calculatedWidth = contentWidth; 
+				}
+				if( this.headerRow && this.headerRow.childNodes[i]){
+					dojo.html.setMarginBox( this.headerRow.childNodes[i], {width: calculatedWidth} ) ;
+				}
+				if (firstRow && firstRow.childNodes[i]){
+					dojo.html.setMarginBox( firstRow.childNodes[i], {width: calculatedWidth} ) ;
+				}
+			} else {
+				if( this.table
+					&& this.table.childNodes[i]
+					){
+					contentWidth =  this.table.childNodes[i].offsetWidth;
+				}
+				if(contentWidth > calculatedWidth){
+					calculatedWidth = contentWidth;
+				}
+				
+				if( this.headerTable
+					&& this.headerTable.childNodes[i]
+				){
+					this.headerTable.childNodes[i].style.width = calculatedWidth + 'px';
+				}
+				if( this.table
+					&& this.table.childNodes[i]
+				){				
+					this.table.childNodes[i].style.width = calculatedWidth + 'px';
 				}
 			}
 			
-			/* if the user explicitly set the column width or
-			   its header's width , we use those (preferring
-			   as usual the last value parsed, that is, 
-			   the header's):
-			*/
-
-			var setWidth = this._columns[i].getBestWidth() ;
-		
-			// We want to set the column width to the explicitly-given value
-			// if it should be available from the column or its header); if
-			// a value is not available so, we'll use the greater of the 
-			// extant cell or column widths.  Note that we need to look
-			// up the explicitly-set ones in case the table is hidden when created
-			var preferredColumnWidth = setWidth ;
-			if( !setWidth ){
-				preferredColumnWidth = headerWidth>columnWidth ? headerWidth:columnWidth;	
-				preferredColumnWidth += "px" ;
+			// MM: not sure if we need that 
+			if (
+				this.headerRow
+				&& this.headerRow.childNodes[i]
+				&& this.headerRow.childNodes[i].childNodes[0]			
+				) {
+				this.headerRow.childNodes[i].childNodes[0].style.width  = "100%";
 			}
-			var preferredColumnWidthPx = parseInt(preferredColumnWidth) ;
-			this._columns[i].setStatedWidth(preferredColumnWidth) ;
-			if(this.columnsSizer 
-				&& this.columnsSizer.children
-					&& this.columnsSizer.children[i]
-				){
-				this.columnsSizer.children[i].sizeShare = preferredColumnWidthPx ;
-			}	
-			tableWidth += preferredColumnWidthPx ;
+			tableWidth += calculatedWidth;
 		}
-		
 		//if we don't fix the width here then when we want the table
 		//to scroll horizontally it doesn't work very well, sizes
 		//too small
-
-		this.headerTable.style.tableLayout = "auto";
-		this.table.style.tableLayout = "auto";	
-
-
 		this.table.style.width = tableWidth + "px";
 		this.headerTable.style.width = tableWidth + "px";
 		
-		
-		this._fixColumnWidths();
 		this.headerTable.style.tableLayout = "fixed";
-		this.table.style.tableLayout = "fixed";		
-				
-		window.clearTimeout(this._resizeTableTask);
-		this._resizeTableTask = null;
+		this.table.style.tableLayout = "fixed";	
 	},
 	
-	_fixColumnWidths: function(){
-		var firstRow = this._rows.length>0?this._rows[0].domNode:null;
-var arr = new Array(0) ;		
-		for (var i=0; i<this._columns.length;i++){
-			// Note: ends with "px":
-			var width = this._columns[i].getBestWidth();
-			// These next two originally were just called under IE,
-			// and the columns set under Firefox.  The columns came
-			// out better under IE than under Firefox, so we switched 
-			// to the IE way:					
-			if( this.headerRow && this.headerRow.childNodes[i]){
-				dojo.html.setMarginBox( this.headerRow.childNodes[i],
-										{width: parseInt(width)} 
-										) ;
-			}
-			if (firstRow && firstRow.childNodes[i]){
-				dojo.html.setMarginBox( firstRow.childNodes[i],
-					{width: parseInt(width)} ) ;					
-			}
-			if (this.headerRow.childNodes[i] && this.headerRow.childNodes[i].childNodes[0])
-				this.headerRow.childNodes[i].childNodes[0].style.width  = '100%';
-		}	
-	},
 	
 	/**
 	 * Rebuilds just the real table part of table, not
@@ -462,13 +472,19 @@
 	* Support for dynamic sizing 
 	*/	
 	setHeight:function(value){
-		if (this.domNode) this.domNode.style.height = value;
+		if (this.domNode){
+			this.domNode.style.height = value ;
+			this._resetHeight = value ;
+		}
 		this.onResized();
 	},
 	
 
 	setWidth:function(value){
-		if (this.domNode) this.domNode.style.width = value;
+		if (this.domNode){
+			this.domNode.style.width = value;
+			this._resetWidth = value ;
+		}
 //		this.onResized();
 	},