Subversion Repositories spk

Rev

Rev 49 | Rev 52 | 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
 
180
		CyString exe = m_pPackages->GetGameExe()->GetGameRunExe(m_pPackages->GetCurrentDirectory());
181
		if ( CFileIO(exe).Exists() )
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
1706
		if ( System::IO::Directory::Exists(".\\Required") ) 
1707
		{
1708
			bool installing = false;
1709
			array <System::String ^> ^Files = System::IO::Directory::GetFiles(".\\Required", "*.spk");
1710
 
1711
			for ( int i = 0; i < Files->Length; i++ )
1712
			{
1713
				CyString file = CyStringFromSystemString(Files[i]);
1714
				int error;
1715
				CBaseFile *p = m_pPackages->OpenPackage(file, &error, 0, SPKREAD_NODATA);
1716
				if ( !p )
1717
					continue;
1718
 
1719
				if ( !((CSpkFile *)p)->IsLibrary() )
1720
					continue;
1721
 
1722
				if ( !p->CheckGameCompatability(m_pPackages->GetGame()) )
1723
					continue;
1724
 
1725
				// if its installed, check if we have a newer version
50 cycrow 1726
				CBaseFile *check = m_pPackages->FindSpkPackage(p->name(), p->author());
1 cycrow 1727
				if ( check )
1728
				{
50 cycrow 1729
					if ( check->version().compareVersion(p->version()) != COMPARE_OLDER )
1 cycrow 1730
					{
1731
						this->InstallPackage(Files[i], false, true, true);
1732
						installing = true;
1733
					}
1734
				}
1735
				else
1736
				{
1737
					this->InstallPackage(Files[i], false, true, true);
1738
					installing = true;
1739
				}
1740
 
1741
				delete p;
1742
			}
1743
 
1744
			if ( installing )
1745
				this->StartInstalling(true, true);
1746
			return installing;
1747
		}
1748
 
1749
		return false;
1750
	}
1751
 
1752
	////
1753
	// Auto Update
1754
	////
1755
	void MainGui::AutoUpdate()
1756
	{
1757
		if ( !m_bAutoUpdate || !System::IO::File::Exists( ".\\AutoUpdater.exe") )
1758
			return;
1759
 
1760
		// load the dir list
1761
		if ( !m_pUpdateList )
1762
		{
1763
			m_pUpdateList = new CyStringList;
1764
 
1765
			// TODO: read addresses from data
1766
 
1767
			// hardcoded address
1768
			m_pUpdateList->PushBack("http://cycrow.thexuniverse.us/pmupdate.dat", "", true);
1769
			if ( (int)PMLBETA )
1770
				m_pUpdateList->PushBack("http://cycrow.thexuniverse.us/Beta/pmupdatebeta.dat", "", true);
1771
		}
1772
 
1773
		backgroundUpdater->RunWorkerAsync();
1774
	}
1775
 
1776
	void MainGui::Updater_Finished(System::Object ^Sender, RunWorkerCompletedEventArgs ^E)
1777
	{
1778
		if ( !m_pUpdateList )
1779
			return;
1780
		if ( !m_pUpdateList->Head() )
1781
		{
1782
			delete m_pUpdateList;
1783
			m_pUpdateList = NULL;
1784
			return;
1785
		}
1786
 
1787
		this->Enabled = false;
1788
 
1789
		CyString server = m_pUpdateList->Head()->str;
1790
		CyString data = m_pUpdateList->Head()->data;
1791
 
1792
		m_pUpdateList->PopFront();
1793
 
1794
		// lets check if we have an update
1795
		if ( data.GetToken(" ", 1, 1) != "!ERROR!" )
1796
		{
1797
			CyString download;
1798
			CyString message;
1799
			int max;
1800
			CyString *strs = data.SplitToken("\n", &max);
1801
			if ( strs )
1802
			{
1803
				for ( int i = 0; i < max; i++ )
1804
				{
1805
					CyString cmd = strs[i].GetToken(":", 1, 1);
1806
					CyString rest = strs[i].GetToken(":", 2);
1807
					rest.RemoveFirstSpace();
1808
					if ( cmd.Compare("SPKVERSION") )
1809
					{
1810
						float v = rest.GetToken(" ", 1, 1).ToFloat();
1811
						if ( v > GetLibraryVersion() )
1812
						{
1813
							message += "New version of the SPK Libraries available\nCurrent = ";
1814
							message += CyString::CreateFromFloat(GetLibraryVersion(), 2);
1815
							message += "\nNew Version = ";
1816
							message += CyString::CreateFromFloat(v, 2);
1817
							message += "\n\n";
1818
 
1819
							CyString filename = rest.GetToken(" ", 2);
1820
							if ( download.Empty() )
1821
								download = filename;
1822
							else
1823
							{
1824
								download += "|";
1825
								download += filename;
1826
							}
1827
						}
1828
					}
1829
					else if ( cmd.Compare("PMLVERSION") )
1830
					{
1831
						float v = rest.GetToken(" ", 1, 1).ToFloat();
1832
						int beta = rest.GetToken(" ", 2, 2).ToInt();
1833
 
1834
						bool newVersion = false;
1835
						// new version
1836
						if ( v > (float)PMLVERSION )
1837
							newVersion = true;
1838
						// same version, check beta/rc
1839
						if ( v == (float)PMLVERSION )
1840
						{
1841
							// newer beta version
1842
							if ( beta > (int)PMLBETA && (int)PMLBETA > 0 )
1843
								newVersion = true;
1844
							// current is beta, new is an RC
1845
							else if ( (int)PMLBETA > 0 && beta < 0 )
1846
								newVersion = true;
1847
							// current is rc, new is an rc
1848
							else if ( (int)PMLBETA < 0 && beta < 0 && beta < (int)PMLBETA )
1849
								newVersion = true;
1850
							// current is beta or rc, new is not, so its newer
1851
							else if ( (int)PMLBETA != 0 && beta == 0 )
1852
								newVersion = true;
1853
						}
1854
 
1855
						if ( newVersion )
1856
						{
1857
							message += "New version of the ";
1858
							message += CyStringFromSystemString(GetProgramName(m_bAdvanced));
1859
							message += " available\nCurrent = ";
1860
							message += CyStringFromSystemString(PluginManager::GetVersionString());
1861
							message += "\nNew Version = ";
1862
							message += CyStringFromSystemString(PluginManager::GetVersionString(v, beta));
1863
							message += "\n\n";
1864
							if ( download.Empty() )
1865
								download = rest.GetToken(" ", 3);
1866
							else
1867
							{
1868
								download += "|";
1869
								download += rest.GetToken(" ", 3);
1870
							}
1871
						}
1872
					}
1873
				}
1874
			}
1875
 
1876
			CLEANSPLIT(strs, max)
1877
 
1878
			if ( !download.Empty() && !message.Empty() )
1879
			{
1880
				if ( this->DisplayMessageBox(false, "Updater", SystemStringFromCyString(message) + "Do You wish to download and install it?", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes )
1881
				{
1882
					// absolute address
1883
					CyString downloadFile;
1884
 
1885
					int max;
1886
					CyString *strs = download.SplitToken("|", &max);
1887
					for ( int i = 0; i < max; i++ )
1888
					{
1889
						CyString d = strs[i];
1890
						// relative address
1891
						if ( !d.Left(7).Compare("http://") && !d.Left(4).Compare("www.") )
1892
							d = server.DelToken("/", server.NumToken("/")) + "/" + d;
1893
 
1894
						if ( downloadFile.Empty() )
1895
							downloadFile = d;
1896
						else
1897
						{
1898
							downloadFile += "|";
1899
							downloadFile += d;
1900
						}
1901
					}
1902
 
1903
					CLEANSPLIT(strs, max);
1904
 
1905
					if ( !downloadFile.Empty() )
1906
					{
1907
						m_sDownload = SystemStringFromCyString(downloadFile);
1908
						this->Close();
1909
						return;
1910
					}
1911
				}
1912
			}
1913
		}
1914
 
1915
		// otherwise, lets continue with the next server
1916
		if ( m_pUpdateList->Head() )
1917
			backgroundUpdater->RunWorkerAsync();
1918
		else
1919
		{
1920
			delete m_pUpdateList;
1921
			m_pUpdateList = NULL;
1922
		}
1923
 
1924
		this->Enabled = true;
1925
	}
1926
 
1927
	void MainGui::TimerEvent_CheckFile(System::Object ^Sender, System::EventArgs ^E)
1928
	{
1929
		if ( m_bRunningBackground )
1930
			return;
1931
 
1932
		System::String ^mydoc = Environment::GetFolderPath(Environment::SpecialFolder::Personal );
1933
 
1934
		bool anytoinstall = false;
1935
 
1936
		if ( System::IO::File::Exists(mydoc + "\\Egosoft\\pluginmanager_load.dat") )
1937
		{
1938
			System::String ^lines = System::IO::File::ReadAllText(mydoc + "\\Egosoft\\pluginmanager_load.dat");
1939
			System::IO::File::Delete(mydoc + "\\Egosoft\\pluginmanager_load.dat");
1940
			if ( lines )
1941
			{
1942
				CyString strLines = CyStringFromSystemString(lines);
1943
				int num;
1944
				CyString *aLines = strLines.SplitToken("\n", &num);
1945
				if ( num && aLines )
1946
				{
1947
					for ( int i = 0; i < num; i++ )
1948
					{
1949
						CyString l = aLines[i];
1950
						l = l.Remove("\r");
1951
						CyString first = l.GetToken(":", 1, 1);
1952
						CyString rest = l.GetToken(":", 2);
1953
						rest.RemoveFirstSpace();
1954
 
1955
						if ( first.Compare("File") )
1956
						{
1957
							if ( m_bDirLocked ) {
1958
								this->DisplayLocked(false);
1959
								return;
1960
							}
1961
							if ( this->InstallPackage(SystemStringFromCyString(rest), false, false, true) )
1962
								anytoinstall = true;
1963
						}
1964
					}
1965
 
1966
					CLEANSPLIT(aLines, num);
1967
				}
1968
			}
1969
		}
1970
 
1971
		if ( anytoinstall )
1972
			this->StartInstalling(false, true);
1973
	}
1974
 
1975
	void MainGui::Updater_DoWork(System::Object ^Sender, DoWorkEventArgs ^E)
1976
	{
1977
		if ( !m_pUpdateList )
1978
			return;
1979
		if ( !m_pUpdateList->Head() )
1980
		{
1981
			delete m_pUpdateList;
1982
			m_pUpdateList = NULL;
1983
			return;
1984
		}
1985
 
1986
		try 
1987
		{
1988
			System::Net::WebClient ^Client = gcnew System::Net::WebClient();
1989
 
1990
			System::IO::Stream ^strm = Client->OpenRead(SystemStringFromCyString(m_pUpdateList->Head()->str));
1991
			System::IO::StreamReader ^sr = gcnew System::IO::StreamReader(strm);
1992
			System::String ^read = sr->ReadToEnd();
1993
			strm->Close();
1994
			sr->Close();
1995
 
1996
			m_pUpdateList->Head()->data = CyStringFromSystemString(read);
1997
		}
1998
		catch (System::Net::WebException ^ex)
1999
		{
2000
			m_pUpdateList->Head()->data = CyStringFromSystemString("!ERROR! " + ex->ToString());
2001
			if ( ex->Status == System::Net::WebExceptionStatus::ConnectFailure )
2002
			{
2003
				m_pUpdateList->Head()->data = CyStringFromSystemString("!ERROR! " + ex->ToString());
2004
 
2005
			}
2006
		}
2007
	}
2008
 
2009
	void MainGui::RemoveDirectory()
2010
	{
2011
		if ( !m_pPackages->IsLoaded() )
2012
			return;
2013
 
2014
		System::String ^remDir = SystemStringFromCyString(m_pPackages->GetCurrentDirectory());
2015
		this->Enabled = false;
2016
		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)
2017
		{
2018
			this->Enabled = true;
2019
			return;
2020
		}
2021
 
2022
		this->StartBackground(MGUI_BACKGROUND_REMOVEDIR, remDir);
2023
	}
2024
 
2025
	bool MainGui::RemoveCurrentDirectory()
2026
	{
2027
		if ( !m_pPackages->RemoveCurrentDirectory() )
2028
			return false;
2029
 
2030
		// remove directory from list
2031
		m_pRemovedDirList->PushBack(m_pDirList->Head()->str, "", true);
2032
		m_pDirList->PopFront();
2033
 
2034
		return true;
2035
	}
2036
 
2037
	void MainGui::LaunchGame()
2038
	{
2039
		if ( !System::IO::File::Exists(".\\GameLauncher.exe") )
2040
			return;
2041
 
2042
		m_sRun = SystemStringFromCyString(m_pPackages->GetGameRunExe());
2043
		this->Close();
2044
	}
2045
 
2046
	bool MainGui::DisplayTip(int tipsection, int tip)
2047
	{
2048
		if ( tipsection < 0 || tipsection >= MAXTIPS )
2049
			return false;
2050
 
2051
		STips ^tips = (STips ^)m_lTips[tipsection];
2052
		if ( !(tips->iTips & tip) )
2053
		{
2054
			System::String ^sTip = cli::safe_cast<System::String ^>(tips->sTips[(tip >> 1)]);
2055
 
2056
			tips->iTips |= tip;
2057
 
2058
			if ( this->DisplayMessageBox(false, "Plugin Manager Tip", sTip, MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes )
2059
				return true;
2060
			else 
2061
				return false;
2062
		}
2063
 
2064
		return true;
2065
	}
2066
 
2067
	void MainGui::SetTipStrings(int section)
2068
	{
2069
		STips ^t = (STips ^)m_lTips[section];
2070
		t->sTips = gcnew ArrayList();
2071
 
2072
		switch ( section )
2073
		{
2074
			case TIPSECTION_YESNO:
2075
				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?");
2076
				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?");
2077
				break;
2078
		}
2079
	}
2080
 
2081
	System::Windows::Forms::DialogResult MainGui::DisplayMessageBox(bool inthread, System::String ^title, System::String ^text, MessageBoxButtons buttons, MessageBoxIcon icon)
2082
	{
2083
		if ( !inthread )
2084
			return MessageBox::Show(this, text, title, buttons, icon);
2085
		else
2086
		{
2087
			m_bDisplayMessage = true;
2088
			m_sMessageText = text;
2089
			m_sMessageTitle = title;
2090
			m_messageIcon = icon;
2091
			m_messageButtons = buttons;
2092
 
2093
			return System::Windows::Forms::DialogResult::Abort;
2094
		}
2095
	}
2096
 
2097
	ListViewItem ^MainGui::FindSelectedItem()
2098
	{
2099
		Point ^mousePoint = this->ListPackages->PointToClient(this->contextMenuStrip1->MousePosition);
2100
		return  this->ListPackages->GetItemAt(mousePoint->X, mousePoint->Y);
2101
	}
2102
 
2103
	CBaseFile *MainGui::GetFileFromItem(ListViewItem ^item)
2104
	{
2105
		int num = System::Convert::ToInt32(item->Tag);
2106
		return m_pPackages->GetPackageAt(num);
2107
	}
2108
 
2109
	System::Void MainGui::OpenContextMenu(System::Object ^Sender, CancelEventArgs ^E)
2110
	{
2111
		m_pListItem = nullptr;
2112
		E->Cancel = true;
2113
		bool showSep = false;
2114
		bool showSep2 = false;
2115
 
2116
		ListViewItem ^item = this->FindSelectedItem();
2117
		CBaseFile *p = NULL;
2118
		if ( item )
2119
				p = this->GetFileFromItem(item);
2120
 
2121
		this->emailAuthorToolStripMenuItem->Visible = false;
2122
		this->visitForumPageToolStripMenuItem->Visible = false;
2123
		this->visitWebSiteToolStripMenuItem->Visible = false;
2124
		this->ContextDisable->Visible = false;
2125
		this->ContextEnable->Visible = false;
2126
		this->ContextName->Image = nullptr;
2127
		this->UninstallSelectedContext->Visible = false;
2128
		this->viewReadmeToolStripMenuItem->Visible = false;
2129
		this->extrasToolStripMenuItem->Visible = false;
2130
		this->checkForUpdatesToolStripMenuItem->Visible = false;
2131
 
2132
		if ( p 	|| this->ListPackages->SelectedItems->Count )
2133
		{
2134
 
2135
			if ( item && p )
2136
			{
2137
				m_pListItem = item;
2138
				this->ContextName->Text = item->Text;
2139
				if ( item->ImageIndex != -1 )
2140
					this->ContextName->Image = this->ListPackages->LargeImageList->Images[item->ImageIndex];
2141
				else if ( item->ImageKey )
2142
				{
2143
					int key = this->ListPackages->LargeImageList->Images->IndexOfKey(item->ImageKey);
2144
					if ( key != -1 )
2145
						this->ContextName->Image = this->ListPackages->LargeImageList->Images[key];
2146
				}
2147
				else if ( p->GetIcon() )
2148
					PluginManager::DisplayContextIcon(p, this->ContextName, nullptr);
2149
 
2150
				this->uninstallToolStripMenuItem->Text = "Uninstall: " + item->Text;
2151
 
2152
				this->viewReadmeToolStripMenuItem->DropDownItems->Clear();
2153
				if ( p->CountFiles(FILETYPE_README) )
2154
				{
2155
					for ( C_File *f = p->GetFirstFile(FILETYPE_README); f; f = p->GetNextFile(f) )
2156
					{
2157
						if ( f->GetBaseName().GetToken(".", 1, 1).IsNumber() )
2158
						{
2159
							if ( f->GetBaseName().GetToken(".", 1, 1).ToInt() != m_pPackages->GetLanguage() )
2160
								continue;
2161
						}
2162
						if ( f->GetBaseName().IsIn("-L") )
2163
						{
2164
							int pos = f->GetBaseName().FindPos("-L");
2165
							int l = f->GetBaseName().Mid(pos + 2, 3).ToInt();
2166
							if ( l != m_pPackages->GetLanguage() )
2167
								continue;
2168
						}
2169
 
2170
						Windows::Forms::ToolStripMenuItem ^item = gcnew Windows::Forms::ToolStripMenuItem();
2171
						item->Text = SystemStringFromCyString(f->GetFilename());
2172
						item->Image = this->viewReadmeToolStripMenuItem->Image;
2173
						item->ImageScaling = ToolStripItemImageScaling::None;
2174
						item->Click += gcnew System::EventHandler(this, &MainGui::RunItem);
2175
						item->Tag = SystemStringFromCyString(f->GetFilePointer());
2176
						this->viewReadmeToolStripMenuItem->DropDownItems->Add(item);
2177
					}
2178
 
2179
					if ( this->viewReadmeToolStripMenuItem->DropDownItems->Count )
2180
					{
2181
						this->viewReadmeToolStripMenuItem->Visible = true;
2182
						showSep = true;
2183
					}
2184
				}
2185
 
2186
				this->extrasToolStripMenuItem->DropDownItems->Clear();
2187
				if ( p->CountFiles(FILETYPE_EXTRA) )
2188
				{
2189
					showSep = true;
2190
					for ( C_File *f = p->GetFirstFile(FILETYPE_EXTRA); f; f = p->GetNextFile(f) )
2191
					{
2192
						if ( !f->GetDir().Left(6).Compare("extras") )
2193
							continue;
2194
 
2195
						Windows::Forms::ToolStripMenuItem ^item = gcnew Windows::Forms::ToolStripMenuItem();
2196
						item->Text = SystemStringFromCyString(f->GetFilename());
2197
						if ( this->imageList2->Images->IndexOfKey(SystemStringFromCyString(f->GetFileExt().ToLower())) > -1 )
2198
							item->Image = this->imageList2->Images[this->imageList2->Images->IndexOfKey(SystemStringFromCyString(f->GetFileExt().ToLower()))];
2199
						else
2200
						{
2201
							CyString exe = f->GetFilePointer();
2202
							exe = exe.FindReplace("/", "\\");
2203
							wchar_t wText[200];
2204
							::MultiByteToWideChar(CP_ACP, NULL, (char *)exe.c_str(), -1, wText, exe.Length() + 1);
2205
 
2206
							System::Drawing::Icon ^myIcon;
2207
							SHFILEINFO *shinfo = new SHFILEINFO();
2208
 
2209
							if ( FAILED(SHGetFileInfo(wText, 0, shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_LARGEICON)) )
2210
							{
2211
								if ( FAILED(SHGetFileInfo(wText, 0, shinfo, sizeof(shinfo), SHGFI_ICON | SHGFI_SMALLICON)) )
2212
									item->Image = this->imageList2->Images[0];
2213
								else
2214
								{
2215
									myIcon = System::Drawing::Icon::FromHandle(IntPtr(shinfo->hIcon));
2216
									item->Image = myIcon->ToBitmap();
2217
								}
2218
							}
2219
							else
2220
							{
2221
								myIcon = System::Drawing::Icon::FromHandle(IntPtr(shinfo->hIcon));
2222
								item->Image = myIcon->ToBitmap();
2223
							}
2224
 
2225
							delete shinfo;
2226
						}
2227
						item->ImageScaling = ToolStripItemImageScaling::None;
2228
						item->Click += gcnew System::EventHandler(this, &MainGui::RunItem);
2229
						item->Tag = SystemStringFromCyString(f->GetFilePointer());
2230
						this->extrasToolStripMenuItem->DropDownItems->Add(item);
2231
					}
2232
				}
2233
 
2234
				if ( this->extrasToolStripMenuItem->DropDownItems->Count )
2235
					this->extrasToolStripMenuItem->Visible = true;
2236
 
2237
				// email/website/forum
49 cycrow 2238
				if ( !p->forumLink().empty() ) {
2239
					Utils::String web = p->forumLink();
2240
					if ( web.isNumber() )
2241
						web = Utils::String("http://forum.egosoft.com/viewtopic.php?t=") + web; 
1 cycrow 2242
 
2243
					this->visitForumPageToolStripMenuItem->Visible = true;
49 cycrow 2244
					if ( !web.isin("http://") )
2245
						this->visitForumPageToolStripMenuItem->Tag = "http://" + _US(web);
1 cycrow 2246
					else
49 cycrow 2247
						this->visitForumPageToolStripMenuItem->Tag = _US(web);
1 cycrow 2248
					showSep2 = true;
2249
				}
49 cycrow 2250
				if ( !p->email().empty() )
1 cycrow 2251
				{
2252
					this->emailAuthorToolStripMenuItem->Visible = true;
50 cycrow 2253
					this->emailAuthorToolStripMenuItem->Tag = "mailto://" + _US(p->email()) + "?subject=Re: " + _US(p->name().findReplace(" ", "%20"));
1 cycrow 2254
					showSep2 = true;
2255
				}
49 cycrow 2256
				if ( !p->webSite().empty() ) {
1 cycrow 2257
					this->visitWebSiteToolStripMenuItem->Visible = true;
49 cycrow 2258
					if ( !p->webSite().isin("http://") ) 
2259
						this->visitWebSiteToolStripMenuItem->Tag = "http://" + _US(p->webSite());
2260
					else	
2261
						this->visitWebSiteToolStripMenuItem->Tag = _US(p->webSite());
1 cycrow 2262
					showSep2 = true;
2263
				}
2264
 
49 cycrow 2265
				if ( !p->webAddress().empty() )
1 cycrow 2266
					this->checkForUpdatesToolStripMenuItem->Visible = true;
2267
			}
2268
			else
2269
				m_pListItem = nullptr;
2270
 
2271
			if ( this->ListPackages->SelectedItems->Count > 1 || !p )
2272
			{
2273
				this->UninstallSelectedContext->Visible = true;
2274
				this->UninstallSelectedContext->Text = "Uninstall Selected (" + System::Convert::ToString(this->ListPackages->SelectedItems->Count) + " packages)";
2275
			}
2276
 
2277
			if ( p )
2278
			{
2279
				if ( p->IsEnabled() )
2280
					this->ContextDisable->Visible = true;
2281
				else
2282
					this->ContextEnable->Visible = true;
2283
			}
2284
 
2285
			this->ContextSeperator->Visible = showSep;
2286
			this->ContextSeperator2->Visible = showSep2;
2287
			E->Cancel = false;
2288
		}
2289
	}
2290
 
2291
	System::Void MainGui::ListPackages_DragOver(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e)
2292
	{
2293
		e->Effect = DragDropEffects::None;
2294
 
2295
		if (e->Data->GetDataPresent(DataFormats::FileDrop)) 
2296
		{
2297
			cli::array<String ^> ^a = (cli::array<String ^> ^)e->Data->GetData(DataFormats::FileDrop, false);
2298
			int i;
2299
			for(i = 0; i < a->Length; i++)
2300
			{
2301
				String ^s = a[i];
2302
				String ^ext = IO::FileInfo(s).Extension;
2303
				if ( String::Compare(IO::FileInfo(s).Extension, ".xsp", true) == 0 || String::Compare(IO::FileInfo(s).Extension, ".spk", true) == 0 )
2304
				{
2305
					e->Effect = DragDropEffects::Copy;
2306
					break;
2307
				}
2308
			}
2309
		}
2310
	}
2311
 
2312
	System::Void MainGui::ListPackages_DragDrop(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e)
2313
	{
2314
		if (e->Data->GetDataPresent(DataFormats::FileDrop)) 
2315
		{
2316
			cli::array<String ^> ^a = (cli::array<String ^> ^)e->Data->GetData(DataFormats::FileDrop, false);
2317
			int i;
2318
			for(i = 0; i < a->Length; i++)
2319
			{
2320
				String ^s = a[i];
2321
				String ^ext = IO::FileInfo(s).Extension;
2322
				if ( String::Compare(IO::FileInfo(s).Extension, ".xsp", true) == 0 || String::Compare(IO::FileInfo(s).Extension, ".spk", true) == 0 )
2323
				{
2324
					if ( m_bDirLocked ) {
2325
						this->DisplayLocked(false);
2326
						return;
2327
					}
2328
					this->InstallPackage(s, false, false, true);
2329
				}
2330
			}
2331
 
2332
			this->StartInstalling(false, true);
2333
		}
2334
	}
2335
 
2336
	bool MainGui::CheckAccessRights(String ^dir)
2337
	{
2338
		/*
2339
		// check if already exists
2340
		String ^file = dir + "\\accessrightscheck.dat";
2341
		String ^writeStr = "testing file access";
2342
		if ( IO::File::Exists(file) )
2343
		{
2344
			// remove it
2345
			IO::File::Delete(file);
2346
			// still exists, cant delete it
2347
			if ( IO::File::Exists(file) )
2348
				return false;
2349
		}
2350
 
2351
		IO::DirectoryInfo ^dInfo = gcnew IO::DirectoryInfo(dir);
2352
		Security::AccessControl::DirectorySecurity ^dSecurity = dInfo->GetAccessControl();
2353
		dSecurity->
2354
 
2355
 
2356
		System::IO::FileStream ^writeStream = nullptr;
2357
		IO::BinaryWriter ^writer = nullptr;
2358
		try {
2359
			 writeStream = gcnew System::IO::FileStream(file, System::IO::FileMode::Create);
2360
			 writer = gcnew IO::BinaryWriter(writeStream);
2361
		}
2362
		catch (System::IO::IOException ^e)
2363
		{
2364
			MessageBox::Show("Error: " + e->ToString(), "Error", MessageBoxButtons::OK, MessageBoxIcon::Warning);
2365
		}
2366
		catch (System::Exception ^e)
2367
		{
2368
			MessageBox::Show("Error: " + e->ToString(), "Error", MessageBoxButtons::OK, MessageBoxIcon::Warning);
2369
		}
2370
		finally 
2371
		{
2372
			writer->Write(writeStr);
2373
			writer->Close();
2374
			writeStream->Close();
2375
		}
2376
 
2377
		// check if its written
2378
		if ( !IO::File::Exists(file) )
2379
			return false;
2380
 
2381
		// remove the file again
2382
		IO::File::Delete(file);
2383
		if ( IO::File::Exists(file) )
2384
			return false;
2385
*/
2386
		return true;
2387
	}
2388
 
2389
	System::Void MainGui::RunItem(System::Object ^sender, System::EventArgs ^e)
2390
	{
2391
		Windows::Forms::ToolStripMenuItem ^item = cli::safe_cast<ToolStripMenuItem ^>(sender);
2392
		String ^file = Convert::ToString(item->Tag);
2393
 
2394
		if ( IO::File::Exists(file) )
2395
		{
2396
			System::Diagnostics::Process::Start(file);
2397
		}
2398
	}
2399
 
2400
	void MainGui::RunFromToolItem(ToolStripMenuItem ^item)
2401
	{
2402
		if ( !item ) return;
2403
		if ( !item->Tag ) return;
2404
 
2405
		String ^file = Convert::ToString(item->Tag);
2406
		System::Diagnostics::Process::Start(file);
2407
	}
2408
 
2409
	void MainGui::FakePatchControlDialog()
2410
	{
2411
		FakePatchControl ^fpc = gcnew FakePatchControl(m_pPackages);
2412
		if ( fpc->ShowDialog(this) == Windows::Forms::DialogResult::OK )
2413
		{
2414
			m_pPackages->ApplyFakePatchOrder(fpc->GetPatchOrder());
2415
			m_pPackages->ShuffleFakePatches(0);
2416
		}
2417
	}
2418
 
2419
	void MainGui::CheckFakePatchCompatability()
2420
	{
2421
		CyStringList errorList;
2422
		int count = 0;
2423
		int packageCount = 0;
2424
		for ( CBaseFile *p = m_pPackages->GetFirstPackage(); p; p = m_pPackages->GetNextPackage(p) )
2425
		{
2426
			if ( !p->IsEnabled() ) continue;
2427
			if ( !p->AnyFileType(FILETYPE_MOD) ) continue;
2428
 
2429
			CyString packageName = p->GetFullPackageName(m_pPackages->GetLanguage());
2430
 
2431
			// compare this file against all other packages
2432
			for ( CBaseFile *comparePackage = m_pPackages->GetNextPackage(p); comparePackage; comparePackage = m_pPackages->GetNextPackage(comparePackage) )
2433
			{
2434
				if ( comparePackage == p ) continue; // dont include the same package
2435
				if ( !comparePackage->IsEnabled() ) continue;
2436
				if ( !comparePackage->AnyFileType(FILETYPE_MOD) ) continue;
2437
 
2438
				CyStringList list;
2439
				if ( m_pPackages->CheckCompatabilityBetweenMods(p, comparePackage, &list) )
2440
				{
2441
					CyString package2Name = comparePackage->GetFullPackageName(m_pPackages->GetLanguage());
2442
					for ( SStringList *str = list.Head(); str; str = str->next )
2443
					{
2444
						errorList.PushBack(str->str + " (" + packageName + ")", str->data + " (" + package2Name + ")");
2445
						++count;
2446
					}
2447
					++packageCount;
2448
				}
2449
			}
2450
		}
2451
 
2452
		if ( count )
2453
		{
2454
			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 )
2455
			{
2456
				CompareList ^cl = gcnew CompareList("Fake Patch Incompatabilities");
2457
				cl->AddStringList(errorList);
2458
				cl->ShowDialog(this);
2459
			}
2460
		}
2461
		else
2462
			MessageBox::Show(this, "No incompatabilities found between fake patches", "Fake Patch Compatability", MessageBoxButtons::OK, MessageBoxIcon::Information);
2463
	}
