Subversion Repositories spk

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 cycrow 1
#pragma once
2
 
3
using namespace System;
4
using namespace System::Xml;
5
using namespace System::ComponentModel;
6
using namespace System::Collections;
7
using namespace System::Windows::Forms;
8
using namespace System::Data;
9
using namespace System::Drawing;
10
 
11
 
12
namespace Creator {
13
 
14
	/// <summary>
15
	/// Summary for LoadText
16
	///
17
	/// WARNING: If you change the name of this class, you will need to change the
18
	///          'Resource File Name' property for the managed resource compiler tool
19
	///          associated with all .resx files this class depends on.  Otherwise,
20
	///          the designers will not be able to interact properly with localized
21
	///          resources associated with this form.
22
	/// </summary>
23
	public ref class LoadText : public System::Windows::Forms::Form
24
	{
25
	public:
26
		LoadText(CLinkList<SGameDir> *dirs, CPackages *p, Collections::Hashtable ^text)
27
		{
28
			InitializeComponent();
29
 
30
			m_pTextList = text;
31
			m_pCurrentDir = NULL;
32
			m_pPackages = p;
33
			m_lDirs = dirs;
34
		}
35
 
36
		void Start()
37
		{
38
			if ( m_pCurrentDir ) this->label2->Text = SystemStringFromCyString(m_pCurrentDir->sDir);
39
			this->backgroundWorker1->RunWorkerAsync();
40
		}
41
 
42
		void DoWork()
43
		{
44
			if ( !m_pCurrentDir ) return;
45
 
46
			int game = m_pCurrentDir->sGame.GetToken(" ", 1, 1).ToInt();
47
			int flags = m_pPackages->GetGameExe()->GetGameFlags(game);
48
 
49
			CyString textFile = SPK::FormatTextName(1, m_pPackages->GetLanguage(), (flags & EXEFLAG_TCTEXT)) + ".pck";
50
 
51
			// find the latest text file
52
			if ( m_pPackages->ExtractGameFile(CyString("t/") + textFile, m_pPackages->GetTempDirectory() + "/text.xml", m_pCurrentDir->sDir) )
53
				this->ReadTextFromFile(SystemStringFromCyString(m_pPackages->GetTempDirectory() + "/text.xml"), game);
54
 
55
			if ( !m_pCurrentDir->bLoad ) return;
56
 
57
			// extract any text files in the t directory
58
			cli::array<String ^> ^files = IO::Directory::GetFiles(SystemStringFromCyString(m_pCurrentDir->sDir.FindReplace("/", "\\") + "\\t"), "*.xml");
59
			for ( int i = 0; i < files->Length; i++ )
60
				this->ReadTextFromFile(files[i], game);
61
 
62
			cli::array<String ^> ^filespck = IO::Directory::GetFiles(SystemStringFromCyString(m_pCurrentDir->sDir.FindReplace("/", "\\") + "\\t"), "*.pck");
63
			for ( int i = 0; i < filespck->Length; i++ )
64
			{
65
				// extract the t file
66
				C_File F(CyStringFromSystemString(filespck[i]));
67
				if ( F.UnPCKFile() )
68
				{
69
					if ( F.WriteToFile(m_pPackages->GetTempDirectory() + "/text.xml") )
70
						this->ReadTextFromFile(SystemStringFromCyString(m_pPackages->GetTempDirectory() + "/text.xml"), game);
71
				}
72
			}
73
		}
74
 
75
		void Next()
76
		{
77
			m_pCurrentDir = m_lDirs->Next();
78
			if ( m_pCurrentDir )
79
				this->Start();
80
			else
81
				this->Close();
82
		}
83
 
84
		void ReadTextFromFile(String ^file, int game)
85
		{
86
 
87
			XmlTextReader ^reader = gcnew XmlTextReader(file);
88
			int inPage = -1;
89
			int inID = -1;
90
			while ( reader->Read() )
91
			{
92
				switch(reader->NodeType)
93
				{
94
					case XmlNodeType::Element:
95
						if ( String::Compare(reader->Name, "page") == 0 )
96
						{
97
							while (reader->MoveToNextAttribute())
98
							{
99
								if ( String::Compare(reader->Name, "id") == 0 )
100
								{
101
									inPage = Convert::ToInt32(reader->Value);
102
									if ( inPage >= 10000 )
103
										inPage %= 10000;
104
								}
105
							}
106
						}
107
						else if ( inPage > 0 && String::Compare(reader->Name, "t") == 0 )
108
						{
109
							while (reader->MoveToNextAttribute())
110
							{
111
								if ( String::Compare(reader->Name, "id") == 0 )
112
									inID = Convert::ToInt32(reader->Value);
113
							}
114
						}
115
						break;
116
					case XmlNodeType::Text:
117
						if ( inID > 0 )
118
						{
119
							String ^key = Convert::ToString(game) + "," + Convert::ToString(inPage) + "," + Convert::ToString(inID);
120
							String ^t = reader->Value;
121
							while ( t->IndexOf('(') != -1 && t->IndexOf(')') != -1 )
122
							{
123
								int s = t->IndexOf('(');
124
								t = t->Remove(s, t->IndexOf(')') - s + 1);
125
							}
126
 
127
							if ( m_pTextList->ContainsKey(key) )
128
								m_pTextList[key] = t;
129
							else
130
								m_pTextList->Add(key, t);
131
						}
132
						break;
133
					case XmlNodeType::EndElement:
134
						if ( String::Compare(reader->Name, "page") == 0 )
135
							inPage = -1;
136
						else if ( String::Compare(reader->Name, "t") == 0 )
137
							inID = -1;
138
						break;
139
 
140
				}
141
			}
142
			return;
143
		}
144
 
145
 
146
	protected:
147
		/// <summary>
148
		/// Clean up any resources being used.
149
		/// </summary>
150
		~LoadText()
151
		{
152
			if (components)
153
			{
154
				delete components;
155
			}
156
		}
157
	private: System::Windows::Forms::Label^  label1;
158
	protected: 
159
	private: System::Windows::Forms::Label^  label2;
160
	private: System::ComponentModel::BackgroundWorker^  backgroundWorker1;
161
 
162
	private:
163
		Collections::Hashtable	^m_pTextList;
164
		CPackages	*m_pPackages;
165
		SGameDir	*m_pCurrentDir;
166
		CLinkList<SGameDir>	*m_lDirs;
167
		/// <summary>
168
		/// Required designer variable.
169
		/// </summary>
170
		System::ComponentModel::Container ^components;
171
 
172
#pragma region Windows Form Designer generated code
173
		/// <summary>
174
		/// Required method for Designer support - do not modify
175
		/// the contents of this method with the code editor.
176
		/// </summary>
177
		void InitializeComponent(void)
178
		{
179
			this->label1 = (gcnew System::Windows::Forms::Label());
180
			this->label2 = (gcnew System::Windows::Forms::Label());
181
			this->backgroundWorker1 = (gcnew System::ComponentModel::BackgroundWorker());
182
			this->SuspendLayout();
183
			// 
184
			// label1
185
			// 
186
			this->label1->Dock = System::Windows::Forms::DockStyle::Top;
187
			this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Bold, System::Drawing::GraphicsUnit::Point, 
188
				static_cast<System::Byte>(0)));
189
			this->label1->Location = System::Drawing::Point(10, 10);
190
			this->label1->Name = L"label1";
191
			this->label1->Size = System::Drawing::Size(231, 32);
192
			this->label1->TabIndex = 0;
193
			this->label1->Text = L"Loading Text";
194
			this->label1->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
195
			this->label1->UseWaitCursor = true;
196
			// 
197
			// label2
198
			// 
199
			this->label2->Dock = System::Windows::Forms::DockStyle::Fill;
200
			this->label2->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 8.25F, System::Drawing::FontStyle::Italic, System::Drawing::GraphicsUnit::Point, 
201
				static_cast<System::Byte>(0)));
202
			this->label2->Location = System::Drawing::Point(10, 42);
203
			this->label2->Name = L"label2";
204
			this->label2->Size = System::Drawing::Size(231, 23);
205
			this->label2->TabIndex = 1;
206
			this->label2->TextAlign = System::Drawing::ContentAlignment::TopCenter;
207
			this->label2->UseWaitCursor = true;
208
			// 
209
			// backgroundWorker1
210
			// 
211
			this->backgroundWorker1->DoWork += gcnew System::ComponentModel::DoWorkEventHandler(this, &LoadText::backgroundWorker1_DoWork);
212
			this->backgroundWorker1->RunWorkerCompleted += gcnew System::ComponentModel::RunWorkerCompletedEventHandler(this, &LoadText::backgroundWorker1_RunWorkerCompleted);
213
			// 
214
			// LoadText
215
			// 
216
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
217
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
218
			this->BackColor = System::Drawing::Color::Gray;
219
			this->ClientSize = System::Drawing::Size(251, 75);
220
			this->ControlBox = false;
221
			this->Controls->Add(this->label2);
222
			this->Controls->Add(this->label1);
223
			this->Cursor = System::Windows::Forms::Cursors::WaitCursor;
224
			this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::None;
225
			this->Name = L"LoadText";
226
			this->Padding = System::Windows::Forms::Padding(10);
227
			this->ShowInTaskbar = false;
228
			this->SizeGripStyle = System::Windows::Forms::SizeGripStyle::Hide;
229
			this->StartPosition = System::Windows::Forms::FormStartPosition::CenterParent;
230
			this->Text = L"LoadText";
231
			this->TopMost = true;
232
			this->UseWaitCursor = true;
233
			this->Load += gcnew System::EventHandler(this, &LoadText::LoadText_Load);
234
			this->ResumeLayout(false);
235
 
236
		}
237
#pragma endregion
238
	private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
239
				 this->DoWork();
240
			 }
241
	private: System::Void LoadText_Load(System::Object^  sender, System::EventArgs^  e) {
242
				 m_pCurrentDir = m_lDirs->First();
243
				 this->Start();
244
			 }
245
	private: System::Void backgroundWorker1_RunWorkerCompleted(System::Object^  sender, System::ComponentModel::RunWorkerCompletedEventArgs^  e) {
246
				 this->Next();
247
			 }
248
};
249
}