kolibrios/programs/develop/libraries/libGUI/SRC/control_button.inc
andrew_programmer 66bf88987d bugfix of last SVN revision
git-svn-id: svn://kolibrios.org@1176 a494cfbc-eb01-0410-851d-a64ba20cac60
2009-09-24 22:01:05 +00:00

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);
}