Rev 226 | Blame | Compare with Previous | Last modification | View Log | RSS feed
#include "../StdAfx.h"#include "ModSelector.h"#include "CheckUpdate.h"#include "MainGui.h"#undef GetTempPath#undef GetCurrentDirectoryusing namespace System::IO;namespace PluginManager {void ModSelector::Update(){// update the mod displaythis->PictureBox->Image = nullptr;if ( m_pPackages->GetEnabledMod() ){m_bFoundPackages = true;CBaseFile *p = m_pPackages->GetEnabledMod();this->TextMod->Text = _US(p->name(m_pPackages->GetLanguage()));this->TextAuthor->Text = _US(p->author());this->TextVersion->Text = _US(p->version());this->TextDesc->Text = _US(p->description().findReplace(L"<br>", L"\n").stripHtml());this->TextCreated->Text = _US(p->creationDate());ButNoMod->Enabled = true;// update graphicbool addedIcon = false;C_File *picFile = p->GetFirstFile(FILETYPE_ADVERT);if ( picFile ){System::String ^pic = _US(picFile->filePointer());if ( System::IO::File::Exists(pic) ){Bitmap ^myBitmap = gcnew Bitmap(pic);if ( myBitmap ){this->PictureBox->Image = dynamic_cast<Image ^>(myBitmap);addedIcon = true;}}}if ( !addedIcon ){System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(ModSelector::typeid));System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^ >(resources->GetObject(L"$this.Icon")));this->PictureBox->Image = icon->ToBitmap();}}else{this->TextMod->Text = "N/A";this->TextAuthor->Text = "";this->TextVersion->Text = "";this->TextCreated->Text = "";this->TextDesc->Text = "";this->PictureBox->Image = nullptr;ButNoMod->Enabled = false;}// now update the mods list// first any installed modsthis->UpdatePackages();}void ModSelector::UpdatePackages(){m_pPackages->AssignPackageNumbers();ListAvailable->Items->Clear();ListAvailable->Groups->Clear();ListAvailable->SmallImageList = gcnew ImageList();ListAvailable->LargeImageList = ListAvailable->SmallImageList;// display the installed modsListViewGroup ^group = gcnew ListViewGroup("Installed Mods", HorizontalAlignment::Left);ListAvailable->Groups->Add(group);for ( CBaseFile *p = m_pPackages->FirstPackage(); p; p = m_pPackages->NextPackage() ){if ( !p->IsMod() )continue;if ( p == m_pPackages->GetEnabledMod() )continue;m_bFoundPackages = true;ListViewItem ^item = gcnew ListViewItem(_US(p->name(m_pPackages->GetLanguage())));item->SubItems->Add(_US(p->author()));item->SubItems->Add(_US(p->version()));item->SubItems->Add(_US(p->creationDate()));ListAvailable->Items->Add(item);item->Tag = _US(Utils::WString::Number(p->GetNum()));item->Group = group;if ( p->icon() )PluginManager::DisplayListIcon(p, ListAvailable, item);}if ( m_lAvailablePackages ){// display the available modsListViewGroup ^availGroup = gcnew ListViewGroup("Available Mods", HorizontalAlignment::Left);ListAvailable->Groups->Add(availGroup);for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() ){if ( !p->IsMod() )continue;// check if its already installedif ( m_pPackages->findSpkPackage(p->name(), p->author()) )continue;m_bFoundPackages = true;ListViewItem ^item = gcnew ListViewItem(_US(p->name(m_pPackages->GetLanguage())));item->SubItems->Add(_US(p->author()));item->SubItems->Add(_US(p->version()));item->SubItems->Add(_US(p->creationDate()));ListAvailable->Items->Add(item);item->Tag = _US(Utils::WString::Number(p->GetNum()));item->Group = availGroup;if ( p->icon() )PluginManager::DisplayListIcon(p, ListAvailable, item);}}if ( m_pPackages->AnyAvailablePackages(PACKAGETYPE_MOD) ){// display the available modsListViewGroup ^availGroup = gcnew ListViewGroup("Downloadable Mods", HorizontalAlignment::Left);ListAvailable->Groups->Add(availGroup);for (const SAvailablePackage *ap = m_pPackages->getAvailablePackageList()->First(); ap; ap = m_pPackages->getAvailablePackageList()->Next() ){if ( ap->iType != PACKAGETYPE_MOD ) continue; // only display modsm_bFoundPackages = true;ListViewItem ^item = gcnew ListViewItem(_US(ap->sName));item->SubItems->Add(_US(ap->sAuthor));item->SubItems->Add(_US(ap->sVersion));item->SubItems->Add(_US(ap->sUpdated));item->Tag = _US(ap->sFilename);item->Group = availGroup;ListAvailable->Items->Add(item);}}ListAvailable->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);ModSelected(ListAvailable, gcnew System::EventArgs());}void ModSelector::UpdateControls(){ListAvailable->FullRowSelect = true;}void ModSelector::FindPackages_Directory(String ^dir){if ( Directory::Exists(dir) ){this->FindPackages(dir);array <System::String ^> ^Dirs = Directory::GetDirectories(dir);if ( Dirs ){for ( int i = 0; i < Dirs->Length; i++ )this->FindPackages_Directory(Dirs[i]);}}}void ModSelector::FindPackages(String ^dir){if ( !Directory::Exists(dir) )return;array <System::String ^> ^Files = Directory::GetFiles(dir, "*.spk");for ( int i = 0; i < Files->Length; i++ ){Utils::WString file = _WS(Files[i]);int error = 0;CBaseFile *p = m_pPackages->openPackage(file, &error, 0, SPKREAD_NODATA);if ( !p )continue;if ( !p->IsMod() || m_pPackages->findSpkPackage(p->name(), p->author()) ){delete p;continue;}// check its for the correct gameif ( !p->CheckGameCompatability(m_pPackages->GetGame()) ){delete p;continue;}// check if its already on the listbool found = false;for ( CBaseFile *checkp = m_lAvailablePackages->First(); checkp; checkp = m_lAvailablePackages->Next() ){if ( p->name().Compare(checkp->name()) && p->author().Compare(checkp->author()) ){found = true;break;}}if ( found ){delete p;continue;}if ( p->icon() ){bool addedIcon = false;p->ReadIconFileToMemory();p->icon()->setFilename(m_pPackages->tempDirectory().findReplace(L"\\", L"/") + L"/" + p->author() + L"_" + p->name() + L"." + p->iconExt());p->icon()->setFullDir(m_pPackages->tempDirectory());if ( p->icon()->UncompressData() ){if ( p->icon()->writeFilePointer() )addedIcon = true;}if ( !addedIcon )p->setIcon(NULL, L"");}// get an advert to displayif ( p->GetFirstFile(FILETYPE_ADVERT) ){bool done = false;C_File *f = p->GetFirstFile(FILETYPE_ADVERT);if ( p->ReadFileToMemory(f) ){f->setFullDir(m_pPackages->tempDirectory());if ( f->UncompressData() ){if ( f->writeFilePointer() )done = true;}}if ( !done )f->DeleteData();}m_lAvailablePackages->push_back(p);}}void ModSelector::FindPackages_Current(String ^curDir){this->FindPackages(curDir + "\\Addons\\Mods");if ( Directory::Exists(curDir + "\\Addons") ){if ( Directory::Exists(curDir + "\\Addons\\Mods") )this->FindPackages_Directory(curDir + "\\Addons\\Mods");}if ( Directory::Exists(curDir + "\\Downloads") )this->FindPackages_Directory(curDir + "\\Downloads");}void ModSelector::FindPackages(){if ( !m_lAvailablePackages )m_lAvailablePackages = new CLinkList<CBaseFile>;FindPackages_Current(System::IO::FileInfo(System::Windows::Forms::Application::ExecutablePath).DirectoryName);FindPackages_Current(Directory::GetCurrentDirectory());// find packages from registry keyRegistryKey ^searchKey = Registry::CurrentUser->OpenSubKey("Software\\Egosoft\\SuperBox");if ( searchKey ){String ^dir = System::Convert::ToString(searchKey->GetValue("Addons"));if ( dir )this->FindPackages_Directory(dir);}// find packages from DVDcli::array<IO::DriveInfo ^> ^Drives = IO::DriveInfo::GetDrives();if ( Drives ){for ( int i = 0; i < Drives->Length; i++ ){IO::DriveInfo ^info = Drives[i];if ( info->DriveType != IO::DriveType::CDRom )continue;if ( info->IsReady )this->FindPackages_Directory(info->RootDirectory + "XPluginManager");}}// read all game directories extra contentthis->FindPackages_Directory(_US((m_pPackages->getCurrentDirectory().findReplace(L"\\",L"/") + L"/ExtraContent").findReplace(L"//", L"/")));int num = -1;for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() ){p->SetNum(num);--num;}}void ModSelector::RemovePackages(){if ( m_lAvailablePackages ){for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() ){if ( p->icon() )CFileIO::Remove(p->icon()->filePointer());delete p;}m_lAvailablePackages->destroy();delete m_lAvailablePackages;}m_lAvailablePackages = NULL;}//// Events//void ModSelector::SetupEvents(){ListAvailable->SelectedIndexChanged += gcnew EventHandler(this, &PluginManager::ModSelector::ModSelected);ButSelect->Click += gcnew EventHandler(this, &PluginManager::ModSelector::SelectModEvent);ButNoMod->Click += gcnew EventHandler(this, &PluginManager::ModSelector::NoModEvent);ButUninstall->Click += gcnew EventHandler(this, &PluginManager::ModSelector::UninstallModEvent);}void ModSelector::UpdateEaseOfUse(bool disable, int value){if ( disable ){this->PicEase1->Visible = false;this->PicEase2->Visible = false;this->PicEase3->Visible = false;this->PicEase4->Visible = false;this->PicEase5->Visible = false;}if ( value > -1 ){// ease of use ratingif ( value < 1 )LabEaseNA->Show();if ( value >= 1 )PicEase1->Show();if ( value >= 2 )PicEase2->Show();if ( value >= 3 )PicEase3->Show();if ( value >= 4 )PicEase4->Show();if ( value >= 5 )PicEase5->Show();}}void ModSelector::UpdateRecommended(bool disable, int value){if ( disable ){this->PicRec1->Visible = false;this->PicRec2->Visible = false;this->PicRec3->Visible = false;this->PicRec4->Visible = false;this->PicRec5->Visible = false;}if ( value > -1 ){// Recommanded ratingif ( value < 1 )LabelRecNA->Show();if ( value >= 1 )PicRec1->Show();if ( value >= 2 )PicRec2->Show();if ( value >= 3 )PicRec3->Show();if ( value >= 4 )PicRec4->Show();if ( value >= 5 )PicRec5->Show();}}void ModSelector::UpdateGameChanging(bool disable, int value){if ( disable ){this->PicChange1->Visible = false;this->PicChange2->Visible = false;this->PicChange3->Visible = false;this->PicChange4->Visible = false;this->PicChange5->Visible = false;}if ( value > -1 ){// game changing ratingif ( value < 1 )LabelChangeNA->Show();if ( value >= 1 )PicChange1->Show();if ( value >= 2 )PicChange2->Show();if ( value >= 3 )PicChange3->Show();if ( value >= 4 )PicChange4->Show();if ( value >= 5 )PicChange5->Show();}}void ModSelector::ModSelected(System::Object ^Sender, System::EventArgs ^E){bool enabled = false;m_pSelectedMod = NULL;m_pSelectedPackage = NULL;ButUninstall->Visible = false;button1->Visible = false;this->PictureSelected->Image = nullptr;UpdateEaseOfUse(true, -1);UpdateGameChanging(true, -1);UpdateRecommended(true, -1);this->LabEaseNA->Visible = false;this->LabelChangeNA->Visible = false;this->LabelRecNA->Visible = false;bool dontEnable = false;if ( ListAvailable->SelectedItems->Count ){ListViewItem ^item = ListAvailable->SelectedItems[0];if ( item ){Utils::WString sNum = _WS(System::Convert::ToString(item->Tag));int num = sNum.toInt();CBaseFile *p = NULL;if ( num || sNum == L"0" ){// its an installed modif ( num >= 0 ){p = m_pPackages->GetPackageAt(num);ButUninstall->Visible = true;}//else its from a fileelse{p = m_lAvailablePackages->Get(-1 - num);}if ( p ){enabled = true;this->TextDescSelected->Text = _US(p->description().findReplace(L"<br>", L"\n").stripHtml());m_pSelectedMod = p;// update graphicbool addedIcon = false;C_File *picFile = p->GetFirstFile(FILETYPE_ADVERT);if ( picFile ){System::String ^pic = _US(picFile->filePointer());if ( System::IO::File::Exists(pic) ){Bitmap ^myBitmap = gcnew Bitmap(pic);if ( myBitmap ){this->PictureSelected->Image = dynamic_cast<Image ^>(myBitmap);addedIcon = true;}}}if ( !addedIcon ){System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(ModSelector::typeid));System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^ >(resources->GetObject(L"$this.Icon")));this->PictureSelected->Image = icon->ToBitmap();}// ratings displayUpdateEaseOfUse(false, p->easeOfUse());UpdateGameChanging(false, p->gameChanging());UpdateRecommended(false, p->recommended());}}else // otherwise its a name (download package){const SAvailablePackage *p = m_pPackages->findAvailablePackage(sNum);if ( p ){enabled = true;dontEnable = true;this->button1->Visible = true;this->TextDescSelected->Text = _US(p->sDesc.findReplace(L"<br>", L"\n").stripHtml());// ratings displayUpdateEaseOfUse(false, p->iEase);UpdateGameChanging(false, p->iChanging);UpdateRecommended(false, p->iRec);// default display imageSystem::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(ModSelector::typeid));System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^ >(resources->GetObject(L"$this.Icon")));this->PictureSelected->Image = icon->ToBitmap();m_pSelectedPackage = p;}}}}// nothing selectedif ( !enabled )TextDescSelected->Text = "";ButSelect->Enabled = (dontEnable) ? false : enabled;}void ModSelector::SelectModEvent(System::Object ^Sender, System::EventArgs ^E){}void ModSelector::NoModEvent(System::Object ^Sender, System::EventArgs ^E){}void ModSelector::UninstallModEvent(System::Object ^Sender, System::EventArgs ^E){}void ModSelector::UpdateDetails(){if ( m_bDetails ){ButDetails->Text = "Hide Details <<<";this->PanelDetails->Show();}else{ButDetails->Text = "Show Details >>>";this->PanelDetails->Hide();}}void ModSelector::DownloadPackage(){if ( !m_pSelectedPackage ){this->button1->Visible = false;return;}CheckUpdate ^update = gcnew CheckUpdate(m_pPackages, m_pImageList);update->SetDownloader();update->OnePackage(m_pSelectedPackage);if ( update->ShowDialog(this) == Windows::Forms::DialogResult::OK ){this->DialogResult = Windows::Forms::DialogResult::Yes;for ( int i = 0; i < update->GetInstallList()->Count; i++ )cli::safe_cast<MainGui ^>(this->Owner)->InstallPackage(Convert::ToString(update->GetInstallList()[i]), false, false, true);this->Close();}}}