Files
scummex/wxwindows.cpp
T
2003-09-21 23:50:28 +00:00

1156 lines
31 KiB
C++

/* ScummEX - Viewer for Scumm data files
* Copyright (C) 2003 Adrien Mercier
* Copyright (C) 2003 The ScummVM project
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header: /Users/sev/projects/sc/s/scummvm/scummex/wxwindows.cpp,v 1.11 2003/09/21 23:50:28 yoshizf Exp $
*
*/
#include "wxwindows.h"
#include "file.h"
#include "scummex.h"
#include "icons.h"
wxTreeItemId iter[11], itemid;
wxTreeCtrl *tree;
wxStaticText *TypeLabel, *OffsetLabel, *SizeLabel, *DescriptionLabel;
wxStaticText *SpecLabel[6];
wxButton *SpecButton1, *SpecButton2;
MainWindow *frame;
ImageWindow *imageFrame;
ScummEX *_scummex;
wxImage *image;
const char *file, *filename;
wxTextCtrl *hexdata;
wxToolBar *ToolBar;
IMPLEMENT_APP(GUI_wxWindows)
GUI_wxWindows::GUI_wxWindows() {
_scummex = new ScummEX();
}
bool GUI_wxWindows::OnInit()
{
frame = new MainWindow("ScummEX", wxPoint(-1,-1),
wxSize(640,480));
frame->Connect( ID_Quit, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &MainWindow::OnQuit );
frame->Connect( ID_About, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &MainWindow::OnAbout );
frame->Connect( ID_Open, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &MainWindow::OnOpen );
frame->Connect( ID_Browse, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &MainWindow::OnOpen );
frame->Connect( ID_View, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &ScummEX::fileView );
frame->Connect( ID_Dump, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &GUI_wxWindows::BlockDump );
frame->Connect( Tree, wxEVT_COMMAND_TREE_SEL_CHANGING,
(wxObjectEventFunction) &MainWindow::OnSelChanged );
frame->Connect( ID_Help, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &MainWindow::OnHelp );
frame->Connect( ID_FileInfo, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &ScummEX::FileInfo );
frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}
void GUI_wxWindows::SetTitle(char *title) {
frame->SetTitle(title);
}
void MainWindow::OnHelp(wxCommandEvent& WXUNUSED(event)) {
HtmlHelp->DisplayContents();
}
int GUI_wxWindows::getScummVersionDialog() {
int choice;
wxString games[22] = {
"Maniac Mansion (C64)",
"Maniac Mansion (PC)",
"Zak McKracken",
"Zak McKracken (FM Towns)",
"Indiana Jones & The Last Crusade",
"Sampler (Loom, Indy3, SOMI)",
"The Secret of Monkey Island (Demo)",
"The Secret of Monkey Island (EGA)",
"The Secret of Monkey Island",
"Loom",
"Loom (CD)",
"Monkey Island 2: LeChuck's Revenge",
"Indiana Jones & The Fate of Atlantis",
"Day of the Tentacle",
"Sam & Max Hit The Road (Demo)",
"Sam & Max Hit The Road (Mac demo)",
"Sam & Max Hit The Road (Disk)",
"Sam & Max Hit The Road (CD)",
"Full Throttle",
"The Dig",
"The Dig (Win95)",
"The Curse of Monkey Island"
};
wxSingleChoiceDialog *dialog = new wxSingleChoiceDialog(frame, "Please select the correct game", "Scumm version selection", 22, games, NULL, wxOK|wxCANCEL|wxCENTRE, wxDefaultPosition);
if (dialog->ShowModal() == wxID_OK) {
choice = dialog->GetSelection();
switch (choice) {
case 0:
return 1;
case 1:
case 2:
return 2;
case 3:
case 4:
case 9:
return 3;
case 5:
case 6:
case 7:
return 4;
case 8:
case 10:
case 11:
case 12:
return 5;
case 13:
case 14:
case 16:
return 6;
case 17:
case 18:
case 19:
return 7;
case 20:
case 21:
return 8;
}
}
return 0;
}
void GUI_wxWindows::FileInfoDialog(int size, int encbyte) {
char buf[256];
char msg[512];
const char *fname;
const char *fpath;
wxFileName *filename = new wxFileName(file);
fname = filename->GetFullName();
fpath = filename->GetFullPath();
sprintf(msg, "Filename: \t\t %s\n", fname);
sprintf(buf, "Full Path: \t\t %s\n", fpath);
strcat(msg, buf);
sprintf(buf, "Size: \t\t %d\n", size);
strcat(msg, buf);
sprintf(buf, "XOR byte: \t %d (0x%02X)\n", encbyte, encbyte);
strcat(msg, buf);
wxMessageBox(msg, "File Info", wxOK, frame);
}
void GUI_wxWindows::BlockDump() {
wxFileDialog *dialog = new wxFileDialog(frame, "Please select an output file.", "", "",
"*",
wxSAVE);
if (dialog->ShowModal() == wxID_OK) {
filename = (const char*)dialog->GetPath();
_scummex->FileDump(filename);
}
}
void GUI_wxWindows::SaveSOU() {
wxFileDialog *dialog = new wxFileDialog(frame, "Please select an output file.", "", "",
"*",
wxSAVE);
if (dialog->ShowModal() == wxID_OK) {
filename = (const char*)dialog->GetPath();
_scummex->iMUSEDump(filename);
}
}
void GUI_wxWindows::SaveiMUSE() {
wxFileDialog *dialog = new wxFileDialog(frame, "Please select an output file.", "", "",
"*",
wxSAVE);
if (dialog->ShowModal() == wxID_OK) {
filename = (const char*)dialog->GetPath();
_scummex->iMUSEDump(filename);
}
}
void GUI_wxWindows::PutPixel(int x, int y, int red, int green, int blue) {
image->SetRGB(x, y, (unsigned char) red, (unsigned char) green, (unsigned char) blue);
}
void GUI_wxWindows::SaveImage() {
wxFileDialog *dialog = new wxFileDialog(imageFrame, "Please select an output file.", "", "",
"*",
wxSAVE);
if (dialog->ShowModal() == wxID_OK) {
filename = (const char*)dialog->GetPath();
image->SaveFile(filename, wxBITMAP_TYPE_BMP);
}
}
void GUI_wxWindows::DisplayImage(char* title, int width, int height) {
imageFrame = new ImageWindow(title, wxPoint(-1,-1), wxSize(width, height));
imageFrame->Connect( Viewer_Quit, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &ImageWindow::OnQuit );
imageFrame->Connect( ID_BMP, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &GUI_wxWindows::SaveImage );
imageFrame->Connect( ID_ImageWindow, wxEVT_CLOSE_WINDOW,
(wxObjectEventFunction) &ImageWindow::OnQuit );
}
void GUI_wxWindows::DrawImage() {
imageFrame->DrawImage();
}
ImageWindow::ImageWindow(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame(frame,ID_ImageWindow,title,pos,size, wxDEFAULT_FRAME_STYLE & (wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION))
{
wxMenuBar *menuBar = new wxMenuBar;
wxMenu *menuFile = new wxMenu;
wxMenuItem *BMPItem = new wxMenuItem(menuFile, ID_BMP, "Save to BMP...", "Save image to .BMP", wxITEM_NORMAL, NULL );
wxBitmap SaveIcon = wxBitmap(save_icon);
BMPItem->SetBitmap(SaveIcon);
menuFile->Append(BMPItem);
menuFile->Append(Viewer_Quit,"Close");
menuBar->Append(menuFile,"&File");
SetMenuBar(menuBar);
SetClientSize(size.GetWidth(), size.GetHeight());
image = new wxImage(size.GetWidth(), size.GetHeight());
}
void ImageWindow::DrawImage() {
wxBitmap bitmap = wxBitmap(image);
wxBoxSizer *vertSizer = new wxBoxSizer( wxVERTICAL );
wxStaticBitmap *sbmp = new wxStaticBitmap(this, -1, bitmap);
vertSizer->Add(sbmp, 0, wxALL, 0 );
Show(TRUE);
}
void ImageWindow::OnQuit(wxCommandEvent& WXUNUSED(event))
{
delete image;
Destroy();
}
void GUI_wxWindows::DisplayViewer(char *title, int width, int height, char *text) {
ViewerWindow *viewerFrame = new ViewerWindow(title, text, wxPoint(50,50), wxSize(width, height));
viewerFrame->Connect( Viewer_Quit, wxEVT_COMMAND_MENU_SELECTED,
(wxObjectEventFunction) &ViewerWindow::OnQuit );
viewerFrame->Connect( ID_ViewerWindow, wxEVT_CLOSE_WINDOW,
(wxObjectEventFunction) &ViewerWindow::OnQuit );
}
void GUI_wxWindows::AppendText(char *text) {
hexdata->AppendText(text);
}
ViewerWindow::ViewerWindow(const wxString& title, const wxString& text, const wxPoint& pos, const wxSize& size)
: wxFrame(frame, ID_ViewerWindow, title, pos, size)
{
wxMenuBar *menuBar = new wxMenuBar;
wxMenu *menuFile = new wxMenu;
menuFile->Append(Viewer_Quit,"Close");
menuBar->Append(menuFile,"&File");
SetMenuBar(menuBar);
hexdata = new wxTextCtrl(this, -1, text, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_MULTILINE|wxTE_RICH, wxDefaultValidator, wxTextCtrlNameStr);
hexdata->SetFont(wxFont(10, wxMODERN, wxNORMAL, wxNORMAL));
Show(TRUE);
}
void ViewerWindow::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Destroy();
}
void GUI_wxWindows::DisplayDialog(char *message, char *title) {
wxMessageBox(message, title, wxOK, frame);
}
void GUI_wxWindows::EnableToolbarTool(int tool) {
ToolBar->EnableTool(tool, TRUE);
}
void GUI_wxWindows::DisableToolbarTool(int tool) {
ToolBar->EnableTool(tool, FALSE);
}
void GUI_wxWindows::SetButton(int blocktype) {
switch(blocktype) {
case cus2: // iMUSE
SpecButton1->SetLabel("Play");
SpecButton2->SetLabel("Decompress to WAV...");
SpecButton1->Show(TRUE);
SpecButton1->Enable(FALSE); // FIXME Mixer not working anymore?
SpecButton2->Show(TRUE);
SpecButton1->Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &ScummEX::iMUSEPlay );
SpecButton2->Connect( ID_SpecButton2, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &GUI_wxWindows::SaveiMUSE );
break;
case OBIM:
SpecButton1->SetLabel("View Object");
SpecButton1->Show(TRUE);
SpecButton1->Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &ScummEX::objectDraw );
break;
case Crea:
SpecButton1->SetLabel("Play");
SpecButton2->SetLabel("Decompress to WAV...");
SpecButton1->Show(TRUE);
SpecButton1->Enable(FALSE); // FIXME Mixer not working anymore?
SpecButton2->Show(TRUE);
SpecButton2->Enable(FALSE);
SpecButton1->Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &ScummEX::SOUPlay );
SpecButton2->Connect( ID_SpecButton2, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &GUI_wxWindows::SaveSOU );
break;
case CLUT:
case APAL:
case PA:
case NPAL:
case AHDR:
SpecButton1->SetLabel("View Palette");
SpecButton1->Show(TRUE);
SpecButton1->Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &ScummEX::paletteDraw );
break;
case BM:
case RMIM:
SpecButton1->SetLabel("View Image");
SpecButton1->Show(TRUE);
SpecButton1->Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &ScummEX::bgDraw );
break;
case FOBJ:
SpecButton1->SetLabel("View Frame");
SpecButton1->Show(TRUE);
SpecButton1->Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &ScummEX::SmushFrameDraw );
break;
case LSCR:
case SCRP:
case ENCD:
case EXCD:
case VERB:
case LS:
case SC:
case EN:
case EX:
case OC:
SpecButton1->SetLabel("Decompile Script");
SpecButton1->Show(TRUE);
SpecButton1->Connect( ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED,
(wxObjectEventFunction) &ScummEX::Descumm );
break;
}
}
void GUI_wxWindows::add_tree_elements(char *itemName, int blockid, int level, int type) {
assert(level <= 10);
itemid = iter[level] = tree->AppendItem(iter[level-1], itemName, -1, -1, new TreeItemData(blockid, type));
if (type < 200) {
tree->SetItemImage(itemid, blocksInfo[type].iconid);
tree->SetItemImage(itemid, blocksInfo[type].iconid, wxTreeItemIcon_Selected);
} else {
tree->SetItemImage(itemid, oldBlocksInfo[type-200].iconid);
tree->SetItemImage(itemid, oldBlocksInfo[type-200].iconid, wxTreeItemIcon_Selected);
}
if (blockid == 1) {
tree->EnsureVisible(itemid);
}
}
void GUI_wxWindows::updateLabel(char *label, char *title, uint32 text) {
char buf[256];
if (strstr(label, "TypeLabel")) {
sprintf(buf, "%s: \t\t %s", title, (char*)text);
TypeLabel->SetLabel(buf);
}
if (strstr(label, "OffsetLabel")) {
sprintf(buf, "%s: \t\t %d (0x%08X)", title, text, text);
OffsetLabel->SetLabel(buf);
}
if (strstr(label, "DescriptionLabel")) {
sprintf(buf, "%s: \t %s", title, (char*)text);
DescriptionLabel->SetLabel(buf);
}
if (strstr(label, "SizeLabel")) {
sprintf(buf, "%s: \t\t %d (0x%08X)", title, text, text);
SizeLabel->SetLabel(buf);
}
if (strstr(label, "SpecLabel1")) {
sprintf(buf, "%s: \t\t %d", title, text);
SpecLabel[0]->SetLabel(buf);
}
if (strstr(label, "SpecLabel2")) {
sprintf(buf, "%s: \t\t %d", title, text);
SpecLabel[1]->SetLabel(buf);
}
if (strstr(label, "SpecLabel3")) {
sprintf(buf, "%s: \t\t %d", title, text);
SpecLabel[2]->SetLabel(buf);
}
if (strstr(label, "SpecLabel4")) {
sprintf(buf, "%s: \t\t %d", title, text);
SpecLabel[3]->SetLabel(buf);
}
if (strstr(label, "SpecLabel5")) {
sprintf(buf, "%s: \t\t %d", title, text);
SpecLabel[4]->SetLabel(buf);
}
if (strstr(label, "SpecLabel6")) {
sprintf(buf, "%s: \t\t %d", title, text);
SpecLabel[5]->SetLabel(buf);
}
}
MainWindow::MainWindow(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame*)NULL,-1,title,pos,size)
{
htmlflag = 0;
wxBitmap OpenIcon = wxBitmap(open_icon);
wxBitmap ExitIcon = wxBitmap(exit_icon);
wxBitmap SaveIcon = wxBitmap(save_icon);
wxBitmap OptionsIcon = wxBitmap(options_icon);
wxBitmap HelpIcon = wxBitmap(help_icon);
wxBitmap CloseIcon = wxBitmap(close_icon);
wxBitmap FileIcon = wxBitmap(file_icon);
wxBitmap HexIcon = wxBitmap(hex_icon);
wxMenuBar *menuBar = new wxMenuBar;
wxMenu *menuFile = new wxMenu;
wxMenuItem *OpenItem = new wxMenuItem(menuFile, ID_Open, "Open", "Open resource file", wxITEM_NORMAL, NULL );
OpenItem->SetBitmap(OpenIcon);
menuFile->Append(OpenItem);
menuFile->AppendSeparator();
wxMenuItem *QuitItem = new wxMenuItem(menuFile, ID_Quit, "Exit", "Exit ScummEX", wxITEM_NORMAL, NULL );
QuitItem->SetBitmap(ExitIcon);
menuFile->Append(QuitItem);
menuBar->Append(menuFile,"&File");
wxMenu *menuTools = new wxMenu;
wxMenuItem *DumpItem = new wxMenuItem(menuTools, ID_Dump, "File Dump...", "Dump block to disk", wxITEM_NORMAL, NULL );
DumpItem->SetBitmap(SaveIcon);
menuTools->Append(DumpItem);
menuTools->Append(ID_SoundStop, "Stop Sounds");
menuBar->Append(menuTools, "&Tools");
wxMenu *menuHelp = new wxMenu;
menuHelp->Append(ID_Help, "Contents");
menuHelp->Append(ID_About,"About...");
menuBar->Append(menuHelp, "&Help");
SetMenuBar(menuBar);
SetThemeEnabled(true);
ToolBar = CreateToolBar(wxTB_FLAT, -1, "toolBar");
ToolBar->SetToolBitmapSize(wxSize(16, 16));
ToolBar->AddTool(ID_Open, "Open", OpenIcon, wxNullBitmap, wxITEM_NORMAL, "Open", "Open resource file", NULL);
ToolBar->AddTool(ID_Close, "Close", CloseIcon, wxNullBitmap, wxITEM_NORMAL, "Close", "Close resource file", NULL);
ToolBar->EnableTool(ID_Close, FALSE);
ToolBar->AddTool(ID_FileInfo, "File Info", FileIcon, wxNullBitmap, wxITEM_NORMAL, "File Info", "Show File Info", NULL);
ToolBar->EnableTool(ID_FileInfo, FALSE);
ToolBar->AddTool(ID_Quit, "Exit", ExitIcon, wxNullBitmap, wxITEM_NORMAL, "Exit", "Exit ScummEX", NULL);
ToolBar->AddSeparator();
ToolBar->AddTool(ID_Dump, "File Dump", SaveIcon, wxNullBitmap, wxITEM_NORMAL, "File Dump", "Dump block to disk", NULL);
ToolBar->EnableTool(ID_Dump, FALSE);
ToolBar->AddTool(ID_View, "Hex Viewer", HexIcon, wxNullBitmap, wxITEM_NORMAL, "Hex Viewer", "View block as hex", NULL);
ToolBar->EnableTool(ID_View, FALSE);
ToolBar->AddTool(Button_Options, "Options", OptionsIcon, wxNullBitmap, wxITEM_NORMAL, "Options", "Options", NULL);
ToolBar->EnableTool(Button_Options, FALSE);
ToolBar->AddSeparator();
ToolBar->AddTool(ID_Help, "Help", HelpIcon, wxNullBitmap, wxITEM_NORMAL, "Help", "View help", NULL);
ToolBar->Realize();
panel = new wxPanel(this, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, "panel");
wxBoxSizer *RootSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer *BlocksSizer = new wxBoxSizer( wxHORIZONTAL );
RootSizer->Add(BlocksSizer,
1,
wxALL|wxEXPAND,
0
);
tree = new wxTreeCtrl(panel, Tree, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTR_HAS_BUTTONS|wxTR_HIDE_ROOT, wxDefaultValidator, "listCtrl");
wxImageList *ImageList = new wxImageList(16, 16, true, 61);
wxIcon icon0 = wxIcon(xpm_0); ImageList->Add(icon0);
wxIcon icon1 = wxIcon(xpm_1); ImageList->Add(icon1);
wxIcon icon2 = wxIcon(xpm_2); ImageList->Add(icon2);
wxIcon icon3 = wxIcon(xpm_3); ImageList->Add(icon3);
wxIcon icon4 = wxIcon(xpm_4); ImageList->Add(icon4);
wxIcon icon5 = wxIcon(xpm_5); ImageList->Add(icon5);
wxIcon icon6 = wxIcon(xpm_6); ImageList->Add(icon6);
wxIcon icon7 = wxIcon(xpm_7); ImageList->Add(icon7);
wxIcon icon8 = wxIcon(xpm_8); ImageList->Add(icon8);
wxIcon icon9 = wxIcon(xpm_9); ImageList->Add(icon9);
wxIcon icon10 = wxIcon(xpm_10); ImageList->Add(icon10);
wxIcon icon11 = wxIcon(xpm_11); ImageList->Add(icon11);
wxIcon icon12 = wxIcon(xpm_12); ImageList->Add(icon12);
wxIcon icon13 = wxIcon(xpm_13); ImageList->Add(icon13);
wxIcon icon14 = wxIcon(xpm_14); ImageList->Add(icon14);
wxIcon icon15 = wxIcon(xpm_15); ImageList->Add(icon15);
wxIcon icon16 = wxIcon(xpm_16); ImageList->Add(icon16);
wxIcon icon17 = wxIcon(xpm_17); ImageList->Add(icon17);
wxIcon icon18 = wxIcon(xpm_18); ImageList->Add(icon18);
wxIcon icon19 = wxIcon(xpm_19); ImageList->Add(icon19);
wxIcon icon20 = wxIcon(xpm_20); ImageList->Add(icon20);
wxIcon icon21 = wxIcon(xpm_21); ImageList->Add(icon21);
wxIcon icon22 = wxIcon(xpm_22); ImageList->Add(icon22);
wxIcon icon23 = wxIcon(xpm_23); ImageList->Add(icon23);
wxIcon icon24 = wxIcon(xpm_24); ImageList->Add(icon24);
wxIcon icon25 = wxIcon(xpm_25); ImageList->Add(icon25);
wxIcon icon26 = wxIcon(xpm_26); ImageList->Add(icon26);
wxIcon icon27 = wxIcon(xpm_27); ImageList->Add(icon27);
wxIcon icon28 = wxIcon(xpm_28); ImageList->Add(icon28);
wxIcon icon29 = wxIcon(xpm_29); ImageList->Add(icon29);
wxIcon icon30 = wxIcon(xpm_30); ImageList->Add(icon30);
wxIcon icon31 = wxIcon(xpm_31); ImageList->Add(icon31);
wxIcon icon32 = wxIcon(xpm_32); ImageList->Add(icon32);
wxIcon icon33 = wxIcon(xpm_33); ImageList->Add(icon33);
wxIcon icon34 = wxIcon(xpm_34); ImageList->Add(icon34);
wxIcon icon35 = wxIcon(xpm_35); ImageList->Add(icon35);
wxIcon icon36 = wxIcon(xpm_36); ImageList->Add(icon36);
wxIcon icon37 = wxIcon(xpm_37); ImageList->Add(icon37);
wxIcon icon38 = wxIcon(xpm_38); ImageList->Add(icon38);
wxIcon icon39 = wxIcon(xpm_39); ImageList->Add(icon39);
wxIcon icon40 = wxIcon(xpm_40); ImageList->Add(icon40);
wxIcon icon41 = wxIcon(xpm_41); ImageList->Add(icon41);
wxIcon icon42 = wxIcon(xpm_42); ImageList->Add(icon42);
wxIcon icon43 = wxIcon(xpm_43); ImageList->Add(icon43);
wxIcon icon44 = wxIcon(xpm_44); ImageList->Add(icon44);
wxIcon icon45 = wxIcon(xpm_45); ImageList->Add(icon45);
wxIcon icon46 = wxIcon(xpm_46); ImageList->Add(icon46);
wxIcon icon47 = wxIcon(xpm_47); ImageList->Add(icon47);
wxIcon icon48 = wxIcon(xpm_48); ImageList->Add(icon48);
wxIcon icon49 = wxIcon(xpm_49); ImageList->Add(icon49);
wxIcon icon50 = wxIcon(xpm_50); ImageList->Add(icon50);
wxIcon icon51 = wxIcon(xpm_51); ImageList->Add(icon51);
wxIcon icon52 = wxIcon(xpm_52); ImageList->Add(icon52);
wxIcon icon53 = wxIcon(xpm_53); ImageList->Add(icon53);
wxIcon icon54 = wxIcon(xpm_54); ImageList->Add(icon54);
wxIcon icon55 = wxIcon(xpm_55); ImageList->Add(icon55);
wxIcon icon56 = wxIcon(xpm_56); ImageList->Add(icon56);
wxIcon icon57 = wxIcon(xpm_57); ImageList->Add(icon57);
wxIcon icon58 = wxIcon(xpm_58); ImageList->Add(icon58);
wxIcon icon59 = wxIcon(xpm_59); ImageList->Add(icon59);
wxIcon icon60 = wxIcon(xpm_60); ImageList->Add(icon60);
tree->AssignImageList(ImageList);
BlocksSizer->Add(tree,
1,
wxALL|wxEXPAND,
4
);
iter[0] = tree->AddRoot("", -1, -1, NULL);
wxBoxSizer *InfosSizer = new wxBoxSizer( wxVERTICAL );
BlocksSizer->Add(InfosSizer,
1,
wxALL|wxEXPAND,
5
);
notebook = new wxNotebook(panel, -1, wxPoint(-1, -1), wxSize(-1, -1), 0, "notebook");
wxNotebookSizer *nbs = new wxNotebookSizer( notebook );
InfosSizer->Add(nbs,
1,
wxALL|wxEXPAND,
0
);
infospanel = new wxPanel(notebook, -1, wxPoint(-1, -1), wxSize(-1, -1), 0, "infopanel");
notebook->AddPage(infospanel, "Explorer", true, -1);
wxBoxSizer *panelsizer = new wxBoxSizer( wxVERTICAL );
wxStaticBox *GenInfosBox = new wxStaticBox(infospanel, -1, "General Block Infos", wxDefaultPosition, wxDefaultSize, 0, "staticBox");
wxStaticBoxSizer *GenInfosHSizer = new wxStaticBoxSizer( GenInfosBox, wxHORIZONTAL );
panelsizer->Add(GenInfosHSizer,
1,
wxALL|wxEXPAND,
0
);
wxBoxSizer *GenInfosSizer = new wxBoxSizer( wxVERTICAL );
GenInfosHSizer->Add(GenInfosSizer,
1,
wxALL|wxEXPAND,
0
);
TypeLabel = new wxStaticText(infospanel, -1, "Type: \t\t n/a", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "TypeLabel");
OffsetLabel = new wxStaticText(infospanel, -1, "Offset: \t\t n/a", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "TypeLabel");
SizeLabel = new wxStaticText(infospanel, -1, "Size: \t\t n/a", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "TypeLabel");
DescriptionLabel = new wxStaticText(infospanel, -1, "Description: \t n/a", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "TypeLabel");
GenInfosSizer->Add(TypeLabel,
0,
wxALL|wxEXPAND,
1
);
GenInfosSizer->Add(OffsetLabel,
0,
wxALL|wxEXPAND,
1
);
GenInfosSizer->Add(SizeLabel,
0,
wxALL|wxEXPAND,
1
);
GenInfosSizer->Add(DescriptionLabel,
0,
wxALL|wxEXPAND,
1
);
wxBoxSizer *IconSizer = new wxBoxSizer( wxVERTICAL );
GenInfosHSizer->Add(IconSizer,
0,
wxALL,
0
);
bigIconBitmap = wxBitmap(xpm_0_big);
BigIcon = new wxStaticBitmap(infospanel, -1, bigIconBitmap, wxPoint(-1, -1), wxSize(-1, -1), wxALIGN_RIGHT);
IconSizer->Add(BigIcon,
0,
wxALL,
0
);
wxStaticBox *SpecInfosBox = new wxStaticBox(infospanel, -1, "Specific Block Infos", wxDefaultPosition, wxDefaultSize, 0, "staticBox");
wxStaticBoxSizer *SpecInfosSizer = new wxStaticBoxSizer( SpecInfosBox, wxVERTICAL );
panelsizer->Add(SpecInfosSizer,
1,
wxALL|wxEXPAND,
0
);
SpecLabel[0] = new wxStaticText(infospanel, -1, "", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "SpecLabel1");
SpecLabel[1] = new wxStaticText(infospanel, -1, "", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "SpecLabel2");
SpecLabel[2] = new wxStaticText(infospanel, -1, "", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "SpecLabel3");
SpecLabel[3] = new wxStaticText(infospanel, -1, "", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "SpecLabel4");
SpecLabel[4] = new wxStaticText(infospanel, -1, "", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "SpecLabel5");
SpecLabel[5] = new wxStaticText(infospanel, -1, "", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "SpecLabel6");
for (int i = 0; i < 6; i++) {
SpecInfosSizer->Add(SpecLabel[i],
0,
wxALL|wxEXPAND,
1
);
}
HtmlHelp = new wxHtmlHelpController(wxHF_DEFAULT_STYLE & wxHF_CONTENTS);
HtmlHelp->AddBook(wxFileName("help/help.hhp"));
wxBoxSizer *SpecButtonsSizer = new wxBoxSizer ( wxHORIZONTAL );
SpecInfosSizer->Add(SpecButtonsSizer,
0,
wxALL,
0
);
SpecButton1 = new wxButton( infospanel, ID_SpecButton1, "", wxPoint(-1, -1), wxSize(110, -1));
SpecButton2 = new wxButton( infospanel, ID_SpecButton2, "", wxPoint(-1, -1), wxSize(110, -1));
SpecButton1->Show(FALSE);
SpecButton2->Show(FALSE);
SpecButtonsSizer->Add( SpecButton1,
1,
wxALL,
3
);
SpecButtonsSizer->Add( SpecButton2,
1,
wxALL,
3
);
infospanel->SetAutoLayout( true );
infospanel->SetSizer( panelsizer );
htmlpanel = new wxPanel(notebook, -1, wxPoint(-1, -1), wxSize(-1, -1), 0, "htmlpanel");
wxBoxSizer *htmlpanelsizer = new wxBoxSizer( wxVERTICAL );
HtmlWindow = new wxHtmlWindow(htmlpanel, -1, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO, "htmlWindow");
htmlpanelsizer->Add(HtmlWindow,
1,
wxALL|wxEXPAND,
0
);
htmlpanel->SetAutoLayout( true );
htmlpanel->SetSizer( htmlpanelsizer );
searchpanel = new wxPanel(notebook, -1, wxPoint(-1, -1), wxSize(-1, -1), 0, "searchpanel");
notebook->AddPage(searchpanel, "Search", false, -1);
wxBoxSizer *SearchPanelSizer = new wxBoxSizer( wxVERTICAL );
wxBoxSizer *SearchControlsSizer = new wxBoxSizer( wxHORIZONTAL );
SearchPanelSizer->Add(SearchControlsSizer,
0,
wxALL|wxEXPAND,
5
);
wxStaticText *FindLabel = new wxStaticText(searchpanel, -1, "Text:", wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE, "FindLabel");
wxTextCtrl *FindTextCtrl = new wxTextCtrl(searchpanel, -1, "", wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, wxTextCtrlNameStr);
wxButton *FindButton = new wxButton(searchpanel, -1, "Search", wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, "button");
SearchControlsSizer->Add(FindLabel,
0,
wxALL,
2
);
SearchControlsSizer->Add(FindTextCtrl,
1,
wxALL,
2
);
SearchControlsSizer->Add(FindButton,
0,
wxALL,
2
);
wxListCtrl *SearchResultsList = new wxListCtrl(searchpanel, -1, wxDefaultPosition, wxDefaultSize, wxLC_REPORT, wxDefaultValidator, "listCtrl");
SearchResultsList->InsertColumn(0, "Block");
SearchResultsList->InsertColumn(1, "Offset");
SearchResultsList->InsertColumn(2, "Found");
SearchPanelSizer->Add(SearchResultsList,
1,
wxALL|wxEXPAND,
0
);
searchpanel->SetAutoLayout( true );
searchpanel->SetSizer( SearchPanelSizer );
panel->SetAutoLayout( TRUE );
panel->SetSizer( RootSizer );
CreateStatusBar();
SetStatusText("Ready.");
SetIcon(wxICON(scummex_icon));
SetSizeHints(640, 480);
}
void MainWindow::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}
void MainWindow::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageDialog *dialog = new wxMessageDialog(this, "\nScummEX 0.1.0cvs (C) 2003 The ScummVM project\n","About", wxOK|wxCENTRE);
dialog->ShowModal();
}
void MainWindow::OnOpen(wxCommandEvent& WXUNUSED(event))
{
wxFileDialog *dialog = new wxFileDialog(frame, "Please select an input file.", "", "",
"All Supported Files|*|Main Resource Files|*.001;*.la1;*.la2;*.lab;*.lfl;*.lec;*.sm1|Directory Files|*.000;*.la0;*.lfl;*.sm0",
wxOPEN);
if (dialog->ShowModal() == wxID_OK) {
file = (const char*)dialog->GetPath();
tree->DeleteChildren(iter[0]);
_scummex->getFileType(file);
}
}
void MainWindow::OnSelChanged(wxTreeEvent& event) {
int itemid, itemtype;
bool val1, val2;
itemid = event.GetItem();
TreeItemData *item = (TreeItemData *)tree->GetItemData(itemid);
for (int i = 0; i < 6; i++)
SpecLabel[i]->SetLabel("");
SpecButton1->Show(FALSE);
SpecButton2->Show(FALSE);
ToolBar->EnableTool(ID_Dump, TRUE);
ToolBar->EnableTool(ID_View, TRUE);
val1 = SpecButton1->Disconnect(ID_SpecButton1, wxEVT_COMMAND_BUTTON_CLICKED);
val2 = SpecButton2->Disconnect(ID_SpecButton2, wxEVT_COMMAND_BUTTON_CLICKED);
itemtype = item->_blockType;
switch (itemtype) {
case LECF:
case LABN:
case LB83:
case LE:
bigIconBitmap = wxBitmap(xpm_6_big);
break;
case LOFF:
case OFFS:
case FO:
bigIconBitmap = wxBitmap(xpm_44_big);
break;
case LFLF:
case LF:
bigIconBitmap = wxBitmap(xpm_58_big);
break;
case ROOM:
case RO:
bigIconBitmap = wxBitmap(xpm_38_big);
break;
case RMHD:
case HD:
bigIconBitmap = wxBitmap(xpm_35_big);
break;
case CYCL:
case CC:
bigIconBitmap = wxBitmap(xpm_12_big);
break;
case TRNS:
bigIconBitmap = wxBitmap(xpm_46_big);
break;
case EPAL:
case CLUT:
case APAL:
case NPAL:
case XPAL:
case PA:
bigIconBitmap = wxBitmap(xpm_34_big);
break;
case BOXD:
case BX:
bigIconBitmap = wxBitmap(xpm_4_big);
break;
case BOXM:
bigIconBitmap = wxBitmap(xpm_5_big);
break;
case SCAL:
case SA:
bigIconBitmap = wxBitmap(xpm_40_big);
break;
case RMIM:
case BM:
bigIconBitmap = wxBitmap(xpm_37_big);
break;
case EXCD:
case EX:
bigIconBitmap = wxBitmap(xpm_22_big);
break;
case ENCD:
case EN:
bigIconBitmap = wxBitmap(xpm_21_big);
break;
case NLSC:
case SCRP:
case LSCR:
case OC:
case NL:
case LS:
case SC:
bigIconBitmap = wxBitmap(xpm_41_big);
break;
case SOUN:
case SOU:
case iMUS:
case cus2:
case IMC:
case SO:
bigIconBitmap = wxBitmap(xpm_59_big);
break;
case RMIH:
bigIconBitmap = wxBitmap(xpm_36_big);
break;
case IM00:
case IM01:
case IM02:
case IM03:
case IM04:
case IM05:
case IM06:
case IM07:
case IM08:
case IM09:
case IMAG:
bigIconBitmap = wxBitmap(xpm_25_big);
break;
case SMAP:
case TBSTR:
bigIconBitmap = wxBitmap(xpm_42_big);
break;
case OBIM:
case OI:
bigIconBitmap = wxBitmap(xpm_33_big);
break;
case IMHD:
bigIconBitmap = wxBitmap(xpm_26_big);
break;
case OBCD:
case RMSC:
bigIconBitmap = wxBitmap(xpm_57_big);
break;
case CDHD:
bigIconBitmap = wxBitmap(xpm_7_big);
break;
case VERB:
bigIconBitmap = wxBitmap(xpm_50_big);
break;
case OBNA:
case TEXT:
bigIconBitmap = wxBitmap(xpm_45_big);
break;
case VCTL:
bigIconBitmap = wxBitmap(xpm_15_big);
break;
case Crea:
bigIconBitmap = wxBitmap(xpm_16_big);
break;
case MAXS:
bigIconBitmap = wxBitmap(xpm_2_big);
break;
case DROO:
bigIconBitmap = wxBitmap(xpm_18_big);
break;
case DSCR:
bigIconBitmap = wxBitmap(xpm_19_big);
break;
case DSOU:
bigIconBitmap = wxBitmap(xpm_20_big);
break;
case DCOS:
bigIconBitmap = wxBitmap(xpm_14_big);
break;
case DCHR:
bigIconBitmap = wxBitmap(xpm_13_big);
break;
case DOBJ:
bigIconBitmap = wxBitmap(xpm_17_big);
break;
case COMP:
case MCMP:
bigIconBitmap = wxBitmap(xpm_9_big);
break;
case MAP:
bigIconBitmap = wxBitmap(xpm_29_big);
break;
case FRMT:
bigIconBitmap = wxBitmap(xpm_51_big);
break;
case SYNC:
bigIconBitmap = wxBitmap(xpm_43_big);
break;
case REGN:
case STOP:
case JUMP:
bigIconBitmap = wxBitmap(xpm_27_big);
break;
case DATA:
bigIconBitmap = wxBitmap(xpm_16_big);
break;
case WRAP:
bigIconBitmap = wxBitmap(xpm_60_big);
break;
case ZP01:
case ZP02:
case ZP03:
bigIconBitmap = wxBitmap(xpm_52_big);
break;
case COST:
case CO:
bigIconBitmap = wxBitmap(xpm_11_big);
break;
case PALS:
bigIconBitmap = wxBitmap(xpm_56_big);
break;
case ANIM:
case FRME:
bigIconBitmap = wxBitmap(xpm_55_big);
break;
case FOBJ:
bigIconBitmap = wxBitmap(xpm_32_big);
break;
case AHDR:
bigIconBitmap = wxBitmap(xpm_1_big);
break;
case PSAD:
case SAUD:
case STRK:
case SDAT:
case IACT:
bigIconBitmap = wxBitmap(xpm_24_big);
break;
case ADL:
case SPK:
case ROL:
bigIconBitmap = wxBitmap(xpm_31_big);
break;
default:
bigIconBitmap = wxBitmap(xpm_47_big);
break;
}
if (blocksInfo[itemtype].html == 1) {
if (htmlflag == 0) {
notebook->AddPage(htmlpanel, "Block Specifications", false, -1);
notebook->Refresh();
}
HtmlWindow->LoadPage(blocksInfo[itemtype].htmlfile);
htmlflag = 1;
} else if (htmlflag == 1) {
notebook->SetSelection(0);
notebook->RemovePage(notebook->GetPageCount() -1);
notebook->Refresh();
htmlflag = 0;
}
BigIcon->SetBitmap(bigIconBitmap);
_scummex->UpdateInfosFromTree(item->_blockId);
event.Skip();
}