1ee35161c11e26203026dbb8ab352f306b8603ed
max
  Fri Apr 22 10:42:36 2016 -0700
adding file forgotten in previous commit

diff --git src/hg/hgTracks/menu.c src/hg/hgTracks/menu.c
index a39e0a9..164edd7 100644
--- src/hg/hgTracks/menu.c
+++ src/hg/hgTracks/menu.c
@@ -18,62 +18,72 @@
 #include "hgTracks.h"
 #include "trackHub.h"
 #include "extTools.h"
 #include "trackVersion.h"
 
 /* list of links to display in a menu */
 /* a link with an empty name is displayed as a horizontal separator line */
 struct hotLink
     {
     struct hotLink *next;
     char *name;
     char *url;
     char *id;
     char *mouseOver;
     char *onClick;
+    char *shortcut;
     boolean inactive; /* greyed out */
     boolean external;
     };
 
 static void appendLink(struct hotLink **links, char *url, char *name, char *id, boolean external)
 {
 // append to list of links for later printing and/or communication with javascript client
 struct hotLink *link;
 AllocVar(link);
 link->name = cloneString(name);
 link->url = cloneString(url);
 link->id = cloneString(id);
 link->external = external;
 link->inactive = FALSE;
 slAddTail(links, link);
 }
 
 static void appendLinkMaybeInactive(struct hotLink **links, char *url, char *name, char *id, 
     char *mouseOver, boolean external, boolean inactive)
 {
 appendLink(links, url, name, id, external);
 struct hotLink *le = slLastEl(links);
 le->inactive=inactive;
 le->mouseOver=mouseOver;
 }
 
 static void appendLinkWithOnclick(struct hotLink **links, char *url, char *name, char *id, 
-    char *mouseOver, char *onClick, boolean external, boolean inactive)
+    char *mouseOver, char *onClick, char *shortcut, boolean external, boolean inactive)
 {
 appendLinkMaybeInactive(links, url, name, id, mouseOver, external, inactive);
 struct hotLink *le = slLastEl(links);
 le->onClick=onClick;
+le->shortcut=shortcut;
+}
+
+static void appendLinkWithShortcut(struct hotLink **links, char *url, char *name, char *id, 
+    char *mouseOver, char *shortcut, boolean external, boolean inactive)
+{
+appendLinkMaybeInactive(links, url, name, id, mouseOver, external, inactive);
+struct hotLink *le = slLastEl(links);
+le->shortcut=shortcut;
 }
 
 static void printEnsemblAnchor(char *database, char* archive,
                                char *chrName, int start, int end, struct hotLink **links)
 /* Print anchor to Ensembl display on same window. */
 {
 char *scientificName = hScientificName(database);
 char *dir = ensOrgNameFromScientificName(scientificName);
 struct dyString *ensUrl;
 char *name;
 int localStart, localEnd;
 
 name = chrName;
 
 if (sameWord(scientificName, "Takifugu rubripes"))
@@ -181,65 +191,69 @@
     char *encodedName = htmlEncode(link->name);
     if(*class)
         dyStringPrintf(menuHtml, " class='%s'", class);
     dyStringPrintf(menuHtml, ">\n");
 
     if (!isEmpty(link->name))
         {
         dyStringPrintf(menuHtml, "<a href='%s' ", link->url);
         if (link->mouseOver)
             dyStringPrintf(menuHtml, "title='%s' ", link->mouseOver); 
         if (link->onClick)
             dyStringPrintf(menuHtml, "onclick=\"%s\" ", link->onClick); 
         dyStringPrintf(menuHtml, "id='%s'%s>%s</a>\n", link->id, 
             link->external ? " TARGET='_blank'" : "", encodedName);
         }
+    if (!isEmpty(link->shortcut))
+        dyStringPrintf(menuHtml, "<span class='shortcut'>%s</span>", link->shortcut);
+
     dyStringPrintf(menuHtml, "</li>\n");
     freez(&encodedName);
 
     freez(&link->name);
     freez(&link->url);
     freez(&link->id);
     }
 slFreeList(links);
 }
 
 void printMenuBar()
 /* Put up the special menu bar for hgTracks. */
 {
 struct hotLink *links = NULL;
 struct sqlConnection *conn = NULL;
 if (!trackHubDatabase(database))
     conn = hAllocConn(database);
 char *menuStr, buf[4096], uiVars[1024];
 safef(uiVars, sizeof(uiVars), "%s=%s", cartSessionVarName(), cartSessionId(cart));
 
 menuStr = menuBar(cart, database);
 
 // Create top items in view menu
 safef(buf, sizeof(buf), "../cgi-bin/hgTracks?%s&hgt.psOutput=on", uiVars);
 appendLink(&links, buf, "PDF/PS", "pdfLink", FALSE);
 safef(buf, sizeof(buf), "%s&o=%d&g=getDna&i=mixed&c=%s&l=%d&r=%d&db=%s&%s",
       hgcNameAndSettings(), winStart, chromName, winStart, winEnd, database, uiVars);
-appendLink(&links, buf, "DNA", "dnaLink", FALSE);
+//appendLink(&links, buf, "DNA", "dnaLink", FALSE);
+appendLinkWithShortcut(&links, buf, "DNA", "dnaLink", "Show DNA sequence in view", "v d", FALSE, FALSE);
 safef(buf, sizeof(buf), "../cgi-bin/hgConvert?hgsid=%s&db=%s", cartSessionId(cart), database);
 appendLink(&links, buf, "In Other Genomes (Convert)", "convertMenuLink", FALSE);
 
 // add the sendTo menu
 if (fileExists("extTools.ra"))
     {
-    appendLinkWithOnclick(&links, "#", "In External Tools", "extToolLink", "Show current sequence on a third-party website", "showExtToolDialog(); return false;", FALSE, FALSE);
+    appendLinkWithOnclick(&links, "#", "In External Tools", "extToolLink", "Show current sequence on a third-party website", "showExtToolDialog(); return false;", "s t", FALSE, FALSE);
     }
 
 
 // Add link-outs to other dbs as appropriate for this assembly
 if (differentWord(database,"susScr2"))
     {
     /* Print Ensembl anchor for latest assembly of organisms we have
      * supported by Ensembl == if versionString from trackVersion exists */
     struct trackVersion *trackVersion = getTrackVersion(database, "ensGene");
 
     if ((conn != NULL) && sqlTableExists(conn, UCSC_TO_ENSEMBL))
         printEnsemblAnchor(database, NULL, chromName, winStart, winEnd, &links);
     else if (sameWord(database,"hg19"))
         {
         printEnsemblAnchor(database, NULL, chromName, winStart, winEnd, &links);
@@ -399,36 +413,36 @@
     {
     safef(buf, sizeof(buf), "http://ws170.wormbase.org/db/seq/gbrowse/wormbase?name=%s:%d-%d",
           skipChr(chromName), winStart+1, winEnd);
     appendLink(&links, buf, "WormBase", "wormbaseLink", TRUE);
     }
 else if (sameString(database, "ce2"))
     {
     safef(buf, sizeof(buf), "http://ws120.wormbase.org/db/seq/gbrowse/wormbase?name=%s:%d-%d",
           skipChr(chromName), winStart+1, winEnd);
     appendLink(&links, buf, "WormBase", "wormbaseLink", TRUE);
     }
 
 // finish View menu
 appendLink(&links, "", "", "", FALSE); // separator line
 safef(buf, sizeof(buf), "../cgi-bin/hgTracks?%s&hgTracksConfigPage=configure", uiVars);
-appendLink(&links, buf, "Configure Browser", "configureMenuLink", FALSE);
+appendLinkWithShortcut(&links, buf, "Configure Browser", "configureMenuLink", "Open configuration menu", "c f", FALSE, FALSE);
 
 // multi-region
-appendLinkWithOnclick(&links, "#", "Multi-Region", "multiRegionLink", "Show multi-region options", "popUpHgt.hgTracks('multi-region config'); return false;", FALSE, FALSE);
+appendLinkWithOnclick(&links, "#", "Multi-Region", "multiRegionLink", "Show multi-region options", "popUpHgt.hgTracks('multi-region config'); return false;", "", FALSE, FALSE);
 
 safef(buf, sizeof(buf), "../cgi-bin/hgTracks?%s&hgt.reset=on", uiVars);
-appendLink(&links, buf, "Default Tracks", "defaultTracksMenuLink", FALSE);
+appendLinkWithShortcut(&links, buf, "Default Tracks", "defaultTracksMenuLink", "Show only default tracks", "d t", FALSE, FALSE);
 safef(buf, sizeof(buf), "../cgi-bin/hgTracks?%s&hgt.defaultImgOrder=on", uiVars);
-appendLink(&links, buf, "Default Track Order", "defaultTrackOrderMenuLink", FALSE);
+appendLinkWithShortcut(&links, buf, "Default Track Order", "defaultTrackOrderMenuLink", "Re-order tracks to be in default order", "d o", FALSE, FALSE);
 appendLink(&links, "../cgi-bin/cartReset", "Reset All User Settings", "cartResetMenuLink", FALSE);
 
 struct dyString *viewMenu = dyStringCreate("<li class='menuparent' id='view'><span>View</span>\n<ul>\n");
 freeLinksAndConvert(links, viewMenu);
 dyStringAppend(viewMenu, "</ul>\n</li>\n");
 
 menuStr = replaceChars(menuStr, "<!-- OPTIONAL_VIEW_MENU -->", dyStringCannibalize(&viewMenu));
 menuStr = replaceChars(menuStr, "id=\"main-menu-whole\"", "id=\"hgTracks-main-menu-whole\"");
 menuStr = replaceChars(menuStr, "id=\"home-link\"", "id=\"hgTracks-home-link\"");
 hPuts(menuStr);
 freez(&menuStr);
 }