]> granicus.if.org Git - graphviz/commitdiff
fix bug when tooltips are mapped without urls
authorellson <devnull@localhost>
Thu, 13 Jul 2006 18:09:42 +0000 (18:09 +0000)
committerellson <devnull@localhost>
Thu, 13 Jul 2006 18:09:42 +0000 (18:09 +0000)
lib/gvc/gvrender.c
plugin/core/gvrender_core_map.c

index 7df77e0b8cf0257eeaaa73ba7fe3db7c9b30fd83..5848321562742ea0738c1947b8abb18dd0104510 100644 (file)
@@ -369,6 +369,7 @@ static void gvrender_resolve_color(gvrender_features_t * features,
 void gvrender_begin_graph(GVJ_t * job, graph_t * g)
 {
     GVC_t *gvc = job->gvc;
+    int flags = job->flags;
     obj_state_t *obj;
     gvrender_engine_t *gvre = job->render.engine;
     textlabel_t *lab;
@@ -380,31 +381,44 @@ void gvrender_begin_graph(GVJ_t * job, graph_t * g)
 
     obj = push_obj_state(job);
     obj->g = g;
-    if ((job->flags & GVRENDER_DOES_LABELS) && ((lab = GD_label(g)))) {
+    if ((flags & GVRENDER_DOES_LABELS) && ((lab = GD_label(g)))) {
         if (lab->html)
             doHTMLlabel(lab->u.html, lab->p, (void *) g);
        obj->label = lab->text;
     }
-    if ((job->flags & GVRENDER_DOES_MAPS)
-        && (((s = agget(g, "href")) && s[0]) || ((s = agget(g, "URL")) && s[0]))) {
+    if ((flags & GVRENDER_DOES_MAPS)
+        && (((s = agget(g, "href")) && s[0])
+           || ((s = agget(g, "URL")) && s[0]))) {
         obj->url = strdup_and_subst_graph(s, g);
     } 
+    if (flags & GVRENDER_DOES_TOOLTIPS) {
+        if ((s = agget(g, "tooltip")) && s[0]) {
+            obj->tooltip = strdup_and_subst_graph(s, g);
+           obj->explicit_tooltip = true;
+       }
+       else if (obj->url && obj->label) {
+           obj->tooltip = strdup(obj->label);
+       }
+    } 
+    if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(g, "target")) && s[0])) {
+        obj->target = strdup_and_subst_graph(s, g);
+    }
 
     job->compscale.x = job->scale.x = job->zoom * job->dpi.x / POINTS_PER_INCH;
     job->compscale.y = job->scale.y = job->zoom * job->dpi.y / POINTS_PER_INCH;
     job->compscale.y *= (job->flags & GVRENDER_Y_GOES_DOWN) ? -1. : 1.;
     if (job->rotation) {
-        job->clip.UR.x = job->focus.x + sy + EPSILON;
-        job->clip.UR.y = job->focus.y + sx + EPSILON;
-        job->clip.LL.x = job->focus.x - sy - EPSILON;
-        job->clip.LL.y = job->focus.y - sx - EPSILON;
+       job->clip.UR.x = job->focus.x + sy + EPSILON;
+       job->clip.UR.y = job->focus.y + sx + EPSILON;
+       job->clip.LL.x = job->focus.x - sy - EPSILON;
+       job->clip.LL.y = job->focus.y - sx - EPSILON;
        job->offset.x = -job->focus.y * job->compscale.x + job->width * 3 / 2;
        job->offset.y = -job->focus.x * job->compscale.y + job->height / 2.;
     } else {
-        job->clip.UR.x = job->focus.x + sx + EPSILON;
-        job->clip.UR.y = job->focus.y + sy + EPSILON;
-        job->clip.LL.x = job->focus.x - sx - EPSILON;
-        job->clip.LL.y = job->focus.y - sy - EPSILON;
+       job->clip.UR.x = job->focus.x + sx + EPSILON;
+       job->clip.UR.y = job->focus.y + sy + EPSILON;
+       job->clip.LL.x = job->focus.x - sx - EPSILON;
+       job->clip.LL.y = job->focus.y - sy - EPSILON;
        job->offset.x = -job->focus.x * job->compscale.x + job->width / 2.;
        job->offset.y = -job->focus.y * job->compscale.y + job->height / 2.;
     }
@@ -437,7 +451,7 @@ void gvrender_begin_graph(GVJ_t * job, graph_t * g)
 #ifdef WITH_CODEGENS
     else {
        codegen_t *cg = job->codegen;
-       
+
        if (cg && cg->begin_graph)
            cg->begin_graph(gvc, g, job->canvasBox, gvc->pb);
     }
@@ -470,7 +484,8 @@ void gvrender_begin_page(GVJ_t * job)
     int nump = 0, flags = job->flags;
     pointf *p = NULL;
 
-    if (flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) {
+    if ((flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS))
+           && (obj->url || obj->explicit_tooltip)) {
         if (flags & (GVRENDER_DOES_MAP_RECTANGLE | GVRENDER_DOES_MAP_POLYGON)) {
            if (flags & GVRENDER_DOES_MAP_RECTANGLE) {
                obj->url_map_shape = MAP_RECTANGLE;
@@ -598,8 +613,15 @@ void gvrender_begin_cluster(GVJ_t * job, graph_t * sg)
     if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(sg, "target")) && s[0]))
        obj->target = strdup_and_subst_graph(s, sg);
 
-    if ((flags & GVRENDER_DOES_TOOLTIPS) && ((s = agget(sg, "tooltip")) && s[0]))
-        obj->tooltip = strdup_and_subst_graph(s, sg);
+    if (flags & GVRENDER_DOES_TOOLTIPS) {
+       if ((s = agget(sg, "tooltip")) && s[0]) {
+            obj->tooltip = strdup_and_subst_graph(s, sg);
+            obj->explicit_tooltip = true;
+       }
+       else if (obj->label) {
+           obj->tooltip = strdup(obj->label);
+       }
+    }
 
     if (flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) {
         if (flags & (GVRENDER_DOES_MAP_RECTANGLE | GVRENDER_DOES_MAP_POLYGON)) {
@@ -816,15 +838,19 @@ void gvrender_begin_node(GVJ_t * job, node_t * n)
         obj->url = strdup_and_subst_node(s, n);
     }
     if (flags & GVRENDER_DOES_TOOLTIPS) {
-        if ((s = agget(n, "tooltip")) && s[0])
+        if ((s = agget(n, "tooltip")) && s[0]) {
             obj->tooltip = strdup_and_subst_node(s, n);
-       else
+           obj->explicit_tooltip = true;
+       }
+       else {
            obj->tooltip = strdup(ND_label(n)->text);
+       }
     } 
     if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(n, "target")) && s[0])) {
         obj->target = strdup_and_subst_node(s, n);
     }
