/* default attributes */
#define DEFAULT_COLOR "black"
+#define DEFAULT_ACTIVEPENCOLOR "yellow"
+#define DEFAULT_ACTIVEFILLCOLOR "yellow"
#define DEFAULT_FONTSIZE 14.0
#define DEFAULT_LABEL_FONTSIZE 11.0 /* for head/taillabel */
#define MIN_FONTSIZE 1.0
free(offspl.list);
free(tmpspl.list);
} else {
- if (color[0]) {
- gvrender_set_pencolor(job, color);
- gvrender_set_fillcolor(job, color);
- } else {
- gvrender_set_fillcolor(job, DEFAULT_COLOR);
+ if (ED_active(e)) {
+ color = late_nnstring(e, E_activepencolor, DEFAULT_ACTIVEPENCOLOR);
+ gvrender_set_pencolor(job, color);
+ color = late_nnstring(e, E_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
+ gvrender_set_fillcolor(job, color);
+ }
+ else {
+ if (color[0]) {
+ gvrender_set_pencolor(job, color);
+ gvrender_set_fillcolor(job, color);
+ } else {
+ gvrender_set_fillcolor(job, DEFAULT_COLOR);
+ }
}
for (i = 0; i < ED_spl(e)->size; i++) {
bz = ED_spl(e)->list[i];
int i, c, filled;
graph_t *sg;
point A[4];
- char *str, **style;
+ char *color, *str, **style;
node_t *n;
edge_t *e;
char *s, *url = NULL, *tooltip = NULL, *target = NULL;
break;
}
}
- if (((str = agget(sg, "pencolor")) != 0) && str[0])
- gvrender_set_pencolor(job, str);
- else if (((str = agget(sg, "color")) != 0) && str[0])
- gvrender_set_pencolor(job, str);
- /* bgcolor is supported for backward compatability */
- else if (((str = agget(sg, "bgcolor")) != 0) && str[0])
- gvrender_set_pencolor(job, str);
-
- str = 0;
- if (((str = agget(sg, "fillcolor")) != 0) && str[0])
- gvrender_set_fillcolor(job, str);
- else if (((str = agget(sg, "color")) != 0) && str[0])
- gvrender_set_fillcolor(job, str);
- /* bgcolor is supported for backward compatability */
- else if (((str = agget(sg, "bgcolor")) != 0) && str[0]) {
- filled = TRUE;
- gvrender_set_fillcolor(job, str);
+ if (GD_active(sg)) {
+ color = late_nnstring(sg, G_activepencolor, DEFAULT_ACTIVEPENCOLOR);
+ gvrender_set_pencolor(job, color);
+ color = late_nnstring(sg, G_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
+ gvrender_set_fillcolor(job, color);
+ }
+ else {
+ if (((color = agget(sg, "pencolor")) != 0) && color[0])
+ gvrender_set_pencolor(job, color);
+ else if (((color = agget(sg, "color")) != 0) && color[0])
+ gvrender_set_pencolor(job, color);
+ /* bgcolor is supported for backward compatability */
+ else if (((color = agget(sg, "bgcolor")) != 0) && color[0])
+ gvrender_set_pencolor(job, color);
+
+ color = 0;
+ if (((color = agget(sg, "fillcolor")) != 0) && color[0])
+ gvrender_set_fillcolor(job, color);
+ else if (((color = agget(sg, "color")) != 0) && color[0])
+ gvrender_set_fillcolor(job, color);
+ /* bgcolor is supported for backward compatability */
+ else if (((color = agget(sg, "bgcolor")) != 0) && color[0]) {
+ filled = TRUE;
+ gvrender_set_fillcolor(job, color);
+ }
}
A[0] = GD_bb(sg).LL;
A[2] = GD_bb(sg).UR;
EXTERN attrsym_t *g_l_draw;
EXTERN attrsym_t
+ *G_activepencolor, *G_activefillcolor,
*G_peripheries;
EXTERN attrsym_t
*N_height, *N_width, *N_shape, *N_color, *N_fillcolor,
+ *N_activepencolor, *N_activefillcolor,
*N_fontsize, *N_fontname, *N_fontcolor,
*N_label, *N_nojustify, *N_style, *N_showboxes,
*N_sides, *N_peripheries, *N_orientation,
*N_group, *N_comment, *N_vertices, *N_z;
EXTERN attrsym_t
*E_weight, *E_minlen, *E_color,
+ *E_activepencolor, *E_activefillcolor,
*E_fontsize, *E_fontname, *E_fontcolor,
*E_label, *E_dir, *E_style, *E_decorate,
*E_showboxes, *E_arrowsz, *E_constr, *E_layer,
return (s0 == s1);
}
+static
+void activepencolor(GVJ_t * job, node_t * n)
+{
+ char *color;
+
+ color = late_nnstring(n, N_activepencolor, DEFAULT_ACTIVEPENCOLOR);
+ gvrender_set_pencolor(job, color);
+}
+
+static
+void activefillcolor(GVJ_t * job, node_t * n)
+{
+ char *color;
+
+ color = late_nnstring(n, N_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
+ gvrender_set_fillcolor(job, color);
+}
+
static
void pencolor(GVJ_t * job, node_t * n)
{
pointf P, *vertices;
static point *A;
static int A_size;
- int filled;
+ boolean filled;
extern int xdemitState;
xdemitState = EMIT_DRAW;
} else {
style = stylenode(job, n);
}
- if (style & FILLED) {
- fillcolor(job, n); /* emit fill color */
- filled = 1;
- } else {
- filled = 0;
+ if (ND_active(n)) {
+ activefillcolor(job,n);
+ filled = TRUE;
+ activepencolor(job,n);
+ }
+ else {
+ if (style & FILLED) {
+ fillcolor(job, n); /* emit fill color */
+ filled = TRUE;
+ } else {
+ filled = FALSE;
+ }
+ pencolor(job, n); /* emit pen color */
}
- pencolor(job, n); /* emit pen color */
if (ND_shape(n)->usershape) {
for (i = 0; i < sides; i++) {
}
}
gvrender_user_shape(job, ND_shape(n)->name, A, sides, filled);
- filled = 0;
+ filled = FALSE;
}
/* if no boundary but filled, set boundary color to fill color */
if ((peripheries == 0) && filled) {
gvrender_polygon(job, A, sides, filled);
}
/* fill innermost periphery only */
- filled = 0;
+ filled = FALSE;
}
xdemitState = EMIT_LABEL;
textlabel_t *label; /* if the cluster has a title */
box bb; /* bounding box */
point border[4]; /* sizes of margins for graph labels */
- boolean has_labels, has_images;
+ boolean has_labels, has_images, active;
unsigned char charset; /* input character set */
int rankdir;
int ht1, ht2; /* below and above extremal ranks */
} Agraphinfo_t;
+#define GD_active(g) (g)->u.active
#define GD_alg(g) (g)->u.alg
#define GD_bb(g) (g)->u.bb
#define GD_border(g) (g)->u.border
void *alg;
char state;
boolean clustnode;
+ boolean active;
#ifndef DOT_ONLY
+ boolean pinned;
short xsize, ysize;
int id, heapindex, hops;
double *pos, dist;
- boolean pinned;
#endif
#ifndef NEATO_ONLY
boolean showboxes, has_port;
#define ND_UF_parent(n) (n)->u.UF_parent
#define ND_UF_size(n) (n)->u.UF_size
+#define ND_active(n) (n)->u.active
#define ND_alg(n) (n)->u.alg
#define ND_bb(n) (n)->u.bb
#define ND_clust(n) (n)->u.clust
char label_ontop;
edge_t *to_orig; /* for dot's shapes.c */
void *alg;
+ boolean active;
#ifndef DOT_ONLY
double factor;
} Agedgeinfo_t;
+#define ED_active(e) (e)->u.active
#define ED_alg(e) (e)->u.alg
#define ED_conc_opp_flag(e) (e)->u.conc_opp_flag
#define ED_count(e) (e)->u.count
#include <stdio.h>
+/*
#include "const.h"
#include "types.h"
#include "macros.h"
+*/
#include "render.h"
return (void *)g;
}
+static void gvevent_leave_obj(GVJ_t * job)
+{
+ void *obj = job->current_obj;
+
+ if (obj) {
+ switch (agobjkind(obj)) {
+ case AGGRAPH:
+ GD_active((graph_t*)obj) = FALSE;
+ break;
+ case AGNODE:
+ ND_active((node_t*)obj) = FALSE;
+ break;
+ case AGEDGE:
+ ED_active((edge_t*)obj) = FALSE;
+ break;
+ }
+ }
+}
+
+static void gvevent_enter_obj(GVJ_t * job)
+{
+ void *obj = job->current_obj;
+
+ if (obj) {
+ switch (agobjkind(obj)) {
+ case AGGRAPH:
+ GD_active((graph_t*)obj) = TRUE;
+ break;
+ case AGNODE:
+ ND_active((node_t*)obj) = TRUE;
+ break;
+ case AGEDGE:
+ ED_active((edge_t*)obj) = TRUE;
+ break;
+ }
+ }
+}
+
/* CLOSEENOUGH is in window units - probably should be a feature... */
#define CLOSEENOUGH 1
obj = gvevent_find_obj(job->g, b);
if (obj != job->current_obj) {
+ gvevent_leave_obj(job);
job->current_obj = obj;
-fprintf(stderr,"obj=%x kind=%d\n",obj,agobjkind(obj));
+ gvevent_enter_obj(job);
+ job->needs_refresh = 1;
}
}