static void iMatrixDrawFill(Ihandle* ih, int x1, int x2, int y1, int y2, int marked, int active, int lin, int col, const char* value, long framecolor) { int empty, fill=0; iupStrToInt(value, &fill); if (fill < 0) fill = 0; if (fill > 100) fill = 100; /* Create an space between text and cell frame */ x1 += IMAT_PADDING_W/2; x2 -= IMAT_PADDING_W/2; y1 += IMAT_PADDING_H/2; y2 -= IMAT_PADDING_H/2; empty = ((x2-x1)*(100-fill))/100; /* Fill the box with the color */ iMatrixDrawSetFgColor(ih, lin, col, marked, active); iupMATRIX_BOX(ih, x1, x2 - empty, y1, y2); if (ih->data->show_fill_value) { int y = (int)((y1 + y2) / 2.0 - 0.5); int empty1 = ((x2-x1)*fill)/100; char text[50]; sprintf(text, "%d%%", fill); IupCdSetFont(ih, ih->data->cd_canvas, iupMatrixGetFont(ih, lin, col)); cdCanvasTextAlignment(ih->data->cd_canvas, CD_CENTER); iMatrixDrawSetCellClipping(ih, x1 + empty1, x2, y1, y2); iupMATRIX_TEXT(ih, (x1 + x2) / 2, y, text); iMatrixDrawResetCellClipping(ih); iMatrixDrawSetBgColor(ih, lin, col, marked, active); iMatrixDrawSetCellClipping(ih, x1, x2 - empty, y1, y2); iupMATRIX_TEXT(ih, (x1 + x2) / 2, y, text); iMatrixDrawResetCellClipping(ih); } /* Draw the frame */ cdCanvasForeground(ih->data->cd_canvas, framecolor); iupMATRIX_RECT(ih, x1, x2, y1, y2); }
/* Put the cell contents in the screen, using the specified color and alignment. -> y1, y2 : vertical limits of the cell -> x1, x2 : horizontal limits of the complete cell -> alignment : alignment type (horizontal) assigned to the text. The options are: [IMAT_T_CENTER,IMAT_T_LEFT,IMAT_T_RIGHT] -> marked : mark state -> lin, col - cell coordinates */ static void iMatrixDrawCellValue(Ihandle* ih, int x1, int x2, int y1, int y2, int alignment, int marked, int active, int lin, int col, IFniiiiiiC draw_cb) { char *text; /* avoid drawing over the frame of the next cell */ x2 -= IMAT_FRAME_W/2; y2 -= IMAT_FRAME_H/2; /* avoid drawing over the frame of the cell */ x2 -= IMAT_FRAME_W/2; y2 -= IMAT_FRAME_H/2; if (lin==0 || col==0) { /* avoid drawing over the frame of the cell */ x1 += IMAT_FRAME_W/2; y1 += IMAT_FRAME_H/2; if (col==0) x1 += IMAT_FRAME_W/2; if (lin==0) y1 += IMAT_FRAME_H/2; } else if ((col==1 && ih->data->columns.sizes[0] == 0) || (lin==1 && ih->data->lines.sizes[0] == 0)) { /* avoid drawing over the frame of the cell */ x1 += IMAT_FRAME_W/2; y1 += IMAT_FRAME_H/2; } if (draw_cb && !iMatrixDrawCallDrawCB(ih, lin, col, x1, x2, y1, y2, draw_cb)) return; text = iupMatrixCellGetValue(ih, lin, col); /* Put the text */ if (text && *text) { int num_line, line_height, total_height; int charheight, ypos, hidden_text_marks = 0; num_line = iupStrLineCount(text); iupdrvFontGetCharSize(ih, NULL, &charheight); line_height = charheight; total_height = (line_height + IMAT_PADDING_H/2) * num_line - IMAT_PADDING_H/2 - IMAT_FRAME_H/2; if (lin==0 || ih->data->hidden_text_marks) { int text_w; iupdrvFontGetMultiLineStringSize(ih, text, &text_w, NULL); if (text_w > x2 - x1 + 1 - IMAT_PADDING_W - IMAT_FRAME_W) { if (lin == 0) alignment = IMAT_T_LEFT; if (ih->data->hidden_text_marks) hidden_text_marks = 1; } } /* Set the color used to draw the text */ if (!active) cdCanvasForeground(ih->data->cddbuffer, IMAT_CD_INACTIVE_FGCOLOR); else iMatrixDrawSetFgColor(ih, lin, col, marked); /* Set the clip area to the cell region informed, the text maybe greatter than the cell */ if (hidden_text_marks) { int crop = iupdrvFontGetStringWidth(ih, "...") + 2; iMatrixDrawSetCellClipping(ih, x1, x2-crop, y1, y2); } else iMatrixDrawSetCellClipping(ih, x1, x2, y1, y2); cdCanvasNativeFont(ih->data->cddbuffer, iupMatrixGetFont(ih, lin, col)); /* Create an space between text and cell frame */ x1 += IMAT_PADDING_W/2; x2 -= IMAT_PADDING_W/2; y1 += IMAT_PADDING_H/2; y2 -= IMAT_PADDING_H/2; if (alignment == IMAT_T_CENTER) cdCanvasTextAlignment(ih->data->cddbuffer, CD_CENTER); else if(alignment == IMAT_T_LEFT) cdCanvasTextAlignment(ih->data->cddbuffer, CD_WEST); else cdCanvasTextAlignment(ih->data->cddbuffer, CD_EAST); if (num_line == 1) { ypos = (int)((y1 + y2) / 2.0 - 0.5); /* Put the text */ if (alignment == IMAT_T_CENTER) iupMATRIX_TEXT(ih, (x1 + x2) / 2, ypos, text); else if(alignment == IMAT_T_LEFT) iupMATRIX_TEXT(ih, x1, ypos, text); else iupMATRIX_TEXT(ih, x2, ypos, text); } else { int i; char *p, *q, *newtext; newtext = iupStrDup(text); p = newtext; /* Get the position of the first text to be put in the screen */ ypos = (int)( (y1 + y2) / 2.0 - 0.5) - total_height/2 + line_height/2; for(i = 0; i < num_line; i++) { q = strchr(p, '\n'); if (q) *q = 0; /* Cut the string to contain only one line */ /* Draw the text */ if(alignment == IMAT_T_CENTER) iupMATRIX_TEXT(ih, (x1 + x2) / 2, ypos, p); else if(alignment == IMAT_T_LEFT) iupMATRIX_TEXT(ih, x1, ypos, p); else iupMATRIX_TEXT(ih, x2, ypos, p); /* Advance the string */ if (q) p = q + 1; /* Advance a line */ ypos += line_height + IMAT_PADDING_H/2; } free(newtext); } iMatrixDrawResetCellClipping(ih); if (hidden_text_marks) { cdCanvasTextAlignment(ih->data->cddbuffer, CD_EAST); ypos = (int)((y1 + y2) / 2.0 - 0.5); iupMATRIX_TEXT(ih, x2+IMAT_PADDING_W/2, ypos, "..."); } } }
static void iMatrixDrawText(Ihandle* ih, int x1, int x2, int y1, int y2, int alignment, int marked, int active, int lin, int col, const char* text) { int num_line, line_height, total_height; int charheight, y, hidden_text_marks = 0; num_line = iupStrLineCount(text); iupdrvFontGetCharSize(ih, NULL, &charheight); line_height = charheight; total_height = (line_height + IMAT_PADDING_H/2) * num_line - IMAT_PADDING_H/2 - IMAT_FRAME_H/2; if (lin==0 || ih->data->hidden_text_marks) { int text_w; iupdrvFontGetMultiLineStringSize(ih, text, &text_w, NULL); if (text_w > x2 - x1 + 1 - IMAT_PADDING_W - IMAT_FRAME_W) { if (lin == 0) alignment = IMAT_ALIGN_LEFT; if (ih->data->hidden_text_marks) hidden_text_marks = 1; } } /* Set the color used to draw the text */ iMatrixDrawSetFgColor(ih, lin, col, marked, active); /* Set the clip area to the cell region informed, the text maybe greatter than the cell */ if (hidden_text_marks) { int crop = iupdrvFontGetStringWidth(ih, "...") + 2; iMatrixDrawSetCellClipping(ih, x1, x2-crop, y1, y2); } else iMatrixDrawSetCellClipping(ih, x1, x2, y1, y2); IupCdSetFont(ih, ih->data->cd_canvas, iupMatrixGetFont(ih, lin, col)); /* Create an space between text and cell frame */ x1 += IMAT_PADDING_W/2; x2 -= IMAT_PADDING_W/2; y1 += IMAT_PADDING_H/2; y2 -= IMAT_PADDING_H/2; if (alignment == IMAT_ALIGN_CENTER) cdCanvasTextAlignment(ih->data->cd_canvas, CD_CENTER); else if(alignment == IMAT_ALIGN_LEFT) cdCanvasTextAlignment(ih->data->cd_canvas, CD_WEST); else /* RIGHT */ cdCanvasTextAlignment(ih->data->cd_canvas, CD_EAST); if (num_line == 1) { y = (int)((y1 + y2) / 2.0 - 0.5); /* Put the text */ if (alignment == IMAT_ALIGN_CENTER) iupMATRIX_TEXT(ih, (x1 + x2) / 2, y, text); else if(alignment == IMAT_ALIGN_LEFT) iupMATRIX_TEXT(ih, x1, y, text); else /* RIGHT */ iupMATRIX_TEXT(ih, x2, y, text); } else { int i; char *p, *q, *newtext; newtext = iupStrDup(text); p = newtext; /* Get the position of the first text to be put in the screen */ y = (int)( (y1 + y2) / 2.0 - 0.5) - total_height/2 + line_height/2; for(i = 0; i < num_line; i++) { q = strchr(p, '\n'); if (q) *q = 0; /* Cut the string to contain only one line */ /* Draw the text */ if(alignment == IMAT_ALIGN_CENTER) iupMATRIX_TEXT(ih, (x1 + x2) / 2, y, p); else if(alignment == IMAT_ALIGN_LEFT) iupMATRIX_TEXT(ih, x1, y, p); else /* RIGHT */ iupMATRIX_TEXT(ih, x2, y, p); /* Advance the string */ if (q) p = q + 1; /* Advance a line */ y += line_height + IMAT_PADDING_H/2; } free(newtext); } iMatrixDrawResetCellClipping(ih); if (hidden_text_marks) { cdCanvasTextAlignment(ih->data->cd_canvas, CD_EAST); y = (int)((y1 + y2) / 2.0 - 0.5); iupMATRIX_TEXT(ih, x2+IMAT_PADDING_W/2, y, "..."); } }
static void iMatrixDrawText(Ihandle* ih, int x1, int x2, int y1, int y2, int col_alignment, int lin_alignment, int marked, int active, int lin, int col, const char* text) { int text_alignment; int charheight, x, y, hidden_text_marks = 0; iupdrvFontGetCharSize(ih, NULL, &charheight); if (lin==0 || ih->data->hidden_text_marks) { int text_w; iupdrvFontGetMultiLineStringSize(ih, text, &text_w, NULL); if (text_w > x2 - x1 + 1 - IMAT_PADDING_W - IMAT_FRAME_W) { if (lin == 0) col_alignment = IMAT_ALIGN_START; if (ih->data->hidden_text_marks) hidden_text_marks = 1; } } /* Set the color used to draw the text */ iMatrixDrawSetFgColor(ih, lin, col, marked, active); /* Set the clip area to the cell region informed, the text maybe greater than the cell */ if (hidden_text_marks) { int crop = iupdrvFontGetStringWidth(ih, "...") + 2; iMatrixDrawSetCellClipping(ih, x1, x2-crop, y1, y2); } else iMatrixDrawSetCellClipping(ih, x1, x2, y1, y2); IupCdSetFont(ih, ih->data->cd_canvas, iupMatrixGetFont(ih, lin, col)); /* Create an space between text and cell frame */ x1 += IMAT_PADDING_W/2; x2 -= IMAT_PADDING_W/2; y1 += IMAT_PADDING_H/2; y2 -= IMAT_PADDING_H/2; iMatrixGetCellAlign(ih, lin, col, &col_alignment, &lin_alignment); if (lin_alignment == IMAT_ALIGN_CENTER) { y = iupROUND((y1 + y2) / 2.0); if (col_alignment == IMAT_ALIGN_CENTER) { x = iupROUND((x1 + x2) / 2.0); text_alignment = CD_CENTER; } else if (col_alignment == IMAT_ALIGN_START) { x = x1; text_alignment = CD_WEST; } else /* RIGHT */ { x = x2; text_alignment = CD_EAST; } } else if (lin_alignment == IMAT_ALIGN_START) { y = y1; if (col_alignment == IMAT_ALIGN_CENTER) { x = iupROUND((x1 + x2) / 2.0); text_alignment = CD_NORTH; } else if (col_alignment == IMAT_ALIGN_START) { x = x1; text_alignment = CD_NORTH_WEST; } else /* RIGHT */ { x = x2; text_alignment = CD_NORTH_EAST; } } else /* lin_alignment == IMAT_ALIGN_END */ { y = y2; if (col_alignment == IMAT_ALIGN_CENTER) { x = iupROUND((x1 + x2) / 2.0); text_alignment = CD_SOUTH; } else if (col_alignment == IMAT_ALIGN_START) { x = x1; text_alignment = CD_SOUTH_WEST; } else /* RIGHT */ { x = x2; text_alignment = CD_SOUTH_EAST; } } cdCanvasTextAlignment(ih->data->cd_canvas, text_alignment); iupMATRIX_TEXT(ih, x, y, text); iMatrixDrawResetCellClipping(ih); if (hidden_text_marks) { cdCanvasTextAlignment(ih->data->cd_canvas, CD_EAST); y = (int)((y1 + y2) / 2.0 - 0.5); x = x2 + IMAT_PADDING_W / 2; iupMATRIX_TEXT(ih, x, y, "..."); } }