Subversion Repositories spk

Rev

Rev 53 | Rev 68 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#include "../StdAfx.h"
2
#include "MainGui.h"
3
#include "ModSelector.h"
4
#include "PackageBrowser.h"
5
#include "InstallPackageDialog.h"
6
#include "CompareList.h"
7
#include "EditGlobals.h"
8
#include "DownloadPackageList.h"
9
#include "FileLog.h"
10
#include "MessageBoxDetails.h"
11
#include <shellapi.h>
12
 
13
using System::Configuration::ApplicationSettingsBase;
14
 
15
#undef GetEnvironmentVariable
16
 
17
enum {LISTGROUP_INSTALLED, LISTGROUP_SHIP, LISTGROUP_FAKE, LISTGROUP_LIBRARY, LISTGROUP_MOD, LISTGROUP_ARCHIVE};
18
 
19
namespace PluginManager {
20
 
21
	void MainGui::CheckProtectedDir()
22
	{
23
		CyString dir;
24
		if ( m_pDirList->Head() ) {
25
			m_bDirLocked = false;
26
			dir = m_pDirList->Head()->str;
27
 
28
			// write a file in the directory
29
			String ^sDir = SystemStringFromCyString(dir.findreplace("/", "\\"));
30
			bool written = true;
31
			StreamWriter ^sw = nullptr;
32
			try {
33
				sw = System::IO::File::CreateText(sDir + "\\checklock.xpmtest");
34
				sw->WriteLine("can write");
35
			}	
36
			catch (System::Exception ^) {
37
				written = false;
38
			}
39
			finally	{
40
				if ( sw )
41
					delete (IDisposable ^)sw;
42
			}
43
 
44
			// check its there
45
			if ( written ) {
46
				written = false;
47
				cli::array<String ^> ^dirList = IO::Directory::GetFiles(sDir, "*.xpmtest");
48
				if ( dirList && dirList->Length ) {
49
					for ( int i = 0; i < dirList->Length; i++ ) {
50
						if ( IO::FileInfo(dirList[i]).Name == "checklock.xpmtest" ) {
51
							written = true;
52
							break;
53
						}
54
					}
55
				}
56
			}
57
 
58
			// remove it
59
			if ( !IO::File::Exists(sDir + "\\checklock.xpmtest") )
60
				written = false;
61
			else {
62
				try {
63
					IO::File::Delete(sDir + "\\checklock.xpmtest");
64
					if ( IO::File::Exists(sDir + "\\checklock.xpmtest") )
65
						written = false;
66
				}
67
				catch (System::Exception ^) {
68
					written = false;
69
				}
70
			}
71
 
72
			if ( !written ) {
73
				MessageBox::Show(this, "ERROR: The game directory:\n" + SystemStringFromCyString(dir) + "\n\nIs locked and unable to add/remove any plugins", "Directory Locked", MessageBoxButtons::OK, MessageBoxIcon::Error);
74
				m_bDirLocked = true;
75
			}
76
			else {
77
				dir = dir.findreplace("/", "\\");
78
				bool found = false;
79
 
80
				String ^folder = Environment::GetFolderPath(Environment::SpecialFolder::ProgramFiles);
81
				if ( dir.IsIn(CyStringFromSystemString(folder)) )
82
					found = true;
83
				else {
84
					folder = Environment::GetEnvironmentVariable("ProgramFiles(x86)");
85
					if ( dir.IsIn(CyStringFromSystemString(folder)) )
86
						found = true;
87
				}
88
				if ( !found ) {
89
					folder = Environment::GetEnvironmentVariable("ProgramFiles");
90
					if ( dir.IsIn(CyStringFromSystemString(folder)) )
91
						found = true;
92
				}
93
 
94
				if ( found ) {
95
					if ( !m_pPackages->IsSupressProtectedWarning() ) {
96
						if ( MessageBox::Show(this, "WARNING: The game directory:\n" + SystemStringFromCyString(dir) + "\n\nIs in a protected directory (" + SystemStringFromCyString(CFileIO(dir).GetDir().GetToken("/", 1, 2).findreplace("/", "\\")) + ")\n\nThis might cause problems with installing anything, its better to move to game elsewhere, or you may need to run the Plugin Manager with admin access rights\n\nWould you like to surpress this warning in the future?", "Protected Directory", MessageBoxButtons::YesNo, MessageBoxIcon::Warning) == Windows::Forms::DialogResult::Yes ) {
97
							m_pPackages->SurpressProtectedWarning();
98
						}
99
					}
100
				}
101
			}
102
		}
103
	}
104
 
105
	void MainGui::GetGameDirs(CyString &dir, bool askDir, bool askDirAddon)
106
	{
107
		if ( CDirIO(dir).Exists() )
108
		{
109
			CyString gameName = m_pPackages->GetGameName(dir);
110
			if ( !gameName.Empty() )
111
			{
112
				if ( !m_pDirList->FindString(dir) && !m_pRemovedDirList->FindString(dir) ) {
113
					int lang = m_pPackages->GetGameLanguage(dir);
114
					if ( !askDir || MessageBox::Show(this, "New Game Directory Found:\n" + SystemStringFromCyString(dir) + " [" + SystemStringFromCyString(gameName) + "]\n\nDo you wish to add this?", "Add New Game", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == Windows::Forms::DialogResult::Yes ) {
115
						if ( lang )
116
							m_pDirList->PushFront(dir, CyString::Number(lang) + "|" + gameName);
117
						else
118
							m_pDirList->PushFront(dir, gameName);
119
					}
120
					else {
121
						m_pRemovedDirList->PushBack(dir);
122
					}
123
				}
124
 
125
				// check for any addons
126
				CyStringList addons;
127
				if ( m_pPackages->GetGameAddons(addons, dir) ) {
128
					for ( SStringList *str = addons.Head(); str; str = str->next ) {
129
						CyString exe = CDirIO(dir).File(str->str);
130
						dir = CDirIO(dir).Dir(str->data);
131
						if ( CDirIO(dir).Exists() && !m_pDirList->FindString(dir) && !m_pRemovedDirList->FindString(dir) ) {
132
							gameName = m_pPackages->GetGameName(exe);
133
							if ( !gameName.Empty() ) {
134
								int lang = m_pPackages->GetGameLanguage(dir);
135
								if ( !askDirAddon || MessageBox::Show(this, "New Game Directory Found:\n" + SystemStringFromCyString(dir) + " [" + SystemStringFromCyString(gameName) + "]\n\nDo you wish to add this?", "Add New Game", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == Windows::Forms::DialogResult::Yes ) {
136
									if ( lang )
137
										m_pDirList->PushFront(dir, CyString::Number(lang) + "|" + gameName);
138
									else
139
										m_pDirList->PushFront(dir, gameName);
140
								}
141
								else {
142
									m_pRemovedDirList->PushBack(dir);
143
								}
144
							}
145
						}
146
					}
147
				}
148
			}
149
		}
150
	}
151
 
152
	void MainGui::UpdateDirList()
153
	{
154
		ComboDir->Items->Clear();
155
 
156
		if ( !m_pDirList || !m_pDirList->Head() )
157
			return;
158
 
159
		for ( SStringList *node = m_pDirList->Head(); node; node = node->next )
160
		{
161
			System::String ^str;
162
			if ( node->data.IsIn("|") )
163
				str = SystemStringFromCyString(node->str + " [" + node->data.GetToken("|", 2) + "] (Language: " + CPackages::ConvertLanguage(node->data.GetToken("|", 1, 1).ToInt()) + ")");
164
			else
165
				str = SystemStringFromCyString(node->str + " [" + node->data + "]");
166
			ComboDir->Items->Add(str);
167
 
168
			// first item 
169
			if ( node == m_pDirList->Head() )
170
				ComboDir->Text = str;
171
		}
172
 
173
		this->UpdateRunButton();
174
	}
175
 
176
	void MainGui::UpdateRunButton()
177
	{
178
		ButRun->Text = "Run: " + SystemStringFromCyString(m_pPackages->GetGameName());
179
 
56 cycrow 180
		CyString exe = m_pPackages->GetGameExe()->GetGameRunExe(m_pPackages->GetCurrentDirectory().ToString());
52 cycrow 181
		if ( CFileIO(exe).ExistsOld() )
1 cycrow 182
		{
183
			exe = exe.FindReplace("/", "\\");
184
			wchar_t wText[200];
185
			::MultiByteToWideChar(CP_ACP, NULL, (char *)exe.c_str(), -1, wText, exe.Length() + 1);
186
 
187
			System::Drawing::Icon ^myIcon;
188
			SHFILEINFO *shinfo = new SHFILEINFO();
189
 
190
			if ( FAILED(SHGetFileInfo(wText, 0, shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_LARGEICON)) )
191
			{
192
				if ( FAILED(SHGetFileInfo(wText, 0, shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_SMALLICON)) )
193
				{
194
					System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(MainGui::typeid));
195
					this->ButRun->Image = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"ButRun.Image")));
196
				}
197
				else
198
				{
199
					myIcon = System::Drawing::Icon::FromHandle(IntPtr(shinfo->hIcon));
200
					ButRun->Image = myIcon->ToBitmap();
201
				}
202
			}
203
			else
204
			{
205
				myIcon = System::Drawing::Icon::FromHandle(IntPtr(shinfo->hIcon));
206
				ButRun->Image = myIcon->ToBitmap();
207
			}
208
 
209
			delete shinfo;
210
		}
211
	}
212
 
213
	void MainGui::_DisplayPackages(CBaseFile *currentParent, ListViewGroup ^useGroup)
214
	{
215
		CLinkList<CBaseFile> packageList;
216
 
217
		for ( CBaseFile *p = m_pPackages->FirstPackage(); p; p = m_pPackages->NextPackage() )
218
		{
219
			if ( p->IsMod() )
220
				continue;
50 cycrow 221
			if ( p->author().Compare("PluginManager") )
1 cycrow 222
				continue;
223
			// if thier parent is a library dont add unless top level
224
			if ( currentParent && p->GetParent() && p->GetParent()->GetType() == TYPE_SPK && ((CSpkFile *)p->GetParent())->IsLibrary() )
225
				continue;
226
			else if ( p->GetParent() == currentParent )
227
				packageList.push_back(p);
228
			// add any mod addons as the top level
229
			else if ( p->GetParent() && p->GetParent()->IsMod() && !currentParent && p->GetParent() == m_pPackages->GetEnabledMod() )
230
				packageList.push_back(p);
231
			// if thier parent is a library add at top level
232
			else if ( !currentParent && p->GetParent() && p->GetParent()->GetType() == TYPE_SPK && ((CSpkFile *)p->GetParent())->IsLibrary() )
233
				packageList.push_back(p);
234
		}
235
 
236
		array<SortPackage ^> ^aPackages = gcnew array<SortPackage ^>(packageList.size());
237
		array<System::String ^> ^aNames = gcnew array<System::String ^>(packageList.size());
238
 
239
		int i = 0;
240
		for ( CBaseFile *p = packageList.First(); p; p = packageList.Next(), i++ )
241
		{
242
			aPackages[i] = gcnew SortPackage(p);
243
			if ( m_iSortingColumn == SORT_AUTHOR ) // sort by author
50 cycrow 244
				aNames[i] = _US(p->author())->ToLower();
1 cycrow 245
			else if ( m_iSortingColumn == SORT_VERSION ) // sort by author
50 cycrow 246
				aNames[i] = _US(p->version())->ToLower();
1 cycrow 247
			else if ( m_iSortingColumn == SORT_CREATED ) // sort by author
50 cycrow 248
				aNames[i] = _US(p->creationDate().token("/", 3) + p->creationDate().token("/", 2) + p->creationDate().token("/", 1));
1 cycrow 249
			else if ( m_iSortingColumn == SORT_ENABLE ) // sort by author
250
			{
251
				if ( p->IsEnabled() )
252
					aNames[i] = SystemStringFromCyString(CyString::Number(1));
253
				else
254
					aNames[i] = SystemStringFromCyString(CyString::Number(0));
255
			}
256
			else if ( m_iSortingColumn == SORT_SIGNED ) // sort by author
257
			{
258
				if ( p->IsEnabled() )
259
					aNames[i] = SystemStringFromCyString(CyString::Number(1));
260
				else
261
					aNames[i] = SystemStringFromCyString(CyString::Number(0));
262
			}
263
			else if ( m_iSortingColumn == SORT_TYPE ) // sort by type
264
			{
265
				if ( p->GetType() == TYPE_XSP )
266
					aNames[i] = "Ship";
267
				else if ( p->GetType() == TYPE_ARCHIVE )
268
					aNames[i] = "- Archive -";
269
				else if ( p->GetType() == TYPE_SPK )
270
					aNames[i] = SystemStringFromCyString(((CSpkFile *)p)->GetScriptTypeString(m_pPackages->GetLanguage()));
271
				else
272
					aNames[i] = "";
273
			}
274
			else
275
				aNames[i] = SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage()))->ToLower();
276
		}
277
 
278
		Array::Sort(aNames, aPackages);
279
 
280
		// now display
281
		for ( i = 0; i < aPackages->Length; i++ )