2464
 
2465
	void MainGui::EditGlobalsDialog()
2466
	{
2467
		if ( m_pPackages->IsVanilla() ) {
2468
			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);
2469
			return;
2470
		}
2471
		if ( m_bDirLocked ) {
2472
			this->DisplayLocked(false);
2473
			return;
2474
		}
2475
 
2476
		//load globals
2477
		CyStringList globals;
2478
		m_pPackages->ReadGlobals(globals);
2479
 
2480
		EditGlobals ^edit = gcnew EditGlobals(&globals);
2481
 
2482
		// make our saved changes
2483
		for ( SStringList *str = m_pPackages->GetGlobals()->Head(); str; str = str->next )
2484
			edit->SetEditedItem(SystemStringFromCyString(str->str), SystemStringFromCyString(str->data));
2485
 
2486
		if ( edit->ShowDialog(this) == Windows::Forms::DialogResult::OK )
2487
		{
2488
			// compare whats different and save
2489
			m_pPackages->GetGlobals()->Clear();
2490
			for ( SStringList *str = edit->GetSavedSettings()->Head(); str; str = str->next )
2491
				m_pPackages->GetGlobals()->PushBack(str->str, str->data);
2492
		}
2493
	}
2494
 
2495
	void MainGui::ViewFileLog()
