Subversion Repositories spk

Rev

Rev 226 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#include "../StdAfx.h"
2
#include "ModSelector.h"
3
#include "CheckUpdate.h"
4
#include "MainGui.h"
5
 
6
#undef GetTempPath
7
#undef GetCurrentDirectory
8
 
9
using namespace System::IO;
10
 
11
namespace PluginManager {
12
 
13
	void ModSelector::Update()
14
	{
15
		// update the mod display
16
		this->PictureBox->Image = nullptr;
17
		if ( m_pPackages->GetEnabledMod() )
18
		{
19
			m_bFoundPackages = true;
20
			CBaseFile *p = m_pPackages->GetEnabledMod();
171 cycrow 21
			this->TextMod->Text = _US(p->name(m_pPackages->GetLanguage()));
50 cycrow 22
			this->TextAuthor->Text = _US(p->author());
23
			this->TextVersion->Text = _US(p->version());
226 cycrow 24
			this->TextDesc->Text = _US(p->description().findReplace(L"<br>", L"\n").stripHtml());
50 cycrow 25
			this->TextCreated->Text = _US(p->creationDate());
1 cycrow 26
			ButNoMod->Enabled = true;
27
 
28
			// update graphic
29
			bool addedIcon = false;
30
			C_File *picFile = p->GetFirstFile(FILETYPE_ADVERT);
31
			if ( picFile )
32
			{
129 cycrow 33
				System::String ^pic = _US(picFile->filePointer());
1 cycrow 34
				if ( System::IO::File::Exists(pic) )
35
				{
36
					Bitmap ^myBitmap = gcnew Bitmap(pic);
37
					if ( myBitmap )
38
					{
39
						this->PictureBox->Image = dynamic_cast<Image ^>(myBitmap);
40
						addedIcon = true;
41
					}
42
				}
43
			}
44
 
45
			if ( !addedIcon )
46
			{
47
				System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(ModSelector::typeid));
48
				System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon")));
49
				this->PictureBox->Image = icon->ToBitmap();
50
			}
51
		}
52
		else
53
		{
54
			this->TextMod->Text = "N/A";
55
			this->TextAuthor->Text = "";
56
			this->TextVersion->Text = "";
57
			this->TextCreated->Text = "";
58
			this->TextDesc->Text = "";
59
			this->PictureBox->Image = nullptr;
60
			ButNoMod->Enabled = false;
61
		}
62
 
63
		// now update the mods list
64
		// first any installed mods
65
		this->UpdatePackages();
66
	}
67
 
68
	void ModSelector::UpdatePackages()
