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 "..\listviewsorter.h"
3
 
4
#include "PackageBrowser.h"
5
#include "CheckUpdate.h"
6
#include "MainGui.h"
7
 
8
using namespace System::IO;
9
 
10
#undef GetTempPath
11
#undef GetCurrentDirectory
12
 
13
namespace PluginManager {
14
 
15
	bool PackageBrowser::AnyPackages()
16
	{
17
		if ( m_lAvailablePackages && m_lAvailablePackages->size() )
18
			return true;
19
		if ( m_pPackages->AnyAvailablePackages() )
20
			return true;
21
		return false;
22
	}
23
 
24
	bool PackageBrowser::CheckValidPackage(CBaseFile *p)
25
	{
26
		if ( !p->CheckGameCompatability(m_pPackages->GetGame()) )
27
			return false;
28
 
48 cycrow 29
		if ( !this->CheckCheat->Checked && p->pluginType() == PLUGIN_CHEAT )
1 cycrow 30
			return false;
48 cycrow 31
		if ( !this->CheckExperimental->Checked && p->pluginType() == PLUGIN_EXPERIMENTAL )
1 cycrow 32
			return false;
33
		if ( p->GetType() == TYPE_XSP && !this->CheckShips->Checked )
34
			return false;
35
		if ( this->CheckSigned->Checked && !p->IsSigned() )
36
			return false;
37
 
38
		return true;
39
	}
40
 
41
	bool PackageBrowser::CheckValidPackage(SAvailablePackage *p)
42
	{
43
		if ( p->iType == PACKAGETYPE_MOD )
44
			return false;
45
 
46
		if ( !p->lGames.empty() )
47
		{
48
			bool found = false;
49
			for ( SGameCompat *gc = p->lGames.First(); gc; gc = p->lGames.Next() ) {
161 cycrow 50
				if ( !gc->iGame || gc->iGame == m_pPackages->GetGame() ) {
1 cycrow 51
					found = true;
52
					break;
53
				}
54
			}
55
 
56
			if ( !found )
57
				return false;
58
		}
59
 
60
		if ( !this->CheckCheat->Checked && p->iPluginType == PLUGIN_CHEAT )
61
			return false;
62
		if ( !this->CheckExperimental->Checked && p->iPluginType == PLUGIN_EXPERIMENTAL )
63
			return false;
64
		if ( p->iType == PACKAGETYPE_SHIP && !this->CheckShips->Checked )
65
			return false;
66
		if ( this->CheckSigned->Checked && !p->bSigned )
67
			return false;
68
 
69
		return true;
70
	}
71
 
72
	ListViewItem ^PackageBrowser::CreateItem(CBaseFile *p)
73
	{
171 cycrow 74
		ListViewItem ^item = gcnew ListViewItem(_US(p->name(m_pPackages->GetLanguage())), -1);
50 cycrow 75
		item->SubItems->Add(_US(p->author()));
76
		item->SubItems->Add(_US(p->version()));
77
		item->SubItems->Add(_US(p->creationDate()));
1 cycrow 78
		if ( p->GetType() == TYPE_SPK )
214 cycrow 79
			item->SubItems->Add(_US(((CSpkFile *)p)->scriptTypeString(m_pPackages->GetLanguage())));
1 cycrow 80
		else if ( p->GetType() == TYPE_XSP )
81
			item->SubItems->Add("Ship");
82
 
83
		if ( p->IsSigned() )
84
			item->SubItems->Add("Yes");
85
		else
86
			item->SubItems->Add("No");
87
 
88
 
89
		return item;
90
	}
91
 
92
	ListViewItem ^PackageBrowser::CreateItem(SAvailablePackage *p)
93
	{
170 cycrow 94
		ListViewItem ^item = gcnew ListViewItem(_US(p->sName), -1);
95
		item->SubItems->Add(_US(p->sAuthor));
96
		item->SubItems->Add(_US(p->sVersion));
97
		item->SubItems->Add(_US(p->sUpdated));
1 cycrow 98
 
99
		switch (p->iType)
100
		{
101
			case PACKAGETYPE_SHIP:
102
				item->SubItems->Add("Ship");
103
				break;
104
			case PACKAGETYPE_LIBRARY:
105
				item->SubItems->Add("Library");
106
				break;
107
			case PACKAGETYPE_CUSTOMSTART:
108
				item->SubItems->Add("Custom Start");
109
				break;
110
			case PACKAGETYPE_PATCH:
111
				item->SubItems->Add("Patch");
112
				break;
113
			case PACKAGETYPE_UPDATE:
114
				item->SubItems->Add("Update");
115
				break;
116
			case PACKAGETYPE_MOD:
117
				item->SubItems->Add("Mod");
118
				break;
119
			case PACKAGETYPE_FAKEPATCH:
120
				item->SubItems->Add("Fake Patch");
121
				break;
122
			case PACKAGETYPE_NORMAL:
123
				if ( p->iScriptType > 0 )
299 cycrow 124
					item->SubItems->Add(_US(CSpkFile::GetScriptTypeStringStatic(p->iScriptType, m_pPackages->GetLanguage())));
1 cycrow 125
				else
126
					item->SubItems->Add("Package");
127
				break;
128
		}
129
 
130
		if ( p->bSigned )
131
			item->SubItems->Add("Yes");
132
		else
133
			item->SubItems->Add("No");
134
 
135
		return item;
136
	}
137
 
138
	void PackageBrowser::UpdatePackages()
139
	{
140
		m_pPackages->AssignPackageNumbers();
141
		ListPackages->Items->Clear();
142
		ListPackages->Groups->Clear();
143
 
144
		ListViewGroup ^gNormal = gcnew ListViewGroup("Normal", HorizontalAlignment::Left);
145
		ListPackages->Groups->Add(gNormal);
146
		ListViewGroup ^gStable = gcnew ListViewGroup("Stable", HorizontalAlignment::Left);
147
		ListPackages->Groups->Add(gStable);
148
		ListViewGroup ^gExperimental = gcnew ListViewGroup("Experimental", HorizontalAlignment::Left);
149
		ListPackages->Groups->Add(gExperimental);
150
		ListViewGroup ^gCheat = gcnew ListViewGroup("Cheat", HorizontalAlignment::Left);
151
		ListPackages->Groups->Add(gCheat);
152
		ListViewGroup ^gShip = gcnew ListViewGroup("Ships", HorizontalAlignment::Left);
153
		ListPackages->Groups->Add(gShip);
154
		ListViewGroup ^gMod = gcnew ListViewGroup("Mods", HorizontalAlignment::Left);
155
		ListPackages->Groups->Add(gMod);
156
 
157
		if ( m_lAvailablePackages )
158
		{
159
			for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
160
			{
161
				// check if its already installed
182 cycrow 162
				if ( m_pPackages->findPackage(p) )
1 cycrow 163
					continue;
164
 
165
				if ( !this->CheckValidPackage(p) )
166
					continue;
167
 
168
 
169
				ListViewItem ^item = this->CreateItem(p);
170
				item->Group = gNormal;
171
				if ( p->GetType() == TYPE_XSP )
172
					item->Group = gShip;
173
				else if ( p->GetType() == TYPE_SPK )
174
				{
48 cycrow 175
					switch ( p->pluginType() ) {
176
						case PLUGIN_STABLE:			item->Group = gStable; break;
177
						case PLUGIN_EXPERIMENTAL:	item->Group = gExperimental; break;
178
						case PLUGIN_CHEAT:			item->Group = gCheat; break;
179
						case PLUGIN_MOD:			item->Group = gMod;	break;
1 cycrow 180
					}
181
				}
182
 
183
				item->Tag = p->GetNum();
184
				ListPackages->Items->Add(item);
170 cycrow 185
				if ( p->icon() )
1 cycrow 186
					PluginManager::DisplayListIcon(p, ListPackages, item);
187
				else
188
				{
189
					if ( p->GetType() == TYPE_XSP )
190
						item->ImageIndex = this->imageList1->Images->IndexOfKey("ship.png");
191
					else if ( p->IsMod() || p->IsFakePatch() )
192
						item->ImageIndex = this->imageList1->Images->IndexOfKey("fake.png");
193
					else if ( p->GetType() == TYPE_SPK && ((CSpkFile *)p)->IsLibrary() )
194
						item->ImageIndex = this->imageList1->Images->IndexOfKey("library.png");
195
					else
196
						item->ImageIndex = this->imageList1->Images->IndexOfKey("package.png");
197
				}
198
			}
199
		}
200
 
201
		if ( this->checkBox1->Checked )
202
		{
161 cycrow 203
			for (SAvailablePackage *p = m_pPackages->getAvailablePackageList()->First(); p; p = m_pPackages->getAvailablePackageList()->Next() )
1 cycrow 204
			{
182 cycrow 205
				if ( m_pPackages->findPackage(p->sName, p->sAuthor) ) continue;
1 cycrow 206
				if ( !this->CheckValidPackage(p) ) continue;
207
 
208
				ListViewItem ^item = this->CreateItem(p);
209
				item->Group = gNormal;
210
				if ( p->iType == PACKAGETYPE_SHIP )
211
					item->Group = gShip;
212
				else 
213
				{
214
					switch ( p->iPluginType )
215
					{
216
						case PLUGIN_STABLE:
217
							item->Group = gStable;
218
							break;
219
						case PLUGIN_EXPERIMENTAL:
220
							item->Group = gExperimental;
221
							break;
222
						case PLUGIN_CHEAT:
223
							item->Group = gCheat;
224
							break;
225
						case PLUGIN_MOD:
226
							item->Group = gMod;
227
							break;
228
					}
229
				}
230
 
231
				item->ImageIndex = this->imageList1->Images->IndexOfKey("download");
232
 
233
 
191 cycrow 234
				item->Tag = _US(p->sFilename);
1 cycrow 235
				ListPackages->Items->Add(item);
236
			}
237
		}
238
 
239
		ListPackages->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
240
		PackageSelected(ListPackages, gcnew System::EventArgs());
241
	}
242
 
243
	void PackageBrowser::RemovePackages()
244
	{
245
		if ( m_lAvailablePackages )
246
		{
247
			for ( CBaseFile *p = m_lAvailablePackages->First(); p; p = m_lAvailablePackages->Next() )
248
			{
170 cycrow 249
				if ( p->icon() )
250
					CFileIO::Remove(p->icon()->filePointer());
1 cycrow 251
				delete p;
252
			}
253
			m_lAvailablePackages->destroy();
254
			delete m_lAvailablePackages;
255
		}
256
		m_lAvailablePackages = NULL;
257
	}
258
 
259
	void PackageBrowser::UpdateControls()
260
	{
261
	}
262
 
263
	void PackageBrowser::SetupEvents()
264
	{
265
		ListPackages->SelectedIndexChanged += gcnew EventHandler(this, &PluginManager::PackageBrowser::PackageSelected);
266
		CheckCheat->Click += gcnew EventHandler(this, &PluginManager::PackageBrowser::CheckEvent);
267
		CheckShips->Click += gcnew EventHandler(this, &PluginManager::PackageBrowser::CheckEvent);
268
		CheckExperimental->Click += gcnew EventHandler(this, &PluginManager::PackageBrowser::CheckEvent);
269
		this->ListPackages->ColumnClick += gcnew ColumnClickEventHandler(this, &PluginManager::PackageBrowser::SortList);
270
	}
271
 
272
	void PackageBrowser::UpdateRatings(bool clear, int ease, int change, int rec)
273
	{
274
		if ( clear )
275
		{
276
			LabRecNA->Hide();
277
			LabChangeNA->Hide();
278
			LabEaseNA->Hide();
279
			PicEase1->Hide();
280
			PicEase2->Hide();
281
			PicEase3->Hide();
282
			PicEase4->Hide();
283
			PicEase5->Hide();
284
			PicChange1->Hide();
285
			PicChange2->Hide();
286
			PicChange3->Hide();
287
			PicChange4->Hide();
288
			PicChange5->Hide();
289
			PicRec1->Hide();
290
			PicRec2->Hide();
291
			PicRec3->Hide();
292
			PicRec4->Hide();
293
			PicRec5->Hide();
294
		}
295
 
296
		// ease of use rating
297
		if ( ease < 1 )
298
			LabEaseNA->Show();
299
		if ( ease >= 1 )
300
			PicEase1->Show();
301
		if ( ease >= 2 )
302
			PicEase2->Show();
303
		if ( ease >= 3 )
304
			PicEase3->Show();
305
		if ( ease >= 4 )
306
			PicEase4->Show();
307
		if ( ease >= 5 )
308
			PicEase5->Show();
309
 
310
		// game changing rating
311
		if ( change < 1 )
312
			LabChangeNA->Show();
313
		if ( change >= 1 )
314
			PicChange1->Show();
315
		if ( change >= 2 )
316
			PicChange2->Show();
317
		if ( change >= 3 )
318
			PicChange3->Show();
319
		if ( change >= 4 )
320
			PicChange4->Show();
321
		if ( change >= 5 )
322
			PicChange5->Show();
323
 
324
		// Recommanded rating
325
		if ( rec < 1 )
326
			LabRecNA->Show();
327
		if ( rec >= 1 )
328
			PicRec1->Show();
329
		if ( rec >= 2 )
330
			PicRec2->Show();
331
		if ( rec >= 3 )
332
			PicRec3->Show();
333
		if ( rec >= 4 )
334
			PicRec4->Show();
335
		if ( rec >= 5 )
336
			PicRec5->Show();
337
	}
338
 
339
	void PackageBrowser::PackageSelected(System::Object ^Sender, System::EventArgs ^E)
340
	{
341
		this->PictureBox->Image = nullptr;
342
 
343
		UpdateRatings(true, -1, -1, -1);
344
 
345
		this->button1->Visible = false;
346
		bool enabled = false;
347
		CBaseFile *p = NULL;
161 cycrow 348
		const SAvailablePackage *ap = NULL;
1 cycrow 349
		if ( ListPackages->SelectedItems->Count )
350
		{
351
			ListViewItem ^item = ListPackages->SelectedItems[0];
352
			if ( item )
353
			{
224 cycrow 354
				Utils::WString sNum = _WS(Convert::ToString(item->Tag));
126 cycrow 355
				if (sNum.isNumber())
1 cycrow 356
				{
357
					enabled = true;
358
					p = m_lAvailablePackages->Get(Convert::ToInt32(item->Tag));
359
				}
360
				else
361
				{
362
					this->button1->Visible = true;
161 cycrow 363
					ap = m_pPackages->findAvailablePackage(sNum);
1 cycrow 364
				}
365
			}
366
		}
367
 
368
		// update package display
369
		if ( p )
370
		{
206 cycrow 371
			Utils::WString desc = p->description();
372
			desc = desc.findReplace(L"<br>", L"\n");
373
			desc = desc.findReplace(L"<br/>", L"\n");
374
			desc = desc.findReplace(L"<p>", L"\n\t");
375
			desc = desc.findReplace(L"<p/>", L"\n");
48 cycrow 376
			TextDesc->Text = _US(desc.stripHtml());
171 cycrow 377
			GroupPackage->Text = "Current Package (" + _US(p->name(m_pPackages->GetLanguage())) + ")";
1 cycrow 378
 
46 cycrow 379
			UpdateRatings(true, p->easeOfUse(), p->gameChanging(), p->recommended());
1 cycrow 380
			// display an advert
381
			bool addedIcon = false;
382
			if ( p->GetFirstFile(FILETYPE_ADVERT) )
383
			{
384
				C_File *f = p->GetFirstFile(FILETYPE_ADVERT);
206 cycrow 385
				System::String ^aFile = _US(f->filePointer().findReplace(L"/", L"\\").findReplace(L"\\\\", L"\\"));
1 cycrow 386
				if ( System::IO::File::Exists(aFile) )
387
				{
388
					try 
389
					{
390
						Bitmap ^myBitmap = gcnew Bitmap(aFile);
391
						if ( myBitmap )
392
						{
393
							this->PictureBox->Image = dynamic_cast<Image ^>(myBitmap);
394
							addedIcon = true;
395
						}
396
					} catch (System::ArgumentException ^) {
397
					}
398
					if ( !addedIcon )
399
					{
400
						try 
401
						{
402
							Image ^myImage = Drawing::Image::FromFile(aFile);
403
							if ( myImage )
404
							{
405
								this->PictureBox->Image = myImage;
406
								addedIcon = true;
407
							}
408
						} catch (System::ArgumentException ^) {
409
						} catch (System::OutOfMemoryException ^) {
410
						}
411
					}
412
				}
413
			}
414
 
415
			if ( !addedIcon )
416
			{
417
				System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(PackageBrowser::typeid));
418
				System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon")));
419
				this->PictureBox->Image = icon->ToBitmap();
420
			}
421
		}
422
		else if ( ap )
423
		{
191 cycrow 424
			Utils::WString desc = ap->sDesc;
226 cycrow 425
			desc = desc.findReplace(L"<br>", L"\n");
426
			desc = desc.findReplace(L"<br/>", L"\n");
427
			desc = desc.findReplace(L"<p>", L"\n\t");
428
			desc = desc.findReplace(L"<p/>", L"\n");
191 cycrow 429
			TextDesc->Text = _US(desc.stripHtml());
430
			GroupPackage->Text = "Current Package (" + _US(ap->sName) + ") [DOWNLOAD REQUIRED]";
1 cycrow 431
 
432
			UpdateRatings(true, ap->iEase, ap->iChanging, ap->iRec);
433
 
434
			System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(PackageBrowser::typeid));
435
			System::Drawing::Icon ^icon = (cli::safe_cast<System::Drawing::Icon^  >(resources->GetObject(L"$this.Icon")));
436
			this->PictureBox->Image = icon->ToBitmap();
437
		}