-    if (flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) {
+    if ((flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS))
+          && (obj->url || obj->explicit_tooltip)) {
 
         /* checking shape of node */
         shape = shapeOf(n);
index 64412c8a95e116dd3fe906e412c00791e1b055a9..495a5fe8128c1d9e377f47fbb98c81326f7b3dcb 100644 (file)
@@ -36,6 +36,9 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in
     static point *A;
     static int size_A;
 
+    if (!AF || !nump)
+       return;
+
     if (size_A < nump) {
        size_A = nump + 10;
        A = realloc(A, size_A * sizeof(point));
@@ -43,7 +46,7 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in
     for (i = 0; i < nump; i++)
        PF2P(AF[i], A[i]);
 
-    if (job->render.id == FORMAT_IMAP) {
+    if (job->render.id == FORMAT_IMAP && url && url[0]) {
         switch (map_shape) {
         case MAP_RECTANGLE:
            /* Y_GOES_DOWN so need UL to LR */
@@ -65,7 +68,7 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in
             break;
         }
 
-    } else if (job->render.id == FORMAT_ISMAP) {
+    } else if (job->render.id == FORMAT_ISMAP && url && url[0]) {
         switch (map_shape) {
         case MAP_RECTANGLE:
            /* Y_GOES_DOWN so need UL to LR */
@@ -163,13 +166,11 @@ static void map_end_page(GVJ_t * job)
 
     switch (job->render.id) {
     case FORMAT_CMAP:
-       if (obj->url && obj->url[0] && obj->url_map_p)
-           map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
+       map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
                                    obj->url, obj->tooltip, obj->target);
        break;
     case FORMAT_CMAPX:
-       if (obj->url && obj->url[0] && obj->url_map_p)
-           map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
+       map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
                                    obj->url, obj->tooltip, obj->target);
         fprintf(job->output_file, "</map>\n");
        break;
@@ -184,8 +185,7 @@ static void map_begin_cluster(GVJ_t * job)
 
     fprintf(job->output_file, "%% %s\n", obj->sg->name);
 
-    if (obj->url && obj->url[0] && obj->url_map_p)
-        map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n,
+    map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n,
                obj->url, obj->tooltip, obj->target);
 }
 
@@ -193,8 +193,7 @@ static void map_begin_node(GVJ_t * job)
 {
     obj_state_t *obj = job->obj;
 
-    if (obj->url && obj->url[0] && obj->url_map_p)
-        map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
+    map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n,
                obj->url, obj->tooltip, obj->target);
 }
 
@@ -204,30 +203,21 @@ map_begin_edge(GVJ_t * job)
     obj_state_t *obj = job->obj;
     int i, j = 0;
 
-    if (obj->url && obj->url[0] && obj->url_map_p)
-        map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n,
+    map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n,
                obj->url, obj->tooltip, obj->target);
-
-    if (obj->tailurl && obj->tailurl[0] && obj->tailurl_map_p)
-        map_output_shape(job, MAP_RECTANGLE, obj->tailurl_map_p, 2,
+    map_output_shape(job, MAP_RECTANGLE, obj->tailurl_map_p, 2,
                obj->tailurl, obj->tailtooltip, obj->tailtarget);
-    if (obj->headurl && obj->headurl[0] && obj->headurl_map_p)
-        map_output_shape(job, MAP_RECTANGLE, obj->headurl_map_p, 2,
+    map_output_shape(job, MAP_RECTANGLE, obj->headurl_map_p, 2,
                obj->headurl, obj->headtooltip, obj->headtarget);
-
-    if (obj->url && obj->url[0] && obj->tailendurl_map_p)
-        map_output_shape(job, MAP_RECTANGLE, obj->tailendurl_map_p,2, 
+    map_output_shape(job, MAP_RECTANGLE, obj->tailendurl_map_p,2, 
                obj->url, obj->tooltip, obj->target);
-    if (obj->url && obj->url[0] && obj->headendurl_map_p)
-        map_output_shape(job, MAP_RECTANGLE, obj->headendurl_map_p, 2,
+    map_output_shape(job, MAP_RECTANGLE, obj->headendurl_map_p, 2,
                obj->url, obj->tooltip, obj->target);
-
-    if (obj->url && obj->url[0]) {
-        for (i = 0; i < obj->url_bsplinemap_poly_n; i++) {
-            map_output_shape(job, MAP_POLYGON, obj->url_bsplinemap_p+j, obj->url_bsplinemap_n[i],
-                    obj->url, obj->tooltip, obj->target);
-           j += obj->url_bsplinemap_n[i];
-        }
+    for (i = 0; i < obj->url_bsplinemap_poly_n; i++) {
+        map_output_shape(job, MAP_POLYGON,
+               obj->url_bsplinemap_p+j, obj->url_bsplinemap_n[i],
+               obj->url, obj->tooltip, obj->target);
+       j += obj->url_bsplinemap_n[i];
     }
 }