class ListView:public clscontr,public window
{
//POINT start;
//UINT width;
//HWND MyHw;
//UINT length;
HIMAGELIST hil;
HIMAGELIST hil_big;
viever2*back;
WNDPROC wpc;
int ID;
UINT all;
public:
ListView()
{
}
ListView(HWND hWnd,viever2*vw,POINT t_start,int len,int width,int _ID)
{
//WNDCLASSEX wcex;
//wcex.cbSize=sizeof(wcex);
//wcex.lpszClassName="asdd";
//wcex.hInstance=(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);
//wcex.lpfnWndProc=ListView::WndProc;
//wcex.hIcon=LoadIcon((HINSTANCE)NULL,IDI_APPLICATION);
//wcex.hbrBackground=(HBRUSH)(CreateSolidBrush((COLORREF)GetSysColor(0)));
//wcex.hCursor=LoadCursor(0,IDI_APPLICATION);
//wcex.cbClsExtra=0;
//wcex.cbWndExtra=0;
//wcex.hIconSm=LoadIcon(0,IDI_APPLICATION);
//wcex.style=NULL;
//wcex.lpszMenuName=NULL;
//int res = RegisterClassEx(&wcex);
//if(res==0)
//{
// MessageBox(0,"RegisterClassEx falied","",MB_OK);
// char* temp = new char[100];
// wsprintf(temp,"%li",GetLastError());
// MessageBox(NULL,temp,"Error",MB_OK);
// delete[] temp;
//}
this->MyHw=CreateWindow(WC_LISTVIEW,"",LVS_REPORT|WS_VISIBLE|WS_BORDER|WS_CHILD|LVS_SHOWSELALWAYS,
t_start.x,t_start.y+40,width,len,hWnd,(HMENU)(ID+100),(HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),NULL);
if(!this->MyHw)
MessageBox(0,"no window",0,MB_OK);
// this->wpc=(WNDPROC)SetWindowLong(this->MyHw,GWL_WNDPROC,(LONG)ListView::WndProc);
SetWindowLong(this->MyHw,GWL_USERDATA,(LONG)this);
this->hil=ImageList_Create(16,16,ILC_COLOR32,100,1000);
this->hil_big=ImageList_Create(32,32,ILC_COLOR32,100,1000);
SendMessage(this->MyHw,LVM_SETIMAGELIST,LVSIL_SMALL,(LPARAM)hil);
this->back=vw;
this->ID=_ID;
}
/* static LRESULT WINAPI WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
_this->Proc(hWnd,msg,wParam,lParam);
return CallWindowProc(_this->wpc,hWnd,msg,wParam,lParam);
}*/
void addstring(char*str,HICON hi)
{
LVITEM lvi;
int a=SendMessage(this->MyHw,LVM_GETITEMCOUNT,NULL,NULL);
ZeroMemory(&lvi,sizeof(lvi));
lvi.mask=LVIF_TEXT;
lvi.pszText=str;
lvi.iItem=a;
lvi.iSubItem=0;
int z=SendMessage(this->MyHw,LVM_INSERTITEM,a,(LPARAM)&lvi);
ImageList_AddIcon(this->hil,hi);
ImageList_AddIcon(this->hil_big,hi);
}
char*GetSel(int nth=1)
{
UINT cursel=SendMessage(this->MyHw,LVM_GETSELECTEDCOUNT,NULL,NULL);
//int pos=SendMessage(this->MyHw,LVM_GETNEXTITEM,nth,(WPARAM)LVNI_SELECTED);
// char str;
LVITEM lvi;
int a=-1;
int i;
ZeroMemory(&lvi,sizeof(lvi));
for(i=0;i<nth;i++)
{
lvi.pszText=new char[100];
lvi.mask=LVIF_TEXT;
lvi.iItem=NULL;
lvi.cchTextMax=100;
a=SendMessage(this->MyHw,LVM_GETNEXTITEM,a,LVNI_SELECTED);
lvi.iItem=a;
SendMessage(this->MyHw,LVM_GETITEM,NULL,(LPARAM)&lvi);
if(i<(nth-1)&&i>1)
delete[]lvi.pszText;
}
return (char*)lvi.pszText;
}
int GetSeli(int n=-1)
{
LVITEM lvi;
ZeroMemory(&lvi,sizeof(lvi));
int a=SendMessage(this->MyHw,LVM_GETNEXTITEM,n,LVNI_FOCUSED);
return a;
}
char*GetString(int nth)
{
LVITEM lvi;
ZeroMemory(&lvi,sizeof(lvi));
lvi.pszText=new char[100];
lvi.mask=LVIF_TEXT;
lvi.iItem=nth;
lvi.cchTextMax=100;
SendMessage(this->MyHw,LVM_GETITEM,NULL,(LPARAM)&lvi);
return lvi.pszText;
}
LVITEM GetItem(int nth)
{
LVITEM lvi;
ZeroMemory(&lvi,sizeof(lvi));
lvi.pszText=new char[100];
lvi.mask=LVIF_TEXT|LVIF_IMAGE;
lvi.iItem=nth;
lvi.cchTextMax=100;
SendMessage(this->MyHw,LVM_GETITEM,NULL,(LPARAM)&lvi);
return lvi;
}
void Clear()
{
SendMessage(this->MyHw,LVM_DELETEALLITEMS,NULL,NULL);
if(this->hil)
ImageList_RemoveAll(this->hil);
if(this->hil_big)
ImageList_RemoveAll(this->hil_big);
}
HWND GetHandle()
{
return this->MyHw;
}
void proc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
NMHDR* n=(LPNMHDR)lParam;
//int a=n.code;
switch(n->code)
{
case LVN_ITEMACTIVATE:
{
int sl=SendMessage(n->hwndFrom,LVM_GETNEXTITEM,-1,LVNI_FOCUSED);
this->back->GoToNewDir(this->GetString(sl));
//MessageBox(0,"new dir","",MB_OK);
break;
}
case LVN_ITEMCHANGED:
{
SendMessage(hWnd,_WM_SELFCLICK,(WPARAM)(this->ID),NULL);
UINT a=SendMessage(this->MyHw,LVM_GETSELECTEDCOUNT,NULL,NULL);
LPNMLISTVIEW p=(LPNMLISTVIEW)lParam;
this->back->SetCurSel(a,p->iItem);
UINT b=SendMessage(this->MyHw,LVM_GETITEMCOUNT,NULL,NULL);
this->all=b;
break;
}
case LVN_COLUMNCLICK:
{
NMLISTVIEW nml=*(LPNMLISTVIEW)lParam;
this->back->Sort(nml.iSubItem);
SendMessage(hWnd,_WM_SELFCLICK,(WPARAM)(this->ID),NULL);
//SendMessage(hWnd,MY_WM_NEEDSORT,(WPARAM)(nml.iSubItem),NULL);
}
break;
}
}
void AddCollum(char*colname)
{
LVCOLUMN lvc;
ZeroMemory(&lvc,sizeof(lvc));
lvc.cx=70;
lvc.mask=LVCF_TEXT|LVCF_WIDTH;
lvc.pszText=colname;
SendMessage(this->MyHw,LVM_INSERTCOLUMN,NULL,(LPARAM)&lvc);
}
void SpcAdd(char*filename,char*filetype,char*size,char*changed,char*created,char*lastwrite,HICON hi,char*pathto=NULL)
{
LVITEM lvi;
int a=SendMessage(this->MyHw,LVM_GETITEMCOUNT,NULL,NULL);
ZeroMemory(&lvi,sizeof(lvi));
lvi.mask=LVIF_TEXT|LVIF_IMAGE;
lvi.pszText=filename;
lvi.iItem=a;
lvi.iSubItem=0;
lvi.iImage=ImageList_AddIcon(this->hil,hi);
ImageList_AddIcon(this->hil_big,hi);
int i=SendMessage(this->MyHw,LVM_INSERTITEM,a,(LPARAM)&lvi);
lvi.iSubItem=1;
lvi.iItem=i;
lvi.pszText=filetype;
SendMessage(this->MyHw,LVM_SETITEM,NULL,(LPARAM)&lvi);
lvi.iSubItem=2;
lvi.iItem=i;
lvi.pszText=size;
SendMessage(this->MyHw,LVM_SETITEM,NULL,(LPARAM)&lvi);
lvi.iSubItem=3;
lvi.iItem=i;
lvi.pszText=changed;
SendMessage(this->MyHw,LVM_SETITEM,NULL,(LPARAM)&lvi);
lvi.iSubItem=4;
lvi.iItem=i;
lvi.pszText=created;
SendMessage(this->MyHw,LVM_SETITEM,NULL,(LPARAM)&lvi);
lvi.iSubItem=5;
lvi.iItem=i;
lvi.pszText=lastwrite;
SendMessage(this->MyHw,LVM_SETITEM,NULL,(LPARAM)&lvi);
if(pathto)//search
{
lvi.iSubItem=6;
lvi.iItem=i;
lvi.pszText=pathto;
SendMessage(this->MyHw,LVM_SETITEM,NULL,(LPARAM)&lvi);
}
}
char* GetSubItem(int col=0,int row=0)
{
LVITEM lvi;
ZeroMemory(&lvi,sizeof(lvi));
lvi.pszText=new char[100];
lvi.mask=LVIF_TEXT;
lvi.cchTextMax=100;
lvi.iItem=row;
lvi.iSubItem=col;
SendMessage(this->MyHw,LVM_GETITEM,NULL,(LPARAM)&lvi);
return lvi.pszText;
}
int GetSelNum(int nth=0)
{
UINT cursel=SendMessage(this->MyHw,LVM_GETSELECTEDCOUNT,NULL,NULL);
if(!cursel) return 0;
//int pos=SendMessage(this->MyHw,LVM_GETNEXTITEM,nth,(WPARAM)LVNI_SELECTED);
//char str;
LVITEM lvi;
int a=-1;
int i;
ZeroMemory(&lvi,sizeof(lvi));
for(i=0;i<nth;i++)
{
lvi.pszText=new char[100];
lvi.mask=LVIF_TEXT;
lvi.iItem=NULL;
lvi.cchTextMax=100;
a=SendMessage(this->MyHw,LVM_GETNEXTITEM,a,LVNI_SELECTED);
lvi.iItem=a;
SendMessage(this->MyHw,LVM_GETITEM,NULL,(LPARAM)&lvi);
if(i<(nth-1)&&i>1)
delete[]lvi.pszText;
}
return a;
}
UINT getcurs()
{
UINT cursel=SendMessage(this->MyHw,LVM_GETSELECTEDCOUNT,NULL,NULL);
return cursel;
}
HIMAGELIST GetHil(bool big=false)
{
if(big)
return this->hil_big;
else
return this->hil;
}
void SetIsSel(int what,bool sel)
{
UINT st=0;
if(sel)
st=LVIS_SELECTED;
ListView_SetItemState(this->MyHw,what,st,LVIS_SELECTED);
//SendMessage(this->MyHw,LVM_SETITEM,
}
bool GetIsSel(UINT16 what)
{
return ListView_GetItemState(this->MyHw,what,TVIS_SELECTED);
}
void InvertSel()
{
for(int i=1;i<this->all+1;i++)
this->SetIsSel(i,!this->GetIsSel(i));
}
void SelHasString(char*str)
{
for(int i=1;i<(this->all+1);i++)
{
char*s=this->GetString(i);
if(strstr(s,str)||strstr(str,s))
SetIsSel(i,true);
delete[]s;
}
}
void SelAll()
{
for(int i=1;i<(this->all+1);i++)
this->SetIsSel(i,true);
}
};