282
		{
283
			CBaseFile *p = (m_bSortingAsc) ? aPackages[i]->Package : aPackages[(aPackages->Length - 1 - i)]->Package;
284
			CyString name;
285
			if ( p->GetType() == TYPE_ARCHIVE )
50 cycrow 286
				name = CFileIO(p->filename()).GetFilename();
1 cycrow 287
			else
288
				name = p->GetLanguageName(m_pPackages->GetLanguage());
289
 
290
			int indent = 0;
291
			CBaseFile *parent = p;
292
 
293
			if ( p->GetParent() && p->GetParent()->GetType() == TYPE_SPK && ((CSpkFile *)p->GetParent())->IsLibrary() )
294
				indent = 0;
295
			else
296
			{
297
				while ( parent->GetParent() )
298
				{
299
					parent = parent->GetParent();
300
					++indent;
301
				}
302
 
303
				if ( p->GetParent() && p->GetParent() == m_pPackages->GetEnabledMod() )
304
					--indent;
305
			}
306
 
307
			ListViewItem ^item = gcnew ListViewItem(SystemStringFromCyString(name));
308
			item->IndentCount = (indent * 2);
50 cycrow 309
			item->SubItems->Add(_US(p->author()));
310
			item->SubItems->Add(_US(p->version()));
311
			item->SubItems->Add(_US(p->creationDate()));
1 cycrow 312
			if ( p->GetType() == TYPE_XSP )
313
				item->SubItems->Add("Ship");
314
			else if ( p->GetType() == TYPE_ARCHIVE )
315
				item->SubItems->Add("- Archive -");
316
			else if ( p->GetType() == TYPE_SPK )
317
			{
318
				CSpkFile *spk = (CSpkFile *)p;
319
				item->SubItems->Add(SystemStringFromCyString(spk->GetScriptTypeString(m_pPackages->GetLanguage())));
320
			}
321
			else
322
				item->SubItems->Add("");
323
 
324
			if ( p->IsEnabled() )
325
				item->SubItems->Add("Yes");
326
			else
327
				item->SubItems->Add("No");
328
			if ( p->IsSigned() )
329
				item->SubItems->Add("Yes");
330
			else
331
				item->SubItems->Add("No");
332
			item->Tag = SystemStringFromCyString(CyString::Number(p->GetNum()));
333
 
334
			ListPackages->Items->Add(item);
335
 
336
			if ( useGroup )
337
				item->Group = useGroup;
338
			else
339
			{
340
				int addGroup = LISTGROUP_INSTALLED;
341
				if ( p->GetParent() && p->GetParent() == m_pPackages->GetEnabledMod() )
342
					addGroup = LISTGROUP_MOD;
343
				else if ( p->GetType() == TYPE_SPK && ((CSpkFile *)p)->IsLibrary() )
344
					addGroup = LISTGROUP_LIBRARY;
345
				else if ( p->GetType() == TYPE_SPK && ((CSpkFile *)p)->IsFakePatch() )
346
					addGroup = LISTGROUP_FAKE;
347
				else if ( p->GetType() == TYPE_XSP )
348
					addGroup = LISTGROUP_SHIP;
349
				else if ( p->GetType() == TYPE_ARCHIVE )
350
					addGroup = LISTGROUP_ARCHIVE;
351
 
352
				item->Group = ListPackages->Groups[addGroup];
353
			}
354
 
355
			CyString groupName = CyStringFromSystemString(item->Group->Header);
356
			if ( groupName.IsIn(" [") )
357
			{
358
				int enabled = groupName.GetToken(" [", 2, 2).GetToken("/", 1, 1).ToInt();
359
				int total = groupName.GetToken(" [", 2, 2).GetToken("/", 2, 2).GetToken("]", 1, 1).ToInt() + 1;
360
				if ( p->IsEnabled() ) ++enabled;
361
				groupName = groupName.GetToken(" [", 1, 1) + " [" + CyString::Number(enabled) + "/" + CyString::Number(total) + "]";
362
			}
363
			else
364
			{
365
				if ( p->IsEnabled() )
366
					groupName = groupName + " [1/1]";
367
				else
368
					groupName = groupName + " [0/1]";
369
			}
370
			item->Group->Header = SystemStringFromCyString(groupName);
371
 
372
			// get the icon
373
			item->ImageIndex = -1;
374
			if ( p->GetIcon() )
375
				PluginManager::DisplayListIcon(p, ListPackages, item);
376
 
377
			if ( item->ImageIndex == -1 )
378
			{
379
				if ( p->GetType() == TYPE_XSP )
380
					item->ImageKey = "ship";
381
				else if ( p->GetType() == TYPE_ARCHIVE )
382
					item->ImageKey = "archive";
383
				else if ( p->GetType() == TYPE_SPK && ((CSpkFile *)p)->IsLibrary() )
384
					item->ImageKey = "library";
385
				else if ( p->IsFakePatch() )
386
					item->ImageKey = "fake";
387
				else
388
					item->ImageKey = "package";
389
			}
390
 
391
			// check for any children
392
			this->_DisplayPackages(p, item->Group);
393
		}
394
	}
395
 
396
	void MainGui::UpdatePackages()
397
	{
398
		ListPackages->Items->Clear();
399
		ListPackages->Groups->Clear();
400
		ListPackages->SmallImageList = gcnew ImageList();
401
		ListPackages->LargeImageList = gcnew ImageList();
402
		ListPackages->LargeImageList->ImageSize = System::Drawing::Size(32, 32);
403
		ListPackages->LargeImageList->ColorDepth = Windows::Forms::ColorDepth::Depth32Bit;
404
		ListPackages->SmallImageList->ImageSize = System::Drawing::Size(16, 16);
405
		ListPackages->SmallImageList->ColorDepth = Windows::Forms::ColorDepth::Depth32Bit;
406
 
407
		int index = this->imageList1->Images->IndexOfKey("package.png");
408
		if ( index != -1 )
409
		{
410
			ListPackages->SmallImageList->Images->Add("package", this->imageList1->Images[index]);
411
			ListPackages->LargeImageList->Images->Add("package", this->imageList1->Images[index]);
412
		}
413
		index = this->imageList1->Images->IndexOfKey("ship.png");
414
		if ( index != -1 )
415
		{
416
			ListPackages->SmallImageList->Images->Add("ship", this->imageList1->Images[index]);
417
			ListPackages->LargeImageList->Images->Add("ship", this->imageList1->Images[index]);
418
		}
419
		index = this->imageList1->Images->IndexOfKey("fake.png");
420
		if ( index != -1 )
421
		{
422
			ListPackages->SmallImageList->Images->Add("fake", this->imageList1->Images[index]);
423
			ListPackages->LargeImageList->Images->Add("fake", this->imageList1->Images[index]);
424
		}
425
		index = this->imageList1->Images->IndexOfKey("library.png");
426
		if ( index != -1 )
427
		{
428
			ListPackages->SmallImageList->Images->Add("library", this->imageList1->Images[index]);
429
			ListPackages->LargeImageList->Images->Add("library", this->imageList1->Images[index]);
430
		}
431
 
432
		index = this->imageList1->Images->IndexOfKey("archive.png");
433
		if ( index != -1 )
434
		{
435
			ListPackages->SmallImageList->Images->Add("archive", this->imageList1->Images[index]);
436
			ListPackages->LargeImageList->Images->Add("archive", this->imageList1->Images[index]);
437
		}
438
 
439
		ListViewGroup ^group = gcnew ListViewGroup("Installed Scripts", HorizontalAlignment::Left);
440
		ListPackages->Groups->Add(group);
441
		ListViewGroup ^shipGroup = gcnew ListViewGroup("Installed Ships", HorizontalAlignment::Left);
442
		ListPackages->Groups->Add(shipGroup);
443
		ListViewGroup ^fakeGroup = gcnew ListViewGroup("Fake Patches", HorizontalAlignment::Left);
444
		ListPackages->Groups->Add(fakeGroup);
445
		ListViewGroup ^libGroup = gcnew ListViewGroup("Script Libraries", HorizontalAlignment::Left);
446
		ListPackages->Groups->Add(libGroup);
447
		ListViewGroup ^modGroup = gcnew ListViewGroup("Current Mod Addons", HorizontalAlignment::Left);
448
		ListPackages->Groups->Add(modGroup);
449
		ListViewGroup ^arcGroup = gcnew ListViewGroup("Installed Archives", HorizontalAlignment::Left);
450
		ListPackages->Groups->Add(arcGroup);
451
 
452
		// sort the items
453
		if ( m_pPackages )
454
		{
455
			m_pPackages->AssignPackageNumbers();
456
			this->_DisplayPackages(NULL, nullptr);
457
		}
458
 
459
		PackageListSelected(ListPackages, gcnew System::EventArgs());
460
		ListPackages->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
461
 
462
		// update the status bar
463
		LabelStatus->Text = "Plugins Available: " + (m_pPackages->CountPackages(TYPE_BASE, false) - m_pPackages->CountBuiltInPackages(false))+ " (" + (m_pPackages->CountPackages(TYPE_BASE, true) - m_pPackages->CountBuiltInPackages(true)) + " Enabled)";
464
	}
465
 
466
	void MainGui::StartCheckTimer()
467
	{
468
		System::Windows::Forms::Timer ^timer = gcnew System::Windows::Forms::Timer();
469
		timer->Interval = 5000;
470
		timer->Tick += gcnew System::EventHandler(this, &MainGui::TimerEvent_CheckFile);
471
		timer->Start();
472
	}
473
 
474
 
475
	//
476
	// Update Controls
477
	// Updates any additional controls, ie adding columns to package list
478
	//
479
	void MainGui::UpdateControls()
480
	{
481
		// Package List Columns
482
		int csize = ListPackages->Width - 200 - 5;
483
		int psize = ((csize * 7) / 10);
484
		int asize = ((csize * 3) / 10);
485
		if ( psize < 60 ) psize = 60;
486
		if ( asize < 60 ) asize = 60;
487
		ListPackages->Columns->Clear();
488
		ListPackages->Columns->Add("Package", psize, HorizontalAlignment::Left);
489
		ListPackages->Columns->Add("Author", asize, HorizontalAlignment::Left);
490
		ListPackages->Columns->Add("Version", 60, HorizontalAlignment::Right);
491
		ListPackages->Columns->Add("Updated", 80, HorizontalAlignment::Left);
492
		ListPackages->Columns->Add("Type", 100, HorizontalAlignment::Left);
493
		ListPackages->Columns->Add("Enabled", 60, HorizontalAlignment::Right);
494
		ListPackages->Columns->Add("Signed", 60, HorizontalAlignment::Right);
495
		ListPackages->FullRowSelect = true;
496
		ListPackages->Focus();
497
 
498
		if ( m_pPackages->IsVanilla() )
499
			m_pMenuBar->Vanilla();
500
		else
501
			m_pMenuBar->Modified();
502
	}
503
 
504
	//
505
	// Install a package
506
	// Called from either install button, or from command line
507
	//
508
	bool MainGui::InstallPackage(System::String ^file, bool straightAway, bool builtin, bool background)
509
	{
510
		bool errored = false;
511
 
512
		if ( file->Length )
513
		{
514
			int error;
515
			CBaseFile *package = m_pPackages->OpenPackage(CyStringFromSystemString(file), &error, 0, SPKREAD_NODATA, READFLAG_NOUNCOMPRESS);
516
			if ( error == INSTALLERR_NOMULTI )
517
			{
518
				CLinkList<CBaseFile> erroredList;
519
				m_pPackages->PrepareMultiPackage(CyStringFromSystemString(file), &erroredList, &error, 0);
520
				if ( erroredList.size() )
521
				{
522
					System::String ^modified;
523
					for ( CBaseFile *p = erroredList.First(); p; p = erroredList.Next() )
524
					{
525
						p->SetOverrideFiles(builtin);
526
						if ( m_pPackages->PrepareInstallPackage(p, false, false, IC_MODIFIED) != INSTALLCHECK_OK )
527
						{
528
							modified += SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage()));
529
							modified += "\n";
530
							errored = true;
531
						}
532
					}
533
 
534
					if ( errored )
535
						this->DisplayMessageBox(false, "Installing", "Currently in Vanilla Mode, Package is not an Vanilla Package\n\n" + modified + "\nSwitch to modified mode if you wish to install this package", MessageBoxButtons::OK, MessageBoxIcon::Question);
536
				}
537
			}
538
			else if ( !package )
539
			{
540
				System::String ^errorStr;
541
				switch ( error )
542
				{
543
					case INSTALLERR_OLD:
544
						errorStr = "File is in old format no longer supported";
545
						break;
546
					case INSTALLERR_NOEXIST:
547
						errorStr = "file doesn't exist";
548
						break;
549
					case INSTALLERR_INVALID:
550
						errorStr = "Invalid package file";
551
						break;
552
					case INSTALLERR_NOSHIP:
553
						errorStr = "Ship Packages are currently not supported";
554
						break;
555
					case INSTALLERR_VERSION:
556
						errorStr = "Package file was created in a newer version, unable to open";
557
						break;
558
 
559
					default:
560
						errorStr = "Unknown Error";
561
				}
562
 
563
				if ( !builtin )
564
					this->DisplayMessageBox(false, "Open Package Error", "Error Opening: " + file + "\n" + errorStr, MessageBoxButtons::OK, MessageBoxIcon::Stop);
565
				errored = true;
566
			}
567
			else
568
			{
569
				if ( builtin )
570
				{
571
					package->SetOverrideFiles(builtin);
572
					if ( m_pPackages->PrepareInstallPackage(package, false, false, IC_WRONGGAME|IC_WRONGVERSION|IC_OLDVERSION) != INSTALLCHECK_OK )
573
						errored = true;
574
				}
575
				else
576
				{
577
					int errorNum = m_pPackages->PrepareInstallPackage(package, false, false, IC_ALL);
578
					if ( errorNum != INSTALLCHECK_OK )
579
					{
580
						if ( errorNum == INSTALLCHECK_NOSHIP )
581
						{
582
							this->DisplayMessageBox(false, "No Ships", "Ships are not supported for " + SystemStringFromCyString(m_pPackages->GetGameName()), MessageBoxButtons::OK, MessageBoxIcon::Stop);
583
							errored = true;
584
						}
585
						else if ( m_pPackages->PrepareInstallPackage(package, false, false, IC_MODIFIED) != INSTALLCHECK_OK )
586
						{
587
							this->DisplayMessageBox(false, "Installing", "Currently in Vanilla Mode, Package is not an Vanilla Package\n" + SystemStringFromCyString(package->GetLanguageName(m_pPackages->GetLanguage())) + "\n\nSwitch to modified mode if you wish to install this package", MessageBoxButtons::OK, MessageBoxIcon::Question);
588
							errored = true;
589
						}
590
					}
591
 
592
					// check for compatabilities
593
					CLinkList<CBaseFile> packages;
594
					int compat = m_pPackages->CheckCompatabilityAgainstPackages(package, NULL, &packages);
595
					if ( compat )
596
					{
597
						String ^message = "\nConflicts with:\n";
598
						for ( CBaseFile *p = packages.First(); p; p = packages.Next() )
599
							message += SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage())) + "\n";
600
 
601
						if ( MessageBox::Show(this, SystemStringFromCyString(package->GetFullPackageName(m_pPackages->GetLanguage())) + ":\nIncompatabilities found with installed fake patches\n" + message + "\n\nDo you still wish to install?", "Packages Incompatable", MessageBoxButtons::YesNo, MessageBoxIcon::Warning) != Windows::Forms::DialogResult::Yes )
602
						{
603
							m_pPackages->RemovePreparedInstall(package);
604
							errored = true;
605
						}
606
					}
607
				}
608
 
609
				// not installing
610
				if ( errored )
611
				{
612
					delete package;
613
					package = NULL;
614
				}
615
			}
616
		}
617
 
618
		if ( errored )
619
		{
620
			this->Enabled= true;
621
			this->ProgressBar->Hide();
622
			return false;
623
		}
624
 
625
		// start installing
626
		if ( straightAway )
627
			return this->StartInstalling(builtin, background);
628
 
629
		return true;
630
	}
631
 
632
	void MainGui::DoUninstall()
633
	{
634
		m_pPi = gcnew PackageInstalled("Uninstall Packages");
635
 
636
		CLinkList<CBaseFile> packageList;
637
		CLinkList<CBaseFile> disableList;
638
 
639
		if ( m_pPackages->UninstallPreparedPackages(m_pFileErrors, 0, &packageList, &disableList) )
640
		{
641
			CyString sDisplay;
642
			CyString sAfterText;
643
			for ( CBaseFile *p = packageList.First(); p; p = packageList.Next() )
644
			{
645
				sAfterText = m_pPackages->GetUninstallAfterText(p);
50 cycrow 646
				m_pPi->AddPackageWithGroup(SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage())), _US(p->author()), _US(p->version()), (sAfterText.Empty() ? "Uninstalled" : SystemStringFromCyString(sAfterText)), "Uninstalled");
1 cycrow 647
				sDisplay = p->GetFullPackageName(m_pPackages->GetLanguage());
648
				delete p;
649
			}
650
			for ( CBaseFile *p = disableList.First(); p; p = disableList.Next() )
50 cycrow 651
				m_pPi->AddPackageWithGroup(SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage())), _US(p->author()), _US(p->version()), "Disabled", "Dependants Disabled");
1 cycrow 652
			packageList.clear();			
653
 
654
			if ( m_pPi->PackageCount() == 1 )
655
			{
656
				if ( sAfterText.Empty() )
657
					this->DisplayMessageBox(true, "Uninstalled", "Package Uninstalled\n" + SystemStringFromCyString(sDisplay), MessageBoxButtons::OK, MessageBoxIcon::Information);
658
				else
659
					this->DisplayMessageBox(true, "Uninstalled", "Package Uninstalled\n" + SystemStringFromCyString(sDisplay) + "\n\n" + SystemStringFromCyString(sAfterText), MessageBoxButtons::OK, MessageBoxIcon::Information);
660
			}
661
			else
662
				m_bDisplayDialog = true;
663
		}
664
		else
665
			this->DisplayMessageBox(true, "Uninstall Error", "Error Uninstalling", MessageBoxButtons::OK, MessageBoxIcon::Stop);
666
	}
667
 
668
	void MainGui::DoDisable()
669
	{
670
		CLinkList<CBaseFile> packageList;
671
 
672
		System::String ^display;
673
		m_pPi = gcnew PackageInstalled("Enabled/Disabled Packages");
674
 
675
		if ( m_pPackages->GetNumPackagesInDisabledQueue() )
676
		{
677
			if ( m_pPackages->DisablePreparedPackages(0, 0, &packageList) )
678
			{
679
				for ( CBaseFile *p = packageList.First(); p; p = packageList.Next() )
680
				{
50 cycrow 681
					m_pPi->AddPackageWithGroup(SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage())), _US(p->author()), _US(p->version()), "Disabled", "Disabled Packages");
1 cycrow 682
					display = "Package Disabled\n\n" + SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage()));
683
				}
684
			}
685
			else
686
				this->DisplayMessageBox(true, "Disable Error", "Error Disabling packages", MessageBoxButtons::OK, MessageBoxIcon::Stop);
687
		}
688
 
689
		packageList.clear();
690
		if ( m_pPackages->GetNumPackagesInEnabledQueue() )
691
		{
692
			if ( m_pPackages->EnablePreparedPackages(0, 0, &packageList) )
693
			{
694
				for ( CBaseFile *p = packageList.First(); p; p = packageList.Next() )
695
				{
50 cycrow 696
					m_pPi->AddPackageWithGroup(SystemStringFromCyString(p->GetLanguageName(m_pPackages->GetLanguage())), _US(p->author()), _US(p->version()), "Enabled", "Enable Packages");
1 cycrow 697
					display = "Package Enabled\n\n" + SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage()));
698
				}
699
			}
700
			else
701
				this->DisplayMessageBox(true, "Enable Error", "Error Enabling packages", MessageBoxButtons::OK, MessageBoxIcon::Stop);
702
		}
703
 
704
		if ( m_pPi->PackageCount() == 1 )
705
			this->DisplayMessageBox(true, "Packages Enabled/Disabled", display, MessageBoxButtons::OK, MessageBoxIcon::Information);
706
		else
707
		{
708
			m_bDisplayDialog = true;
709
		}
710
	}
711
 
712
	void MainGui::DoInstall(bool builtin, bool frombackground)
713
	{
714
		CLinkList<CBaseFile> erroredPackages;
715
		CLinkList<CBaseFile> installedPackages;
716
		if ( m_pPackages->InstallPreparedPackages(m_pFileErrors, 0, &erroredPackages, &installedPackages) )
717
		{
718
			if ( !builtin )
719
			{
720
				if ( installedPackages.size() == 1 && erroredPackages.size() == 0 )
721
				{
722
					CBaseFile *p = installedPackages.Front()->Data();
723
					CyString packageName = p->GetFullPackageName(m_pPackages->GetLanguage());
724
					CyString afterText = m_pPackages->GetInstallAfterText(p);
725
					if ( afterText.Empty() )
726
						this->DisplayMessageBox(frombackground, "Installed", "Package: " + SystemStringFromCyString(packageName) + " installed!\n\n", MessageBoxButtons::OK, MessageBoxIcon::Information);
727
					else
728
					{
729
						afterText.StripHTML();
730
						this->DisplayMessageBox(frombackground, "Installed", "Package: " + SystemStringFromCyString(packageName) + " installed!\n\n" + SystemStringFromCyString(afterText), MessageBoxButtons::OK, MessageBoxIcon::Information);
731
					}
732
				}
733
				else
734
				{
735
					m_pPi = gcnew PackageInstalled("Packages Installed");
736
 
737
					CyStringList packages;
738
					for ( CListNode<CBaseFile> *node = installedPackages.Front(); node; node = node->next() )
739
					{
740
						CBaseFile *p = node->Data();
741
						CyString packageName = p->GetFullPackageName(m_pPackages->GetLanguage());
742
						CyString afterText = m_pPackages->GetInstallAfterText(p);
743
 
744
						if ( afterText.Empty() )
745
							afterText = "Installed";
50 cycrow 746
						m_pPi->AddPackage(SystemStringFromCyString(packageName), _US(p->author()), _US(p->version()), SystemStringFromCyString(afterText));
1 cycrow 747
					}
748
					for ( CListNode<CBaseFile> *node = erroredPackages.Front(); node; node = node->next() )
749
					{
750
						CBaseFile *p = node->Data();
751
						CyString packageName = p->GetFullPackageName(m_pPackages->GetLanguage());
50 cycrow 752
						m_pPi->AddPackage(SystemStringFromCyString(packageName), _US(p->author()), _US(p->version()), SystemStringFromCyString("Failed to Install"));
1 cycrow 753
					}
754
 
755
					m_bDisplayDialog = true;
756
				}
757
			}
758
		}
759
		// no packages were installed
760
		else 
761
		{
762
			if ( !builtin )
763
			{
764
				if ( erroredPackages.size() == 1 )
765
				{
766
					CBaseFile *p = erroredPackages.Front()->Data();
767
					CyString packageName = p->GetFullPackageName(m_pPackages->GetLanguage());
768
					this->DisplayMessageBox(frombackground, "Error Installing", "Package: " + SystemStringFromCyString(packageName) + " failed to install!\nError: " + SystemStringFromCyString(CBaseFile::ErrorString(p->GetLastError(), p->GetLastErrorString())) + "\n", MessageBoxButtons::OK, MessageBoxIcon::Error);
769
				}
770
				else
771
				{
772
					m_pPi = gcnew PackageInstalled("Packages Failed To Install");
773
 
774
					CyStringList packages;
775
					for ( CListNode<CBaseFile> *node = erroredPackages.Front(); node; node = node->next() )
776
					{
777
						CBaseFile *p = node->Data();
778
						CyString packageName = p->GetFullPackageName(m_pPackages->GetLanguage());
50 cycrow 779
						m_pPi->AddPackage(SystemStringFromCyString(packageName), _US(p->author()), _US(p->version()), "Failed: " + SystemStringFromCyString(CBaseFile::ErrorString(p->GetLastError(), p->GetLastErrorString())));
1 cycrow 780
					}
781
 
782
					m_bDisplayDialog = true;
783
				}
784
			}
785
		}
786
 
787
		if ( !frombackground )
788
			this->Background_Finished();
789
	}
790
 
791
	void MainGui::ClearSelectedItems()
792
	{
793
		for ( int i = 0; i < this->ListPackages->Items->Count; i++ )
794
			this->ListPackages->Items[i]->Selected = false;
795
		PackageListSelected(ListPackages, gcnew System::EventArgs());
796
	}
797
 
798
	bool MainGui::StartInstalling(bool builtin, bool background, bool archive)
799
	{
800
		// no packages to install
801
		if ( !m_pPackages->GetNumPackagesInQueue() )
802
			return false;
803
 
804
		// clear selected
805
		this->ClearSelectedItems();
806
 
807
		// lets install them now
808
		CLinkList<CBaseFile> lCheckPackages;
809
		if ( m_pPackages->CheckPreparedInstallRequired(&lCheckPackages) )
810
		{
811
			for ( CListNode<CBaseFile> *pNode = lCheckPackages.Front(); pNode; pNode = pNode->next() )
812
			{
813
				CBaseFile *package = pNode->Data();
814
				CSpkFile *spk = (CSpkFile *)package;
815
 
816
				CyStringList missingList;
817
				if ( m_pPackages->GetMissingDependacies(package, &missingList) )
818
				{
819
					CyString requires;
820
					for ( SStringList *strNode = missingList.Head(); strNode; strNode = strNode->next )
821
					{
822
						if ( strNode->str.IsIn("|") )
823
							requires += strNode->str.GetToken("|", 1, 1) + " V" + strNode->str.GetToken("|", 2, 2) + " by " + strNode->data;
824
						else
825
							requires += strNode->str + " by " + strNode->data;
826
						requires += "\n";
827
					}
828
					this->DisplayMessageBox(false, "Installing", "Missing Package for " + SystemStringFromCyString(package->GetLanguageName(m_pPackages->GetLanguage())) + "\nRequires:\n" + SystemStringFromCyString(requires), MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
829
				}
830
			}
831
		}
832
 
833
		// no packages to install
834
		if ( !m_pPackages->GetNumPackagesInQueue() )
835
		{
836
			this->Enabled = true;
837
			this->ProgressBar->Hide();
838
			return false;
839
		}
840
 
841
		ProgressBar->Show();
842
		this->Enabled = false;
843
 
844
		if ( builtin )
845
		{
846
			if ( background )
847
				this->StartBackground(MGUI_BACKGROUND_INSTALLBUILTIN);
848
			else
849
				this->DoInstall(builtin, false);
850
		}
851
		else if ( archive )
852
		{
853
			if ( background )
854
				this->StartBackground(MGUI_BACKGROUND_INSTALL);
855
			else
856
				this->DoInstall(false, false);
857
		}
858
		else
859
		{
860
			InstallPackageDialog ^installDialog = gcnew InstallPackageDialog(m_pPackages);
861
			if ( installDialog->ShowDialog(this) == System::Windows::Forms::DialogResult::OK )
862
			{
863
				// no packages to install
864
				if ( !m_pPackages->GetNumPackagesInQueue() )
865
				{
866
					this->Enabled = true;
867
					this->ProgressBar->Hide();
868
					return false;
869
				}
870
				if ( background )
871
					this->StartBackground(MGUI_BACKGROUND_INSTALL);
872
				else
873
					this->DoInstall(false, false);
874
			}
875
			else
876
			{
877
				m_pPackages->RemovePreparedInstall(NULL);
878
				this->Enabled = true;
879
				this->ProgressBar->Hide();
880
				return false;
881
			}
882
		}
883
		return true;
884
	}
885
 
886
	bool MainGui::StartBackground(int type, System::String ^info)
887
	{
888
		if ( backgroundWorker1->IsBusy )
889
			return false;
890
		if ( m_bRunningBackground )
891
			return false;
892
 
893
		m_sBackgroundInfo = info;
894
		return this->StartBackground(type);
895
	}
896
 
897
	bool MainGui::StartBackground(int type)
898
	{
899
		if ( backgroundWorker1->IsBusy )
900
			return false;
901
		if ( m_bRunningBackground )
902
			return false;
903
 
904
		m_iBackgroundTask = type;
905
 
906
		backgroundWorker1->RunWorkerAsync();
907
		m_bRunningBackground = true;
908
		return true;
909
	}
910
 
911
	void MainGui::ChangeDirectory(CyString dir)
912
	{
913
		if ( m_pPackages->IsCurrentDir(dir) )
914
			return;
915
 
916
		if ( m_pPackages->IsLoaded() )
917
		{
918
			if ( m_pPackages->CloseDir(0, 0, true) )
919
			{
920
				// write the modname
921
				if ( !m_pPackages->GetModKey().Empty() )
922
					PluginManager::WriteRegistryValue(m_pPackages->GetModKey(), m_pPackages->GetSelectedModName());
923
				m_pPackages->Reset();
924
			}
925
			else
926
			{
927
				this->DisplayMessageBox(true, "Error", "unable to close directory", MessageBoxButtons::OK, MessageBoxIcon::Error);
928
				return;
929
			}
930
		}
931
 
932
		m_pPackages->Reset();
933
 
934
		if ( m_pPackages->Read(dir, 0) )
935
		{
936
			if ( m_iSaveGameManager == 1 )
937
				m_pPackages->RestoreSaves();
938
			m_pPackages->UpdatePackages();
939
			m_pPackages->ReadGameLanguage(true);
940
			this->UpdateRunButton();
941
			System::String ^mod = PluginManager::ReadRegistryValue(m_pPackages->GetModKey());
942
			m_pPackages->SetMod(CyStringFromSystemString(mod));
943
		}
944
		else
945
		{
946
			this->DisplayMessageBox(true, "Error", "unable to open new directory", MessageBoxButtons::OK, MessageBoxIcon::Error);
947
			this->Close();
948
		}
949
	}
950
 
951
	CBaseFile *MainGui::FindPackageFromList(ListViewItem ^item)
952
	{
953
		if ( !item )
954
			return NULL;
955
 
956
		System::String ^sNum = System::Convert::ToString(item->Tag);
957
		int iNum = CyStringFromSystemString(sNum).ToInt();
958
 
959
		CBaseFile *p = m_pPackages->GetPackageAt(iNum);
960
		return p;
961
	}
962
 
963
	void MainGui::FindPackagesOnline()
964
	{
965
		CyStringList servers;
966
		m_pPackages->FindAllServers(&servers);
967
		if ( servers.Empty() )
968
		{
969
			MessageBox::Show(this, "Found now web address to check for packages", "No Web Address", MessageBoxButtons::OK, MessageBoxIcon::Warning);
970
			return;
971
		}
972
 
973
		DownloadPackageList ^dpl = gcnew DownloadPackageList(m_pPackages, &servers);
974
		dpl->ShowDialog(this);
975
 
976
		if ( m_pPackages->AnyAvailablePackages() )
977
			MessageBox::Show(this, "Package update completed\n" + m_pPackages->GetAvailablePackageList()->size() + " packages have been added to the package browser", "Found Packages", MessageBoxButtons::OK, MessageBoxIcon::Information);
978
		else
979
			MessageBox::Show(this, "Unable to find any packages\n", "No Packages Found", MessageBoxButtons::OK, MessageBoxIcon::Warning);
980
	}
981
 
982
	//
983
	// Event Handlers
984
	//
985
	void MainGui::SetupEventHandlers()
986
	{
987
		// setup Event Handlers
988
		ButClose->Click += gcnew EventHandler(this, &PluginManager::MainGui::ClosedEvent);
989
		ButInstall->Click += gcnew EventHandler(this, &PluginManager::MainGui::InstallEvent);
990
		ButUninstall->Click += gcnew EventHandler(this, &PluginManager::MainGui::UninstallEvent);
991
		ButDisable->Click += gcnew EventHandler(this, &PluginManager::MainGui::DisableEvent);
992
		ListPackages->SelectedIndexChanged += gcnew EventHandler(this, &PluginManager::MainGui::PackageListSelected);
993
		ListPackages->ColumnClick  += gcnew ColumnClickEventHandler(this, &PluginManager::MainGui::PackageListSort);
994
		ComboDir->SelectedIndexChanged += gcnew EventHandler(this, &PluginManager::MainGui::ChangeDirectoryEvent);
995
 
996
 
997
		// background worker
998
		backgroundWorker1->DoWork += gcnew DoWorkEventHandler( this, &MainGui::Background_DoWork );
999
		backgroundWorker1->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler( this, &MainGui::Background_Finished );
1000
		backgroundWorker1->ProgressChanged += gcnew ProgressChangedEventHandler( this, &MainGui::Background_Progress );
1001
 
1002
		// auto update
1003
		backgroundUpdater->DoWork += gcnew DoWorkEventHandler( this, &MainGui::Updater_DoWork );
1004
		backgroundUpdater->RunWorkerCompleted += gcnew RunWorkerCompletedEventHandler( this, &MainGui::Updater_Finished );
1005
	}
1006
 
1007
	void MainGui::PackageListSort(System::Object ^Sender, ColumnClickEventArgs ^E)
1008
	{
1009
		if ( E->Column != m_iSortingColumn )
1010
		{
1011
			m_iSortingColumn = E->Column;
1012
			m_bSortingAsc = true;
1013
		}
1014
		else
1015
			m_bSortingAsc = !m_bSortingAsc;
1016
		this->UpdatePackages();
1017
	}
1018
 
1019
	void MainGui::PackageListSelected(System::Object ^Sender, System::EventArgs ^E)
1020
	{
1021
		// is there any selected items
1022
		this->PictureDisplay->Image = nullptr;
1023
		this->PanelDisplay->Hide();
1024
		TextDesc->Text = "";
1025
		bool buttonEnabled = false;
1026
		if ( ListPackages->SelectedItems->Count )
1027
		{
1028
			buttonEnabled = true;
1029
 
1030
			ListView::SelectedListViewItemCollection^ selected = this->ListPackages->SelectedItems;
1031
			System::Collections::IEnumerator^ myEnum = selected->GetEnumerator();
1032
			while ( myEnum->MoveNext() )
1033
			{
1034
				CBaseFile *p = this->FindPackageFromList(safe_cast<ListViewItem ^>(myEnum->Current));
1035
				if ( p )
1036
				{
1037
					if ( p->IsEnabled() )
1038
						ButDisable->Text = "Disable";
1039
					else
1040
						ButDisable->Text = "Enable";
48 cycrow 1041
					if ( !p->description().empty() )	TextDesc->Text = _US(p->description().findReplace("<br>", "\n").stripHtml());
1 cycrow 1042
 
1043
					this->PictureDisplay->Show();
1044
					bool addedIcon = false;
1045
					C_File *picFile = p->GetFirstFile(FILETYPE_ADVERT);
1046
					if ( picFile )
1047
					{
1048
						System::String ^pic = SystemStringFromCyString(picFile->GetFilePointer());
1049
						if ( System::IO::File::Exists(pic) )
1050
						{
1051
							Bitmap ^myBitmap = gcnew Bitmap(pic);
1052
							if ( myBitmap )
1053
							{
1054
								this->PictureDisplay->Image = dynamic_cast<Image ^>(myBitmap);
1055
								addedIcon = true;
1056
							}
1057
						}
1058
					}
1059
 
1060
					if ( !addedIcon )
1061
					{
1062
 
1063
						System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(MainGui::typeid));
1064
						this->PictureDisplay->Image = (cli::safe_cast<System::Drawing::Image^  >(resources->GetObject(L"PictureDisplay.Image")));
1065
					}
1066
 
1067
					if ( p->GetType() != TYPE_ARCHIVE )
1068
						this->PanelDisplay->Show();
1069
				}	
1070
			}				
1071
		}
1072
 
1073
		// enable/disable the buttons connected to the package list
1074
		ButUninstall->Enabled = buttonEnabled;
1075
		ButDisable->Enabled = buttonEnabled;
1076
	}
