static void iMatrixDrawFrameRectTitle(Ihandle* ih, int lin, int col, int x1, int x2, int y1, int y2, long framecolor, int framehighlight) { /* avoid drawing over the frame of the next cell */ x2 -= IMAT_FRAME_W/2; y2 -= IMAT_FRAME_H/2; /********************* VERTICAL *************************/ /* right vertical line */ iMatrixDrawFrameVertLineCell(ih, lin, col, x2, y1, y2, framecolor); if (col==0) { /* left vertical line */ iMatrixDrawFrameVertLineCell(ih, lin, col, x1, y1, y2, framecolor); x1++; } else if (col==1 && ih->data->columns.dt[0].size == 0) { /* If does not have line titles then draw the left vertical line */ iMatrixDrawFrameVertLineCell(ih, lin, col-1, x1, y1, y2, framecolor); x1++; } /* Titles have a bright vertical line near the frame, at left */ if (framehighlight) iMatrixDrawFrameVertLineHighlight(ih, lin, col, x1, y1+1, y2-1, framecolor); /********************* HORIZONTAL *************************/ /* bottom horizontal line */ iMatrixDrawFrameHorizLineCell(ih, lin, col, x1, x2, y2, framecolor); if (lin==0) { /* top horizontal line */ iMatrixDrawFrameHorizLineCell(ih, lin, col, x1, x2, y1, framecolor); y1++; } else if (lin==1 && ih->data->lines.dt[0].size == 0) { /* If does not have column titles then draw the top horizontal line */ iMatrixDrawFrameHorizLineCell(ih, lin-1, col, x1, x2-1, y1, framecolor); y1++; } /* Titles have a bright horizontal line near the frame, at top */ if (framehighlight) iMatrixDrawFrameHorizLineHighlight(ih, lin, col, x1, x2-1, y1, framecolor); }
static void iMatrixDrawFrameRectTitle(Ihandle* ih, int lin, int col, int x1, int x2, int y1, int y2, long framecolor, char* str) { /* avoid drawing over the frame of the next cell */ x2 -= IMAT_FRAME_W/2; y2 -= IMAT_FRAME_H/2; /* right line */ iMatrixDrawFrameVertLineCell(ih, lin, col, x2, y1, y2, framecolor, str); if (col==0) { /* left line */ cdCanvasForeground(ih->data->cddbuffer, framecolor); iupMATRIX_LINE(ih, x1, y1, x1, y2); x1++; } else if (col==1 && ih->data->columns.sizes[0] == 0) { /* If does not have line titles then draw the >> left line << of the cell frame */ iMatrixDrawFrameVertLineCell(ih, lin, col-1, x1, y1, y2-1, framecolor, str); x1++; } /* Titles have a white line near the frame, at left */ cdCanvasForeground(ih->data->cddbuffer, CD_WHITE); iupMATRIX_LINE(ih, x1, y1+1, x1, y2-1); /* bottom line */ iMatrixDrawFrameHorizLineCell(ih, lin, col, x1, x2, y2, framecolor, str); if (lin==0) { /* top line */ cdCanvasForeground(ih->data->cddbuffer, framecolor); iupMATRIX_LINE(ih, x1, y1, x2, y1); y1++; } else if (lin==1 && ih->data->lines.sizes[0] == 0) { /* If does not have column titles then draw the >> top line << of the cell frame */ iMatrixDrawFrameHorizLineCell(ih, lin-1, col, x1, x2-1, y1, framecolor, str); y1++; } /* Titles have a white line near the frame, at top */ cdCanvasForeground(ih->data->cddbuffer, CD_WHITE); iupMATRIX_LINE(ih, x1, y1, x2-1, y1); }
static void iMatrixDrawFrameRectCell(Ihandle* ih, int lin, int col, int x1, int x2, int y1, int y2, long framecolor, char* str) { if (col==1 && ih->data->columns.sizes[0] == 0) { /* If does not have line titles then draw the >> left line << of the cell frame */ iMatrixDrawFrameVertLineCell(ih, lin, col-1, x1, y1, y2-1, framecolor, str); } if (lin==1 && ih->data->lines.sizes[0] == 0) { /* If does not have column titles then draw the >> top line << of the cell frame */ iMatrixDrawFrameHorizLineCell(ih, lin-1, col, x1, x2-1, y1, framecolor, str); } /* bottom line */ iMatrixDrawFrameHorizLineCell(ih, lin, col, x1, x2-1, y2-1, framecolor, str); /* right line */ iMatrixDrawFrameVertLineCell(ih, lin, col, x2-1, y1, y2-2, framecolor, str); }
static void iMatrixDrawFrameRectTitle(Ihandle* ih, int lin, int col, int x1, int x2, int y1, int y2, long framecolor, char* str) { /* avoid drawing over the frame of the next cell */ x2 -= IMAT_FRAME_W/2; y2 -= IMAT_FRAME_H/2; iMatrixDrawFrameVertLineCell(ih, lin, col, x2, y1, y2, framecolor, str); /* right vertical line */ if (col==0) IUPMAT_LINE(ih, x1, y1, x1, y2); /* left vertical line, reuse Foreground from previous call */ if (col==0) x1++; cdCanvasForeground(ih->data->cddbuffer, CD_WHITE); IUPMAT_LINE(ih, x1, y1+1, x1, y2-1); iMatrixDrawFrameHorizLineCell(ih, lin, col, x1, x2, y2, framecolor, str); /* bottom horizontal line */ if (lin==0) IUPMAT_LINE(ih, x1, y1, x2, y1); /* top horizontal line, reuse Foreground from previous call */ if (lin==0) y1++; cdCanvasForeground(ih->data->cddbuffer, CD_WHITE); IUPMAT_LINE(ih, x1, y1, x2-1, y1); }
/* Redraw a block of cells of the matrix. Handle marked cells, change automatically the background color of them. - lin1, col1 : cell coordinates that mark the left top corner of the area to be redrawn - lin2, col2 : cell coordinates that mark the right bottom corner of the area to be redrawn */ void iupMatrixDrawCells(Ihandle* ih, int lin1, int col1, int lin2, int col2) { int x1, y1, x2, y2, old_x2, old_y1, old_y2; int alignment, lin, col, active; long framecolor, emptyarea_color = -1; char str[100]; IFnii mark_cb; IFnii dropcheck_cb; IFniiiiiiC draw_cb; x1 = 0; x2 = ih->data->w-1; y1 = 0; y2 = ih->data->h-1; old_x2 = x2; old_y1 = y1; old_y2 = y2; if (col1 > ih->data->columns.last || col2 < ih->data->columns.first || lin1 > ih->data->lines.last || lin2 < ih->data->lines.first) return; if (col1 < ih->data->columns.first) col1 = ih->data->columns.first; if (col2 > ih->data->columns.last) col2 = ih->data->columns.last; if (lin1 < ih->data->lines.first) lin1 = ih->data->lines.first; if (lin2 > ih->data->lines.last) lin2 = ih->data->lines.last; /* Find the initial position of the first column */ x1 += ih->data->columns.sizes[0]; for(col = ih->data->columns.first; col < col1; col++) x1 += ih->data->columns.sizes[col]; /* Find the final position of the last column */ x2 = x1; for( ; col <= col2; col++) x2 += ih->data->columns.sizes[col]; /* Find the initial position of the first line */ y1 += ih->data->lines.sizes[0]; for(lin = ih->data->lines.first; lin < lin1; lin++) y1 += ih->data->lines.sizes[lin]; /* Find the final position of the last line */ y2 = y1; for( ; lin <= lin2; lin++) y2 += ih->data->lines.sizes[lin]; if ((col2 == ih->data->columns.num-1) && (old_x2 > x2)) { emptyarea_color = cdIupConvertColor(ih->data->bgcolor_parent); cdCanvasForeground(ih->data->cddbuffer, emptyarea_color); /* If it was drawn until the last column and remains space in the right of it, then delete this area with the the background color. */ IUPMAT_BOX(ih, x2, old_x2, old_y1, old_y2); } if ((lin2 == ih->data->lines.num-1) && (old_y2 > y2)) { if (emptyarea_color == -1) emptyarea_color = cdIupConvertColor(ih->data->bgcolor_parent); cdCanvasForeground(ih->data->cddbuffer, emptyarea_color); /* If it was drawn until the last line visible and remains space below it, then delete this area with the the background color. */ IUPMAT_BOX(ih, 0, old_x2, y2, old_y2); } /***** Draw the cell values and frame */ old_y1 = y1; framecolor = cdIupConvertColor(iupAttribGetStr(ih, "FRAMECOLOR")); active = iupdrvIsActive(ih); mark_cb = (IFnii)IupGetCallback(ih, "MARK_CB"); dropcheck_cb = (IFnii)IupGetCallback(ih, "DROPCHECK_CB"); draw_cb = (IFniiiiiiC)IupGetCallback(ih, "DRAW_CB"); for(col = col1; col <= col2; col++) /* For all the columns in the region */ { if (ih->data->columns.sizes[col] == 0) continue; alignment = iMatrixDrawGetColAlignment(ih, col, str); x2 = x1 + ih->data->columns.sizes[col]; for(lin = lin1; lin <= lin2; lin++) /* For all lines in the region */ { if (ih->data->lines.sizes[lin] == 0) continue; y2 = y1 + ih->data->lines.sizes[lin]; if (col==1 && ih->data->columns.sizes[0] == 0) { /* If does not have titles then draw the left line of the cell frame */ iMatrixDrawFrameVertLineCell(ih, lin, col, x1, y1, y2-1-1, framecolor, str); } if (lin==1 && ih->data->lines.sizes[0] == 0) { /* If does not have titles then draw the top line of the cell frame */ iMatrixDrawFrameHorizLineCell(ih, lin, col, x1, x2-1-1, y1, framecolor, str); } /* draw the cell contents */ { int drop = 0; int marked = 0; if (dropcheck_cb && dropcheck_cb(ih, lin, col) == IUP_DEFAULT) drop = IMAT_COMBOBOX_W; /* If the cell is marked, then draw it with attenuation color */ marked = iupMatrixMarkCellGet(ih, lin, col, mark_cb, str); iMatrixDrawBackground(ih, x1, x2, y1, y2, marked, active, lin, col); iMatrixDrawCellValue(ih, x1, x2-drop, y1, y2, alignment, marked, active, lin, col, draw_cb); if (drop) iMatrixDrawComboFeedback(ih, x2, y1, y2, lin, col, marked, active, framecolor); } /* bottom line */ iMatrixDrawFrameHorizLineCell(ih, lin, col, x1, x2-1, y2-1, framecolor, str); /* rigth line */ iMatrixDrawFrameVertLineCell(ih, lin, col, x2-1, y1, y2-1, framecolor, str); y1 = y2; } x1 = x2; y1 = old_y1; /* must reset also y */ } }