OSDN Git Service

svn rev.329より移動。
[chnosproject/CHNOSProject.git] / CHNOSProject / chnos / tolset_chn_000 / chnos_009 / chnos / window.c
diff --git a/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/window.c b/CHNOSProject/chnos/tolset_chn_000/chnos_009/chnos/window.c
new file mode 100644 (file)
index 0000000..a62ec24
--- /dev/null
@@ -0,0 +1,228 @@
+\r
+#include "core.h"\r
+\r
+uchar closebutton[16][40] = {\r
+       "OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",\r
+       "OQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJQQQQQQQQJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJJQQQQQQJJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQJJJQQQQJJJQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQJJJQQJJJQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQJJJJJJQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQQJJJJQQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQQJJJJQQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQJJJJJJQQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQJJJQQJJJQQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQJJJQQQQJJJQQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJJQQQQQQJJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQJJQQQQQQQQJJQQQQQQQQQQQQ$@",\r
+       "OQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ$@",\r
+       "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"\r
+};\r
+\r
+UI_Window *window_root;\r
+\r
+void Initialise_Window(UI_Window *windowctrl)\r
+{\r
+       window_root = windowctrl;\r
+       window_root->client = 0;\r
+       window_root->control = 0;\r
+       window_root->title[0] = 0x00;\r
+       window_root->next = 0;\r
+       return;\r
+}\r
+\r
+UI_Window *Window_Create(const uchar *title, uint flags, uint xsize, uint ysize)\r
+{\r
+       DATA_BootInfo *boot = (DATA_BootInfo *)ADR_BOOTINFO;\r
+       UI_Window *win, *end;\r
+       uint i;\r
+       int x, y;\r
+\r
+       win = MemoryBlock_Allocate_System(sizeof(UI_Window));\r
+       MemoryBlock_Write_Description(win, "UI_Window");\r
+\r
+       for(i = 0; i < (WINDOW_TITLE_LENGTH - 1); i++){\r
+               if(title[i] == 0x00){\r
+                       break;\r
+               }\r
+               win->title[i] = title[i];\r
+       }\r
+       win->title[i] = 0x00;\r
+\r
+       win->control = System_Sheet_Get((i + 8) << 3, WINDOW_CONTROL_XSIZE, 0, 0);\r
+       win->client = System_Sheet_Get(xsize, ysize, 0, 0);\r
+       Sheet_Set_Movable(win->control, true);\r
+\r
+       Sheet_Draw_Fill_Rectangle_Gradation_Vertical(win->control, 0xffffff, 0x7cfc00, 0, 0, win->control->size.x - 1, win->control->size.y - 1);\r
+\r
+       Sheet_Draw_Fill_Rectangle(win->client, 0xffffff, 0, 0, win->client->size.x - 1, win->client->size.y - 1);\r
+\r
+       Window_Draw_CloseButton(win, false);\r
+\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0xffffff, 0, 0, win->control->size.x - 1, 0);\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0xffffff, 0, 0, 0, win->control->size.y - 1);\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0x32cd32, win->control->size.x - 1, 0, win->control->size.x - 1, win->control->size.y - 1);\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0x32cd32, 0, win->control->size.y - 1, win->control->size.x - 1, win->control->size.y - 1);\r
+\r
+       x = (boot->scrnx >> 1) - (win->client->size.x >> 1);\r
+       y = (boot->scrny >> 1) - (win->client->size.y >> 1) - (win->control->size.y >> 1);\r
+\r
+       if(x < 0){\r
+               x = 0;\r
+       }\r
+       if(y < 0){\r
+               y = 0;\r
+       }\r
+       Sheet_Draw_Put_String(win->control, 4 + 8, 4, 0x00000000, win->title);\r
+\r
+       Sheet_Set_MouseEventProcedure(win->control, &Window_Control_MouseEventProcedure, 0);\r
+\r
+       Sheet_Show(win->control, x, y, System_Sheet_Get_Top_Of_Height());\r
+       Sheet_Show(win->client, x, y + win->control->size.y, System_Sheet_Get_Top_Of_Height());\r
+\r
+       for(end = window_root; end->next != 0; end = end->next){\r
+\r
+       }\r
+       win->next = 0;\r
+       end->next = win;\r
+\r
+       CHNOS_UI_KeyFocus_Change(win->client);\r
+\r
+       return win;\r
+}\r
+\r
+UI_Window *Window_Create_User(const uchar *title, uint flags, UI_Sheet *client)\r
+{\r
+       DATA_BootInfo *boot = (DATA_BootInfo *)ADR_BOOTINFO;\r
+       UI_Window *win, *end;\r
+       uint i;\r
+       int x, y;\r
+\r
+       win = MemoryBlock_Allocate_System(sizeof(UI_Window));\r
+       MemoryBlock_Write_Description(win, "UI_Window");\r
+\r
+       for(i = 0; i < (WINDOW_TITLE_LENGTH - 1); i++){\r
+               if(title[i] == 0x00){\r
+                       break;\r
+               }\r
+               win->title[i] = title[i];\r
+       }\r
+       win->title[i] = 0x00;\r
+\r
+       win->control = System_Sheet_Get((i + 8) << 3, WINDOW_CONTROL_XSIZE, 0, 0);\r
+       win->client = client;\r
+       Sheet_Set_Movable(win->control, true);\r
+\r
+       Sheet_Draw_Fill_Rectangle_Gradation_Vertical(win->control, 0xffffff, 0x7cfc00, 0, 0, win->control->size.x - 1, win->control->size.y - 1);\r
+\r
+       Window_Draw_CloseButton(win, false);\r
+\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0xffffff, 0, 0, win->control->size.x - 1, 0);\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0xffffff, 0, 0, 0, win->control->size.y - 1);\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0x32cd32, win->control->size.x - 1, 0, win->control->size.x - 1, win->control->size.y - 1);\r
+//     Sheet_Draw_Fill_Rectangle(win->control, 0x32cd32, 0, win->control->size.y - 1, win->control->size.x - 1, win->control->size.y - 1);\r
+\r
+       x = (boot->scrnx >> 1) - (win->client->size.x >> 1);\r
+       y = (boot->scrny >> 1) - (win->client->size.y >> 1) - (win->control->size.y >> 1);\r
+\r
+       if(x < 0){\r
+               x = 0;\r
+       }\r
+       if(y < 0){\r
+               y = 0;\r
+       }\r
+       Sheet_Draw_Put_String(win->control, 4 + 8, 4, 0x00000000, win->title);\r
+\r
+       Sheet_Set_MouseEventProcedure(win->control, &Window_Control_MouseEventProcedure, 0);\r
+\r
+       Sheet_Show(win->control, x, y, System_Sheet_Get_Top_Of_Height());\r
+\r
+       if(!win->client->visible){\r
+               Sheet_Show(win->client, x, y + win->control->size.y, System_Sheet_Get_Top_Of_Height());\r
+       } else{\r
+               Sheet_Slide(win->client, x, y + win->control->size.y);\r
+               Sheet_UpDown(win->client, System_Sheet_Get_Top_Of_Height());\r
+       }\r
+\r
+       for(end = window_root; end->next != 0; end = end->next){\r
+\r
+       }\r
+       win->next = 0;\r
+       end->next = win;\r
+\r
+       CHNOS_UI_KeyFocus_Change(win->client);\r
+\r
+       return win;\r
+}\r
+\r
+UI_Window *Window_Get_From_Sheet(UI_Sheet *sheet)\r
+{\r
+       UI_Window *now;\r
+\r
+       for(now = window_root->next; now != 0; now = now->next){\r
+               if(now->control == sheet || now->client == sheet){\r
+                       return now;\r
+               }\r
+       }\r
+       return 0;\r
+}\r
+\r
+void Window_Control_MouseEventProcedure(UI_MouseEventArguments *e)\r
+{\r
+       UI_Window *focus_win;\r
+\r
+       focus_win = Window_Get_From_Sheet(e->focus);\r
+\r
+       if(focus_win == 0){\r
+               return;\r
+       }\r
+\r
+       if((e->button & MOUSE_BUTTON_L) != 0 && (e->button_before & MOUSE_BUTTON_L) == 0){      /*L down*/\r
+               CHNOS_UI_KeyFocus_Change(focus_win->client);\r
+               Sheet_UpDown(focus_win->client, System_Sheet_Get_Top_Of_Height() - 1);\r
+               if(focus_win->control->size.x - 44 <= e->position_local.x && e->position_local.x <= focus_win->control->size.x - 4 - 1 && 0 <= e->position_local.y && e->position_local.y <= 16 - 1){\r
+                       Window_Draw_CloseButton(focus_win, true);\r
+               }\r
+       }\r
+       if((e->button & MOUSE_BUTTON_L) == 0 && (e->button_before & MOUSE_BUTTON_L) != 0){      /*L release*/\r
+               Sheet_Slide(focus_win->client, focus_win->control->position.x, focus_win->control->position.y + focus_win->control->size.y);\r
+               Window_Draw_CloseButton(focus_win, false);\r
+       }\r
+       return;\r
+}\r
+\r
+void Window_Draw_CloseButton(UI_Window *win, bool pressed)\r
+{\r
+       uint x, y, color;\r
+       uchar c;\r
+\r
+       if(pressed){\r
+               Sheet_Draw_Fill_Rectangle_Gradation_Vertical(win->control, 0xff0000, 0xffffff, win->control->size.x - 44, 0, win->control->size.x - 4 - 1, 16 - 1);\r
+       } else{\r
+               Sheet_Draw_Fill_Rectangle_Gradation_Vertical(win->control, 0xffffff, 0xff0000, win->control->size.x - 44, 0, win->control->size.x - 4 - 1, 16 - 1);\r
+       }\r
+\r
+       for(y = 0; y < 16; y++){\r
+               for(x = 0; x < 40; x++){\r
+                       c = closebutton[y][x];\r
+                       color = 0x000000;\r
+                       if(c == '@'){\r
+                               //color = 0x8b0000;\r
+                       } else if(c == '$'){\r
+                               //color = 0xff0000;\r
+                       } else if(c == 'Q'){\r
+                               //color = 0xff0000;\r
+                       } else if(c == 'J'){\r
+                               color = 0xffffff;\r
+                       } else if(c == 'O'){\r
+                               //color = 0xffffff;\r
+                       }\r
+                       if(color != 0x000000){\r
+                               Sheet_Draw_Point(win->control, color, win->control->size.x - 44 + x, y);\r
+                       }\r
+               }\r
+       }\r
+\r
+       return;\r
+}\r