2496
	{
2497
		if ( m_pFileErrors->Empty() )
2498
			MessageBox::Show(this, "No messages to view in file log", "Empty File Log", MessageBoxButtons::OK, MessageBoxIcon::Warning);
2499
		else
2500
		{
2501
			FileLog ^log = gcnew FileLog;
2502
			for ( SStringList *str = m_pFileErrors->Head(); str; str = str->next )
2503
			{
2504
				bool add = true;
2505
				String ^status = "Unknown Error";
2506
				switch(str->data.GetToken(" ", 1, 1).ToInt())
2507
				{
2508
					case SPKINSTALL_CREATEDIRECTORY:
2509
						status = "Created Directory";
2510
						break;
2511
					case SPKINSTALL_CREATEDIRECTORY_FAIL:
2512
						status = "Failed to create Directory";
2513
						break;
2514
					case SPKINSTALL_WRITEFILE:
2515
						status = "File Written";
2516
						break;
2517
					case SPKINSTALL_WRITEFILE_FAIL:
2518
						status = "Failed to Write File";
2519
						break;
2520
					case SPKINSTALL_DELETEFILE:
2521
						status = "Deleted File";
2522
						break;
2523
					case SPKINSTALL_DELETEFILE_FAIL:
2524
						status = "Failed to Delete File";
2525
						break;
2526
					case SPKINSTALL_SKIPFILE:
2527
						status = "File Skipped";
2528
						break;
2529
					case SPKINSTALL_REMOVEDIR:
2530
						status = "Removed Directory";
2531
						break;
2532
					case SPKINSTALL_ENABLEFILE:
2533
						status = "Enabled File";
2534
						break;
2535
					case SPKINSTALL_DISABLEFILE:
2536
						status = "Disabled File";
2537
						break;
2538
					case SPKINSTALL_ENABLEFILE_FAIL:
2539
						status = "Failed to Enable File";
2540
						break;
2541
					case SPKINSTALL_DISABLEFILE_FAIL:
2542
						status = "Failed to Disable File";
2543
						break;
2544
					case SPKINSTALL_UNINSTALL_MOVE:
2545
						status = "Moved Uninstall File";
2546
						break;
2547
					case SPKINSTALL_UNINSTALL_COPY:
2548
						status = "Copied Uninstall File";
2549
						break;
2550
					case SPKINSTALL_UNINSTALL_MOVE_FAIL:
2551
						status = "Failed to move uninstall file";
2552
						break;
2553
					case SPKINSTALL_UNINSTALL_COPY_FAIL:
2554
						status = "Failed to copy uninstall file";
2555
						break;
2556
					case SPKINSTALL_UNINSTALL_REMOVE:
2557
						status = "Removed uninstall file";
2558
						break;
2559
					case SPKINSTALL_UNINSTALL_REMOVE_FAIL:
2560
						status = "Failed to remove uninstall file";
2561
						break;
2562
					case SPKINSTALL_ORIGINAL_BACKUP:
2563
						status = "Backed up Original";
2564
						break;
2565
					case SPKINSTALL_ORIGINAL_RESTORE:
2566
						status = "Restored Original";
2567
						break;
2568
					case SPKINSTALL_ORIGINAL_BACKUP_FAIL:
2569
						status = "Failed to Backup Original";
2570
						break;
2571
					case SPKINSTALL_ORIGINAL_RESTORE_FAIL:
2572
						status = "Failed to restore Original";
2573
						break;
2574
					case SPKINSTALL_FAKEPATCH:
2575
						status = "Adjusting Fakepatch";
2576
						break;
2577
					case SPKINSTALL_FAKEPATCH_FAIL:
2578
						status = "Failed to adjust Fakepatch";
2579
						break;
2580
					case SPKINSTALL_AUTOTEXT:
2581
						status = "Adjusting Text File";
2582
						break;
2583
					case SPKINSTALL_AUTOTEXT_FAIL:
2584
						status = "Failed to adjust Text File";
2585
						break;
2586
					case SPKINSTALL_MISSINGFILE:
2587
						status = "Missing File";
2588
						break;
2589
					case SPKINSTALL_SHARED:
2590
						status = "Shared File";
2591
						break;
2592
					case SPKINSTALL_SHARED_FAIL:
2593
						status = "Shared File Failed";
2594
						break;
2595
					case SPKINSTALL_ORPHANED:
2596
						status = "File Orphaned";
2597
						break;
2598
					case SPKINSTALL_ORPHANED_FAIL:
2599
						status = "Failed to Orphan file";
2600
						break;
2601
					case SPKINSTALL_UNCOMPRESS_FAIL:
2602
						status = "Failed to Uncompress";
2603
						break;
2604
				}
2605
 
2606
				if ( add )
2607
				{
2608
					if ( str->data.NumToken(" ") > 1 )
2609
						log->AddItem(SystemStringFromCyString(str->str.findreplace("~", " => ")), status, SystemStringFromCyString(SPK::ConvertTimeString((long)str->data.GetToken(" ", 2, 2).ToLong())));
2610
					else
2611
						log->AddItem(SystemStringFromCyString(str->str.findreplace("~", " => ")), status, nullptr);
2612
				}
2613
			}
2614
			if ( log->ShowDialog(this) == Windows::Forms::DialogResult::Cancel )
2615
			{
2616
				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 )
2617
				{
2618
					m_pFileErrors->Clear();
2619
					MessageBox::Show(this, "The file log has been cleared", "File Log Cleared", MessageBoxButtons::OK, MessageBoxIcon::Information);
2620
				}
2621
			}
2622
 
2623
		}
