dialogs.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:13k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * dialogs.cpp : WinCE plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2005 the VideoLAN team
  5.  * $Id: 5c127168a5c339a6fb7503c5903717985619cff0 $
  6.  *
  7.  * Authors: Gildas Bazin <gbazin@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #ifdef HAVE_CONFIG_H
  27. # include "config.h"
  28. #endif
  29. #include <vlc_common.h>
  30. #include <vlc_aout.h>
  31. #include <vlc_interface.h>
  32. #include <vlc_playlist.h>
  33. #include "wince.h"
  34. #include <commctrl.h>
  35. #include <commdlg.h>
  36. #include <shlobj.h>
  37. /* Dialogs Provider */
  38. class DialogsProvider: public CBaseWindow
  39. {
  40. public:
  41.     /* Constructor */
  42.     DialogsProvider( intf_thread_t *, CBaseWindow *, HINSTANCE = 0 );
  43.     virtual ~DialogsProvider();
  44. protected:
  45.     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
  46. private:
  47.     void OnExit( void );
  48.     void OnIdle( void );
  49.     void OnPlaylist( void );
  50.     void OnMessages( void );
  51.     void OnFileInfo( void );
  52.     void OnPreferences( void );
  53.     void OnPopupMenu( void );
  54.     void OnOpen( int, int );
  55.     void OnOpenFileSimple( int );
  56.     void OnOpenDirectory( int );
  57.     void OnOpenFileGeneric( intf_dialog_args_t * );
  58.     /* GetOpenFileName replacement */
  59.     BOOL (WINAPI *GetOpenFile)(void *);
  60.     HMODULE h_gsgetfile_dll;
  61. public:
  62.     /* Secondary windows */
  63.     OpenDialog          *p_open_dialog;
  64.     Playlist            *p_playlist_dialog;
  65.     Messages            *p_messages_dialog;
  66.     PrefsDialog         *p_prefs_dialog;
  67.     FileInfo            *p_fileinfo_dialog;
  68. };
  69. CBaseWindow *CreateDialogsProvider( intf_thread_t *p_intf,
  70.                                     CBaseWindow *p_parent, HINSTANCE h_inst )
  71. {
  72.     return new DialogsProvider( p_intf, p_parent, h_inst );
  73. }
  74. /*****************************************************************************
  75.  * Constructor.
  76.  *****************************************************************************/
  77. DialogsProvider::DialogsProvider( intf_thread_t *p_intf,
  78.                                   CBaseWindow *p_parent, HINSTANCE h_inst )
  79.   :  CBaseWindow( p_intf, p_parent, h_inst )
  80. {
  81.     /* Initializations */
  82.     p_open_dialog = NULL;
  83.     p_playlist_dialog = NULL;
  84.     p_messages_dialog = NULL;
  85.     p_fileinfo_dialog = NULL;
  86.     p_prefs_dialog = NULL;
  87.     /* Create dummy window */
  88.     hWnd = CreateWindow( _T("VLC WinCE"), _T("DialogsProvider"), 0,
  89.                          0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
  90.                          p_parent->GetHandle(), NULL, h_inst, (void *)this );
  91.     GetOpenFile = 0;
  92.     h_gsgetfile_dll = LoadLibrary( _T("gsgetfile") );
  93.     if( h_gsgetfile_dll )
  94.     {
  95.         GetOpenFile = (BOOL (WINAPI *)(void *))
  96.             GetProcAddress( h_gsgetfile_dll, _T("gsGetOpenFileName") );
  97.     }
  98.     if( !GetOpenFile )
  99.         GetOpenFile = (BOOL (WINAPI *)(void *))::GetOpenFileName;
  100. }
  101. DialogsProvider::~DialogsProvider()
  102. {
  103.     /* Clean up */
  104.     delete p_open_dialog;
  105.     delete p_playlist_dialog;
  106.     delete p_messages_dialog;
  107.     delete p_fileinfo_dialog;
  108.     delete p_prefs_dialog;
  109.     if( h_gsgetfile_dll ) FreeLibrary( h_gsgetfile_dll );
  110. }
  111. LRESULT DialogsProvider::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
  112. {
  113.     switch( msg )
  114.     {
  115.     case WM_APP + INTF_DIALOG_FILE: OnOpen( FILE_ACCESS, wp ); return TRUE;
  116.     case WM_APP + INTF_DIALOG_NET: OnOpen( NET_ACCESS, wp ); return TRUE;
  117.     case WM_APP + INTF_DIALOG_FILE_SIMPLE: OnOpenFileSimple( wp ); return TRUE;
  118.     case WM_APP + INTF_DIALOG_DIRECTORY: OnOpenDirectory( wp ); return TRUE;
  119.     case WM_APP + INTF_DIALOG_FILE_GENERIC:
  120.         OnOpenFileGeneric( (intf_dialog_args_t*)lp ); return TRUE;
  121.     case WM_APP + INTF_DIALOG_PLAYLIST: OnPlaylist(); return TRUE;
  122.     case WM_APP + INTF_DIALOG_MESSAGES: OnMessages(); return TRUE;
  123.     case WM_APP + INTF_DIALOG_FILEINFO: OnFileInfo(); return TRUE;
  124.     case WM_APP + INTF_DIALOG_PREFS: OnPreferences(); return TRUE;
  125.     case WM_APP + INTF_DIALOG_POPUPMENU: OnPopupMenu(); return TRUE;
  126.     }
  127.     return DefWindowProc( hwnd, msg, wp, lp );
  128. }
  129. void DialogsProvider::OnIdle( void )
  130. {
  131.     /* Update the playlist */
  132.     if( p_playlist_dialog ) p_playlist_dialog->UpdatePlaylist();
  133.     /* Update the fileinfo windows */
  134.     if( p_fileinfo_dialog ) p_fileinfo_dialog->UpdateFileInfo();
  135. }
  136. void DialogsProvider::OnPopupMenu( void )
  137. {
  138.     POINT point = {0};
  139.     PopupMenu( p_intf, hWnd, point );
  140. }
  141. void DialogsProvider::OnPlaylist( void )
  142. {
  143. #if 1
  144.     Playlist *playlist = new Playlist( p_intf, this, hInst );
  145.     CreateDialogBox( hWnd, playlist );
  146.     delete playlist;
  147. #else
  148.     /* Show/hide the playlist window */
  149.     if( !p_playlist_dialog )
  150.         p_playlist_dialog = new Playlist( p_intf, this, hInst );
  151.     if( p_playlist_dialog )
  152.     {
  153.         p_playlist_dialog->ShowPlaylist( !p_playlist_dialog->IsShown() );
  154.     }
  155. #endif
  156. }
  157. void DialogsProvider::OnMessages( void )
  158. {
  159.     /* Show/hide the log window */
  160.     if( !p_messages_dialog )
  161.         p_messages_dialog = new Messages( p_intf, this, hInst );
  162.     if( p_messages_dialog )
  163.     {
  164.         p_messages_dialog->Show( !p_messages_dialog->IsShown() );
  165.     }
  166. }
  167. void DialogsProvider::OnFileInfo( void )
  168. {
  169. #if 1
  170.     FileInfo *fileinfo = new FileInfo( p_intf, this, hInst );
  171.     CreateDialogBox( hWnd, fileinfo );
  172.     delete fileinfo;
  173. #else
  174.     /* Show/hide the file info window */
  175.     if( !p_fileinfo_dialog )
  176.         p_fileinfo_dialog = new FileInfo( p_intf, this, hInst );
  177.     if( p_fileinfo_dialog )
  178.     {
  179.         p_fileinfo_dialog->Show( !p_fileinfo_dialog->IsShown() );
  180.     }
  181. #endif
  182. }
  183. void DialogsProvider::OnPreferences( void )
  184. {
  185. #if 1
  186.     PrefsDialog *preferences = new PrefsDialog( p_intf, this, hInst );
  187.     CreateDialogBox( hWnd, preferences );
  188.     delete preferences;
  189. #else
  190.     /* Show/hide the open dialog */
  191.     if( !p_prefs_dialog )
  192.         p_prefs_dialog = new PrefsDialog( p_intf, this, hInst );
  193.     if( p_prefs_dialog )
  194.     {
  195.         p_prefs_dialog->Show( !p_prefs_dialog->IsShown() );
  196.     }
  197. #endif
  198. }
  199. void DialogsProvider::OnOpen( int i_access, int i_arg )
  200. {
  201.     /* Show/hide the open dialog */
  202.     if( !p_open_dialog )
  203.         p_open_dialog = new OpenDialog( p_intf, this, hInst, i_access, i_arg );
  204.     if( p_open_dialog )
  205.     {
  206.         p_open_dialog->Show( !p_open_dialog->IsShown() );
  207.     }
  208. }
  209. void DialogsProvider::OnOpenFileGeneric( intf_dialog_args_t *p_arg )
  210. {
  211.     if( p_arg == NULL )
  212.     {
  213.         msg_Dbg( p_intf, "OnOpenFileGeneric() called with NULL arg" );
  214.         return;
  215.     }
  216.     /* Convert the filter string */
  217.     TCHAR *psz_filters = (TCHAR *)
  218.         malloc( (strlen(p_arg->psz_extensions) + 2) * sizeof(TCHAR) );
  219.     _tcscpy( psz_filters, _FROMMB(p_arg->psz_extensions) );
  220.     int i;
  221.     for( i = 0; psz_filters[i]; i++ )
  222.     {
  223.         if( psz_filters[i] == '|' ) psz_filters[i] = 0;
  224.     }
  225.     psz_filters[++i] = 0;
  226.     OPENFILENAME ofn;
  227.     TCHAR szFile[MAX_PATH] = _T("");
  228.     memset( &ofn, 0, sizeof(OPENFILENAME) );
  229.     ofn.lStructSize = sizeof(OPENFILENAME);
  230.     ofn.hwndOwner = hWnd;
  231.     ofn.hInstance = hInst;
  232.     ofn.lpstrFilter = psz_filters;
  233.     ofn.lpstrCustomFilter = NULL;
  234.     ofn.nMaxCustFilter = 0;
  235.     ofn.nFilterIndex = 1;
  236.     ofn.lpstrFile = (LPTSTR)szFile;
  237.     ofn.nMaxFile = MAX_PATH;
  238.     ofn.lpstrFileTitle = NULL;
  239.     ofn.nMaxFileTitle = 40;
  240.     ofn.lpstrInitialDir = NULL;
  241.     ofn.lpstrTitle = _FROMMB(p_arg->psz_title);
  242.     ofn.Flags = 0;
  243.     ofn.nFileOffset = 0;
  244.     ofn.nFileExtension = 0;
  245.     ofn.lpstrDefExt = NULL;
  246.     ofn.lCustData = 0L;
  247.     ofn.lpfnHook = NULL;
  248.     ofn.lpTemplateName = NULL;
  249.     SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
  250.     if( p_arg->b_save && GetSaveFileName( &ofn ) )
  251.     {
  252.         p_arg->i_results = 1;
  253.         p_arg->psz_results = (char **)malloc( p_arg->i_results *
  254.                                               sizeof(char *) );
  255.         p_arg->psz_results[0] = strdup( _TOMB(ofn.lpstrFile) );
  256.     }
  257.     if( !p_arg->b_save && GetOpenFile( &ofn ) )
  258.     {
  259.         p_arg->i_results = 1;
  260.         p_arg->psz_results = (char **)malloc( p_arg->i_results *
  261.                                               sizeof(char *) );
  262.         p_arg->psz_results[0] = strdup( _TOMB(ofn.lpstrFile) );
  263.     }
  264.     /* Callback */
  265.     if( p_arg->pf_callback )
  266.     {
  267.         p_arg->pf_callback( p_arg );
  268.     }
  269.     if( p_arg->psz_results )
  270.     {
  271.         for( int i = 0; i < p_arg->i_results; i++ )
  272.         {
  273.             free( p_arg->psz_results[i] );
  274.         }
  275.         free( p_arg->psz_results );
  276.     }
  277.     free( p_arg->psz_title );
  278.     free( p_arg->psz_extensions );
  279.     free( p_arg );
  280. }
  281. void DialogsProvider::OnOpenFileSimple( int i_arg )
  282. {
  283.     OPENFILENAME ofn;
  284.     TCHAR szFile[MAX_PATH] = _T("");
  285.     static TCHAR szFilter[] = _T("wav (*.wav)*.wavmp3 (*.mp3 *.mpga)*.mp3;*.mpgaAll (*.*)*.*");
  286.     playlist_t *p_playlist = pl_Hold( p_intf );
  287.     if( p_playlist == NULL ) return;
  288.     memset( &ofn, 0, sizeof(OPENFILENAME) );
  289.     ofn.lStructSize = sizeof(OPENFILENAME);
  290.     ofn.hwndOwner = hWnd;
  291.     ofn.hInstance = hInst;
  292.     ofn.lpstrFilter = szFilter;
  293.     ofn.lpstrCustomFilter = NULL;
  294.     ofn.nMaxCustFilter = 0;
  295.     ofn.nFilterIndex = 1;
  296.     ofn.lpstrFile = (LPTSTR)szFile;
  297.     ofn.nMaxFile = MAX_PATH;
  298.     ofn.lpstrFileTitle = NULL;
  299.     ofn.nMaxFileTitle = 40;
  300.     ofn.lpstrInitialDir = NULL;
  301.     ofn.lpstrTitle = _T("Quick Open File");
  302.     ofn.Flags = 0;
  303.     ofn.nFileOffset = 0;
  304.     ofn.nFileExtension = 0;
  305.     ofn.lpstrDefExt = NULL;
  306.     ofn.lCustData = 0L;
  307.     ofn.lpfnHook = NULL;
  308.     ofn.lpTemplateName = NULL;
  309.     SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
  310.     if( GetOpenFile( &ofn ) )
  311.     {
  312.         char *psz_filename = _TOMB(ofn.lpstrFile);
  313.         playlist_Add( p_playlist, psz_filename, psz_filename,
  314.                       PLAYLIST_APPEND | (i_arg?PLAYLIST_GO:0), PLAYLIST_END,
  315.                       TRUE, FALSE );
  316.     }
  317.     pl_Release( p_intf );
  318. }
  319. void DialogsProvider::OnOpenDirectory( int i_arg )
  320. {
  321.     TCHAR psz_result[MAX_PATH];
  322.     LPMALLOC p_malloc = 0;
  323.     LPITEMIDLIST pidl;
  324.     BROWSEINFO bi;
  325.     playlist_t *p_playlist = 0;
  326. #ifdef UNDER_CE
  327. #   define SHGetMalloc MySHGetMalloc
  328. #   define SHBrowseForFolder MySHBrowseForFolder
  329. #   define SHGetPathFromIDList MySHGetPathFromIDList
  330.     HMODULE ceshell_dll = LoadLibrary( _T("ceshell") );
  331.     if( !ceshell_dll ) return;
  332.     HRESULT (WINAPI *SHGetMalloc)(LPMALLOC *) =
  333.         (HRESULT (WINAPI *)(LPMALLOC *))
  334.         GetProcAddress( ceshell_dll, _T("SHGetMalloc") );
  335.     LPITEMIDLIST (WINAPI *SHBrowseForFolder)(LPBROWSEINFO) =
  336.         (LPITEMIDLIST (WINAPI *)(LPBROWSEINFO))
  337.         GetProcAddress( ceshell_dll, _T("SHBrowseForFolder") );
  338.     BOOL (WINAPI *SHGetPathFromIDList)(LPCITEMIDLIST, LPTSTR) =
  339.         (BOOL (WINAPI *)(LPCITEMIDLIST, LPTSTR))
  340.         GetProcAddress( ceshell_dll, _T("SHGetPathFromIDList") );
  341.     if( !SHGetMalloc || !SHBrowseForFolder || !SHGetPathFromIDList )
  342.     {
  343.         msg_Err( p_intf, "couldn't load SHBrowseForFolder API" );
  344.         FreeLibrary( ceshell_dll );
  345.         return;
  346.     }
  347. #endif
  348.     if( !SUCCEEDED( SHGetMalloc(&p_malloc) ) ) goto error;
  349.     p_playlist = pl_Hold( p_intf );
  350.     if( !p_playlist ) goto error;
  351.     memset( &bi, 0, sizeof(BROWSEINFO) );
  352.     bi.hwndOwner = hWnd;
  353.     bi.pszDisplayName = psz_result;
  354.     bi.ulFlags = BIF_EDITBOX;
  355. #ifndef UNDER_CE
  356.     bi.ulFlags |= BIF_USENEWUI;
  357. #endif
  358.     if( (pidl = SHBrowseForFolder( &bi ) ) )
  359.     {
  360.         if( SHGetPathFromIDList( pidl, psz_result ) )
  361.         {
  362.             char *psz_filename = _TOMB(psz_result);
  363.             playlist_Add( p_playlist, psz_filename, psz_filename,
  364.                           PLAYLIST_APPEND | (i_arg ? PLAYLIST_GO : 0),
  365.                           PLAYLIST_END, TRUE, FALSE );
  366.         }
  367.         p_malloc->Free( pidl );
  368.     }
  369.  error:
  370.     if( p_malloc) p_malloc->Release();
  371.     if( p_playlist ) pl_Release( p_intf );
  372. #ifdef UNDER_CE
  373.     FreeLibrary( ceshell_dll );
  374. #endif
  375. }