Rev 226 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "../StdAfx.h"#include "SpkForm.h"#include "Form1.h"#include "ExtractDialog.h"#include "AddDialog.h"#include "DropFileDialog.h"#include "..\..\Creator\src\Forms\SelectGame.h"#include <spk.h>using namespace System::Windows;using namespace System::Windows::Forms;namespace SpkExplorer {SpkForm::SpkForm(System::Windows::Forms::Form ^parent, System::Windows::Forms::TabControl ^ctrl, System::Windows::Forms::TabPage ^page, CPackages *packages){InitializeComponent();this->AllowDrop = true;ImageList ^list1 = gcnew ImageList();ImageList ^list2 = gcnew ImageList();list1->ImageSize.Height = 32;list1->ImageSize.Width = 32;list2->ImageSize.Height = 16;list2->ImageSize.Width = 16;this->AddImage("$IMAGELIST:script.png", list1, _US(Utils::WString::Number(FILETYPE_SCRIPT)));this->AddImage("$IMAGELIST:textfile.png", list1, _US(Utils::WString::Number(FILETYPE_TEXT)));this->AddImage("$IMAGELIST:readme.png", list1, _US(Utils::WString::Number(FILETYPE_README)));this->AddImage("$IMAGELIST:map.png", list1, _US(Utils::WString::Number(FILETYPE_MAP)));this->AddImage("$IMAGELIST:mods.png", list1, _US(Utils::WString::Number(FILETYPE_MOD)));this->AddImage("$IMAGELIST:uninstall.png", list1, _US(Utils::WString::Number(FILETYPE_UNINSTALL)));this->AddImage("$IMAGELIST:sound.png", list1, _US(Utils::WString::Number(FILETYPE_SOUND)));this->AddImage("$IMAGELIST:extras.png", list1, _US(Utils::WString::Number(FILETYPE_EXTRA)));this->AddImage("$IMAGELIST:screenshot.png", list1, _US(Utils::WString::Number(FILETYPE_SCREEN)));this->AddImage("$IMAGELIST:backup.png", list1, _US(Utils::WString::Number(FILETYPE_BACKUP)));this->AddImage("$IMAGELIST:mission.png", list1, _US(Utils::WString::Number(FILETYPE_MISSION)));this->AddImage("$IMAGELIST:advert.png", list1, _US(Utils::WString::Number(FILETYPE_ADVERT)));this->AddImage("$IMAGELIST:shipother.png", list1, _US(Utils::WString::Number(FILETYPE_SHIPOTHER)));this->AddImage("$IMAGELIST:shipmodel.png", list1, _US(Utils::WString::Number(FILETYPE_SHIPMODEL)));this->AddImage("$IMAGELIST:shipscene.png", list1, _US(Utils::WString::Number(FILETYPE_SHIPSCENE)));this->AddImage("$IMAGELIST:cockpitscene.png", list1, _US(Utils::WString::Number(FILETYPE_COCKPITSCENE)));this->AddImage("$IMAGELIST:script.png", list2, _US(Utils::WString::Number(FILETYPE_SCRIPT)));this->AddImage("$IMAGELIST:textfile.png", list2, _US(Utils::WString::Number(FILETYPE_TEXT)));this->AddImage("$IMAGELIST:readme.png", list2, _US(Utils::WString::Number(FILETYPE_README)));this->AddImage("$IMAGELIST:map.png", list2, _US(Utils::WString::Number(FILETYPE_MAP)));this->AddImage("$IMAGELIST:mods.png", list2, _US(Utils::WString::Number(FILETYPE_MOD)));this->AddImage("$IMAGELIST:uninstall.png", list2, _US(Utils::WString::Number(FILETYPE_UNINSTALL)));this->AddImage("$IMAGELIST:sound.png", list2, _US(Utils::WString::Number(FILETYPE_SOUND)));this->AddImage("$IMAGELIST:extras.png", list2, _US(Utils::WString::Number(FILETYPE_EXTRA)));this->AddImage("$IMAGELIST:screenshot.png", list2, _US(Utils::WString::Number(FILETYPE_SCREEN)));this->AddImage("$IMAGELIST:backup.png", list2, _US(Utils::WString::Number(FILETYPE_BACKUP)));this->AddImage("$IMAGELIST:mission.png", list2, _US(Utils::WString::Number(FILETYPE_MISSION)));this->AddImage("$IMAGELIST:advert.png", list2, _US(Utils::WString::Number(FILETYPE_ADVERT)));this->AddImage("$IMAGELIST:shipother.png", list2, _US(Utils::WString::Number(FILETYPE_SHIPOTHER)));this->AddImage("$IMAGELIST:shipmodel.png", list2, _US(Utils::WString::Number(FILETYPE_SHIPMODEL)));this->AddImage("$IMAGELIST:shipscene.png", list2, _US(Utils::WString::Number(FILETYPE_SHIPSCENE)));this->AddImage("$IMAGELIST:cockpitscene.png", list2, _US(Utils::WString::Number(FILETYPE_COCKPITSCENE)));listView1->LargeImageList = list1;listView1->SmallImageList = list2;m_bLoading = false;this->MdiParent = parent;m_pTabCtrl = ctrl;m_pTabPage = page;m_bSortingAsc = true;m_iSortingCol = 1;m_bSortingAsc2 = true;m_iSortingCol2 = 1;m_pListItem = nullptr;_pPackages = packages;this->Closing += gcnew CancelEventHandler(this, &SpkForm::Event_Closing);this->Activated += gcnew System::EventHandler(this, &SpkForm::Event_Activated);this->listView1->ColumnClick += gcnew ColumnClickEventHandler(this, &SpkForm::SortList);this->contextMenuStrip1->Opening += gcnew CancelEventHandler(this, &SpkExplorer::SpkForm::OpenContextMenu);this->listView1->DragOver += gcnew DragEventHandler(this, &SpkExplorer::SpkForm::DragEnterEvent);this->listView1->ItemDrag += gcnew ItemDragEventHandler(this, &SpkExplorer::SpkForm::ItemDragEvent);m_pSelectedPackage = NULL;m_pPackage = NULL;m_pMultiPackage = NULL;}SpkForm::~SpkForm(){delete m_pMenuItem;if (components){delete components;}}bool SpkForm::IsMultiPackage(){return (m_pMultiPackage) ? true : false;}void SpkForm::SetToolButton(ToolStripMenuItem ^menu){m_pMenuItem = menu;}void SpkForm::SetPackage(CBaseFile *p, System::String ^filename){this->splitContainer1->Panel1Collapsed = true;m_pPackage = p;m_pTabPage->Text = System::IO::FileInfo(filename).Name;if ( p->filename().empty() )p->setFilename(_WS(filename));this->UpdateView(false);m_pPackage->adjustChanged(false);this->Text = filename;m_sFilename = filename;}void SpkForm::SetMultiPackage(CMultiSpkFile *p, System::String ^filename){this->splitContainer1->Panel1Collapsed = false;m_pMultiPackage = p;m_pTabPage->Text = System::IO::FileInfo(filename).Name;if (p->filename().empty())p->setFilename(_WS(filename));this->UpdateView(false);this->Text = filename;m_sFilename = filename;// read the iconsfor ( SMultiSpkFile *package = p->GetFileList()->First(); package; package = p->GetFileList()->Next() ){if ( !package->pFile )continue;if ( package->pFile->icon() ){package->pFile->ReadIconFileToMemory();Utils::WString sIconFile = _WS(IO::Path::GetTempPath()) + L"\\" + CFileIO(package->sName).baseName() + L"." + package->pFile->iconExt();if ( package->pFile->extractFile(package->pFile->icon(), CFileIO(sIconFile).fullFilename(), false)){String ^iconFile = _US(sIconFile);if ( IO::File::Exists(iconFile) ){String ^file = _US(package->sName);String ^ext = System::IO::FileInfo(iconFile).Extension;if ( !String::Compare(ext, "bmp", false) || !String::Compare(ext, "ico", false) )this->imageList1->Images->Add(file, Bitmap::FromFile(iconFile));else{Bitmap ^myBitmap = gcnew Bitmap(iconFile);if ( myBitmap )this->imageList1->Images->Add(file, myBitmap);}}}}}}bool SpkForm::CheckFilename(System::String ^filename){if ( filename == m_sFilename )return true;return false;}void SpkForm::UpdateView(bool onlyPackage){m_bLoading = true;m_bSortingAsc = true;m_iSortingCol = 0;m_bSortingAsc2 = true;m_iSortingCol2 = 0;this->listView1->Items->Clear();if ( m_pPackage ){int pos = 0;for ( C_File *file = m_pPackage->GetFileList()->First(); file; file = m_pPackage->GetFileList()->Next() ){file->SetPos(pos++);this->AddFile(file);}}listView1->ArrangeIcons();this->listView1->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);this->listView1->ListViewItemSorter = gcnew ListViewItemComparer(m_iSortingCol, !m_bSortingAsc);if ( m_pMultiPackage && !onlyPackage ){this->listView2->Items->Clear();int pos = 0;for ( SMultiSpkFile *file = m_pMultiPackage->GetFileList()->First(); file; file = m_pMultiPackage->GetFileList()->Next() ){file->iPos = pos++;this->AddMultiFile(file);}listView2->ArrangeIcons();this->listView2->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);this->listView2->ListViewItemSorter = gcnew ListViewItemComparer(m_iSortingCol2, !m_bSortingAsc2);}m_bLoading = false;}void SpkForm::AddImage(System::String ^filename, ImageList ^list, System::String ^key){System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(SpkForm::typeid));bool added = false;if ( filename->StartsWith("$RESOURCE:") ){filename = filename->Remove(0, 10);if ( filename->StartsWith("BITMAP:") ){filename = filename->Remove(0, 7);System::Drawing::Bitmap ^bitmap = (cli::safe_cast<System::Drawing::Bitmap^ >(resources->GetObject(filename)));if ( bitmap ){IntPtr Hicon = bitmap->GetHicon();System::Drawing::Icon ^newIcon = ::Icon::FromHandle(Hicon);list->Images->Add(key, newIcon);added = true;}}else{System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^ >(resources->GetObject(filename)));list->Images->Add(key, icon);added = true;}}else if ( filename->StartsWith("$IMAGELIST:") ){filename = filename->Remove(0, 11);int index = this->imageList1->Images->IndexOfKey(filename);if ( index != -1 ){list->Images->Add(key, this->imageList1->Images[index]);added = true;}}else if ( System::IO::File::Exists(filename) ){Utils::WString sF = _WS(filename);if ( CFileIO(sF).isFileExtension(L"bmp") ){list->Images->Add(key, Bitmap::FromFile(filename));added = true;}else{Bitmap ^myBitmap = gcnew Bitmap(filename);if ( myBitmap ){IntPtr Hicon = myBitmap->GetHicon();System::Drawing::Icon ^newIcon = ::Icon::FromHandle(Hicon);list->Images->Add(key, newIcon);added = true;}}}if ( !added ){System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^ >(resources->GetObject(L"$this.Icon")));list->Images->Add(key, icon);}}void SpkForm::AddFile(C_File *file){ListViewItem ^item = gcnew ListViewItem(_US(file->getNameDirectory(NULL)));item->SubItems->Add(_US(file->uncompressedSizeString()));item->SubItems->Add(_US(file->fileTypeString()));item->SubItems->Add(_US(file->creationTimeString()));item->Tag = _US(Utils::WString::Number(file->GetPos()));item->ImageKey = _US(Utils::WString::Number(file->GetFileType()));if ( !file->game() || file->game() == GAME_ALLNEW) {item->SubItems->Add("All Games");}else {if (file->game() & GAME_ALLNEW){Utils::WString sGames = L"";for (int i = 0; i < 31; ++i){if (file->game() & (1 << i)){Utils::WString sGame;SGameExe *exe = _pPackages->GetGameExe()->game(i - 1);sGame = (exe) ? exe->sName : (L"Game: " + Utils::WString::Number(i));if (sGames.empty())sGames = sGame;elsesGames = sGames + L", " + sGame;}}if(sGames.empty())item->SubItems->Add(L"All Games");elseitem->SubItems->Add(_US(sGames));}else{SGameExe *exe = _pPackages->GetGameExe()->game(file->game() - 1);if (exe) {item->SubItems->Add(_US(exe->sName));}else {item->SubItems->Add("Game: " + file->game());}}}this->listView1->Items->Add(item);}void SpkForm::AddMultiFile(SMultiSpkFile *file){ListViewItem ^item = gcnew ListViewItem(_US(file->sName));if ( file->iType == TYPE_XSP )item->SubItems->Add("Ship");elseitem->SubItems->Add("Package");item->SubItems->Add(_US(SPK::GetSizeString(file->lSize)));item->Tag = _US(Utils::WString::Number(file->iPos));if ( this->imageList1->Images->IndexOfKey(_US(file->sName)) == -1 )item->ImageKey = "package";elseitem->ImageKey = _US(file->sName);this->listView2->Items->Add(item);}System::Void SpkForm::Event_Activated(System::Object^ sender, System::EventArgs^ e){m_pTabCtrl->SelectedTab = m_pTabPage;this->Text = m_pTabPage->Text;((Form1 ^)this->MdiParent)->UpdateDisplay();this->SelectedCheck();}System::Void SpkForm::Event_Closing(System::Object^ sender, CancelEventArgs^ e){delete m_pPackage;delete m_pTabPage;m_sFilename = "";((Form1 ^)this->MdiParent)->RemoveCopied(true);((Form1 ^)this->MdiParent)->UpdateDisplay();((Form1 ^)this->MdiParent)->SelectedFile(false);}void SpkForm::SelectedCheck(){if ( m_pMultiPackage ){((Form1 ^)this->MdiParent)->SelectedPackage(this->IsSelected(), this->IsPackageSelected());if ( this->IsPackageSelected() ){Point ^mousePoint = this->listView2->PointToClient(this->listView2->MousePosition);ListViewItem ^item = this->listView2->GetItemAt(mousePoint->X, mousePoint->Y);if ( item ){int num = System::Convert::ToInt32(item->Tag);m_pSelectedPackage = m_pMultiPackage->GetFileList()->Get(num);if ( m_pSelectedPackage ){m_pPackage = m_pSelectedPackage->pFile;this->UpdateView(true);}}}else{m_pPackage = NULL;m_pSelectedPackage = NULL;this->UpdateView(true);}}else((Form1 ^)this->MdiParent)->SelectedFile(this->IsSelected());}bool SpkForm::IsSelected(){if ( this->listView1->SelectedItems->Count )return true;return false;}bool SpkForm::IsPackageSelected(){if ( this->listView2->SelectedItems->Count )return true;return false;}void SpkForm::DoExtract(CLinkList<C_File> *list, System::String ^toDir, int game){if ( !toDir )return;// read the spk file to memory before trying to extract its filesif ( !this->ReadMultiPackage() )return;ExtractDialog ^ed = gcnew ExtractDialog(list, toDir, m_pPackage, game, _pPackages);ed->ShowDialog((Form1 ^)this->MdiParent);if ( ed->OK() && !ed->Canceled() && ed->ExtractedCount() )MessageBox::Show(this, "Files have been extracting successfully to:\n" + toDir, "Extacted", MessageBoxButtons::OK, MessageBoxIcon::Information);}bool SpkForm::ReadSelectedMultiPackage(){if ( m_pMultiPackage && m_pSelectedPackage ){if ( !m_pMultiPackage->ReadSpk(m_pSelectedPackage, SPKREAD_ALL) )return false;}return true;}bool SpkForm::ReadMultiPackage(){if ( m_pMultiPackage ){if ( !m_pMultiPackage->readAllPackages(SPKREAD_ALL) )return false;}return true;}void SpkForm::DoPackageExtract(CLinkList<SMultiSpkFile> *list, System::String ^toDir){if ( !toDir )return;ExtractDialog ^ed = gcnew ExtractDialog(list, toDir, m_pMultiPackage, _pPackages);ed->ShowDialog((Form1 ^)this->MdiParent);if ( ed->OK() && !ed->Canceled() )MessageBox::Show(this, "Files have been extracting successfully to:\n" + toDir, "Extacted", MessageBoxButtons::OK, MessageBoxIcon::Information);}System::String ^SpkForm::GetExtractDir(bool package){FolderBrowserDialog ^fbd = gcnew FolderBrowserDialog;if ( package )fbd->Description = "Select the path to extract packages to";elsefbd->Description = "Select the path to extract files to";if ( fbd->ShowDialog(this) == System::Windows::Forms::DialogResult::OK )return fbd->SelectedPath;return nullptr;}void SpkForm::ExtractSelected(System::String ^toDir){if ( !m_pPackage )return;Utils::WString sToDir = _WS(toDir);CLinkList<C_File> list;for ( int i = 0; i < this->listView1->SelectedItems->Count; i++ ){int pos = _WS(cli::safe_cast<System::String ^>(this->listView1->SelectedItems[i]->Tag)).toInt();C_File *f = m_pPackage->GetFileList()->Get(pos);list.push_back(f);}this->DoExtract(&list, toDir, -1);list.clear();}void SpkForm::ExtractSelectedPackage(System::String ^toDir){if ( !m_pMultiPackage )return;Utils::WString sToDir = _WS(toDir);CLinkList<SMultiSpkFile> list;for ( int i = 0; i < this->listView2->SelectedItems->Count; i++ ){int pos = _WS(cli::safe_cast<System::String ^>(this->listView2->SelectedItems[i]->Tag)).toInt();SMultiSpkFile *mp = m_pMultiPackage->GetFileList()->Get(pos);if ( mp )list.push_back(mp);}this->DoPackageExtract(&list, toDir);list.clear();}void SpkForm::RemoveItem(ListViewItem ^item){if ( !item )return;AddDialog ^ad = gcnew AddDialog(m_pPackage, m_pMultiPackage);ad->SetRemove();int pos = _WS(cli::safe_cast<System::String ^>(item->Tag)).toInt();C_File *f = m_pPackage->GetFileList()->Get(pos);if ( f )ad->AddFile(_US(f->name()), _US(f->dir()), f->GetFileType(), f->GetGame());// remove the dat or cat file as wellif ( f->GetFileType() == FILETYPE_MOD ){if ( f->checkFileExt(L"cat") ){C_File *datFile = m_pPackage->findFile(CFileIO(f).changeFileExtension(L"dat"), FILETYPE_MOD, L"", f->GetGame());if ( datFile )ad->AddFile(_US(datFile->name()), _US(datFile->dir()), datFile->GetFileType(), datFile->GetGame());}else if ( f->checkFileExt(L"dat") ){C_File *datFile = m_pPackage->findFile(CFileIO(f).changeFileExtension(L"cat"), FILETYPE_MOD, L"", f->GetGame());if ( datFile )ad->AddFile(_US(datFile->name()), _US(datFile->dir()), datFile->GetFileType(), datFile->GetGame());}}ad->ShowDialog(this);this->UpdateView(true);}void SpkForm::RemoveSelected(){if ( !m_pPackage )return;AddDialog ^ad = gcnew AddDialog(m_pPackage, m_pMultiPackage);ad->SetRemove();for ( int i = 0; i < this->listView1->SelectedItems->Count; i++ ){int pos = _WS(cli::safe_cast<System::String ^>(this->listView1->SelectedItems[i]->Tag)).toInt();C_File *f = m_pPackage->GetFileList()->Get(pos);if ( f )ad->AddFile(_US(f->name()), _US(f->dir()), f->GetFileType(), f->GetGame());// remove the dat or cat file as wellif ( f->GetFileType() == FILETYPE_MOD ){if ( f->checkFileExt(L"cat") ){C_File *datFile = m_pPackage->findFile(CFileIO(f).changeFileExtension(L"dat"), FILETYPE_MOD, L"", f->GetGame());if ( datFile )ad->AddFile(_US(datFile->name()), _US(datFile->dir()), datFile->GetFileType(), datFile->GetGame());}else if ( f->checkFileExt(L"dat") ){C_File *datFile = m_pPackage->findFile(CFileIO(f).changeFileExtension(L"cat"), FILETYPE_MOD, L"", f->GetGame());if ( datFile )ad->AddFile(_US(datFile->name()), _US(datFile->dir()), datFile->GetFileType(), datFile->GetGame());}}}ad->ShowDialog(this);this->UpdateView(true);}void SpkForm::RemoveSelectedPackage(){if ( !m_pMultiPackage )return;AddDialog ^ad = gcnew AddDialog(NULL, m_pMultiPackage);ad->SetRemove();for ( int i = 0; i < this->listView2->SelectedItems->Count; i++ ){int pos = System::Convert::ToInt32(this->listView2->SelectedItems[i]->Tag);SMultiSpkFile *mp = m_pMultiPackage->GetFileList()->Get(pos);if ( mp )ad->AddFile(_US(mp->sName), "", -1, 0);}if ( ad->AnyFiles() ){ad->ShowDialog(this);this->UpdateView(false);}}void SpkForm::ExtractAll(System::String ^toDir){int game = 0;if ( m_pPackage->IsMultipleGamesInPackage() ) {Creator::SelectGame ^selGame = gcnew Creator::SelectGame("Select game to extract", NULL);if ( selGame->ShowDialog(this) == Windows::Forms::DialogResult::OK ) {game = selGame->GetGame() + 1;}elsereturn;}else if ( m_pPackage->IsAnyGameInPackage() ) {game = m_pPackage->FindFirstGameInPackage();}this->DoExtract(m_pPackage->GetFileList(), toDir, game);}void SpkForm::ExtractAllPackage(System::String ^toDir){if ( !m_pMultiPackage )return;this->DoPackageExtract(m_pMultiPackage->GetFileList(), toDir);}System::Void SpkForm::DragEnterEvent(System::Object ^Sender, DragEventArgs ^E){E->Effect = DragDropEffects::None;if ( !m_pPackage )return;if ( ((Form1 ^)this->MdiParent)->DragFromForm() && ((Form1 ^)this->MdiParent)->DragFromForm() != this ){if ((E->KeyState & 4) == 4 && (E->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move)E->Effect = DragDropEffects::Move;else if ((E->KeyState & 8) == 8 && (E->AllowedEffect & DragDropEffects::Copy) == DragDropEffects::Copy)E->Effect = DragDropEffects::Copy;else if ((E->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move)E->Effect = DragDropEffects::Move;}else if ( E->Data->GetDataPresent(DataFormats::FileDrop) )E->Effect = DragDropEffects::Copy;}void SpkForm::DropGetDirectories(String ^dir, Utils::WStringList *list, bool packages){cli::array<String ^> ^dirList = IO::Directory::GetFileSystemEntries(dir);for ( int j = 0; j < dirList->Length; j++ ){if ( IO::DirectoryInfo(dirList[j]).Exists )this->DropGetDirectories(dirList[j], list, packages);else{if ( packages )list->pushBack(_WS(dirList[j]), L"-1");elselist->pushBack(_WS(dirList[j]), Utils::WString::Number(SPK::GetAutomaticFiletype(_WS(dirList[j]), NULL, false)));}}}System::Void SpkForm::listView2_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ E){if ( !m_pMultiPackage )return;if ( E->Data->GetDataPresent(DataFormats::FileDrop) ){Utils::WStringList fileList;cli::array<String ^> ^a = (cli::array<String ^> ^)E->Data->GetData(DataFormats::FileDrop, false);int i;for(i = 0; i < a->Length; i++){if ( IO::DirectoryInfo(a[i]).Exists )this->DropGetDirectories(a[i], &fileList, true);elsefileList.pushBack(_WS(a[i]), L"-1");}// remove invalid filesif ( !fileList.empty() ){AddDialog ^ad = gcnew AddDialog(NULL, m_pMultiPackage);for(auto itr = fileList.begin(); itr != fileList.end(); itr++){if ((*itr)->data != L"-1")continue;Utils::WString ext = CFileIO((*itr)->str).extension();if ( !ext.Compare(L"xsp") && !ext.Compare(L"spk") )continue;ad->AddFile(_US((*itr)->str), "", -1, 0);}ad->ShowDialog(this);this->UpdateView(false);}}}System::Void SpkForm::listView1_DragDrop(System::Object^ sender, System::Windows::Forms::DragEventArgs^ E){// dropping from outsideif ( E->Data->GetDataPresent(DataFormats::FileDrop) ){Utils::WStringList fileList;cli::array<String ^> ^a = (cli::array<String ^> ^)E->Data->GetData(DataFormats::FileDrop, false);int i;for(i = 0; i < a->Length; i++){if ( IO::DirectoryInfo(a[i]).Exists )this->DropGetDirectories(a[i], &fileList, false);elsefileList.pushBack(_WS(a[i]), Utils::WString::Number(SPK::GetAutomaticFiletype(_WS(a[i]), NULL, false)));}SPK::AssignAutomaticFiletypes(fileList);if ( !fileList.empty() ){DropFileDialog ^dropType = gcnew DropFileDialog(&fileList);if ( dropType->ShowDialog(this) == Forms::DialogResult::OK ){AddDialog ^ad = gcnew AddDialog(m_pPackage, NULL);for(auto itr = fileList.begin(); itr != fileList.end(); itr++){int type = (*itr)->data.token(L" ", 1).toInt();if ( type == -1 )continue;ad->AddFile(_US((*itr)->str), "", type, 0);}if ( ad->AnyFiles() ){ad->ShowDialog(this);this->UpdateView(false);}}}return;}bool copy = false;if ((E->KeyState & 8) == 8 && (E->AllowedEffect & DragDropEffects::Copy) == DragDropEffects::Copy)copy = true;((Form1 ^)this->MdiParent)->Dragged(this, copy);}System::Void SpkForm::ItemDragEvent(System::Object ^Sender, ItemDragEventArgs ^E){if ( this->listView1->SelectedItems->Count ){ListView::SelectedListViewItemCollection^ selected = this->listView1->SelectedItems;System::Collections::IEnumerator^ myEnum = selected->GetEnumerator();ArrayList ^list = gcnew ArrayList();while ( myEnum->MoveNext() ){C_File *f = this->GetFileFromItem(safe_cast<ListViewItem ^>(myEnum->Current));((Form1 ^)this->MdiParent)->DragFile(f, this);list->Add(safe_cast<ListViewItem ^>(myEnum->Current)->Text);}DataObject ^data = gcnew DataObject(DataFormats::FileDrop, list);for ( int i = 0; i < list->Count; i++ )data->SetData(DataFormats::StringFormat, Convert::ToString(list[i]));this->listView1->DoDragDrop(data, DragDropEffects::Move | DragDropEffects::Copy);}}System::Void SpkForm::OpenContextMenu(System::Object ^Sender, CancelEventArgs ^E){ListViewItem ^item = this->FindSelectedItem();if ( item ){m_pListItem = item;this->ContextName->Text = System::IO::FileInfo(item->Text).Name;if ( item->ImageKey ){int key = this->listView1->LargeImageList->Images->IndexOfKey(item->ImageKey);if ( key != -1 )this->ContextName->Image = this->listView1->LargeImageList->Images[key];}if ( ((Form1 ^)this->MdiParent)->CopiedFiles()->empty() )this->ToolPaste->Enabled = false;elsethis->ToolPaste->Enabled = true;E->Cancel = false;}elseE->Cancel = true;}ListViewItem ^SpkForm::FindSelectedItem(){Point ^mousePoint = this->listView1->PointToClient(this->contextMenuStrip1->MousePosition);return this->listView1->GetItemAt(mousePoint->X, mousePoint->Y);}C_File *SpkForm::GetFileFromItem(ListViewItem ^item){int num = System::Convert::ToInt32(item->Tag);return m_pPackage->GetFileList()->Get(num);}void SpkForm::CopyFile(){if ( !m_pListItem )return;C_File *f = this->GetFileFromItem(m_pListItem);if ( f ){if ( m_pMultiPackage && m_pSelectedPackage )m_pMultiPackage->ReadSpk(m_pSelectedPackage, SPKREAD_ALL);else if ( !m_pMultiPackage )m_pPackage->ReadFileToMemory(f);elsereturn;f = this->GetFileFromItem(m_pListItem);((Form1 ^)this->MdiParent)->CopyFile(f, true);}}void SpkForm::CutFile(){if ( !m_pListItem )return;C_File *f = this->GetFileFromItem(m_pListItem);if ( f ){if ( !this->ReadPackageFiles(false) )return;f = this->GetFileFromItem(m_pListItem);if ( f ){((Form1 ^)this->MdiParent)->CutFile(f, this, true);m_pPackage->GetFileList()->remove(f, false);this->WritePackage();this->UpdateView(true);}}}void SpkForm::DroppedFile(C_File *f){if ( m_pPackage->GetFileList()->FindData(f) )return;this->ReadPackageFiles(false);m_pPackage->AddFile(f);this->WritePackage();this->UpdateView(true);}void SpkForm::DraggedFile(C_File *f){if ( !m_pPackage )return;if ( !m_pPackage->GetFileList()->FindData(f) )return;this->ReadPackageFiles(false);m_pPackage->GetFileList()->remove(f, false);this->WritePackage();this->UpdateView(true);}bool SpkForm::ReadPackageFiles(bool all){if ( m_pMultiPackage ){if ( all ){if ( !m_pMultiPackage->readAllPackages(SPKREAD_ALL) )return false;}else if ( m_pSelectedPackage ){if ( !m_pMultiPackage->ReadSpk(m_pSelectedPackage, SPKREAD_ALL) )return false;}}elsem_pPackage->ReadAllFilesToMemory();return true;}void SpkForm::WritePackage(){if ( m_pMultiPackage ){m_pMultiPackage->readAllPackages();m_pMultiPackage->UpdatedPackage(m_pPackage);m_pMultiPackage->writeFile(m_pMultiPackage->filename());}elsem_pPackage->writeFile(m_pPackage->filename());}void SpkForm::PasteFiles(CLinkList<C_File> *list){if ( m_pMultiPackage && m_pSelectedPackage )m_pMultiPackage->ReadSpk(m_pSelectedPackage, SPKREAD_ALL);else if ( !m_pMultiPackage )m_pPackage->ReadAllFilesToMemory();elsereturn;for ( C_File *f = list->First(); f; f= list->Next() ){// check if we copied this file alreadyif ( m_pPackage->GetFileList()->FindData(f) )continue;m_pPackage->AddFile(f);}((Form1 ^)this->MdiParent)->PastedFiles();this->WritePackage();this->UpdateView(true);}void SpkForm::PasteFile(){if ( ((Form1 ^)this->MdiParent)->CopiedFiles()->empty() )return;this->PasteFiles(((Form1 ^)this->MdiParent)->CopiedFiles());}void SpkForm::RestoreCut(CLinkList<C_File> *files){for ( C_File *f = files->First(); f; f = files->Next() )m_pPackage->AddFile(f);this->WritePackage();this->UpdateView(true);}void SpkForm::RunFile(ListViewItem ^item){if ( !item )return;C_File *f = this->GetFileFromItem(item);if ( !f )return;if ( m_pMultiPackage && m_pSelectedPackage ){m_pMultiPackage->ReadSpk(m_pSelectedPackage, SPKREAD_ALL);C_File *f = this->GetFileFromItem(item);if ( !f )return;}Diagnostics::Process ^process = gcnew Diagnostics::Process();try {process->StartInfo->WorkingDirectory = IO::Path::GetTempPath();switch ( f->GetFileType() ){case FILETYPE_SCRIPT:case FILETYPE_UNINSTALL:if ( m_pPackage->extractFile(f, _WS(IO::Path::GetTempPath()), false) ){SPK::WriteScriptStyleSheet(_WS(IO::Path::GetTempPath()));process->StartInfo->FileName = IO::Path::GetTempPath() + "\\" + _US(f->name());}break;case FILETYPE_MOD:if ( m_pPackage->extractFile(f, _WS(IO::Path::GetTempPath()), false) ){if ( f->checkFileExt(L"cat") ){C_File *datFile = m_pPackage->findFile(CFileIO(f).changeFileExtension(L"dat"), FILETYPE_MOD, L"");if ( datFile ){if ( m_pPackage->extractFile(datFile, _WS(IO::Path::GetTempPath()), false) )process->StartInfo->FileName = IO::Path::GetTempPath() + "\\" + _US(f->name());}}else if ( f->checkFileExt(L"dat") ){C_File *catFile = m_pPackage->findFile(CFileIO(f).changeFileExtension(L"cat"), FILETYPE_MOD, L"");if ( catFile ){if ( m_pPackage->extractFile(catFile, _WS(IO::Path::GetTempPath()), false) )process->StartInfo->FileName = IO::Path::GetTempPath() + "\\" + _US(catFile->name());}}}break;case FILETYPE_MAP:break;default:if ( m_pPackage->extractFile(f, _WS(IO::Path::GetTempPath()), false) )process->StartInfo->FileName = IO::Path::GetTempPath() + "\\" + _US(f->name());}if ( process->StartInfo->FileName && process->StartInfo->FileName->Length ){process->StartInfo->CreateNoWindow = true;process->Start();}}catch (System::Exception ^E){MessageBox::Show(this, "Error opening file:\n" + _US(f->name()) + "\n\nError: " + E->GetType()->Name, "Error", MessageBoxButtons::OK, MessageBoxIcon::Error);}}}