]> git.sesse.net Git - vlc/blobdiff - modules/gui/wince/playlist.cpp
Removes trailing spaces. Removes tabs.
[vlc] / modules / gui / wince / playlist.cpp
index c9e5558d8277782ca4d6430b7d04f7e5abfa60f0..08673ce1a78e686f64c8d10d6b1305ba288f9b9c 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * playlist.cpp : WinCE gui plugin for VLC
  *****************************************************************************
- * Copyright (C) 2000-2004 VideoLAN
+ * Copyright (C) 2000-2004 the VideoLAN team
  * $Id$
  *
  * Authors: Marodon Cedric <cedric_marodon@yahoo.fr>
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <stdlib.h>                                      /* malloc(), free() */
-#include <string.h>                                            /* strerror() */
-#include <stdio.h>
 #include <vlc/vlc.h>
-#include <vlc/intf.h>
+#include <vlc_interface.h>
 
 #include "wince.h"
 
 #include <commctrl.h>
 #include <commdlg.h>
 
-#ifndef NMAXFILE
-#define NMAXFILE 512 // at least 256
-#endif
-
 #ifndef TEXTMAXBUF
 #define TEXTMAXBUF 512 // at least 500
 #endif
 
 #define LONG2POINT(l, pt)  ((pt).x = (SHORT)LOWORD(l), (pt).y = (SHORT)HIWORD(l))
 
-#define NUMIMAGES     11   // Number of buttons in the toolbar           
-#define IMAGEWIDTH    16   // Width of the buttons in the toolbar  
-#define IMAGEHEIGHT   16   // Height of the buttons in the toolbar  
+#define NUMIMAGES     11   // Number of buttons in the toolbar
+#define IMAGEWIDTH    16   // Width of the buttons in the toolbar
+#define IMAGEHEIGHT   16   // Height of the buttons in the toolbar
 #define BUTTONWIDTH   0    // Width of the button images in the toolbar
 #define BUTTONHEIGHT  0    // Height of the button images in the toolbar
 #define ID_TOOLBAR    2000 // Identifier of the main tool bar
-#define dwTBFontStyle TBSTYLE_BUTTON | TBSTYLE_CHECK | TBSTYLE_GROUP // style for toolbar buttons
 
-enum      
+enum
 {
   Infos_Event = 1000,
   Up_Event,
@@ -65,13 +57,13 @@ enum
   PopupPlay_Event,
   PopupDel_Event,
   PopupEna_Event,
-  PopupInfo_Event  
+  PopupInfo_Event
 };
 
 // Help strings
 #define HELP_OPENPL _T("Open playlist")
 #define HELP_SAVEPL _T("Save playlist")
-#define HELP_SIMPLEADD _T("Simple Add")
+#define HELP_ADDFILE _T("Add File")
 #define HELP_ADDMRL _T("Add MRL")
 #define HELP_DELETE _T("Delete selection")
 #define HELP_INFOS _T("Item info")
@@ -82,39 +74,39 @@ enum
 #define HELP_REPEAT _T("Repeat one")
 
 // The TBBUTTON structure contains information the toolbar buttons.
-static TBBUTTON tbButton2[] =      
+static TBBUTTON tbButton2[] =
 {
-  {0, ID_MANAGE_OPENPL,        TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {1, ID_MANAGE_SAVEPL,       TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP,     0, -1},
-  {2, ID_MANAGE_SIMPLEADD,       TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {3, ID_MANAGE_ADDMRL,        TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {4, ID_SEL_DELETE,       TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP,     0, -1},
-  {5, Infos_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP,     0, -1},
-  {6, Up_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {7, Down_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON,  0, -1},
-  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP,     0, -1},
-  {8, Random_Event,      TBSTATE_ENABLED, TBSTYLE_CHECK,  0, -1},
-  {9, Loop_Event,       TBSTATE_ENABLED, TBSTYLE_CHECK,   0, -1},
-  {10, Repeat_Event,       TBSTATE_ENABLED, TBSTYLE_CHECK,   0, -1}
+  {0, ID_MANAGE_OPENPL,        TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {1, ID_MANAGE_SAVEPL,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
+  {2, ID_MANAGE_ADDFILE,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {3, ID_MANAGE_ADDMRL,        TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {4, ID_SEL_DELETE,       TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
+  {5, Infos_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
+  {6, Up_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {7, Down_Event,      TBSTATE_ENABLED, TBSTYLE_BUTTON},
+  {0, 0,              TBSTATE_ENABLED, TBSTYLE_SEP},
+  {8, Random_Event,      TBSTATE_ENABLED, TBSTYLE_CHECK},
+  {9, Loop_Event,       TBSTATE_ENABLED, TBSTYLE_CHECK},
+  {10, Repeat_Event,       TBSTATE_ENABLED, TBSTYLE_CHECK}
 };
 
 // Toolbar ToolTips
-TCHAR * szToolTips2[] = 
+TCHAR * szToolTips2[] =
 {
     HELP_OPENPL,
-        HELP_SAVEPL,
-        HELP_SIMPLEADD,
-        HELP_ADDMRL,
-        HELP_DELETE,
-        HELP_INFOS,
-        HELP_UP,
-        HELP_DOWN,
-        HELP_RANDOM,
-        HELP_LOOP,
-        HELP_REPEAT
+    HELP_SAVEPL,
+    HELP_ADDFILE,
+    HELP_ADDMRL,
+    HELP_DELETE,
+    HELP_INFOS,
+    HELP_UP,
+    HELP_DOWN,
+    HELP_RANDOM,
+    HELP_LOOP,
+    HELP_REPEAT
 };
 
 /*****************************************************************************
@@ -124,13 +116,12 @@ TCHAR * szToolTips2[] =
 /*****************************************************************************
  * Constructor.
  *****************************************************************************/
-Playlist::Playlist( intf_thread_t *_p_intf, HINSTANCE _hInst )
+Playlist::Playlist( intf_thread_t *p_intf, CBaseWindow *p_parent,
+                    HINSTANCE h_inst )
+  :  CBaseWindow( p_intf, p_parent, h_inst )
 {
     /* Initializations */
-    p_intf = _p_intf;
-        hInst = _hInst;
-        hListView = NULL;
-
+    hListView = NULL;
     i_title_sorted = 1;
     i_author_sorted = 1;
 
@@ -138,58 +129,131 @@ Playlist::Playlist( intf_thread_t *_p_intf, HINSTANCE _hInst )
 }
 
 /***********************************************************************
+FUNCTION:
+  CreateMenuBar
+
+PURPOSE:
+  Creates a menu bar.
+***********************************************************************/
+static HWND CreateMenuBar( HWND hwnd, HINSTANCE hInst )
+{
+#ifdef UNDER_CE
+    SHMENUBARINFO mbi;
+    memset( &mbi, 0, sizeof(SHMENUBARINFO) );
+    mbi.cbSize     = sizeof(SHMENUBARINFO);
+    mbi.hwndParent = hwnd;
+    mbi.hInstRes   = hInst;
+    mbi.nToolBarId = IDR_MENUBAR2;
+
+    if( !SHCreateMenuBar( &mbi ) )
+    {
+        MessageBox(hwnd, _T("SHCreateMenuBar Failed"), _T("Error"), MB_OK);
+        return 0;
+    }
+
+    TBBUTTONINFO tbbi;
+    tbbi.cbSize = sizeof(tbbi);
+    tbbi.dwMask = TBIF_LPARAM;
+
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_MANAGE, (LPARAM)&tbbi );
+    HMENU hmenu_file = (HMENU)tbbi.lParam;
+    RemoveMenu( hmenu_file, 0, MF_BYPOSITION );
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_SORT, (LPARAM)&tbbi );
+    HMENU hmenu_sort = (HMENU)tbbi.lParam;
+    RemoveMenu( hmenu_sort, 0, MF_BYPOSITION );
+    SendMessage( mbi.hwndMB, TB_GETBUTTONINFO, IDM_SEL, (LPARAM)&tbbi );
+    HMENU hmenu_sel = (HMENU)tbbi.lParam;
+    RemoveMenu( hmenu_sel, 0, MF_BYPOSITION );
+
+#else
+    HMENU hmenu_file = CreatePopupMenu();
+    HMENU hmenu_sort = CreatePopupMenu();
+    HMENU hmenu_sel = CreatePopupMenu();
+#endif
 
-FUNCTION: 
+    AppendMenu( hmenu_file, MF_STRING, ID_MANAGE_ADDFILE,
+                _T("&Add File...") );
+    AppendMenu( hmenu_file, MF_STRING, ID_MANAGE_ADDDIRECTORY,
+                _T("Add Directory...") );
+    AppendMenu( hmenu_file, MF_STRING, ID_MANAGE_ADDMRL,
+                _T("Add MRL...") );
+    AppendMenu( hmenu_file, MF_SEPARATOR, 0, 0 );
+    AppendMenu( hmenu_file, MF_STRING, ID_MANAGE_OPENPL,
+                _T("Open &Playlist") );
+    AppendMenu( hmenu_file, MF_STRING, ID_MANAGE_SAVEPL,
+                _T("Save Playlist") );
+
+    AppendMenu( hmenu_sort, MF_STRING, ID_SORT_TITLE,
+                _T("Sort by &title") );
+    AppendMenu( hmenu_sort, MF_STRING, ID_SORT_RTITLE,
+                _T("&Reverse sort by title") );
+    AppendMenu( hmenu_sort, MF_SEPARATOR, 0, 0 );
+    AppendMenu( hmenu_sort, MF_STRING, ID_SORT_AUTHOR,
+                _T("Sort by &author") );
+    AppendMenu( hmenu_sort, MF_STRING, ID_SORT_RAUTHOR,
+                _T("Reverse sort by &author") );
+    AppendMenu( hmenu_sort, MF_SEPARATOR, 0, 0 );
+    AppendMenu( hmenu_sort, MF_STRING, ID_SORT_SHUFFLE,
+                _T("&Shuffle Playlist") );
+
+    AppendMenu( hmenu_sel, MF_STRING, ID_SEL_ENABLE,
+                _T("&Enable") );
+    AppendMenu( hmenu_sel, MF_STRING, ID_SEL_DISABLE,
+                _T("&Disable") );
+    AppendMenu( hmenu_sel, MF_SEPARATOR, 0, 0 );
+    AppendMenu( hmenu_sel, MF_STRING, ID_SEL_INVERT,
+                _T("&Invert") );
+    AppendMenu( hmenu_sel, MF_STRING, ID_SEL_DELETE,
+                _T("D&elete") );
+    AppendMenu( hmenu_sel, MF_SEPARATOR, 0, 0 );
+    AppendMenu( hmenu_sel, MF_STRING, ID_SEL_SELECTALL,
+                _T("&Select All") );
+
+
+#ifdef UNDER_CE
+    return mbi.hwndMB;
+
+#else
+    HMENU hmenu = CreateMenu();
+
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)hmenu_file, _T("Manage") );
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)hmenu_sort, _T("Sort") );
+    AppendMenu( hmenu, MF_POPUP|MF_STRING, (UINT)hmenu_sel, _T("Selection") );
+
+    SetMenu( hwnd, hmenu );
+    return hwnd;
+
+#endif
+}
+
+/***********************************************************************
+FUNCTION:
   WndProc
 
-PURPOSE: 
+PURPOSE:
   Processes messages sent to the main window.
-  
 ***********************************************************************/
-LRESULT Playlist::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
-                           PBOOL pbProcessed )
+LRESULT Playlist::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
 {
     SHINITDLGINFO shidi;
     SHMENUBARINFO mbi;
+    INITCOMMONCONTROLSEX iccex;
+    RECT rect, rectTB;
+    DWORD dwStyle;
 
     int bState;
     playlist_t *p_playlist;
 
-    DWORD dwStyle;
-    RECT rect, rectTB;
-
-    INITCOMMONCONTROLSEX iccex;
-
-    LRESULT lResult = CBaseWindow::WndProc( hwnd, msg, wp, lp, pbProcessed );
-    BOOL bWasProcessed = *pbProcessed;
-    *pbProcessed = TRUE;
-
     switch( msg )
     {
-    case WM_INITDIALOG: 
+    case WM_INITDIALOG:
         shidi.dwMask = SHIDIM_FLAGS;
         shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN |
             SHIDIF_FULLSCREENNOMENUBAR;//SHIDIF_SIZEDLGFULLSCREEN;
         shidi.hDlg = hwnd;
         SHInitDialog( &shidi );
 
-        //Create the menubar.
-        memset( &mbi, 0, sizeof (SHMENUBARINFO) );
-        mbi.cbSize     = sizeof (SHMENUBARINFO);
-        mbi.hwndParent = hwnd;
-        mbi.dwFlags    = SHCMBF_HMENU;
-        mbi.nToolBarId = IDR_MENUBAR2;
-        mbi.hInstRes   = hInst;
-        mbi.nBmpId     = 0;
-        mbi.cBmpImages = 0;  
-
-        if( !SHCreateMenuBar(&mbi) )
-        {
-            MessageBox(hwnd, L"SHCreateMenuBar Failed", L"Error", MB_OK);
-            //return -1;
-        }
-
-        hwndCB = mbi.hwndMB;
+        hwndCB = CreateMenuBar( hwnd, hInst );
 
         iccex.dwSize = sizeof (INITCOMMONCONTROLSEX);
         iccex.dwICC = ICC_BAR_CLASSES;
@@ -201,18 +265,13 @@ LRESULT Playlist::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
         dwStyle = WS_VISIBLE | WS_CHILD | TBSTYLE_TOOLTIPS |
             WS_EX_OVERLAPPEDWINDOW | CCS_NOPARENTALIGN;
 
-        hwndTB = CreateToolbarEx( hwnd, dwStyle, NULL, NUMIMAGES,
+        hwndTB = CreateToolbarEx( hwnd, dwStyle, 0, NUMIMAGES,
                                   hInst, IDB_BITMAP3, tbButton2,
                                   sizeof (tbButton2) / sizeof (TBBUTTON),
                                   BUTTONWIDTH, BUTTONHEIGHT,
                                   IMAGEWIDTH, IMAGEHEIGHT, sizeof(TBBUTTON) );
-        if( !hwndTB )
-        {
-            *pbProcessed = bWasProcessed;
-            lResult = FALSE;
-            return lResult;
-        }
-  
+        if( !hwndTB ) break;
         // Add ToolTips to the toolbar.
         SendMessage( hwndTB, TB_SETTOOLTIPS, (WPARAM) NUMIMAGES,
                      (LPARAM)szToolTips2 );
@@ -220,19 +279,15 @@ LRESULT Playlist::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
         // Reposition the toolbar.
         GetClientRect( hwnd, &rect );
         GetWindowRect( hwndTB, &rectTB );
-        MoveWindow( hwndTB, rect.left, rect.top - 2, rect.right - rect.left, 
+        MoveWindow( hwndTB, rect.left, rect.top - 2, rect.right - rect.left,
                     MENU_HEIGHT /*rectTB.bottom - rectTB.top */, TRUE);
 
         // random, loop, repeat buttons states
-        vlc_value_t val; 
+        vlc_value_t val;
         p_playlist = (playlist_t *)
             vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
-        if( p_playlist == NULL )
-        {
-            *pbProcessed = bWasProcessed;
-            lResult = FALSE;
-            return lResult;
-        }
+        if( !p_playlist ) break;
+
         var_Get( p_playlist , "random", &val );
         bState = val.b_bool ? TBSTATE_CHECKED : 0;
         SendMessage( hwndTB, TB_SETSTATE, Random_Event,
@@ -250,8 +305,8 @@ LRESULT Playlist::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
         GetClientRect( hwnd, &rect );
         hListView = CreateWindow( WC_LISTVIEW, NULL, WS_VISIBLE | WS_CHILD |
             LVS_REPORT | LVS_SHOWSELALWAYS | WS_VSCROLL | WS_HSCROLL,
-            rect.left, rect.top + 2*(MENU_HEIGHT+1), rect.right - rect.left, 
-            rect.bottom - ( rect.top + 2*MENU_HEIGHT) - MENU_HEIGHT, 
+            rect.left, rect.top + 2*(MENU_HEIGHT+1), rect.right - rect.left,
+            rect.bottom - ( rect.top + 2*MENU_HEIGHT) - MENU_HEIGHT,
             hwnd, NULL, hInst, NULL );
         ListView_SetExtendedListViewStyle( hListView, LVS_EX_FULLROWSELECT );
 
@@ -273,143 +328,146 @@ LRESULT Playlist::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
         ListView_InsertColumn( hListView, 2, &lv);
 
         SetTimer( hwnd, 1, 500 /*milliseconds*/, NULL );
-
-        SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
-
-        return lResult;
+        break;
 
     case WM_TIMER:
         UpdatePlaylist();
-        return lResult;
+        break;
+
+    case WM_CLOSE:
+        EndDialog( hwnd, LOWORD( wp ) );
+        break;
 
-    case WM_COMMAND:    
+    case WM_SETFOCUS:
+        SHSipPreference( hwnd, SIP_DOWN );
+        SHFullScreen( hwnd, SHFS_HIDESIPBUTTON );
+        break;
+
+    case WM_COMMAND:
         switch( LOWORD(wp) )
         {
         case IDOK:
             EndDialog( hwnd, LOWORD( wp ) );
-            return TRUE;
+            break;
 
         case ID_MANAGE_OPENPL:
             OnOpen();
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case ID_MANAGE_SAVEPL:
-            SHFullScreen( GetForegroundWindow(), SHFS_SHOWSIPBUTTON );
             OnSave();
-            SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
-            return TRUE;
+            break;
 
-        case ID_MANAGE_SIMPLEADD:
-            SHFullScreen( GetForegroundWindow(), SHFS_SHOWSIPBUTTON );
-            OnAddFile();
-            SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
+        case ID_MANAGE_ADDFILE:
+            p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE_SIMPLE,
+                                           0, 0 );
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
+
+        case ID_MANAGE_ADDDIRECTORY:
+            p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_DIRECTORY,
+                                           0, 0 );
+            b_need_update = VLC_TRUE;
+            break;
 
         case ID_MANAGE_ADDMRL:
-            SHFullScreen( GetForegroundWindow(), SHFS_SHOWSIPBUTTON );
-            OnAddMRL();
-            SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
+            p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE, 0, 0 );
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case ID_SEL_DELETE:
             OnDeleteSelection();
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case Infos_Event:
-            SHFullScreen( GetForegroundWindow(), SHFS_SHOWSIPBUTTON );
             OnPopupInfo( hwnd );
-            SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case Up_Event:
             OnUp();
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case Down_Event:
             OnDown();
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case Random_Event:
             OnRandom();
-            return TRUE;
+            break;
 
         case Loop_Event:
             OnLoop();
-            return TRUE;
+            break;
 
         case Repeat_Event:
             OnRepeat();
-            return TRUE;
+            break;
 
         case ID_SORT_TITLE:
             OnSort( ID_SORT_TITLE );
-            return TRUE;
+            break;
 
         case ID_SORT_RTITLE:
             OnSort( ID_SORT_RTITLE );
-            return TRUE;
+            break;
 
         case ID_SORT_AUTHOR:
             OnSort( ID_SORT_AUTHOR );
-            return TRUE;
+            break;
 
         case ID_SORT_RAUTHOR:
             OnSort( ID_SORT_RAUTHOR );
-            return TRUE;
+            break;
 
         case ID_SORT_SHUFFLE:
             OnSort( ID_SORT_SHUFFLE );
-            return TRUE;
+            break;
 
         case ID_SEL_ENABLE:
             OnEnableSelection();
-            return TRUE;
+            break;
 
         case ID_SEL_DISABLE:
             OnDisableSelection();
-            return TRUE;
+            break;
 
         case ID_SEL_INVERT:
             OnInvertSelection();
-            return TRUE;
+            break;
 
         case ID_SEL_SELECTALL:
             OnSelectAll();
-            return TRUE;
+            break;
 
         case PopupPlay_Event:
             OnPopupPlay();
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case PopupDel_Event:
             OnPopupDel();
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case PopupEna_Event:
             OnPopupEna();
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         case PopupInfo_Event:
             OnPopupInfo( hwnd );
-            SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
             b_need_update = VLC_TRUE;
-            return TRUE;
+            break;
 
         default:
-            *pbProcessed = bWasProcessed;
-            lResult = FALSE;
-            return lResult;
+            break;
         }
+        break;
 
     case WM_NOTIFY:
         if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) &&
@@ -417,40 +475,31 @@ LRESULT Playlist::WndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp,
         {
             SetWindowLong( hwnd, DWL_MSGRESULT,
                            (LONG)ProcessCustomDraw(lp) );
-            return TRUE;
         }
         else if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) &&
                  ( ((LPNMHDR)lp)->code == GN_CONTEXTMENU  ) )
-        {                       
+        {
             HandlePopupMenu( hwnd, ((PNMRGINFO)lp)->ptAction );
-            return TRUE;
         }
         else if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) &&
                  ( ((LPNMHDR)lp)->code == LVN_COLUMNCLICK  ) )
         {
             OnColSelect( ((LPNMLISTVIEW)lp)->iSubItem );
-            return TRUE;
         }
         else if( ( ((LPNMHDR)lp)->hwndFrom == hListView ) &&
                  ( ((LPNMHDR)lp)->code == LVN_ITEMACTIVATE  ) )
         {
             OnActivateItem( ((LPNMLISTVIEW)lp)->iSubItem );
-            return TRUE;
         }
-
-        *pbProcessed = bWasProcessed;
-        lResult = FALSE;
-        return lResult;
+        break;
 
     default:
          // the message was not processed
          // indicate if the base class handled it
-         *pbProcessed = bWasProcessed;
-         lResult = FALSE;
-         return lResult;
+        break;
     }
 
-    return lResult;
+    return FALSE;
 }
 
 LRESULT Playlist::ProcessCustomDraw( LPARAM lParam )
@@ -473,7 +522,7 @@ LRESULT Playlist::ProcessCustomDraw( LPARAM lParam )
             vlc_object_release(p_playlist);
             return CDRF_NEWFONT;
         }
-        
         playlist_item_t *p_item = playlist_ItemGetByPos( p_playlist,
                                         (int)lplvcd->nmcd.dwItemSpec );
         if( !p_item )
@@ -516,6 +565,15 @@ void Playlist::HandlePopupMenu( HWND hwnd, POINT point )
     DestroyMenu( hMenuTrackPopup );
 }
 
+/**********************************************************************
+ * Show the playlist
+ **********************************************************************/
+void Playlist::ShowPlaylist( bool b_show )
+{
+    if( b_show ) Rebuild();
+    Show( b_show );
+}
+
 /**********************************************************************
  * Update the playlist
  **********************************************************************/
@@ -526,11 +584,11 @@ void Playlist::UpdatePlaylist()
         Rebuild();
         b_need_update = VLC_FALSE;
     }
-        
     playlist_t *p_playlist = (playlist_t *)
         vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
     if( p_playlist == NULL ) return;
-        
     /* Update the colour of items */
 
     vlc_mutex_lock( &p_playlist->object_lock );
@@ -609,11 +667,11 @@ void Playlist::UpdateItem( int i )
 
     ListView_SetItemText( hListView, i, 0, _FROMMB(p_item->input.psz_name) );
     ListView_SetItemText( hListView, i, 1,
-                          _FROMMB( vlc_input_item_GetInfo( &p_item->input,
+                          _FROMMB( input_ItemGetInfo( &p_item->input,
                                    _("General") , _("Author") ) ) );
 
     char psz_duration[MSTRTIME_MAX_SIZE];
-    mtime_t dur = p_item->input.i_duration;
+    mtime_t dur = input_item_GetDuration( p_item );
     if( dur != -1 ) secstotimestr( psz_duration, dur/1000000 );
     else memcpy( psz_duration , "-:--:--", sizeof("-:--:--") );
 
@@ -640,150 +698,81 @@ void Playlist::DeleteItem( int item )
 /**********************************************************************
  * I/O functions
  **********************************************************************/
-void Playlist::OnOpen()
+static void OnOpenCB( intf_dialog_args_t *p_arg )
 {
-    OPENFILENAME ofn;
-    TCHAR DateiName[80+1] = _T("\0");
-    static TCHAR szFilter[] = _T("All playlists (*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u)\0*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u\0");
-
-    playlist_t *p_playlist = (playlist_t *)
-        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
-    if( p_playlist == NULL ) return;
+    intf_thread_t *p_intf = (intf_thread_t *)p_arg->p_arg;
 
-    memset( &ofn, 0, sizeof(OPENFILENAME) );
-    ofn.lStructSize = sizeof (OPENFILENAME);
-    ofn.hwndOwner = NULL;
-    ofn.hInstance = hInst;
-    ofn.lpstrFilter = szFilter;
-    ofn.lpstrCustomFilter = NULL;
-    ofn.nMaxCustFilter = 0;
-    ofn.nFilterIndex = 1;     
-    ofn.lpstrFile = (LPTSTR) DateiName; 
-    ofn.nMaxFile = 80;
-    ofn.lpstrFileTitle = NULL; 
-    ofn.nMaxFileTitle = 40;
-    ofn.lpstrInitialDir = NULL;
-    ofn.lpstrTitle = _T("Open playlist");
-    ofn.Flags = 0; 
-    ofn.nFileOffset = 0;
-    ofn.nFileExtension = 0;
-    ofn.lpstrDefExt = NULL;
-    ofn.lCustData = 0L;
-    ofn.lpfnHook = NULL;
-    ofn.lpTemplateName = NULL;
-
-    if( GetOpenFileName((LPOPENFILENAME)&ofn) )
+    if( p_arg->i_results && p_arg->psz_results[0] )
     {
-        playlist_Import( p_playlist, _TOMB(ofn.lpstrFile) );
+        playlist_t * p_playlist = (playlist_t *)
+            vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
+
+        if( p_playlist )
+        {
+            playlist_Import( p_playlist, p_arg->psz_results[0] );
+        }
+
+        if( p_playlist ) vlc_object_release( p_playlist );
     }
+}
 
-    vlc_object_release( p_playlist );
+void Playlist::OnOpen()
+{
+    char *psz_filters ="All playlists|*.pls;*.m3u;*.asx;*.b4s|M3U files|*.m3u";
+
+    intf_dialog_args_t *p_arg =
+        (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
+    memset( p_arg, 0, sizeof(intf_dialog_args_t) );
+
+    p_arg->psz_title = strdup( "Open playlist" );
+    p_arg->psz_extensions = strdup( psz_filters );
+    p_arg->p_arg = p_intf;
+    p_arg->pf_callback = OnOpenCB;
+
+    p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE_GENERIC, 0, p_arg);
 }
 
-void Playlist::OnSave()
+static void OnSaveCB( intf_dialog_args_t *p_arg )
 {
-    TCHAR szFile[NMAXFILE] = _T("\0");
-    OPENFILENAME ofn;
-
-    LPWSTR wUnicode;
-    int len;
-
-    struct {
-        TCHAR *psz_desc;
-        TCHAR *psz_filter;
-        char *psz_module;
-    } formats[] = {{ _T("M3U file"), _T("*.m3u"), "export-m3u" },       
-                { _T("PLS file"), _T("*.pls"), "export-pls" }};
-    wUnicode = new TCHAR[100];
-    wcscpy( wUnicode, _T("") );
-    len = 0;
-
-    for( unsigned int i = 0; i < sizeof(formats)/sizeof(formats[0]); i++)
-    {
-        wcscpy( &wUnicode[len], formats[i].psz_desc );
-                len = len + wcslen( formats[i].psz_desc );
-        wUnicode[len] = '\0';
-                len++;
-        wcscpy( &wUnicode[len], formats[i].psz_filter );
-                len = len + wcslen( formats[i].psz_filter );
-        wUnicode[len] = '\0';
-                len++;
-    }
-    wUnicode[len] = '\0';
-
-    memset( &(ofn), 0, sizeof(ofn));
-    ofn.lStructSize     = sizeof(ofn);
-    ofn.hwndOwner = NULL;
-    ofn.lpstrFile = szFile;
-    ofn.nMaxFile = NMAXFILE;    
-    ofn.lpstrFilter = wUnicode;
-    ofn.lpstrTitle = _T("Save playlist");
-    ofn.Flags = OFN_HIDEREADONLY; 
-    free( wUnicode );
-
-    if( GetSaveFileName((LPOPENFILENAME) &ofn) )
+    intf_thread_t *p_intf = (intf_thread_t *)p_arg->p_arg;
+
+    if( p_arg->i_results && p_arg->psz_results[0] )
     {
         playlist_t * p_playlist = (playlist_t *)
             vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
 
-        if( p_playlist && ofn.lpstrFile )
+        if( p_playlist )
         {
-            playlist_Export( p_playlist, _TOMB(ofn.lpstrFile),
-                             formats[ofn.nFilterIndex ?
-                                     ofn.nFilterIndex - 1 : 0].psz_module );
+            char *psz_export;
+            char *psz_ext = strrchr( p_arg->psz_results[0], '.' );
+
+            if( psz_ext && !strcmp( psz_ext, ".pls") )
+                psz_export = "export-pls";
+            else psz_export = "export-m3u";
+
+            playlist_Export( p_playlist, p_arg->psz_results[0], psz_export );
         }
 
         if( p_playlist ) vlc_object_release( p_playlist );
     }
 }
 
-void Playlist::OnAddFile()
+void Playlist::OnSave()
 {
-    // Same code as in Interface
-    OPENFILENAME ofn;
-    TCHAR DateiName[80+1] = _T("\0");
-    static TCHAR szFilter[] = _T("All (*.*)\0*.*\0");
+    char *psz_filters ="M3U file|*.m3u|PLS file|*.pls";
 
-    playlist_t *p_playlist = (playlist_t *)
-        vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
-    if( p_playlist == NULL ) return;
+    intf_dialog_args_t *p_arg =
+        (intf_dialog_args_t *)malloc( sizeof(intf_dialog_args_t) );
+    memset( p_arg, 0, sizeof(intf_dialog_args_t) );
 
-    memset( &ofn, 0, sizeof(OPENFILENAME) );
-    ofn.lStructSize = sizeof(OPENFILENAME);
-    ofn.hwndOwner = NULL;
-    ofn.hInstance = hInst;
-    ofn.lpstrFilter = szFilter;
-    ofn.lpstrCustomFilter = NULL;
-    ofn.nMaxCustFilter = 0;
-    ofn.nFilterIndex = 1;     
-    ofn.lpstrFile = (LPTSTR)DateiName; 
-    ofn.nMaxFile = 80;
-    ofn.lpstrFileTitle = NULL; 
-    ofn.nMaxFileTitle = 40;
-    ofn.lpstrInitialDir = NULL;
-    ofn.lpstrTitle = _T("Quick Open File");
-    ofn.Flags = NULL; 
-    ofn.nFileOffset = 0;
-    ofn.nFileExtension = 0;
-    ofn.lpstrDefExt = NULL;
-    ofn.lCustData = 0L;
-    ofn.lpfnHook = NULL;
-    ofn.lpTemplateName = NULL;
-
-    SHFullScreen( GetForegroundWindow(), SHFS_HIDESIPBUTTON );
-
-    if( GetOpenFileName( (LPOPENFILENAME)&ofn ) )
-    {
-        char *psz_filename = _TOMB(ofn.lpstrFile);
-        playlist_Add( p_playlist, psz_filename, psz_filename,
-                      PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
-    }
+    p_arg->psz_title = strdup( "Save playlist" );
+    p_arg->psz_extensions = strdup( psz_filters );
+    p_arg->b_save = VLC_TRUE;
+    p_arg->p_arg = p_intf;
+    p_arg->pf_callback = OnSaveCB;
 
-    vlc_object_release( p_playlist );
-}
-
-void Playlist::OnAddMRL()
-{
+    p_intf->p_sys->pf_show_dialog( p_intf, INTF_DIALOG_FILE_GENERIC,
+                                   0, p_arg );
 }
 
 /**********************************************************************
@@ -888,10 +877,8 @@ void Playlist::ShowInfos( HWND hwnd, int i_item )
     if( p_item )
     {
         ItemInfoDialog *iteminfo_dialog =
-            new ItemInfoDialog( p_intf, hInst, p_item );
-        DialogBoxParam( hInst, (LPCTSTR)IDD_DUMMY, hwnd,
-                        (DLGPROC)iteminfo_dialog->BaseWndProc,
-                        (long)iteminfo_dialog );                
+            new ItemInfoDialog( p_intf, this, hInst, p_item );
+        CreateDialogBox( hwnd, iteminfo_dialog );
         UpdateItem( i_item );
         delete iteminfo_dialog;
     }
@@ -958,7 +945,7 @@ void Playlist::OnDown()
 void Playlist::OnRandom()
 {
     vlc_value_t val;
-    int bState = SendMessage( hwndTB, TB_GETSTATE, Random_Event, 0 ); 
+    int bState = SendMessage( hwndTB, TB_GETSTATE, Random_Event, 0 );
     val.b_bool = (bState & TBSTATE_CHECKED) ? VLC_TRUE : VLC_FALSE;
 
     playlist_t *p_playlist = (playlist_t *)
@@ -972,7 +959,7 @@ void Playlist::OnRandom()
 void Playlist::OnLoop ()
 {
     vlc_value_t val;
-    int bState = SendMessage( hwndTB, TB_GETSTATE, Loop_Event, 0 ); 
+    int bState = SendMessage( hwndTB, TB_GETSTATE, Loop_Event, 0 );
     val.b_bool = (bState & TBSTATE_CHECKED) ? VLC_TRUE : VLC_FALSE;
 
     playlist_t *p_playlist = (playlist_t *)
@@ -986,7 +973,7 @@ void Playlist::OnLoop ()
 void Playlist::OnRepeat ()
 {
     vlc_value_t val;
-    int bState = SendMessage( hwndTB, TB_GETSTATE, Repeat_Event, 0 );  
+    int bState = SendMessage( hwndTB, TB_GETSTATE, Repeat_Event, 0 );
     val.b_bool = (bState & TBSTATE_CHECKED) ? VLC_TRUE : VLC_FALSE;
 
     playlist_t *p_playlist = (playlist_t *)