static void etgc_add_array (ETableGroup *etg, const int *array, int count) { int i; ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg); void *lastval = NULL; int laststart = 0; GCompareFunc comp = etgc->ecol->compare; ETableGroupContainerChildNode *child_node; ETableGroup *child; if (count <= 0) return; e_table_group_container_list_free (etgc); etgc->children = NULL; lastval = e_table_model_value_at (etg->model, etgc->ecol->col_idx, array[0]); for (i = 1; i < count; i++) { void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, array[i]); int comp_val; comp_val = (*comp)(lastval, val); if (comp_val != 0) { child_node = create_child_node(etgc, lastval); child = child_node->child; e_table_group_add_array(child, array + laststart, i - laststart); child_node->count = i - laststart; etgc->children = g_list_append (etgc->children, child_node); compute_text (etgc, child_node); laststart = i; lastval = val; } } child_node = create_child_node(etgc, lastval); child = child_node->child; e_table_group_add_array(child, array + laststart, i - laststart); child_node->count = i - laststart; etgc->children = g_list_append (etgc->children, child_node); compute_text (etgc, child_node); e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc)); }
static gboolean etgc_remove (ETableGroup *etg, gint row) { ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER(etg); GList *list; for (list = etgc->children ; list; list = g_list_next (list)) { ETableGroupContainerChildNode *child_node = list->data; ETableGroup *child = child_node->child; if (e_table_group_remove (child, row)) { child_node->count --; if (child_node->count == 0) { e_table_group_container_child_node_free (etgc, child_node); etgc->children = g_list_remove (etgc->children, child_node); g_free (child_node); } else compute_text (etgc, child_node); e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc)); return TRUE; } } return FALSE; }
static void mbr_update_data(Mbr *mbr) { Connection *conn = &mbr->connection; DiaObject *obj = &conn->object; Rectangle rect; Point p1,p2; Point p3,p4; gchar *text; /* Too complex to easily decide -- this is essentially a bezier curve */ /* if (connpoint_is_autogap(conn->endpoint_handles[0].connected_to) || connpoint_is_autogap(conn->endpoint_handles[1].connected_to)) { connection_adjust_for_autogap(conn); } */ obj->position = conn->endpoints[0]; mbr->pm_handle.pos = mbr->pm; connection_update_handles(conn); connection_update_boundingbox(conn); /* text width */ text=compute_text(mbr); mbr->text_width = dia_font_string_width(text, mbr_font, MBR_DECFONTHEIGHT); mbr->text_ascent = dia_font_ascent(text, mbr_font, MBR_DECFONTHEIGHT); /* endpoint */ p1 = conn->endpoints[0]; p2 = conn->endpoints[1]; /* bezier */ compute_line(&p1,&p2,&mbr->pm,mbr->line); /* Add boundingbox for mid decoration (slightly overestimated) : */ p3.x=mbr->pm.x-MBR_DEC_SIZE; p3.y=mbr->pm.y-MBR_DEC_SIZE; p4.x=p3.x+MBR_DEC_SIZE*2; p4.y=p3.y+MBR_DEC_SIZE*2; rect.left=p3.x; rect.right=p4.x; rect.top=p3.y; rect.bottom=p4.y; rectangle_union(&obj->bounding_box, &rect); /* Add boundingbox for text: */ rect.left = mbr->pm.x-mbr->text_width/2; rect.right = rect.left + mbr->text_width; rect.top = mbr->pm.y - mbr->text_ascent; rect.bottom = rect.top + MBR_DECFONTHEIGHT; rectangle_union(&obj->bounding_box, &rect); g_free(text); /* free auxilliary text */ }
static void etgc_add (ETableGroup *etg, gint row) { ETableGroupContainer *etgc = E_TABLE_GROUP_CONTAINER (etg); void *val = e_table_model_value_at (etg->model, etgc->ecol->col_idx, row); GCompareFunc comp = etgc->ecol->compare; GList *list = etgc->children; ETableGroup *child; ETableGroupContainerChildNode *child_node; int i = 0; for (; list; list = g_list_next (list), i++){ int comp_val; child_node = list->data; comp_val = (*comp)(child_node->key, val); if (comp_val == 0) { child = child_node->child; child_node->count ++; e_table_group_add (child, row); compute_text (etgc, child_node); return; } if ((comp_val > 0 && etgc->ascending) || (comp_val < 0 && (!etgc->ascending))) break; } child_node = create_child_node (etgc, val); child = child_node->child; child_node->count = 1; e_table_group_add (child, row); if (list) etgc->children = g_list_insert (etgc->children, child_node, i); else etgc->children = g_list_append (etgc->children, child_node); compute_text (etgc, child_node); e_canvas_item_request_reflow (GNOME_CANVAS_ITEM (etgc)); }
/* drawing here -- TBD inverse flow ?? */ static void mbr_draw(Mbr *mbr, DiaRenderer *renderer) { DiaRendererClass *renderer_ops = DIA_RENDERER_GET_CLASS (renderer); Point *endpoints; Point p1,p2,pm1,pm2; Point pa1,pa2; Arrow arrow; gchar *annot; double k,dx,dy,dxn,dyn,dxp,dyp; /* some asserts */ assert(mbr != NULL); assert(renderer != NULL); /* arrow type */ if (mbr->type!=MBR_CONFLICTS) arrow.type = ARROW_FILLED_TRIANGLE; else arrow.type = ARROW_NONE; arrow.length = MBR_ARROWLEN; arrow.width = MBR_ARROWWIDTH; endpoints = &mbr->connection.endpoints[0]; /* some computations */ p1 = endpoints[0]; /* could reverse direction here */ p2 = endpoints[1]; /** drawing directed line **/ renderer_ops->set_linewidth(renderer, MBR_WIDTH); renderer_ops->set_linecaps(renderer, LINECAPS_BUTT); renderer_ops->set_linestyle(renderer, LINESTYLE_SOLID); dx=p1.x-p2.x; dy=p1.y-p2.y; k=sqrt(dx*dx+dy*dy)*2/MBR_DEC_SIZE; if (k<0.05) { /* bug fix for closed bezier */ renderer_ops->draw_line_with_arrows(renderer,&p1,&p2,MBR_WIDTH,&MBR_FG_COLOR,NULL, &arrow); } else { renderer_ops->draw_bezier_with_arrows(renderer, mbr->line, 3, MBR_WIDTH, &MBR_FG_COLOR, NULL, &arrow); } /** drawing vector decoration **/ /* red line for obstruction */ k=k*2/MBR_DEC_SIZE; dxn=dx/k; dyn=dy/k; dxp=-dyn; dyp=dxn; if (mbr->type==MBR_OBSTRUCTS) { pm1.x=mbr->pm.x-dxp; pm1.y=mbr->pm.y-dyp; pm2.x=mbr->pm.x+dxp; pm2.y=mbr->pm.y+dyp; renderer_ops->set_linewidth(renderer, MBR_WIDTH*2); renderer_ops->draw_line_with_arrows(renderer,&pm1,&pm2,MBR_WIDTH,&MBR_RED_COLOR,NULL,NULL); } if (mbr->type==MBR_CONFLICTS) { pm1.x=mbr->pm.x-dxn-dxp; pm1.y=mbr->pm.y-dyn-dyp; pm2.x=mbr->pm.x+dxn+dxp; pm2.y=mbr->pm.y+dyn+dyp; renderer_ops->set_linewidth(renderer, MBR_WIDTH*2); renderer_ops->draw_line_with_arrows(renderer,&pm1,&pm2,MBR_WIDTH,&MBR_RED_COLOR,NULL,NULL); pm1.x=mbr->pm.x-dxn+dxp; pm1.y=mbr->pm.y-dyn+dyp; pm2.x=mbr->pm.x+dxn-dxp; pm2.y=mbr->pm.y+dyn-dyp; renderer_ops->draw_line_with_arrows(renderer,&pm1,&pm2,MBR_WIDTH,&MBR_RED_COLOR,NULL,NULL); } /** writing decoration text **/ annot=compute_text(mbr); renderer_ops->set_font(renderer, mbr_font, MBR_DECFONTHEIGHT); if (annot && strlen(annot) != 0) { pa1.x=mbr->pm.x-mbr->text_width/2; pa1.y=mbr->pm.y-mbr->text_ascent +0.1; /* with some fix... */ pa2.x=pa1.x+mbr->text_width; pa2.y=pa1.y+MBR_DECFONTHEIGHT +0.1; /* with some fix... */ renderer_ops->fill_rect(renderer,&pa1,&pa2,&color_white); renderer_ops->draw_string(renderer,annot,&mbr->pm,ALIGN_CENTER,&MBR_FG_COLOR); } g_free(annot); }