📄 mpqwindow.cpp
字号:
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "MpqWindow.h"
//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
MPQ_WINDOW MpqWindow;
//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
MPQ_WINDOW::MPQ_WINDOW()
{
CurrentlySelectedFile = NULL;
CurrentlySelectedPopupFile = NULL;
MpqLoaded = FALSE;
MpqFileName = "";
}
//+-----------------------------------------------------------------------------
//| Destructor
//+-----------------------------------------------------------------------------
MPQ_WINDOW::~MPQ_WINDOW()
{
//Empty
}
//+-----------------------------------------------------------------------------
//| Creates a new window
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::Create()
{
WINDOW_TREEVIEW_INFO TreeviewInfo;
FrameInfo.Title = "MPQ Browser";
FrameInfo.Width = DEFAULT_MPQ_WINDOW_WIDTH;
FrameInfo.Height = DEFAULT_MPQ_WINDOW_HEIGHT;
FrameInfo.Menu = ::LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(MpqMenu));
FrameInfo.Style &= (~WS_VISIBLE);
FrameInfo.Style |= (WS_MAXIMIZEBOX | WS_SIZEBOX);
if(!WINDOW_FRAME::Create()) return FALSE;
TreeviewInfo.Parent = Window;
if(!TreeView.Create(TreeviewInfo)) return FALSE;
Icon.AssignIconListToTreeView(TreeView.GetWindow());
if(!Filter.AddFilterItemsToMenu(GetMenu())) return FALSE;
Filter.UpdateFilterMenu(GetMenu());
RootNode.FilterData.FilterList.resize(Filter.GetNrOfFilters(), FALSE);
if(!OpenAllMpqArchives()) return FALSE;
ResizeTreeView();
UpdateWindowStatus();
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Destroys the window
//+-----------------------------------------------------------------------------
VOID MPQ_WINDOW::Destroy()
{
Mpq.Close();
CloseAllMpqArchives();
TreeView.Destroy();
WINDOW_FRAME::Destroy();
}
//+-----------------------------------------------------------------------------
//| Handles the window messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::MessageHandler(UINT Message, WPARAM W, LPARAM L)
{
switch(Message)
{
case WM_SIZE:
case WM_SIZING:
{
ResizeTreeView();
return 0;
}
case WM_CLOSE:
{
Hide();
return 0;
}
case WM_DESTROY:
{
return 0;
}
}
return DefWindowProc(Window, Message, W, L);
}
//+-----------------------------------------------------------------------------
//| Handles the window menu messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::MenuHandler(WORD MenuItem)
{
switch(MenuItem)
{
case MpqFileOpen:
{
if(!OpenMpq())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqFileClose:
{
if(!CloseMpq())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqFileWar3Mpq:
{
if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqFileWar3xMpq:
{
if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3X))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqFileWar3xLocalMpq:
{
if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3X_LOCAL))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqFileWar3PatchMpq:
{
if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3_PATCH))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqFiltersOther:
{
Filter.SelectOther();
Filter.UpdateFilterMenu(GetMenu());
UpdateTreeView();
return 0;
}
case MpqFiltersAll:
{
Filter.SelectAll();
Filter.UpdateFilterMenu(GetMenu());
UpdateTreeView();
return 0;
}
case MpqFiltersNone:
{
Filter.SelectNone();
Filter.UpdateFilterMenu(GetMenu());
UpdateTreeView();
return 0;
}
case MpqPopupOpen:
case MpqPopupOpen2:
{
if(CurrentlySelectedPopupFile == NULL) return 0;
if(!OpenMpqFile(CurrentlySelectedPopupFile->FileNameAndPath))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqPopupExport:
case MpqPopupExport2:
{
std::string FileName;
WINDOW_FILE_DIALOG FileDialog;
if(CurrentlySelectedPopupFile == NULL) return 0;
FileDialog.SetTitle("Export File");
FileDialog.SetFilter(FILTER_ALL);
FileName = CurrentlySelectedPopupFile->FileName;
if(!FileDialog.SaveFile(Window, FileName)) return 0;
if(!ExportMpqFile(CurrentlySelectedPopupFile->FileNameAndPath, FileName))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqPopupCopyPath:
case MpqPopupCopyPath2:
{
if(CurrentlySelectedPopupFile == NULL) return 0;
if(!Common.SetClipboardData(CurrentlySelectedPopupFile->FileNameAndPath))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case MpqPopupUseAsTexture:
case MpqPopupUseAsTexture2:
{
std::string FileName;
if(CurrentlySelectedPopupFile == NULL) return 0;
FileName = CurrentlySelectedPopupFile->FileNameAndPath;
if(!TextureManagerWindow.UseTextureFromMpq(FileName))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
}
if(MenuItem < Filter.GetMinMenuItemId()) return 0;
if(MenuItem > Filter.GetMaxMenuItemId()) return 0;
Filter.Select(MenuItem);
Filter.UpdateFilterMenu(GetMenu());
UpdateTreeView();
return 0;
}
//+-----------------------------------------------------------------------------
//| Handles the window control messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::ControlHandler(HWND Control, WORD Code)
{
return 0;
}
//+-----------------------------------------------------------------------------
//| Handles the window notify messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::NotifyHandler(HWND Control, UINT Code, NMHDR* Header)
{
if(Control == TreeView.GetWindow())
{
NM_TREEVIEW* TreeViewHeader;
TreeViewHeader = reinterpret_cast<NM_TREEVIEW*>(Header);
if(TreeViewHeader == NULL) return 0;
return TreeViewHandler(Code, TreeViewHeader);
}
return 0;
}
//+-----------------------------------------------------------------------------
//| Handles the treeview messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::TreeViewHandler(UINT Code, NM_TREEVIEW* TreeViewHeader)
{
TVITEM ItemData;
POINT MousePosition;
POINT LocalMousePosition;
TVHITTESTINFO HitTestInfo;
GetCursorPos(&MousePosition);
LocalMousePosition = MousePosition;
ScreenToClient(TreeView.GetWindow(), &LocalMousePosition);
switch(Code)
{
case NM_DBLCLK:
{
if(CurrentlySelectedFile == NULL) return 0;
if(CurrentlySelectedFile->IsFolder) return 0;
ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
HitTestInfo.pt = LocalMousePosition;
if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) return 0;
if(!(HitTestInfo.flags & TVHT_ONITEM)) return 0;
if(!OpenMpqFile(CurrentlySelectedFile->FileNameAndPath))
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NM_RCLICK:
{
INT MenuId;
std::string FileName;
HTREEITEM TreeViewItem;
ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
HitTestInfo.pt = LocalMousePosition;
if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) return 0;
if(!(HitTestInfo.flags & TVHT_ONITEM)) return 0;
TreeViewItem = HitTestInfo.hItem;
if(TreeViewItem == NULL) return 0;
ZeroMemory(&ItemData, sizeof(TVITEM));
ItemData.mask = TVIF_PARAM;
ItemData.hItem = TreeViewItem;
if(!TreeView_GetItem(TreeView.GetWindow(), &ItemData)) return 0;
CurrentlySelectedPopupFile = reinterpret_cast<FILE_NODE*>(ItemData.lParam);
if(CurrentlySelectedPopupFile == NULL) return 0;
if(CurrentlySelectedPopupFile->IsFolder) return 0;
FileName = CurrentlySelectedPopupFile->FileName;
MenuId = (MainWindow.ModelIsLoaded() && ResourceLoader.IsTextureExtention(Common.GetExtention(FileName))) ? MpqPopupMenu : MpqPopupMenu2;
if(!TrackPopupMenuEx(GetSubMenu(LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(MenuId)), 0),
TPM_LEFTALIGN | TPM_RIGHTBUTTON, MousePosition.x, MousePosition.y,
Window, NULL))
{
Error.SetMessage("Unable to create popup menu!");
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case TVN_SELCHANGED:
{
CurrentlySelectedFile = reinterpret_cast<FILE_NODE*>(TreeViewHeader->itemNew.lParam);
if(CurrentlySelectedFile == NULL) return 0;
return 0;
}
}
return 0;
}
//+-----------------------------------------------------------------------------
//| Opens all MPQ archives
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::OpenAllMpqArchives()
{
BOOL Result = FALSE;
std::string FileName;
std::string ErrorMessage;
std::string WarcraftDirectory;
WarcraftDirectory = Register.GetWarcraftDirectory();
while(TRUE)
{
FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3;
if(!MpqWar3.Open(FileName)) break;
FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3X;
if(!MpqWar3x.Open(FileName)) break;
FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3X_LOCAL;
if(!MpqWar3xLocal.Open(FileName)) break;
FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3_PATCH;
if(!MpqWar3Patch.Open(FileName)) break;
Result = TRUE;
break;
}
if(!Result)
{
ErrorMessage = "Unable to open \"" + FileName + "\"!\n\n";
ErrorMessage += "Make sure that Warcraft 3 is installed and that the registry key\n";
ErrorMessage += "\"HKEY_CURRENT_USER\\Blizzard Entertainment\\Warcraft III\\InstallPath\" exists!";
Error.SetMessage(ErrorMessage);
return FALSE;
}
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Closes all MPQ archives
//+-----------------------------------------------------------------------------
VOID MPQ_WINDOW::CloseAllMpqArchives()
{
MpqWar3.Close();
MpqWar3x.Close();
MpqWar3xLocal.Close();
MpqWar3Patch.Close();
}
//+-----------------------------------------------------------------------------
//| Checks if an extention is an mpq archive extention
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::IsMpqExtention(CONST std::string& Extention)
{
if(Extention == "mpq") return TRUE;
if(Extention == "w3m") return TRUE;
if(Extention == "w3x") return TRUE;
if(Extention == "w3n") return TRUE;
return FALSE;
}
//+-----------------------------------------------------------------------------
//| Opens an mpq archive by name
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::OpenMpqByName(CONST std::string& FileName)
{
CloseMpq();
if(!Mpq.Open(FileName)) return FALSE;
if(!LoadListFile(FileName)) return FALSE;
MpqLoaded = TRUE;
MpqFileName = FileName;
UpdateTreeView();
UpdateWindowStatus();
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Opens an mpq archive
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::OpenMpq()
{
std::string FileName;
WINDOW_FILE_DIALOG FileDialog;
FileDialog.SetTitle("Open MPQ Archive");
FileDialog.SetFilter(FILTER_MPQ);
if(!FileDialog.OpenFile(Window, FileName)) return TRUE;
if(!OpenMpqByName(FileName)) return FALSE;
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Closes the mpq archive
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -