+ DrawTextExt(drawto,
+ gi->x + border_x +
+ gi->textinput.cursor_position * font_width,
+ gi->y + border_y, cursor_string,
+ font_nr, BLIT_INVERSE);
+ }
+ break;
+
+ case GD_TYPE_TEXT_AREA:
+ {
+ int i;
+ char cursor_letter;
+ char cursor_string[2];
+ int font_nr = (pressed ? gi->font_active : gi->font);
+ int font_width = getFontWidth(font_nr);
+ int font_height = getFontHeight(font_nr);
+ int border_x = gi->border.xsize;
+ int border_y = gi->border.ysize;
+ int gd_height = 2 * border_y + font_height;
+
+ /* top left part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x, gd->y,
+ border_x, border_y, gi->x, gi->y);
+
+ /* top middle part of gadget border */
+ for (i=0; i < gi->textarea.xsize; i++)
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x + border_x, gd->y,
+ font_width, border_y,
+ gi->x + border_x + i * font_width, gi->y);
+
+ /* top right part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x, gd->y,
+ border_x, border_y,
+ gi->x + gi->width - border_x, gi->y);
+
+ /* left and right part of gadget border for each row */
+ for (i=0; i < gi->textarea.ysize; i++)
+ {
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x, gd->y + border_y,
+ border_x, font_height,
+ gi->x, gi->y + border_y + i * font_height);
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x,
+ gd->y + border_y,
+ border_x, font_height,
+ gi->x + gi->width - border_x,
+ gi->y + border_y + i * font_height);
+ }
+
+ /* bottom left part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x, gd->y + gd_height - border_y,
+ border_x, border_y,
+ gi->x, gi->y + gi->height - border_y);
+
+ /* bottom middle part of gadget border */
+ for (i=0; i < gi->textarea.xsize; i++)
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + border_x,
+ gd->y + gd_height - border_y,
+ font_width, border_y,
+ gi->x + border_x + i * font_width,
+ gi->y + gi->height - border_y);
+
+ /* bottom right part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x,
+ gd->y + gd_height - border_y,
+ border_x, border_y,
+ gi->x + gi->width - border_x,
+ gi->y + gi->height - border_y);
+
+ ClearRectangleOnBackground(drawto,
+ gi->x + border_x,
+ gi->y + border_y,
+ gi->width - 2 * border_x,
+ gi->height - 2 * border_y);
+
+ /* gadget text value */
+ DrawTextBuffer(gi->x + border_x, gi->y + border_y, gi->textarea.value,
+ font_nr, gi->textarea.xsize, -1, gi->textarea.ysize, 0,
+ BLIT_ON_BACKGROUND, FALSE, FALSE, FALSE);
+
+ cursor_letter = gi->textarea.value[gi->textarea.cursor_position];
+ cursor_string[0] = (cursor_letter != '\0' ? cursor_letter : ' ');
+ cursor_string[1] = '\0';
+
+ /* draw cursor, if active */
+ if (pressed)
+ DrawTextExt(drawto,
+ gi->x + border_x + gi->textarea.cursor_x * font_width,
+ gi->y + border_y + gi->textarea.cursor_y * font_height,
+ cursor_string,
+ font_nr, BLIT_INVERSE);
+ }
+ break;
+
+ case GD_TYPE_SELECTBOX:
+ {
+ int i;
+ char text[MAX_GADGET_TEXTSIZE + 1];
+ int font_nr_default = (pressed ? gi->font_active : gi->font);
+ int font_nr = font_nr_default;
+ int font_width = getFontWidth(font_nr);
+ int font_height = getFontHeight(font_nr);
+ int border_x = gi->border.xsize;
+ int border_y = gi->border.ysize;
+ int button = gi->border.xsize_selectbutton;
+ int width_inner = gi->border.width - button - 2 * border_x;
+ int box_width = gi->selectbox.width;
+ int box_height = gi->selectbox.height;
+
+ /* left part of gadget */
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x, gd->y,
+ border_x, gi->height, gi->x, gi->y);
+
+ /* middle part of gadget */
+ for (i=0; i < gi->selectbox.size; i++)
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x + border_x, gd->y,
+ font_width, gi->height,
+ gi->x + border_x + i * font_width, gi->y);
+
+ /* button part of gadget */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + border_x + width_inner, gd->y,
+ button, gi->height,
+ gi->x + gi->width - border_x - button, gi->y);
+
+ /* right part of gadget */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x, gd->y,
+ border_x, gi->height,
+ gi->x + gi->width - border_x, gi->y);
+
+ /* set text value */
+ strncpy(text, gi->selectbox.options[gi->selectbox.index].text,
+ gi->selectbox.size);
+ text[gi->selectbox.size] = '\0';
+
+ /* set font value */
+ font_nr = (OPTION_TEXT_SELECTABLE(gi, text) ? font_nr_default :
+ gi->font_unselectable);
+
+ /* gadget text value */
+ DrawTextExt(drawto, gi->x + border_x, gi->y + border_y, text,
+ font_nr, BLIT_MASKED);
+
+ if (pressed)
+ {
+ if (!gi->selectbox.open)
+ {
+ gi->selectbox.open = TRUE;
+ gi->selectbox.stay_open = FALSE;
+ gi->selectbox.current_index = gi->selectbox.index;
+
+ /* save background under selectbox */
+ BlitBitmap(drawto, gfx.field_save_buffer,
+ gi->selectbox.x, gi->selectbox.y,
+ gi->selectbox.width, gi->selectbox.height,
+ gi->selectbox.x, gi->selectbox.y);
+ }
+
+ /* draw open selectbox */
+
+ /* top left part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x, gd->y,
+ border_x, border_y,
+ gi->selectbox.x, gi->selectbox.y);
+
+ /* top middle part of gadget border */
+ for (i=0; i < gi->selectbox.size; i++)
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x + border_x, gd->y,
+ font_width, border_y,
+ gi->selectbox.x + border_x + i * font_width,
+ gi->selectbox.y);
+
+ /* top button part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + border_x + width_inner, gd->y,
+ button, border_y,
+ gi->selectbox.x + box_width -border_x -button,
+ gi->selectbox.y);
+
+ /* top right part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x, gd->y,
+ border_x, border_y,
+ gi->selectbox.x + box_width - border_x,
+ gi->selectbox.y);
+
+ /* left and right part of gadget border for each row */
+ for (i=0; i < gi->selectbox.num_values; i++)
+ {
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x, gd->y + border_y,
+ border_x, font_height,
+ gi->selectbox.x,
+ gi->selectbox.y + border_y + i*font_height);
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x,
+ gd->y + border_y,
+ border_x, font_height,
+ gi->selectbox.x + box_width - border_x,
+ gi->selectbox.y + border_y + i*font_height);
+ }
+
+ /* bottom left part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x, gd->y + gi->height - border_y,
+ border_x, border_y,
+ gi->selectbox.x,
+ gi->selectbox.y + box_height - border_y);
+
+ /* bottom middle part of gadget border */
+ for (i=0; i < gi->selectbox.size; i++)
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + border_x,
+ gd->y + gi->height - border_y,
+ font_width, border_y,
+ gi->selectbox.x + border_x + i * font_width,
+ gi->selectbox.y + box_height - border_y);
+
+ /* bottom button part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + border_x + width_inner,
+ gd->y + gi->height - border_y,
+ button, border_y,
+ gi->selectbox.x + box_width -border_x -button,
+ gi->selectbox.y + box_height - border_y);
+
+ /* bottom right part of gadget border */
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x,
+ gd->y + gi->height - border_y,
+ border_x, border_y,
+ gi->selectbox.x + box_width - border_x,
+ gi->selectbox.y + box_height - border_y);
+
+ ClearRectangleOnBackground(drawto,
+ gi->selectbox.x + border_x,
+ gi->selectbox.y + border_y,
+ gi->selectbox.width - 2 * border_x,
+ gi->selectbox.height - 2 * border_y);
+
+ /* selectbox text values */
+ for (i=0; i < gi->selectbox.num_values; i++)
+ {
+ int mask_mode = BLIT_MASKED;
+
+ strncpy(text, gi->selectbox.options[i].text, gi->selectbox.size);
+ text[gi->selectbox.size] = '\0';
+
+ font_nr = (OPTION_TEXT_SELECTABLE(gi, text) ? font_nr_default :
+ gi->font_unselectable);
+
+ if (i == gi->selectbox.current_index &&
+ OPTION_TEXT_SELECTABLE(gi, text))
+ {
+ FillRectangle(drawto,
+ gi->selectbox.x + border_x,
+ gi->selectbox.y + border_y + i * font_height,
+ gi->selectbox.width - 2 * border_x, font_height,
+ gi->selectbox.inverse_color);
+
+ /* prevent use of cursor graphic by drawing at least two chars */
+ strcat(text, " ");
+ text[gi->selectbox.size] = '\0';
+
+ mask_mode = BLIT_INVERSE;
+ }
+
+ DrawTextExt(drawto,
+ gi->selectbox.x + border_x,
+ gi->selectbox.y + border_y + i * font_height, text,
+ font_nr, mask_mode);
+ }
+
+ redraw_selectbox = TRUE;
+ }
+ else if (gi->selectbox.open)
+ {
+ gi->selectbox.open = FALSE;
+
+ /* restore background under selectbox */
+ BlitBitmap(gfx.field_save_buffer, drawto,
+ gi->selectbox.x, gi->selectbox.y,
+ gi->selectbox.width, gi->selectbox.height,
+ gi->selectbox.x, gi->selectbox.y);
+
+ /* redraw closed selectbox */
+ DrawGadget(gi, FALSE, FALSE);
+
+ redraw_selectbox = TRUE;
+ }