69
	{
70
		m_pPackages->AssignPackageNumbers();
71
		ListAvailable->Items->Clear();
72
		ListAvailable->Groups->Clear();
73
		ListAvailable->SmallImageList = gcnew ImageList();
74
		ListAvailable->LargeImageList = ListAvailable->SmallImageList;
75
 
76
		// display the installed mods
77
		ListViewGroup ^group = gcnew ListViewGroup("Installed Mods", HorizontalAlignment::Left);
78
		ListAvailable->Groups->Add(group);
79
 
80
		for ( CBaseFile *p = m_pPackages->FirstPackage(); p; p = m_pPackages->NextPackage() )
81
		{
82
			if ( !p->IsMod() )
83
				continue;
84
			if ( p == m_pPackages->GetEnabledMod() )
85
				continue;
86
 
87
			m_bFoundPackages = true;
171 cycrow 88
			ListViewItem ^item = gcnew ListViewItem(_US(p->name(m_pPackages->GetLanguage())));
50 cycrow 89
			item->SubItems->Add(_US(p->author()));
90
			item->SubItems->Add(_US(p->version()));
91
			item->SubItems->Add(_US(p->creationDate()));
1 cycrow 92
			ListAvailable->Items->Add(item);
228 cycrow 93
			item->Tag = _US(Utils::WString::Number(p->GetNum()));
1 cycrow 94
 
95
			item->Group = group;
170 cycrow 96
			if ( p->icon() )
1 cycrow 97
				PluginManager::DisplayListIcon(p, ListAvailable, item);
98
		}
99
 
100
		if ( m_lAvailablePackages )
101
		{
102
			// display the available mods
103
			ListViewGroup ^availGroup = gcnew ListViewGroup("Available Mods", HorizontalAlignment::Left);
104
			ListAvailable->Groups->Add(availGroup);
105
 
106
			for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
107
			{
108
				if ( !p->IsMod() )
109
					continue;
110
 
111
				// check if its already installed
182 cycrow 112
				if ( m_pPackages->findSpkPackage(p->name(), p->author()) )
1 cycrow 113
					continue;
114
 
115
				m_bFoundPackages = true;
171 cycrow 116
				ListViewItem ^item = gcnew ListViewItem(_US(p->name(m_pPackages->GetLanguage())));
170 cycrow 117
				item->SubItems->Add(_US(p->author()));
50 cycrow 118
				item->SubItems->Add(_US(p->version()));
119
				item->SubItems->Add(_US(p->creationDate()));
1 cycrow 120
				ListAvailable->Items->Add(item);
228 cycrow 121
				item->Tag = _US(Utils::WString::Number(p->GetNum()));
1 cycrow 122
 
123
				item->Group = availGroup;
170 cycrow 124
				if ( p->icon() )
1 cycrow 125
					PluginManager::DisplayListIcon(p, ListAvailable, item);
126
			}
127
		}
128
 
129
		if ( m_pPackages->AnyAvailablePackages(PACKAGETYPE_MOD) )
130
		{
131
			// display the available mods
132
			ListViewGroup ^availGroup = gcnew ListViewGroup("Downloadable Mods", HorizontalAlignment::Left);
133
			ListAvailable->Groups->Add(availGroup);
134
 
161 cycrow 135
			for (const SAvailablePackage *ap = m_pPackages->getAvailablePackageList()->First(); ap; ap = m_pPackages->getAvailablePackageList()->Next() )
1 cycrow 136
			{
137
				if ( ap->iType != PACKAGETYPE_MOD ) continue; // only display mods
138
				m_bFoundPackages = true;
161 cycrow 139
				ListViewItem ^item = gcnew ListViewItem(_US(ap->sName));
140
				item->SubItems->Add(_US(ap->sAuthor));
141
				item->SubItems->Add(_US(ap->sVersion));
142
				item->SubItems->Add(_US(ap->sUpdated));
143
				item->Tag = _US(ap->sFilename);
1 cycrow 144
				item->Group = availGroup;
145
				ListAvailable->Items->Add(item);
146
			}
147
		}
148
 
149
		ListAvailable->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
150
		ModSelected(ListAvailable, gcnew System::EventArgs());
151
	}
152
 
153
	void ModSelector::UpdateControls()
154
	{
155
		ListAvailable->FullRowSelect = true;
156
	}
157
 
158
	void ModSelector::FindPackages_Directory(String ^dir)
159
	{
160
		if ( Directory::Exists(dir) )
161
		{
162
			this->FindPackages(dir);
163
 
164
			array <System::String ^> ^Dirs = Directory::GetDirectories(dir);
165
			if ( Dirs )
166
			{
167
				for ( int i = 0; i < Dirs->Length; i++ )
168
					this->FindPackages_Directory(Dirs[i]);
169
			}
170
		}
171
	}
172
 
173
	void ModSelector::FindPackages(String ^dir)