438
		// clear package display
439
		else
440
		{
441
			GroupPackage->Text = "Current Package (None)";
442
			TextDesc->Text = "";
443
		}
444
 
445
		m_pSelectedMod = p;
446
		m_pSelectedPackage = ap;
447
 
448
		ButInstall->Enabled = enabled;
449
	}
450
 
451
	void PackageBrowser::SortList(System::Object ^Sender, ColumnClickEventArgs ^E)
452
	{
453
		if ( E->Column == m_iLastCol )
454
		{
455
			m_bReverse = !m_bReverse;
456
			this->ListPackages->ListViewItemSorter = gcnew ListViewItemComparer(E->Column, m_bReverse);
457
		}
458
		else
459
		{
460
			m_bReverse = false;
461
			this->ListPackages->ListViewItemSorter = gcnew ListViewItemComparer(E->Column, m_bReverse);
462
		}
463
		this->ListPackages->Sort();
464
		m_iLastCol = E->Column;
465
 
466
	}
467
 
468
	void PackageBrowser::DownloadPackage()
469
	{
470
		if ( !m_pSelectedPackage ) 
471
		{
472
			this->button1->Visible = false;
473
			return;
474
		}
475
 
476
		CheckUpdate ^update = gcnew CheckUpdate(m_pPackages, m_pImageList);
477
		update->SetDownloader();
478
		update->OnePackage(m_pSelectedPackage);
163 cycrow 479
		if (update->ShowDialog(this) == Windows::Forms::DialogResult::OK)
1 cycrow 480
		{
481
			this->DialogResult = Windows::Forms::DialogResult::Yes;
163 cycrow 482
			for (int i = 0; i < update->GetInstallList()->Count; i++)
483
				cli::safe_cast<MainGui^>(this->Owner)->InstallPackage(Convert::ToString(update->GetInstallList()[i]), false, false, true);
1 cycrow 484
			this->Close();
485
		}
163 cycrow 486
		else
487
		{
488
			m_pMainGui->FindPackages();
489
			this->UpdatePackages();
490
		}
491
 
1 cycrow 492
	}
493
 
494
}