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> </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> <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> <span class='%s' style='top: %dpx;'>%s</span> </TH>\n",
- printf("<TH style='overflow:auto; max-width: 26px; height: %dpx' ALIGN=%s> <span class='%s'>%s</span> </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'> %s </TH>",labelWithVocabLink(db,parentTdb,tdbsX[ixX],dimensionX->tag,label));
- //printf("<TH WIDTH='60'> %s </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> </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> </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)
{