174
	{
175
		if ( !Directory::Exists(dir) )
176
			return;
177
 
178
		array <System::String ^> ^Files = Directory::GetFiles(dir, "*.spk");
179
 
180
		for ( int i = 0; i < Files->Length; i++ )
181
		{
224 cycrow 182
			Utils::WString file = _WS(Files[i]);
1 cycrow 183
			int error = 0;
182 cycrow 184
			CBaseFile *p = m_pPackages->openPackage(file, &error, 0, SPKREAD_NODATA);
1 cycrow 185
			if ( !p )
186
				continue;
182 cycrow 187
			if ( !p->IsMod() || m_pPackages->findSpkPackage(p->name(), p->author()) )
1 cycrow 188
			{
189
				delete p;
190
				continue;
191
			}
192
 
193
			// check its for the correct game
194
			if ( !p->CheckGameCompatability(m_pPackages->GetGame()) )
195
			{
196
				delete p;
197
				continue;
198
			}
199
 
200
			// check if its already on the list
201
			bool found = false;
202
			for ( CBaseFile *checkp = m_lAvailablePackages->First(); checkp; checkp = m_lAvailablePackages->Next() )
203
			{
50 cycrow 204
				if ( p->name().Compare(checkp->name()) && p->author().Compare(checkp->author()) )
1 cycrow 205
				{
206
					found = true;
207
					break;
208
				}
209
			}
210
 
211
			if ( found )
212
			{
213
				delete p;
214
				continue;
215
			}
216
 
170 cycrow 217
			if ( p->icon() )
1 cycrow 218
			{
219
				bool addedIcon = false;
220
				p->ReadIconFileToMemory();
203 cycrow 221
				p->icon()->setFilename(m_pPackages->tempDirectory().findReplace(L"\\", L"/") + L"/" + p->author() + L"_" + p->name() + L"." + p->iconExt());
170 cycrow 222
				p->icon()->setFullDir(m_pPackages->tempDirectory());
223
				if ( p->icon()->UncompressData() )
1 cycrow 224
				{
170 cycrow 225
					if ( p->icon()->writeFilePointer() )
1 cycrow 226
						addedIcon = true;
227
				}
228
 
229
				if ( !addedIcon )
226 cycrow 230
					p->setIcon(NULL, L"");
1 cycrow 231
			}
232
			// get an advert to display
233
			if ( p->GetFirstFile(FILETYPE_ADVERT) )
234
			{
235
				bool done = false;
236
				C_File *f = p->GetFirstFile(FILETYPE_ADVERT);
237
				if ( p->ReadFileToMemory(f) )
238
				{
158 cycrow 239
					f->setFullDir(m_pPackages->tempDirectory());
1 cycrow 240
					if ( f->UncompressData() )
241
					{
129 cycrow 242
						if ( f->writeFilePointer() )
1 cycrow 243
							done = true;
244
					}
245
				}
246
 
247
				if ( !done )
248
					f->DeleteData();
249
			}
250
 
251
			m_lAvailablePackages->push_back(p);				
252
		}
253
	}
254
 
255
	void ModSelector::FindPackages_Current(String ^curDir)
256
	{
257
		this->FindPackages(curDir + "\\Addons\\Mods");
258
 
259
		if ( Directory::Exists(curDir + "\\Addons") )
260
		{
261
			if ( Directory::Exists(curDir + "\\Addons\\Mods") )
262
				this->FindPackages_Directory(curDir + "\\Addons\\Mods");
263
		}
264
 
265
		if ( Directory::Exists(curDir + "\\Downloads") )
266
			this->FindPackages_Directory(curDir + "\\Downloads");
267
	}
268
 
269
	void ModSelector::FindPackages()
270
	{
271
		if ( !m_lAvailablePackages )
272
			m_lAvailablePackages = new CLinkList<CBaseFile>;
273
 
274
		FindPackages_Current(System::IO::FileInfo(System::Windows::Forms::Application::ExecutablePath).DirectoryName);
275
		FindPackages_Current(Directory::GetCurrentDirectory());
276
 
277
		// find packages from registry key
278
		RegistryKey ^searchKey = Registry::CurrentUser->OpenSubKey("Software\\Egosoft\\SuperBox");
279
		if ( searchKey )
280
		{
281
			String ^dir = System::Convert::ToString(searchKey->GetValue("Addons"));
282
			if ( dir )
283
				this->FindPackages_Directory(dir);
284
		}
285
 
286
		// find packages from DVD
287
		cli::array<IO::DriveInfo ^> ^Drives = IO::DriveInfo::GetDrives();
288
		if ( Drives )
289
		{
290
			for ( int i = 0; i < Drives->Length; i++ )
291
			{
292
				IO::DriveInfo ^info = Drives[i];
293
				if ( info->DriveType != IO::DriveType::CDRom )
294
					continue;
295
				if ( info->IsReady )
296
					this->FindPackages_Directory(info->RootDirectory + "XPluginManager");
297
			}
298
		}
299
 
300
		// read all game directories extra content
226 cycrow 301
		this->FindPackages_Directory(_US((m_pPackages->getCurrentDirectory().findReplace(L"\\",L"/") + L"/ExtraContent").findReplace(L"//", L"/")));
1 cycrow 302
 
303
		int num = -1;
304
		for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
305
		{
306
			p->SetNum(num);
307
			--num;
308
		}
309
	}
310
 
311
	void ModSelector::RemovePackages()
312
	{
313
		if ( m_lAvailablePackages )
314
		{
315
			for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
316
			{
170 cycrow 317
				if ( p->icon() )
318
					CFileIO::Remove(p->icon()->filePointer());
1 cycrow 319
				delete p;
320
			}
321
			m_lAvailablePackages->destroy();
322
			delete m_lAvailablePackages;
323
		}
324
		m_lAvailablePackages = NULL;
325
	}
326
 
327
	//
328
	// Events
329
	//
330
	void ModSelector::SetupEvents()