1077
 
1078
	void MainGui::AddDirectoryEvent(System::Object ^Sender, System::EventArgs ^E)
1079
	{
1080
		OpenFileDialog ^ofd = gcnew OpenFileDialog();
1081
		ofd->Filter = "X-Universe Executable|";
1082
		String ^games = "";
1083
		for ( int i = 0; i < m_pPackages->GetGameExe()->GetNumGames(); i++ )
1084
		{
1085
			SGameExe *exe = m_pPackages->GetGameExe()->GetGame(i);
1086
			if ( i ) ofd->Filter += ";";
1087
			ofd->Filter += SystemStringFromCyString(exe->sExe);
1088
			games += "|" + SystemStringFromCyString(exe->sName) + "|" + SystemStringFromCyString(exe->sExe);
1089
		}
1090
		ofd->Filter += games;
1091
		ofd->FilterIndex = 1;
1092
		ofd->RestoreDirectory = true;
1093
		if ( ofd->ShowDialog(this) == System::Windows::Forms::DialogResult::OK )
1094
		{
1095
			CyString dir = CyStringFromSystemString(IO::FileInfo(ofd->FileName).DirectoryName);
1096
			// check its a valid directory
1097
			if ( !dir.Empty() )
1098
			{
1099
				CyString gameName = m_pPackages->GetGameName(dir);
1100
				if ( gameName.Empty() )
1101
					this->DisplayMessageBox(false, "Add Directory Error", "No X-Universe game found in folder:\n" + SystemStringFromCyString(dir), MessageBoxButtons::OK, MessageBoxIcon::Error);
1102
				else
1103
				{
1104
					// lets check if theres an old folder
1105
					if ( m_pPackages->IsOldDir(dir) )
1106
					{
1107
						if ( this->DisplayMessageBox(false, "Update Game Directory", "Game directory: " + SystemStringFromCyString(dir) + "\nIs currently being controled by the old plugin manager\nIf you continue, you will be unable to use the old version again\nDo you wish to continue?", MessageBoxButtons::YesNo, MessageBoxIcon::Question) != System::Windows::Forms::DialogResult::Yes )
1108
							return;
1109
					}
1110
					m_iBackgroundTask = MGUI_BACKGROUND_ADDDIR;
1111
					this->Enabled = false;
1112
					CyString properDir = m_pPackages->GetProperDir(dir);
1113
					ComboDir->Items->Add(SystemStringFromCyString(properDir));
1114
					ComboDir->Text = SystemStringFromCyString(properDir);
1115
 
1116
					m_pRemovedDirList->Remove(properDir, true);
1117
					GetGameDirs(dir, false, true);
1118
					/*int lang = m_pPackages->GetGameLanguage(dir);
1119
					if ( lang )
1120
						m_pDirList->PushFront(properDir, CyString::Number(lang) + "|" + gameName);
1121
					else
1122
						m_pDirList->PushFront(properDir, gameName);*/
1123
					this->StartBackground(MGUI_BACKGROUND_ADDDIR, SystemStringFromCyString(properDir));
1124
				}
1125
			}
1126
		}
1127
	}
1128
 
1129
	bool MainGui::EnablePackage(CBaseFile *p)
1130
	{
1131
		if ( !m_pPackages->PrepareEnablePackage(p) )
1132
		{
1133
			if ( m_pPackages->GetError() == PKERR_NOPARENT )
1134
				this->DisplayMessageBox(false, "Enable Error", "Error enabling package\n" + SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage())) + "\n\nParent mod is not enabled", MessageBoxButtons::OK, MessageBoxIcon::Warning);
1135
			else if ( m_pPackages->GetError() == PKERR_MODIFIED )
1136
				this->DisplayMessageBox(false, "Enable Error", "Error enabling package\n" + SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage())) + "\n\nPackage is modified and game is currently set to vanilla\nSwitch to modified mode to enable", MessageBoxButtons::OK, MessageBoxIcon::Warning);
1137
			else if ( m_pPackages->GetError() == PKERR_MISSINGDEP )
1138
			{
1139
				CyStringList depList;
1140
				m_pPackages->GetMissingDependacies(p, &depList, true);
1141
				CyString sDep;
1142
				for ( SStringList *strNode = depList.Head(); strNode; strNode = strNode->next )
1143
				{
1144
					if ( strNode->str.IsIn("|") )
1145
						sDep = strNode->str.GetToken("|", 1, 1) + " V" + strNode->str.GetToken("|", 2, 2) + " by " + strNode->data + "\n";
1146
					else
1147
						sDep = strNode->str + " by " + strNode->data + "\n";
1148
				}
1149
				this->DisplayMessageBox(false, "Enable Error", "Error enabling package\n" + SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage())) + "\n\nMissing Enabled Dependacies:\n" + SystemStringFromCyString(sDep), MessageBoxButtons::OK, MessageBoxIcon::Warning);
1150
			}
1151
			else
1152
				this->DisplayMessageBox(false, "Enable Error", "Error enabling package\n" + SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage())) + "\n\nUnknown Error", MessageBoxButtons::OK, MessageBoxIcon::Warning);
1153
			return false;
1154
		}
1155
		return true;
1156
	}
1157
 
1158
	void MainGui::DisableList(ArrayList ^List)
