f86fb15739e529e41bcdcec900530d5c8aaaca22
[vlc.git] / modules / gui / skins / win32 / win32_window.cpp
1 /*****************************************************************************
2  * win32_window.cpp: Win32 implementation of the Window class
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN
5  * $Id: win32_window.cpp,v 1.11 2003/04/29 12:54:57 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 #ifdef WIN32
27
28 //--- GENERAL ---------------------------------------------------------------
29 //#include <math.h>
30
31 //--- VLC -------------------------------------------------------------------
32 #include <vlc/intf.h>
33
34 //--- WIN32 -----------------------------------------------------------------
35 #include <windows.h>
36
37 //--- SKIN ------------------------------------------------------------------
38 #include "../os_api.h"
39 #include "../src/anchor.h"
40 #include "../controls/generic.h"
41 #include "../src/window.h"
42 #include "../os_window.h"
43 #include "../src/event.h"
44 #include "../os_event.h"
45 #include "../src/graphics.h"
46 #include "../os_graphics.h"
47 #include "../src/skin_common.h"
48 #include "../src/theme.h"
49
50
51
52 //---------------------------------------------------------------------------
53 // Fading API
54 //---------------------------------------------------------------------------
55 #define LWA_COLORKEY  0x00000001
56 #define LWA_ALPHA     0x00000002
57
58 //---------------------------------------------------------------------------
59 // Skinable Window
60 //---------------------------------------------------------------------------
61 Win32Window::Win32Window( intf_thread_t *p_intf, HWND hwnd, int x, int y,
62     bool visible, int transition, int normalalpha, int movealpha,
63     bool dragdrop )
64     : SkinWindow( p_intf, x, y, visible, transition, normalalpha, movealpha,
65               dragdrop )
66 {
67     // Set handles
68     hWnd           = hwnd;
69
70     // Set position parameters
71     CursorPos    = new POINT;
72     WindowPos    = new POINT;
73
74     // Create Tool Tip Window
75     ToolTipWindow = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL,
76         WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
77         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
78         hWnd, 0, GetModuleHandle( NULL ), 0);
79
80     // Create Tool Tip infos
81     ToolTipInfo.cbSize = sizeof(TOOLINFO);
82     ToolTipInfo.uFlags = TTF_SUBCLASS|TTF_IDISHWND;
83     ToolTipInfo.hwnd = hWnd;
84     ToolTipInfo.hinst = GetModuleHandle( NULL );
85     ToolTipInfo.uId = (unsigned int)hWnd;
86     ToolTipInfo.lpszText = NULL;
87     ToolTipInfo.rect.left = ToolTipInfo.rect.top = 0;
88         ToolTipInfo.rect.right = ToolTipInfo.rect.bottom = 0;
89
90     SendMessage( ToolTipWindow, TTM_ADDTOOL, 0,
91                     (LPARAM)(LPTOOLINFO) &ToolTipInfo );
92
93     // Drag & drop
94     if( DragDrop )
95     {
96         // Initialize the OLE library
97         OleInitialize( NULL );
98         DropTarget = (LPDROPTARGET) new Win32DropObject();
99         // register the listview as a drop target
100         RegisterDragDrop( hWnd, DropTarget );
101     }
102
103 }
104 //---------------------------------------------------------------------------
105 Win32Window::~Win32Window()
106 {
107     delete CursorPos;
108     delete WindowPos;
109
110     if( hWnd != NULL )
111     {
112         DestroyWindow( hWnd );
113     }
114     if( ToolTipWindow != NULL )
115     {
116         DestroyWindow( ToolTipWindow );
117     }
118     if( DragDrop )
119     {
120         // Remove the listview from the list of drop targets
121         RevokeDragDrop( hWnd );
122         DropTarget->Release();
123         // Uninitialize the OLE library
124         OleUninitialize();
125     }
126
127 }
128 //---------------------------------------------------------------------------
129 void Win32Window::OSShow( bool show )
130 {
131     if( show )
132     {
133         ShowWindow( hWnd, SW_SHOW );
134     }
135     else
136     {
137         ShowWindow( hWnd, SW_HIDE );
138     }
139 }
140 //---------------------------------------------------------------------------
141 bool Win32Window::ProcessOSEvent( Event *evt )
142 {
143     unsigned int msg = evt->GetMessage();
144     unsigned int p1  = evt->GetParam1();
145     int          p2  = evt->GetParam2();
146
147     switch( msg )
148     {
149         case WM_PAINT:
150             HDC DC;
151             PAINTSTRUCT Infos;
152             DC = BeginPaint( hWnd , &Infos );
153             EndPaint( hWnd , &Infos );
154             RefreshFromImage( 0, 0, Width, Height );
155             return true;
156
157         case WM_MOUSEMOVE:
158             TRACKMOUSEEVENT TrackEvent;
159             TrackEvent.cbSize      = sizeof( TRACKMOUSEEVENT );\r
160             TrackEvent.dwFlags     = TME_LEAVE;\r
161             TrackEvent.hwndTrack   = hWnd;\r
162             TrackEvent.dwHoverTime = 1;
163             TrackMouseEvent( &TrackEvent );
164             if( p1 == MK_LBUTTON )
165                 MouseMove( LOWORD( p2 ), HIWORD( p2 ), 1 );
166             else if( p1 == MK_RBUTTON )
167                 MouseMove( LOWORD( p2 ), HIWORD( p2 ), 2 );
168             else
169                 MouseMove( LOWORD( p2 ), HIWORD( p2 ), 0 );
170
171             return true;
172
173         case WM_LBUTTONDOWN:
174             SetCapture( hWnd );
175             MouseDown( LOWORD( p2 ), HIWORD( p2 ), 1 );
176             return true;
177
178         case WM_LBUTTONUP:
179             ReleaseCapture();
180             MouseUp( LOWORD( p2 ), HIWORD( p2 ), 1 );
181             return true;
182
183         case WM_RBUTTONDOWN:
184             MouseDown( LOWORD( p2 ), HIWORD( p2 ), 2 );
185             return true;
186
187         case WM_RBUTTONUP:
188             MouseUp( LOWORD( p2 ), HIWORD( p2 ), 2 );
189             return true;
190
191         case WM_LBUTTONDBLCLK:
192             MouseDblClick( LOWORD( p2 ), HIWORD( p2 ), 1 );
193             return true;
194
195         case WM_MOUSELEAVE:
196             OSAPI_PostMessage( this, WINDOW_LEAVE, 0, 0 );
197             return true;
198
199         case WM_MOUSEWHEEL:
200             if( GET_WHEEL_DELTA_WPARAM( p1 ) > 0 )
201                 MouseScroll( LOWORD( p2 ) - Left, HIWORD( p2 ) - Top,
202                     MOUSE_SCROLL_UP );
203             else if( GET_WHEEL_DELTA_WPARAM( p1 ) < 0 )
204                 MouseScroll( LOWORD( p2 ) - Left, HIWORD( p2 ) - Top,
205                     MOUSE_SCROLL_DOWN );
206             return true;
207
208         default:
209             return false;
210     }
211 }
212 //---------------------------------------------------------------------------
213 void Win32Window::SetTransparency( int Value )
214 {
215     if( Value > -1 )
216         Alpha = Value;
217
218     if( p_intf->p_sys->SetLayeredWindowAttributes )
219         p_intf->p_sys->SetLayeredWindowAttributes( hWnd, 0, Alpha,
220                                                    LWA_ALPHA | LWA_COLORKEY );
221
222     UpdateWindow( hWnd );
223 }
224 //---------------------------------------------------------------------------
225 void Win32Window::RefreshFromImage( int x, int y, int w, int h )
226 {
227     // Initialize painting
228     HDC DC = GetWindowDC( hWnd );
229
230     // Draw image on window
231     BitBlt( DC, x, y, w, h, ( (Win32Graphics *)Image )->GetImageHandle(),
232             x, y, SRCCOPY );
233
234     // Release window device context
235     ReleaseDC( hWnd, DC );
236
237 }
238 //---------------------------------------------------------------------------
239 void Win32Window::WindowManualMove()
240 {
241     // Get mouse cursor position
242     LPPOINT NewPos = new POINT;
243     GetCursorPos( NewPos );
244
245     // Move window and chek for magnetism
246     p_intf->p_sys->p_theme->MoveSkinMagnet( this,
247         WindowPos->x + NewPos->x - CursorPos->x,
248         WindowPos->y + NewPos->y - CursorPos->y );
249
250     // Free memory
251     delete[] NewPos;
252
253 }
254 //---------------------------------------------------------------------------
255 void Win32Window::WindowManualMoveInit()
256 {
257     GetCursorPos( CursorPos );
258     WindowPos->x = Left;
259     WindowPos->y = Top;
260 }
261 //---------------------------------------------------------------------------
262 void Win32Window::Move( int left, int top )
263 {
264     Left = left;
265     Top  = top;
266     //SetWindowPos( hWnd, HWND_TOP, Left, Top, Width, Height,
267     //              SWP_NOSIZE|SWP_NOREDRAW|SWP_NOZORDER );
268     MoveWindow( hWnd, Left, Top, Width, Height, false );
269 }
270 //---------------------------------------------------------------------------
271 void Win32Window::Size( int width, int height )
272 {
273     Width  = width;
274     Height = height;
275     SetWindowPos( hWnd, HWND_TOP, Left, Top, Width, Height,
276                   SWP_NOMOVE|SWP_NOREDRAW|SWP_NOZORDER );
277 }
278 //---------------------------------------------------------------------------
279 void Win32Window::ChangeToolTipText( string text )
280 {
281     if( text == "none" )
282     {
283         if( ToolTipText != "none" )
284         {
285             ToolTipText = "none";
286             ToolTipInfo.lpszText = NULL;
287             SendMessage( ToolTipWindow, TTM_ACTIVATE, 0 , 0 );
288         }
289     }
290     else
291     {
292         if( text != ToolTipText )
293         {
294             ToolTipText = text;
295             ToolTipInfo.lpszText = (char *)ToolTipText.c_str();
296             SendMessage( ToolTipWindow, TTM_ACTIVATE, 1 , 0 );
297             SendMessage( ToolTipWindow, TTM_UPDATETIPTEXT, 0,
298                              (LPARAM)(LPTOOLINFO)&ToolTipInfo );
299         }
300     }
301
302 }
303 //---------------------------------------------------------------------------
304
305 #endif