331
	{
332
		ListAvailable->SelectedIndexChanged += gcnew EventHandler(this, &PluginManager::ModSelector::ModSelected);
333
		ButSelect->Click += gcnew EventHandler(this, &PluginManager::ModSelector::SelectModEvent);
334
		ButNoMod->Click += gcnew EventHandler(this, &PluginManager::ModSelector::NoModEvent);
335
		ButUninstall->Click += gcnew EventHandler(this, &PluginManager::ModSelector::UninstallModEvent);
336
	}
337
 
338
	void ModSelector::UpdateEaseOfUse(bool disable, int value)
339
	{
340
		if ( disable )
341
		{
342
			this->PicEase1->Visible = false;
343
			this->PicEase2->Visible = false;
344
			this->PicEase3->Visible = false;
345
			this->PicEase4->Visible = false;
346
			this->PicEase5->Visible = false;
347
		}
348
 
349
		if ( value > -1 )
350
		{
351
			// ease of use rating
352
			if ( value < 1 )
353
				LabEaseNA->Show();
354
			if ( value >= 1 )
355
				PicEase1->Show();
356
			if ( value >= 2 )
357
				PicEase2->Show();
358
			if ( value >= 3 )
359
				PicEase3->Show();
360
			if ( value >= 4 )
361
				PicEase4->Show();
362
			if ( value >= 5 )
363
				PicEase5->Show();
364
		}
365
	}
366
 
367
	void ModSelector::UpdateRecommended(bool disable, int value)
368
	{
369
		if ( disable )
370
		{
371
			this->PicRec1->Visible = false;
372
			this->PicRec2->Visible = false;
373
			this->PicRec3->Visible = false;
374
			this->PicRec4->Visible = false;
375
			this->PicRec5->Visible = false;
376
		}
377
 
378
		if ( value > -1 )
379
		{
380
			// Recommanded rating
381
			if ( value < 1 )
382
				LabelRecNA->Show();
383
			if ( value >= 1 )
384
				PicRec1->Show();
385
			if ( value >= 2 )
386
				PicRec2->Show();
387
			if ( value >= 3 )
388
				PicRec3->Show();
389
			if ( value >= 4 )
390
				PicRec4->Show();
391
			if ( value >= 5 )
392
				PicRec5->Show();
393
		}
394
	}
395
 
396
	void ModSelector::UpdateGameChanging(bool disable, int value)
397
	{
398
		if ( disable )
399
		{
400
			this->PicChange1->Visible = false;
401
			this->PicChange2->Visible = false;
402
			this->PicChange3->Visible = false;
403
			this->PicChange4->Visible = false;
404
			this->PicChange5->Visible = false;
405
		}
406
 
407
		if ( value > -1 )
408
		{
409
			// game changing rating
410
			if ( value < 1 )
411
				LabelChangeNA->Show();
412
			if ( value >= 1 )
413
				PicChange1->Show();
414
			if ( value >= 2 )
415
				PicChange2->Show();
416
			if ( value >= 3 )
417
				PicChange3->Show();
418
			if ( value >= 4 )
419
				PicChange4->Show();
420
			if ( value >= 5 )
421
				PicChange5->Show();
422
		}
423
	}
424
 
425
	void ModSelector::ModSelected(System::Object ^Sender, System::EventArgs ^E)
