Subversion Repositories spk

Rev

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

Rev Author Line No. Line
121 cycrow 1
#include "../stdafx.h"
2
#include "DirectoryControl.h"
3
 
4
using namespace PluginManager;
5
 
196 cycrow 6
DirectoryControl::DirectoryControl(CPackages *packages, Utils::WStringList *currentDirs, Utils::WStringList *removedDirs)
121 cycrow 7
{
8
	InitializeComponent();
9
 
10
	this->listView1->LargeImageList = this->imageListGames;
11
	this->listView1->SmallImageList = this->imageListGames;
12
	this->listView2->LargeImageList = this->imageListGames;
13
	this->listView2->SmallImageList = this->imageListGames;
14
 
15
	_packages = packages;
196 cycrow 16
	_lDirs = new Utils::WStringList();
17
	_lRemoveDirs = new Utils::WStringList();
18
	_lFoundDirs = new Utils::WStringList();
121 cycrow 19
 
20
	this->getAllDirs(currentDirs, removedDirs);
21
	this->UpdateGameDirs();
22
	this->UpdateFoundDirs();
122 cycrow 23
	this->UpdateTexts();
121 cycrow 24
}
25
 
26
DirectoryControl::~DirectoryControl()
27
{
28
	if (components)
29
	{
30
		delete components;
31
	}
32
 
33
	delete _lDirs;
34
	delete _lRemoveDirs;
35
	delete _lFoundDirs;
36
}
37
 
196 cycrow 38
void DirectoryControl::AddFoundDir(const Utils::WString &dir)
121 cycrow 39
{
40
	if (CDirIO(dir).exists())
41
	{
197 cycrow 42
		Utils::WString gameName = _packages->GetGameExe()->gameName(dir);
121 cycrow 43
		if (!gameName.empty())
44
		{
45
			if (!_lFoundDirs->contains(dir, true) && !_lDirs->contains(dir, true) && !_lRemoveDirs->contains(dir, true))
46
			{
197 cycrow 47
				Utils::WString exe = dir.findReplace(L"\\", L"/").findReplace(L"//", L"/");
48
				_lFoundDirs->pushBack(exe, _packages->GetGameExe()->gameName(exe));
121 cycrow 49
			}
50
		}
51
	}
52
}
53
 
196 cycrow 54
void DirectoryControl::FindAllAddons(const Utils::WString &exe, bool checkBase)
121 cycrow 55
{
56
	CDirIO Dir(exe);
57
 
197 cycrow 58
	if (checkBase && _packages->GetGameExe()->isAddon(exe))
121 cycrow 59
	{
197 cycrow 60
		Utils::WString base = _packages->getGameRunExe(_packages->GetGameExe()->gameDir(exe));
121 cycrow 61
		if (CFileIO::Exists(base))
62
		{
63
			AddFoundDir(base);
64
			FindAllAddons(base, false);
65
			return;
66
		}
67
	}
68
 
69
	if (Dir.isFile())
70
	{
71
		CFileIO file(exe);
72
		if (file.exists())
73
		{
74
			// dont include addons, only the base game
197 cycrow 75
			if (!_packages->GetGameExe()->isAddon(exe))
121 cycrow 76
			{
77
				CDirIO dir(file.dir());
197 cycrow 78
				Utils::WStringList list;
121 cycrow 79
				// get all the addons from a base game
197 cycrow 80
				if (_packages->getGameAddons(list, _packages->GetGameExe()->properDir(exe)))
121 cycrow 81
				{
197 cycrow 82
					for (Utils::WStringNode *a_item = list.first(); a_item; a_item = list.next())
121 cycrow 83
					{
84
						//check both the exe and the data directory exists
85
						if (dir.exists(a_item->data) && dir.exists(a_item->str))
86
						{
196 cycrow 87
							Utils::WString newFile = dir.file(a_item->str);
121 cycrow 88
							AddFoundDir(newFile);
89
						}
90
					}
91
				}
92
			}
93
		}
94
	}
95
	else if (Dir.exists())
96
	{
197 cycrow 97
		Utils::WStringList list;
121 cycrow 98
		// get all the addons from a base game
197 cycrow 99
		if (_packages->getGameAddons(list, _packages->GetGameExe()->properDir(exe)))
121 cycrow 100
		{
197 cycrow 101
			for (Utils::WStringNode *a_item = list.first(); a_item; a_item = list.next())
121 cycrow 102
			{
103
				//check both the exe and the data directory exists
104
				if (Dir.exists(a_item->data) && Dir.exists(a_item->str))
105
				{
196 cycrow 106
					Utils::WString newFile = Dir.file(a_item->str);
121 cycrow 107
					AddFoundDir(newFile);
108
				}
109
			}
110
		}
111
	}
112
}
113
 
196 cycrow 114
void DirectoryControl::getAllDirs(Utils::WStringList *currentDirs, Utils::WStringList *removedDirs)
121 cycrow 115
{
116
	if (currentDirs)
117
	{
118
		for (auto itr = currentDirs->begin(); itr != currentDirs->end(); itr++)
119
		{
196 cycrow 120
			Utils::WString data = (*itr)->data;
121
			if(data.contains(L"|"))
224 cycrow 122
				_lDirs->pushBack(_packages->getGameRunExe((*itr)->str), data.tokens(L"|", 2));
121 cycrow 123
			else
224 cycrow 124
				_lDirs->pushBack(_packages->getGameRunExe((*itr)->str), data);
121 cycrow 125
		}
126
	}
127
	if (removedDirs)
128
	{
129
		for (auto itr = removedDirs->begin(); itr != removedDirs->end(); itr++)
224 cycrow 130
			_lRemoveDirs->pushBack(_packages->getGameRunExe((*itr)->str), (*itr)->data);
121 cycrow 131
	}
132
 
133
	// find other dirs
134
	System::String ^progfile = Environment::GetFolderPath(Environment::SpecialFolder::ProgramFiles);
222 cycrow 135
	Utils::WStringList gameDirs;		
136
	gameDirs.pushBack(L"HKCU\\Software\\Deepsilver\\X2 The Threat", L"INSTALL_DIR");
137
	gameDirs.pushBack(L"HKCU\\Software\\Deepsilver\\X3 Reunion", L"INSTALL_DIR");
138
	gameDirs.pushBack(L"HKCU\\Software\\Egosoft\\X3TC", L"INSTALL_DIR");
139
	gameDirs.pushBack(L"Steam\\x2 - the threat");
140
	gameDirs.pushBack(L"Steam\\x3 - reunion");
141
	gameDirs.pushBack(L"Steam\\x3 terran conflict");
121 cycrow 142
	// some custom directories to look for
222 cycrow 143
	gameDirs.pushBack(L"%PROGRAMFILES%\\Egosoft\\X2 The Threat");
144
	gameDirs.pushBack(L"%PROGRAMFILES%\\Egosoft\\X3 Reunion");
145
	gameDirs.pushBack(L"%PROGRAMFILES%\\Egosoft\\X3 Terran Conflict");
146
	gameDirs.pushBack(L"C:\\Games\\X2");
147
	gameDirs.pushBack(L"C:\\Games\\X3");
148
	gameDirs.pushBack(L"C:\\Games\\X3TC");
149
	gameDirs.pushBack(L"D:\\Games\\X2");
150
	gameDirs.pushBack(L"D:\\Games\\X3");
151
	gameDirs.pushBack(L"D:\\Games\\X3TC");	
152
	for (Utils::WStringNode *strNode = gameDirs.first(); strNode; strNode = gameDirs.next())
121 cycrow 153
	{
222 cycrow 154
		Utils::WString sFirst = strNode->str.token(L"\\", 1);
155
		Utils::WString sRest = strNode->str.tokens(L"\\", 2);
121 cycrow 156
 
222 cycrow 157
		if (sFirst.Compare(L"HKCU") || sFirst.Compare(L"HKLM"))
121 cycrow 158
		{
159
			RegistryKey ^searchKey = nullptr;
222 cycrow 160
			if (sFirst.Compare(L"HKCU"))
121 cycrow 161
				searchKey = Registry::CurrentUser->OpenSubKey(_US(sRest));
222 cycrow 162
			else if (sFirst.Compare(L"HKLM"))
121 cycrow 163
				searchKey = Registry::LocalMachine->OpenSubKey(_US(sRest));
164
 
165
			if (searchKey)
166
			{
167
				System::String ^regRead = System::Convert::ToString(searchKey->GetValue(_US(strNode->data)));
168
				if (regRead)
197 cycrow 169
					AddFoundDir(_packages->GetGameExe()->gameRunExe(_WS(regRead)));
121 cycrow 170
			}
171
		}
226 cycrow 172
		else if (sFirst.Compare(L"Steam"))
121 cycrow 173
		{
174
			RegistryKey ^steamKey = Registry::CurrentUser->OpenSubKey("Software\\Valve\\Steam");
175
			if (steamKey)
176
			{
177
				System::String ^regRead = System::Convert::ToString(steamKey->GetValue("SteamPath"));
178
				if (regRead)
179
				{
197 cycrow 180
					Utils::WString steamDir = _WS(regRead);
121 cycrow 181
					if (!steamDir.empty())
182
					{
222 cycrow 183
						Utils::WString dir = steamDir + L"\\steamapps\\common\\" + sRest;
197 cycrow 184
						AddFoundDir(_packages->GetGameExe()->gameRunExe(dir.findReplace(L"\\", L"/").findReplace(L"//", L"/")));
121 cycrow 185
					}
186
				}
187
			}
188
		}
189
		else
190
		{
197 cycrow 191
			Utils::WString dir = strNode->str;
192
			dir = dir.findReplace(L"\\", L"/").findReplace(L"//", L"/");
193
			dir = dir.findReplace(L"%PROGRAMFILES%", _WS(progfile));
194
			AddFoundDir(_packages->GetGameExe()->gameRunExe(dir));
121 cycrow 195
		}
196
	}
197
 
198
	// now add all addons for already added dirs
199
	for(int i = _lFoundDirs->size() - 1; i >= 0; --i)
200
		FindAllAddons(_lFoundDirs->get(i)->str, true);
201
	for (auto itr = _lRemoveDirs->begin(); itr != _lRemoveDirs->end(); ++itr)
202
		FindAllAddons((*itr)->str, true);
203
	for (auto itr = _lDirs->begin(); itr != _lDirs->end(); ++itr)
204
		FindAllAddons((*itr)->str, true);
205
}
206
 
207
void DirectoryControl::UpdateGameDirs()
208
{
209
	this->listView1->Items->Clear();
196 cycrow 210
	for (Utils::WStringNode *s_item = _lDirs->first(); s_item; s_item = _lDirs->next()) {
197 cycrow 211
		Utils::WString dir = _packages->GetGameExe()->properDir(s_item->str);
121 cycrow 212
		ListViewItem ^item = gcnew ListViewItem(_US(dir));
213
 
197 cycrow 214
		int iGame = _packages->GetGameExe()->getGameType(s_item->str);
121 cycrow 215
		item->ImageIndex = iGame;
216
 
217
		item->SubItems->Add(_US(s_item->data));
218
		if (CFileIO::Exists(s_item->str))
219
		{
224 cycrow 220
			ListViewItem::ListViewSubItem ^i = _packages->isCurrentDir(dir) ? item->SubItems->Add("Active") : item->SubItems->Add("OK");
121 cycrow 221
			i->ForeColor = Color::Green;
224 cycrow 222
			item->SubItems->Add(_US(_packages->ConvertLanguage(_packages->getGameLanguage(CFileIO(s_item->str).dir()))));
121 cycrow 223
		}
224
		else
225
		{
226
			ListViewItem::ListViewSubItem ^i = item->SubItems->Add("Not Found");
227
			i->ForeColor = Color::Red;
228
			item->SubItems->Add("-");
229
		}
230
 
226 cycrow 231
		item->SubItems->Add(_US(_packages->GetGameExe()->isAddon(s_item->str) ? L"Yes" : L"No"));
121 cycrow 232
		item->SubItems->Add(_US(s_item->str));
233
		this->listView1->Items->Add(item);
234
 
235
	}
236
 
237
	this->listView1->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
238
	this->ColumnStatus->Width = 100;
239
	this->ColumnDirectory->Width += 50;
240
	this->ColumnID->Width = 0;
241
 
242
	this->removeButton->Enabled = (this->listView1->SelectedItems->Count) ? true : false;
243
}
244
 
245
void DirectoryControl::UpdateFoundDirs()
246
{
247
	this->listView2->Items->Clear();
196 cycrow 248
	for (Utils::WStringNode *s_item = _lRemoveDirs->first(); s_item; s_item = _lRemoveDirs->next()) {
121 cycrow 249
		if (CFileIO::Exists(s_item->str)) {
197 cycrow 250
			ListViewItem ^item = gcnew ListViewItem(_US(_packages->GetGameExe()->properDir(s_item->str)));
251
			int iGame = _packages->GetGameExe()->getGameType(s_item->str);
121 cycrow 252
			item->ImageIndex = iGame;
253
			item->SubItems->Add(_US(s_item->data));
224 cycrow 254
			item->SubItems->Add(_US(_packages->ConvertLanguage(_packages->getGameLanguage(CFileIO(s_item->str).dir()))));
226 cycrow 255
			item->SubItems->Add(_US(_packages->GetGameExe()->isAddon(s_item->str) ? L"Yes" : L"No"));
121 cycrow 256
			item->SubItems->Add(_US(s_item->str));
257
			this->listView2->Items->Add(item);
258
		}
259
	}
260
 
196 cycrow 261
	for (Utils::WStringNode *s_item = _lFoundDirs->first(); s_item; s_item = _lFoundDirs->next()) {
121 cycrow 262
		if (CFileIO::Exists(s_item->str)) {
197 cycrow 263
			ListViewItem ^item = gcnew ListViewItem(_US(_packages->GetGameExe()->properDir(s_item->str)));
264
			int iGame = _packages->GetGameExe()->getGameType(s_item->str);
121 cycrow 265
			item->ImageIndex = iGame;
197 cycrow 266
			item->SubItems->Add(_US(_packages->GetGameExe()->gameName(s_item->str)));
224 cycrow 267
			item->SubItems->Add(_US(_packages->ConvertLanguage(_packages->getGameLanguage(CFileIO(s_item->str).dir()))));
226 cycrow 268
			item->SubItems->Add(_US(_packages->GetGameExe()->isAddon(s_item->str) ? L"Yes" : L"No"));
121 cycrow 269
			item->SubItems->Add(_US(s_item->str));
270
			this->listView2->Items->Add(item);
271
		}
272
	}
273
 
274
	this->listView2->AutoResizeColumns(ColumnHeaderAutoResizeStyle::HeaderSize);
275
	this->ColumnDir2->Width += 50;
276
	this->ColumnID2->Width = 0;
277
 
278
	this->ButtonAddFound->Enabled = (this->listView2->SelectedItems->Count) ? true : false;
279
}
280
 
122 cycrow 281
void DirectoryControl::UpdateTexts()
282
{
283
	CLanguages *texts = CLanguages::Instance();
284
	this->Text = _US(texts->findText(LS_DIRECTORY, LANGDIR_TITLE));
285
}
286
 
121 cycrow 287
System::Void DirectoryControl::button1_Click(System::Object^  sender, System::EventArgs^  e)
288
{
289
	OpenFileDialog ^ofd = gcnew OpenFileDialog();
290
	ofd->Filter = "X-Universe Executable|";
291
	String ^games = "";
197 cycrow 292
	for (int i = 0; i < _packages->GetGameExe()->numGames(); i++)
121 cycrow 293
	{
197 cycrow 294
		SGameExe *exe = _packages->GetGameExe()->game(i);
121 cycrow 295
		if (i) ofd->Filter += ";";
296
		ofd->Filter += _US(exe->sExe);
297
		games += "|" + _US(exe->sName) + "|" + _US(exe->sExe);
298
	}
299
	ofd->Filter += games;
300
	ofd->FilterIndex = 1;
301
	ofd->RestoreDirectory = true;
302
	if (ofd->ShowDialog(this) == System::Windows::Forms::DialogResult::OK)
303
	{
197 cycrow 304
		Utils::WString file = _WS(ofd->FileName);
305
		Utils::WString dir = _WS(IO::FileInfo(ofd->FileName).DirectoryName);
121 cycrow 306
		// check its a valid directory
307
		if (!dir.empty())
308
		{
197 cycrow 309
			Utils::WString gameName = _packages->getGameName(file);
121 cycrow 310
			if (gameName.empty())
311
				MessageBox::Show(this, "No X-Universe game found in folder:\n" + _US(dir), "Add Directory Error", MessageBoxButtons::OK, MessageBoxIcon::Error);
312
			else
313
			{
314
				// lets check if theres an old folder
212 cycrow 315
				if (_packages->isOldDir(dir))
121 cycrow 316
				{
317
					if (MessageBox::Show(this, "Game directory: " + _US(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?", "Update Game Directory", MessageBoxButtons::YesNo, MessageBoxIcon::Question) != System::Windows::Forms::DialogResult::Yes)
318
						return;
319
				}
197 cycrow 320
				Utils::WString properDir = _packages->getProperDir(file);
121 cycrow 321
				_lRemoveDirs->remove(properDir, true);
226 cycrow 322
				_lDirs->pushBack(file.findReplace(L"\\", L"/").findReplace(L"//", L"/"), gameName);
121 cycrow 323
 
324
				// now add any connected dirs
325
				if (_packages->GetGameExe()->isAddon(file))
326
				{
197 cycrow 327
					Utils::WString baseExe = _packages->getGameRunExe(_packages->GetGameExe()->gameDir(file));
121 cycrow 328
					if (CFileIO::Exists(baseExe))
329
					{
330
						this->AddFoundDir(baseExe);
331
						this->FindAllAddons(baseExe, false);
332
					}
333
				}
334
				else
335
					this->FindAllAddons(file, false);
336
 
337
				UpdateGameDirs();
338
				UpdateFoundDirs();
339
			}
340
		}
341
	}
342
}
343
 
344
System::Void DirectoryControl::listView1_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) 
345
{
346
	this->removeButton->Enabled = (this->listView1->SelectedItems->Count) ? true : false;
347
}
348
 
349
System::Void DirectoryControl::removeButton_Click(System::Object^  sender, System::EventArgs^  e) 
350
{
351
	bool anyDone = false;
352
	for (int i = 0; i < this->listView1->SelectedItems->Count; ++i)
353
	{
354
		String ^s = this->listView1->SelectedItems[i]->SubItems[this->listView1->SelectedItems[i]->SubItems->Count - 1]->Text;
355
 
197 cycrow 356
		Utils::WString dir = _packages->getProperDir(_WS(s));
224 cycrow 357
		if (_packages->isCurrentDir(dir))
121 cycrow 358
		{
359
			if (MessageBox::Show(this, "The game directory: " + _US(dir) + "\nIs currently the active game directory, are you sure you want to remove it?", "Remove Game Directory", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == Windows::Forms::DialogResult::No)
360
				continue;
361
		}
362
		anyDone = true;
224 cycrow 363
		_lRemoveDirs->pushBack(_WS(s), _lDirs->findString(_WS(s)));
364
		_lDirs->remove(_WS(s), false);
121 cycrow 365
	}
366
 
367
	if (anyDone)
368
	{
369
		UpdateGameDirs();
370
		UpdateFoundDirs();
371
	}
372
}
373
 
374
System::Void DirectoryControl::listView2_SelectedIndexChanged(System::Object^  sender, System::EventArgs^  e) 
375
{
376
	this->ButtonAddFound->Enabled = (this->listView2->SelectedItems->Count) ? true : false;
377
}
378
 
379
System::Void DirectoryControl::ButtonAddFound_Click(System::Object^  sender, System::EventArgs^  e) 
380
{
381
	for (int i = 0; i < this->listView2->SelectedItems->Count; ++i)
382
	{
383
		String ^s = this->listView2->SelectedItems[i]->SubItems[this->listView2->SelectedItems[i]->SubItems->Count - 1]->Text;
197 cycrow 384
		_lDirs->pushBack(_WS(s), _packages->GetGameExe()->gameName(_WS(s)));
385
		_lFoundDirs->remove(_WS(s), false);
386
		_lRemoveDirs->remove(_WS(s), false);
121 cycrow 387
	}
388
 
389
	UpdateGameDirs();
390
	UpdateFoundDirs();
391
}
392
 
393
System::Void DirectoryControl::listView1_DoubleClick(System::Object^  sender, System::EventArgs^  e)
394
{
395
	String ^s = this->listView1->SelectedItems[0]->SubItems[this->listView1->SelectedItems[0]->SubItems->Count - 1]->Text;
396
	if (s && s->Length > 0)
397
	{
398
	}
399
}
400
 
401
System::Void DirectoryControl::listView2_DoubleClick(System::Object^  sender, System::EventArgs^  e)
402
{
403
	String ^s = this->listView2->SelectedItems[0]->SubItems[this->listView2->SelectedItems[0]->SubItems->Count - 1]->Text;
404
	if (s && s->Length > 0)
405
	{
224 cycrow 406
		_lDirs->pushBack(_WS(s), _packages->GetGameExe()->gameName(_WS(s)));
197 cycrow 407
		_lFoundDirs->remove(_WS(s), false);
408
		_lRemoveDirs->remove(_WS(s), false);
121 cycrow 409
 
410
		UpdateGameDirs();
411
		UpdateFoundDirs();
412
	}
413
}
414
 
196 cycrow 415
Utils::WStringList *DirectoryControl::directories()
121 cycrow 416
{
417
	return _lDirs;
418
}
196 cycrow 419
Utils::WStringList *DirectoryControl::removeDirectories()
121 cycrow 420
{
421
	return _lRemoveDirs;
422
}
423