+ 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;
+ int x = gi->x;
+ int y = gi->y;
+ int width = gi->width;
+ int height = gi->height;
+ int xsize = gi->textarea.xsize;
+ int ysize = gi->textarea.ysize;
+
+ if (gi->textarea.cropped)
+ {
+ if (pressed)
+ {
+ x = gi->textarea.full_x;
+ y = gi->textarea.full_y;
+
+ if (!gi->textarea.full_open)
+ {
+ gi->textarea.full_open = TRUE;
+
+ // save background under fully opened text area
+ BlitBitmap(drawto, gfx.field_save_buffer,
+ gi->textarea.full_x, gi->textarea.full_y,
+ gi->width, gi->height,
+ gi->textarea.full_x, gi->textarea.full_y);
+ }
+ }
+ else
+ {
+ width = gi->textarea.crop_width;
+ height = gi->textarea.crop_height;
+ xsize = gi->textarea.crop_xsize;
+ ysize = gi->textarea.crop_ysize;
+
+ if (gi->textarea.full_open)
+ {
+ gi->textarea.full_open = FALSE;
+
+ // restore background under fully opened text area
+ BlitBitmap(gfx.field_save_buffer, drawto,
+ gi->textarea.full_x, gi->textarea.full_y,
+ gi->width, gi->height,
+ gi->textarea.full_x, gi->textarea.full_y);
+ }
+ }
+ }
+
+ // top left part of gadget border
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x, gd->y,
+ border_x, border_y, x, y);
+
+ // top middle part of gadget border
+ for (i = 0; i < xsize; i++)
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x + border_x, gd->y,
+ font_width, border_y,
+ x + border_x + i * font_width, y);
+
+ // top right part of gadget border
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + gi->border.width - border_x, gd->y,
+ border_x, border_y,
+ x + width - border_x, y);
+
+ // left and right part of gadget border for each row
+ for (i = 0; i < ysize; i++)
+ {
+ BlitBitmapOnBackground(gd->bitmap, drawto, gd->x, gd->y + border_y,
+ border_x, font_height,
+ x, 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,
+ x + width - border_x,
+ 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,
+ x, y + height - border_y);
+
+ // bottom middle part of gadget border
+ for (i = 0; i < xsize; i++)
+ BlitBitmapOnBackground(gd->bitmap, drawto,
+ gd->x + border_x,
+ gd->y + gd_height - border_y,
+ font_width, border_y,
+ x + border_x + i * font_width,
+ y + 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,
+ x + width - border_x,
+ y + height - border_y);
+
+ ClearRectangleOnBackground(drawto,
+ x + border_x,
+ y + border_y,
+ width - 2 * border_x,
+ height - 2 * border_y);
+
+ // gadget text value
+ DrawTextArea(x + border_x, y + border_y, gi->textarea.value,
+ font_nr, xsize, -1, 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,
+ x + border_x + gi->textarea.cursor_x * font_width,
+ y + border_y + gi->textarea.cursor_y * font_height,
+ cursor_string,
+ font_nr, BLIT_INVERSE);
+ }
+ break;
+