1159
	{
1160
		bool skipShips = false;
1161
		int count = 0;
1162
 
1163
		for ( int i = 0; i < List->Count; i++ )
1164
		{
1165
			CBaseFile *p = this->FindPackageFromList(cli::safe_cast<ListViewItem ^>(List[i]));
1166
			if ( p )
1167
			{
1168
				if ( p->IsEnabled() )
1169
				{
1170
					if ( p->GetType() == TYPE_SPK && ((CSpkFile *)p)->IsLibrary() )
1171
					{
1172
						if ( this->DisplayMessageBox(false, "Disable Library", "Package: " + SystemStringFromCyString(p->GetFullPackageName(m_pPackages->GetLanguage())) + "\nThis is a library package and might be required for other installed packages\nDo you still wish to disable it?", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::No )
1173
							continue;
1174
					}
1175
					if ( p->GetType() == TYPE_XSP )
1176
					{
1177
						if ( !this->DisplayTip(TIPSECTION_YESNO, TIP_SHIPDISABLE) )
1178
							skipShips = true;
1179
 
1180
						if ( skipShips )
1181
							continue;
1182
					}
1183
 
1184
					m_pPackages->PrepareDisablePackage(p);
1185
					++count;
1186
				}
1187
				else
1188
				{
1189
					this->EnablePackage(p);
1190
					++count;
1191
				}
1192
			}
1193
		}
1194
 
1195
		if ( count )
1196
		{
1197
			this->Enabled = false;
1198
			this->StartBackground(MGUI_BACKGROUND_DISABLE);
1199
		}
1200
	}
1201
 
1202
	void MainGui::DisableEvent(System::Object ^Sender, System::EventArgs ^E)
1203
	{
1204
		if ( !ListPackages->SelectedItems->Count )
1205
			return;
1206
 
1207
		bool skipShips = false;
1208
 
1209
		ListView::SelectedListViewItemCollection^ selected = this->ListPackages->SelectedItems;
1210
		System::Collections::IEnumerator^ myEnum = selected->GetEnumerator();
1211
		int count = 0;
1212
		ArrayList ^List = gcnew ArrayList();
1213
 
1214
		while ( myEnum->MoveNext() )
1215
			List->Add(safe_cast<ListViewItem ^>(myEnum->Current));
1216
 
1217
		if ( List->Count )
1218
			this->DisableList(List);
1219
	}
1220
 
1221
	void MainGui::PackageBrowserEvent(System::Object ^Sender, System::EventArgs ^E)
1222
	{
1223
		this->Enabled = false;
1224
		PackageBrowser ^mod = gcnew PackageBrowser(m_pPackages, this->imageList1);
1225
		if ( !mod->AnyPackages() )
1226
		{
1227
			System::String ^game;
1228
			if ( m_pDirList && m_pDirList->Count() && m_pDirList->Head() )
1229
			{
1230
				CyString sGame = m_pDirList->Head()->data;
1231
				if ( sGame.IsIn("|") )
1232
					sGame = sGame.GetToken("|", 2);
1233
				game = SystemStringFromCyString(sGame);
1234
			}
1235
			this->DisplayMessageBox(false, "No Available Packages", "No available packages found for " + game, MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
1236
 
1237
			this->Enabled = true;
1238
			return;
1239
		}
1240
 
1241
		if ( m_bDirLocked ) {
1242
			this->DisplayLocked(false);
1243
			this->Enabled = true;
1244
			return;
1245
		}
1246
 
1247
		mod->SetExperimental(m_bExperimental);
1248
		mod->SetCheat(m_bCheat);
1249
		mod->SetShips(m_bShips);
1250
		if ( m_pPackages->IsVanilla() )
1251
			mod->SetSigned(true);
1252
		else
1253
			mod->SetSigned(m_bSigned);
1254
		mod->SetDownload(m_bDownloadable);
1255
		mod->UpdatePackages();
1256
		System::Windows::Forms::DialogResult result = mod->ShowDialog(this);
1257
 
1258
		m_bDownloadable = mod->IsDownload();
1259
		m_bCheat = mod->IsCheat();
1260
		m_bExperimental = mod->IsExperimental();
1261
		m_bShips = mod->IsShips();
1262
		m_bSigned = mod->IsSigned();
1263
 
1264
		bool doenable = true;
1265
		CBaseFile *p = mod->SelectedMod();
1266
		if ( result == System::Windows::Forms::DialogResult::OK )
1267
		{
1268
			if ( p )
1269
			{
50 cycrow 1270
				if ( this->InstallPackage(_US(p->filename()), true, false, true) )
1 cycrow 1271
					doenable = false;
1272
			}
1273
		}
1274
		else if ( result == System::Windows::Forms::DialogResult::Yes )
1275
			this->StartInstalling(false, true);
1276
 
1277
		this->Enabled = doenable;
1278
	}
1279
 
1280
	void MainGui::CloseEvent(System::Object ^Sender, FormClosingEventArgs ^E)
1281
	{
1282
		int h = this->Size.Height;
1283
		int w = this->Size.Width;
1284
	}
1285
 
1286
	void MainGui::DisplayLocked(bool inthread) 
1287
	{
1288
		this->DisplayMessageBox(inthread, "Directory Locked", "The current directory is locked and unable to make any changes\nYou may need to adjust the directory permissions", MessageBoxButtons::OK, MessageBoxIcon::Error);
1289
	}
1290
 
1291
	void MainGui::ModSelectorEvent(System::Object ^Sender, System::EventArgs ^E)
1292
	{
1293
		if ( m_pPackages->IsVanilla() )
1294
		{
1295
			this->DisplayMessageBox(false, "Mod Selector", "Currently in Vanilla Mode, You can only enable mods when in Modified Mode\n\nSwitch to modified mode if you wish to install mods", MessageBoxButtons::OK, MessageBoxIcon::Question);
1296
			return;
1297
		}
1298
		this->Enabled = false;
1299
		ModSelector ^mod = gcnew ModSelector(m_pPackages, this->imageList1);
1300
 
1301
		if ( !mod->AnyPackages() )
1302
		{
1303
			this->DisplayMessageBox(false, "Mod Selector", "No available mods have been found", MessageBoxButtons::OK, MessageBoxIcon::Warning);
1304
			this->Enabled = true;
1305
			return;
1306
		}
1307
 
1308
		if ( m_bDirLocked ) {
1309
			this->DisplayLocked(false);
1310
			this->Enabled = true;
1311
			return;
1312
		}
1313
 
1314
		if ( !m_bModSelectorDetails )
1315
		{
1316
			mod->HideDetails();
1317
			mod->Update();
1318
		}
1319
 
1320
		System::Windows::Forms::DialogResult result = mod->ShowDialog(this);
1321
		m_bModSelectorDetails = mod->ShowingDetails();
1322
 
1323
		// install the selected mod
1324
		bool reEnable = true;
1325
 
1326
		CBaseFile *p = mod->SelectedMod();
1327
		if ( result == System::Windows::Forms::DialogResult::OK )
1328
		{
1329
			if ( p )
1330
			{
1331
				// from file
1332
				if ( p->GetNum() < 0 )
1333
				{
1334
					if ( m_pPackages->GetEnabledMod() )
1335
						m_pPackages->DisablePackage(m_pPackages->GetEnabledMod(), 0, 0);
50 cycrow 1336
					if ( this->InstallPackage(_US(p->filename()), true, false, true) )
1 cycrow 1337
						reEnable = false;
1338
				}
1339
				// otherwise just enable it
1340
				else
1341
				{
1342
					if ( this->EnablePackage(p) )
1343
					{
1344
						this->StartBackground(MGUI_BACKGROUND_DISABLE);
1345
						reEnable = false;
1346
					}
1347
				}
1348
			}
1349
		}
1350
 
1351
		// install downloaded mods
1352
		else if ( result == Windows::Forms::DialogResult::Yes )
1353
			this->StartInstalling(false, true);
1354
 
1355
		// remove the current mod
1356
		else if ( result == System::Windows::Forms::DialogResult::Abort )
1357
		{
1358
			if ( m_pPackages->GetEnabledMod() )
1359
			{
1360
				CBaseFile *mod = m_pPackages->GetEnabledMod();
1361
				CyString message = mod->GetFullPackageName(m_pPackages->GetLanguage());
1362
				m_pPackages->DisablePackage(m_pPackages->GetEnabledMod(), 0, 0);			
1363
				this->DisplayMessageBox(false, "Mod Disabed", SystemStringFromCyString(message) + " has been disabled\nYour game is no longer using any mods\n", MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
1364
			}
1365
		}
1366
 
1367
		// uninstall the selected mod
1368
		else if ( result == System::Windows::Forms::DialogResult::Retry )
1369
		{
1370
			if ( p && p->GetNum() >= 0 )
1371
			{
1372
				m_pPackages->PrepareUninstallPackage(p);
1373
				if ( m_pPackages->GetNumPackagesInQueue() )
1374
				{
1375
					reEnable = false;
1376
					this->StartBackground(MGUI_BACKGROUND_UNINSTALL);
1377
				}
1378
			}
1379
		}
1380
 
1381
		if ( reEnable )
1382
			this->Enabled = true;
1383
 
1384
		mod->RemovePackages();
1385
	}
1386
 
1387
	void MainGui::UninstallList(ArrayList ^List)
1388
	{
1389
		bool skipShips = false;
1390
 
1391
		for ( int i = 0; i < List->Count; i++ )
1392
		{
1393
			CBaseFile *p = this->FindPackageFromList(safe_cast<ListViewItem ^>(List[i]));
1394
			if ( p )
1395
			{
1396
				if ( p->GetType() == TYPE_XSP )
1397
				{
1398
					if ( !this->DisplayTip(TIPSECTION_YESNO, TIP_SHIPUNINSTALL) )
1399
						skipShips = true;
1400
 
1401
					if ( skipShips )
1402
						continue;
1403
				}
1404
 
46 cycrow 1405
				// display uninstall text
1406
				Utils::String beforeText = m_pPackages->GetUninstallBeforeText(p).ToString();
1407
				if ( !beforeText.empty() ) {
1408
					if ( this->DisplayMessageBox(false, "Uninstall Package", _US(p->GetFullPackageName(m_pPackages->GetLanguage()).ToString() + "\n" + beforeText + "\n\nDo you want to uninstall this package?"), MessageBoxButtons::YesNo, MessageBoxIcon::Question) != System::Windows::Forms::DialogResult::Yes )
1409
						continue;
1410
				}
1411
 
1 cycrow 1412
				m_pPackages->PrepareUninstallPackage(p);
1413
			}
1414
		}
1415
 
1416
		if ( m_pPackages->GetNumPackagesInQueue() )
1417
		{
1418
			this->Enabled = false;
1419
			this->StartBackground(MGUI_BACKGROUND_UNINSTALL);
1420
		}
1421
	}
1422
	void MainGui::UninstallEvent(System::Object ^Sender, System::EventArgs ^E)
1423
	{
1424
		if ( !ListPackages->SelectedItems->Count )
1425
			return;
1426
 
1427
		ArrayList ^List = gcnew ArrayList();
1428
 
1429
		ListView::SelectedListViewItemCollection^ selected = this->ListPackages->SelectedItems;
1430
		System::Collections::IEnumerator^ myEnum = selected->GetEnumerator();
1431
 
1432
		while ( myEnum->MoveNext() )
1433
			List->Add(safe_cast<ListViewItem ^>(myEnum->Current));
1434
 
1435
		this->UninstallList(List);
1436
	}
1437
 
1438
	void MainGui::ModifiedEvent(System::Object ^Sender, System::EventArgs ^E)
1439
	{
1440
		if ( m_bDirLocked ) {
1441
			this->DisplayLocked(false);
1442
			return;
1443
		}
1444
		if ( m_pPackages->IsVanilla() )
1445
		{
1446
			this->Enabled = false;
1447
			if ( this->DisplayMessageBox(false, "Modified Mode", "Enabling modified mode will allow you to use any modified content\nThis will however mark any games you save as modified and you will be unable to participate in Uplink\nAny current save games wil also be backed up and kept seperate from your modified save games\n\nDo you wish to enable modified mode?", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes )
1448
			{
1449
				if ( m_iSaveGameManager == 1 )
1450
				{
1451
					m_pPackages->BackupSaves(true);
1452
					m_pPackages->RestoreSaves(false);
1453
				}
1454
				m_pPackages->SetVanilla(false);
1455
				m_pMenuBar->Modified();
1456
				m_pPackages->PrepareEnableLibrarys();
1457
				m_pPackages->PrepareEnableFromVanilla();
1458
				this->StartBackground(MGUI_BACKGROUND_DISABLE);
1459
			}
1460
			else
1461
				this->Enabled = true;
1462
		}
1463
	}
1464
 
1465
	void MainGui::VanillaEvent(System::Object ^Sender, System::EventArgs ^E)
1466
	{
1467
		if ( m_bDirLocked ) {
1468
			this->DisplayLocked(false);
1469
			return;
1470
		}
1471
		if ( !m_pPackages->IsVanilla() )
1472
		{
1473
			this->Enabled = false;
1474
			if ( this->DisplayMessageBox(false, "Vanilla Mode", "Switching back to vanilla mode you will no longer be able to use any modifying packages, these will be disabled\nYour current save games will be backed up as modified saves, and any vanilla save games will be restored\n\nDo you wish to go back to Vanilla?", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes )
1475
			{
1476
				if ( m_iSaveGameManager == 1 )
1477
				{
1478
					m_pPackages->RestoreSaves(true);
1479
					m_pPackages->BackupSaves(false);
1480
				}
1481
				m_pPackages->SetVanilla(true);
1482
				m_pMenuBar->Vanilla();
1483
				m_pPackages->PrepareDisableForVanilla();
1484
				this->StartBackground(MGUI_BACKGROUND_DISABLE);
1485
			}
1486
			else
1487
				this->Enabled = true;
1488
		}
1489
	}
1490
 
1491
	void MainGui::InstallEvent(System::Object ^Sender, System::EventArgs ^E)
1492
	{
1493
		if ( m_bDirLocked ) {
1494
			this->DisplayLocked(false);
1495
			return;
1496
		}
1497
 
1498
		OpenFileDialog ^ofd = gcnew OpenFileDialog();
1499
		ofd->Filter = "All (*.spk, *.xsp)|*.spk;*.xsp|Package Files (*.spk)|*.spk|Ship Files (*.xsp)|*.xsp";
1500
		ofd->FilterIndex = 1;
1501
		ofd->RestoreDirectory = true;
1502
		ofd->Multiselect = true;
1503
 
1504
		this->Enabled = false;
1505
		if ( ofd->ShowDialog(this) == System::Windows::Forms::DialogResult::OK )
1506
		{
1507
			bool anytoinstall = false;
1508
			array<System::String ^> ^fileArray = ofd->FileNames;
1509
			for ( int i = 0; i < fileArray->Length; i++ )
1510
			{
1511
				System::String ^file = fileArray[i];
1512
				if ( this->InstallPackage(file, false, false, true) )
1513
					anytoinstall = true;
1514
			}
1515
 
1516
			if ( anytoinstall )
1517
				this->StartInstalling(false, true);
1518
		}
1519
		else
1520
		{
1521
			ProgressBar->Hide();
1522
			this->Enabled = true;
1523
		}
1524
	}
1525
 
1526
	void MainGui::CheckUnusedShared()
1527
	{
1528
		if ( m_pPackages->AnyUnusedShared() )
1529
		{
1530
			if ( this->DisplayMessageBox(false, "Remove Shared Files", "You have some unused shared files, would you like to remove these?", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes)
1531
				m_pPackages->RemoveUnusedSharedFiles();
1532
		}
1533
	}
1534
 
1535
	void MainGui::ChangeDirectoryEvent(System::Object ^Sender, System::EventArgs ^E)
1536
	{
1537
		if ( m_iBackgroundTask == MGUI_BACKGROUND_ADDDIR )
1538
			return;
1539
 
1540
		CyString dir = CyStringFromSystemString(ComboDir->Text);
1541
		if ( dir.NumToken(" [") )
1542
			dir = dir.GetToken(" [", 1, dir.NumToken(" [") - 1);
1543
 
1544
		if ( !m_pPackages->IsCurrentDir(dir) )
1545
		{
1546
			this->Enabled = false;
1547
			this->CheckUnusedShared();
1548
			this->StartBackground(MGUI_BACKGROUND_CHANGEDIR, SystemStringFromCyString(dir));
1549
		}
1550
	}
1551
 
1552
	void MainGui::Background_DoWork(System::Object ^Sender, DoWorkEventArgs ^E)
1553
	{
1554
		m_bDisplayMessage = false;
1555
		m_bDisplayDialog = false;
1556
 
1557
		switch ( m_iBackgroundTask )
1558
		{
1559
			case MGUI_BACKGROUND_INSTALL:
1560
				this->DoInstall(false, true);
1561
				break;
1562
			case MGUI_BACKGROUND_INSTALLBUILTIN:
1563
				this->DoInstall(true, true);
1564
				break;
1565
			case MGUI_BACKGROUND_UNINSTALL:
1566
				this->DoUninstall();
1567
				break;
1568
			case MGUI_BACKGROUND_DISABLE:
1569
				this->DoDisable();
1570
				break;
1571
			case MGUI_BACKGROUND_CHANGEDIR:
1572
			case MGUI_BACKGROUND_ADDDIR:
1573
				this->ChangeDirectory(CyStringFromSystemString(m_sBackgroundInfo));
1574
				break;
1575
			case MGUI_BACKGROUND_REMOVEDIR:
1576
				this->RemoveCurrentDirectory();
1577
		}
1578
	}
1579
 
1580
	void MainGui::Background_Finished()
1581
	{
1582
		ProgressBar->Hide();
1583
 
1584
		if ( m_bDisplayMessage )
1585
			MessageBox::Show(this, m_sMessageText, m_sMessageTitle, m_messageButtons, m_messageIcon);
1586
 
1587
		if ( m_bDisplayDialog )
1588
		{
1589
			if ( m_pPi->PackageCount() )
1590
			{
1591
				m_pPi->AdjustColumns();
1592
				m_pPi->ShowDialog(this);
1593
			}
1594
		}
1595
 
1596
		m_bDisplayDialog = false;
1597
		m_bDisplayMessage = false;
1598
 
1599
		if ( m_iBackgroundTask == MGUI_BACKGROUND_CHANGEDIR || m_iBackgroundTask == MGUI_BACKGROUND_ADDDIR )
1600
		{
1601
			// switch the dir list
1602
			if ( ComboDir->Text )
1603
			{
1604
				CyString dir = CyStringFromSystemString(ComboDir->Text);
1605
				if ( !dir.Empty() )
1606
				{
1607
					if ( (m_iBackgroundTask == MGUI_BACKGROUND_CHANGEDIR) && (dir.NumToken(" [")) )
1608
						dir = dir.GetToken(" [", 1, dir.NumToken(" [") - 1);
1609
					if ( m_pDirList->FindString(dir) )
1610
					{
1611
						CyString data = m_pDirList->FindString(dir)->data;
1612
						m_pDirList->Remove(dir, false);
1613
						m_pDirList->PushFront(dir, data);
1614
					}
1615
					else
1616
					{
1617
						int lang = m_pPackages->GetGameLanguage(dir);
1618
						if ( lang )
1619
							m_pDirList->PushFront(dir, CyString::Number(lang) + "|" + m_pPackages->GetGameName(dir));
1620
						else
1621
							m_pDirList->PushFront(dir, m_pPackages->GetGameName(dir));
1622
					}
1623
 
1624
					this->UpdateDirList();
1625
				}
1626
			}
1627
		}
1628
 
1629
		// display any files that failed
1630
		if ( m_iBackgroundTask == MGUI_BACKGROUND_INSTALL )
1631
		{
1632
			String ^files = "";
1633
			for ( SStringList *str = m_pFileErrors->Head(); str; str = str->next )
1634
			{
1635
				if ( str->data.ToInt() == SPKINSTALL_WRITEFILE_FAIL )
1636
				{
1637
					files += "\n";
1638
					files += SystemStringFromCyString(str->str);
1639
				}
1640
			}
1641
 
1642
			if ( files->Length )
1643
				MessageBox::Show(this, "These files failed to install\n" + files, "Failed Files", MessageBoxButtons::OK, MessageBoxIcon::Warning);
1644
		}
1645
 
1646
		switch ( m_iBackgroundTask )
1647
		{
1648
			case MGUI_BACKGROUND_CHANGEDIR:
1649
			case MGUI_BACKGROUND_ADDDIR:
1650
				this->UpdateControls();
1651
				this->UpdatePackages();
1652
				this->CheckProtectedDir();
1653
				m_bRunningBackground = false;
1654
				if ( this->UpdateBuiltInPackages() )
1655
					return;
1656
				break;
1657
 
1658
			case MGUI_BACKGROUND_INSTALL:
1659
			case MGUI_BACKGROUND_INSTALLBUILTIN:
1660
			case MGUI_BACKGROUND_UNINSTALL:
1661
			case MGUI_BACKGROUND_DISABLE:
1662
				this->UpdatePackages();
1663
				break;
1664
			case MGUI_BACKGROUND_REMOVEDIR:
1665
				ComboDir->Items->RemoveAt(0);
1666
				this->DisplayMessageBox(false, "Remove Directory", "Directory has been removed\n" + SystemStringFromCyString(m_pRemovedDirList->Tail()->str), MessageBoxButtons::OK, MessageBoxIcon::Information);
1667
				break;
1668
		}
1669
 
1670
		if ( m_iBackgroundTask == MGUI_BACKGROUND_ADDDIR )
1671
			this->DisplayMessageBox(false, "Add Game Folder", "Folder \"" + m_sBackgroundInfo + "\" added\nGame: " + SystemStringFromCyString(m_pPackages->GetGameName(CyStringFromSystemString(m_sBackgroundInfo))), MessageBoxButtons::OK, MessageBoxIcon::Information);
1672
 
1673
		else if ( m_iBackgroundTask == MGUI_BACKGROUND_REMOVEDIR )
1674
		{
1675
			// no more directories left
1676
			if ( m_pDirList->Empty() )
1677
			{
1678
				m_bRunningBackground = false;
1679
				this->Close();
1680
			}
1681
			// otherwise, open the next directory
1682
			else
1683
			{
1684
				m_bRunningBackground = false;
1685
				ComboDir->SelectedItem = ComboDir->Items[0];
1686
//				this->StartBackground(MGUI_BACKGROUND_CHANGEDIR, SystemStringFromCyString(m_pDirList->Head()->str));
1687
				return;
1688
			}
1689
		}
1690
 
1691
		m_iBackgroundTask = MGUI_BACKGROUND_NONE;
1692
 
1693
		this->Enabled = true;
1694
 
1695
		m_bRunningBackground = false;
1696
	}
1697
 
1698
	void MainGui::Background_Progress(System::Object ^Sender, ProgressChangedEventArgs ^E)
1699
	{
1700
		this->ProgressBar->Value = E->ProgressPercentage;
1701
	}
1702
 
1703
	bool MainGui::UpdateBuiltInPackages()
1704
	{
1705
		// find all built-in packages
53 cycrow 1706
#ifdef _DEBUG
1707
		System::String ^dir = "d:\\Test";
1708
#else
1709
		System::String ^dir = ".\\Required";
1710
#endif
1711
		if ( System::IO::Directory::Exists(dir) ) 
1 cycrow 1712
		{
1713
			bool installing = false;
53 cycrow 1714
			array <System::String ^> ^Files = System::IO::Directory::GetFiles(dir, "*.spk");
1 cycrow 1715
 
1716
			for ( int i = 0; i < Files->Length; i++ )
1717
			{
1718
				CyString file = CyStringFromSystemString(Files[i]);
1719
				int error;
1720
				CBaseFile *p = m_pPackages->OpenPackage(file, &error, 0, SPKREAD_NODATA);
1721
				if ( !p )
1722
					continue;
1723
 
1724
				if ( !((CSpkFile *)p)->IsLibrary() )
1725
					continue;
1726
 
1727
				if ( !p->CheckGameCompatability(m_pPackages->GetGame()) )
1728
					continue;
1729
 
1730
				// if its installed, check if we have a newer version
50 cycrow 1731
				CBaseFile *check = m_pPackages->FindSpkPackage(p->name(), p->author());
1 cycrow 1732
				if ( check )
1733
				{
50 cycrow 1734
					if ( check->version().compareVersion(p->version()) != COMPARE_OLDER )
1 cycrow 1735
					{
1736
						this->InstallPackage(Files[i], false, true, true);
1737
						installing = true;
1738
					}
1739
				}
1740
				else
1741
				{
1742
					this->InstallPackage(Files[i], false, true, true);
1743
					installing = true;
1744
				}
1745
 
1746
				delete p;
1747
			}
1748
 
1749
			if ( installing )
1750
				this->StartInstalling(true, true);
1751
			return installing;
1752
		}
1753
 
1754
		return false;
1755
	}
1756
 
1757
	////
1758
	// Auto Update
1759
	////
1760
	void MainGui::AutoUpdate()
1761
	{
1762
		if ( !m_bAutoUpdate || !System::IO::File::Exists( ".\\AutoUpdater.exe") )
1763
			return;
1764
 
1765
		// load the dir list
1766
		if ( !m_pUpdateList )
1767
		{
1768
			m_pUpdateList = new CyStringList;
1769
 
1770
			// TODO: read addresses from data
1771
 
1772
			// hardcoded address
1773
			m_pUpdateList->PushBack("http://cycrow.thexuniverse.us/pmupdate.dat", "", true);
1774
			if ( (int)PMLBETA )
1775
				m_pUpdateList->PushBack("http://cycrow.thexuniverse.us/Beta/pmupdatebeta.dat", "", true);
1776
		}
1777
 
1778
		backgroundUpdater->RunWorkerAsync();
1779
	}
1780
 
1781
	void MainGui::Updater_Finished(System::Object ^Sender, RunWorkerCompletedEventArgs ^E)
1782
	{
1783
		if ( !m_pUpdateList )
1784
			return;
1785
		if ( !m_pUpdateList->Head() )
1786
		{
1787
			delete m_pUpdateList;
1788
			m_pUpdateList = NULL;
1789
			return;
1790
		}
1791
 
1792
		this->Enabled = false;
1793
 
1794
		CyString server = m_pUpdateList->Head()->str;
1795
		CyString data = m_pUpdateList->Head()->data;
1796
 
1797
		m_pUpdateList->PopFront();
1798
 
1799
		// lets check if we have an update
1800
		if ( data.GetToken(" ", 1, 1) != "!ERROR!" )
1801
		{
1802
			CyString download;
1803
			CyString message;
1804
			int max;
1805
			CyString *strs = data.SplitToken("\n", &max);
1806
			if ( strs )
1807
			{
1808
				for ( int i = 0; i < max; i++ )
1809
				{
1810
					CyString cmd = strs[i].GetToken(":", 1, 1);
1811
					CyString rest = strs[i].GetToken(":", 2);
1812
					rest.RemoveFirstSpace();
1813
					if ( cmd.Compare("SPKVERSION") )
1814
					{
1815
						float v = rest.GetToken(" ", 1, 1).ToFloat();
1816
						if ( v > GetLibraryVersion() )
1817
						{
1818
							message += "New version of the SPK Libraries available\nCurrent = ";
1819
							message += CyString::CreateFromFloat(GetLibraryVersion(), 2);
1820
							message += "\nNew Version = ";
1821
							message += CyString::CreateFromFloat(v, 2);
1822
							message += "\n\n";
1823
 
1824
							CyString filename = rest.GetToken(" ", 2);
1825
							if ( download.Empty() )
1826
								download = filename;
1827
							else
1828
							{
1829
								download += "|";
1830
								download += filename;
1831
							}
1832
						}
1833
					}
1834
					else if ( cmd.Compare("PMLVERSION") )
1835
					{
1836
						float v = rest.GetToken(" ", 1, 1).ToFloat();
1837
						int beta = rest.GetToken(" ", 2, 2).ToInt();
1838
 
1839
						bool newVersion = false;
1840
						// new version
1841
						if ( v > (float)PMLVERSION )
1842
							newVersion = true;
1843
						// same version, check beta/rc
1844
						if ( v == (float)PMLVERSION )
1845
						{
1846
							// newer beta version
1847
							if ( beta > (int)PMLBETA && (int)PMLBETA > 0 )
1848
								newVersion = true;
1849
							// current is beta, new is an RC
1850
							else if ( (int)PMLBETA > 0 && beta < 0 )
1851
								newVersion = true;
1852
							// current is rc, new is an rc
1853
							else if ( (int)PMLBETA < 0 && beta < 0 && beta < (int)PMLBETA )
1854
								newVersion = true;
1855
							// current is beta or rc, new is not, so its newer
1856
							else if ( (int)PMLBETA != 0 && beta == 0 )
1857
								newVersion = true;
1858
						}
1859
 
1860
						if ( newVersion )
1861
						{
1862
							message += "New version of the ";
1863
							message += CyStringFromSystemString(GetProgramName(m_bAdvanced));
1864
							message += " available\nCurrent = ";
1865
							message += CyStringFromSystemString(PluginManager::GetVersionString());
1866
							message += "\nNew Version = ";
1867
							message += CyStringFromSystemString(PluginManager::GetVersionString(v, beta));
1868
							message += "\n\n";
1869
							if ( download.Empty() )
1870
								download = rest.GetToken(" ", 3);
1871
							else
1872
							{
1873
								download += "|";
1874
								download += rest.GetToken(" ", 3);
1875
							}
1876
						}
1877
					}
1878
				}
1879
			}
1880
 
1881
			CLEANSPLIT(strs, max)
1882
 
1883
			if ( !download.Empty() && !message.Empty() )
1884
			{
1885
				if ( this->DisplayMessageBox(false, "Updater", SystemStringFromCyString(message) + "Do You wish to download and install it?", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes )
1886
				{
1887
					// absolute address
1888
					CyString downloadFile;
1889
 
1890
					int max;
1891
					CyString *strs = download.SplitToken("|", &max);
1892
					for ( int i = 0; i < max; i++ )
1893
					{
1894
						CyString d = strs[i];
1895
						// relative address
1896
						if ( !d.Left(7).Compare("http://") && !d.Left(4).Compare("www.") )
1897
							d = server.DelToken("/", server.NumToken("/")) + "/" + d;
1898
 
1899
						if ( downloadFile.Empty() )
1900
							downloadFile = d;
1901
						else
1902
						{
1903
							downloadFile += "|";
1904
							downloadFile += d;
1905
						}
1906
					}
1907
 
1908
					CLEANSPLIT(strs, max);
1909
 
1910
					if ( !downloadFile.Empty() )
1911
					{
1912
						m_sDownload = SystemStringFromCyString(downloadFile);
1913
						this->Close();
1914
						return;
1915
					}
1916
				}
1917
			}
1918
		}
1919
 
1920
		// otherwise, lets continue with the next server
1921
		if ( m_pUpdateList->Head() )
1922
			backgroundUpdater->RunWorkerAsync();
1923
		else
1924
		{
1925
			delete m_pUpdateList;
1926
			m_pUpdateList = NULL;
1927
		}
1928
 
1929
		this->Enabled = true;
1930
	}
1931
 
1932
	void MainGui::TimerEvent_CheckFile(System::Object ^Sender, System::EventArgs ^E)
1933
	{
1934
		if ( m_bRunningBackground )
1935
			return;
1936
 
1937
		System::String ^mydoc = Environment::GetFolderPath(Environment::SpecialFolder::Personal );
1938
 
1939
		bool anytoinstall = false;
1940
 
1941
		if ( System::IO::File::Exists(mydoc + "\\Egosoft\\pluginmanager_load.dat") )
1942
		{
1943
			System::String ^lines = System::IO::File::ReadAllText(mydoc + "\\Egosoft\\pluginmanager_load.dat");
1944
			System::IO::File::Delete(mydoc + "\\Egosoft\\pluginmanager_load.dat");
1945
			if ( lines )
1946
			{
1947
				CyString strLines = CyStringFromSystemString(lines);
1948
				int num;
1949
				CyString *aLines = strLines.SplitToken("\n", &num);
1950
				if ( num && aLines )
1951
				{
1952
					for ( int i = 0; i < num; i++ )
1953
					{
1954
						CyString l = aLines[i];
1955
						l = l.Remove("\r");
1956
						CyString first = l.GetToken(":", 1, 1);
1957
						CyString rest = l.GetToken(":", 2);
1958
						rest.RemoveFirstSpace();
1959
 
1960
						if ( first.Compare("File") )
1961
						{
1962
							if ( m_bDirLocked ) {
1963
								this->DisplayLocked(false);
1964
								return;
1965
							}
1966
							if ( this->InstallPackage(SystemStringFromCyString(rest), false, false, true) )
1967
								anytoinstall = true;
1968
						}
1969
					}
1970
 
1971
					CLEANSPLIT(aLines, num);
1972
				}
1973
			}
1974
		}
1975
 
1976
		if ( anytoinstall )
1977
			this->StartInstalling(false, true);
1978
	}
1979
 
1980
	void MainGui::Updater_DoWork(System::Object ^Sender, DoWorkEventArgs ^E)
1981
	{
1982
		if ( !m_pUpdateList )
1983
			return;
1984
		if ( !m_pUpdateList->Head() )
1985
		{
1986
			delete m_pUpdateList;
1987
			m_pUpdateList = NULL;
1988
			return;
1989
		}
1990
 
1991
		try 
1992
		{
1993
			System::Net::WebClient ^Client = gcnew System::Net::WebClient();
1994
 
1995
			System::IO::Stream ^strm = Client->OpenRead(SystemStringFromCyString(m_pUpdateList->Head()->str));
1996
			System::IO::StreamReader ^sr = gcnew System::IO::StreamReader(strm);
1997
			System::String ^read = sr->ReadToEnd();
1998
			strm->Close();
1999
			sr->Close();
2000
 
2001
			m_pUpdateList->Head()->data = CyStringFromSystemString(read);
2002
		}
2003
		catch (System::Net::WebException ^ex)
2004
		{
2005
			m_pUpdateList->Head()->data = CyStringFromSystemString("!ERROR! " + ex->ToString());
2006
			if ( ex->Status == System::Net::WebExceptionStatus::ConnectFailure )
2007
			{
2008
				m_pUpdateList->Head()->data = CyStringFromSystemString("!ERROR! " + ex->ToString());
2009
 
2010
			}
2011
		}
2012
	}
2013
 
2014
	void MainGui::RemoveDirectory()
2015
	{
2016
		if ( !m_pPackages->IsLoaded() )
2017
			return;
2018
 
2019
		System::String ^remDir = SystemStringFromCyString(m_pPackages->GetCurrentDirectory());
2020
		this->Enabled = false;
2021
		if ( this->DisplayMessageBox(false, "Remove Directory", "Are you sure you want to remove this directory:\n" + remDir + "\n\nThis will remove all installed packages and clear any settings", MessageBoxButtons::YesNo, MessageBoxIcon::Question) != System::Windows::Forms::DialogResult::Yes)
2022
		{
2023
			this->Enabled = true;
2024
			return;
2025
		}
2026
 
2027
		this->StartBackground(MGUI_BACKGROUND_REMOVEDIR, remDir);
2028
	}
2029
 
2030
	bool MainGui::RemoveCurrentDirectory()
2031
	{
2032
		if ( !m_pPackages->RemoveCurrentDirectory() )
2033
			return false;
2034
 
2035
		// remove directory from list
2036
		m_pRemovedDirList->PushBack(m_pDirList->Head()->str, "", true);
2037
		m_pDirList->PopFront();
2038
 
2039
		return true;
2040
	}
2041
 
2042
	void MainGui::LaunchGame()
2043
	{
2044
		if ( !System::IO::File::Exists(".\\GameLauncher.exe") )
2045
			return;
2046
 
2047
		m_sRun = SystemStringFromCyString(m_pPackages->GetGameRunExe());
2048
		this->Close();
2049
	}
2050
 
2051
	bool MainGui::DisplayTip(int tipsection, int tip)
2052
	{
2053
		if ( tipsection < 0 || tipsection >= MAXTIPS )
2054
			return false;
2055
 
2056
		STips ^tips = (STips ^)m_lTips[tipsection];
2057
		if ( !(tips->iTips & tip) )
2058
		{
2059
			System::String ^sTip = cli::safe_cast<System::String ^>(tips->sTips[(tip >> 1)]);
2060
 
2061
			tips->iTips |= tip;
2062
 
2063
			if ( this->DisplayMessageBox(false, "Plugin Manager Tip", sTip, MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes )
2064
				return true;
2065
			else 
2066
				return false;
2067
		}
2068
 
2069
		return true;
2070
	}
2071
 
2072
	void MainGui::SetTipStrings(int section)
2073
	{
2074
		STips ^t = (STips ^)m_lTips[section];
2075
		t->sTips = gcnew ArrayList();
2076
 
2077
		switch ( section )
2078
		{
2079
			case TIPSECTION_YESNO:
2080
				t->sTips->Add("You are about to uninstall a ship, you need to make sure that there are no ships in the sector you was in when you saved, otherwise it could prevent the save from loading\n\nContinue Uninstalling Ship?");
2081
				t->sTips->Add("You are about to disable a ship, you need to make sure that there are no ships in the sector you was in when you saved, otherwise it could prevent the save from loading\n\nContinue Disabling Ship?");
2082
				break;
2083
		}
2084
	}
2085
 
2086
	System::Windows::Forms::DialogResult MainGui::DisplayMessageBox(bool inthread, System::String ^title, System::String ^text, MessageBoxButtons buttons, MessageBoxIcon icon)
2087
	{
2088
		if ( !inthread )
2089
			return MessageBox::Show(this, text, title, buttons, icon);
2090
		else
2091
		{
2092
			m_bDisplayMessage = true;
2093
			m_sMessageText = text;
2094
			m_sMessageTitle = title;
2095
			m_messageIcon = icon;
2096
			m_messageButtons = buttons;
2097
 
2098
			return System::Windows::Forms::DialogResult::Abort;
2099
		}
2100
	}
2101
 
2102
	ListViewItem ^MainGui::FindSelectedItem()
2103
	{
2104
		Point ^mousePoint = this->ListPackages->PointToClient(this->contextMenuStrip1->MousePosition);
2105
		return  this->ListPackages->GetItemAt(mousePoint->X, mousePoint->Y);
2106
	}
2107
 
2108
	CBaseFile *MainGui::GetFileFromItem(ListViewItem ^item)
2109
	{
2110
		int num = System::Convert::ToInt32(item->Tag);
2111
		return m_pPackages->GetPackageAt(num);
2112
	}
2113
 
2114
	System::Void MainGui::OpenContextMenu(System::Object ^Sender, CancelEventArgs ^E)
2115
	{
2116
		m_pListItem = nullptr;
2117
		E->Cancel = true;
2118
		bool showSep = false;
2119
		bool showSep2 = false;
2120
 
2121
		ListViewItem ^item = this->FindSelectedItem();
2122
		CBaseFile *p = NULL;
2123
		if ( item )
2124
				p = this->GetFileFromItem(item);
2125
 
2126
		this->emailAuthorToolStripMenuItem->Visible = false;
2127
		this->visitForumPageToolStripMenuItem->Visible = false;
2128
		this->visitWebSiteToolStripMenuItem->Visible = false;
2129
		this->ContextDisable->Visible = false;
2130
		this->ContextEnable->Visible = false;
2131
		this->ContextName->Image = nullptr;
2132
		this->UninstallSelectedContext->Visible = false;
2133
		this->viewReadmeToolStripMenuItem->Visible = false;
2134
		this->extrasToolStripMenuItem->Visible = false;
2135
		this->checkForUpdatesToolStripMenuItem->Visible = false;
2136
 
2137
		if ( p 	|| this->ListPackages->SelectedItems->Count )
2138
		{
2139
 
2140
			if ( item && p )
2141
			{
2142
				m_pListItem = item;
2143
				this->ContextName->Text = item->Text;
2144
				if ( item->ImageIndex != -1 )
2145
					this->ContextName->Image = this->ListPackages->LargeImageList->Images[item->ImageIndex];
2146
				else if ( item->ImageKey )
2147
				{
2148
					int key = this->ListPackages->LargeImageList->Images->IndexOfKey(item->ImageKey);
2149
					if ( key != -1 )
2150
						this->ContextName->Image = this->ListPackages->LargeImageList->Images[key];
2151
				}
2152
				else if ( p->GetIcon() )
2153
					PluginManager::DisplayContextIcon(p, this->ContextName, nullptr);
2154
 
2155
				this->uninstallToolStripMenuItem->Text = "Uninstall: " + item->Text;
2156
 
2157
				this->viewReadmeToolStripMenuItem->DropDownItems->Clear();
2158
				if ( p->CountFiles(FILETYPE_README) )
2159
				{
2160
					for ( C_File *f = p->GetFirstFile(FILETYPE_README); f; f = p->GetNextFile(f) )
2161
					{
2162
						if ( f->GetBaseName().GetToken(".", 1, 1).IsNumber() )
2163
						{
2164
							if ( f->GetBaseName().GetToken(".", 1, 1).ToInt() != m_pPackages->GetLanguage() )
2165
								continue;
2166
						}
2167
						if ( f->GetBaseName().IsIn("-L") )
2168
						{
2169
							int pos = f->GetBaseName().FindPos("-L");
2170
							int l = f->GetBaseName().Mid(pos + 2, 3).ToInt();
2171
							if ( l != m_pPackages->GetLanguage() )
2172
								continue;
2173
						}
2174
 
2175
						Windows::Forms::ToolStripMenuItem ^item = gcnew Windows::Forms::ToolStripMenuItem();
2176
						item->Text = SystemStringFromCyString(f->GetFilename());
2177
						item->Image = this->viewReadmeToolStripMenuItem->Image;
2178
						item->ImageScaling = ToolStripItemImageScaling::None;
2179
						item->Click += gcnew System::EventHandler(this, &MainGui::RunItem);
2180
						item->Tag = SystemStringFromCyString(f->GetFilePointer());
2181
						this->viewReadmeToolStripMenuItem->DropDownItems->Add(item);
2182
					}
2183
 
2184
					if ( this->viewReadmeToolStripMenuItem->DropDownItems->Count )
2185
					{
2186
						this->viewReadmeToolStripMenuItem->Visible = true;
2187
						showSep = true;
2188
					}
2189
				}
2190
 
2191
				this->extrasToolStripMenuItem->DropDownItems->Clear();
2192
				if ( p->CountFiles(FILETYPE_EXTRA) )
2193
				{
2194
					showSep = true;
2195
					for ( C_File *f = p->GetFirstFile(FILETYPE_EXTRA); f; f = p->GetNextFile(f) )
2196
					{
2197
						if ( !f->GetDir().Left(6).Compare("extras") )
2198
							continue;
2199
 
2200
						Windows::Forms::ToolStripMenuItem ^item = gcnew Windows::Forms::ToolStripMenuItem();
2201
						item->Text = SystemStringFromCyString(f->GetFilename());
2202
						if ( this->imageList2->Images->IndexOfKey(SystemStringFromCyString(f->GetFileExt().ToLower())) > -1 )
2203
							item->Image = this->imageList2->Images[this->imageList2->Images->IndexOfKey(SystemStringFromCyString(f->GetFileExt().ToLower()))];
2204
						else
2205
						{
2206
							CyString exe = f->GetFilePointer();
2207
							exe = exe.FindReplace("/", "\\");
2208
							wchar_t wText[200];
2209
							::MultiByteToWideChar(CP_ACP, NULL, (char *)exe.c_str(), -1, wText, exe.Length() + 1);
2210
 
2211
							System::Drawing::Icon ^myIcon;
2212
							SHFILEINFO *shinfo = new SHFILEINFO();
2213
 
2214
							if ( FAILED(SHGetFileInfo(wText, 0, shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_LARGEICON)) )
2215
							{
2216
								if ( FAILED(SHGetFileInfo(wText, 0, shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_SMALLICON)) )
2217
									item->Image = this->imageList2->Images[0];
2218
								else
2219
								{
2220
									myIcon = System::Drawing::Icon::FromHandle(IntPtr(shinfo->hIcon));
2221
									item->Image = myIcon->ToBitmap();
2222
								}
2223
							}
2224
							else
2225
							{
2226
								myIcon = System::Drawing::Icon::FromHandle(IntPtr(shinfo->hIcon));
2227
								item->Image = myIcon->ToBitmap();
2228
							}
2229
 
2230
							delete shinfo;
2231
						}
2232
						item->ImageScaling = ToolStripItemImageScaling::None;
2233
						item->Click += gcnew System::EventHandler(this, &MainGui::RunItem);
2234
						item->Tag = SystemStringFromCyString(f->GetFilePointer());
2235
						this->extrasToolStripMenuItem->DropDownItems->Add(item);
2236
					}
2237
				}
2238
 
2239
				if ( this->extrasToolStripMenuItem->DropDownItems->Count )
2240
					this->extrasToolStripMenuItem->Visible = true;
2241
 
2242
				// email/website/forum
49 cycrow 2243
				if ( !p->forumLink().empty() ) {
2244
					Utils::String web = p->forumLink();
2245
					if ( web.isNumber() )
2246
						web = Utils::String("http://forum.egosoft.com/viewtopic.php?t=") + web; 
1 cycrow 2247
 
2248
					this->visitForumPageToolStripMenuItem->Visible = true;
49 cycrow 2249
					if ( !web.isin("http://") )
2250
						this->visitForumPageToolStripMenuItem->Tag = "http://" + _US(web);
1 cycrow 2251
					else
49 cycrow 2252
						this->visitForumPageToolStripMenuItem->Tag = _US(web);
1 cycrow 2253
					showSep2 = true;
2254
				}
49 cycrow 2255
				if ( !p->email().empty() )
1 cycrow 2256
				{
2257
					this->emailAuthorToolStripMenuItem->Visible = true;
50 cycrow 2258
					this->emailAuthorToolStripMenuItem->Tag = "mailto://" + _US(p->email()) + "?subject=Re: " + _US(p->name().findReplace(" ", "%20"));
1 cycrow 2259
					showSep2 = true;
2260
				}
49 cycrow 2261
				if ( !p->webSite().empty() ) {
1 cycrow 2262
					this->visitWebSiteToolStripMenuItem->Visible = true;
49 cycrow 2263
					if ( !p->webSite().isin("http://") ) 
2264
						this->visitWebSiteToolStripMenuItem->Tag = "http://" + _US(p->webSite());
2265
					else	
2266
						this->visitWebSiteToolStripMenuItem->Tag = _US(p->webSite());
1 cycrow 2267
					showSep2 = true;
2268
				}
2269
 
49 cycrow 2270
				if ( !p->webAddress().empty() )
1 cycrow 2271
					this->checkForUpdatesToolStripMenuItem->Visible = true;
2272
			}
2273
			else
2274
				m_pListItem = nullptr;
2275
 
2276
			if ( this->ListPackages->SelectedItems->Count > 1 || !p )
2277
			{
2278
				this->UninstallSelectedContext->Visible = true;
2279
				this->UninstallSelectedContext->Text = "Uninstall Selected (" + System::Convert::ToString(this->ListPackages->SelectedItems->Count) + " packages)";
2280
			}
2281
 
2282
			if ( p )
2283
			{
2284
				if ( p->IsEnabled() )
2285
					this->ContextDisable->Visible = true;
2286
				else
2287
					this->ContextEnable->Visible = true;
2288
			}
2289
 
2290
			this->ContextSeperator->Visible = showSep;
2291
			this->ContextSeperator2->Visible = showSep2;
2292
			E->Cancel = false;
2293
		}
2294
	}
2295
 
2296
	System::Void MainGui::ListPackages_DragOver(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e)
2297
	{
2298
		e->Effect = DragDropEffects::None;
2299
 
2300
		if (e->Data->GetDataPresent(DataFormats::FileDrop)) 
2301
		{
2302
			cli::array<String ^> ^a = (cli::array<String ^> ^)e->Data->GetData(DataFormats::FileDrop, false);
2303
			int i;
2304
			for(i = 0; i < a->Length; i++)
2305
			{
2306
				String ^s = a[i];
2307
				String ^ext = IO::FileInfo(s).Extension;
2308
				if ( String::Compare(IO::FileInfo(s).Extension, ".xsp", true) == 0 || String::Compare(IO::FileInfo(s).Extension, ".spk", true) == 0 )
2309
				{
2310
					e->Effect = DragDropEffects::Copy;
2311
					break;
2312
				}
2313
			}
2314
		}
2315
	}
2316
 
2317
	System::Void MainGui::ListPackages_DragDrop(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e)
2318
	{
2319
		if (e->Data->GetDataPresent(DataFormats::FileDrop)) 
2320
		{
2321
			cli::array<String ^> ^a = (cli::array<String ^> ^)e->Data->GetData(DataFormats::FileDrop, false);
2322
			int i;
2323
			for(i = 0; i < a->Length; i++)
2324
			{
2325
				String ^s = a[i];
2326
				String ^ext = IO::FileInfo(s).Extension;
2327
				if ( String::Compare(IO::FileInfo(s).Extension, ".xsp", true) == 0 || String::Compare(IO::FileInfo(s).Extension, ".spk", true) == 0 )
2328
				{
2329
					if ( m_bDirLocked ) {
2330
						this->DisplayLocked(false);
2331
						return;
2332
					}
2333
					this->InstallPackage(s, false, false, true);
2334
				}
2335
			}
2336
 
2337
			this->StartInstalling(false, true);
2338
		}
2339
	}
2340
 
2341
	bool MainGui::CheckAccessRights(String ^dir)
2342
	{
2343
		/*
2344
		// check if already exists
2345
		String ^file = dir + "\\accessrightscheck.dat";
2346
		String ^writeStr = "testing file access";
2347
		if ( IO::File::Exists(file) )
2348
		{
2349
			// remove it
2350
			IO::File::Delete(file);
2351
			// still exists, cant delete it
2352
			if ( IO::File::Exists(file) )
2353
				return false;
2354
		}
2355
 
2356
		IO::DirectoryInfo ^dInfo = gcnew IO::DirectoryInfo(dir);
2357
		Security::AccessControl::DirectorySecurity ^dSecurity = dInfo->GetAccessControl();
2358
		dSecurity->
2359
 
2360
 
2361
		System::IO::FileStream ^writeStream = nullptr;
2362
		IO::BinaryWriter ^writer = nullptr;
2363
		try {
2364
			 writeStream = gcnew System::IO::FileStream(file, System::IO::FileMode::Create);
2365
			 writer = gcnew IO::BinaryWriter(writeStream);
2366
		}
2367
		catch (System::IO::IOException ^e)
2368
		{
2369
			MessageBox::Show("Error: " + e->ToString(), "Error", MessageBoxButtons::OK, MessageBoxIcon::Warning);
2370
		}
2371
		catch (System::Exception ^e)
2372
		{
2373
			MessageBox::Show("Error: " + e->ToString(), "Error", MessageBoxButtons::OK, MessageBoxIcon::Warning);
2374
		}
2375
		finally 
2376
		{
2377
			writer->Write(writeStr);
2378
			writer->Close();
2379
			writeStream->Close();
2380
		}
2381
 
2382
		// check if its written
2383
		if ( !IO::File::Exists(file) )
2384
			return false;
2385
 
2386
		// remove the file again
2387
		IO::File::Delete(file);
2388
		if ( IO::File::Exists(file) )
2389
			return false;
2390
*/
2391
		return true;
2392
	}
2393
 
2394
	System::Void MainGui::RunItem(System::Object ^sender, System::EventArgs ^e)
2395
	{
2396
		Windows::Forms::ToolStripMenuItem ^item = cli::safe_cast<ToolStripMenuItem ^>(sender);
2397
		String ^file = Convert::ToString(item->Tag);
2398
 
2399
		if ( IO::File::Exists(file) )
2400
		{
2401
			System::Diagnostics::Process::Start(file);
2402
		}
2403
	}
2404
 
2405
	void MainGui::RunFromToolItem(ToolStripMenuItem ^item)
2406
	{
2407
		if ( !item ) return;
2408
		if ( !item->Tag ) return;
2409
 
2410
		String ^file = Convert::ToString(item->Tag);
2411
		System::Diagnostics::Process::Start(file);
2412
	}
2413
 
2414
	void MainGui::FakePatchControlDialog()
2415
	{
2416
		FakePatchControl ^fpc = gcnew FakePatchControl(m_pPackages);
2417
		if ( fpc->ShowDialog(this) == Windows::Forms::DialogResult::OK )
2418
		{
2419
			m_pPackages->ApplyFakePatchOrder(fpc->GetPatchOrder());
2420
			m_pPackages->ShuffleFakePatches(0);
2421
		}
2422
	}
2423
 
2424
	void MainGui::CheckFakePatchCompatability()
2425
	{
2426
		CyStringList errorList;
2427
		int count = 0;
2428
		int packageCount = 0;
2429
		for ( CBaseFile *p = m_pPackages->GetFirstPackage(); p; p = m_pPackages->GetNextPackage(p) )
2430
		{
2431
			if ( !p->IsEnabled() ) continue;
2432
			if ( !p->AnyFileType(FILETYPE_MOD) ) continue;
2433
 
2434
			CyString packageName = p->GetFullPackageName(m_pPackages->GetLanguage());
2435
 
2436
			// compare this file against all other packages
2437
			for ( CBaseFile *comparePackage = m_pPackages->GetNextPackage(p); comparePackage; comparePackage = m_pPackages->GetNextPackage(comparePackage) )
2438
			{
2439
				if ( comparePackage == p ) continue; // dont include the same package
2440
				if ( !comparePackage->IsEnabled() ) continue;
2441
				if ( !comparePackage->AnyFileType(FILETYPE_MOD) ) continue;
2442
 
2443
				CyStringList list;
2444
				if ( m_pPackages->CheckCompatabilityBetweenMods(p, comparePackage, &list) )
2445
				{
2446
					CyString package2Name = comparePackage->GetFullPackageName(m_pPackages->GetLanguage());
2447
					for ( SStringList *str = list.Head(); str; str = str->next )
2448
					{
2449
						errorList.PushBack(str->str + " (" + packageName + ")", str->data + " (" + package2Name + ")");
2450
						++count;
2451
					}
2452
					++packageCount;
2453
				}
2454
			}
2455
		}
2456
 
2457
		if ( count )
2458
		{
2459
			if ( MessageBox::Show(this, "Found incompatability between fake patches\n" + count + " errors found\n\nDo you wish to view the errors?", "Fake Patch Compatability", MessageBoxButtons::YesNo, MessageBoxIcon::Information) == Windows::Forms::DialogResult::Yes )
2460
			{
2461
				CompareList ^cl = gcnew CompareList("Fake Patch Incompatabilities");
2462
				cl->AddStringList(errorList);
2463
				cl->ShowDialog(this);
2464
			}
2465
		}
2466
		else
2467
			MessageBox::Show(this, "No incompatabilities found between fake patches", "Fake Patch Compatability", MessageBoxButtons::OK, MessageBoxIcon::Information);
2468
	}
2469
 
2470
	void MainGui::EditGlobalsDialog()
2471
	{
2472
		if ( m_pPackages->IsVanilla() ) {
2473
			this->DisplayMessageBox(false, "Edit Globals", "Currently in Vanilla Mode, Cant change globals without being modified\n\nSwitch to modified mode if you wish to edit globals", MessageBoxButtons::OK, MessageBoxIcon::Question);
2474
			return;
2475
		}
2476
		if ( m_bDirLocked ) {
2477
			this->DisplayLocked(false);
2478
			return;
2479
		}
2480
 
2481
		//load globals
2482
		CyStringList globals;
2483
		m_pPackages->ReadGlobals(globals);
2484
 
2485
		EditGlobals ^edit = gcnew EditGlobals(&globals);
2486
 
2487
		// make our saved changes
2488
		for ( SStringList *str = m_pPackages->GetGlobals()->Head(); str; str = str->next )
2489
			edit->SetEditedItem(SystemStringFromCyString(str->str), SystemStringFromCyString(str->data));
2490
 
2491
		if ( edit->ShowDialog(this) == Windows::Forms::DialogResult::OK )
2492
		{
2493
			// compare whats different and save
2494
			m_pPackages->GetGlobals()->Clear();
2495
			for ( SStringList *str = edit->GetSavedSettings()->Head(); str; str = str->next )
2496
				m_pPackages->GetGlobals()->PushBack(str->str, str->data);
2497
		}
2498
	}
2499
 
2500
	void MainGui::ViewFileLog()
2501
	{
2502
		if ( m_pFileErrors->Empty() )
2503
			MessageBox::Show(this, "No messages to view in file log", "Empty File Log", MessageBoxButtons::OK, MessageBoxIcon::Warning);
2504
		else
2505
		{
2506
			FileLog ^log = gcnew FileLog;
2507
			for ( SStringList *str = m_pFileErrors->Head(); str; str = str->next )
2508
			{
2509
				bool add = true;
2510
				String ^status = "Unknown Error";
2511
				switch(str->data.GetToken(" ", 1, 1).ToInt())
2512
				{
2513
					case SPKINSTALL_CREATEDIRECTORY:
2514
						status = "Created Directory";
2515
						break;
2516
					case SPKINSTALL_CREATEDIRECTORY_FAIL:
2517
						status = "Failed to create Directory";
2518
						break;
2519
					case SPKINSTALL_WRITEFILE:
2520
						status = "File Written";
2521
						break;
2522
					case SPKINSTALL_WRITEFILE_FAIL:
2523
						status = "Failed to Write File";
2524
						break;
2525
					case SPKINSTALL_DELETEFILE:
2526
						status = "Deleted File";
2527
						break;
2528
					case SPKINSTALL_DELETEFILE_FAIL:
2529
						status = "Failed to Delete File";
2530
						break;
2531
					case SPKINSTALL_SKIPFILE:
2532
						status = "File Skipped";
2533
						break;
2534
					case SPKINSTALL_REMOVEDIR:
2535
						status = "Removed Directory";
2536
						break;
2537
					case SPKINSTALL_ENABLEFILE:
2538
						status = "Enabled File";
2539
						break;
2540
					case SPKINSTALL_DISABLEFILE:
2541
						status = "Disabled File";
2542
						break;
2543
					case SPKINSTALL_ENABLEFILE_FAIL:
2544
						status = "Failed to Enable File";
2545
						break;
2546
					case SPKINSTALL_DISABLEFILE_FAIL:
2547
						status = "Failed to Disable File";
2548
						break;
2549
					case SPKINSTALL_UNINSTALL_MOVE:
2550
						status = "Moved Uninstall File";
2551
						break;
2552
					case SPKINSTALL_UNINSTALL_COPY:
2553
						status = "Copied Uninstall File";
2554
						break;
2555
					case SPKINSTALL_UNINSTALL_MOVE_FAIL:
2556
						status = "Failed to move uninstall file";
2557
						break;
2558
					case SPKINSTALL_UNINSTALL_COPY_FAIL:
2559
						status = "Failed to copy uninstall file";
2560
						break;
2561
					case SPKINSTALL_UNINSTALL_REMOVE:
2562
						status = "Removed uninstall file";
2563
						break;
2564
					case SPKINSTALL_UNINSTALL_REMOVE_FAIL:
2565
						status = "Failed to remove uninstall file";
2566
						break;
2567
					case SPKINSTALL_ORIGINAL_BACKUP:
2568
						status = "Backed up Original";
2569
						break;
2570
					case SPKINSTALL_ORIGINAL_RESTORE:
2571
						status = "Restored Original";
2572
						break;
2573
					case SPKINSTALL_ORIGINAL_BACKUP_FAIL:
2574
						status = "Failed to Backup Original";
2575
						break;
2576
					case SPKINSTALL_ORIGINAL_RESTORE_FAIL:
2577
						status = "Failed to restore Original";
2578
						break;
2579
					case SPKINSTALL_FAKEPATCH:
2580
						status = "Adjusting Fakepatch";
2581
						break;
2582
					case SPKINSTALL_FAKEPATCH_FAIL:
2583
						status = "Failed to adjust Fakepatch";
2584
						break;
2585
					case SPKINSTALL_AUTOTEXT:
2586
						status = "Adjusting Text File";
2587
						break;
2588
					case SPKINSTALL_AUTOTEXT_FAIL:
2589
						status = "Failed to adjust Text File";
2590
						break;
2591
					case SPKINSTALL_MISSINGFILE:
2592
						status = "Missing File";
2593
						break;
2594
					case SPKINSTALL_SHARED:
2595
						status = "Shared File";
2596
						break;
2597
					case SPKINSTALL_SHARED_FAIL:
2598
						status = "Shared File Failed";
2599
						break;
2600
					case SPKINSTALL_ORPHANED:
2601
						status = "File Orphaned";
2602
						break;
2603
					case SPKINSTALL_ORPHANED_FAIL:
2604
						status = "Failed to Orphan file";
2605
						break;
2606
					case SPKINSTALL_UNCOMPRESS_FAIL:
2607
						status = "Failed to Uncompress";
2608
						break;
2609
				}
2610
 
2611
				if ( add )
2612
				{
2613
					if ( str->data.NumToken(" ") > 1 )
2614
						log->AddItem(SystemStringFromCyString(str->str.findreplace("~", " => ")), status, SystemStringFromCyString(SPK::ConvertTimeString((long)str->data.GetToken(" ", 2, 2).ToLong())));
2615
					else
2616
						log->AddItem(SystemStringFromCyString(str->str.findreplace("~", " => ")), status, nullptr);
2617
				}
2618
			}
2619
			if ( log->ShowDialog(this) == Windows::Forms::DialogResult::Cancel )
2620
			{
2621
				if ( MessageBox::Show(this, "Are you sure you want to clear the file log?", "Clear File Log", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == Windows::Forms::DialogResult::Yes )
2622
				{
2623
					m_pFileErrors->Clear();
2624
					MessageBox::Show(this, "The file log has been cleared", "File Log Cleared", MessageBoxButtons::OK, MessageBoxIcon::Information);
2625
				}
2626
			}
2627
 
2628
		}
2629
	}
2630
 
2631
	void MainGui::VerifyInstalledFiles()
2632
	{
2633
		CyStringList missing;
2634
		int amount = m_pPackages->VerifyInstalledFiles(&missing);
2635
		if ( !amount )
2636
			MessageBox::Show(this, "All files are currently installed", "Verifying Installed Files", MessageBoxButtons::OK, MessageBoxIcon::Information);
2637
		else
2638
		{
2639
			String ^text;
2640
			for ( SStringList *str = missing.Head(); str; str = str->next )
2641
			{
2642
				text += SystemStringFromCyString(str->str);
2643
				text += "\n\t";
2644
				CyString data = str->data.findreplace("\n", "\t\n");
2645
				text += SystemStringFromCyString(data);
2646
				text += "\n\n";
2647
			}
2648
			MessageBoxDetails::Show(this, "Verifing Installed Files", "Missing files detected\nAmount = " + amount, text, false, 600);
2649
		}
2650
	}
2651
 
2652
	void MainGui::ExportPackageList()
2653
	{
2654
		bool enabled = false;
2655
		if ( MessageBox::Show(this, "Do you only want to export enabled packages?", "Only Enabled", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == Windows::Forms::DialogResult::Yes )
2656
			enabled =true;
2657
		SaveFileDialog ^ofd = gcnew SaveFileDialog();
2658
		ofd->Filter = "Log Files (*.log)|*.log";
2659
		ofd->FilterIndex = 1;
2660
		ofd->RestoreDirectory = true;
2661
		ofd->AddExtension =  true;
2662
		ofd->Title = "Select the file to save the package list to";
2663
		if ( ofd->ShowDialog(this) == Windows::Forms::DialogResult::OK )
2664
		{
2665
			if ( IO::File::Exists(ofd->FileName) )
2666
				IO::File::Delete(ofd->FileName);
2667
 
2668
			StreamWriter ^sw = File::CreateText(ofd->FileName);
2669
			try 
2670
			{
2671
				for ( CBaseFile *package = m_pPackages->FirstPackage(); package; package = m_pPackages->NextPackage() )
2672
				{
2673
					if ( enabled && !package->IsEnabled() ) continue;
50 cycrow 2674
					Utils::String line = package->name() + " :: " + package->author() + " :: " + package->version() + " :: " + package->creationDate() + " :: ";
1 cycrow 2675
 
2676
					if ( package->GetType() == TYPE_XSP )
2677
						line += "Ship :: ";
2678
					else if ( package->GetType() == TYPE_ARCHIVE )
2679
						line += "- Archive - :: ";
50 cycrow 2680
					else if ( package->GetType() == TYPE_SPK ) {
2681
						Utils::String type = ((CSpkFile *)package)->GetScriptTypeString(m_pPackages->GetLanguage());
2682
						if ( !type.empty() ) line += type + " :: ";
1 cycrow 2683
					}
2684
 
50 cycrow 2685
					line = line + ((package->IsEnabled()) ? "Yes" : "No") + " :: " + ((package->IsSigned()) ? "Yes" : "No");
2686
					sw->WriteLine(_US(line));
1 cycrow 2687
				}
2688
			}
2689
			finally
2690
			{
2691
				if ( sw )
2692
					delete (IDisposable ^)sw;
2693
			}				
2694
 
2695
			if ( IO::File::Exists(ofd->FileName) )
2696
			{
2697
				if ( enabled )
2698
					MessageBox::Show(this, "Enabled Packages have been saved to:\n" + ofd->FileName, "Package List Saved", MessageBoxButtons::OK, MessageBoxIcon::Information);
2699
				else
2700
					MessageBox::Show(this, "Complete Package List has been saved to:\n" + ofd->FileName, "Package List Saved", MessageBoxButtons::OK, MessageBoxIcon::Information);
2701
			}
2702
			else
2703
				MessageBox::Show(this, "There was an error writing file:\n" + ofd->FileName, "File Write Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
2704
		}
2705
	}
2706
}
2707