static void iFlatButtonDrawIcon(Ihandle* ih, IdrawCanvas* dc, int icon_x, int icon_y, int icon_width, int icon_height, const char *baseattrib, const char* imagename, const char* title, const char* fgcolor, const char* bgcolor, int active) { int x, y, width, height; if (imagename) { if (title) { int img_x, img_y, txt_x, txt_y; int txt_width, txt_height; int img_width, img_height; iupdrvFontGetMultiLineStringSize(ih, title, &txt_width, &txt_height); iupImageGetInfo(imagename, &img_width, &img_height, NULL); if (ih->data->img_position == IUP_IMGPOS_RIGHT || ih->data->img_position == IUP_IMGPOS_LEFT) { width = img_width + txt_width + ih->data->spacing; height = iupMAX(img_height, txt_height); } else { width = iupMAX(img_width, txt_width); height = img_height + txt_height + ih->data->spacing; } iFlatButtonGetIconPosition(ih, icon_width, icon_height, &x, &y, width, height); iFlatButtonGetImageTextPosition(x, y, ih->data->img_position, ih->data->spacing, img_width, img_height, txt_width, txt_height, &img_x, &img_y, &txt_x, &txt_y); iFlatButtonDrawImage(ih, dc, img_x + icon_x, img_y + icon_y, baseattrib, imagename, active); iFlatButtonDrawText(ih, dc, txt_x + icon_x, txt_y + icon_y, title, fgcolor, bgcolor, active); } else { iupImageGetInfo(imagename, &width, &height, NULL); iFlatButtonGetIconPosition(ih, icon_width, icon_height, &x, &y, width, height); iFlatButtonDrawImage(ih, dc, x + icon_x, y + icon_y, baseattrib, imagename, active); } } else if (title) { iupdrvFontGetMultiLineStringSize(ih, title, &width, &height); iFlatButtonGetIconPosition(ih, icon_width, icon_height, &x, &y, width, height); iFlatButtonDrawText(ih, dc, x + icon_x, y + icon_y, title, fgcolor, bgcolor, active); } }
static void iFlatButtonComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand) { int fit2backimage = iupAttribGetBoolean(ih, "FITTOBACKIMAGE"); char* bgimage = iupAttribGet(ih, "BACKIMAGE"); if (fit2backimage && bgimage) iupImageGetInfo(bgimage, w, h, NULL); else { char* image = iupAttribGet(ih, "IMAGE"); char* title = iupAttribGet(ih, "TITLE"); *w = 0, *h = 0; if (image) { iupImageGetInfo(image, w, h, NULL); if (title) { int text_w, text_h; iupdrvFontGetMultiLineStringSize(ih, title, &text_w, &text_h); if (ih->data->img_position == IUP_IMGPOS_RIGHT || ih->data->img_position == IUP_IMGPOS_LEFT) { *w += text_w + ih->data->spacing; *h = iupMAX(*h, text_h); } else { *w = iupMAX(*w, text_w); *h += text_h + ih->data->spacing; } } } else if (title) iupdrvFontGetMultiLineStringSize(ih, title, w, h); *w += 2 * ih->data->horiz_padding; *h += 2 * ih->data->vert_padding; *w += 2 * ih->data->border_width; *h += 2 * ih->data->border_width; } (void)children_expand; /* unset if not a container */ }
static void iMatrixFitLineText(Ihandle* ih, int line) { /* find the highest cel in the line */ int col, max_height = 0, max; char str[100]; for(col = 0; col < ih->data->columns.num; col++) { char* title_value = iupMatrixCellGetValue(ih, line, col); if (title_value && title_value[0]) { int h; iupdrvFontGetMultiLineStringSize(ih, title_value, NULL, &h); if (h > max_height) max_height = h; } } sprintf(str, "FITMAXHEIGHT%d", line); max = iupAttribGetInt(ih, str); if (max && max > max_height) max_height = max; sprintf(str, "RASTERHEIGHT%d", line); iupAttribSetInt(ih, str, max_height); }
static void iMatrixFitColText(Ihandle* ih, int col) { /* find the largest cel in the col */ int lin, max_width = 0, max; char str[100]; for(lin = 0; lin < ih->data->lines.num; lin++) { char* title_value = iupMatrixCellGetValue(ih, lin, col); if (title_value && title_value[0]) { int w; iupdrvFontGetMultiLineStringSize(ih, title_value, &w, NULL); if (w > max_width) max_width = w; } } sprintf(str, "FITMAXWIDTH%d", col); max = iupAttribGetInt(ih, str); if (max && max > max_width) max_width = max; sprintf(str, "RASTERWIDTH%d", col); iupAttribSetInt(ih, str, max_width); }
static void iLabelComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand) { int natural_w = 0, natural_h = 0, type = iupLabelGetTypeBeforeMap(ih); (void)children_expand; /* unset if not a container */ if (type == IUP_LABEL_SEP_HORIZ) natural_h = 2; else if (type == IUP_LABEL_SEP_VERT) natural_w = 2; else if (type == IUP_LABEL_IMAGE) { iupImageGetInfo(iupAttribGet(ih, "IMAGE"), &natural_w, &natural_h, NULL); natural_w += 2*ih->data->horiz_padding; natural_h += 2*ih->data->vert_padding; } else /* IUP_LABEL_TEXT */ { /* must use IupGetAttribute to check from the native implementation */ char* title = IupGetAttribute(ih, "TITLE"); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &natural_w, &natural_h); if (str && str!=title) free(str); natural_w += 2*ih->data->horiz_padding; natural_h += 2*ih->data->vert_padding; } *w = natural_w; *h = natural_h; }
static void iExpanderComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *expand) { int child_expand = 0, natural_w, natural_h; Ihandle *child = ih->firstchild->brother; int bar_size = iExpanderGetBarSize(ih); /* bar */ if (ih->data->position == IEXPANDER_LEFT || ih->data->position == IEXPANDER_RIGHT) { natural_w = bar_size; natural_h = IEXPAND_HANDLE_SIZE; } else { natural_w = IEXPAND_HANDLE_SIZE; natural_h = bar_size; if (ih->data->position == IEXPANDER_TOP) { char* title = iupAttribGetStr(ih, "TITLE"); if (title) { int title_size = 0; iupdrvFontGetMultiLineStringSize(ih, title, &title_size, NULL); natural_w += title_size; natural_h += 2*IEXPAND_HANDLE_SPC; } } } if (child) { /* update child natural bar_size first */ iupBaseComputeNaturalSize(child); if (ih->data->position == IEXPANDER_LEFT || ih->data->position == IEXPANDER_RIGHT) { if (ih->data->state == IEXPANDER_OPEN) /* only open, not float */ natural_w += child->naturalwidth; natural_h = iupMAX(natural_h, child->naturalheight); } else { natural_w = iupMAX(natural_w, child->naturalwidth); if (ih->data->state == IEXPANDER_OPEN) /* only open, not float */ natural_h += child->naturalheight; } child_expand = child->expand; } *expand = child_expand; *w = natural_w; *h = natural_h; }
static void iLabelComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *expand) { int natural_w = 0, natural_h = 0, type = ih->data->type; (void)expand; /* unset if not a container */ if (!ih->handle) { /* if not mapped must initialize the internal values */ char* value = iupAttribGet(ih, "SEPARATOR"); if (value) { if (iupStrEqualNoCase(value, "HORIZONTAL")) type = IUP_LABEL_SEP_HORIZ; else /* "VERTICAL" */ type = IUP_LABEL_SEP_VERT; } else { value = iupAttribGet(ih, "IMAGE"); if (value) type = IUP_LABEL_IMAGE; else type = IUP_LABEL_TEXT; } } if (type == IUP_LABEL_SEP_HORIZ) natural_h = 2; else if (type == IUP_LABEL_SEP_VERT) natural_w = 2; else if (type == IUP_LABEL_IMAGE) { iupImageGetInfo(iupAttribGet(ih, "IMAGE"), &natural_w, &natural_h, NULL); natural_w += 2*ih->data->horiz_padding; natural_h += 2*ih->data->vert_padding; } else /* IUP_LABEL_TEXT */ { /* must use IupGetAttribute to check from the native implementation */ char* title = IupGetAttribute(ih, "TITLE"); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &natural_w, &natural_h); if (str && str!=title) free(str); natural_w += 2*ih->data->horiz_padding; natural_h += 2*ih->data->vert_padding; } *w = natural_w; *h = natural_h; }
static void winButtonDrawText(Ihandle* ih, HDC hDC, int rect_width, int rect_height, int border, UINT itemState) { int xpad = ih->data->horiz_padding + border, ypad = ih->data->vert_padding + border; int x, y, width, height, shift = 0; COLORREF fgcolor; char* title = iupAttribGet(ih, "TITLE"); if (title) { int style = 0; HFONT hFont = (HFONT)iupwinGetHFontAttrib(ih); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &width, &height); if (str && str!=title) free(str); if (itemState & ODS_DISABLED) fgcolor = GetSysColor(COLOR_GRAYTEXT); else fgcolor = ih->data->fgcolor; if (itemState & ODS_SELECTED && !iupwin_comctl32ver6) shift = 1; if (itemState & ODS_NOACCEL && !iupwinGetKeyBoardCues()) style |= DT_HIDEPREFIX; x = winButtonCalcAlignPosX(ih->data->horiz_alignment, rect_width, width, xpad, shift); y = winButtonCalcAlignPosY(ih->data->vert_alignment, rect_height, height, ypad, shift); if (ih->data->horiz_alignment == IUP_ALIGN_ACENTER) style |= DT_CENTER; /* let DrawText do the internal horizontal alignment, usefull for multiple lines */ else if (ih->data->horiz_alignment == IUP_ALIGN_ARIGHT) style |= DT_RIGHT; iupwinDrawText(hDC, title, x, y, width, height, hFont, fgcolor, style); } else { /* fill with the background color if defined at the element */ char* bgcolor = iupAttribGet(ih, "BGCOLOR"); if (bgcolor) { RECT rect; unsigned char r=0, g=0, b=0; iupStrToRGB(bgcolor, &r, &g, &b); SetDCBrushColor(hDC, RGB(r,g,b)); SetRect(&rect, xpad, ypad, rect_width - xpad, rect_height - ypad); FillRect(hDC, &rect, (HBRUSH)GetStockObject(DC_BRUSH)); } } }
static void winButtonDrawText(Ihandle* ih, HDC hDC, int rect_width, int rect_height, int border, UINT itemState) { int xpad = ih->data->horiz_padding + border, ypad = ih->data->vert_padding + border; int x, y, width, height, shift = 0; COLORREF fgcolor; char* title = iupdrvBaseGetTitleAttrib(ih); if (title) { HFONT hFont = (HFONT)iupwinGetHFontAttrib(ih); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &width, &height); if (str && str!=title) free(str); if (itemState & ODS_DISABLED) fgcolor = GetSysColor(COLOR_GRAYTEXT); else fgcolor = ih->data->fgcolor; if (itemState & ODS_SELECTED && !iupwin_comctl32ver6) shift = 1; x = winButtonCalcAlignPosX(ih->data->horiz_alignment, rect_width, width, xpad, shift); y = winButtonCalcAlignPosY(ih->data->vert_alignment, rect_height, height, ypad, shift); iupwinDrawText(hDC, title, x, y, width, height, hFont, fgcolor, 0); } else { /* fill with the background color if defined at the element */ char* bgcolor = iupAttribGet(ih, "BGCOLOR"); if (bgcolor) { RECT rect; unsigned char r=0, g=0, b=0; iupStrToRGB(bgcolor, &r, &g, &b); SetDCBrushColor(hDC, RGB(r,g,b)); rect.left = xpad; rect.top = ypad; rect.right = rect_width - xpad; rect.bottom = rect_height - ypad; FillRect(hDC, &rect, (HBRUSH)GetStockObject(DC_BRUSH)); } } }
static void winDatePickComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand) { (void)children_expand; /* unset if not a container */ if (ih->handle && iupwinIsVistaOrNew() && iupwin_comctl32ver6) { SIZE size; SendMessage(ih->handle, DTM_GETIDEALSIZE, 0, (LPARAM)&size); *w = size.cx; *h = size.cy; } else { iupdrvFontGetMultiLineStringSize(ih, "WW/WW/WWWW", w, h); iupdrvTextAddBorders(w, h); *w += iupdrvGetScrollbarSize(); } }
static void winLabelDrawText(Ihandle* ih, HDC hDC, int rect_width, int rect_height) { int xpad = ih->data->horiz_padding, ypad = ih->data->vert_padding; int x, y, width, height, style; HFONT hFont = (HFONT)iupwinGetHFontAttrib(ih); COLORREF fgcolor; char* title = iupdrvBaseGetTitleAttrib(ih); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &width, &height); if (str && str!=title) free(str); if (ih->data->horiz_alignment == IUP_ALIGN_ARIGHT) style = DT_RIGHT; else if (ih->data->horiz_alignment == IUP_ALIGN_ACENTER) style = DT_CENTER; else /* ALEFT */ style = DT_LEFT; if (ih->data->vert_alignment == IUP_ALIGN_ABOTTOM) y = rect_height - (height + 2*ypad); else if (ih->data->vert_alignment == IUP_ALIGN_ATOP) y = 0; else /* ACENTER */ y = (rect_height - (height + 2*ypad))/2; /* let DrawText do the horizontal alignment */ x = xpad; width = rect_width - 2*xpad; y += ypad; if (iupdrvIsActive(ih)) fgcolor = ih->data->fgcolor; else fgcolor = GetSysColor(COLOR_GRAYTEXT); /* WORDWRAP and ELLIPSIS */ style |= ih->data->text_style; iupwinDrawText(hDC, title, x, y, width, height, hFont, fgcolor, style); }
static void iToggleComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand) { int natural_w = 0, natural_h = 0, type = ih->data->type; (void)children_expand; /* unset if not a container */ if (!ih->handle) { /* if not mapped must initialize the internal values */ char* value = iupAttribGet(ih, "IMAGE"); if (value) type = IUP_TOGGLE_IMAGE; else type = IUP_TOGGLE_TEXT; } if (type == IUP_TOGGLE_IMAGE) { iupImageGetInfo(iupAttribGet(ih, "IMAGE"), &natural_w, &natural_h, NULL); /* even when IMPRESS is set, must compute the borders space */ iupdrvButtonAddBorders(&natural_w, &natural_h); natural_w += 2*ih->data->horiz_padding; natural_h += 2*ih->data->vert_padding; } else /* IUP_TOGGLE_TEXT */ { /* must use IupGetAttribute to check from the native implementation */ char* title = IupGetAttribute(ih, "TITLE"); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &natural_w, &natural_h); iupdrvToggleAddCheckBox(&natural_w, &natural_h, str); if (str && str != title) free(str); } *w = natural_w; *h = natural_h; }
static void winCalendarComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand) { (void)children_expand; /* unset if not a container */ if (ih->handle) { RECT rect; SendMessage(ih->handle, MCM_GETMINREQRECT, 0, (LPARAM)&rect); *w = rect.right - rect.left; *h = rect.bottom - rect.top; } else { iupdrvFontGetMultiLineStringSize(ih, "W8W", w, h); (*w) *= 7; /* 7 columns */ (*h) *= 8; /* 9 lines */ iupdrvTextAddBorders(w, h); } }
static void winListDrawItem(Ihandle* ih, DRAWITEMSTRUCT *drawitem) { char* text; int txt_w, txt_h; winListItemData* itemdata; HFONT hFont = (HFONT)iupwinGetHFontAttrib(ih); iupwinBitmapDC bmpDC; HDC hDC; RECT rect; COLORREF fgcolor, bgcolor; int x = drawitem->rcItem.left; int y = drawitem->rcItem.top; int width = drawitem->rcItem.right - drawitem->rcItem.left; int height = drawitem->rcItem.bottom - drawitem->rcItem.top; /* If there are no list box items, skip this message */ if (drawitem->itemID == -1) return; hDC = iupwinDrawCreateBitmapDC(&bmpDC, drawitem->hDC, x, y, width, height); if (drawitem->itemState & ODS_SELECTED) bgcolor = GetSysColor(COLOR_HIGHLIGHT); else if (!iupwinGetColorRef(ih, "BGCOLOR", &bgcolor)) bgcolor = GetSysColor(COLOR_WINDOW); SetDCBrushColor(hDC, bgcolor); SetRect(&rect, 0, 0, width, height); FillRect(hDC, &rect, (HBRUSH)GetStockObject(DC_BRUSH)); if (iupdrvIsActive(ih)) { if (drawitem->itemState & ODS_SELECTED) fgcolor = GetSysColor(COLOR_HIGHLIGHTTEXT); else if (!iupwinGetColorRef(ih, "FGCOLOR", &fgcolor)) fgcolor = GetSysColor(COLOR_WINDOWTEXT); } else fgcolor = GetSysColor(COLOR_GRAYTEXT); /* Get the bitmap associated with the item */ itemdata = winListGetItemData(ih, drawitem->itemID); /* Get and draw the string associated with the item */ text = winListGetText(ih, drawitem->itemID); iupdrvFontGetMultiLineStringSize(ih, text, &txt_w, &txt_h); x = ih->data->maximg_w + 3; /* spacing between text and image */ y = (height - txt_h)/2; /* vertically centered */ iupwinDrawText(hDC, text, x, y, txt_w, txt_h, hFont, fgcolor, 0); /* Draw the bitmap associated with the item */ if (itemdata->hBitmap) { int bpp, img_w, img_h; HBITMAP hMask = NULL; iupdrvImageGetInfo(itemdata->hBitmap, &img_w, &img_h, &bpp); if (bpp == 8) { char name[50]; sprintf(name, "IMAGE%d", (int)drawitem->itemID+1); hMask = iupdrvImageCreateMask(IupGetAttributeHandle(ih, name)); } x = 0; y = (height - img_h)/2; /* vertically centered */ iupwinDrawBitmap(hDC, itemdata->hBitmap, hMask, x, y, img_w, img_h, bpp); if (hMask) DeleteObject(hMask); } /* If the item has the focus, draw the focus rectangle */ if (drawitem->itemState & ODS_FOCUS) iupdrvDrawFocusRect(ih, hDC, 0, 0, width, height); free(text); iupwinDrawDestroyBitmapDC(&bmpDC); }
/* 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 int motTipsSet(Ihandle *ih) { char* tipText = iupAttribGet(ih, "TIP"); if (!tipText) return FALSE; if (!mot_tips.Dialog) { mot_tips.Dialog = XtVaAppCreateShell(" ", "tip", overrideShellWidgetClass, iupmot_display, XmNmappedWhenManaged, False, NULL); mot_tips.Label = XtVaCreateManagedWidget("label tip", xmLabelWidgetClass, mot_tips.Dialog, /* must use IupGetAttribute to use inheritance */ XmNforeground, iupmotColorGetPixelStr(IupGetAttribute(ih, "TIPFGCOLOR")), XmNbackground, iupmotColorGetPixelStr(IupGetAttribute(ih, "TIPBGCOLOR")), NULL); XtRealizeWidget(mot_tips.Dialog); } /* set label font */ { XmFontList fontlist = (XmFontList)iupmotGetFontListAttrib(ih); char* value = iupAttribGetStr(ih, "TIPFONT"); if (value) { if (iupStrEqualNoCase(value, "SYSTEM")) fontlist = NULL; else fontlist = iupmotGetFontList(iupAttribGet(ih, "TIPFOUNDRY"), value); } if (fontlist) XtVaSetValues(mot_tips.Label, XmNfontList, fontlist, NULL); } /* set label contents */ iupmotSetString(mot_tips.Label, XmNlabelString, tipText); /* set label size */ { int lw = 0, lh = 0; iupdrvFontGetMultiLineStringSize(ih, tipText, &lw, &lh); /* add room for margin */ lw += 2*(2); lh += 2*(2); XtVaSetValues(mot_tips.Label, XmNwidth, (XtArgVal)lw, XmNheight, (XtArgVal)lh, NULL); XtVaSetValues(mot_tips.Dialog, XmNwidth, (XtArgVal)lw, XmNheight, (XtArgVal)lh, NULL); } mot_tips.ShowTimerId = (XtIntervalId) NULL; mot_tips.HideTimerId = (XtIntervalId) NULL; mot_tips.Visible = FALSE; mot_tips.ShowInterval = 500; /* 1/2 second to show */ { int delay = IupGetInt(ih, "TIPDELAY"); /* must use IupGetInt to use inheritance */ mot_tips.HideInterval = delay + mot_tips.ShowInterval; } return TRUE; }
int iupMatrixGetLineHeight(Ihandle* ih, int lin, int use_value) { int height = 0, pixels = 0; char str[100]; char* value; /* can be called for invalid lines (lin>numlin) */ sprintf(str, "HEIGHT%d", lin); value = iupAttribGet(ih, str); if(!value) { sprintf(str, "RASTERHEIGHT%d", lin); value = iupAttribGet(ih, str); if(value) pixels = 1; } if (use_value && !value) { /* Use the titles to define the size */ if (lin == 0) { if (!ih->data->callback_mode || ih->data->use_title_size) { /* find the highest title */ int col, max_height = 0; for(col = 0; col < ih->data->columns.num; col++) { char* title_value = iupMatrixCellGetValue(ih, 0, col); if (title_value && title_value[0]) { iupdrvFontGetMultiLineStringSize(ih, title_value, NULL, &height); if (height > max_height) max_height = height; } } height = max_height; } } else if (ih->data->use_title_size && (lin>0 && lin<ih->data->lines.num)) { char* title_value = iupMatrixCellGetValue(ih, lin, 0); if (title_value && title_value[0]) iupdrvFontGetMultiLineStringSize(ih, title_value, NULL, &height); } if (height) return height + IMAT_PADDING_H + IMAT_FRAME_H; if (lin != 0) value = iupAttribGetStr(ih, "HEIGHTDEF"); } if (iupStrToInt(value, &height)) { if (height <= 0) return 0; else { if (pixels) return height + IMAT_PADDING_H + IMAT_FRAME_H; else { int charheight; iupdrvFontGetCharSize(ih, NULL, &charheight); return iupHEIGHT2RASTER(height, charheight) + IMAT_PADDING_H + IMAT_FRAME_H; } } } return 0; }
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, "..."); } }
static void iButtonComputeNaturalSizeMethod(Ihandle* ih, int *w, int *h, int *children_expand) { int natural_w = 0, natural_h = 0, type = ih->data->type; (void)children_expand; /* unset if not a container */ if (!ih->handle) { /* if not mapped must initialize the internal values */ char* value = iupAttribGet(ih, "IMAGE"); if (value) { char* title = iupAttribGet(ih, "TITLE"); type = IUP_BUTTON_IMAGE; if (title && *title!=0) type |= IUP_BUTTON_TEXT; } else type = IUP_BUTTON_TEXT; } if (type & IUP_BUTTON_IMAGE) { iupImageGetInfo(iupAttribGet(ih, "IMAGE"), &natural_w, &natural_h, NULL); if (type & IUP_BUTTON_TEXT) { int text_w, text_h; /* must use IupGetAttribute to check from the native implementation */ char* title = IupGetAttribute(ih, "TITLE"); iupdrvFontGetMultiLineStringSize(ih, title, &text_w, &text_h); if (ih->data->img_position == IUP_IMGPOS_RIGHT || ih->data->img_position == IUP_IMGPOS_LEFT) { natural_w += text_w + ih->data->spacing; natural_h = iupMAX(natural_h, text_h); } else { natural_w = iupMAX(natural_w, text_w); natural_h += text_h + ih->data->spacing; } } } else /* IUP_BUTTON_TEXT only */ { /* must use IupGetAttribute to check from the native implementation */ char* title = IupGetAttribute(ih, "TITLE"); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &natural_w, &natural_h); if (str && str!=title) free(str); } /* if IMPRESS is set, do NOT compute the borders space */ if (!((type == IUP_BUTTON_IMAGE) && iupAttribGet(ih, "IMPRESS") && !iupAttribGetBoolean(ih, "IMPRESSBORDER"))) iupdrvButtonAddBorders(&natural_w, &natural_h); natural_w += 2*ih->data->horiz_padding; natural_h += 2*ih->data->vert_padding; *w = natural_w; *h = natural_h; }
int iupMatrixAuxGetColumnWidth(Ihandle* ih, int col) { int width = 0, pixels = 0; char* str = iupStrGetMemory(100); char* value; sprintf(str, "WIDTH%d", col); value = iupAttribGet(ih, str); if (!value) { sprintf(str, "RASTERWIDTH%d", col); value = iupAttribGet(ih, str); if (value) pixels = 1; } if (!value) { if (col == 0) { /* find the largest title */ int lin, max_width = 0; for(lin = 0; lin < ih->data->lines.num; lin++) { char* title_value = iupMatrixCellGetValue(ih, lin, 0); if (title_value) { iupdrvFontGetMultiLineStringSize(ih, title_value, &width, NULL); if (width > max_width) max_width = width; } } width = max_width; } else { char* title_value = iupMatrixCellGetValue(ih, 0, col); if (title_value) iupdrvFontGetMultiLineStringSize(ih, title_value, &width, NULL); } if (width) return width + IMAT_PADDING_W + IMAT_FRAME_W; if (col!=0) value = iupAttribGetStr(ih, "WIDTHDEF"); } if (iupStrToInt(value, &width)) { if (width <= 0) return 0; else { if (pixels) return width + IMAT_PADDING_W + IMAT_FRAME_W; else { int charwidth; iupdrvFontGetCharSize(ih, &charwidth, NULL); return iupWIDTH2RASTER(width, charwidth) + IMAT_PADDING_W + IMAT_FRAME_W; } } } return 0; }
static void winButtonDrawImageText(Ihandle* ih, HDC hDC, int rect_width, int rect_height, int border, UINT itemState) { int xpad = ih->data->horiz_padding + border, ypad = ih->data->vert_padding + border; int x, y, width, height, txt_x, txt_y, txt_width, txt_height, img_x, img_y, img_width, img_height, bpp, shift = 0, style = 0; HFONT hFont = (HFONT)iupwinGetHFontAttrib(ih); HBITMAP hBitmap, hMask; COLORREF fgcolor; char* title = iupAttribGet(ih, "TITLE"); char* str = iupStrProcessMnemonic(title, NULL, 0); /* remove & */ iupdrvFontGetMultiLineStringSize(ih, str, &txt_width, &txt_height); if (str && str!=title) free(str); if (itemState & ODS_DISABLED) fgcolor = GetSysColor(COLOR_GRAYTEXT); else fgcolor = ih->data->fgcolor; hBitmap = winButtonGetBitmap(ih, itemState, NULL, &img_width, &img_height, &bpp, &hMask); if (!hBitmap) return; if (ih->data->img_position == IUP_IMGPOS_RIGHT || ih->data->img_position == IUP_IMGPOS_LEFT) { width = img_width + txt_width + ih->data->spacing; height = iupMAX(img_height, txt_height); } else { width = iupMAX(img_width, txt_width); height = img_height + txt_height + ih->data->spacing; } if (itemState & ODS_SELECTED && !iupwin_comctl32ver6) shift = 1; if (itemState & ODS_NOACCEL && !iupwinGetKeyBoardCues()) style |= DT_HIDEPREFIX; x = winButtonCalcAlignPosX(ih->data->horiz_alignment, rect_width, width, xpad, shift); y = winButtonCalcAlignPosY(ih->data->vert_alignment, rect_height, height, ypad, shift); switch(ih->data->img_position) { case IUP_IMGPOS_TOP: img_y = y; txt_y = y + img_height + ih->data->spacing; if (img_width > txt_width) { img_x = x; txt_x = x + (img_width-txt_width)/2; } else { img_x = x + (txt_width-img_width)/2; txt_x = x; } break; case IUP_IMGPOS_BOTTOM: img_y = y + txt_height + ih->data->spacing; txt_y = y; if (img_width > txt_width) { img_x = x; txt_x = x + (img_width-txt_width)/2; } else { img_x = x + (txt_width-img_width)/2; txt_x = x; } break; case IUP_IMGPOS_RIGHT: img_x = x + txt_width + ih->data->spacing; txt_x = x; if (img_height > txt_height) { img_y = y; txt_y = y + (img_height-txt_height)/2; } else { img_y = y + (txt_height-img_height)/2; txt_y = y; } break; default: /* IUP_IMGPOS_LEFT */ img_x = x; txt_x = x + img_width + ih->data->spacing; if (img_height > txt_height) { img_y = y; txt_y = y + (img_height-txt_height)/2; } else { img_y = y + (txt_height-img_height)/2; txt_y = y; } break; } if (ih->data->horiz_alignment == IUP_ALIGN_ACENTER) style |= DT_CENTER; /* let DrawText do the internal horizontal alignment, usefull for multiple lines */ else if (ih->data->horiz_alignment == IUP_ALIGN_ARIGHT) style |= DT_RIGHT; iupwinDrawBitmap(hDC, hBitmap, hMask, img_x, img_y, img_width, img_height, bpp); iupwinDrawText(hDC, title, txt_x, txt_y, txt_width, txt_height, hFont, fgcolor, style); if (hMask) DeleteObject(hMask); }
int iupMatrixAuxGetLineHeight(Ihandle* ih, int lin) { int height = 0, pixels = 0; char* str = iupStrGetMemory(100); char* value; sprintf(str, "HEIGHT%d", lin); value = iupAttribGet(ih, str); if(!value) { sprintf(str, "RASTERHEIGHT%d", lin); value = iupAttribGet(ih, str); if(value) pixels = 1; } if (!value) { if (lin == 0) { /* find the highest title */ int col, max_height = 0; for(col = 0; col < ih->data->columns.num; col++) { char* title_value = iupMatrixCellGetValue(ih, 0, col); if (title_value) { iupdrvFontGetMultiLineStringSize(ih, title_value, NULL, &height); if (height > max_height) max_height = height; } } height = max_height; } else { char* title_value = iupMatrixCellGetValue(ih, lin, 0); if (title_value) iupdrvFontGetMultiLineStringSize(ih, title_value, NULL, &height); } if (height) return height + IMAT_PADDING_H + IMAT_FRAME_H; if (lin != 0) value = iupAttribGetStr(ih, "HEIGHTDEF"); } if (iupStrToInt(value, &height)) { if (height <= 0) return 0; else { if (pixels) return height + IMAT_PADDING_H + IMAT_FRAME_H; else { int charheight; iupdrvFontGetCharSize(ih, NULL, &charheight); return iupHEIGHT2RASTER(height, charheight) + IMAT_PADDING_H + IMAT_FRAME_H; } } } return 0; }
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, "..."); } }
int iupMatrixGetColumnWidth(Ihandle* ih, int col, int use_value) { int width = 0, pixels = 0; char str[100]; char* value; /* can be called for invalid columns (col>numcol) */ sprintf(str, "WIDTH%d", col); value = iupAttribGet(ih, str); if (!value) { sprintf(str, "RASTERWIDTH%d", col); value = iupAttribGet(ih, str); if (value) pixels = 1; } if (use_value && !value) { /* Use the titles to define the size */ if (col == 0) { if (!ih->data->callback_mode || ih->data->use_title_size) { /* find the largest title */ int lin, max_width = 0; for(lin = 0; lin < ih->data->lines.num; lin++) { char* title_value = iupMatrixCellGetValue(ih, lin, 0); if (title_value) { iupdrvFontGetMultiLineStringSize(ih, title_value, &width, NULL); if (width > max_width) max_width = width; } } width = max_width; } } else if (ih->data->use_title_size && (col>0 && col<ih->data->columns.num)) { char* title_value = iupMatrixCellGetValue(ih, 0, col); if (title_value) iupdrvFontGetMultiLineStringSize(ih, title_value, &width, NULL); } if (width) return width + IMAT_PADDING_W + IMAT_FRAME_W; if (col != 0) value = iupAttribGetStr(ih, "WIDTHDEF"); } if (iupStrToInt(value, &width)) { if (width <= 0) return 0; else { if (pixels) return width + IMAT_PADDING_W + IMAT_FRAME_W; else { int charwidth; iupdrvFontGetCharSize(ih, &charwidth, NULL); return iupWIDTH2RASTER(width, charwidth) + IMAT_PADDING_W + IMAT_FRAME_W; } } } return 0; }