📄 openfile_win32.c
字号:
if (*s)
{
Item.iImage=IMG_DIRUP;
Item.iItem = No;
Item.lParam = 0;
ListView_InsertItem(p->WndList,&Item);
ListView_SetItemText(p->WndList,No,0,T(".."));
ListView_SetItemText(p->WndList,No,1,(tchar_t*)LangStr(OPENFILE_ID,OPENFILE_UP));
++No;
}
Result = Stream->EnumDir(Stream,p->Path,p->Exts,*p->CurrentFileType!=-1,&DirItem);
if (ListMode==2 && Result == ERR_FILE_NOT_FOUND && UpperPath(p->Path,p->Last,TSIZEOF(p->Last)))
{
WaitEnd();
--p->InUpdate;
p->LastClick = -1;
UpdateList(p,Silent,ListMode);
return;
}
if (Result == ERR_NOT_DIRECTORY && !Silent)
{
New.FileName[0] = 0;
New.Ext[0] = 0;
New.Image = IMG_FILE;
New.Size = 0;
Item.lParam = (DWORD)malloc(sizeof(openitem));
if (Item.lParam)
{
p->Last[0] = 0;
Pos = No;
State = LVIS_SELECTED;
PostMessage(p->Win.Wnd,WM_COMMAND,PLATFORM_OK,0);
*(openitem*)Item.lParam = New;
Item.iItem = No;
Item.iImage = New.Image;
ListView_InsertItem(p->WndList,&Item);
++No;
}
}
if (Result == ERR_NONE)
Stream->Get(Stream,STREAM_BASE,p->Base,sizeof(p->Base));
while (Result == ERR_NONE)
{
tchar_t Size[32];
tchar_t Date[32];
int i;
for (i=0;i<No;++i)
{
LVITEM Item;
Item.iItem=i;
Item.iSubItem = 0;
Item.mask=LVIF_PARAM;
ListView_GetItem(p->WndList,&Item);
if (Item.lParam && tcscmp(((openitem*)Item.lParam)->FileName,DirItem.FileName)==0)
break;
}
if (i==No)
{
tchar_t DisplayName[MAXPATH];
tcscpy_s(New.FileName,TSIZEOF(New.FileName),DirItem.FileName);
New.DisplayName = DirItem.DisplayName[0] != 0;
tcscpy_s(DisplayName,TSIZEOF(DisplayName),New.DisplayName?DirItem.DisplayName:DirItem.FileName);
Size[0] = 0;
Date[0] = 0;
if (DirItem.Size < 0)
{
New.Image = IMG_DIR;
New.Size = 0;
New.Date = 0;
tcscpy_s(New.Ext,TSIZEOF(New.Ext),LangStr(OPENFILE_ID,OPENFILE_DIR));
tcscpy_s(New.Name,TSIZEOF(New.Name),DisplayName); //keep extension
}
else
{
switch (DirItem.Type)
{
case FTYPE_AUDIO: New.Image = IMG_AUDIO; break;
case FTYPE_PLAYLIST: New.Image = IMG_PLAYLIST; break;
case FTYPE_VIDEO: New.Image = IMG_VIDEO; break;
default: New.Image = IMG_FILE; break;
}
New.Size = DirItem.Size;
New.Date = DirItem.Date;
SplitURL(DisplayName,NULL,0,NULL,0,New.Name,TSIZEOF(New.Name),New.Ext,TSIZEOF(New.Ext));
tcsupr(New.Ext);
if (New.Size >= 0)
{
if (New.Size < 10000*1024)
stprintf_s(Size,TSIZEOF(Size),T("%d KB"),New.Size/1024);
else
stprintf_s(Size,TSIZEOF(Size),T("%d MB"),New.Size/(1024*1024));
}
if (New.Date >= 0)
{
FILETIME Time;
SYSTEMTIME SysTime;
Time.dwHighDateTime = (DWORD)(New.Date >> 32);
Time.dwLowDateTime = (DWORD)(New.Date);
if (FileTimeToSystemTime(&Time,&SysTime))
GetDateFormat(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&SysTime,NULL,Date,TSIZEOF(Date));
}
}
Item.lParam = (DWORD)malloc(sizeof(openitem));
if (Item.lParam)
{
*(openitem*)Item.lParam = New;
Item.iItem = No;
Item.iImage = New.Image;
ListView_InsertItem(p->WndList,&Item);
ListView_SetItemText(p->WndList,No,0,New.Name);
ListView_SetItemText(p->WndList,No,1,New.Ext);
ListView_SetItemText(p->WndList,No,2,Size);
ListView_SetItemText(p->WndList,No,3,Date);
++No;
}
}
Result = Stream->EnumDir(Stream,NULL,NULL,0,&DirItem);
}
NodeDelete((node*)Stream);
}
ListView_SortItems(p->WndList,CompareProc,p);
ShowWindow(p->WndList,SW_SHOWNA);
if (p->Last[0])
{
int i;
for (i=0;i<No;++i)
{
LVITEM Item;
Item.iItem=i;
Item.iSubItem = 0;
Item.mask=LVIF_PARAM;
ListView_GetItem(p->WndList,&Item);
if (Item.lParam && tcsicmp(((openitem*)Item.lParam)->Name,p->Last)==0)
{
Pos = i;
break;
}
}
}
SetFocus(p->WndList);
p->OwnSelect = 1;
ListView_SetItemState(p->WndList,Pos,State,State);
p->OwnSelect = 0;
ListView_EnsureVisible(p->WndList,Pos,TRUE);
WaitEnd();
--p->InUpdate;
}
static void UpdateMenu(openfile* p)
{
int No;
int* i;
p->TypesMenu = WinMenuFind(&p->Win,OPENFILE_ALL_FILES);
WinMenuInsert(&p->Win,p->TypesMenu,OPENFILE_ALL_FILES,OPENFILE_TYPES-1,LangStr(p->Class,0));
ArrayClear(&p->Types);
NodeEnumClass(&p->Types,p->Class);
for (No=0,i=ARRAYBEGIN(p->Types,int);i!=ARRAYEND(p->Types,int);++i,++No)
{
const tchar_t* Name = LangStr(*i,NODE_NAME);
if (Name[0] && UniqueExts(ARRAYBEGIN(p->Types,int),i))
WinMenuInsert(&p->Win,p->TypesMenu,OPENFILE_ALL_FILES,OPENFILE_TYPES+No,Name);
}
}
static void UpdateSort(openfile* p)
{
WinMenuCheck(&p->Win,1,OPENFILE_LABEL_NAME,p->SortCol==0);
WinMenuCheck(&p->Win,1,OPENFILE_LABEL_TYPE,p->SortCol==1);
WinMenuCheck(&p->Win,1,OPENFILE_LABEL_SIZE,p->SortCol==2);
WinMenuCheck(&p->Win,1,OPENFILE_LABEL_DATE,p->SortCol==3);
ListView_SortItems(p->WndList, CompareProc, (LPARAM)p);
}
static void UpdateFileType(openfile* p,int ListMode)
{
int No;
int* i;
int FileType;
if (p->InUpdate)
return;
FileType = *p->CurrentFileType;
if (FileType && FileType!=-1 && !NodeEnumClass(NULL,FileType))
FileType = *p->CurrentFileType = 0;
WinMenuCheck(&p->Win,p->TypesMenu,OPENFILE_TYPES-1,FileType==0);
WinMenuCheck(&p->Win,p->TypesMenu,OPENFILE_ALL_FILES,FileType==-1);
p->Exts[0]=0;
for (No=0,i=ARRAYBEGIN(p->Types,int);i!=ARRAYEND(p->Types,int);++i,++No)
{
WinMenuCheck(&p->Win,p->TypesMenu,OPENFILE_TYPES+No,FileType==*i);
if (FileType==*i || FileType==0 || FileType==-1)
{
const tchar_t *Exts = LangStr(*i,NODE_EXTS);
if (Exts[0])
{
if (p->Exts[0]) tcscat_s(p->Exts,TSIZEOF(p->Exts),T(";"));
tcscat_s(p->Exts,TSIZEOF(p->Exts),Exts);
}
}
}
p->Last[0] = 0;
UpdateList(p,1,ListMode);
}
static void SetSaveName(openfile* p,int Pos)
{
LVITEM Item;
Item.iItem=Pos;
Item.iSubItem=0;
Item.mask=LVIF_PARAM;
if (ListView_GetItem(p->WndList,&Item) && Item.lParam && ((openitem*)Item.lParam)->Image != IMG_DIR)
{
int* i;
SplitURL(((openitem*)Item.lParam)->FileName,NULL,0,NULL,0,p->SaveName,TSIZEOF(p->SaveName),p->SaveName,TSIZEOF(p->SaveName));
for (i=ARRAYBEGIN(p->Types,int);i!=ARRAYEND(p->Types,int);++i)
if (CheckExts(p->SaveName,LangStr(*i,NODE_EXTS)))
{
tchar_t *s = tcsrchr(p->SaveName,'.');
if (s) *s = 0;
p->FileTypeSave = *i;
WinPropUpdate(&p->Win,&p->Win.Node,OPENFILE_FILETYPE_SAVE);
break;
}
WinPropUpdate(&p->Win,&p->Win.Node,OPENFILE_SAVE_NAME);
WinPropFocus(&p->Win,&p->Win.Node,OPENFILE_SAVE_NAME,1);
}
}
static void Save(openfile* p)
{
player* Player = (player*)Context()->Player;
if (Player)
{
tchar_t URL[MAXPATH];
tchar_t Exts[MAXPATH];
if (!p->SaveName[0])
{
ShowError(0,OPENFILE_ID,OPENFILE_EMPTYNAME);
WinPropFocus(&p->Win,&p->Win.Node,OPENFILE_SAVE_NAME,1);
return;
}
else
{
AbsPath(URL,TSIZEOF(URL),p->SaveName,p->Base);
SplitURL(p->SaveName,NULL,0,NULL,0,NULL,0,Exts,TSIZEOF(Exts));
if (!Exts[0])
{
tchar_t* s;
tcscpy_s(Exts,TSIZEOF(Exts),LangStr(p->FileTypeSave,NODE_EXTS));
s = tcschr(Exts,':');
if (s) *s = 0;
SetFileExt(URL,TSIZEOF(URL),Exts);
}
PlayerSaveList(Player,URL,p->FileTypeSave);
}
}
WinClose(&p->Win);
}
static bool_t IsSelected(openfile* p)
{
int Count,i;
Count = ListView_GetItemCount(p->WndList);
for (i=0;i<Count;++i)
if (ListView_GetItemState(p->WndList,i,LVIS_SELECTED)==LVIS_SELECTED)
{
LVITEM Item;
Item.iItem=i;
Item.iSubItem=0;
Item.mask=LVIF_PARAM;
if (ListView_GetItem(p->WndList,&Item) && Item.lParam && (((openitem*)Item.lParam)->Image != IMG_DIR || p->SelectDir))
break;
}
return i<Count;
}
static void SelectIfNone(openfile* p,int Pos)
{
if (!IsSelected(p))
{
p->OwnSelect = 1;
ListView_SetItemState(p->WndList,Pos,LVIS_SELECTED,LVIS_SELECTED);
p->OwnSelect = 0;
}
}
static void Add(openfile* p)
{
player* Player = (player*)Context()->Player;
bool_t Add = (p->Flags & OPENFLAG_ADD) != 0;
bool_t b;
int Count,n,i;
if (Player && IsSelected(p))
{
if (p->Class != SKIN_CLASS)
{
if (Add)
{
Player->Get(Player,PLAYER_LIST_COUNT,&n,sizeof(n));
Add = n>0;
}
else
{
b = 0;
Player->Set(Player,PLAYER_PLAY,&b,sizeof(b));
n = 0;
Player->Set(Player,PLAYER_LIST_COUNT,&n,sizeof(n));
}
}
Count = ListView_GetItemCount(p->WndList);
for (i=0;i<Count;++i)
if (ListView_GetItemState(p->WndList,i,LVIS_SELECTED)==LVIS_SELECTED)
{
LVITEM Item;
Item.iItem=i;
Item.iSubItem=0;
Item.mask=LVIF_PARAM;
if (ListView_GetItem(p->WndList,&Item) && Item.lParam && (((openitem*)Item.lParam)->Image != IMG_DIR || p->SelectDir))
{
tchar_t URL[MAXPATH];
if (((openitem*)Item.lParam)->FileName[0])
AbsPath(URL,TSIZEOF(URL),((openitem*)Item.lParam)->FileName,p->Base);
else
tcscpy_s(URL,TSIZEOF(URL),p->Path);
if (p->Class == SKIN_CLASS)
{
p->Win.Parent->Node.Set(&p->Win.Parent->Node,IF_SKINPATH,URL,TSIZEOF(URL));
}
else
if (((openitem*)Item.lParam)->Image == IMG_DIR)
n = PlayerAddDir(Player,n,URL,p->Exts,*p->CurrentFileType!=-1,0);
else
n = PlayerAdd(Player,n,URL,((openitem*)Item.lParam)->DisplayName?((openitem*)Item.lParam)->Name:NULL);
}
}
if (!Add)
p->Win.Result = 2;
}
WinClose(&p->Win);
}
static void Resize(openfile* p)
{
RECT r;
int BorderX = WinUnitToPixelX(&p->Win,1);
int BorderY = WinUnitToPixelY(&p->Win,1);
int URLHeight;
GetClientRect(p->Win.Wnd,&r);
r.left += BorderX;
r.right -= BorderX;
if (p->Win.Smartphone)
{
URLHeight = WinUnitToPixelY(&p->Win,15);
MoveWindow(p->WndURL,r.left,p->Top+BorderY,r.right-r.left,URLHeight-2*BorderY,0);
}
else
{
RECT Combo;
int ButtonWidth = WinUnitToPixelX(&p->Win,30);
SendMessage(p->WndURL,CB_SHOWDROPDOWN,0,0);
r.right -= ButtonWidth;
MoveWindow(p->WndURL,r.left,p->Top+BorderY,r.right-r.left-BorderX,WinUnitToPixelY(&p->Win,200),0);
GetWindowRect(p->WndURL,&Combo);
URLHeight = Combo.bottom - Combo.top + BorderY*2;
MoveWindow(p->WndGo,r.right,p->Top+BorderY,ButtonWidth,URLHeight-BorderY*2,0);
}
GetClientRect(p->Win.Wnd,&r);
r.top += p->Win.ToolBarHeight;
MoveWindow(p->Win.WndDialog,r.left,r.top,r.right-r.left,URLHeight+p->Top,0);
r.top += p->Top+URLHeight;
MoveWindow(p->WndList,r.left,r.top,r.right-r.left,r.bottom-r.top,0);
}
static void InitMenu(openfile* p)
{
int i;
if (!WinMenuEnable(&p->Win,1,OPENFILE_EMPTY,0))
{
WinMenuInsert(&p->Win,1,OPENFILE_HISTORY+1,OPENFILE_EMPTY,LangStr(OPENFILE_ID,OPENFILE_EMPTY));
for (i=1;i<MAXHISTORY;++i)
WinMenuDelete(&p->Win,1,OPENFILE_HISTORY+i);
}
if (p->HistoryCount>1)
{
for (i=1;i<MAXHISTORY;++i)
WinMenuInsert(&p->Win,1,OPENFILE_EMPTY,OPENFILE_HISTORY+i,p->History[i]);
WinMenuDelete(&p->Win,1,OPENFILE_EMPTY);
}
else
WinMenuEnable(&p->Win,1,OPENFILE_EMPTY,0);
}
static bool_t DialogProc(openfile* p,int Msg, uint32_t wParam, uint32_t lParam, int* Result)
{
int i;
switch (Msg)
{
case WM_KEYDOWN:
if (wParam == VK_RETURN)
PostMessage(p->Win.Wnd,WM_COMMAND,PLATFORM_OK,0);
break;
case WM_COMMAND:
if (p->WndGo == (HWND)lParam && HIWORD(wParam)==BN_CLICKED && !p->InUpdate)
SendMessage(p->Win.Wnd,WM_COMMAND,OPENFILE_GO,0);
if (p->WndURL == (HWND)lParam)
{
if (p->Win.Smartphone)
{
switch (HIWORD(wParam))
{
case EN_SETFOCUS:
WinPropFocus(&p->Win,&p->Win.Node,OPENFILE_URL,0);
p->Win.CaptureKeys = 1;
break;
case EN_KILLFOCUS:
p->Win.CaptureKeys = 0;
break;
}
}
else
{
switch (HIWORD(wParam))
{
case CBN_CLOSEUP:
if (!p->InUpdate)
{
i = SendMessage(p->WndURL,CB_GETCURSEL,0,0);
if (i!=CB_ERR && i>0 && i < p->HistoryCount)
{
SetURLText(p,p->History[i]);
PostMessage(p->Win.Wnd,WM_COMMAND,OPENFILE_GO,0);
}
}
break;
case CBN_SETFOCUS:
WinPropFocus(&p->Win,&p->Win.Node,OPENFILE_URL,0);
p->Win.CaptureKeys = 1;
break;
case CBN_KILLFOCUS:
p->Win.CaptureKeys = 0;
break;
}
}
}
}
return 0;
}
static const menudef MenuDef[] =
{
{ 0,PLATFORM_ID, PLATFORM_OK },
{ 0,OPENFILE_ID, OPENFILE_FILTER },
{ 1,OPENFILE_ID, OPENFILE_ALL_FILES },
{ 0,PLATFORM_ID, PLATFORM_CANCEL },
{ 0,-1,-1 },
{ 0,OPENFILE_ID, OPENFILE_MORE },
{ 0,-1,-1 },
{ 0,OPENFILE_ID, OPENFILE_SELECTALL },
{ 0,-1,-1 },
{ 0,OPENFILE_ID, OPENFILE_SELECTDIR },
MENUDEF_END
};
static const menudef MenuDefSingle[] =
{
{ 0,PLATFORM_ID, PLATFORM_OK },
{ 0,OPENFILE_ID, OPENFILE_FILTER },
{ 1,OPENFILE_ID, OPENFILE_ALL_FILES },
{ 0,PLATFORM_ID, PLATFORM_CANCEL },
MENUDEF_END
};
static const menudef MenuDefSmart[] =
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -