Author: smilek
Date: Wed Sep 6 23:55:25 2006
New Revision: 440996
URL: http://svn.apache.org/viewvc?view=rev&rev=440996
Log:
dojo SortableTable which supports multi-row headers
Added:
portals/jetspeed-2/trunk/src/webapp/javascript/desktop/widget/MultiRowHeaderTable.js
Added:
portals/jetspeed-2/trunk/src/webapp/javascript/desktop/widget/MultiRowHeaderTable.js
URL:
http://svn.apache.org/viewvc/portals/jetspeed-2/trunk/src/webapp/javascript/desktop/widget/MultiRowHeaderTable.js?view=auto&rev=440996
==============================================================================
---
portals/jetspeed-2/trunk/src/webapp/javascript/desktop/widget/MultiRowHeaderTable.js
(added)
+++
portals/jetspeed-2/trunk/src/webapp/javascript/desktop/widget/MultiRowHeaderTable.js
Wed Sep 6 23:55:25 2006
@@ -0,0 +1,202 @@
+/*
+ * Copyright 2000-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+dojo.provide("jetspeed.ui.widget.MultiRowHeaderTable");
+
+dojo.require("dojo.widget.html.SortableTable");
+
+jetspeed.ui.widget.MultiRowHeaderTable = function()
+{
+ dojo.widget.html.SortableTable.call(this);
+ this.widgetType = "MultiRowHeaderTable";
+ this.headerSortUpClass="selectedUp";
+ this.headerSortDownClass="selectedDown";
+};
+
+dojo.inherits( jetspeed.ui.widget.MultiRowHeaderTable,
dojo.widget.html.SortableTable);
+
+dojo.lang.extend( jetspeed.ui.widget.MultiRowHeaderTable, {
+
+ buildRendering: function(args, frag)
+ {
+ jetspeed.ui.widget.MultiRowHeaderTable.superclass.buildRendering.call(
this, args, frag );
+ if ( args.templateCssPath )
+ {
+ dojo.widget.fillFromTemplateCache(this, null,
dojo.uri.dojoUri(args.templateCssPath), null, false);
+ }
+ },
+
+ parseColumns:function(/* HTMLTableHeadElement */ node){
+ // summary
+ // parses the passed element to create column objects
+ this.reset();
+ var rows=node.getElementsByTagName("tr");
+ if (rows && rows.length > 0){
+ for(var rowI=0; rowI<rows.length; rowI++){
+ var cells=rows[rowI].getElementsByTagName("td");
+ if (cells.length==0)
cells=rows[rowI].getElementsByTagName("th");
+
+ for(var i=0; i<cells.length; i++){
+ var isCol=true;
+ if(dojo.html.hasAttribute(cells[i], "colspan")){
+ colspan=dojo.html.getAttribute(cells[i],"colspan");
+ if(colspan > 1)
+ isCol=false;
+ }
+ if(isCol){
+ var o={
+ domNode:cells[i],
+ field:null,
+ format:null,
+ noSort:false,
+ sortType:"String",
+ dataType:String,
+ sortFunction:null,
+ label:null,
+ align:"left",
+ valign:"middle",
+ getField:function(){ return
this.field||this.label; },
+ getType:function(){ return
this.dataType; }
+ };
+ // presentation attributes
+ if(dojo.html.hasAttribute(cells[i],
"align")){
+
o.align=dojo.html.getAttribute(cells[i],"align");
+ }
+ if(dojo.html.hasAttribute(cells[i],
"valign")){
+
o.valign=dojo.html.getAttribute(cells[i],"valign");
+ }
+
+ // sorting features.
+ if(dojo.html.hasAttribute(cells[i],
"nosort")){
+
o.noSort=dojo.html.getAttribute(cells[i],"nosort")=="true";
+ }
+ if(dojo.html.hasAttribute(cells[i],
"sortusing")){
+ var
trans=dojo.html.getAttribute(cells[i],"sortusing");
+ var f=this.getTypeFromString(trans);
+ if (f!=null && f!=window &&
typeof(f)=="function")
+ o.sortFunction=f;
+ }
+
+ if(dojo.html.hasAttribute(cells[i],
"field")){
+
o.field=dojo.html.getAttribute(cells[i],"field");
+ }
+ if(dojo.html.hasAttribute(cells[i],
"format")){
+
o.format=dojo.html.getAttribute(cells[i],"format");
+ }
+ if(dojo.html.hasAttribute(cells[i],
"dataType")){
+ var
sortType=dojo.html.getAttribute(cells[i],"dataType");
+
if(sortType.toLowerCase()=="html"||sortType.toLowerCase()=="markup"){
+ o.sortType="__markup__";
// always convert to "__markup__"
+ o.noSort=true;
+ }else{
+ var
type=this.getTypeFromString(sortType);
+ if(type){
+ o.sortType=sortType;
+ o.dataType=type;
+ }
+ }
+ }
+
o.label=dojo.html.renderedTextContent(cells[i]);
+ this.columns.push(o);
+
+ cells[i].className=this.headerClass;
+
+ // check to see if there's a default sort,
and set the properties necessary
+ if(dojo.html.hasAttribute(cells[i],
"sort")){
+ this.sortIndex=i;
+ var
dir=dojo.html.getAttribute(cells[i], "sort");
+ if(!isNaN(parseInt(dir))){
+ dir=parseInt(dir);
+
this.sortDirection=(dir!=0)?1:0;
+ }else{
+
this.sortDirection=(dir.toLowerCase()=="desc")?1:0;
+ }
+ }
+
+ if(!o.noSort){
+ dojo.event.connect(cells[i],
"onclick", this, "onHeaderClick");
+ }
+ if(this.sortIndex == i && rowI == 0){
+ if(this.sortDirection==0){
+
cells[i].className=this.headerSortDownClass;
+ }else{
+
cells[i].className=this.headerSortUpClass;
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+
+ onHeaderClick:function(/* DomEvent */ e){
+ // summary
+ // Main handler function for each header column click.
+ var oldIndex=this.sortIndex;
+ var oldDirection=this.sortDirection;
+ var source=e.target;
+ for(var i=0; i<this.columns.length; i++){
+ if(this.columns[i].domNode==source){
+ if(i!=oldIndex){
+ // new col.
+ this.sortIndex=i;
+ this.sortDirection=0;
+
this.columns[i].domNode.className=this.headerSortDownClass
+ }else{
+
this.sortDirection=(oldDirection==0)?1:0;
+ if(this.sortDirection==0){
+
this.columns[i].domNode.className=this.headerSortDownClass;
+ }else{
+
this.columns[i].domNode.className=this.headerSortUpClass;
+ }
+ }
+ }else{
+ // reset the header class.
+
this.columns[i].domNode.className=this.headerClass;
+ }
+ }
+ this.render();
+ },
+
+ postCreate:function(){
+ // summary
+ // overridden from HtmlWidget, initializes and renders the
widget.
+ var thead=this.domNode.getElementsByTagName("thead")[0];
+ if(this.headClass.length>0){
+ thead.className=this.headClass;
+ }
+
+ // disable selections
+ dojo.html.disableSelection(this.domNode);
+
+ // parse the columns.
+ this.parseColumns(thead);
+
+ // attach header handlers.
+
+
+ // parse the tbody element and re-render it.
+ var tbody=this.domNode.getElementsByTagName("tbody")[0];
+ if (this.tbodyClass.length>0) {
+ tbody.className=this.tbodyClass;
+ }
+
+ this.parseDataFromTable(tbody);
+ this.render(true);
+ }
+
+});
+dojo.widget.tags.addParseTreeHandler("dojo:multirowheadertable");
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]