04146de7fc23079eeee03093084b215f18d4cd57
[vlc.git] / modules / gui / skins / controls / checkbox.cpp
1 /*****************************************************************************
2  * checkbox.cpp: Checkbox control
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN
5  * $Id: checkbox.cpp,v 1.5 2003/04/21 21:51:16 asmax Exp $
6  *
7  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
8  *          Emmanuel Puig    <karibu@via.ecp.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
23  * USA.
24  *****************************************************************************/
25
26
27 //--- VLC -------------------------------------------------------------------
28 #include <vlc/intf.h>
29
30 //--- SKIN ------------------------------------------------------------------
31 #include "../src/bitmap.h"
32 #include "../src/banks.h"
33 #include "generic.h"
34 #include "checkbox.h"
35 #include "../src/event.h"
36 #include "../src/theme.h"
37 #include "../src/window.h"
38 #include "../src/skin_common.h"
39
40
41 #include "../os_event.h"
42 #include "../os_window.h"
43
44 //---------------------------------------------------------------------------
45 // Checkbox Button
46 //---------------------------------------------------------------------------
47 ControlCheckBox::ControlCheckBox(
48     string id,
49     bool visible,
50     int x, int y,
51     string img1, string img2, string clickimg1, string clickimg2,
52     string disabled1, string disabled2,
53     string onclick1, string onclick2, string onmouseover1,
54     string onmouseout1, string onmouseover2, string onmouseout2,
55     string tooltiptext1, string tooltiptext2, string help,
56     SkinWindow *Parent ) : GenericControl( id, visible, help, Parent )
57 {
58     Left             = x;
59     Top              = y;
60     State            = 1;                   // 1 = up - 0 = down
61     Selected         = false;
62     CursorIn         = false;
63     Act              = 1;
64     Enabled1         = true;
65     Enabled2         = true;
66     Img1             = img1;
67     Img2             = img2;
68     Click1           = clickimg1;
69     Click2           = clickimg2;
70     Disabled1        = disabled1;
71     Disabled2        = disabled2;
72
73     // Actions
74     ClickActionName1     = onclick1;
75     ClickActionName2     = onclick2;
76
77     MouseOverActionName1 = onmouseover1;
78     MouseOutActionName1  = onmouseout1;
79
80     if( onmouseover2 == "none" )
81         MouseOverActionName2 = MouseOverActionName1;
82     else
83         MouseOverActionName2 = onmouseover2;
84
85     if( onmouseout2 == "none" )
86         MouseOutActionName2 = MouseOutActionName1;
87     else
88         MouseOutActionName2  = onmouseout2;
89
90     // Tooltips
91     ToolTipText1     = tooltiptext1;
92     ToolTipText2     = tooltiptext2;
93 }
94 //---------------------------------------------------------------------------
95 ControlCheckBox::~ControlCheckBox()
96 {
97 }
98 //---------------------------------------------------------------------------
99 void ControlCheckBox::Init()
100 {
101     Img = new (Bitmap*)[6];
102
103     // Images for position 1
104     Img[0] = p_intf->p_sys->p_theme->BmpBank->Get( Img1 );
105     if( Click1 == "none" )
106         Img[1] = p_intf->p_sys->p_theme->BmpBank->Get( Img2 );
107     else
108         Img[1] = p_intf->p_sys->p_theme->BmpBank->Get( Click1 );
109
110     // Images for position 2
111     Img[2] = p_intf->p_sys->p_theme->BmpBank->Get( Img2 );
112     if( Click2 == "none" )
113         Img[3] = p_intf->p_sys->p_theme->BmpBank->Get( Img1 );
114     else
115         Img[3] = p_intf->p_sys->p_theme->BmpBank->Get( Click2 );
116
117     // Disabled images
118     if( Disabled1 == "none" )
119         Img[4] = p_intf->p_sys->p_theme->BmpBank->Get( Img1 );
120     else
121         Img[4] = p_intf->p_sys->p_theme->BmpBank->Get( Disabled1 );
122     if( Disabled2 == "none" )
123         Img[5] = p_intf->p_sys->p_theme->BmpBank->Get( Img2 );
124     else
125         Img[5] = p_intf->p_sys->p_theme->BmpBank->Get( Disabled2 );
126
127     // Get Size of control
128     Img[0]->GetSize( Width, Height );
129
130     // Create script
131     ClickAction1 = new Action( p_intf, ClickActionName1 );
132     ClickAction2 = new Action( p_intf, ClickActionName2 );
133     MouseOverAction1 = new Action( p_intf, MouseOverActionName1 );
134     MouseOutAction1  = new Action( p_intf, MouseOutActionName1 );
135     MouseOverAction2 = new Action( p_intf, MouseOverActionName2 );
136     MouseOutAction2  = new Action( p_intf, MouseOutActionName2 );
137 }
138 //---------------------------------------------------------------------------
139 bool ControlCheckBox::ProcessEvent( Event *evt  )
140 {
141     switch( evt->GetMessage() )
142     {
143         case CTRL_ENABLED:
144             Enable( (Event*)evt->GetParam1(), (bool)evt->GetParam2() );
145             break;
146         case CTRL_SYNCHRO:
147             if( ClickAction1->MatchEvent( (Event*)evt->GetParam1(),
148                 ACTION_MATCH_ONE ) )
149             {
150                 Act = 2;
151                 ParentWindow->Refresh( Left, Top, Width, Height );
152             }
153             else if( ClickAction2->MatchEvent( (Event*)evt->GetParam1(),
154                 ACTION_MATCH_ONE ) )
155             {
156                 Act = 1;
157                 ParentWindow->Refresh( Left, Top, Width, Height );
158             }
159             break;
160     }
161     return false;
162 }
163 //---------------------------------------------------------------------------
164 void ControlCheckBox::MoveRelative( int xOff, int yOff )
165 {
166     Left += xOff;
167     Top  += yOff;
168 }
169 //---------------------------------------------------------------------------
170 void ControlCheckBox::Draw( int x, int y, int w, int h, Graphics *dest )
171 {
172     if( !Visible )
173         return;
174
175     int xI, yI, wI, hI;
176     if( GetIntersectRgn( x,y,w,h,Left,Top,Width,Height, xI, yI, wI, hI ) )
177     {
178         if( Act == 1 )
179         {
180             if( State == 1 && Enabled1 )
181                 Img[0]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
182             else if( State == 0 && Enabled1 )
183                 Img[1]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
184             else
185                 Img[4]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
186         }
187         else if( Act == 2 )
188         {
189             if( State == 1 && Enabled2 )
190                 Img[2]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
191             else if( State == 0 && Enabled2 )
192                 Img[3]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
193             else
194                 Img[5]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
195         }
196     }
197 }
198 //---------------------------------------------------------------------------
199 bool ControlCheckBox::MouseUp( int x, int y, int button )
200 {
201     // Test enabled
202     if( ( !Enabled1 && Act == 1 && Img[1]->Hit( x - Left, y - Top ) ) ||
203         ( !Enabled2 && Act == 2 && Img[3]->Hit( x - Left, y - Top ) ) )
204             return true;
205
206     if( button == 1 && Selected )
207     {
208         if( Act == 1 && Img[1]->Hit( x - Left, y - Top ) )
209         {
210             State    = 1;
211             Selected = false;
212             Act      = 2;
213             ParentWindow->Refresh( Left, Top, Width, Height );
214             ClickAction1->SendEvent();
215             return true;
216         }
217         else if( Act == 2 && Img[3]->Hit( x - Left, y - Top ) )
218         {
219             State    = 1;
220             Selected = false;
221             Act      = 1;
222             ParentWindow->Refresh( Left, Top, Width, Height );
223             ClickAction2->SendEvent();
224             return true;
225         }
226     }
227     Selected = false;
228     return false;
229 }
230 //---------------------------------------------------------------------------
231 bool ControlCheckBox::MouseDown( int x, int y, int button )
232 {
233
234     // Test enabled
235     if( ( !Enabled1 && Act == 1 && Img[1]->Hit( x - Left, y - Top ) ) ||
236         ( !Enabled2 && Act == 2 && Img[3]->Hit( x - Left, y - Top ) ) )
237             return true;
238     if( button == 1 )
239     {
240         if( Act == 1 && Img[0]->Hit( x - Left, y - Top ) )
241         {
242             State    = 0;
243             Selected = true;
244             ParentWindow->Refresh( Left, Top, Width, Height );
245             return true;
246         }
247         else if( Act == 2 && Img[2]->Hit( x - Left, y - Top ) )
248         {
249             State    = 0;
250             Selected = true;
251             ParentWindow->Refresh( Left, Top, Width, Height );
252             return true;
253         }
254     }
255     return false;
256 }
257 //---------------------------------------------------------------------------
258 bool ControlCheckBox::MouseMove( int x, int y, int button )
259 {
260     // Test enabled
261     if( ( !Enabled1 && Act == 1 ) || ( !Enabled2 && Act == 2 ) )
262         return false;
263
264     // If mouse is entering control
265     if( MouseOver( x, y ) && !CursorIn )
266     {
267         // If control is already selected
268         if( button == 1 && Selected )
269         {
270             State = 0;
271             ParentWindow->Refresh( Left, Top, Width, Height );
272         }
273
274         // Check events
275         if( Act == 1 && MouseOverActionName1 != "none" )
276             MouseOverAction1->SendEvent();
277         else if( Act == 2 && MouseOverActionName2 != "none" )
278             MouseOverAction2->SendEvent();
279
280         CursorIn = true;
281         return true;
282     }
283     // If mouse if leaving control
284     else if( !MouseOver( x, y ) && CursorIn )
285     {
286         // If control is already selected
287         if( button == 1 && Selected )
288         {
289             State = 1;
290             ParentWindow->Refresh( Left, Top, Width, Height );
291         }
292
293         // Check events
294         if( Act == 1 && MouseOutActionName1 != "none" )
295             MouseOutAction1->SendEvent();
296         else if( Act == 2 && MouseOutActionName2 != "none" )
297             MouseOutAction2->SendEvent();
298
299         CursorIn = false;
300         return true;
301     }
302     return true;
303 }
304 //---------------------------------------------------------------------------
305 bool ControlCheckBox::MouseOver( int x, int y )
306 {
307     if( Act == 1 )
308     {
309         if( Img[1 - State]->Hit( x - Left, y - Top ) )
310             return true;
311     }
312     else if( Act == 2 )
313     {
314         if( Img[3 - State]->Hit( x - Left, y - Top ) )
315             return true;
316     }
317     return false;
318 }
319 //---------------------------------------------------------------------------
320 bool ControlCheckBox::ToolTipTest( int x, int y )
321 {
322     if( Act == 1 && MouseOver( x, y ) && Enabled1 )
323     {
324         ParentWindow->ChangeToolTipText( ToolTipText1 );
325         return true;
326     }
327     else if( Act == 2 && MouseOver( x, y ) && Enabled2 )
328     {
329         ParentWindow->ChangeToolTipText( ToolTipText2 );
330         return true;
331     }
332     return false;
333 }
334 //---------------------------------------------------------------------------
335 void ControlCheckBox::Enable( Event *event, bool enabled )
336 {
337     if( enabled != !Enabled1 &&
338         ClickAction1->MatchEvent( event, ACTION_MATCH_ONE ) )
339     {
340         Enabled1 = enabled;
341         if( Act == 1 )
342         {
343             // If cursor is in, send mouse out event
344             if( !Enabled1 && CursorIn )
345             {
346                 if( MouseOutActionName2 != "none" )
347                     MouseOutAction2->SendEvent();
348                 CursorIn = false;
349             }
350             ParentWindow->Refresh( Left, Top, Width, Height );
351         }
352     }
353
354
355
356     else if( enabled != !Enabled2 &&
357         ClickAction2->MatchEvent( event, ACTION_MATCH_ONE ) )
358     {
359         Enabled2 = enabled;
360         if( Act == 2 )
361         {
362             // If cursor is in, send mouse out event
363             if( !Enabled2 && CursorIn )
364             {
365                 if( MouseOutActionName2 != "none" )
366                     MouseOutAction2->SendEvent();
367                 CursorIn = false;
368             }
369             ParentWindow->Refresh( Left, Top, Width, Height );
370         }
371     }
372
373 }
374 //---------------------------------------------------------------------------
375