#include "menu.h" #include "string_edit.h" //static int num_lines = 0; static int x_pos=0, y_pos=0; static int width = 0, height = 0; static int cursor_pos = 0; static char *buffer; static char *prompt; static int buffer_length; static char backup[1024]; #define STRINGBOX_WIDTH 70 #define STRINGBOX_HEIGHT 4 #define STRINGBOX_X 5 #define STRINGBOX_Y 5 static void string_edit_draw(void) { int i,j, length = buffer_length, attr = MENUATTR_NORMAL; char c; //int cursor_x = 0, cursor_y = 0; for (i=0; i length) c = ' '; else c = buffer[offset]; if (offset == cursor_pos) #if 1 //def SIM attr = MENUATTR_HILITE; else attr = MENUATTR_NORMAL; #else { cursor_x = x_pos+j; cursor_y = y_pos+i; } #endif video_draw_text(x_pos + j, y_pos + i, attr, &c, 1); } } #if 0 //ndef SIM video_set_cursor(cursor_y, cursor_y); #endif } static void string_clear_frame(void) { video_clear_box(STRINGBOX_X-2, STRINGBOX_Y-2, STRINGBOX_WIDTH+4, STRINGBOX_HEIGHT+4, ' ', MENUATTR_NORMAL); } static void string_draw_frame(void) { string_clear_frame(); video_draw_box(SINGLE_BOX, MENUATTR_NORMAL, prompt, 0, STRINGBOX_X-2, STRINGBOX_Y-2, STRINGBOX_WIDTH+4, STRINGBOX_HEIGHT+4); } static void backspace(void) { int i; char *s; if (cursor_pos == 0) return; if (cursor_pos == buffer_length) { buffer_length--; cursor_pos--; buffer[buffer_length] = 0; } else { s = buffer+cursor_pos-1; for (i = 0; i < buffer_length - cursor_pos + 1; i++) { *s = *(s+1); s++; } cursor_pos--; buffer_length--; } } static void insert(int key) { int i; char *s; s = buffer + buffer_length; for (i = 0; i < buffer_length - cursor_pos + 1; i++) { *(s+1) = *s; s--; } *(buffer + cursor_pos) = (char)key; cursor_pos++; buffer_length++; } bool menu_string_edit(char *_prompt, char *string, int buffersize) { int key; prompt = _prompt; x_pos = STRINGBOX_X; y_pos = STRINGBOX_Y; width = STRINGBOX_WIDTH; height = STRINGBOX_HEIGHT; buffer = string; strcpy(backup, string); buffer_length = cursor_pos = strlen(buffer); string_draw_frame(); do { string_edit_draw(); key = video_get_key(); switch(key) { case KEY_ABORT: strcpy(string, backup); string_clear_frame(); menu_draw_current_form(); return false; case KEY_ACTIVATE: string_clear_frame(); menu_draw_current_form(); return true; case KEY_NEXT_OPTION: cursor_pos++; if (cursor_pos > buffer_length) cursor_pos = buffer_length; break; case KEY_PREV_OPTION: cursor_pos--; if (cursor_pos < 0) cursor_pos = 0; break; case KEY_DELETE: /* Backspace */ backspace(); break; default: if (key >= 32 && key <= 127) { insert(key); } break; } } while (1); return false; }