Subversion Repositories spk

Rev

Rev 182 | Rev 197 | Go to most recent revision | 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
	{
196 cycrow 42
		Utils::WString gameName = _packages->GetGameExe()->GetGameName(dir.toString());
121 cycrow 43
		if (!gameName.empty())
44
		{
45
			if (!_lFoundDirs->contains(dir, true) && !_lDirs->contains(dir, true) && !_lRemoveDirs->contains(dir, true))
46
			{
196 cycrow 47
				Utils::WString exe = dir.findReplace("\\", "/").findReplace("//", "/");
48
				_lFoundDirs->pushBack(exe, _packages->GetGameExe()->GetGameName(exe.toString()));
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
 
196 cycrow 58
	if (checkBase && _packages->GetGameExe()->isAddon(exe.toString()))
121 cycrow 59
	{
196 cycrow 60
		Utils::WString base = _packages->getGameRunExe(_packages->GetGameExe()->GetGameDir(exe.toString()));
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
196 cycrow 75
			if (!_packages->GetGameExe()->isAddon(exe.toString()))
121 cycrow 76
			{
77
				CDirIO dir(file.dir());
78
				Utils::CStringList list;
79
				// get all the addons from a base game
196 cycrow 80
				if (_packages->getGameAddons(list, _packages->GetGameExe()->GetProperDir(exe.toString())))
121 cycrow 81
				{
82
					for (Utils::SStringList *a_item = list.first(); a_item; a_item = list.next())
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
	{
97
		Utils::CStringList list;
98
		// get all the addons from a base game
196 cycrow 99
		if (_packages->getGameAddons(list, _packages->GetGameExe()->GetProperDir(exe.toString())))
121 cycrow 100
		{
101
			for (Utils::SStringList *a_item = list.first(); a_item; a_item = list.next())
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"|"))
122
				_lDirs->pushBack(_packages->getGameRunExe((*itr)->str.toString()), data.tokens(L"|", 2));
121 cycrow 123
			else
196 cycrow 124
				_lDirs->pushBack(_packages->getGameRunExe((*itr)->str.toString()), data);
121 cycrow 125
		}
126
	}
127
	if (removedDirs)
128
	{
129
		for (auto itr = removedDirs->begin(); itr != removedDirs->end(); itr++)
196 cycrow 130
			_lRemoveDirs->pushBack(_packages->getGameRunExe((*itr)->str.toString()), (*itr)->data);
121 cycrow 131
	}
132
 
133
	// find other dirs
134
	System::String ^progfile = Environment::GetFolderPath(Environment::SpecialFolder::ProgramFiles);
135
	Utils::CStringList gameDirs;		
136
	gameDirs.pushBack("HKCU\\Software\\Deepsilver\\X2 The Threat", "INSTALL_DIR");
137
	gameDirs.pushBack("HKCU\\Software\\Deepsilver\\X3 Reunion", "INSTALL_DIR");
138
	gameDirs.pushBack("HKCU\\Software\\Egosoft\\X3TC", "INSTALL_DIR");
139
	gameDirs.pushBack("Steam\\x2 - the threat");
140
	gameDirs.pushBack("Steam\\x3 - reunion");
141
	gameDirs.pushBack("Steam\\x3 terran conflict");
142
	// some custom directories to look for
143
	gameDirs.pushBack("%PROGRAMFILES%\\Egosoft\\X2 The Threat");
144
	gameDirs.pushBack("%PROGRAMFILES%\\Egosoft\\X3 Reunion");
145
	gameDirs.pushBack("%PROGRAMFILES%\\Egosoft\\X3 Terran Conflict");
146
	gameDirs.pushBack("C:\\Games\\X2");
147
	gameDirs.pushBack("C:\\Games\\X3");
148
	gameDirs.pushBack("C:\\Games\\X3TC");
149
	gameDirs.pushBack("D:\\Games\\X2");
150
	gameDirs.pushBack("D:\\Games\\X3");
151
	gameDirs.pushBack("D:\\Games\\X3TC");	
152
	for (Utils::SStringList *strNode = gameDirs.first(); strNode; strNode = gameDirs.next())
153
	{
154
		Utils::String sFirst = strNode->str.token("\\", 1);
155
		Utils::String sRest = strNode->str.tokens("\\", 2);
156
 
157
		if (sFirst.Compare("HKCU") || sFirst.Compare("HKLM"))
158
		{
159
			RegistryKey ^searchKey = nullptr;
160
			if (sFirst.Compare("HKCU"))
161
				searchKey = Registry::CurrentUser->OpenSubKey(_US(sRest));
162
			else if (sFirst.Compare("HKLM"))
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)
169
					AddFoundDir(_packages->GetGameExe()->GetGameRunExe(_S(regRead)));
170
			}
171
		}
172
		else if (sFirst.Compare("Steam"))
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
				{
180
					Utils::String steamDir = _S(regRead);
181
					if (!steamDir.empty())
182
					{
183
						Utils::String dir = steamDir + "\\steamapps\\common\\" + sRest;
184
						AddFoundDir(_packages->GetGameExe()->GetGameRunExe(dir.findReplace("\\", "/").findReplace("//", "/")));
185
					}
186
				}
187
			}
188
		}
189
		else
190
		{
191
			Utils::String dir = strNode->str;
192
			dir = dir.findReplace("\\", "/").findReplace("//", "/");
193
			dir = dir.findReplace("%PROGRAMFILES%", _S(progfile));
194
			AddFoundDir(_packages->GetGameExe()->GetGameRunExe(dir));
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()) {
211
		Utils::String dir = _packages->GetGameExe()->GetProperDir(s_item->str.toString());
121 cycrow 212
		ListViewItem ^item = gcnew ListViewItem(_US(dir));
213
 
196 cycrow 214
		int iGame = _packages->GetGameExe()->GetGameType(s_item->str.toString());
121 cycrow 215
		item->ImageIndex = iGame;
216
 
217
		item->SubItems->Add(_US(s_item->data));
218
		if (CFileIO::Exists(s_item->str))
219
		{
220
			ListViewItem::ListViewSubItem ^i = _packages->isCurrentDir(dir) ? item->SubItems->Add("Active") : item->SubItems->Add("OK");
221
			i->ForeColor = Color::Green;
196 cycrow 222
			item->SubItems->Add(_US(_packages->ConvertLanguage(_packages->getGameLanguage(CFileIO(s_item->str).dir().toString()))));
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
 
196 cycrow 231
		item->SubItems->Add(_US(_packages->GetGameExe()->isAddon(s_item->str.toString()) ? "Yes" : "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)) {
196 cycrow 250
			ListViewItem ^item = gcnew ListViewItem(_US(_packages->GetGameExe()->GetProperDir(s_item->str.toString())));
251
			int iGame = _packages->GetGameExe()->GetGameType(s_item->str.toString());
121 cycrow 252
			item->ImageIndex = iGame;
253
			item->SubItems->Add(_US(s_item->data));
196 cycrow 254
			item->SubItems->Add(_US(_packages->ConvertLanguage(_packages->getGameLanguage(CFileIO(s_item->str).dir().toString()))));
255
			item->SubItems->Add(_US(_packages->GetGameExe()->isAddon(s_item->str.toString()) ? "Yes" : "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)) {
196 cycrow 263
			ListViewItem ^item = gcnew ListViewItem(_US(_packages->GetGameExe()->GetProperDir(s_item->str.toString())));
264
			int iGame = _packages->GetGameExe()->GetGameType(s_item->str.toString());
121 cycrow 265
			item->ImageIndex = iGame;
196 cycrow 266
			item->SubItems->Add(_US(_packages->GetGameExe()->GetGameName(s_item->str.toString())));
267
			item->SubItems->Add(_US(_packages->ConvertLanguage(_packages->getGameLanguage(CFileIO(s_item->str).dir().toString()))));
268
			item->SubItems->Add(_US(_packages->GetGameExe()->isAddon(s_item->str.toString()) ? "Yes" : "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 = "";
292
	for (int i = 0; i < _packages->GetGameExe()->GetNumGames(); i++)
293
	{
294
		SGameExe *exe = _packages->GetGameExe()->GetGame(i);
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
	{
304
		Utils::String file = _S(ofd->FileName);
305
		Utils::String dir = _S(IO::FileInfo(ofd->FileName).DirectoryName);
306
		// check its a valid directory
307
		if (!dir.empty())
308
		{
182 cycrow 309
			Utils::String 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
315
				if (_packages->isOldDir(dir))
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
				}
182 cycrow 320
				Utils::String properDir = _packages->getProperDir(file);
121 cycrow 321
				_lRemoveDirs->remove(properDir, true);
322
				_lDirs->pushBack(file.findReplace("\\", "/").findReplace("//", "/"), gameName);
323
 
324
				// now add any connected dirs
325
				if (_packages->GetGameExe()->isAddon(file))
326
				{
182 cycrow 327
					Utils::String baseExe = _packages->getGameRunExe(_packages->GetGameExe()->GetGameDir(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
 
356
		Utils::String dir = _packages->getProperDir(_S(s));
357
		if (_packages->isCurrentDir(dir))
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;
363
		_lRemoveDirs->pushBack(_S(s), _lDirs->findString(_S(s)));
364
		_lDirs->remove(_S(s), false);
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;
384
		_lDirs->pushBack(_S(s), _packages->GetGameExe()->GetGameName(_S(s)));
385
		_lFoundDirs->remove(_S(s), false);
386
		_lRemoveDirs->remove(_S(s), false);
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
	{
406
		_lDirs->pushBack(_S(s), _packages->GetGameExe()->GetGameName(_S(s)));
407
		_lFoundDirs->remove(_S(s), false);
408
		_lRemoveDirs->remove(_S(s), false);
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