Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.                 control Button
  3. */
  4.  
  5. void DrawFocuseForButton(struct ControlButton *Button)
  6. {
  7.         int     x;
  8.         int     y;
  9.         int     sizex;
  10.         int     sizey;
  11.         struct FINITION *fin;
  12.  
  13.         x=Button->ctrl_x;
  14.         y=Button->ctrl_y;
  15.         sizex=Button->ctrl_sizex;
  16.         sizey=Button->ctrl_sizey;
  17.         fin=(struct FINITION*)Button->finition;
  18.  
  19.         Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,0xbfff);
  20. }
  21.  
  22. void DrawPressedButton(struct ControlButton *Button)
  23. {
  24.         int     x;
  25.         int     y;
  26.         int     sizex;
  27.         int     sizey;
  28.         struct FINITION *fin;
  29.         gui_message_t   message;
  30.        
  31.         x=Button->ctrl_x;
  32.         y=Button->ctrl_y;
  33.         sizex=Button->ctrl_sizex;
  34.         sizey=Button->ctrl_sizey;
  35.         fin=(struct FINITION*)Button->finition;
  36.  
  37.         Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y,sizex,sizey/2,COLOR_FON,COLOR_MIDDLE_LIGHT);
  38.         Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y+sizey/2,sizex,sizey/2,COLOR_MIDDLE_LIGHT,COLOR_FON);
  39.  
  40.        
  41.         Draw(fin,TOOL_HORIZONTAL_LINE,x,x+sizex-1,y,COLOR_ABSOLUTE_DARK);
  42.         Draw(fin,TOOL_VERTICAL_LINE,x,y,y+sizey-1,COLOR_LIGHT);
  43.         Draw(fin,TOOL_HORIZONTAL_LINE,x,x+sizex-1,y+sizey-1,COLOR_LIGHT);
  44.         Draw(fin,TOOL_VERTICAL_LINE,x,y,y+sizey-1,COLOR_ABSOLUTE_DARK);
  45.  
  46.         if (fin->flags & FINITION_ON)
  47.         {
  48.                         message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION;
  49.                         message.arg1=fin->x;
  50.                         message.arg2=fin->y;
  51.                         message.arg3=fin->sizex;
  52.                         message.arg4=fin->sizey;
  53.         }
  54.         else
  55.         {
  56.                         message.type=MESSAGE_FULL_REDRAW_ALL;
  57.         }
  58.  
  59.         SendMessage((struct HEADER*)Button,&message);
  60.        
  61.         if (Button->flags & FLAG_FOCUSE_INPUT_ON) DrawFocuseForButton(Button);
  62. }
  63.  
  64. void DrawInsertButton(struct ControlButton *Button)
  65. {
  66.         int     x;
  67.         int     y;
  68.         int     sizex;
  69.         int     sizey;
  70.         struct FINITION *fin;
  71.  
  72.         x=Button->ctrl_x;
  73.         y=Button->ctrl_y;
  74.         sizex=Button->ctrl_sizex;
  75.         sizey=Button->ctrl_sizey;
  76.         fin=(struct FINITION*)Button->finition;
  77.         Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_INSERT);
  78. }
  79.  
  80. void DrawButton(struct ControlButton *Button)
  81. {
  82.         int     x;
  83.         int     y;
  84.         int     sizex;
  85.         int     sizey;
  86.         struct FINITION *fin;
  87.         gui_message_t   message;
  88.        
  89.         x=Button->ctrl_x;
  90.         y=Button->ctrl_y;
  91.         sizex=Button->ctrl_sizex;
  92.         sizey=Button->ctrl_sizey;
  93.         fin=(struct FINITION*)Button->finition;
  94.  
  95.         Draw(fin,TOOL_GRADIENT_UP_FILLED_RECTANGLE,x,y,sizex,sizey,COLOR_FON,COLOR_MIDDLE_LIGHT);
  96.         //Draw(fin,TOOL_GRADIENT_DOWN_FILLED_RECTANGLE,x,y+sizey/2,sizex,sizey/2,COLOR_FON,COLOR_MIDDLE_LIGHT);
  97.  
  98.        
  99.         Draw(fin,TOOL_RECTANGLE,x,y,sizex,sizey,COLOR_ABSOLUTE_DARK);
  100.  
  101.         Draw(fin,TOOL_HORIZONTAL_LINE,x+1,x+sizex-2,y+1,COLOR_LIGHT);
  102.         Draw(fin,TOOL_VERTICAL_LINE,x+sizex-2,y+1,y+sizey-2,COLOR_MIDDLE_LIGHT);
  103.         Draw(fin,TOOL_HORIZONTAL_LINE,x+1,x+sizex-2,y+sizey-2,COLOR_MIDDLE_LIGHT);
  104.         Draw(fin,TOOL_VERTICAL_LINE,x+1,y+1,y+sizey-2,COLOR_LIGHT);
  105.  
  106.         if (Button->child_bk!=NULL)
  107.         {              
  108.                 if (fin->flags & FINITION_ON)
  109.                 {
  110.                         message.type=MESSAGE_FULL_REDRAW_ALL_WITH_FINITION;
  111.                         message.arg1=fin->x;
  112.                         message.arg2=fin->y;
  113.                         message.arg3=fin->sizex;
  114.                         message.arg4=fin->sizey;
  115.                 }
  116.                 else
  117.                 {
  118.                         message.type=MESSAGE_FULL_REDRAW_ALL;
  119.                 }
  120.                 SendMessage((struct HEADER*)Button,&message);
  121.         }
  122.         if (Button->flags & FLAG_FOCUSE_INPUT_ON) DrawFocuseForButton(Button);
  123. }
  124.  
  125. //---------------------------------------------------------------------------------
  126. //                       control Button
  127. //---------------------------------------------------------------------------------
  128. void ButtonProc(struct ControlButton *button,struct MESSAGE *message)
  129. {
  130.         int                     x,y,btn_state;
  131.         char                    v;
  132.         struct  TIMER           *timer;
  133.         struct  FINITION        *fin;
  134.         parent_t                *main_parent;
  135.  
  136.         switch(message->type)
  137.         {
  138.                 case MESSAGE_FULL_REDRAW_ALL:
  139.                 {
  140.                         //draw button
  141.                         if (button->flags & FLAG_SHOW_CONTROL)  DrawButton(button);
  142.                         break;
  143.                 }
  144.                 case MESSAGE_FULL_REDRAW_ALL_WITH_FINITION:
  145.                 {
  146.                         fin=(struct FINITION*)button->finition;
  147.                         fin->flags=fin->flags | FINITION_ON;
  148.                         fin->x=message->arg1;
  149.                         fin->y=message->arg2;
  150.                         fin->sizex=message->arg3;
  151.                         fin->sizey=message->arg4;
  152.                         DrawButton(button);
  153.                         break;
  154.                 }
  155.                 case MESSAGE_KEYS_EVENT:
  156.                 {
  157.                         main_parent=(parent_t*)button->main_parent;
  158.                         //not relazed yet
  159.                         if (button->flags & FLAG_FOCUSE_INPUT_ON)
  160.                         {
  161.                                 if (message->arg1==KEY_DOWN)
  162.                                 {
  163.                                         if (message->arg2==SC_SPACE)
  164.                                         {
  165.                                                 button->btn_flags=button->btn_flags | FLAG_PRESSED_BUTTON_ON;
  166.  
  167.                                                 if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT)!=NULL)
  168.                                                 {
  169.                                                         button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
  170.                                                         main_parent->control_for_callback_function[main_parent->number_callbacks]=
  171.                                                         (DWORD*)button;
  172.                                                         main_parent->callback_for_control_callback[main_parent->number_callbacks]=
  173.                                                         (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT);
  174.                                                         main_parent->number_callbacks++;
  175.                                                 }
  176.                                                 if (button->flags & FLAG_SHOW_CONTROL) DrawPressedButton(button);
  177.                                         }
  178.                                 }
  179.                                 else
  180.                                 {
  181.                                         if (message->arg2==SC_SPACE)
  182.                                         {
  183.                                                 button->btn_flags=button->btn_flags | FLAG_RELEASED_BUTTON_ON;
  184.                                                 button->btn_flags=button->btn_flags & FLAG_PRESSED_BUTTON_OFF;
  185.  
  186.                                                 if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT)!=NULL)
  187.                                                 {
  188.                                                         button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
  189.                                                         main_parent->control_for_callback_function[main_parent->number_callbacks]=
  190.                                                         (DWORD*)button;
  191.                                                         main_parent->callback_for_control_callback[main_parent->number_callbacks]=
  192.                                                         (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT);
  193.                                                         main_parent->number_callbacks++;
  194.                                                 }
  195.                                                 if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
  196.                                         }
  197.                                 }
  198.                         }
  199.                         break;
  200.                 }
  201.                 case MESSAGE_SPECIALIZED:
  202.                 {
  203.                         if (button->flags & FLAG_GET_SPECIALIZED_MESSAGE_ON)
  204.                         {
  205.                                 if (button->flags & FLAG_SHOW_CONTROL)  DrawButton(button);
  206.                                 button->flags=button->flags & FLAG_GET_SPECIALIZED_MESSAGE_OFF;
  207.                         }                      
  208.                         break;
  209.                 }
  210.                 case MESSAGE_MOUSE_EVENT:
  211.                 {       //check press of mouse buttons
  212.                         x=message->arg1;
  213.                         y=message->arg2;
  214.                         main_parent=(parent_t*)button->main_parent;
  215.  
  216.                         if (message->arg3==MOUSE_LEFT_BUTTON_UP)
  217.                         {
  218.                                 //insert of button
  219.                                 if (CheckCrossBox((struct HEADER*)button,x,y)==TRUE)
  220.                                 {
  221.                                         v=button->btn_flags & FLAG_INSERT_BUTTON_ON;
  222.                                         if ((ControlCheckCallbackEvent(button,(DWORD)BUTTON_ENTER_EVENT)!=NULL) && (v==FALSE))
  223.                                         {
  224.                                                 button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
  225.                                                 main_parent->control_for_callback_function[main_parent->number_callbacks]=
  226.                                                 (DWORD*)button;
  227.                                                 main_parent->callback_for_control_callback[main_parent->number_callbacks]=
  228.                                                 (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_ENTER_EVENT);
  229.                                                 main_parent->number_callbacks++;
  230.                                         }
  231.                                         button->btn_flags=button->btn_flags | FLAG_INSERT_BUTTON_ON;
  232.  
  233.                                         if (button->flags & FLAG_SHOW_CONTROL) DrawInsertButton(button);
  234.                                 }
  235.                                 else
  236.                                 {
  237.                                         v=button->btn_flags & FLAG_INSERT_BUTTON_ON;
  238.                                         if (v==TRUE)
  239.                                         {
  240.                                                 if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_LEAVE_EVENT)!=NULL)
  241.                                                 {
  242.                                                         button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
  243.                                                         main_parent->control_for_callback_function[main_parent->number_callbacks]=
  244.                                                         (DWORD*)button;
  245.                                                         main_parent->callback_for_control_callback[main_parent->number_callbacks]=
  246.                                                         (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_LEAVE_EVENT);
  247.                                                         main_parent->number_callbacks++;
  248.                                                 }
  249.                                                 button->btn_flags=button->btn_flags & FLAG_INSERT_BUTTON_OFF;
  250.                                                 if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
  251.                                         }
  252.                                 }
  253.  
  254.                                 if (button->btn_flags & FLAG_PRESSED_BUTTON_ON)
  255.                                 {
  256.                                         button->btn_flags=button->btn_flags & FLAG_PRESSED_BUTTON_OFF;
  257.                                         button->btn_flags=button->btn_flags | FLAG_RELEASED_BUTTON_ON;
  258.  
  259.                                         if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT)!=NULL)
  260.                                         {
  261.                                                 button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
  262.                                                 main_parent->control_for_callback_function[main_parent->number_callbacks]=
  263.                                                 (DWORD*)button;
  264.                                                 main_parent->callback_for_control_callback[main_parent->number_callbacks]=
  265.                                                 (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_RELEASED_EVENT);
  266.                                                 main_parent->number_callbacks++;
  267.                                         }
  268.                                         if (button->flags & FLAG_SHOW_CONTROL) DrawButton(button);
  269.                                 }
  270.                                
  271.                                
  272.                         }
  273.                         else
  274.                         {
  275.                                 if (CheckCrossBox((struct HEADER*)button,x,y)==TRUE)
  276.                                 {
  277.                                         if (message->arg3==MOUSE_LEFT_BUTTON_DOWN)
  278.                                         {
  279.                                                 if ((button->btn_flags & FLAG_PRESSED_BUTTON_ON)==FALSE)
  280.                                                         {if (button->flags & FLAG_SHOW_CONTROL)
  281.                                                                 DrawPressedButton(button);}
  282.                                                 button->btn_flags=button->btn_flags | FLAG_PRESSED_BUTTON_ON;
  283.                                         }
  284.                                 }
  285.  
  286.                                 if ((message->arg3==MOUSE_LEFT_BUTTON_DOWN) && (button->btn_flags & FLAG_PRESSED_BUTTON_ON))
  287.                                 {
  288.                                         if (ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT)!=NULL)
  289.                                         {
  290.                                                 button->flags=button->flags | FLAG_CONNECT_EVENT_ON;
  291.                                                 main_parent->control_for_callback_function[main_parent->number_callbacks]=
  292.                                                 (DWORD*)button;
  293.                                                 main_parent->callback_for_control_callback[main_parent->number_callbacks]=
  294.                                                 (DWORD*)ControlCheckCallbackEvent(button,(DWORD)BUTTON_PRESSED_EVENT);
  295.                                                 main_parent->number_callbacks++;
  296.                                         }
  297.                                 }
  298.                         }
  299.                         break;
  300.                 }
  301.                 case MESSAGE_CHANGE_POSITION_EVENT:
  302.                 {
  303.                         button->ctrl_x=button->ctrl_x+message->arg1;
  304.                         button->ctrl_y=button->ctrl_y+message->arg2;
  305.                         break;
  306.                 }
  307.                 case MESSAGE_CALL_TIMER_EVENT:
  308.                 {
  309.                         if (button->timer!=(DWORD*)NULL)
  310.                         {
  311.                                 timer=(struct TIMER*)button->timer;
  312.                                 if (timer->flags & FLAG_TIMER_ON)       Timer(timer);
  313.                         }
  314.                         break;
  315.                 }
  316.                 case MESSAGE_SET_FOCUSE:
  317.                 {
  318.                         button->flags=button->flags | FLAG_FOCUSE_INPUT_ON;
  319.                         if (button->flags & FLAG_SHOW_CONTROL)  DrawButton(button);
  320.                         break;
  321.                 }
  322.                 case MESSAGE_CHANGE_FOCUSE:
  323.                 {
  324.                         button->flags=button->flags & FLAG_FOCUSE_INPUT_OFF;
  325.                         if (button->flags & FLAG_SHOW_CONTROL)  DrawButton(button);
  326.                         break;
  327.                 }
  328.                 case MESSAGE_DESTROY_CONTROL:
  329.                 {
  330.                         if (button->timer!=(DWORD*)NULL)        free(button->timer);
  331.                         free(button->finition);
  332.                         break;
  333.                 }
  334.                 case MESSAGE_SET_MAIN_PARENT:
  335.                 {
  336.                         SendMessage((struct HEADER*)button,message);
  337.                         button->main_parent=(DWORD*)message->arg1;
  338.                         break;
  339.                 }
  340.                 default: break;
  341.         }
  342.         //send message to child controls(if there is)
  343.         SendMessage((struct HEADER*)button,message);
  344. }
  345.  
  346. //---------------------------------------------------------------------------------
  347. //                              create control Button
  348. //---------------------------------------------------------------------------------
  349. void* CreateButton(struct ButtonData *info_for_control)
  350. {
  351.         struct ControlButton *Button;
  352.         struct FINITION *fin;
  353.  
  354.         Button=malloc(sizeof(struct ControlButton));
  355.         Button->finition=malloc(sizeof(struct FINITION));
  356.         fin=(struct FINITION*)Button->finition;
  357.         fin->flags=0;
  358.        
  359.         ID++;
  360. #ifdef  DEBUG
  361.         printf("\ncreated button with ID=%d",(int)ID);
  362. #endif
  363.         Button->child_bk=(DWORD*)NULL;
  364.         Button->child_fd=(DWORD*)NULL;
  365.         Button->active_control_for_keys=(DWORD*)NULL;
  366.         Button->active_control_for_mouse=(DWORD*)NULL;
  367.         Button->callback=(DWORD*)NULL;
  368.         Button->timer=(DWORD*)NULL;
  369.  
  370.         Button->ctrl_proc=(DWORD*)&ButtonProc;
  371.         Button->ctrl_x=info_for_control->x;
  372.         Button->ctrl_y=info_for_control->y;
  373.         Button->ctrl_sizex=info_for_control->width;
  374.         Button->ctrl_sizey=info_for_control->height;
  375.         Button->ctrl_ID=ID;
  376.         Button->flags=0;
  377.         Button->flags=Button->flags | FLAG_SHOW_CONTROL;
  378.         Button->flags=Button->flags | FLAG_FOCUSE_INPUT_SUPPOROTE;
  379.  
  380.         Button->btn_flags=0;
  381.  
  382.         return(Button);
  383. }
  384.  
  385. void* CreateButtonWithText(gui_button_data_t *info,char *txt)
  386. {
  387.         gui_button_t    *Button;
  388.         gui_text_t              *text;
  389.         gui_text_data_t txtdata;
  390.         int                     len;
  391.        
  392.         Button=CreateButton(info);
  393.         len=strlen(txt)+1;//one byte for simbol end of string
  394.        
  395.         txtdata.x=0;
  396.         txtdata.y=0;
  397.         txtdata.font=NULL;
  398.         txtdata.background=FALSE;
  399.         txtdata.color=0;
  400.         txtdata.text=malloc(len);
  401.         memmove(txtdata.text,txt,len);
  402.         txtdata.text[len]='\0';
  403.         text=CreateText(&txtdata);
  404.  
  405.         if (text->ctrl_sizex>Button->ctrl_sizex) Button->ctrl_sizex=text->ctrl_sizex+10;
  406.         if (text->ctrl_sizey>Button->ctrl_sizey) Button->ctrl_sizey=text->ctrl_sizey+6;
  407.        
  408.         text->ctrl_x=(Button->ctrl_sizex/2)-(text->ctrl_sizex/2);
  409.         text->ctrl_y=(Button->ctrl_sizey/2)-(text->ctrl_sizey/2);
  410.         PackControls(Button,text);
  411.        
  412.         return(Button);
  413. }
  414.  
  415.