2624
	}
2625
 
2626
	void MainGui::VerifyInstalledFiles()
2627
	{
2628
		CyStringList missing;
2629
		int amount = m_pPackages->VerifyInstalledFiles(&missing);
2630
		if ( !amount )
2631
			MessageBox::Show(this, "All files are currently installed", "Verifying Installed Files", MessageBoxButtons::OK, MessageBoxIcon::Information);
2632
		else
2633
		{
2634
			String ^text;
2635
			for ( SStringList *str = missing.Head(); str; str = str->next )
2636
			{
2637
				text += SystemStringFromCyString(str->str);
2638
				text += "\n\t";
2639
				CyString data = str->data.findreplace("\n", "\t\n");
2640
				text += SystemStringFromCyString(data);
2641
				text += "\n\n";
2642
			}
2643
			MessageBoxDetails::Show(this, "Verifing Installed Files", "Missing files detected\nAmount = " + amount, text, false, 600);
2644
		}
2645
	}
2646
 
2647
	void MainGui::ExportPackageList()
2648
	{
2649
		bool enabled = false;
2650
		if ( MessageBox::Show(this, "Do you only want to export enabled packages?", "Only Enabled", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == Windows::Forms::DialogResult::Yes )
2651
			enabled =true;
2652
		SaveFileDialog ^ofd = gcnew SaveFileDialog();
2653
		ofd->Filter = "Log Files (*.log)|*.log";
2654
		ofd->FilterIndex = 1;
2655
		ofd->RestoreDirectory = true;
2656
		ofd->AddExtension =  true;
2657
		ofd->Title = "Select the file to save the package list to";
2658
		if ( ofd->ShowDialog(this) == Windows::Forms::DialogResult::OK )
2659
		{
2660
			if ( IO::File::Exists(ofd->FileName) )
2661
				IO::File::Delete(ofd->FileName);
2662
 
2663
			StreamWriter ^sw = File::CreateText(ofd->FileName);
2664
			try 
2665
			{
2666
				for ( CBaseFile *package = m_pPackages->FirstPackage(); package; package = m_pPackages->NextPackage() )
2667
				{
2668
					if ( enabled && !package->IsEnabled() ) continue;
50 cycrow 2669
					Utils::String line = package->name() + " :: " + package->author() + " :: " + package->version() + " :: " + package->creationDate() + " :: ";
1 cycrow 2670
 
2671
					if ( package->GetType() == TYPE_XSP )
2672
						line += "Ship :: ";
2673
					else if ( package->GetType() == TYPE_ARCHIVE )
2674
						line += "- Archive - :: ";
50 cycrow 2675
					else if ( package->GetType() == TYPE_SPK ) {
2676
						Utils::String type = ((CSpkFile *)package)->GetScriptTypeString(m_pPackages->GetLanguage());
2677
						if ( !type.empty() ) line += type + " :: ";
1 cycrow 2678
					}
2679
 
50 cycrow 2680
					line = line + ((package->IsEnabled()) ? "Yes" : "No") + " :: " + ((package->IsSigned()) ? "Yes" : "No");
2681
					sw->WriteLine(_US(line));
1 cycrow 2682
				}
2683
			}
2684
			finally
2685
			{
2686
				if ( sw )
2687
					delete (IDisposable ^)sw;
2688
			}				
2689
 
2690
			if ( IO::File::Exists(ofd->FileName) )
2691
			{
2692
				if ( enabled )
2693
					MessageBox::Show(this, "Enabled Packages have been saved to:\n" + ofd->FileName, "Package List Saved", MessageBoxButtons::OK, MessageBoxIcon::Information);
2694
				else
2695
					MessageBox::Show(this, "Complete Package List has been saved to:\n" + ofd->FileName, "Package List Saved", MessageBoxButtons::OK, MessageBoxIcon::Information);
2696
			}
2697
			else
2698
				MessageBox::Show(this, "There was an error writing file:\n" + ofd->FileName, "File Write Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
2699
		}
2700
	}
2701
}
2702