src/hg/lib/hui.c 1.279

1.279 2010/04/27 00:16:09 tdreszer
Removed not ready for prime time 'slant titles', 'hint cols and rows' and 'scrolling table'. Added tooltip for each matrix cell.
Index: src/hg/lib/hui.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/lib/hui.c,v
retrieving revision 1.278
retrieving revision 1.279
diff -b -B -U 4 -r1.278 -r1.279
--- src/hg/lib/hui.c	22 Apr 2010 22:08:48 -0000	1.278
+++ src/hg/lib/hui.c	27 Apr 2010 00:16:09 -0000	1.279
@@ -5286,10 +5286,8 @@
 return cloneString(label);
 }
 
 #define PM_BUTTON_UC "<IMG height=18 width=18 onclick=\"return (matSetMatrixCheckBoxes(%s%s%s%s%s%s) == false);\" id='btn_%s' src='../images/%s'>"
-#define MATRIX_COLS_TILL_HINT 18
-#define MATRIX_ROWS_TILL_HINT 30
 #define MATRIX_RIGHT_BUTTONS_AFTER 8
 #define MATRIX_BOTTOM_BUTTONS_AFTER 20
 
 static void buttonsForAll()
@@ -5302,111 +5300,11 @@
 printf(PM_BUTTON_UC, "true",  ",'", class, "'", "", "", name,    "add_sm.gif");
 printf(PM_BUTTON_UC, "false", ",'", class, "'", "", "", name, "remove_sm.gif");
 }
 