426
	{
427
		bool enabled = false;
428
 
429
		m_pSelectedMod = NULL;
430
		m_pSelectedPackage = NULL;
431
 
432
		ButUninstall->Visible = false;
433
		button1->Visible = false;
434
		this->PictureSelected->Image = nullptr;
435
		UpdateEaseOfUse(true, -1);
436
		UpdateGameChanging(true, -1);
437
		UpdateRecommended(true, -1);
438
		this->LabEaseNA->Visible = false;
439
		this->LabelChangeNA->Visible = false;
440
		this->LabelRecNA->Visible = false;
441
 
442
		bool dontEnable = false;
443
		if ( ListAvailable->SelectedItems->Count )
444
		{
445
			ListViewItem ^item = ListAvailable->SelectedItems[0];
446
			if ( item )
447
			{
225 cycrow 448
				Utils::WString sNum = _WS(System::Convert::ToString(item->Tag));
449
				int num = sNum.toInt();
1 cycrow 450
 
451
				CBaseFile *p = NULL;
225 cycrow 452
				if ( num || sNum == L"0" )
1 cycrow 453
				{
454
					// its an installed mod
455
					if ( num >= 0 )
456
					{
457
						p = m_pPackages->GetPackageAt(num);
458
						ButUninstall->Visible = true;
459
					}
460
					//else its from a file
461
					else
462
					{
463
						p = m_lAvailablePackages->Get(-1 - num);
464
					}
465
 
466
					if ( p )
467
					{
468
						enabled = true;
226 cycrow 469
						this->TextDescSelected->Text = _US(p->description().findReplace(L"<br>", L"\n").stripHtml());
1 cycrow 470
						m_pSelectedMod = p;
471
 
472
						// update graphic
473
						bool addedIcon = false;
474
						C_File *picFile = p->GetFirstFile(FILETYPE_ADVERT);
475
						if ( picFile )
476
						{
129 cycrow 477
							System::String ^pic = _US(picFile->filePointer());
1 cycrow 478
							if ( System::IO::File::Exists(pic) )
479
							{
480
								Bitmap ^myBitmap = gcnew Bitmap(pic);
481
								if ( myBitmap )
482
								{
483
									this->PictureSelected->Image = dynamic_cast<Image ^>(myBitmap);
484
									addedIcon = true;
485
								}
486
							}
487
						}
488
 
489
						if ( !addedIcon )
490
						{
491
							System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(ModSelector::typeid));
492
							System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon")));
493
							this->PictureSelected->Image = icon->ToBitmap();
494
						}
495
 
496
						// ratings display
46 cycrow 497
						UpdateEaseOfUse(false, p->easeOfUse());
498
						UpdateGameChanging(false, p->gameChanging());
499
						UpdateRecommended(false, p->recommended());
1 cycrow 500
					}
501
				}
502
				else // otherwise its a name (download package)
503
				{
225 cycrow 504
					const SAvailablePackage *p = m_pPackages->findAvailablePackage(sNum);
1 cycrow 505
					if ( p )
506
					{
507
						enabled = true;
508
						dontEnable = true;
509
						this->button1->Visible = true;
225 cycrow 510
						this->TextDescSelected->Text = _US(p->sDesc.findReplace(L"<br>", L"\n").stripHtml());
1 cycrow 511
 
512
						// ratings display
513
						UpdateEaseOfUse(false, p->iEase);
514
						UpdateGameChanging(false, p->iChanging);
515
						UpdateRecommended(false, p->iRec);
516
 
517
						// default display image
518
						System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(ModSelector::typeid));
519
						System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon")));
520
						this->PictureSelected->Image = icon->ToBitmap();
521
 
522
						m_pSelectedPackage = p;
523
					}
524
				}
525
			}
526
		}
527
 
528
		// nothing selected
529
		if ( !enabled )
530
			TextDescSelected->Text = "";
531
 
532
		ButSelect->Enabled = (dontEnable) ? false : enabled;
533
	}
534
 
535
	void ModSelector::SelectModEvent(System::Object ^Sender, System::EventArgs ^E)
536
	{
537
	}
538
 
539
	void ModSelector::NoModEvent(System::Object ^Sender, System::EventArgs ^E)
540
	{
541
	}
542
 
543
	void ModSelector::UninstallModEvent(System::Object ^Sender, System::EventArgs ^E)
544
	{
545
	}
546
 
547
	void ModSelector::UpdateDetails()
548
	{
549
		if ( m_bDetails )
550
		{
551
			ButDetails->Text = "Hide Details <<<";
552
			this->PanelDetails->Show();
553
		}
554
		else
555
		{
556
			ButDetails->Text = "Show Details >>>";
557
			this->PanelDetails->Hide();
558
		}
559
	}
560
 
561
	void ModSelector::DownloadPackage()
562
	{
563
		if ( !m_pSelectedPackage ) 
564
		{
565
			this->button1->Visible = false;
566
			return;
567
		}
568
 
569
		CheckUpdate ^update = gcnew CheckUpdate(m_pPackages, m_pImageList);
570
		update->SetDownloader();
571
		update->OnePackage(m_pSelectedPackage);
572
		if ( update->ShowDialog(this) == Windows::Forms::DialogResult::OK )
573
		{
574
			this->DialogResult = Windows::Forms::DialogResult::Yes;
575
			for ( int i = 0; i < update->GetInstallList()->Count; i++ )
576
				cli::safe_cast<MainGui ^>(this->Owner)->InstallPackage(Convert::ToString(update->GetInstallList()[i]), false, false, true);
577
			this->Close();
578
		}
579
	}
580
 
581
}