static void iMatrixDrawFocus(Ihandle* ih) { int x1, y1, x2, y2, dx, dy; if (iupAttribGetBoolean(ih, "HIDEFOCUS")) return; /* there are no cells that can get the focus */ if (ih->data->columns.num <= 1 || ih->data->lines.num <= 1) return; if (!iupMatrixAuxIsCellVisible(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell)) return; iupMatrixGetVisibleCellDim(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell, &x1, &y1, &dx, &dy); x2 = x1 + dx - 1; y2 = y1 + dy - 1; if (ih->data->columns.focus_cell == 1 && ih->data->columns.dt[0].size == 0) x1++; if (ih->data->lines.focus_cell == 1 && ih->data->lines.dt[0].size == 0) y1++; { cdCanvas* cd_canvas_front = (cdCanvas*)IupGetAttribute(ih, "_CD_CANVAS"); /* front buffer canvas */ IupCdDrawFocusRect(ih, cd_canvas_front, x1, iupMATRIX_INVERTYAXIS(ih, y1), x2, iupMATRIX_INVERTYAXIS(ih, y2)); } }
static int iMatrixDrawCallDrawCB(Ihandle* ih, int lin, int col, int x1, int x2, int y1, int y2, IFniiiiiiC draw_cb) { int ret; cdCanvas* old_cnv; iMatrixDrawSetCellClipping(ih, x1, x2, y1, y2); old_cnv = cdActiveCanvas(); if (old_cnv != ih->data->cd_canvas) /* backward compatibility code */ cdActivate(ih->data->cd_canvas); ret = draw_cb(ih, lin, col, x1, x2, iupMATRIX_INVERTYAXIS(ih, y1), iupMATRIX_INVERTYAXIS(ih, y2), ih->data->cd_canvas); iMatrixDrawResetCellClipping(ih); if (old_cnv && old_cnv != ih->data->cd_canvas) /* backward compatibility code */ { cdActivate(old_cnv); cdCanvasActivate(ih->data->cd_canvas); } if (ret == IUP_DEFAULT) return 0; return 1; }
void iupMatrixColResFinish(Ihandle* ih, int x) { int delta = x - ih->data->colres_drag_col_start_x; int width = ih->data->columns.dt[ih->data->colres_drag_col].size + delta; if (width < 0) width = 0; /* delete feedback */ if (ih->data->colres_drag_col_last_x != -1) { int y1 = ih->data->lines.dt[0].size; /* from the bottom of the line of titles */ int y2 = ih->data->h-1; /* to the bottom of the matrix */ cdCanvasWriteMode(ih->data->cdcanvas, CD_XOR); cdCanvasForeground(ih->data->cdcanvas, ih->data->colres_color); cdCanvasLine(ih->data->cdcanvas, ih->data->colres_drag_col_last_x, iupMATRIX_INVERTYAXIS(ih, y1), ih->data->colres_drag_col_last_x, iupMATRIX_INVERTYAXIS(ih, y2)); cdCanvasWriteMode(ih->data->cdcanvas, CD_REPLACE); } ih->data->colres_dragging = 0; iupAttribSetIntId(ih, "RASTERWIDTH", ih->data->colres_drag_col, width-IMAT_PADDING_W-IMAT_FRAME_W); iupAttribSetId(ih, "WIDTH", ih->data->colres_drag_col, NULL); ih->data->need_calcsize = 1; iupMatrixDraw(ih, 0); { IFni cb = (IFni)IupGetCallback(ih, "COLRESIZE_CB"); if (cb) cb(ih, ih->data->colres_drag_col); } }
/* Change the column width interactively, just change the line in the screen. When the user finishes the drag, the iupMatrixColResFinish function is called to truly change the column width. */ void iupMatrixColResMove(Ihandle* ih, int x) { int y1, y2; int delta = x - ih->data->colres_drag_col_start_x; int width = ih->data->columns.dt[ih->data->colres_drag_col].size + delta; if (width < 0) return; y1 = ih->data->lines.dt[0].size; /* from the bottom of the line of titles */ y2 = ih->data->h-1; /* to the bottom of the matrix */ cdCanvasWriteMode(ih->data->cdcanvas, CD_XOR); cdCanvasForeground(ih->data->cdcanvas, ih->data->colres_color); /* If it is not the first time, move old line */ if (ih->data->colres_drag_col_last_x != -1) { cdCanvasLine(ih->data->cdcanvas, ih->data->colres_drag_col_last_x, iupMATRIX_INVERTYAXIS(ih, y1), ih->data->colres_drag_col_last_x, iupMATRIX_INVERTYAXIS(ih, y2)); } cdCanvasLine(ih->data->cdcanvas, x, iupMATRIX_INVERTYAXIS(ih, y1), x, iupMATRIX_INVERTYAXIS(ih, y2)); ih->data->colres_drag_col_last_x = x; cdCanvasWriteMode(ih->data->cdcanvas, CD_REPLACE); }
static void iMatrixDrawSetCellClipping(Ihandle* ih, int x1, int x2, int y1, int y2) { int old_clip = cdCanvasClip(ih->data->cddbuffer, CD_QUERY); if (old_clip == CD_CLIPAREA) { cdCanvasGetClipArea(ih->data->cddbuffer, &(ih->data->clip_x1), &(ih->data->clip_x2), &(ih->data->clip_y1), &(ih->data->clip_y2)); y1 = iupMATRIX_INVERTYAXIS(ih, y1); y2 = iupMATRIX_INVERTYAXIS(ih, y2); if (x1 > x2) { int tmp = x1; x1 = x2; x2 = tmp; } if (y1 > y2) { int tmp = y1; y1 = y2; y2 = tmp; } if (x1 < ih->data->clip_x1) x1 = ih->data->clip_x1; if (x2 > ih->data->clip_x2) x2 = ih->data->clip_x2; if (y1 < ih->data->clip_y1) y1 = ih->data->clip_y1; if (y2 > ih->data->clip_y2) y2 = ih->data->clip_y2; cdCanvasClipArea(ih->data->cddbuffer, x1, x2, y1, y2); cdCanvasClip(ih->data->cddbuffer, CD_CLIPAREA); } }
static void iMatrixDrawImage(Ihandle* ih, int x1, int x2, int y1, int y2, int alignment, int marked, int active, int lin, int col, const char* name) { long bgcolor; int x, y; Ihandle* image; iMatrixDrawSetCellClipping(ih, x1, x2, y1, y2); /* Create an space between image and cell frame */ x1 += IMAT_PADDING_W/2; x2 -= IMAT_PADDING_W/2; y1 += IMAT_PADDING_H/2; y2 -= IMAT_PADDING_H/2; image = IupGetHandle(name); if (image) { int width = IupGetInt(image, "WIDTH"); int height = IupGetInt(image, "HEIGHT"); unsigned char r = 255, g = 255, b = 255; iupMatrixGetBgRGB(ih, lin, col, &r, &g, &b, marked, active); bgcolor = cdEncodeColor(r, g, b); y = (y2+y1 + height)/2; if (alignment == IMAT_ALIGN_CENTER) x = x1 + (x2-x1)/2 - width/2; else if(alignment == IMAT_ALIGN_LEFT) x = x1; else /* RIGHT */ x = x2 - width; cdIupDrawImage(ih->data->cd_canvas, image, x, iupMATRIX_INVERTYAXIS(ih, y), 0, 0, !active, bgcolor); } iMatrixDrawResetCellClipping(ih); }
static void iMatrixDrawFocus(Ihandle* ih) { int x1, y1, x2, y2, dx, dy; if (iupAttribGetBoolean(ih, "HIDEFOCUS")) return; /* there are no cells that can get the focus */ if (ih->data->columns.num <= 1 || ih->data->lines.num <= 1) return; if (!iupMatrixAuxIsCellVisible(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell)) return; iupMatrixGetVisibleCellDim(ih, ih->data->lines.focus_cell, ih->data->columns.focus_cell, &x1, &y1, &dx, &dy); x2 = x1 + dx - 1; y2 = y1 + dy - 1; if (ih->data->columns.focus_cell == 1 && ih->data->columns.sizes[0] == 0) x1++; if (ih->data->lines.focus_cell == 1 && ih->data->lines.sizes[0] == 0) y1++; cdIupDrawFocusRect(ih, ih->data->cdcanvas, x1, iupMATRIX_INVERTYAXIS(ih, y1), x2, iupMATRIX_INVERTYAXIS(ih, y2)); }
static void iMatrixDrawFeedbackImage(Ihandle* ih, int x1, int x2, int y1, int y2, int lin, int col, int active, int marked, const char*name, unsigned char* alpha) { int x, y; Ihandle* image = IupGetHandle(name); if (image) { long bgcolor; int image_width = IupGetInt(image, "WIDTH"); int image_height = IupGetInt(image, "HEIGHT"); unsigned char r = 255, g = 255, b = 255; iupMatrixGetBgRGB(ih, lin, col, &r, &g, &b, marked, active); bgcolor = cdEncodeColor(r, g, b); y = (y2 + y1 + image_height) / 2; x = (x2 + x1 - image_width) / 2; cdIupDrawImage(ih->data->cd_canvas, image, x, iupMATRIX_INVERTYAXIS(ih, y), 0, 0, !active, bgcolor); } else { static unsigned char red[IMAT_FEEDBACK_SIZE * IMAT_FEEDBACK_SIZE]; static unsigned char green[IMAT_FEEDBACK_SIZE * IMAT_FEEDBACK_SIZE]; static unsigned char blue[IMAT_FEEDBACK_SIZE * IMAT_FEEDBACK_SIZE]; static unsigned char last_r = 0, last_g = 0, last_b = 0; static int first = 1; unsigned char r = 0, g = 0, b = 0; iupMatrixGetFgRGB(ih, lin, col, &r, &g, &b, marked, active); if (first || last_r != r || last_g != g || last_b != b) { int count = IMAT_FEEDBACK_SIZE * IMAT_FEEDBACK_SIZE; memset(red, r, count); memset(green, g, count); memset(blue, b, count); last_r = r; last_g = g; last_b = b; first = 0; } y = (y2 + y1 + IMAT_FEEDBACK_SIZE) / 2; x = (x2 + x1 - IMAT_FEEDBACK_SIZE) / 2; cdCanvasPutImageRectRGBA(ih->data->cd_canvas, IMAT_FEEDBACK_SIZE, IMAT_FEEDBACK_SIZE, red, green, blue, alpha, x, iupMATRIX_INVERTYAXIS(ih, y), IMAT_FEEDBACK_SIZE, IMAT_FEEDBACK_SIZE, 0, 0, 0, 0); } }