-//#define HINT_ROW_COL
-//#define SLANT_COL_TITLES
-static int matrixHintColumn(members_t *dimensionX)
-/* If matrix is large enough, then this column will contain hints (Y labels) */
-{
-int hintColumn = -1; // default none
-#ifdef HINT_ROW_COL
-if(dimensionX && dimensionX->count > MATRIX_COLS_TILL_HINT)
-    {
-    int hints = 2;
-    for(hints=2;hints < 5;hints++)
-        {
-        hintColumn = (dimensionX->count + 1)/hints;
-        if(hintColumn < MATRIX_COLS_TILL_HINT)
-            break;
-        }
-    }
-#endif//def HINT_ROW_COL
-return hintColumn;
-}
-static void matrixYhints(int hintColumn,int column,members_t *dimensionY,struct trackDb *childTdb,int ixY,char * title)
-/* prints a column of hint Y labels to be used when the matrix is too big */
-{
-if(hintColumn > 1 && column > 1 && (column % hintColumn) == 0)
-    {
-    if(dimensionY == NULL || ixY < 0) // Just give the header
-        {
-        if(title != NULL)
-            printf("<TD><B><em style='font-size:70%%;'>%s</em></B></TD>",title);
-        else
-            printf("<TD>&nbsp;</TD>");
-        }
-    else if(dimensionY && childTdb != NULL)
-        {
-        printf("<TD ALIGN=CENTER class='hintCol'>%s</TD>",dimensionY->values[ixY]);
-        }
-    }
-}
-static int matrixHintRow(members_t *dimensionY)
-/* If matrix is large enough, then this row will contain hints (X labels) */
-{
-int hintRow = -1; // default none
-#ifdef HINT_ROW_COL
-if(dimensionY && dimensionY->count > MATRIX_ROWS_TILL_HINT)
-    {
-    int hints = 2;
-    for(hints=2;hints < 5;hints++)
-        {
-        hintRow = (dimensionY->count + 1)/hints;
-        if(hintRow < MATRIX_ROWS_TILL_HINT)
-            break;
-        }
-    }
-#endif//def HINT_ROW_COL
-return hintRow;
-}
-
-static void matrixXhints(int hintRow,int row,members_t *dimensionX,struct trackDb **tdbsX)
-/* prints a row of hint X labels to be used when the matrix is too big */
-{
-if(hintRow > 1 && row > 1 && (row % hintRow) == 0)
-    {
-    printf("<TR ALIGN=CENTER BGCOLOR='%s' valign=CENTER><TD ALIGN=RIGHT nowrap colspan=2><B><em style='font-size:70%%;'>%s</em></B></TD>\n",COLOR_BG_ALTDEFAULT,dimensionX->title);
-
-    int hintColumn = matrixHintColumn(dimensionX);
-    int ixX,column=0;
-    for (ixX = 0; ixX < dimensionX->count; ixX++)
-        {
-        matrixYhints(hintColumn,column,NULL,NULL,-1,NULL);
-        if(tdbsX[ixX] != NULL)
-            {
-            //char *label = replaceChars(dimensionX->values[ixX]," (","<BR>(");
-            char *suffix=NULL;
-            char *label = labelRoot(dimensionX->values[ixX],&suffix);
-            if(strlen(label) > 9 && strlen(label) == strlen(dimensionX->values[ixX]))
-                label = replaceChars(label," ","<BR>");
-            printf("<TD class='hintRow'>%s</TD>",label);
-            freeMem(label);
-            column++;
-            }
-        }
-    if(column>MATRIX_RIGHT_BUTTONS_AFTER)
-        {
-            printf("<TD ALIGN=LEFT nowrap colspan=2><B><em style='font-size:70%%;'>%s</em></B></TD>",dimensionX->title);
-        }
-    puts("</TR>");
-    }
-}
-
-
 static void matrixXheadingsRow1(char *db,struct trackDb *parentTdb, members_t *dimensionX,members_t *dimensionY,struct trackDb **tdbsX,boolean top)
 /* prints the top row of a matrix: 'All' buttons; X titles; buttons 'All' */
 {
-#ifdef SLANT_COL_TITLES
-// TODO: Too difficult to implement at this time, because EVERY browser is different.
-// Will need to query browser type and selectively implement.
-boolean slant = (dimensionX && dimensionX->count > 12);
-#else//ifndef SLANT_COL_TITLES
-boolean slant = FALSE;
-#endif//ndef SLANT_COL_TITLES
-
-int hintColumn = matrixHintColumn(dimensionX);
-
 printf("<TR ALIGN=CENTER BGCOLOR='%s' valign=%s>\n",COLOR_BG_ALTDEFAULT,top?"BOTTOM":"TOP");
 if(dimensionX && dimensionY)
     {
     printf("<TH ALIGN=LEFT valign=%s>",top?"TOP":"BOTTOM");
@@ -5422,34 +5320,14 @@
         printf("<TH align=RIGHT><EM><B>%s</EM></B></TH>", dimensionX->title);
     else
         printf("<TH ALIGN=RIGHT valign=%s>&nbsp;&nbsp;<EM><B>%s</EM></B></TH>",(top?"TOP":"BOTTOM"), dimensionX->title);
 
-    int longest = 0;
-    if(slant)
-        {
-        for (ixX = 0; ixX < dimensionX->count; ixX++)
-            {
-            if(longest < strlen(dimensionX->values[ixX]))
-                longest = strlen(dimensionX->values[ixX]);
-            }
-        }
     for (ixX = 0; ixX < dimensionX->count; ixX++)
         {
         if(tdbsX[ixX] != NULL)
             {
-            matrixYhints(hintColumn,cntX,NULL,NULL,-1,NULL);
-
-            char *label = dimensionX->values[ixX];
-            if(!slant)
-                label = replaceChars(dimensionX->values[ixX]," (","<BR>(");
-            if(slant)
-                //printf("<TH style='overflow:auto; max-width: 26px;' ALIGN=%s>&nbsp;<span class='%s' style='top: %dpx;'>%s</span>&nbsp;</TH>\n",
-                printf("<TH style='overflow:auto; max-width: 26px; height: %dpx' ALIGN=%s>&nbsp;<span class='%s'>%s</span>&nbsp;</TH>\n",
-                    (longest*5),(top?"LEFT":"RIGHT"),(top?"slantUp":"slantDn"),labelWithVocabLink(db,parentTdb,tdbsX[ixX],dimensionX->tag,label));
-            else
+            char *label =replaceChars(dimensionX->values[ixX]," (","<BR>(");
                 printf("<TH WIDTH='60'>&nbsp;%s&nbsp;</TH>",labelWithVocabLink(db,parentTdb,tdbsX[ixX],dimensionX->tag,label));
-            //printf("<TH WIDTH='60'>&nbsp;%s&nbsp;</TH>",labelWithVocabLink(db,parentTdb,tdbsX[ixX],dimensionX->tag,label));
-            if(!slant)
                 freeMem(label);
             cntX++;
             }
         }
@@ -5480,19 +5358,15 @@
 
 static void matrixXheadingsRow2(struct trackDb *parentTdb, members_t *dimensionX,members_t *dimensionY,struct trackDb **tdbsX)
 /* prints the 2nd row of a matrix: Y title; X buttons; title Y */
 {
-int hintColumn = matrixHintColumn(dimensionX);
-
 // If there are both X and Y dimensions, then there is a row of buttons in X
 if(dimensionX && dimensionY)
     {
     int ixX,cntX=0;
     printf("<TR ALIGN=CENTER BGCOLOR=\"%s\"><TH ALIGN=CENTER colspan=2><EM><B>%s</EM></B></TH>",COLOR_BG_ALTDEFAULT, dimensionY->title);
     for (ixX = 0; ixX < dimensionX->count; ixX++)    // Special row of +- +- +-
         {
-        matrixYhints(hintColumn,cntX,NULL,NULL,-1,dimensionY->title);
-
         if(tdbsX[ixX] != NULL)
             {
             char objName[SMALLBUF];
             puts("<TD>");
@@ -5716,41 +5590,50 @@
 
 matrixXheadings(db,parentTdb,membersForAll->members[dimX],membersForAll->members[dimY],tdbsX,TRUE);
 
 // Now the Y by X matrix
-int hintCol = matrixHintColumn(membersForAll->members[dimX]);
-int hintRow = matrixHintRow(membersForAll->members[dimY]);
 int cntX=0,cntY=0;
 for (ixY = 0; ixY < sizeOfY; ixY++)
     {
     if(tdbsY[ixY] != NULL || membersForAll->members[dimY] == NULL)
         {
-        matrixXhints(hintRow,cntY,membersForAll->members[dimX],tdbsX);
         cntY++;
         assert(!membersForAll->members[dimY] || ixY < membersForAll->members[dimY]->count);
         printf("<TR ALIGN=CENTER BGCOLOR=\"#FFF9D2\">");
 
         matrixYheadings(db,parentTdb, membersForAll->members[dimX],membersForAll->members[dimY],ixY,tdbsY[ixY],TRUE);
 
 #define MAT_CB_SETUP "<INPUT TYPE=CHECKBOX NAME='%s' VALUE=on %s>"
 #define MAT_CB(name,js) printf(MAT_CB_SETUP,(name),(js));
-        int column = 0;
         for (ixX = 0; ixX < sizeOfX; ixX++)
             {
             if(tdbsX[ixX] != NULL || membersForAll->members[dimX] == NULL)
                 {
                 assert(!membersForAll->members[dimX] || ixX < membersForAll->members[dimX]->count);
 
-                matrixYhints(hintCol,column,membersForAll->members[dimY],tdbsY[ixY],ixY,NULL);
-                column++;
                 if(cntY==1) // Only do this on the first good Y
                     cntX++;
 
                 if(membersForAll->members[dimX] && ixX == membersForAll->members[dimX]->count)
                     break;
+                char *ttlX = NULL;
+                char *ttlY = NULL;
+                if(membersForAll->members[dimX])
+                    {
+                    ttlX = cloneString(membersForAll->members[dimX]->values[ixX]);
+                    stripString(ttlX,"<i>");
+                    stripString(ttlX,"</i>");
+                    }
+                if(membersForAll->members[dimY] != NULL)
+                    {
+                    ttlY = cloneString(membersForAll->members[dimY]->values[ixY]);
+                    stripString(ttlY,"<i>");
+                    stripString(ttlY,"</i>");
+                    }
                 if(cells[ixX][ixY] > 0)
                     {
                     boolean halfChecked = (chked[ixX][ixY] > 0 && chked[ixX][ixY] != enabd[ixX][ixY]);
+
                     struct dyString *dyJS = dyStringCreate("onclick='matCbClick(this);'");
                     if(membersForAll->members[dimX] && membersForAll->members[dimY])
                         {
                         safef(objName, sizeof(objName), "mat_%s_%s_cb", membersForAll->members[dimX]->names[ixX],membersForAll->members[dimY]->names[ixY]);
@@ -5759,9 +5642,12 @@
                         {
                         safef(objName, sizeof(objName), "mat_%s_cb", (membersForAll->members[dimX] ? membersForAll->members[dimX]->names[ixX] : membersForAll->members[dimY]->names[ixY]));
                         }
                     //printf("<TD title='subCBs:%d  checked:%d enabled:%d'>\n",cells[ixX][ixY],chked[ixX][ixY],enabd[ixX][ixY]);
-                    printf("<TD%s>\n",(halfChecked?" title='Not all associated subtracks have been selected'":""));
+                    if(ttlX && ttlY)
+                        printf("<TD title='%s and %s'>\n",ttlX,ttlY);
+                    else
+                        printf("<TD title='%s'>\n",(ttlX ? ttlX : ttlY));
                     dyStringPrintf(dyJS, " class=\"matCB");
                     if(halfChecked)
                         dyStringPrintf(dyJS, " halfVis");  // needed for later js identification!
                     if(membersForAll->members[dimX])
@@ -5771,14 +5657,23 @@
                     dyStringAppendC(dyJS,'"');
                     if(chked[ixX][ixY] > 0)
                         dyStringAppend(dyJS," CHECKED");
                     if(halfChecked)
-                        dyStringAppend(dyJS," style='filter:alpha(opacity=50)'"); // overkill with class=halfVis but IE doesn't cooperate!
+                        {
+                        //dyStringAppend(dyJS," style='filter:alpha(opacity=50)'"); // Doesn't get set overkill with class=halfVis but IE doesn't cooperate!
+                        dyStringAppend(dyJS," title='Not all associated subtracks have been selected'"); // overkill with class=halfVis but IE doesn't cooperate!
+                        }
                     MAT_CB(objName,dyStringCannibalize(&dyJS)); // X&Y are set by javascript page load
                     puts("</TD>");
                     }
                 else
-                    puts("<TD>&nbsp;</TD>");
+                    {
+                    if(ttlX && ttlY)
+                        printf("<TD title='%s and %s'></TD>\n",ttlX,ttlY);
+                    else
+                        printf("<TD title='%s'></TD>\n",(ttlX ? ttlX : ttlY));
+                    //puts("<TD>&nbsp;</TD>");
+                    }
                 }
             }
         if(membersForAll->members[dimX] && cntX>MATRIX_RIGHT_BUTTONS_AFTER)
             matrixYheadings(db,parentTdb, membersForAll->members[dimX],membersForAll->members[dimY],ixY,tdbsY[ixY],FALSE);
@@ -5984,8 +5878,11 @@
 
 if(trackDbSetting(tdb, "dragAndDrop") != NULL)
     jsIncludeFile("jquery.tablednd.js", NULL);
 jsIncludeFile("hui.js",NULL);
+#ifdef TABLE_SCROLL
+jsIncludeFile("jquery.fixedtable.js",NULL);
+#endif//def TABLE_SCROLL
 
 puts("<P>");
 if (trackDbCountDescendantLeaves(tdb) < MANY_SUBTRACKS && !hasSubgroups)
     {