mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-01 13:06:58 +03:00
66bf88987d
git-svn-id: svn://kolibrios.org@1176 a494cfbc-eb01-0410-851d-a64ba20cac60
415 lines
12 KiB
C++
415 lines
12 KiB
C++
/*
|
|
control Button
|
|
*/
|
|
|
|
void DrawFocuseForButton(struct ControlButton *Button)
|
|
{
|
|
int x;
|
|
int y;
|
|
int sizex;
|
|
int sizey;
|
|
struct FINITION *fin;
|
|
|
|
x=Button->ctrl_x;
|
|
y=Button->ctrl_y;
|
|
sizex=Button->ctrl_sizex;
|
|
sizey=Button->ctrl_sizey;
|
|
fin=(struct FINITION*)Button->finition;
|
|
|
|
Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,0xbfff);
|
|
}
|
|
|
|
void DrawPressedButton(struct ControlButton *Button)
|
|
{
|
|
int x;
|
|
int y;
|
|
int sizex;
|
|
int sizey;
|
|
struct FINITION *fin;
|
|
gui_message_t message;
|
|
|
|
x=Button->ctrl_x;
|
|
y=Button->ctrl_y;
|
|
sizex=Button->ctrl_sizex;
|
|
sizey=Button->ctrl_sizey;
|
|
fin=(struct FINITION*)Button->finition;
|
|
|
|
Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y,sizex,sizey/2,COLOR_FON,COLOR_MIDDLE_LIGHT);
|
|
Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y+sizey/2,sizex,sizey/2,COLOR_MIDDLE_LIGHT,COLOR_FON);
|
|
|
|
|
|
Draw(fin,TOOL_HORIZONTAL_LINE,x,x+sizex-1,y,COLOR_ABSOLUTE_DARK);
|
|
Draw(fin,TOOL_VERTICAL_LINE,x,y,y+sizey-1,COLOR_LIGHT);
|
|
Draw(fin,TOOL_HORIZONTAL_LINE,x,x+sizex-1,y+sizey-1,COLOR_LIGHT);
|
|
Draw(fin,TOOL_VERTICAL_LINE,x,y,y+sizey-1,COLOR_ABSOLUTE_DARK);
|
|
|
|
if (fin->flags & FINITION_ON)
|
|
{
|
|
message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION;
|
|
message.arg1=fin->x;
|
|
message.arg2=fin->y;
|
|
message.arg3=fin->sizex;
|
|
message.arg4=fin->sizey;
|
|
}
|
|
else
|
|
{
|
|
message.type=MESSAGE_FULL_REDRAW_ALL;
|
|
}
|
|
|
|
SendMessage((struct HEADER*)Button,&message);
|
|
|
|
if (Button->flags & FLAG_FOCUSE_INPUT_ON) DrawFocuseForButton(Button);
|
|
}
|
|
|
|
void DrawInsertButton(struct ControlButton *Button)
|
|
{
|
|
int x;
|
|
int y;
|
|
int sizex;
|
|
int sizey;
|
|
struct FINITION *fin;
|
|
|
|
x=Button->ctrl_x;
|
|
y=Button->ctrl_y;
|
|
sizex=Button->ctrl_sizex;
|
|
sizey=Button->ctrl_sizey;
|
|
fin=(struct FINITION*)Button->finition;
|
|
Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_INSERT);
|
|
}
|
|
|
|
void DrawButton(struct ControlButton *Button)
|
|
{
|
|
int x;
|
|
int y;
|
|
int sizex;
|
|
int sizey;
|
|
struct FINITION *fin;
|
|
gui_message_t message;
|
|
|
|
x=Button->ctrl_x;
|
|
y=Button->ctrl_y;
|
|
sizex=Button->ctrl_sizex;
|
|
sizey=Button->ctrl_sizey;
|
|
fin=(struct FINITION*)Button->finition;
|
|
|
|
Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x,y,sizex,sizey,COLOR_FON,COLOR_MIDDLE_LIGHT);
|
|
//Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y+sizey/2,sizex,sizey/2,COLOR_FON,COLOR_MIDDLE_LIGHT);
|
|
|
|
|
|
Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_ABSOLUTE_DARK);
|
|
|
|
Draw(fin,TOOL_HORIZONTAL_LINE,x+1,x+sizex-2,y+1,COLOR_LIGHT);
|
|
Draw(fin,TOOL_VERTICAL_LINE,x+sizex-2,y+1,y+sizey-2,COLOR_MIDDLE_LIGHT);
|
|
Draw(fin,TOOL_HORIZONTAL_LINE,x+1,x+sizex-2,y+sizey-2,COLOR_MIDDLE_LIGHT);
|
|
Draw(fin,TOOL_VERTICAL_LINE,x+1,y+1,y+sizey-2,COLOR_LIGHT);
|
|
|
|
if (Button->child_bk!=NULL)
|
|
{
|
|
if (fin->flags & FINITION_ON)
|
|
{
|
|
message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION;
|
|
message.arg1=fin->x;
|
|
message.arg2=fin->y;
|
|
message.arg3=fin->sizex;
|
|
message.arg4=fin->sizey;
|
|
}
|
|
else
|
|
{
|
|
message.type=MESSAGE_FULL_REDRAW_ALL;
|
|
}
|
|
SendMessage((struct HEADER*)Button,&message);
|
|
}
|
|
if (Button->flags & FLAG_FOCUSE_INPUT_ON) DrawFocuseForButton(Button);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// control Button
|
|
//---------------------------------------------------------------------------------
|
|
void ButtonProc(struct ControlButton *button,struct MESSAGE *message)
|
|
{
|
|
int x,y,btn_state;
|
|
char v;
|
|
struct TIMER *timer;
|
|
struct FINITION *fin;
|
|
parent_t *main_parent;
|
|
|
|
switch(message->type)
|
|
{
|
|
case MESSAGE_FULL_REDRAW_ALL:
|
|
{
|
|
//draw button
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
|
|
break;
|
|
}
|
|
case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION:
|
|
{
|
|
fin=(struct FINITION*)button->finition;
|
|
fin->flags=fin->flags | FINITION_ON;
|
|
fin->x=message->arg1;
|
|
fin->y=message->arg2;
|
|
fin->sizex=message->arg3;
|
|
fin->sizey=message->arg4;
|
|
DrawButton(button);
|
|
break;
|
|
}
|
|
case MESSAGE_KEYS_EVENT:
|
|
{
|
|
main_parent=(parent_t*)button->main_parent;
|
|
//not relazed yet
|
|
if (button->flags & FLAG_FOCUSE_INPUT_ON)
|
|
{
|
|
if (message->arg1==KEY_DOWN)
|
|
{
|
|
if (message->arg2==SC_SPACE)
|
|
{
|
|
button->btn_flags=button->btn_flags | FLAG_PRESSED_BUTTON_ON;
|
|
|
|
if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT)!=NULL)
|
|
{
|
|
button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
|
|
main_parent->control_for_callback_function[main_parent->number_callbacks]=
|
|
(DWORD*)button;
|
|
main_parent->callback_for_control_callback[main_parent->number_callbacks]=
|
|
(DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT);
|
|
main_parent->number_callbacks++;
|
|
}
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawPressedButton(button);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (message->arg2==SC_SPACE)
|
|
{
|
|
button->btn_flags=button->btn_flags | FLAG_RELEASED_BUTTON_ON;
|
|
button->btn_flags=button->btn_flags & FLAG_PRESSED_BUTTON_OFF;
|
|
|
|
if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT)!=NULL)
|
|
{
|
|
button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
|
|
main_parent->control_for_callback_function[main_parent->number_callbacks]=
|
|
(DWORD*)button;
|
|
main_parent->callback_for_control_callback[main_parent->number_callbacks]=
|
|
(DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT);
|
|
main_parent->number_callbacks++;
|
|
}
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case MESSAGE_SPECIALIZED:
|
|
{
|
|
if (button->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON)
|
|
{
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
|
|
button->flags=button->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF;
|
|
}
|
|
break;
|
|
}
|
|
case MESSAGE_MOUSE_EVENT:
|
|
{ //check press of mouse buttons
|
|
x=message->arg1;
|
|
y=message->arg2;
|
|
main_parent=(parent_t*)button->main_parent;
|
|
|
|
if (message->arg3==MOUSE_LEFT_BUTTON_UP)
|
|
{
|
|
//insert of button
|
|
if (CheckCrossBox((struct HEADER*)button,x,y)==TRUE)
|
|
{
|
|
v=button->btn_flags & FLAG_INSERT_BUTTON_ON;
|
|
if ((ControlCheckCallbackEvent(button,(DWORD)BUTTON_ENTER_EVENT)!=NULL) && (v==FALSE))
|
|
{
|
|
button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
|
|
main_parent->control_for_callback_function[main_parent->number_callbacks]=
|
|
(DWORD*)button;
|
|
main_parent->callback_for_control_callback[main_parent->number_callbacks]=
|
|
(DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_ENTER_EVENT);
|
|
main_parent->number_callbacks++;
|
|
}
|
|
button->btn_flags=button->btn_flags | FLAG_INSERT_BUTTON_ON;
|
|
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawInsertButton(button);
|
|
}
|
|
else
|
|
{
|
|
v=button->btn_flags & FLAG_INSERT_BUTTON_ON;
|
|
if (v==TRUE)
|
|
{
|
|
if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_LEAVE_EVENT)!=NULL)
|
|
{
|
|
button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
|
|
main_parent->control_for_callback_function[main_parent->number_callbacks]=
|
|
(DWORD*)button;
|
|
main_parent->callback_for_control_callback[main_parent->number_callbacks]=
|
|
(DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_LEAVE_EVENT);
|
|
main_parent->number_callbacks++;
|
|
}
|
|
button->btn_flags=button->btn_flags & FLAG_INSERT_BUTTON_OFF;
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
|
|
}
|
|
}
|
|
|
|
if (button->btn_flags & FLAG_PRESSED_BUTTON_ON)
|
|
{
|
|
button->btn_flags=button->btn_flags & FLAG_PRESSED_BUTTON_OFF;
|
|
button->btn_flags=button->btn_flags | FLAG_RELEASED_BUTTON_ON;
|
|
|
|
if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT)!=NULL)
|
|
{
|
|
button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
|
|
main_parent->control_for_callback_function[main_parent->number_callbacks]=
|
|
(DWORD*)button;
|
|
main_parent->callback_for_control_callback[main_parent->number_callbacks]=
|
|
(DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT);
|
|
main_parent->number_callbacks++;
|
|
}
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
|
|
}
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
if (CheckCrossBox((struct HEADER*)button,x,y)==TRUE)
|
|
{
|
|
if (message->arg3==MOUSE_LEFT_BUTTON_DOWN)
|
|
{
|
|
if ((button->btn_flags & FLAG_PRESSED_BUTTON_ON)==FALSE)
|
|
{if (button->flags & FLAG_SHOW_CONTROL)
|
|
DrawPressedButton(button);}
|
|
button->btn_flags=button->btn_flags | FLAG_PRESSED_BUTTON_ON;
|
|
}
|
|
}
|
|
|
|
if ((message->arg3==MOUSE_LEFT_BUTTON_DOWN) && (button->btn_flags & FLAG_PRESSED_BUTTON_ON))
|
|
{
|
|
if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT)!=NULL)
|
|
{
|
|
button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
|
|
main_parent->control_for_callback_function[main_parent->number_callbacks]=
|
|
(DWORD*)button;
|
|
main_parent->callback_for_control_callback[main_parent->number_callbacks]=
|
|
(DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT);
|
|
main_parent->number_callbacks++;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case MESSAGE_CHANGE_POSITION_EVENT:
|
|
{
|
|
button->ctrl_x=button->ctrl_x+message->arg1;
|
|
button->ctrl_y=button->ctrl_y+message->arg2;
|
|
break;
|
|
}
|
|
case MESSAGE_CALL_TIMER_EVENT:
|
|
{
|
|
if (button->timer!=(DWORD*)NULL)
|
|
{
|
|
timer=(struct TIMER*)button->timer;
|
|
if (timer->flags & FLAG_TIMER_ON) Timer(timer);
|
|
}
|
|
break;
|
|
}
|
|
case MESSAGE_SET_FOCUSE:
|
|
{
|
|
button->flags=button->flags | FLAG_FOCUSE_INPUT_ON;
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
|
|
break;
|
|
}
|
|
case MESSAGE_CHANGE_FOCUSE:
|
|
{
|
|
button->flags=button->flags & FLAG_FOCUSE_INPUT_OFF;
|
|
if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
|
|
break;
|
|
}
|
|
case MESSAGE_DESTROY_CONTROL:
|
|
{
|
|
if (button->timer!=(DWORD*)NULL) free(button->timer);
|
|
free(button->finition);
|
|
break;
|
|
}
|
|
case MESSAGE_SET_MAIN_PARENT:
|
|
{
|
|
SendMessage((struct HEADER*)button,message);
|
|
button->main_parent=(DWORD*)message->arg1;
|
|
break;
|
|
}
|
|
default: break;
|
|
}
|
|
//send message to child controls(if there is)
|
|
SendMessage((struct HEADER*)button,message);
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------
|
|
// create control Button
|
|
//---------------------------------------------------------------------------------
|
|
void* CreateButton(struct ButtonData *info_for_control)
|
|
{
|
|
struct ControlButton *Button;
|
|
struct FINITION *fin;
|
|
|
|
Button=malloc(sizeof(struct ControlButton));
|
|
Button->finition=malloc(sizeof(struct FINITION));
|
|
fin=(struct FINITION*)Button->finition;
|
|
fin->flags=0;
|
|
|
|
ID++;
|
|
#ifdef DEBUG
|
|
printf("\ncreated button with ID=%d",(int)ID);
|
|
#endif
|
|
Button->child_bk=(DWORD*)NULL;
|
|
Button->child_fd=(DWORD*)NULL;
|
|
Button->active_control_for_keys=(DWORD*)NULL;
|
|
Button->active_control_for_mouse=(DWORD*)NULL;
|
|
Button->callback=(DWORD*)NULL;
|
|
Button->timer=(DWORD*)NULL;
|
|
|
|
Button->ctrl_proc=(DWORD*)&ButtonProc;
|
|
Button->ctrl_x=info_for_control->x;
|
|
Button->ctrl_y=info_for_control->y;
|
|
Button->ctrl_sizex=info_for_control->width;
|
|
Button->ctrl_sizey=info_for_control->height;
|
|
Button->ctrl_ID=ID;
|
|
Button->flags=0;
|
|
Button->flags=Button->flags | FLAG_SHOW_CONTROL;
|
|
Button->flags=Button->flags | FLAG_FOCUSE_INPUT_SUPPOROTE;
|
|
|
|
Button->btn_flags=0;
|
|
|
|
return(Button);
|
|
}
|
|
|
|
void* CreateButtonWithText(gui_button_data_t *info,char *txt)
|
|
{
|
|
gui_button_t *Button;
|
|
gui_text_t *text;
|
|
gui_text_data_t txtdata;
|
|
int len;
|
|
|
|
Button=CreateButton(info);
|
|
len=strlen(txt)+1;//one byte for simbol end of string
|
|
|
|
txtdata.x=0;
|
|
txtdata.y=0;
|
|
txtdata.font=NULL;
|
|
txtdata.background=FALSE;
|
|
txtdata.color=0;
|
|
txtdata.text=malloc(len);
|
|
memmove(txtdata.text,txt,len);
|
|
txtdata.text[len]='\0';
|
|
text=CreateText(&txtdata);
|
|
|
|
if (text->ctrl_sizex>Button->ctrl_sizex) Button->ctrl_sizex=text->ctrl_sizex+10;
|
|
if (text->ctrl_sizey>Button->ctrl_sizey) Button->ctrl_sizey=text->ctrl_sizey+6;
|
|
|
|
text->ctrl_x=(Button->ctrl_sizex/2)-(text->ctrl_sizex/2);
|
|
text->ctrl_y=(Button->ctrl_sizey/2)-(text->ctrl_sizey/2);
|
|
PackControls(Button,text);
|
|
|
|
return(Button);
|
|
}
|
|
|