* modules/gui/skins/*: compilation fixes for MSVC. Almost working, we just to find...
[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.6 2003/05/02 15:53:32 gbazin 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/vlc.h>
29 #include <vlc/intf.h>
30
31 //--- SKIN ------------------------------------------------------------------
32 #include "../src/bitmap.h"
33 #include "../src/banks.h"
34 #include "generic.h"
35 #include "checkbox.h"
36 #include "../src/event.h"
37 #include "../src/theme.h"
38 #include "../src/window.h"
39 #include "../src/skin_common.h"
40
41
42 #include "../os_event.h"
43 #include "../os_window.h"
44
45 //---------------------------------------------------------------------------
46 // Checkbox Button
47 //---------------------------------------------------------------------------
48 ControlCheckBox::ControlCheckBox(
49     string id,
50     bool visible,
51     int x, int y,
52     string img1, string img2, string clickimg1, string clickimg2,
53     string disabled1, string disabled2,
54     string onclick1, string onclick2, string onmouseover1,
55     string onmouseout1, string onmouseover2, string onmouseout2,
56     string tooltiptext1, string tooltiptext2, string help,
57     SkinWindow *Parent ) : GenericControl( id, visible, help, Parent )
58 {
59     Left             = x;
60     Top              = y;
61     State            = 1;                   // 1 = up - 0 = down
62     Selected         = false;
63     CursorIn         = false;
64     Act              = 1;
65     Enabled1         = true;
66     Enabled2         = true;
67     Img1             = img1;
68     Img2             = img2;
69     Click1           = clickimg1;
70     Click2           = clickimg2;
71     Disabled1        = disabled1;
72     Disabled2        = disabled2;
73
74     // Actions
75     ClickActionName1     = onclick1;
76     ClickActionName2     = onclick2;
77
78     MouseOverActionName1 = onmouseover1;
79     MouseOutActionName1  = onmouseout1;
80
81     if( onmouseover2 == "none" )
82         MouseOverActionName2 = MouseOverActionName1;
83     else
84         MouseOverActionName2 = onmouseover2;
85
86     if( onmouseout2 == "none" )
87         MouseOutActionName2 = MouseOutActionName1;
88     else
89         MouseOutActionName2  = onmouseout2;
90
91     // Tooltips
92     ToolTipText1     = tooltiptext1;
93     ToolTipText2     = tooltiptext2;
94 }
95 //---------------------------------------------------------------------------
96 ControlCheckBox::~ControlCheckBox()
97 {
98 }
99 //---------------------------------------------------------------------------
100 void ControlCheckBox::Init()
101 {
102     Img = new (Bitmap *[6]);
103
104     // Images for position 1
105     Img[0] = p_intf->p_sys->p_theme->BmpBank->Get( Img1 );
106     if( Click1 == "none" )
107         Img[1] = p_intf->p_sys->p_theme->BmpBank->Get( Img2 );
108     else
109         Img[1] = p_intf->p_sys->p_theme->BmpBank->Get( Click1 );
110
111     // Images for position 2
112     Img[2] = p_intf->p_sys->p_theme->BmpBank->Get( Img2 );
113     if( Click2 == "none" )
114         Img[3] = p_intf->p_sys->p_theme->BmpBank->Get( Img1 );
115     else
116         Img[3] = p_intf->p_sys->p_theme->BmpBank->Get( Click2 );
117
118     // Disabled images
119     if( Disabled1 == "none" )
120         Img[4] = p_intf->p_sys->p_theme->BmpBank->Get( Img1 );
121     else
122         Img[4] = p_intf->p_sys->p_theme->BmpBank->Get( Disabled1 );
123     if( Disabled2 == "none" )
124         Img[5] = p_intf->p_sys->p_theme->BmpBank->Get( Img2 );
125     else
126         Img[5] = p_intf->p_sys->p_theme->BmpBank->Get( Disabled2 );
127
128     // Get Size of control
129     Img[0]->GetSize( Width, Height );
130
131     // Create script
132     ClickAction1 = new Action( p_intf, ClickActionName1 );
133     ClickAction2 = new Action( p_intf, ClickActionName2 );
134     MouseOverAction1 = new Action( p_intf, MouseOverActionName1 );
135     MouseOutAction1  = new Action( p_intf, MouseOutActionName1 );
136     MouseOverAction2 = new Action( p_intf, MouseOverActionName2 );
137     MouseOutAction2  = new Action( p_intf, MouseOutActionName2 );
138 }
139 //---------------------------------------------------------------------------
140 bool ControlCheckBox::ProcessEvent( Event *evt  )
141 {
142     switch( evt->GetMessage() )
143     {
144         case CTRL_ENABLED:
145             Enable( (Event*)evt->GetParam1(), (bool)evt->GetParam2() );
146             break;
147         case CTRL_SYNCHRO:
148             if( ClickAction1->MatchEvent( (Event*)evt->GetParam1(),
149                 ACTION_MATCH_ONE ) )
150             {
151                 Act = 2;
152                 ParentWindow->Refresh( Left, Top, Width, Height );
153             }
154             else if( ClickAction2->MatchEvent( (Event*)evt->GetParam1(),
155                 ACTION_MATCH_ONE ) )
156             {
157                 Act = 1;
158                 ParentWindow->Refresh( Left, Top, Width, Height );
159             }
160             break;
161     }
162     return false;
163 }
164 //---------------------------------------------------------------------------
165 void ControlCheckBox::MoveRelative( int xOff, int yOff )
166 {
167     Left += xOff;
168     Top  += yOff;
169 }
170 //---------------------------------------------------------------------------
171 void ControlCheckBox::Draw( int x, int y, int w, int h, Graphics *dest )
172 {
173     if( !Visible )
174         return;
175
176     int xI, yI, wI, hI;
177     if( GetIntersectRgn( x,y,w,h,Left,Top,Width,Height, xI, yI, wI, hI ) )
178     {
179         if( Act == 1 )
180         {
181             if( State == 1 && Enabled1 )
182                 Img[0]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
183             else if( State == 0 && Enabled1 )
184                 Img[1]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
185             else
186                 Img[4]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
187         }
188         else if( Act == 2 )
189         {
190             if( State == 1 && Enabled2 )
191                 Img[2]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
192             else if( State == 0 && Enabled2 )
193                 Img[3]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
194             else
195                 Img[5]->DrawBitmap( xI-Left,yI-Top,wI,hI,xI-x,yI-y,dest );
196         }
197     }
198 }
199 //---------------------------------------------------------------------------
200 bool ControlCheckBox::MouseUp( int x, int y, int button )
201 {
202     // Test enabled
203     if( ( !Enabled1 && Act == 1 && Img[1]->Hit( x - Left, y - Top ) ) ||
204         ( !Enabled2 && Act == 2 && Img[3]->Hit( x - Left, y - Top ) ) )
205             return true;
206
207     if( button == 1 && Selected )
208     {
209         if( Act == 1 && Img[1]->Hit( x - Left, y - Top ) )
210         {
211             State    = 1;
212             Selected = false;
213             Act      = 2;
214             ParentWindow->Refresh( Left, Top, Width, Height );
215             ClickAction1->SendEvent();
216             return true;
217         }
218         else if( Act == 2 && Img[3]->Hit( x - Left, y - Top ) )
219         {
220             State    = 1;
221             Selected = false;
222             Act      = 1;
223             ParentWindow->Refresh( Left, Top, Width, Height );
224             ClickAction2->SendEvent();
225             return true;
226         }
227     }
228     Selected = false;
229     return false;
230 }
231 //---------------------------------------------------------------------------
232 bool ControlCheckBox::MouseDown( int x, int y, int button )
233 {
234
235     // Test enabled
236     if( ( !Enabled1 && Act == 1 && Img[1]->Hit( x - Left, y - Top ) ) ||
237         ( !Enabled2 && Act == 2 && Img[3]->Hit( x - Left, y - Top ) ) )
238             return true;
239     if( button == 1 )
240     {
241         if( Act == 1 && Img[0]->Hit( x - Left, y - Top ) )
242         {
243             State    = 0;
244             Selected = true;
245             ParentWindow->Refresh( Left, Top, Width, Height );
246             return true;
247         }
248         else if( Act == 2 && Img[2]->Hit( x - Left, y - Top ) )
249         {
250             State    = 0;
251             Selected = true;
252             ParentWindow->Refresh( Left, Top, Width, Height );
253             return true;
254         }
255     }
256     return false;
257 }
258 //---------------------------------------------------------------------------
259 bool ControlCheckBox::MouseMove( int x, int y, int button )
260 {
261     // Test enabled
262     if( ( !Enabled1 && Act == 1 ) || ( !Enabled2 && Act == 2 ) )
263         return false;
264
265     // If mouse is entering control
266     if( MouseOver( x, y ) && !CursorIn )
267     {
268         // If control is already selected
269         if( button == 1 && Selected )
270         {
271             State = 0;
272             ParentWindow->Refresh( Left, Top, Width, Height );
273         }
274
275         // Check events
276         if( Act == 1 && MouseOverActionName1 != "none" )
277             MouseOverAction1->SendEvent();
278         else if( Act == 2 && MouseOverActionName2 != "none" )
279             MouseOverAction2->SendEvent();
280
281         CursorIn = true;
282         return true;
283     }
284     // If mouse if leaving control
285     else if( !MouseOver( x, y ) && CursorIn )
286     {
287         // If control is already selected
288         if( button == 1 && Selected )
289         {
290             State = 1;
291             ParentWindow->Refresh( Left, Top, Width, Height );
292         }
293
294         // Check events
295         if( Act == 1 && MouseOutActionName1 != "none" )
296             MouseOutAction1->SendEvent();
297         else if( Act == 2 && MouseOutActionName2 != "none" )
298             MouseOutAction2->SendEvent();
299
300         CursorIn = false;
301         return true;
302     }
303     return true;
304 }
305 //---------------------------------------------------------------------------
306 bool ControlCheckBox::MouseOver( int x, int y )
307 {
308     if( Act == 1 )
309     {
310         if( Img[1 - State]->Hit( x - Left, y - Top ) )
311             return true;
312     }
313     else if( Act == 2 )
314     {
315         if( Img[3 - State]->Hit( x - Left, y - Top ) )
316             return true;
317     }
318     return false;
319 }
320 //---------------------------------------------------------------------------
321 bool ControlCheckBox::ToolTipTest( int x, int y )
322 {
323     if( Act == 1 && MouseOver( x, y ) && Enabled1 )
324     {
325         ParentWindow->ChangeToolTipText( ToolTipText1 );
326         return true;
327     }
328     else if( Act == 2 && MouseOver( x, y ) && Enabled2 )
329     {
330         ParentWindow->ChangeToolTipText( ToolTipText2 );
331         return true;
332     }
333     return false;
334 }
335 //---------------------------------------------------------------------------
336 void ControlCheckBox::Enable( Event *event, bool enabled )
337 {
338     if( enabled != !Enabled1 &&
339         ClickAction1->MatchEvent( event, ACTION_MATCH_ONE ) )
340     {
341         Enabled1 = enabled;
342         if( Act == 1 )
343         {
344             // If cursor is in, send mouse out event
345             if( !Enabled1 && CursorIn )
346             {
347                 if( MouseOutActionName2 != "none" )
348                     MouseOutAction2->SendEvent();
349                 CursorIn = false;
350             }
351             ParentWindow->Refresh( Left, Top, Width, Height );
352         }
353     }
354
355
356
357     else if( enabled != !Enabled2 &&
358         ClickAction2->MatchEvent( event, ACTION_MATCH_ONE ) )
359     {
360         Enabled2 = enabled;
361         if( Act == 2 )
362         {
363             // If cursor is in, send mouse out event
364             if( !Enabled2 && CursorIn )
365             {
366                 if( MouseOutActionName2 != "none" )
367                     MouseOutAction2->SendEvent();
368                 CursorIn = false;
369             }
370             ParentWindow->Refresh( Left, Top, Width, Height );
371         }
372     }
373
374 }
375 //---------------------------------------------------------------------------
376