fa1f4526eb075b68d7a5454fc7abc8259b9cd44b
max
  Thu Sep 3 01:14:26 2015 -0700
moveing ext tools menu upwards and adding sep line, as per Jim's
suggestions, refs #15113

diff --git src/hg/hgTracks/menu.c src/hg/hgTracks/menu.c
index 2a0c7f2..3e66114 100644
--- src/hg/hgTracks/menu.c
+++ src/hg/hgTracks/menu.c
@@ -9,30 +9,31 @@
 #include "agpFrag.h"
 #include "ctgPos.h"
 #include "hCommon.h"
 #include "htmshell.h"
 #include "hash.h"
 #include "liftOver.h"
 #include "wikiLink.h"
 #include "web.h"
 #include "geoMirror.h"
 #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;
     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
@@ -160,73 +161,88 @@
 }
 
 void freeLinksAndConvert(struct hotLink *links, struct dyString *menuHtml)
 /* convert the links to html strings and append to the dyString "menu", destroying the links */
 {
 int len = slCount(links);
 int i = 0;
 struct hotLink *link = NULL;
 for(i = 0, link = links; link != NULL; i++, link = link->next)
     {
     char class[100];
     if(i == 0)
         safef(class, sizeof(class), "first");
     else if (i + 1 == len)
         safef(class, sizeof(class), "last");
+    else if (isEmpty(link->name))
+        safef(class, sizeof(class), "horizSep");
     else
         class[0] = 0;
     dyStringAppend(menuHtml, "<li");
     char *encodedName = htmlEncode(link->name);
     if(*class)
         dyStringPrintf(menuHtml, " class='%s'", class);
-    dyStringPrintf(menuHtml, "><a href='%s' ", link->url);
+    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></li>\n", link->id, 
+        dyStringPrintf(menuHtml, "id='%s'%s>%s</a>\n", link->id, 
             link->external ? " TARGET='_blank'" : "", encodedName);
+        }
+    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);
 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 tool", "Show current region on a third-party website", "extToolLink", "showExtToolDialog(); return false;", 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);
         }
     else if (sameWord(database,"hg18"))
         {
@@ -381,39 +397,34 @@
     }
 else if (sameString(database, "ce4"))
     {
     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);
 safef(buf, sizeof(buf), "../cgi-bin/hgTracks?%s&hgt.reset=on", uiVars);
 appendLink(&links, buf, "Default Tracks", "defaultTracksMenuLink", FALSE);
 safef(buf, sizeof(buf), "../cgi-bin/hgTracks?%s&hgt.defaultImgOrder=on", uiVars);
 appendLink(&links, buf, "Default Track Order", "defaultTrackOrderMenuLink", FALSE);
 appendLink(&links, "../cgi-bin/cartReset", "Reset All User Settings", "cartResetMenuLink", FALSE);
 
-// add the sendTo menu
-if (fileExists("extTools.ra"))
-    {
-    appendLinkWithOnclick(&links, "#", "In external tool", "Show current region on a third-party website", "extToolLink", "showExtToolDialog()", FALSE, 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);
 }