OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_010 / chnos / textbox.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/textbox.c b/CHNOSProject/chnos/tolset_chn_000/chnos_010/chnos/textbox.c
new file mode 100644 (file)
index 0000000..1402d47
--- /dev/null
@@ -0,0 +1,355 @@
+\r
+#include "core.h"\r
+\r
+UI_TextBox *TextBox_Initialize(void)\r
+{\r
+       UI_TextBox *textbox;\r
+\r
+       textbox = (UI_TextBox *)System_CommonStruct_Allocate(SYSTEM_STRUCTID_TEXTBOX);\r
+       textbox->flags.bit.initialized = True;\r
+\r
+       textbox->forecol = 0xffffff;\r
+       textbox->backcol = 0xc6c6c6;\r
+\r
+       return textbox;\r
+}\r
+\r
+//bpp==0:\8e©\93®\91I\91ð(\8c»\8dÝ\82Ì\83V\83X\83e\83\80\83V\81[\83g\82Ì\90Ý\92è\82É\8d\87\82í\82¹\82é)\r
+uint TextBox_SetBuffer(UI_TextBox *textbox, uint xchars, uint ychars, uint bpp, UI_Sheet *parent)\r
+{\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_SetBuffer:Null textbox.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(xchars < 4 + 1 || ychars < 1){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_SetBuffer:Too small textbox.\n");\r
+               #endif\r
+               return 2;\r
+       }\r
+\r
+       textbox->chars.x = xchars;\r
+       textbox->chars.y = ychars;\r
+       textbox->size_text_buf = textbox->chars.x * textbox->chars.y;\r
+\r
+       textbox->sheet = Sheet_Initialize();\r
+       Sheet_SetBuffer(textbox->sheet, Null, xchars << 3, ychars << 4, bpp);\r
+       Sheet_SetParent(textbox->sheet, parent);\r
+\r
+       Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->backcol, 0, 0, (int)textbox->sheet->size.x - 1, (int)textbox->sheet->size.y - 1);\r
+\r
+       textbox->text_buf = System_Memory_Allocate(textbox->size_text_buf);\r
+       textbox->text_buf[0] = 0x00;\r
+\r
+       textbox->flags.bit.textbuffer_configured = True;\r
+\r
+       return 0;\r
+}\r
+\r
+uint TextBox_Show(UI_TextBox *textbox, uint height, int px, int py)\r
+{\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Show:Null textbox.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(textbox->sheet == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Show:Null textbox sheet.\n");\r
+               #endif\r
+               return 2;\r
+       }\r
+\r
+       return Sheet_Show(textbox->sheet, height, px, py);\r
+}\r
+\r
+//char\82ð\93n\82·\82±\82Æ\82à\89Â\94\\81B\r
+//Break\8e\9e\82Ì\83L\81[\83R\81[\83h\82Í\96³\8e\8b\82µ\82Ä\89½\82à\93ü\97Í\82µ\82È\82¢\81ikeyid\82ð\92¼\90Ú\93n\82·\82¾\82¯\82Å\93ü\97Í\82ª\82Å\82«\82é\82æ\82¤\82É\82·\82é\82½\82ß\81j\81B\r
+//\83^\83u\95\8e\9a\82Í\81A\8bL\98^\82ª\83I\83t\82Ì\8e\9e\82Ì\82Ý\93ü\97Í\89Â\94\\81B\r
+uint TextBox_Put_Key(UI_TextBox *textbox, ushort keyid)\r
+{\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Put_Key:Null textbox.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(!textbox->flags.bit.textbuffer_configured){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Put_Key:Buffer not configured.\n");\r
+               #endif\r
+               return 2;\r
+       }\r
+\r
+       if(!(keyid & KEYID_MASK_BREAK)){\r
+               if(keyid & KEYID_MASK_EXTENDED){        /*\90§\8cä\95\8e\9a*/\r
+                       switch(keyid & KEYID_MASK_ID){\r
+                               case KEYID_ENTER:\r
+                                       TextBox_Internal_Put_Character(textbox, '\n');\r
+                                       break;\r
+                               case KEYID_BACKSPACE:\r
+                                       TextBox_Internal_Put_Character(textbox, '\b');\r
+                                       break;\r
+                               case KEYID_TAB:\r
+                                       TextBox_Internal_Put_Character(textbox, '\t');\r
+                                       break;\r
+                       }\r
+                       return 0;\r
+               } else{ /*ASCII\95\8e\9a*/\r
+                       TextBox_Internal_Put_Character(textbox, keyid & KEYID_MASK_ID);\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+uint TextBox_Put_String(UI_TextBox *textbox, const uchar s[])\r
+{\r
+       uint i;\r
+\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Put_String:Null textbox.\n");\r
+               #endif\r
+               return 0;\r
+       }\r
+\r
+       if(!textbox->flags.bit.textbuffer_configured){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Put_String:Buffer not configured.\n");\r
+               #endif\r
+               return 0;\r
+       }\r
+\r
+       for(i = 0; s[i] != 0x00; i++){\r
+               TextBox_Internal_Put_Character(textbox, s[i]);\r
+       }\r
+       return i;\r
+}\r
+\r
+uint TextBox_Put_Character(UI_TextBox *textbox, uchar c)\r
+{\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Put_Character:Null textbox.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(!textbox->flags.bit.textbuffer_configured){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Put_Character:Buffer not configured.\n");\r
+               #endif\r
+               return 2;\r
+       }\r
+\r
+       return TextBox_Internal_Put_Character(textbox, c);\r
+}\r
+\r
+//False->True\82Å\83o\83b\83t\83@\83\8a\83Z\83b\83g\81B\r
+bool TextBox_SetEnable_RecordInputText(UI_TextBox *textbox, bool enable)\r
+{\r
+       bool old;\r
+\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_SetEnable_RecordInputText:Null textbox.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(!textbox->flags.bit.textbuffer_configured){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_SetEnable_RecordInputText:Buffer not configured.\n");\r
+               #endif\r
+               return 2;\r
+       }\r
+\r
+       old = textbox->flags.bit.record_input_text;\r
+\r
+       if(old != enable){\r
+               if(enable){\r
+                       textbox->text_buf[0] = 0x00;\r
+                       textbox->using_text_buf = 0;\r
+                       textbox->location_cursor_record_started = textbox->location_cursor;\r
+               }\r
+               textbox->flags.bit.record_input_text = enable;\r
+       }\r
+\r
+       return old;\r
+}\r
+\r
+uint TextBox_SetEnable_CursorBlink(UI_TextBox *textbox, bool enable)\r
+{\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_SetEnable_CursorBlink:Null textbox.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(!textbox->flags.bit.textbuffer_configured){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_SetEnable_CursorBlink:Buffer not configured.\n");\r
+               #endif\r
+               return 2;\r
+       }\r
+\r
+       textbox->flags.bit.cursor_blink = enable;\r
+       textbox->flags.bit.cursor_state = False;\r
+       TextBox_Internal_DrawCursor(textbox, False);\r
+       return 0;\r
+}\r
+\r
+uint TextBox_Cursor_Blink(UI_TextBox *textbox)\r
+{\r
+       if(textbox == Null){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Cursor_Blink:Null textbox.\n");\r
+               #endif\r
+               return 1;\r
+       }\r
+\r
+       if(!textbox->flags.bit.textbuffer_configured){\r
+               #ifdef CHNOSPROJECT_DEBUG_TEXTBOX\r
+                       debug("TextBox_Cursor_Blink:Buffer not configured.\n");\r
+               #endif\r
+               return 2;\r
+       }\r
+\r
+       if(!textbox->flags.bit.cursor_blink){\r
+               return 3;\r
+       }\r
+\r
+       textbox->flags.bit.cursor_state = !textbox->flags.bit.cursor_state;\r
+       TextBox_Internal_DrawCursor(textbox, textbox->flags.bit.cursor_state);\r
+       return 0;\r
+}\r
+\r
+//--------//\r
+\r
+uint TextBox_Internal_Put_Character(UI_TextBox *textbox, uchar c)\r
+{\r
+       uint i;\r
+       uchar s[2];\r
+\r
+       s[1] = 0x00;\r
+\r
+       if(textbox->flags.bit.cursor_blink){\r
+               Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->backcol, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+               Sheet_RefreshSheet(textbox->sheet, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+       }\r
+       /*ASCII\95\8e\9a*/\r
+       if(c == '\n'){\r
+               if(TextBox_Internal_Put_Character_TextBuffer(textbox, '\n')){\r
+                       textbox->location_cursor.x = 0;\r
+                       textbox->location_cursor.y += 16;\r
+               }\r
+       } else if(c == '\b'){\r
+               if(!(textbox->location_cursor.x <= 0 && textbox->location_cursor.y <= 0)){\r
+                       if(TextBox_Internal_Put_Character_TextBuffer(textbox, '\b')){\r
+                               textbox->location_cursor.x -= 8;\r
+                       }\r
+                       if(textbox->location_cursor.x < 0){\r
+                               textbox->location_cursor.x = 0;\r
+                               textbox->location_cursor.y -= 16;\r
+                               if(textbox->flags.bit.record_input_text){\r
+                                       for(i = 0; i < textbox->using_text_buf; i++){\r
+                                               if(textbox->text_buf[textbox->using_text_buf - i - 1] == '\n'){\r
+                                                       break;\r
+                                               }\r
+                                               textbox->location_cursor.x += 8;\r
+                                               if(textbox->location_cursor.x >= (int)textbox->sheet->size.x - (8 - 1)){\r
+                                                       textbox->location_cursor.x = 0;\r
+                                               }\r
+                                       }\r
+                                       if(i == textbox->using_text_buf){\r
+                                               textbox->location_cursor.x += textbox->location_cursor_record_started.x;\r
+                                               if(textbox->location_cursor.x >= (int)textbox->sheet->size.x - (8 - 1)){\r
+                                                       textbox->location_cursor.x -= textbox->sheet->size.x;\r
+                                               }\r
+                                       }\r
+                               } else{\r
+                                       textbox->location_cursor.x = (int)textbox->sheet->size.x - 8;\r
+                               }\r
+                       }\r
+               }\r
+       } else if(c == '\t'){\r
+               if(!textbox->flags.bit.record_input_text && TextBox_Internal_Put_Character_TextBuffer(textbox, '\t')){\r
+                       textbox->location_cursor.x += 8 * (4 - ((textbox->location_cursor.x >> 3) & 3));\r
+               }\r
+               if(textbox->location_cursor.x > (int)textbox->sheet->size.x){\r
+                       textbox->location_cursor.x = 8 * 4;\r
+                       textbox->location_cursor.y += 16;\r
+               } else if(textbox->location_cursor.x == (int)textbox->sheet->size.x){\r
+                       textbox->location_cursor.x = 0;\r
+                       textbox->location_cursor.y += 16;\r
+               }\r
+       } else if(c == '\r'){\r
+\r
+       } else if(TextBox_Internal_Put_Character_TextBuffer(textbox, c)){\r
+               s[0] = c;\r
+               Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->backcol, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+               Sheet_Drawing_Put_String(textbox->sheet, textbox->location_cursor.x, textbox->location_cursor.y, textbox->forecol, s);\r
+               Sheet_RefreshSheet(textbox->sheet, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+               textbox->location_cursor.x += 8;\r
+               if(textbox->location_cursor.x >= (int)textbox->sheet->size.x - (8 - 1)){\r
+                       textbox->location_cursor.x = 0;\r
+                       textbox->location_cursor.y += 16;\r
+               }\r
+       }\r
+       if(textbox->location_cursor.y >= (int)textbox->sheet->size.y - (16 - 1)){\r
+               Sheet_Drawing_Scroll_Vertical(textbox->sheet, 16);\r
+               Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->backcol, 0, (int)textbox->sheet->size.y - 16, (int)textbox->sheet->size.x - 1, (int)textbox->sheet->size.y - 1);\r
+               textbox->location_cursor.y -= 16;\r
+               Sheet_RefreshSheet_All(textbox->sheet);\r
+       }\r
+       Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->backcol, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+       Sheet_RefreshSheet(textbox->sheet, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+\r
+       return 0;\r
+}\r
+\r
+bool TextBox_Internal_Put_Character_TextBuffer(UI_TextBox *textbox, uchar c)\r
+{\r
+       if(!textbox->flags.bit.record_input_text){\r
+               return True;\r
+       }\r
+\r
+       switch(c){\r
+               case '\b':\r
+                       if(textbox->using_text_buf > 0){\r
+                               textbox->using_text_buf--;\r
+                               textbox->text_buf[textbox->using_text_buf] = 0x00;\r
+                               return True;\r
+                       }\r
+                       break;\r
+               default:\r
+                       if(textbox->using_text_buf < textbox->size_text_buf - 1){\r
+                               textbox->text_buf[textbox->using_text_buf] = c;\r
+                               textbox->using_text_buf++;\r
+                               textbox->text_buf[textbox->using_text_buf] = 0x00;\r
+                               return True;\r
+                       }\r
+                       break;\r
+       }\r
+       return False;\r
+}\r
+\r
+uint TextBox_Internal_DrawCursor(UI_TextBox *textbox, bool cursor)\r
+{\r
+       if(cursor){\r
+               Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->forecol, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+       } else{\r
+               Sheet_Drawing_Fill_Rectangle(textbox->sheet, textbox->backcol, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+       }\r
+       Sheet_RefreshSheet(textbox->sheet, textbox->location_cursor.x, textbox->location_cursor.y, textbox->location_cursor.x + 8 - 1, textbox->location_cursor.y + 16 - 1);\r
+\r
+       return 0;\r
+}\r