Subversion Repositories spk

Rev

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

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