⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 openfile_win32.c

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -