1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723 |
- #include "main.h"
- #include "api__gen_ml.h"
- #include <windowsx.h>
- #include <time.h>
- #include <rpc.h>
- #include "../winamp/gen.h"
- #include "resource.h"
- #include "../nu/ns_wc.h"
- #include "config.h"
- #include "../winamp/ipc_pe.h"
- #include "../winamp/wa_dlg.h"
- #include "ml.h"
- #include "ml_ipc.h"
- #include "sendto.h"
- #include "../gen_hotkeys/wa_hotkeys.h"
- #include "MediaLibraryCOM.h"
- #include "../nu/CCVersion.h"
- #include "../nu/AutoWide.h"
- #include "../nu/AutoChar.h"
- #include "./navigation.h"
- #include "./ml_imagelist.h"
- #include "./ml_imagefilter.h"
- #include "./imagefilters.h" // default filters
- #include <shlwapi.h>
- #include "./ml_ipc_0313.h"
- #include "./skinning.h"
- #include "./ml_ratingcolumn.h"
- #include "./ml_cloudcolumn.h"
- #include "./colors.h"
- #include "./stockobjects.h"
- #include "./service.h"
- #include "./skinnedbutton.h"
- #include "../Winamp/wasabicfg.h"
- #ifdef _DEBUG
- #define BETA
- #endif
- // messages
- #define WMML_FIRST (WM_APP + 0)
- #define WMML_UPDATEVIEW (WMML_FIRST + 1)
- #define WMML_SHOWCONTAINER (WMML_FIRST + 10)
- #define BLOCK_ACCELTOGGLE_PROP TEXT("BLOCK_ACCELTOGGLE")
- // timers
- #define TIMER_UPDATEVIEW_ID 1970
- #define TIMER_UPDATEVIEW_DELAY 7
- #define TIMER_NAVAUTOSCROLL_ID 1971
- #define TIMER_NAVAUTOSCROLL_DELAY 80
- #define TIMER_NAVAUTOEXPAND_ID 1972
- #define TIMER_NAVAUTOEXPAND_DELAY 500
- #define TIMER_UNBLOCKACCELTOGGLE_ID 1973
- #define TIMER_UNBLOCKACCELTOGGLE_DELAY 200
- #define IDC_CURRENTVIEW 0x1001
- #define IDC_NAVIGATION 0x03FD // (this is the same that old versions used)
- #define MEDIALIBRARY_HELP_URL L"https://help.winamp.com/hc/articles/8105304048660-The-Winamp-Media-Library"
- SendToMenu *main_sendtomenu;
- HMENU main_sendto_hmenu;
- int main_sendto_mode;
- extern "C" HWND g_ownerwnd;
- static int ldiv_clickoffs, ldiv_paintleftborder;
- static WNDPROC ldiv_oldWndProc;
- static WNDPROC add_oldWndProc;
- HNAVITEM g_treedrag_lastSel;
- static HNAVITEM m_query_moving_dragplace;
- static HNAVITEM m_query_moving_item, m_query_moving_lastdest;
- static int m_query_moving_dragplaceisbelow;
- static int m_query_moving;
- static int m_query_moving_type;
- HWND m_curview_hwnd = NULL;
- HNAVCTRL hNavigation = NULL; // navigation control
- HMLIMGLST hmlilRating = NULL; // default rating images
- HMLIMGLST hmlilCloud = NULL; // default cloud images
- UINT ratingGlobalStyle = RATING_DEFAULT_STYLE;
- static HMLIMGLST hmlilNavigation = NULL; // default navigation image list
- HMLIMGFLTRMNGR hmlifMngr = NULL; /// default image filters
- static HRGN g_rgnUpdate = NULL;
- static INT divider_pos;
- static BOOL firstShow = TRUE;
- static BOOL m_nav_autoscroll = FALSE;
- static HNAVITEM m_nav_autoexpand_item = NULL;
- static HIMAGELIST m_nav_dragitem_imagelist = NULL;
- void OpenMediaLibraryPreferences();
- typedef struct _LAYOUT
- {
- INT id;
- HWND hwnd;
- INT x;
- INT y;
- INT cx;
- INT cy;
- DWORD flags;
- HRGN rgn;
- }LAYOUT, PLAYOUT;
- #define SETLAYOUTPOS(_layout, _x, _y, _cx, _cy) { _layout->x=_x; _layout->y=_y;_layout->cx=_cx;_layout->cy=_cy;_layout->rgn=NULL; }
- static void LayoutWindows( HWND hwnd, INT divX, BOOL fRedraw )
- {
- static BOOL useDefer = ( GetVersion() < 0x80000000 );
- static INT controls[] = { IDC_BTN_LIB, IDC_NAVIGATION, IDC_VDELIM, IDC_CURRENTVIEW, IDC_NO_VIEW };
- RECT rc, ri, roTree;
- LAYOUT layout[ sizeof( controls ) / sizeof( controls[ 0 ] ) ], *pl;
- INT divCX = 0, btnY;
- GetClientRect( hwnd, &rc );
- if ( rc.bottom == rc.top || rc.left == rc.right )
- return;
- if ( rc.bottom > WASABI_API_APP->getScaleY( 2 ) )
- rc.bottom -= WASABI_API_APP->getScaleY( 2 );
- HRGN rgn = CreateRectRgn( 0, 0, 0, 0 );
- if ( divX > rc.right - WASABI_API_APP->getScaleY( 41 ) )
- divX = rc.right - WASABI_API_APP->getScaleY( 9 );
- if ( divX < WASABI_API_APP->getScaleY( 32 ) )
- divX = 0;
- else if ( divX > ( rc.right - rc.left ) )
- divX = ( rc.right - rc.left );
- pl = layout;
- btnY = rc.bottom; // in case button is broken
- InvalidateRgn( hwnd, NULL, TRUE );
- for ( int i = 0; i < sizeof( controls ) / sizeof( controls[ 0 ] ); i++ )
- {
- pl->id = controls[ i ];
- switch ( pl->id )
- {
- case IDC_NAVIGATION: pl->hwnd = NavCtrlI_GetHWND( hNavigation ); break;
- case IDC_CURRENTVIEW: pl->hwnd = m_curview_hwnd; break;
- default: pl->hwnd = GetDlgItem( hwnd, pl->id ); break;
- }
- if ( !pl->hwnd )
- continue;
- pl->rgn = NULL;
- GetWindowRect( pl->hwnd, &ri );
- MapWindowPoints( HWND_DESKTOP, hwnd, (LPPOINT)&ri, 2 );
- pl->flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW | SWP_NOCOPYBITS;
- switch ( pl->id )
- {
- case IDC_BTN_LIB:
- {
- wchar_t buffer[ 128 ] = { 0 };
- GetWindowTextW( pl->hwnd, buffer, ARRAYSIZE( buffer ) );
- LRESULT idealSize = MLSkinnedButton_GetIdealSize( pl->hwnd, buffer );
- btnY = WASABI_API_APP->getScaleY( HIWORD( idealSize ) );
- SETLAYOUTPOS( pl, rc.left, rc.bottom - btnY, rc.left + divX, btnY );
- break;
- }
- case IDC_NAVIGATION:
- GetClientRect( pl->hwnd, &roTree );
- NavCtrlI_MapPointsTo( hNavigation, hwnd, (LPPOINT)&roTree, 2 );
- SETLAYOUTPOS( pl, rc.left, rc.top, rc.left + divX, rc.bottom - btnY - WASABI_API_APP->getScaleY( 3 ) );
- ldiv_paintleftborder = ( pl->cx > 0 );
- break;
- case IDC_VDELIM:
- divCX = ( ri.right - ri.left );
- SETLAYOUTPOS( pl, divX + WASABI_API_APP->getScaleX( 1 ), rc.top, divCX, max( 0, rc.bottom - rc.top ) );
- break;
- case IDC_CURRENTVIEW: // current view;
- SETLAYOUTPOS( pl, divX + divCX, rc.top, max( 0, rc.right - pl->x - WASABI_API_APP->getScaleX( 2 ) ), max( 0, rc.bottom - rc.top ) );
- if ( !SendMessage( pl->hwnd, WM_USER + 0x200, 0, 0 ) ) pl->flags &= ~( SWP_NOREDRAW );
- break;
- case IDC_NO_VIEW:
- SETLAYOUTPOS( pl, divX + divCX + 20, rc.top, max( 0, rc.right - pl->x - WASABI_API_APP->getScaleX( 2 ) - 20 ), max( 0, rc.bottom - rc.top ) );
- if ( !SendMessage( pl->hwnd, WM_USER + 0x200, 0, 0 ) ) pl->flags &= ~( SWP_NOREDRAW );
- break;
- }
- if ( pl->x == ri.left && pl->y == ri.top )
- pl->flags |= SWP_NOMOVE;
- if ( pl->cx == ( ri.right - ri.left ) && pl->cy == ( ri.bottom - ri.top ) )
- pl->flags |= SWP_NOSIZE;
- if ( ( SWP_NOMOVE | SWP_NOSIZE ) != ( ( SWP_NOMOVE | SWP_NOSIZE ) & pl->flags ) )
- pl++;
- else if ( IsWindowVisible( pl->hwnd ) )
- {
- ValidateRect( hwnd, &ri );
- if ( GetUpdateRect( pl->hwnd, NULL, FALSE ) )
- {
- GetUpdateRgn( pl->hwnd, rgn, FALSE );
- OffsetRgn( rgn, pl->x, pl->y );
- InvalidateRgn( hwnd, rgn, FALSE );
- }
- }
- }
- if ( pl != layout )
- {
- LAYOUT *pc;
- HDWP hdwp = ( useDefer ) ? BeginDeferWindowPos( (INT)( pl - layout ) ) : NULL;
- for ( pc = layout; pc < pl && ( !useDefer || hdwp ); pc++ )
- {
- if ( IDC_CURRENTVIEW == pc->id && ( SWP_NOREDRAW & pc->flags ) && IsWindowVisible( pc->hwnd ) )
- {
- if ( !pc->rgn )
- pc->rgn = CreateRectRgn( 0, 0, pc->cx, pc->cy );
- GetWindowRect( pc->hwnd, &ri );
- NavCtrlI_MapPointsFrom( hNavigation, HWND_DESKTOP, (LPPOINT)&ri, 1 );
- SendMessage( pc->hwnd, WM_USER + 0x201, MAKEWPARAM( pc->x - ri.left, pc->y - ri.top ), (LPARAM)pc->rgn );
- }
- if ( useDefer )
- hdwp = DeferWindowPos( hdwp, pc->hwnd, NULL, pc->x, pc->y, pc->cx, pc->cy, pc->flags );
- else
- SetWindowPos( pc->hwnd, NULL, pc->x, pc->y, pc->cx, pc->cy, pc->flags );
- }
- if ( hdwp )
- EndDeferWindowPos( hdwp );
- for ( pc = layout; pc < pl; pc++ )
- {
- if ( IDC_NAVIGATION == pc->id )
- {
- GetWindowRect( pc->hwnd, &ri );
- OffsetRect( &ri, -ri.left, -ri.top );
- pc->rgn = CreateRectRgnIndirect( &ri );
- GetClientRect( pc->hwnd, &ri );
- NavCtrlI_MapPointsTo( hNavigation, hwnd, (LPPOINT)&ri, 1 );
- IntersectRect( &ri, &roTree, &ri );
- SetRectRgn( rgn, ri.left, ri.top, ri.right, ri.bottom );
- CombineRgn( pc->rgn, pc->rgn, rgn, RGN_DIFF );
- if ( GetUpdateRect( pc->hwnd, NULL, FALSE ) )
- {
- GetUpdateRgn( pc->hwnd, rgn, FALSE );
- CombineRgn( pc->rgn, pc->rgn, rgn, RGN_OR );
- }
- }
- else if ( IDC_CURRENTVIEW == pc->id && pc->rgn )
- SendMessage( pc->hwnd, WM_USER + 0x201, 0, 0L );
- if ( IsWindowVisible( pc->hwnd ) )
- {
- GetWindowRect( pc->hwnd, &ri );
- MapWindowPoints( HWND_DESKTOP, hwnd, (LPPOINT)&ri, 2 );
- ValidateRect( hwnd, &ri );
- }
- }
- if ( fRedraw )
- {
- HRGN rgnTmp = CreateRectRgn( 0, 0, 0, 0 );
- GetUpdateRgn( hwnd, rgn, FALSE );
- for ( pc = layout; pc < pl; pc++ )
- {
- if ( SWP_NOREDRAW & pc->flags )
- {
- if ( pc->rgn )
- OffsetRgn( pc->rgn, pc->x, pc->y );
- else
- SetRectRgn( rgnTmp, pc->x, pc->y, pc->x + pc->cx, pc->y + pc->cy );
- CombineRgn( rgn, rgn, ( pc->rgn ) ? pc->rgn : rgnTmp, RGN_OR );
- }
- }
- DeleteObject( rgnTmp );
- RedrawWindow( hwnd, NULL, rgn, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ERASENOW | RDW_ALLCHILDREN );
- }
- else if ( g_rgnUpdate )
- {
- GetUpdateRgn( hwnd, g_rgnUpdate, FALSE );
- ValidateRect( hwnd, NULL );
- for ( pc = layout; pc < pl; pc++ )
- {
- if ( SWP_NOREDRAW & pc->flags )
- {
- if ( pc->rgn )
- OffsetRgn( pc->rgn, pc->x, pc->y );
- else
- SetRectRgn( rgn, pc->x, pc->y, pc->x + pc->cx, pc->y + pc->cy );
- CombineRgn( g_rgnUpdate, g_rgnUpdate, ( pc->rgn ) ? pc->rgn : rgn, RGN_OR );
- }
- }
- }
- for ( pc = layout; pc < pl; pc++ )
- if ( pc->rgn )
- DeleteObject( pc->rgn );
- }
- if ( rgn )
- DeleteObject( rgn );
- }
- // a default right-pane view to show if a plugin failed to return us an HWND
- static INT_PTR CALLBACK view_Error( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
- {
- if ( uMsg == WM_INITDIALOG )
- {
- ShowWindow( GetDlgItem( g_hwnd, IDC_NO_VIEW ), SW_SHOW );
- }
- return WADlg_handleDialogMsgs( hwndDlg, uMsg, wParam, lParam );
- }
- static void CreateCurrentView( HWND hwndDlg )
- {
- HNAVITEM hItem;
- DLGPROC proc;
- proc = view_Error;
- hItem = NavCtrlI_GetSelection( hNavigation );
- if ( hItem )
- {
- INT itemId = NavItemI_GetId( hItem );
- #if 0
- #ifdef BETA
- wchar_t pszText[ 32 ] = { 0 };
- if ( NavItemI_GetInvariantText( hItem, pszText, 32 ) && !lstrcmpW( pszText, L"winamp_labs" ) )
- {
- OmService *om_service;
- OmService::CreateInstance( SERVICE_LABS, L"Winamp Labs", &om_service );
- if ( AGAVE_OBJ_BROWSER )
- {
- HWND hView = 0;
- HRESULT hr = AGAVE_OBJ_BROWSER->CreateView( om_service, (HWND)hwndDlg, 0, 0, &hView );
- om_service->Release();
- if ( SUCCEEDED( hr ) )
- {
- m_curview_hwnd = hView;
- }
- }
- }
- else
- #endif
- #endif
- m_curview_hwnd = (HWND)plugin_SendMessage( ML_MSG_TREE_ONCREATEVIEW, (INT_PTR)itemId, (INT_PTR)hwndDlg, 0 );
- }
- if ( !IsWindow( m_curview_hwnd ) )
- m_curview_hwnd = WASABI_API_CREATEDIALOGPARAMW( IDD_VIEW_EMPTY, hwndDlg, proc, 0 );
- else
- ShowWindow( GetDlgItem( g_hwnd, IDC_NO_VIEW ), SW_HIDE );
- if ( IsWindow( m_curview_hwnd ) )
- {
- SetWindowPos( m_curview_hwnd, NavCtrlI_GetHWND( hNavigation ), 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOREDRAW );
- LayoutWindows( hwndDlg, divider_pos, FALSE );
- // moved 08/12/09 from start of block to here along with SkinnedWnd::OnSkinChanged(..) change to hopefully resolve bold font issues
- MLSkinnedWnd_SkinChanged( m_curview_hwnd, TRUE, FALSE );
- ShowWindow( m_curview_hwnd, SW_SHOWNORMAL );
- RedrawWindow( m_curview_hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN );
- PostMessage( m_curview_hwnd, WMML_UPDATEVIEW, 0, 0 ); //refresh view
- }
- }
- static void DisplayItemDragImage( HNAVITEM hItem, LPCWSTR pszTip, HWND hwndOwner, POINT *ppt ) // ppt in hwndOwner coordinates
- {
- if ( !hwndOwner )
- return;
- if ( m_nav_dragitem_imagelist )
- {
- ImageList_DragLeave( hwndOwner );
- ImageList_EndDrag();
- ImageList_Destroy( m_nav_dragitem_imagelist );
- }
- m_nav_dragitem_imagelist = NavItemI_CreateDragImage( hItem, pszTip );
- if ( m_nav_dragitem_imagelist )
- {
- INT cx, cy;
- ImageList_GetIconSize( m_nav_dragitem_imagelist, &cx, &cy );
- if ( ImageList_BeginDrag( m_nav_dragitem_imagelist, 0, cx / 2, cy / 2 ) )
- {
- NavCtrlI_Update( hNavigation );
- ImageList_DragEnter( hwndOwner, ppt->x, ppt->y );
- }
- }
- }
- VOID CALLBACK CreateViewTimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime )
- {
- if ( idEvent == TIMER_UPDATEVIEW_ID )
- {
- KillTimer( hwnd, TIMER_UPDATEVIEW_ID );
- CreateCurrentView( hwnd );
- }
- }
- static void CALLBACK OnNavCtrl_Selected( HNAVCTRL hMngr, HNAVITEM hItemOld, HNAVITEM hItemNew )
- {
- KillTimer( g_hwnd, TIMER_UPDATEVIEW_ID );
- if ( IsWindow( m_curview_hwnd ) )
- {
- RedrawWindow( g_hwnd, NULL, NULL, RDW_UPDATENOW | RDW_ALLCHILDREN );
- SendMessageW( g_hwnd, WM_SETREDRAW, FALSE, 0L ); // freeze window
- ShowWindow( m_curview_hwnd, SW_HIDE );
- SendMessageW( g_hwnd, WM_SETREDRAW, TRUE, 0L );
- DestroyWindow( m_curview_hwnd );
- m_curview_hwnd = NULL;
- }
- // 07/05/2010 DRO - changed to use a callback proc as ml_disc was managing to trigger
- // the same timer message multiple times on (at least) older XP machines which was
- // causing multiple ml view dialogs to be created but hidden behind the currently
- // opened view - intermittent issue i've been seeing for a year on my XP machine.
- SetTimer( g_hwnd, TIMER_UPDATEVIEW_ID, TIMER_UPDATEVIEW_DELAY, CreateViewTimerProc );
- }
- static BOOL CALLBACK OnNavCtrl_Click( HNAVCTRL hMngr, HNAVITEM hItem, INT actionId )
- {
- if ( hItem )
- {
- INT mlAction = -1;
- switch ( actionId )
- {
- case ACTION_CLICKL_I: mlAction = ML_ACTION_LCLICK; break;
- case ACTION_CLICKR_I: mlAction = ML_ACTION_RCLICK; break;
- case ACTION_ENTER_I: mlAction = ML_ACTION_ENTER; break;
- case ACTION_DBLCLICKL_I: mlAction = ML_ACTION_DBLCLICK; break;
- case ACTION_DBLCLICKR_I: break;
- }
- if ( -1 != mlAction )
- {
- BOOL ret = (BOOL)plugin_SendMessage( ML_MSG_TREE_ONCLICK,
- NavItemI_GetId( hItem ),
- mlAction,
- (INT_PTR)GetParent( NavCtrlI_GetHWND( hMngr ) ) );
- if ( mlAction != ML_ACTION_LCLICK )
- return ret;
- }
- }
- return FALSE;
- }
- static BOOL CALLBACK OnNavCtrl_KeyDown( HNAVCTRL hMngr, HNAVITEM hItem, NMTVKEYDOWN *ptvkd )
- {
- return ( hItem ) ? (BOOL)plugin_SendMessage( ML_MSG_TREE_ONKEYDOWN,
- NavItemI_GetId( hItem ),
- (INT_PTR)ptvkd,
- (INT_PTR)NavCtrlI_GetHWND( hMngr ) ) : FALSE;
- }
- static BOOL CALLBACK OnNavCtrl_BeginTitleEdit( HNAVCTRL hMngr, HNAVITEM hItem )
- {
- return !(BOOL)plugin_SendMessage( ML_MSG_NAVIGATION_ONBEGINTITLEEDIT, (INT_PTR)hItem, 0, 0 );
- }
- static BOOL CALLBACK OnNavCtrl_EndTitleEdit( HNAVCTRL hMngr, HNAVITEM hItem, LPCWSTR pszNewTitle )
- {
- return (BOOL)plugin_SendMessage( ML_MSG_NAVIGATION_ONENDTITLEEDIT, (INT_PTR)hItem, (INT_PTR)pszNewTitle, 0 );
- }
- static void CALLBACK OnNavItem_Delete( HNAVCTRL hMngr, HNAVITEM hItem )
- {
- plugin_SendMessage( ML_MSG_NAVIGATION_ONDELETE, (INT_PTR)hItem, 0, 0 );
- }
- static void CALLBACK OnNavCtrl_Destroy( HNAVCTRL hMngr )
- {
- plugin_SendMessage( ML_MSG_NAVIGATION_ONDESTROY, 0, 0, 0 );
- }
- static INT CALLBACK OnNavItem_CustomDraw( HNAVCTRL hMngr, HNAVITEM hItem, NAVITEMDRAW_I *pnicd, LPARAM lParam )
- {
- INT result = (INT)plugin_SendMessage( ML_MSG_NAVIGATION_ONCUSTOMDRAW, (INT_PTR)hItem, (INT_PTR)pnicd, (INT_PTR)lParam );
- if ( NICDRF_NOTMINE == result )
- result = NICDRF_DODEFAULT_I;
- return result;
- }
- static INT CALLBACK OnNavItem_SetCursor( HNAVCTRL hMngr, HNAVITEM hItem, LPARAM lParam )
- {
- INT result = (INT)plugin_SendMessage( ML_MSG_NAVIGATION_ONSETCURSOR, (INT_PTR)hItem, (INT_PTR)0, (INT_PTR)lParam );
- return ( result > 0 );
- }
- static void CALLBACK OnNavItem_HitTest( HNAVCTRL hMngr, POINT pt, UINT *pHitFlags, HNAVITEM *phItem, LPARAM lParam )
- {
- NAVHITTEST ht;
- ht.flags = *pHitFlags;
- ht.pt = pt;
- ht.hItem = *phItem;
- if ( 0 != plugin_SendMessage( ML_MSG_NAVIGATION_ONHITTEST, (INT_PTR)*phItem, (INT_PTR)&ht, (INT_PTR)lParam ) )
- {
- *pHitFlags = ht.flags;
- *phItem = ht.hItem;
- }
- }
- static void CALLBACK OnNavCtrl_BeginDrag( HNAVCTRL hMngr, HNAVITEM hItem, POINT pt )
- {
- #ifdef BETA
- wchar_t pszText[ 32 ] = { 0 };
- if ( ( !( sneak & 4 ) ) && NavItemI_GetInvariantText( hItem, pszText, 32 ) && !lstrcmpW( pszText, L"winamp_labs" ) )
- {
- return;
- }
- #endif
- if ( plugin_SendMessage( ML_MSG_TREE_ONDRAG, NavItemI_GetId( hItem ), (INT_PTR)&pt, (INT_PTR)&m_query_moving_type ) < 1 )
- {
- HNAVITEM hParent;
- hParent = NavItemI_GetParent( hItem );
- m_query_moving_type = ( NULL == hParent || NIS_ALLOWCHILDMOVE_I == NavItemI_GetStyle( hParent, NIS_ALLOWCHILDMOVE_I ) ) ?
- ML_TYPE_TREEITEM : ML_TYPE_UNKNOWN;
- }
- m_query_moving = 1;
- m_query_moving_item = hItem;
- m_query_moving_dragplace = NULL;
- m_query_moving_lastdest = NULL;
- m_query_moving_dragplaceisbelow = FALSE;
- HWND hwndDlg = GetParent( NavCtrlI_GetHWND( hMngr ) );
- NavCtrlI_MapPointsTo( hMngr, hwndDlg, &pt, 1 );
- DisplayItemDragImage( hItem, NULL, hwndDlg, &pt );
- SetCapture( g_hwnd );
- }
- static INT CALLBACK OnNavCtrl_GetImageIndex( HNAVCTRL hMngr, HNAVITEM hItem, INT imageType )
- {
- if ( NavItemI_HasChildren( hItem ) )
- {
- INT_PTR tag;
- tag = ( NavItemI_HasChildrenReal( hItem ) ) ?
- ( ( NavItemI_IsExpanded( hItem ) ) ? MLTREEIMAGE_BRANCH_EXPANDED : MLTREEIMAGE_BRANCH_COLLAPSED ) :
- MLTREEIMAGE_BRANCH_NOCHILD;
- INT mlilIndex = MLImageListI_GetIndexFromTag( NavCtrlI_GetImageList( hMngr ), tag );
- return ( -1 != mlilIndex ) ? mlilIndex : 0;
- }
- return 0;
- }
- static void OnWindowPosChanged( HWND hwnd, WINDOWPOS *pwp )
- {
- if ( SWP_NOSIZE != ( ( SWP_NOSIZE | SWP_FRAMECHANGED | SWP_SHOWWINDOW ) & pwp->flags ) )
- {
- LayoutWindows( hwnd, divider_pos, ( 0 == ( SWP_NOREDRAW & pwp->flags ) ) );
- }
- }
- HWND wa3wnd_fixwnd( HWND h )
- {
- if ( IsChild( h, g_hwnd ) )
- return h; // if the library window is a child of this window, don't touch it
- if ( IsChild( h, g_PEWindow ) )
- return g_PEWindow; // if the playlist window is a child of this window, treat it as the playlist window
- HWND hParent = (HWND)SENDWAIPC( plugin.hwndParent, IPC_GETDIALOGBOXPARENT, 0 );
- if ( plugin.hwndParent != hParent && h == hParent )
- h = plugin.hwndParent;
- //DWORD pid;
- //DWORD threadID = GetWindowThreadProcessId(h, &pid);
- //if (pid != GetCurrentProcessId() || threadID != GetCurrentThreadId()) return h; // if other process, dont mangle
- //char buf[64] = {0};
- //GetClassName(h, buf, sizeof(buf) - 1);
- //if (!strcmp(buf, "BaseWindow_RootWnd")) return plugin.hwndParent; // if a wa3 window, treat as main window
- return h;
- }
- static void CALLBACK OnDividerMoved( HWND hdiv, INT nPos, LPARAM param )
- {
- HWND hwndParent;
- divider_pos = nPos;
- hwndParent = GetParent( hdiv );
- LayoutWindows( hwndParent, nPos, TRUE );
- }
- static void Navigation_DropHelper( HWND hwndDlg, HWND hwndNav, HNAVITEM hItemHit, UINT hitFlags, POINT pt )
- {
- if ( hItemHit && ( ( NAVHT_ONITEMINDENT_I | NAVHT_ONITEMRIGHT_I | NAVHT_ONITEM_I | NAVHT_ONITEMBUTTON_I ) & hitFlags ) )
- {
- RECT rc;
- GetClientRect( hwndNav, &rc );
- if ( !m_nav_autoscroll && ( rc.left <= pt.x && rc.right >= pt.x ) )
- {
- INT sbCommand;
- if ( rc.top <= pt.y && pt.y < ( rc.top + 24 ) )
- sbCommand = 1;
- else if ( ( rc.bottom - 24 ) < pt.y && pt.y <= rc.bottom )
- sbCommand = 2;
- else
- sbCommand = 0;
- if ( sbCommand )
- {
- SCROLLINFO si = { 0 };
- si.cbSize = sizeof( SCROLLINFO );
- si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE;
- if ( !GetScrollInfo( hwndNav, SB_VERT, &si ) )
- ZeroMemory( &si, sizeof( SCROLLINFO ) );
- if ( ( 1 == sbCommand && si.nMin < si.nPos ) || ( 2 == sbCommand && si.nMax >= (INT)( si.nPos + si.nPage ) ) )
- {
- if ( SetTimer( hwndDlg, TIMER_NAVAUTOSCROLL_ID, TIMER_NAVAUTOSCROLL_DELAY, NULL ) )
- m_nav_autoscroll = TRUE;
- }
- }
- }
- if ( ( NAVHT_ONITEMBUTTON_I & hitFlags ) && m_nav_autoexpand_item != hItemHit && !NavItemI_IsExpanded( hItemHit ) )
- {
- KillTimer( hwndDlg, TIMER_NAVAUTOEXPAND_ID );
- if ( SetTimer( hwndDlg, TIMER_NAVAUTOEXPAND_ID, TIMER_NAVAUTOEXPAND_DELAY, NULL ) )
- m_nav_autoexpand_item = hItemHit;
- }
- }
- }
- int handleDragDropMove( HWND hwndDlg, int type, POINT p, int do_cursors )
- {
- BOOL valid = FALSE;
- HWND h = WindowFromPoint( p );
- HNAVITEM hItemPrevHilited = g_treedrag_lastSel;
- g_treedrag_lastSel = NULL;
- if ( h )
- {
- h = wa3wnd_fixwnd( h );
- if ( IsChild( plugin.hwndParent, h ) )
- h = plugin.hwndParent;
- else if ( g_PEWindow && IsChild( g_PEWindow, h ) )
- h = g_PEWindow;
- else
- {
- HWND vid = (HWND)SendMessage( plugin.hwndParent, WM_WA_IPC, IPC_GETWND_VIDEO, IPC_GETWND );
- if ( vid )
- {
- if ( h == vid || IsChild( vid, h ) )
- h = plugin.hwndParent;
- }
- }
- if ( h && ( h == plugin.hwndParent || h == g_PEWindow ) )
- {
- valid = ( type == ML_TYPE_ITEMRECORDLISTW || type == ML_TYPE_ITEMRECORDLIST ||
- type == ML_TYPE_FILENAMES || type == ML_TYPE_STREAMNAMES ||
- type == ML_TYPE_CDTRACKS ||
- type == ML_TYPE_FILENAMESW || type == ML_TYPE_STREAMNAMESW );
- }
- else if ( h == NavCtrlI_GetHWND( hNavigation ) )
- {
- HNAVITEM hItemHit, hItemSel;
- UINT hitFlags;
- POINT pt = p;
- MapWindowPoints( HWND_DESKTOP, h, &pt, 1 );
- hItemHit = NavCtrlI_HitTest( hNavigation, &pt, &hitFlags );
- hItemSel = NavCtrlI_GetSelection( hNavigation );
- Navigation_DropHelper( hwndDlg, h, hItemHit, hitFlags, pt );
- if ( hItemHit && hItemHit != hItemSel && ( !m_query_moving_item || NavItemI_GetParent( m_query_moving_item ) != hItemHit ) )
- {
- valid = ( plugin_SendMessage( ML_MSG_TREE_ONDROPTARGET, NavItemI_GetId( hItemHit ), type, NULL ) > 0 );
- if ( valid )
- g_treedrag_lastSel = hItemHit;
- }
- }
- else if ( IsWindow( m_curview_hwnd ) && IsWindow( h ) && ( h == m_curview_hwnd || IsChild( m_curview_hwnd, h ) ) )
- {
- mlDropItemStruct dis = { 0, };
- dis.type = type;
- dis.p = p;
- while ( 1 )
- {
- SendMessage( h, WM_ML_CHILDIPC, (WPARAM)&dis, ML_CHILDIPC_DROPITEM );
- if ( dis.result || h == m_curview_hwnd )
- break;
- h = GetParent( h ); // traverse up the tree
- }
- valid = dis.result > 0;
- }
- }
- if ( g_treedrag_lastSel != hItemPrevHilited )
- {
- ImageList_DragShowNolock( FALSE );
- if ( hItemPrevHilited )
- NavItemI_SetState( hItemPrevHilited, 0, NIS_DROPHILITED_I );
- if ( g_treedrag_lastSel )
- NavItemI_SetState( g_treedrag_lastSel, NIS_DROPHILITED_I, NIS_DROPHILITED_I );
- NavCtrlI_Update( hNavigation );
- ImageList_DragShowNolock( TRUE );
- }
- if ( do_cursors )
- SetCursor( ( valid ) ? hDragNDropCursor : LoadCursor( NULL, IDC_NO ) );
- return valid;
- }
- static void CancelNavigationMove( void )
- {
- m_query_moving_dragplace = NULL;
- ImageList_DragShowNolock( FALSE );
- NavCtrlI_SetInsertMark( hNavigation, NULL, FALSE );
- NavCtrlI_Update( hNavigation );
- ImageList_DragShowNolock( TRUE );
- }
- static void OnInitMenuPopUp( HMENU menu );
- static void OnDisplayChange( HWND hwndDlg, UINT imgDepth, UINT hRes, UINT vRes );
- static int OnInitDialog( HWND hwndDlg );
- static void OnDestroy( HWND hwndDlg );
- static void OnClose( HWND hwndDlg );
- static void OnSize( HWND hwndDlg, UINT type, int cx, int cy );
- static void OnShowWindow( HWND hwndDlg, BOOL fShow );
- LRESULT OnMediaLibraryIPC( HWND hwndDlg, WPARAM wParam, LPARAM lParam );
- static void OnGetMaxMinInfo( MINMAXINFO *info );
- static void OnBtnLibraryClick( HWND hwndBtn );
- static HWND hwndTweak = NULL;
- static BOOL CALLBACK RatingTweak_OnApplyChanges( UINT fStyle, BOOL bClosing )
- {
- ratingGlobalStyle = fStyle;
- g_config->WriteInt( L"rating_style", ratingGlobalStyle );
- MLRatingColumnI_Update();
- if ( IsWindow( m_curview_hwnd ) )
- PostMessage( m_curview_hwnd, WM_DISPLAYCHANGE, 0, MAKELPARAM( 0, 0 ) );
- if ( bClosing )
- hwndTweak = NULL;
- return TRUE;
- }
- static void OnTimer_NavAutoScroll( HWND hwndDlg )
- {
- RECT rc;
- POINT pt;
- HWND hwndNav = NavCtrlI_GetHWND( hNavigation );
- INT command = 0;
- KillTimer( hwndDlg, TIMER_NAVAUTOSCROLL_ID );
- if ( !hwndNav || !IsWindowVisible( hwndNav ) )
- {
- m_nav_autoscroll = FALSE;
- return;
- }
- GetCursorPos( &pt );
- NavCtrlI_MapPointsFrom( hNavigation, HWND_DESKTOP, &pt, 1 );
- GetClientRect( hwndNav, &rc );
- if ( rc.left <= pt.x && rc.right >= pt.x )
- {
- if ( rc.top <= pt.y && pt.y < ( rc.top + 24 ) )
- command = 1;
- else if ( ( rc.bottom - 24 ) < pt.y && pt.y <= rc.bottom )
- command = 2;
- }
- if ( command )
- {
- SCROLLINFO si = { 0 };
- si.cbSize = sizeof( SCROLLINFO );
- si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE;
- if ( !GetScrollInfo( hwndNav, SB_VERT, &si ) )
- ZeroMemory( &si, sizeof( SCROLLINFO ) );
- if ( ( 1 == command && si.nMin == si.nPos ) || ( 2 == command && si.nMax < (INT)( si.nPos + si.nPage ) ) )
- command = 0;
- else
- {
- ImageList_DragShowNolock( FALSE );
- SendMessageW( hwndNav, WM_VSCROLL, MAKEWPARAM( ( 1 == command ) ? SB_LINEUP : SB_LINEDOWN, 0 ), NULL );
- NavCtrlI_Update( hNavigation );
- ImageList_DragShowNolock( TRUE );
- SetTimer( hwndDlg, TIMER_NAVAUTOSCROLL_ID, TIMER_NAVAUTOSCROLL_DELAY, NULL );
- }
- }
- if ( !command )
- m_nav_autoscroll = FALSE;
- }
- static void OnTimer_NavAutoExpand( HWND hwndDlg )
- {
- POINT pt;
- HWND hwndNav = NavCtrlI_GetHWND( hNavigation );
- HNAVITEM hItem;
- UINT hitFlags;
- KillTimer( hwndDlg, TIMER_NAVAUTOEXPAND_ID );
- if ( !hwndNav || !IsWindowVisible( hwndNav ) )
- return;
- GetCursorPos( &pt );
- NavCtrlI_MapPointsFrom( hNavigation, HWND_DESKTOP, &pt, 1 );
- hItem = NavCtrlI_HitTest( hNavigation, &pt, &hitFlags );
- if ( NAVHT_ONITEMBUTTON_I & hitFlags && hItem == m_nav_autoexpand_item )
- {
- ImageList_DragShowNolock( FALSE );
- NavCtrlI_SetInsertMark( hNavigation, NULL, FALSE );
- NavItemI_Expand( hItem, NAVITEM_EXPAND_I );
- NavCtrlI_Update( hNavigation );
- ImageList_DragShowNolock( TRUE );
- }
- m_nav_autoexpand_item = NULL;
- }
- static void OnTimer( HWND hwndDlg, UINT_PTR idTimer )
- {
- switch ( idTimer )
- {
- case TIMER_NAVAUTOSCROLL_ID: OnTimer_NavAutoScroll( hwndDlg ); break;
- case TIMER_NAVAUTOEXPAND_ID: OnTimer_NavAutoExpand( hwndDlg ); break;
- case TIMER_UNBLOCKACCELTOGGLE_ID:
- KillTimer( hwndDlg, idTimer );
- RemoveProp( hwndDlg, BLOCK_ACCELTOGGLE_PROP );
- break;
- }
- }
- static HMLIMGLST CreateNavigationImages( HMLIMGFLTRMNGR filterManager )
- {
- MLIMAGESOURCE_I is = { 0 };
- static INT resourceId[] = { IDB_TREEITEM_DEFAULT, IDB_TREEITEM_COLLAPSED, IDB_TREEITEM_EXPANDED, IDB_TREEITEM_NOCHILD };
- static INT_PTR imageTag[] = { MLTREEIMAGE_DEFAULT, MLTREEIMAGE_BRANCH_COLLAPSED, MLTREEIMAGE_BRANCH_EXPANDED, MLTREEIMAGE_BRANCH_NOCHILD };
- HMLIMGLST hmlil = MLImageListI_Create( 16, 16, 24, 30, 2, 3, filterManager );
- if ( !hmlil )
- return NULL;
- is.bpp = 24;
- is.hInst = plugin.hDllInstance;
- is.type = SRC_TYPE_BMP_I;
- is.flags = ISF_FORCE_BPP_I;
- for ( INT index = 0; index < sizeof( resourceId ) / sizeof( resourceId[ 0 ] ); index++ )
- {
- is.lpszName = MAKEINTRESOURCEW( resourceId[ index ] );
- MLImageListI_Add( hmlil, &is, MLIF_FILTER1_UID, imageTag[ index ] );
- }
- return hmlil;
- }
- static void OnMouseMove( HWND hwndDlg, POINT pt, UINT flags )
- {
- RECT rc;
- if ( !m_query_moving ) return;
- MapWindowPoints( hwndDlg, HWND_DESKTOP, &pt, 1 );
- GetWindowRect( hwndDlg, &rc );
- ImageList_DragMove( pt.x - rc.left, pt.y - rc.top );
- HWND hWndHit = WindowFromPoint( pt );
- if ( hWndHit == NavCtrlI_GetHWND( hNavigation ) )
- {
- POINT ptMy = pt;
- UINT hitFlags;
- HNAVITEM hItem;
- MapWindowPoints( HWND_DESKTOP, hWndHit, &ptMy, 1 );
- hItem = NavCtrlI_HitTest( hNavigation, &ptMy, &hitFlags );
- if ( !hItem )
- {
- HNAVITEM hItemLast;
- hItemLast = NavCtrlI_GetLastVisible( hNavigation );
- if ( hItemLast )
- {
- RECT ri;
- if ( NavItemI_GetRect( hItemLast, &ri, FALSE ) && ri.bottom < ptMy.y )
- {
- HNAVITEM hMovingParent, hLastParent;
- hMovingParent = NavItemI_GetParent( m_query_moving_item );
- while ( NULL != ( hLastParent = NavItemI_GetParent( hItemLast ) ) && hLastParent != hMovingParent ) hItemLast = hLastParent;
- if ( hMovingParent == hLastParent )
- {
- hItem = hItemLast;
- hitFlags = NAVHT_ONITEM_I;
- }
- }
- }
- }
- if ( ( NAVHT_ONITEMINDENT_I | NAVHT_ONITEMRIGHT_I | NAVHT_ONITEM_I | NAVHT_ONITEMBUTTON_I ) & hitFlags )
- {
- HNAVITEM tempItem;
- Navigation_DropHelper( hwndDlg, hWndHit, hItem, hitFlags, ptMy );
- if ( ML_TYPE_UNKNOWN == m_query_moving_type )
- {
- SetCursor( LoadCursor( NULL, IDC_NO ) );
- return;
- }
- tempItem = hItem;
- while ( tempItem && tempItem != m_query_moving_item ) tempItem = NavItemI_GetParent( tempItem );
- if ( tempItem == m_query_moving_item )
- hItem = m_query_moving_item;
- if ( hItem )
- {
- BOOL hitBelow;
- if ( NavItemI_GetParent( hItem ) != NavItemI_GetParent( m_query_moving_item ) )
- {
- // TODO: I think regular drag-n-drop goes here?
- //SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_NO)));
- CancelNavigationMove();
- m_query_moving_lastdest = NULL;
- mlDropItemStruct dropItem;
- ZeroMemory( &dropItem, sizeof( mlDropItemStruct ) );
- dropItem.p = pt;
- dropItem.type = m_query_moving_type;
- OnMediaLibraryIPC( hwndDlg, (WPARAM)&dropItem, ML_IPC_HANDLEDRAG );
- //handleDragDropMove(hwndDlg, m_query_moving_type, pt, 1);
- //goto outside_window;
- return;
- }
- if ( g_treedrag_lastSel )
- {
- NavItemI_SetState( g_treedrag_lastSel, 0, NIS_DROPHILITED_I );
- g_treedrag_lastSel = NULL;
- }
- NavItemI_GetRect( hItem, &rc, FALSE );
- hitBelow = ( ptMy.y > ( rc.bottom - ( rc.bottom - rc.top ) / 2 ) );
- SetCursor( LoadCursor( NULL, MAKEINTRESOURCE( IDC_ARROW ) ) );
- m_query_moving_lastdest = hItem;
- if ( m_query_moving_dragplace != hItem || m_query_moving_dragplaceisbelow != hitBelow )
- {
- m_query_moving_dragplace = hItem;
- m_query_moving_dragplaceisbelow = hitBelow;
- ImageList_DragShowNolock( FALSE );
- NavCtrlI_SetInsertMark( hNavigation, hItem, hitBelow );
- NavCtrlI_Update( hNavigation );
- ImageList_DragShowNolock( TRUE );
- }
- }
- }
- }
- else
- {
- int type = ML_TYPE_TREEITEM;
- bool canDrag;
- CancelNavigationMove();
- canDrag = ( m_query_moving_item &&
- ( plugin_SendMessage( ML_MSG_TREE_ONDRAG, NavItemI_GetId( m_query_moving_item ), (INT_PTR)&pt, (INT_PTR)&type ) < 0 ) );
- if ( !canDrag )
- {
- mlDropItemStruct dropItem;
- ZeroMemory( &dropItem, sizeof( mlDropItemStruct ) );
- dropItem.p = pt;
- dropItem.type = type;
- OnMediaLibraryIPC( hwndDlg, (WPARAM)&dropItem, ML_IPC_HANDLEDRAG );
- //pluginHandleIpcMessage(hwndDlg, ML_IPC_HANDLEDRAG, (WPARAM)&m);
- //SetCursor(dropItem.result > 0 ? hDragNDropCursor : LoadCursor(NULL, IDC_NO));
- //SetCursor(LoadCursor(NULL, IDC_NO));
- }
- m_query_moving_dragplace = NULL;
- m_query_moving_lastdest = NULL;
- }
- }
- static void OnLButtonUp( HWND hwndDlg, POINT pt, UINT flags )
- {
- HWND hwndHit;
- if ( !m_query_moving ) return;
- SetCursor( LoadCursor( NULL, MAKEINTRESOURCE( IDC_ARROW ) ) );
- ImageList_DragLeave( hwndDlg );
- ImageList_EndDrag();
- if ( m_nav_dragitem_imagelist )
- {
- ImageList_Destroy( m_nav_dragitem_imagelist );
- m_nav_dragitem_imagelist = NULL;
- }
- MapWindowPoints( hwndDlg, HWND_DESKTOP, &pt, 1 );
- hwndHit = WindowFromPoint( pt );
- if ( ML_TYPE_UNKNOWN != m_query_moving_type && hwndHit && m_query_moving_item )
- {
- if ( m_query_moving_dragplace )
- {
- //move item in the tree
- if ( ML_TYPE_TREEITEM == m_query_moving_type && m_query_moving_item != m_query_moving_lastdest )
- {
- WORD orderOld;
- orderOld = NavItemI_GetOrder( m_query_moving_item );
- if ( NavItemI_Move( m_query_moving_item, m_query_moving_lastdest, m_query_moving_dragplaceisbelow ) )
- {
- plugin_SendMessage( ML_MSG_NAVIGATION_ONMOVE, (INT_PTR)m_query_moving_item, orderOld, NavItemI_GetOrder( m_query_moving_item ) );
- }
- }
- else
- {
- HNAVITEM whereinsert;
- whereinsert = m_query_moving_lastdest;
- if ( !m_query_moving_dragplaceisbelow )
- {
- BOOL fTest;
- fTest = ( whereinsert == m_query_moving_item );
- whereinsert = NavItemI_GetPrevious( whereinsert );
- if ( !whereinsert && !fTest )
- whereinsert = NavItemI_GetParent( m_query_moving_lastdest );
- }
- if ( whereinsert && m_query_moving_item != whereinsert )
- plugin_SendMessage( ML_MSG_TREE_ONDROP, NavItemI_GetId( m_query_moving_item ), (INT_PTR)&pt, NavItemI_GetId( whereinsert ) );
- }
- }
- else
- plugin_SendMessage( ML_MSG_TREE_ONDROP, NavItemI_GetId( m_query_moving_item ), (INT_PTR)&pt, 0 );
- }
- m_query_moving = 0;
- if ( g_treedrag_lastSel )
- {
- NavItemI_SetState( g_treedrag_lastSel, 0, NIS_DROPHILITED_I );
- g_treedrag_lastSel = NULL;
- }
- if ( m_query_moving_dragplace )
- CancelNavigationMove();
- ReleaseCapture();
- }
- void listbuild( wchar_t **buf, int &buf_size, int &buf_pos, const wchar_t *tbuf )
- {
- if ( !*buf )
- {
- *buf = (wchar_t *)calloc( 4096, sizeof( wchar_t ) );
- if ( *buf )
- {
- buf_size = 4096;
- buf_pos = 0;
- }
- else
- {
- buf_size = buf_pos = 0;
- }
- }
- int newsize = buf_pos + lstrlenW( tbuf ) + 1;
- if ( newsize < buf_size )
- {
- size_t old_buf_size = buf_size;
- buf_size = newsize + 4096;
- wchar_t *data = (wchar_t *)realloc( *buf, ( buf_size + 1 ) * sizeof( wchar_t ) );
- if ( data )
- {
- *buf = data;
- }
- else
- {
- data = (wchar_t *)malloc( ( buf_size + 1 ) * sizeof( wchar_t ) );
- if ( data )
- {
- memcpy( data, *buf, sizeof( wchar_t ) * old_buf_size );
- free( *buf );
- *buf = data;
- }
- else
- buf_size = old_buf_size;
- }
- }
- StringCchCopyW( *buf + buf_pos, buf_size, tbuf );
- buf_pos = newsize;
- }
- /*wchar_t * getSelectedList()
- {
- wchar_t* path=NULL;
- int buf_pos=0, buf_size=0;
- int download=-1;
- while (GetDownload(download))
- {
- if(listContents[download]->f)
- listbuild(&path,buf_size,buf_pos,listContents[download]->f->path);
- }
- if(path) path[buf_pos] = 0;
- return path;
- }*/
- static void OnDragDrop( HWND hwndDlg, HDROP hdrop )
- {
- UINT hitFlags = NAVHT_NOWHERE_I;
- POINT pt = { 0 };
- DragQueryPoint( hdrop, &pt );
- HNAVITEM hItemHit = NavCtrlI_HitTest( hNavigation, &pt, &hitFlags );
- if ( hItemHit )
- {
- if ( plugin_SendMessage( ML_MSG_TREE_ONDROPTARGET, NavItemI_GetId( hItemHit ), ML_TYPE_FILENAMESW, NULL ) > 0 )
- {
- wchar_t temp[ MAX_PATH ] = { 0 };
- int y = DragQueryFileW( hdrop, 0xffffffff, temp, 1024 );
- if ( y > 0 )
- {
- wchar_t *paths = NULL;
- int buf_pos = 0, buf_size = 0;
- for ( int x = 0; x < y; x++ )
- {
- if ( DragQueryFileW( hdrop, x, temp, MAX_PATH ) )
- {
- listbuild( &paths, buf_size, buf_pos, temp );
- }
- }
- if ( paths )
- {
- paths[ buf_pos ] = 0;
- plugin_SendMessage( ML_MSG_TREE_ONDROPTARGET, NavItemI_GetId( hItemHit ), ML_TYPE_FILENAMESW, (INT_PTR)paths );
- if ( IsWindow( m_curview_hwnd ) )
- SendMessage( m_curview_hwnd, WM_APP + 1, 0, 0 ); //update current view
- free( paths );
- }
- }
- DragFinish( hdrop );
- }
- }
- }
- static void MlView_ShowWindow( HWND hwnd, BOOL fShow, UINT nStatus )
- {
- if ( SW_PARENTOPENING == nStatus )
- {
- BOOL fStored = ( 0 != g_config->ReadInt( L"visible", 1 ) );
- if ( fShow != fStored )
- {
- PostMessageW( hwnd, WMML_SHOWCONTAINER, ( 0 == fStored ) ? SW_HIDE : SW_SHOWNA, 0 );
- return;
- }
- }
- ShowWindow( hwnd, ( FALSE != fShow ) ? SW_SHOWNA : SW_HIDE );
- if ( 0 == nStatus )
- {
- if ( NULL != g_config )
- g_config->WriteInt( L"visible", ( FALSE != fShow ) );
- UINT menuFlags = ( FALSE != fShow ) ? MF_CHECKED : MF_UNCHECKED;
- menuFlags |= MF_BYCOMMAND;
- INT szMenu[] = { 0, 4, };
- for ( INT i = 0; i < ARRAYSIZE( szMenu ); i++ )
- {
- HMENU hMenu = (HMENU)SendMessage( plugin.hwndParent, WM_WA_IPC, szMenu[ i ], IPC_GET_HMENU );
- if ( NULL != hMenu )
- CheckMenuItem( hMenu, WA_MENUITEM_ID, menuFlags );
- }
- MLVisibleChanged( FALSE != fShow );
- if ( FALSE != fShow )
- {
- SendMessageW( g_ownerwnd, 0x0127/*WM_CHANGEUISTATE*/, MAKEWPARAM( 1/*UIS_SET*/, 3/*(UISF_HIDEACCEL | UISF_HIDEFOCUS)*/ ), 0L );
- HWND hRoot = GetAncestor( g_ownerwnd, GA_ROOT );
- if ( NULL != hRoot )
- SetForegroundWindow( hRoot );
- }
- }
- }
- static LRESULT MlView_OnContainerNotify( HWND hwnd, NMHDR *pnmh )
- {
- switch ( pnmh->code )
- {
- case EWN_SHOWWINDOW:
- MlView_ShowWindow( hwnd, ( (EMBEDSHOW *)pnmh )->fShow, ( (EMBEDSHOW *)pnmh )->nStatus );
- break;
- }
- return 0;
- }
- static LRESULT MlView_OnNotify( HWND hwnd, INT controlId, NMHDR *pnmh )
- {
- if ( pnmh->hwndFrom == g_ownerwnd )
- {
- return MlView_OnContainerNotify( hwnd, pnmh );
- }
- return 0;
- }
- static LRESULT MlView_OnContextMenu( HWND hwnd, HWND hOwner, POINTS pts )
- {
- HWND hNav = NavCtrlI_GetHWND( hNavigation );
- if ( NULL != hNav && hOwner == hNav )
- {
- HNAVITEM hItem;
- POINT pt;
- POINTSTOPOINT( pt, pts );
- if ( -1 == pt.x || -1 == pt.y )
- {
- hItem = NavCtrlI_GetSelection( hNavigation );
- if ( NULL != hItem )
- {
- RECT itemRect;
- if ( NavItemI_GetRect( hItem, &itemRect, FALSE ) )
- {
- pt.x = itemRect.left + 1;
- pt.y = itemRect.top + 1;
- MapWindowPoints( hNav, HWND_DESKTOP, &pt, 1 );
- }
- }
- }
- else
- {
- UINT hitFlags;
- MapWindowPoints( HWND_DESKTOP, hNav, &pt, 1 );
- hItem = NavCtrlI_HitTest( hNavigation, &pt, &hitFlags );
- pt.x = pts.x;
- pt.y = pts.y;
- }
- if ( NULL == hItem ) return 0;
- UINT itemState = NavItemI_GetState( hItem, NIS_DROPHILITED_I | NIS_SELECTED_I );
- if ( 0 == ( ( NIS_DROPHILITED_I | NIS_SELECTED_I ) & itemState ) )
- NavItemI_SetState( hItem, NIS_DROPHILITED_I, NIS_DROPHILITED_I );
- INT_PTR result = plugin_SendMessage( ML_MSG_NAVIGATION_CONTEXTMENU,
- (INT_PTR)hItem,
- (INT_PTR)hNav,
- MAKELONG( pt.x, pt.y ) );
- if ( 0 == ( ( NIS_DROPHILITED_I | NIS_SELECTED_I ) & itemState ) )
- NavItemI_SetState( hItem, 0, NIS_DROPHILITED_I );
- return ( 0 != result );
- }
- return 0;
- }
- static BOOL
- MlView_OnHelp( HWND hwnd, HELPINFO *helpInfo )
- {
- // TODO review this for handling Shift+F1 as view specific help?
- // make sure we're only doing it for the expect help actions
- // i.e. not Ctrl+F1 which opens the global about dialog
- if ( ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) )
- return FALSE;
- // for view specific handling, we use Shift+F1
- if ( NULL != helpInfo && HELPINFO_WINDOW == helpInfo->iContextType && ( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ) )
- {
- HWND navigationWindow;
- navigationWindow = NavCtrlI_GetHWND( hNavigation );
- if ( navigationWindow == helpInfo->hItemHandle )
- {
- HNAVITEM selectedItem;
- selectedItem = NavCtrlI_GetSelection( hNavigation );
- if ( NULL != selectedItem && 0 != plugin_SendMessage( ML_MSG_NAVIGATION_HELP, (INT_PTR)selectedItem, (INT_PTR)navigationWindow, MAKELONG( helpInfo->MousePos.x, helpInfo->MousePos.y ) ) )
- {
- return TRUE;
- }
- return TRUE;
- }
- }
- // otherwise we treat it as a generic help request
- return MediaLibrary_OpenHelpUrl( MEDIALIBRARY_HELP_URL );
- }
- INT_PTR CALLBACK dialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
- {
- switch ( uMsg )
- {
- case WM_MOUSEMOVE:
- case WM_LBUTTONUP:
- {
- POINT pt = { GET_X_LPARAM( lParam ),GET_Y_LPARAM( lParam ) };
- if ( WM_MOUSEMOVE == uMsg )
- OnMouseMove( hwndDlg, pt, (UINT)wParam );
- else if ( WM_LBUTTONUP == uMsg )
- OnLButtonUp( hwndDlg, pt, (UINT)wParam );
- }
- return TRUE;
- case WM_COMMAND:
- switch ( LOWORD( wParam ) )
- {
- case IDC_BTN_LIB: if ( BN_CLICKED == HIWORD( wParam ) ) OnBtnLibraryClick( (HWND)lParam ); break;
- case IDM_LIBRARY_CONFIG: OpenMediaLibraryPreferences(); break;
- case IDM_LIBRARY_HELP: MediaLibrary_OpenHelpUrl( MEDIALIBRARY_HELP_URL ); break;
- case ID_TOGGLE_LIBRARY:
- if ( 0 == GetProp( hwndDlg, BLOCK_ACCELTOGGLE_PROP ) )
- {
- toggleVisible( 0 );
- SetProp( hwndDlg, BLOCK_ACCELTOGGLE_PROP, (HANDLE)(INT_PTR)1 );
- SetTimer( hwndDlg, TIMER_UNBLOCKACCELTOGGLE_ID, TIMER_UNBLOCKACCELTOGGLE_DELAY, NULL );
- }
- break;
- case ID_WINDOW_CLOSE:
- if ( IsVisible() )
- toggleVisible( 0 );
- break;
- case ID_SHOW_RATINGTWEAK:
- if ( !IsWindow( hwndTweak ) )
- hwndTweak = MLRatingColumnI_TweakDialog( hwndDlg, ratingGlobalStyle, RatingTweak_OnApplyChanges, TRUE );
- else SetWindowPos( hwndTweak, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW );
- break;
- case ID_GO_TO_VIEW_SEARCHBAR:
- SendMessage( m_curview_hwnd, WM_ML_CHILDIPC, 0, ML_CHILDIPC_GO_TO_SEARCHBAR );
- break;
- case ID_REFRESH_SEARCH:
- SendMessage( m_curview_hwnd, WM_ML_CHILDIPC, 0, ML_CHILDIPC_REFRESH_SEARCH );
- break;
- case ID_NEW_PLAYLIST:
- {
- // only process if not in an edit control
- // (as shift+insert is a legacy OS paste shortcut)
- wchar_t szClass[ 32 ] = { 0 };
- HWND hFocus = GetFocus();
- if ( GetClassNameW( hFocus, szClass, sizeof( szClass ) / sizeof( szClass[ 0 ] ) ) &&
- CSTR_EQUAL != CompareStringW( CSTR_INVARIANT, NORM_IGNORECASE, szClass, -1, WC_EDITW, -1 ) )
- {
- #define ID_MLFILE_NEWPLAYLIST 40359
- SendMessageW( plugin.hwndParent, WM_COMMAND, MAKEWPARAM( ID_MLFILE_NEWPLAYLIST, 0 ), 0 );
- }
- else SendMessageW( hFocus, WM_PASTE, 0, 0L );
- }
- break;
- case ID_SHOW_HELP:
- // do nothing, just need to still F1 from Winamp
- break;
- }
- break;
- case WM_NOTIFY:
- {
- LRESULT result;
- result = 0;
- if ( !NavCtrlI_ProcessNotifications( hNavigation, (LPNMHDR)lParam, &result ) )
- result = MlView_OnNotify( hwndDlg, (INT)wParam, (NMHDR *)lParam );
- SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, (LONGX86)(LONG_PTR)result );
- return TRUE;
- }
- case WM_CAPTURECHANGED:
- {
- POINT pt = { MAXLONG,MAXLONG };
- OnLButtonUp( hwndDlg, pt, 0 );
- break;
- }
- case WM_DROPFILES: OnDragDrop( hwndDlg, (HDROP)wParam ); break;
- case WM_INITMENUPOPUP: OnInitMenuPopUp( (HMENU)wParam ); return TRUE;
- case WM_DISPLAYCHANGE: OnDisplayChange( hwndDlg, (UINT)wParam, LOWORD( lParam ), HIWORD( lParam ) ); return TRUE;
- case WM_INITDIALOG: return OnInitDialog( hwndDlg );
- case WM_DESTROY: OnDestroy( hwndDlg ); break;
- case WM_WINDOWPOSCHANGED: OnWindowPosChanged( hwndDlg, (WINDOWPOS *)lParam ); return TRUE;
- case WM_CLOSE: OnClose( hwndDlg ); break;
- case WM_GETMINMAXINFO: OnGetMaxMinInfo( (LPMINMAXINFO)lParam ); return TRUE;
- case WM_TIMER: OnTimer( hwndDlg, (UINT_PTR)wParam ); return TRUE;
- case WM_ML_IPC:
- return OnMediaLibraryIPC( hwndDlg, wParam, lParam );
- case WM_USER + 0x200: SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, TRUE ); return TRUE;
- case WM_USER + 0x201: g_rgnUpdate = (HRGN)lParam; return TRUE;// parent supports region updates. lParam is a HRGN to set HRGN coordinate mapped to parent client area (this message sent prior to WM_WINDOWPOSCHANGED.
- case WM_SHOWWINDOW:
- {
- if ( wParam ) PostMessage( hwndDlg, WM_USER + 31, wParam, 0 );
- else OnShowWindow( hwndDlg, (BOOL)wParam );
- return TRUE;
- }
- case WM_USER + 30:
- {
- SetWindowRedraw( hwndDlg, FALSE );
- DestroyWindow( m_curview_hwnd );
- SetWindowRedraw( hwndDlg, TRUE );
- CreateCurrentView( hwndDlg );
- break;
- }
- case WM_USER + 31:
- // double-pump this to work around slower plugins loading up
- if ( !lParam )
- PostMessage( hwndDlg, WM_USER + 31, wParam, 1 );
- else
- {
- OnShowWindow( hwndDlg, (BOOL)wParam );
- NavItemI_EnsureVisible( NavCtrlI_GetSelection( hNavigation ) );
- }
- break;
- case WM_CONTEXTMENU: MSGRESULT( hwndDlg, MlView_OnContextMenu( hwndDlg, (HWND)wParam, MAKEPOINTS( lParam ) ) );
- case WM_HELP: MSGRESULT( hwndDlg, MlView_OnHelp( hwndDlg, (HELPINFO *)lParam ) );
- case WMML_SHOWCONTAINER: ShowWindow( g_ownerwnd, (INT)wParam ); return TRUE;
- }
- return FALSE;
- }
- void OnInitMenuPopUp( HMENU menu )
- {
- if ( main_sendtomenu || !main_sendto_hmenu || menu != main_sendto_hmenu )
- return;
- main_sendtomenu = new SendToMenu();
- main_sendtomenu->buildmenu( menu, main_sendto_mode, 0 );
- }
- void OnDisplayChange( HWND hwndDlg, UINT imgDepth, UINT hRes, UINT vRes )
- {
- ResetColors( TRUE ); // must be first
- MlStockObjects_Reset();
- ratingGlobalStyle = g_config->ReadInt( L"rating_style", RATING_DEFAULT_STYLE );
- MLRatingColumnI_Update();
- if ( IsWindow( m_curview_hwnd ) )
- {
- RECT rc;
- GetClientRect( m_curview_hwnd, &rc );
- RedrawWindow( m_curview_hwnd, &rc, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW/* | RDW_UPDATENOW*/ );
- MLSkinnedWnd_SkinChanged( m_curview_hwnd, TRUE, TRUE );
- SendNotifyMessageW( m_curview_hwnd, WM_DISPLAYCHANGE, imgDepth, MAKELPARAM( hRes, vRes ) );
- }
- NavCtrlI_UpdateLook( hNavigation );
- MLSkinnedWnd_SkinChanged( GetDlgItem( hwndDlg, IDC_BTN_LIB ), TRUE, TRUE );
- MLSkinnedWnd_SkinChanged( GetDlgItem( hwndDlg, IDC_VDELIM ), TRUE, TRUE );
- MLSkinnedWnd_SkinChanged( GetDlgItem( hwndDlg, IDC_NO_VIEW ), TRUE, TRUE );
- LayoutWindows( hwndDlg, divider_pos, TRUE );
- }
- #include "mldwm.h"
- int OnInitDialog( HWND hwndDlg )
- {
- firstShow = TRUE;
- MlStockObjects_Init();
- if ( S_OK == MlDwm_LoadLibrary() )
- {
- DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED;
- BOOL allow = FALSE;
- MlDwm_SetWindowAttribute( GetParent( hwndDlg ), DWMWA_NCRENDERING_POLICY, &ncrp, sizeof( ncrp ) );
- MlDwm_SetWindowAttribute( GetParent( hwndDlg ), DWMWA_ALLOW_NCPAINT, &allow, sizeof( allow ) );
- }
- MLSkinWindow2( hwndDlg, hwndDlg, SKINNEDWND_TYPE_DIALOG, SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS );
- HWND hctrl = GetDlgItem( hwndDlg, IDC_BTN_LIB );
- MLSkinWindow2( hwndDlg, hctrl, SKINNEDWND_TYPE_BUTTON, SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS );
- hctrl = GetDlgItem( hwndDlg, IDC_VDELIM );
- MLSkinWindow2( hwndDlg, hctrl, SKINNEDWND_TYPE_DIVIDER, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWDIV_VERT );
- MLSkinnedDivider_SetCallback( hctrl, OnDividerMoved, NULL );
- hctrl = GetDlgItem( hwndDlg, IDC_NO_VIEW );
- MLSkinWindow2( hwndDlg, hctrl, SKINNEDWND_TYPE_STATIC, SWS_USESKINCOLORS | SWS_USESKINCURSORS | SWDIV_VERT );
- if ( !hmlifMngr ) // Initialize Image Filter manager
- {
- hmlifMngr = MLImageFilterI_CreateManager( 8, 4 );
- if ( hmlifMngr )
- {
- RegisterImageFilters( hmlifMngr );
- SkinnedButton::RegisterImageFilter( hmlifMngr );
- }
- }
- if ( !hNavigation )
- {
- hNavigation = NavCtrlI_Create( hwndDlg );
- if ( hNavigation )
- {
- if ( !hmlilNavigation ) hmlilNavigation = CreateNavigationImages( hmlifMngr );
- NavCtrlI_SetConfig( hNavigation, g_config );
- NavCtrlI_SetImageList( hNavigation, hmlilNavigation );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_Selected, CALLBACK_ONSELECTED_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_Click, CALLBACK_ONCLICK_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_KeyDown, CALLBACK_ONKEYDOWN_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_BeginDrag, CALLBACK_ONBEGINDRAG_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_GetImageIndex, CALLBACK_ONGETIMAGEINDEX_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_BeginTitleEdit, CALLBACK_ONBEGINTITLEEDIT_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_EndTitleEdit, CALLBACK_ONENDTITLEEDIT_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavItem_Delete, CALLBACK_ONITEMDELETE_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavItem_CustomDraw, CALLBACK_ONITEMDRAW_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavItem_SetCursor, CALLBACK_ONSETCURSOR_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavItem_HitTest, CALLBACK_ONHITTEST_I );
- NavCtrlI_RegisterCallback( hNavigation, OnNavCtrl_Destroy, CALLBACK_ONDESTROY_I );
- hctrl = NavCtrlI_GetHWND( hNavigation );
- SetWindowLongPtr( hctrl, GWLP_ID, IDC_NAVIGATION );
- SetWindowLongPtr( hctrl, GWL_STYLE, GetWindowLongPtr( hctrl, GWL_STYLE ) | WS_GROUP );
- }
- }
- if ( hNavigation )
- SetWindowPos( GetDlgItem( hwndDlg, IDC_BTN_LIB ), NavCtrlI_GetHWND( hNavigation ), 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );
- divider_pos = g_config->ReadInt( L"ldivpos", 135 );
- if ( !hmlilRating )
- {
- hmlilRating = MLImageListI_Create( 44, 12, MLILC_COLOR24_I, 1, 1, 4, hmlifMngr );
- if ( hmlilRating )
- {
- MLIMAGESOURCE_I is = { 0 };
- is.hInst = plugin.hDllInstance;
- is.lpszName = MAKEINTRESOURCEW( IDB_RATING );
- is.type = SRC_TYPE_PNG_I;
- MLImageListI_Add( hmlilRating, &is, MLIF_FILTER1_UID, 0 );
- }
- }
- ratingGlobalStyle = g_config->ReadInt( L"rating_style", RATING_DEFAULT_STYLE );
- MLRatingColumnI_Initialize();
- #ifdef CLOUD
- if ( !hmlilCloud )
- {
- hmlilCloud = MLImageListI_Create( 16, 16, MLILC_COLOR24_I, 1, 1, 4, hmlifMngr );
- if ( hmlilCloud )
- {
- MLIMAGESOURCE_I is = { 0 };
- is.hInst = plugin.hDllInstance;
- is.lpszName = MAKEINTRESOURCEW( IDB_CLOUD_IS_IN );
- is.type = SRC_TYPE_PNG_I;
- MLImageListI_Add( hmlilCloud, &is, MLIF_FILTER1_UID, 0 );
- is.lpszName = MAKEINTRESOURCEW( IDB_CLOUD_PARTIAL );
- MLImageListI_Add( hmlilCloud, &is, MLIF_FILTER1_UID, 0 );
- is.lpszName = MAKEINTRESOURCEW( IDB_CLOUD_UNAVAIL );
- MLImageListI_Add( hmlilCloud, &is, MLIF_FILTER1_UID, 0 );
- is.lpszName = MAKEINTRESOURCEW( IDB_CLOUD_UPLOAD );
- MLImageListI_Add( hmlilCloud, &is, MLIF_FILTER1_UID, 0 );
- is.lpszName = MAKEINTRESOURCEW( IDB_CLOUD_UPLOADING );
- MLImageListI_Add( hmlilCloud, &is, MLIF_FILTER1_UID, 0 );
- }
- }
- MLCloudColumnI_Initialize();
- #endif
- OnDisplayChange( hwndDlg, 0, 0, 0 );
- HACCEL hAccel = WASABI_API_LOADACCELERATORSW( IDR_ACCELERATOR_GLOBAL );
- if ( hAccel )
- WASABI_API_APP->app_addAccelerators( hwndDlg, &hAccel, 1, TRANSLATE_MODE_GLOBAL );
- hAccel = WASABI_API_LOADACCELERATORSW( IDR_ACCELERATOR_MAIN );
- if ( hAccel )
- WASABI_API_APP->app_addAccelerators( hwndDlg, &hAccel, 1, TRANSLATE_MODE_CHILD );
- return TRUE;
- }
- static void OnDestroy( HWND hwndDlg )
- {
- HNAVITEM hItem = NavCtrlI_GetSelection( hNavigation );
- if ( hItem )
- {
- wchar_t name[ 1024 ] = { 0 };
- if ( NavItemI_GetFullName( hItem, name, 1024 ) )
- g_config->WriteString( "last_view", AutoChar( name, CP_UTF8 ) );
- }
- g_config->WriteInt( L"ldivpos", divider_pos );
- NavCtrlI_Destroy( hNavigation );
- hNavigation = NULL;
- MLImageListI_Destroy( hmlilNavigation );
- hmlilNavigation = NULL;
- MLImageFilterI_DestroyManager( hmlifMngr );
- hmlifMngr = NULL;
- MLImageListI_Destroy( hmlilRating );
- hmlilRating = NULL;
- MLImageListI_Destroy( hmlilCloud );
- hmlilCloud = NULL;
- RemoveProp( hwndDlg, BLOCK_ACCELTOGGLE_PROP );
- MlStockObjects_Free();
- }
- static void OnClose( HWND hwndDlg )
- {
- toggleVisible( 1 );
- }
- static void OnShowWindow( HWND hwndDlg, BOOL fShow )
- {
- if ( firstShow && fShow )
- {
- firstShow = FALSE;
- MLVisibleChanged( TRUE );
- // setting things to a more user friendly default than just the Local Media view
- char *lastTitleA = g_config->ReadString( "last_view", "Local Media/Audio" );
- HNAVITEM hDefItem = NULL;
- if ( lastTitleA && *lastTitleA )
- {
- wchar_t textW[ 2048 ] = { 0 };
- if ( MultiByteToWideCharSZ( CP_UTF8, 0, lastTitleA, -1, textW, 2048 ) )
- hDefItem = NavCtrlI_FindItemByFullName( hNavigation, LOCALE_INVARIANT, NICF_INVARIANT_I | NICF_DISPLAY_I | NICF_IGNORECASE_I, textW, -1, TRUE );
- }
- if ( !hDefItem )
- hDefItem = NavCtrlI_GetRoot( hNavigation );
- NavItemI_Select( hDefItem );
- NavCtrlI_Show( hNavigation, SW_SHOWNA );
- }
- }
- LRESULT OnMediaLibraryIPC( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
- {
- SetWindowLongPtr( hwndDlg, DWLP_MSGRESULT, (LONGX86)(LONG_PTR)pluginHandleIpcMessage( hwndDlg, (INT)lParam, (INT_PTR)wParam ) );
- return TRUE;
- }
- void OnGetMaxMinInfo( MINMAXINFO *info )
- {
- info->ptMinTrackSize.x = 300;
- info->ptMinTrackSize.y = 200;
- }
- void OnBtnLibraryClick( HWND hwndBtn )
- {
- RECT r;
- GetWindowRect( hwndBtn, &r );
- SendMessageW( hwndBtn, BM_SETSTATE, TRUE, 0L );
- MediaLibrary_TrackPopup( GetSubMenu( g_context_menus, 0 ),
- TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_BOTTOMALIGN | TPM_LEFTALIGN | TPM_VERNEGANIMATION,
- r.left, r.top,
- GetParent( hwndBtn ) );
- SendMessageW( hwndBtn, BM_SETSTATE, FALSE, 0L );
- UpdateWindow( hwndBtn );
- Sleep( 100 );
- MSG msg;
- while ( PeekMessageW( &msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) ); //eat return
- }
|