reman3/Rayman_X/cpa/Appli/WinS2B/List.cpp

291 lines
7.3 KiB
C++

//¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
// FILE : List.cpp
// AUTHOR : Catalin Cocos
//__________________________________________________________________________________________________
#include "stdinc.h"
#include "app.h"
#include "list.h"
#include "resource.h"
WNDPROC ListIWP;
WNDPROC OutIWP;
WNDPROC FilterIWP;
CTip* pListTip;
void SetFilterItemState( int idx )
{
if( idx<0) return;
char Ext[_MAX_EXT];
LV_ITEM GotItem = { LVIF_TEXT, idx, 0, 0, 0, Ext, _MAX_EXT };
LV_ITEM testItem = { LVIF_STATE, idx, 0, 0, ~LVIS_FOCUSED };
ListView_GetItem( hWFilter, &testItem);
if(testItem.state & LSTATE_LOCKED)
return;
testItem.state ^= (LSTATE_UNCHECKED|LSTATE_CHECKED);
BOOL Enabled = testItem.state & LSTATE_CHECKED;
if(testItem.state & LVIS_SELECTED)
{
int maxCnt = ListView_GetSelectedCount( hWFilter );
int i = 0;
for( testItem.iItem = -1; i<maxCnt; i++ )
{
GotItem.iItem = testItem.iItem = ListView_GetNextItem( hWFilter, testItem.iItem, LVNI_SELECTED );
ListView_SetItem( hWFilter, &testItem);
ListView_GetItem( hWFilter, &GotItem);
CnvEng.EnableExtension( Ext, Enabled );
}
}
else
{
ListView_SetItem( hWFilter, &testItem);
ListView_GetItem( hWFilter, &GotItem);
CnvEng.EnableExtension( Ext, Enabled );
}
}
LRESULT CALLBACK FilterWndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
switch(msg)
{
case WM_SETFOCUS: nFocusWnd = FOCUS_FILTER; break;
case WM_COMMAND:
switch(LOWORD(wp))
{
case ID_SELECT_TOGGLE:
SetFilterItemState( ListView_GetNextItem( hwnd, -1, LVNI_FOCUSED ) );
return 0;
case ID_SELECT_ALL:
{
LV_ITEM testItem = { LVIF_STATE, 0, 0, LVIS_SELECTED, LVIS_SELECTED };
for(testItem.iItem = ListView_GetItemCount( hwnd )-1; testItem.iItem>=0; testItem.iItem--)
ListView_SetItem( hwnd, &testItem);
return 0;
}
}
break;
case WM_LBUTTONDOWN:
{
LV_HITTESTINFO ht = {{ LOWORD(lp), HIWORD(lp)}};
ListView_HitTest( hwnd, &ht);
if(ht.iItem >=0 && ht.flags == LVHT_ONITEMSTATEICON)
{
SetFocus( hwnd );
SetFilterItemState( ht.iItem );
return 0;
}
}
break;
}
return CallWindowProc( (int(CALLBACK*)())FilterIWP, hwnd, msg, wp, lp);
}
LRESULT CALLBACK OutWndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
switch(msg)
{
case WM_SETFOCUS:
nFocusWnd = FOCUS_OUT; break;
}
return CallWindowProc( (int(CALLBACK*)())OutIWP, hwnd, msg, wp, lp);
}
void SetListItemState( int idx );
LRESULT CALLBACK ListWndProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
{
static int CrtItem = -1;
static BOOL bHelp = FALSE;
static BOOL bReady = TRUE;
switch(msg)
{
case WM_USER+10:
ShowItemPath( hwnd, wp);
bReady = FALSE;
break;
case WM_SETFOCUS: nFocusWnd = FOCUS_LIST; break;
case WM_COMMAND:
switch(LOWORD(wp))
{
case ID_DELETE:
{
int maxCnt = ListView_GetSelectedCount( hwnd );
for( int i = 0, j = -1; i<maxCnt; i++, j-- )
DeleteListItem(j = ListView_GetNextItem( hwnd, j, LVNI_SELECTED ));
if(maxCnt)
{
i = (j==ListView_GetItemCount( hwnd )-1?j:j+1);
if(i>=0)
{
ListView_SetItemState(hwnd, i, LVIS_SELECTED, LVIS_SELECTED );
}
else CrtItem = -1;
PostMessage( hwnd, WM_USER+10, i, 0);
}
}
return 0;
case ID_SELECT_TOGGLE:
SetListItemState( ListView_GetNextItem( hwnd, -1, LVNI_FOCUSED ));
return 0;
case ID_SELECT_ALL:
{
LV_ITEM testItem = { LVIF_STATE, 0, 0, LVIS_SELECTED, LVIS_SELECTED };
for(testItem.iItem = ListView_GetItemCount( hwnd )-1; testItem.iItem>=0; testItem.iItem--)
ListView_SetItem( hwnd, &testItem);
return 0;
}
}
break;
case WM_MOUSEMOVE:
{
LV_HITTESTINFO ht = {{ LOWORD(lp), HIWORD(lp)}};
ListView_HitTest( hwnd, &ht);
if(ht.iItem >=0 )
{
if(ht.iItem != CrtItem && ht.flags == LVHT_ONITEMLABEL)
{
ShowItemPath( hwnd, ht.iItem);
CrtItem = ht.iItem;
}
}
else if(bReady && ht.flags &(LVHT_ABOVE|LVHT_BELOW|LVHT_TORIGHT|LVHT_TOLEFT))
{
CrtItem = -1;
pListTip->Show( NULL, hwnd );
}
bReady = TRUE;
}
break;
case WM_KILLFOCUS:
case WM_RBUTTONUP:
pListTip->Show( NULL, hwnd );
CrtItem = -1;
bHelp = FALSE;
break;
case WM_RBUTTONDOWN:
{
LV_HITTESTINFO ht = {{ LOWORD(lp), HIWORD(lp)}};
ListView_HitTest( hwnd, &ht);
if(ht.iItem >=0 && ht.flags == LVHT_ONITEMSTATEICON)
{
POINT p = { LOWORD(lp)-1, HIWORD(lp)-1};
ClientToScreen( hwnd, &p);
pListTip->Show( "Press this button to toggle the file activation", hwnd);//, &p );
bHelp = TRUE;
}
}
break;
case WM_LBUTTONDOWN:
{
LV_HITTESTINFO ht = {{ LOWORD(lp), HIWORD(lp)}};
ListView_HitTest( hwnd, &ht);
if(ht.iItem >=0 && ht.flags == LVHT_ONITEMSTATEICON)
{
SetFocus( hwnd );
SetListItemState( ht.iItem );
return 0;
}
}
break;
case WM_DROPFILES:
{
char buffer[_MAX_PATH +1] = "";
int files = DragQueryFile((HDROP)wp,0xffffffff,buffer,_MAX_PATH);
for(int i = 0; i<files; i++)
{
DragQueryFile((HDROP)wp,i,buffer,_MAX_PATH);
InsertCollectionFile(hwnd, buffer);
}
SetFocus(hwnd);
}
DragFinish((HDROP)wp);
break;
case WM_DESTROY: DeleteCollectionList(); break;
}
return CallWindowProc( (int(CALLBACK*)())ListIWP, hwnd, msg, wp, lp);
}
void SetListItemState( int idx )
{
if( idx<0) return;
LV_ITEM testItem = { LVIF_STATE, idx, 0, 0, ~LVIS_FOCUSED };
ListView_GetItem( hWList, &testItem);
testItem.state ^= (LSTATE_UNCHECKED|LSTATE_CHECKED);
if(testItem.state & LVIS_SELECTED)
{
int maxCnt = ListView_GetSelectedCount( hWList );
int i = 0;
for( testItem.iItem = -1; i<maxCnt; i++ )
{
testItem.iItem = ListView_GetNextItem( hWList, testItem.iItem, LVNI_SELECTED );
ListView_SetItem( hWList, &testItem);
}
}
else ListView_SetItem( hWList, &testItem);
}
void DeleteCollectionList()
{
int maxCnt = ListView_GetItemCount( hWList );
for( int i = maxCnt-1 ; i>=0; i-- )
DeleteListItem( i );
}
void DeleteListItem(int idx)
{
LV_ITEM it = {LVIF_PARAM, idx, 0};
ListView_GetItem( hWList, &it);
delete[] (char*)it.lParam;
ListView_DeleteItem( hWList, idx);
}
void ShowItemPath( HWND hwnd, int iItem)
{
if(iItem>=0)
{
LV_ITEM testItem = { LVIF_PARAM, iItem, 0 };
ListView_GetItem( hwnd, &testItem);
char buffer[_MAX_FNAME+1];
ListView_GetItemText( hwnd, iItem, 0, buffer, _MAX_FNAME+1)
RECT r;
ListView_GetItemRect( hwnd, iItem, &r, LVIR_LABEL );
int right = r.left + 5 + ListView_GetStringWidth( hwnd, buffer);
int top = r. top;
GetClientRect( hwnd, &r);
POINT p = { min(right, r.right), top};
ClientToScreen( hwnd, &p);
pListTip->Show( (char*)testItem.lParam, hwnd, &p );
}
else
pListTip->Show( NULL, NULL);
}
void InsertCollectionFile(HWND hwnd, char* buffer)
{
char Fname[_MAX_FNAME+1];
char Ext[_MAX_EXT+1] = {0, 0};
_splitpath(buffer,NULL,NULL,Fname,Ext);
if(!stricmp(Ext+1,"txt") || !stricmp(Ext+1,"log"))
{
LV_FINDINFO fi = { LVFI_STRING, Fname };
int idx = ListView_FindItem( hwnd, -1, &fi);
if(idx>=0)
{
LV_ITEM testItem = { LVIF_PARAM, idx, 0};
ListView_GetItem( hwnd, &testItem);
if(!stricmp(buffer, (char*)testItem.lParam))
return;
}
LV_ITEM a = {LVIF_TEXT|LVIF_STATE|LVIF_PARAM,ListView_GetItemCount(hwnd),0,
LVIS_SELECTED|LVIS_FOCUSED|LSTATE_CHECKED,0,
Fname, 0,0,(LPARAM)lstrcpy( new char[strlen(buffer)+1],buffer )};
ListView_InsertItem( hwnd , &a);
}
}