ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/AE/Installer/trunk/source/main_window.cpp
(Generate patch)

Comparing AE/Installer/trunk/source/main_window.cpp (file contents):
Revision 379 by iritscen, Mon Jun 29 19:23:42 2009 UTC vs.
Revision 487 by iritscen, Wed Dec 30 01:51:38 2009 UTC

# Line 1 | Line 1
1 < /*
2 < AE/Mod Installer
3 < by Gumby and Iritscen
4 < */
5 <
6 < // To-do: - Load credits from text resource file
7 < //                - Institute lots of checks into file-handling
8 < //                - Clear mod info fields when mod is de-selected
9 <
10 < #define DEBUG
11 < #include <stdio.h>
12 < //#include <conio.h>
13 < //#include <process.h>
14 < #include <string>
15 < #include <iostream>
16 < #include <cctype>
17 < #include <vector>
18 < #include <fstream>
19 < #include <errno.h>
20 < #include <sstream>
21 <
22 < #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations
23 < #include "boost/lexical_cast.hpp" //int -> string
24 < #include "installer.h"
1 > /***************************************************************************\
2 > | Project: AE Installer                                                                                                         |
3 > | By: Gumby & Iritscen                                                                                                          |
4 > | File: Main_Window.cpp                                                                                                         |
5 > | Function: Handles the GUI.                                                                                            |
6 > | Created: 07/05/2009 20:38:25                                                                                          |
7 > \***************************************************************************/
8  
9 < #ifdef WIN32
10 < #include <windows.h>
28 < #else // assume we're on Mac
29 < #include <stdlib.h>
30 < #include <dirent.h>
9 > #ifndef NTDDI_VERSION          
10 > #define NTDDI_VERSION NTDDI_WIN7
11   #endif
32
33 //const string strInstallerVersion = "1.0";
34 const bool SPLIT = 1;
35 const bool NOT_SPLIT = 0;
36 bool splitInstances = SPLIT;
37 bool busy = 0;
12   #ifdef WIN32
13 < const string strOniSplit = "Onisplit.exe";
14 < string strImportOption = "-import:nosep";
15 < const char* strClsCmd = "cls";
16 < const char* strPauseCmd = "PAUSE";
17 < #else // set up Mac equivalents since we're in Mac OS
44 < const string strOniSplit = "mono Onisplit.exe";
45 < string strImportOption = "-import:sep";
46 < const char* strClsCmd = "clear";
47 < const char* strPauseCmd = "read -n 1 -p \"Press any key to continue\"";
48 < void Sleep(int ms) { sleep( ms / 1000 ); }
49 < #endif
50 <
51 < using namespace boost::filesystem;
52 < using namespace std;
53 <
54 <
55 <
56 <
57 < #include "boost/date_time/gregorian/gregorian.hpp"
58 < #include "boost/date_time/date_parsing.hpp"
59 < #include "boost/date_time/posix_time/posix_time.hpp"
60 <
61 < int globalizeData(void)
62 < {
63 <        busy = 1;
64 <        using boost::lexical_cast;
65 <        using boost::bad_lexical_cast;
66 <        // using namespace boost::posix_time;
67 <        using namespace boost::gregorian;
68 <        using namespace boost::posix_time;
69 <        ptime start_time(second_clock::local_time());
70 <
71 <        setStatusArea("Globalizing!");
72 <        int err = 0;
73 <        int parts_done = 0;
74 <        char Step_x_x[300];
75 <        //char levels[i][5];
76 <        remove("Globalize.log");
77 <        ofstream logfile("Globalize.log");
78 <        logfile << "Globalization started " << to_simple_string(start_time) << endl;
79 <        try {
80 <
81 <                char levels_cstr[15][3] = {"0", "1", "2", "3", "4", "6", "8", "9", "10", "11", "12", "13", "14", "18", "19"}; // the levels Oni has...probably should have made a string array. Oops.
82 <                //const vector<double> ck(cv, &cv[CvSize]);
83 <                vector<string> levels;
84 <                for (int f = 0; f < 15; f++) {
85 <                        levels.push_back(levels_cstr[f]);
86 <                }
87 <                char choice = 0;
88 <
89 <                //SetCurrentDirectory("C:/Program Files/Oni/edition/install");
90 <                ///char levels[i][3];
91 <                path Characters = "../GameDataFolder/level0_Characters";
92 <                path Particles = "../GameDataFolder/level0_Particles";
93 <                path Archive = "../GameDataFolder/Archive";
94 <                path Textures  = "../GameDataFolder/level0_Textures";
95 <                path Sounds = "../GameDataFolder/level0_Sounds";
96 <                path Animations = "../GameDataFolder/level0_Animations";
97 <                path TRAC = Animations / "level0_TRAC";
98 <                path TRAM = Animations / "level0_TRAM";
99 <
100 <                vector<path> GDFPaths;
101 <                GDFPaths.push_back(Characters);
102 <                GDFPaths.push_back(Particles);
103 <                GDFPaths.push_back(Textures);
104 <                GDFPaths.push_back(Sounds);
105 <                GDFPaths.push_back(TRAC);
106 <                GDFPaths.push_back(TRAM);
107 <
108 <
109 <                path VanillaCharacters = "packages/VanillaDats/level0_Final/level0_Characters/level0_Characters.oni";
110 <                path VanillaParticles = "packages/VanillaDats/level0_Final/level0_Particles/level0_Particles.oni";
111 <                path VanillaTextures  = "packages/VanillaDats/level0_Final/level0_Textures/level0_Textures.oni";
112 <                path VanillaSounds = "packages/VanillaDats/level0_Final/level0_Sounds/level0_Sounds.oni";
113 <                path VanillaAnimations = "packages/VanillaDats/level0_Final/level0_Animations/level0_Animations.oni";
114 <                path VanillaTRAC = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAC.oni";
115 <                path VanillaTRAM = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAM.oni";
116 <
117 <                vector<path> VanillaPaths;
118 <
119 <                VanillaPaths.push_back(VanillaCharacters);
120 <                VanillaPaths.push_back(VanillaParticles);
121 <                VanillaPaths.push_back(VanillaTextures);
122 <                VanillaPaths.push_back(VanillaSounds);
123 <                VanillaPaths.push_back(VanillaTRAC);
124 <                VanillaPaths.push_back(VanillaTRAM);
125 <
126 <                /*
127 <                if (exists("../GameDataFolder/"))
128 <                {
129 <                //cout << "\nIt looks like you've already globalized Oni's data.\nDo you want to re-globalize?\n(This will erase existing mods installed to the AE's game data.)"
130 <                //       << "\n1. Re-globalize"
131 <                //       << "\n2. Return to main menu\n";
132 <                //choice = cin.get();
133 <                cin.ignore(128, '\n');
134 <                if (choice == '1')
135 <                remove_all("../GameDataFolder"); // remove AE GDF
136 <                if (choice == '2')
137 <                return 0;
138 <                }
139 <                */
140 <                setStatusArea("Removing old GameDataFolder...\n");
141 <                logfile <<  "Removing old GameDataFolder...\n";
142 <                remove_all( "../GameDataFolder/" );
143 <                setStatusArea("Creating needed directories...");
144 <                logfile <<  "Creating needed directories...\n";
145 <                create_directory( "../GameDataFolder/" );
146 <
147 <                create_directory( "packages" );
148 <
149 <                if (exists("packages/VanillaDats")) remove_all("packages/VanillaDats");
150 <                create_directory( "packages/VanillaDats" );
151 <
152 <                create_directory( "packages/VanillaDats/level0_Final/" );
153 <                //blah blah finish this.
154 <                //logfile <<  "packages/VanillaDats/level0_Final/ created";
155 <                create_directory( Characters );
156 <                create_directory( Particles );
157 <                create_directory( Archive );
158 <                create_directory( Textures );
159 <                create_directory( Sounds );
160 <                create_directory( Animations );
161 <                create_directory( TRAC );
162 <                create_directory( TRAM );
163 <                int num_levels = 0;
164 <                for(int i = 1; i < 15; i++)
165 <                {
166 <                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
167 <                                num_levels++;
168 <
169 <                        }
170 <                }
171 <                logfile << "Exporting and moving...\n\n";
172 <                int total_steps =  8 + 2 * num_levels;
173 <                for(int i = 0; i < 15; i++)
174 <                {
175 <
176 <                        //printf(levels[i],"%d",levels[i]); // int to char array
177 <
178 <                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
179 <                                logfile << "level" << levels[i] << "_Final\n";
180 <                                logfile << "\tExporting level" << levels[i] << "_Final.dat\n";
181 <                                //printf(Step_x_x,"Step %d/%d: exporting level%d_final.dat", parts_done + 1,, levels[i]); setStatusArea((string)Step_x_x);
182 <                                setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " exporting level" + levels[i]+"_Final.dat");
183 <                                create_directory( "../GameDataFolder/level" + levels[i] + "_Final" );
184 <                                //                              setStatusArea(strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat");
185 <                                system((strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat").c_str());
186 <                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final" );
187 <                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final" );
188 <
189 <                                directory_iterator end_iter;
190 <                                for ( directory_iterator dir_itr( "../GameDataFolder/level" + levels[i] + "_Final" ); dir_itr != end_iter; ++dir_itr )
191 <                                {
192 <                                        //cout << dir_itr->path().filename();
193 <                                        if ( is_regular_file( dir_itr->status() ) )
194 <                                        {
195 <                                                if ( dir_itr->path().filename().substr(0,8) == "TXMPfail" ||
196 <                                                        dir_itr->path().filename().substr(0,9) == "TXMPlevel" ||
197 <                                                        ( dir_itr->path().filename().substr(0,4) == "TXMP" && dir_itr->path().filename().find("intro")!=string::npos) ||
198 <                                                        dir_itr->path().filename().substr(0,4) == "TXMB" ||
199 <                                                        dir_itr->path().filename() == "M3GMpowerup_lsi.oni" ||
200 <                                                        dir_itr->path().filename() == "TXMPlsi_icon.oni" ||
201 <                                                        ( dir_itr->path().filename().substr(0,4) == "TXMB" && dir_itr->path().filename().find("splash_screen.oni")!=string::npos)       )
202 <                                                {
203 <                                                        cout <<dir_itr->path().filename() << "\n";
204 <                                                        create_directory( dir_itr->path().parent_path() / "NoGlobal");  
205 <                                                        if(!exists( dir_itr->path().parent_path() / "NoGlobal" / dir_itr->filename())) rename(dir_itr->path(), dir_itr->path().parent_path() / "NoGlobal" /
206 <                                                                dir_itr->filename());
207 <                                                        else remove(dir_itr->path());
208 <                                                }
209 <                                                else if (dir_itr->path().filename().substr(0,4) == "TRAC"
210 <                                                        || dir_itr->path().filename().substr(0,4) == "ONVL") {
211 <                                                                cout <<dir_itr->path().filename() << "\n";
212 <                                                                if(!exists( TRAC / dir_itr->filename())) rename(dir_itr->path(), TRAC / dir_itr->filename());
213 <                                                                else remove(dir_itr->path());
214 <                                                }
215 <                                                else if (dir_itr->path().filename().substr(0,4) == "TRAM") {
216 <                                                        cout <<dir_itr->path().filename() << "\n";
217 <                                                        if(!exists( TRAM / dir_itr->filename())) rename(dir_itr->path(), TRAM / dir_itr->filename());
218 <                                                        else remove(dir_itr->path());
219 <                                                }
220 <                                                else if (dir_itr->path().filename().substr(0,4) == "ONSK" ||
221 <                                                        dir_itr->path().filename().substr(0,4) == "TXMP") {
222 <                                                                cout <<dir_itr->path().filename() << "\n";\
223 <                                                                        create_directory( dir_itr->path().parent_path() / "TexFix");    
224 <                                                                if(!exists( Textures / dir_itr->filename())) rename(dir_itr->path(), Textures / dir_itr->filename());
225 <                                                                //rename(dir_itr->path(), dir_itr->path().parent_path() / "TexFix" / dir_itr->filename());
226 <                                                }
227 <                                                else if (dir_itr->path().filename().substr(0,4) == "ONCC"
228 <                                                        || dir_itr->path().filename().substr(0,4) == "TRBS"
229 <                                                        || dir_itr->path().filename().substr(0,4) == "ONCV"
230 <                                                        || dir_itr->path().filename().substr(0,4) == "TRMA"
231 <                                                        || dir_itr->path().filename().substr(0,4) == "TRSC"
232 <                                                        || dir_itr->path().filename().substr(0,4) == "TRAS") {
233 <                                                                cout <<dir_itr->path().filename() << "\n";
234 <                                                                if(!exists( Characters / dir_itr->filename())) rename(dir_itr->path(), Characters / dir_itr->filename());
235 <                                                                else remove(dir_itr->path());
236 <                                                }
237 <                                                else if (dir_itr->path().filename().substr(0,4) == "OSBD"
238 <                                                        || dir_itr->path().filename().substr(0,4) == "SNDD") {
239 <                                                                cout << dir_itr->path().filename() << "\n";
240 <                                                                if(!exists( Sounds / dir_itr->filename())) rename(dir_itr->path(), Sounds / dir_itr->filename());
241 <                                                                else remove(dir_itr->path());
242 <                                                }
243 <                                                else if (dir_itr->path().filename().substr(0,5) == "BINA3"
244 <                                                        || dir_itr->path().filename().substr(0,10) == "M3GMdebris"
245 <                                                        || dir_itr->path().filename() == "M3GMtoxic_bubble.oni"
246 <                                                        || dir_itr->path().filename().substr(0,8) == "M3GMelec"
247 <                                                        || dir_itr->path().filename().substr(0,7) == "M3GMrat"
248 <                                                        || dir_itr->path().filename().substr(0,7) == "M3GMjet"
249 <                                                        || dir_itr->path().filename().substr(0,9) == "M3GMbomb_"
250 <                                                        || dir_itr->path().filename() == "M3GMbarab_swave.oni"
251 <                                                        || dir_itr->path().filename() == "M3GMbloodyfoot.oni"
252 <                                                        ){
253 <                                                                cout <<dir_itr->path().filename() << "\n";
254 <                                                                if(!exists( Particles / dir_itr->filename())) rename(dir_itr->path(), Particles / dir_itr->filename());
255 <                                                                else remove(dir_itr->path());
256 <                                                }
257 <                                                else if (dir_itr->path().filename().substr(0,4) == "AGDB"
258 <                                                        || dir_itr->path().filename().substr(0,4) == "TRCM") {
259 <                                                                cout <<dir_itr->path().filename() << "\n";
260 <
261 <                                                                if(!exists( Archive / dir_itr->filename())) rename(dir_itr->path(), Archive / dir_itr->filename());
262 <                                                                else remove(dir_itr->path());
263 <                                                }
264 <                                                if (exists(dir_itr->path())) {
265 <
266 <                                                }
267 <                                                else {
268 <                                                        //logfile << "\tMoved file: " << dir_itr->path().filename() << "\n";
269 <                                                }
270 <                                        }
271 <
272 <
273 <
274 <                                }
275 <                                logfile << "\tCleaning up TXMPs...\n";
276 <                                system( (strOniSplit + " -move:delete " + Textures.string() + " ../GameDataFolder/level" + levels[i] + "_Final/TXMP*.oni").c_str());
277 <                                parts_done++;
278 <
279 <                                setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
280 <
281 <                        }
282 <                }
283 <                logfile << "Reimporting levels\n";
284 <                for (int i = 0; i < 15; i++)
285 <                {
286 <                        logfile << "\tReimporting level" << levels[i] << "_Final.oni\n";
287 <                        //printf(levels[i],"%d",levels[i]);
288 <                        //printf(Step_x_x,"Step %d/%d: reimporting level", parts_done + 1, 7 + 2 * num_levels); setStatusArea((string)Step_x_x + levels[i] + (string)"_Final.dat");
289 <                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " reimporting level" + levels[i]+"_Final.oni");
290 <                        system( (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final packages/VanillaDats/level" + levels[i] + "_Final/level"
291 <                                + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize.log").c_str());
292 <                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
293 <                        parts_done++;
294 <                }
295 <                create_directory( VanillaCharacters.parent_path() );
296 <                create_directory( VanillaParticles.parent_path() );
297 <                create_directory( VanillaTextures.parent_path() );
298 <                create_directory( VanillaSounds.parent_path() );
299 <                create_directory( VanillaAnimations.remove_filename() );
300 <
301 <                for(int j = 0; j < GDFPaths.size(); j++) {
302 <                        logfile << "\tReimporting " << GDFPaths[j].filename() << ".oni\n";
303 <                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + ": reimporting " + GDFPaths[j].filename() );
304 <                        system((strOniSplit + " " + strImportOption + " " + GDFPaths[j].string() + " " + VanillaPaths[j].string()).c_str());
305 <                        parts_done++;
306 <                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
307 <                }
308 <                /*
309 <                printf(Step_x_x,"Step %d/%d: reimporting level0_Characters", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
310 <                system((strOniSplit + " " + strImportOption + " " + Characters.string() + " " + VanillaCharacters.string()).c_str());
311 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_Particles", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
312 <                system((strOniSplit + " " + strImportOption + " " + Particles.string() + " " + VanillaParticles.string()).c_str());
313 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_Textures", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
314 <                system((strOniSplit + " " + strImportOption + " " + Textures.string() + " " + VanillaTextures.string()).c_str());
315 <                //system((strOniSplit   + " " + strImportOption + (string)" " + Animations.string() + (string)" " + VanillaAnimations.string()).c_str());
316 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_TRAC", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
317 <                system((strOniSplit + " " + strImportOption + " " + TRAC.string() + " " + VanillaTRAC.string()).c_str());
318 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_Sounds", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
319 <                system((strOniSplit + " " + strImportOption + " " + Sounds.string() + " " + VanillaSounds.string()).c_str());
320 <                parts_done++; printf(Step_x_x,"Step %d/%d: reimporting level0_TRAM", parts_done,7 + 2 * num_levels); setStatusArea((string)Step_x_x);setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
321 <                system((strOniSplit + " " + strImportOption + " " + TRAM.string() + " " + VanillaTRAM.string()).c_str());
322 <                //parts_done++; setStatusArea((string)"Copying level scripts...");setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
323 <                if (exists("../GameDataFolder/IGMD")) remove_all("../GameDataFolder/IGMD");
324 <                */
325 <                create_directory((path)"../GameDataFolder/IGMD");
326 <                copy((path)"packages/VanillaBSL/IGMD", (path)"../GameDataFolder");
327 <                setProgressBar( 1000 );
328 <                
329 <                // CIP:last of all, set up the edition folder as a playable Oni installation by placing the latest application (+ Daodan DLL on Windows) in edition/
330 <                
331 <                // CIP:then copy persist.dat and keyconfig.txt into edition/ as well
332 <                
333 < #ifndef WIN32
334 <                /* On Mac only, set the current GDF to the AE GDF by writing to Oni's global preferences file (thankfully a standard OS X ".plist" XML file).
335 <                   If there are no Oni prefs (only possible if Oni has not been run even once), then the above line will fail silently, no harm done,
336 <                   and when the user does run Oni for the first time, using the copy of the app in the AE GDF, Oni will set the prefs to use that GDF at that point */
337 <                path fullAEpath = system_complete("."); // get full path for Installer
338 <                char prefsCommand[300] = "defaults write com.godgames.oni RetailInstallationPath -string '";
339 <                strcat(prefsCommand, fullAEpath.parent_path().parent_path().string().c_str()); // get path of edition/ folder (Oni wants the folder that *contains* the GDF)
340 <                strcat(prefsCommand, "'"); // path string is enclosed in single quotes to avoid the need to escape UNIX-unfriendly characters
341 <                system(prefsCommand);
342 <                
13 > #include <windows.h>
14 > #include <shobjidl.h>
15 > HWND Handle;
16 > ITaskbarList *pTaskbarList;
17 > ITaskbarList3 *pTaskbarList3;
18   #endif
344                
345                setStatusArea((string)"Done! Now select your mod packages and click install.");
346                //      while(1) Sleep(-1);
347
348        }
349        catch (exception ex) {
350                setStatusArea("Warning, handled exception: " + (string)ex.what());
351        }
352
353        ptime end_time(second_clock::local_time());
354        time_period total_time (start_time, end_time);
355        logfile << "\n\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
356        //total_time.length().hours();
357        logfile.close();
358        busy = 0;
359        return err;
360 }
361
19  
363 vector<ModPackage> getPackages(void)
364 {
365        vector<ModPackage> packages;
366        packages.reserve(65536); // come on, we shouldn't need this much space...right?!
367        fstream file;
368        string filename = "\0";
369        string MODINFO_CFG = "Mod_Info.cfg";
370
371        try
372        {
373                directory_iterator end_iter;
374                for (directory_iterator dir_itr("./packages"); dir_itr != end_iter; ++dir_itr)
375                {
376                        file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str());
377                        //cout << filename << "\n";
378
379                        if(!file.fail())
380                        {
381                                //cout << dir_itr->path().string() + MODINFO_CFG;
382                                //would prefer to push a pointer to a package, but this will do for now
383                                packages.push_back(fileToModPackage(file));
384                        }      
385                        file.close();
386                        file.clear();
387                }
388                sort(packages.begin(), packages.end());
389        }
390        catch (const std::exception & ex)
391        {
392                cout << "Warning, something odd happened!\n";
393        }
394
395        return packages;
396 }
397
398 ModPackage fileToModPackage(fstream &file)
399 {
400        /*
401        This converts a file to a ModPackage struct.
402
403        A few notes...
404        "iter" is the current word we are on. I should have named it "token" or something, but I don't have multiple iterators, so its ok.
405        I refer to (*iter) at the beginning of each if statement block. I could probably store it as a variable, but I'm pretty sure that dereferencing a pointer\iterator isn't much
406        slower than reading a variable.
407        */
408        ModPackage package;
409        string line;
410        static string NameOfMod = "NameOfMod";  //used for comparing to the current token...
411        //I could have done it in reverse (*iter).compare("ModString") or  
412        static string ARROW = "->";                             //did something like "ModString".compare(*iter), and it would have been
413        static string ModString = "ModString";  //functionably the same.
414        static string HasOnis = "HasOnis";
415        static string HasDeltas = "HasDeltas";
416        static string HasBSL = "HasBSL";
417        static string HasDats = "HasDats";
418        static string IsEngine = "IsEngine";
419        static string Readme = "Readme";
420        static string GlobalNeeded = "GlobalNeeded";
421        static string Category = "Category";
422        static string Creator = "Creator";
423        while (! file.eof() )
424        {
425                getline (file,line);
426                vector<string> tokens;
427                vector<string>::iterator iter;
428                tokenize(line, tokens);                                 //string to vector of "words"
429                if (tokens.capacity() >= 2) {                   //make sure they are using enough stuff
430                        iter = tokens.begin();                          //what word we are on, starts at first word
431                        /*
432                        if (!AEInstallVersion.compare(*iter))
433                        If mod is too old, skip this mod.
434                        */
435                        /*else*/if (!NameOfMod.compare(*iter))  {       //if it contains the name
436                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
437                                        if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) {                 //ignores "->" and "NameOfMod"
438                                                //cout << *iter;
439                                                //cout << " ";
440                                                package.name += *iter + " ";
441                                        }
442                                }
443
444                        }
445                        else if (!ModString.compare(*iter)) {
446                                iter++; iter++;
447                                package.modStringName = *iter;
448                                iter++;
449                                package.modStringVersion = atoi((*iter).c_str());
450                        }
451                        else if (!HasOnis.compare(*iter)) {
452                                iter++; iter++;  
453                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasOnis = 1; //Gotta love c++'s lack of a standard case-insensitive
454                                else if (!HasBSL.compare(*iter)) { // string comparer...I know my implementation here sucks. I need to change it to check each character one by one. At the moment,
455                                        iter++; iter++;}  // using "YFR" would probably set it off. :<
456
457                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasBSL = 1;
458                        }
459                        else if (!HasDeltas.compare(*iter)) {
460                                iter++; iter++;  
461                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDeltas = 1;
462                        }
463                        else if (!HasDats.compare(*iter)) {
464                                iter++; iter++;  
465                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDats = 1;
466                        }
467                        else if (!IsEngine.compare(*iter)) {
468                                iter++; iter++;  
469                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.isEngine = 1;
470                        }
471                        else if (!GlobalNeeded.compare(*iter)) {
472                                iter++; iter++;  
473                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.globalNeeded = 1;
474                                else if (toupper((*iter)[0]) + toupper((*iter)[1]) == 'N' + 'O') package.globalNeeded = 1; //Really the only place where checking for "No" is important atm.
475                        }
476                        else if (!Category.compare(*iter))  {  
477                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
478                                        if (ARROW.compare(*iter) && Category.compare(*iter)) {                  //ignores "->" and "Category"
479                                                //cout << *iter;
480                                                //cout << " ";
481                                                package.category += *iter + " ";
482                                        }
483                                }
484                        }
485                        else if (!Creator.compare(*iter))  {    //if it contains the name
486                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
487                                        if (ARROW.compare(*iter) && Creator.compare(*iter)) {                   //ignores "->" and "Category"
488                                                //cout << *iter;
489                                                //cout << " ";
490                                                package.creator += *iter + " ";
491                                        }
492                                }
493                        }
494                        else if (!Readme.compare(*iter))  {     //if it contains the name
495                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
496                                        if (ARROW.compare(*iter) && Readme.compare(*iter)) {                    //ignores "->" and "Category"
497                                                if(!(*iter).compare("\\n")) package.readme += '\n';
498                                                else package.readme += *iter + " ";
499                                        }
500                                }
501                        }
502                }
503
504        }
505        package.doOutput();
506        return package;
507 }
508
509 void recompileAll(vector<string> installedMods)
510 {
511        busy = 1;
512        using namespace boost::gregorian;
513        using namespace boost::posix_time;
514        using boost::lexical_cast;
515        using boost::bad_lexical_cast;
516        
517        setStatusArea("Importing levels...");
518        //setStatusArea("Recompiling Data...");
519        path vanilla_dir = "./packages/VanillaDats/";
520        string importCommand = "";
521        char statusString[128];
522        int numberOfDats = 0;
523        int j = 1;
524        string datString;
525        std::stringstream out;
526
527        ptime start_time(second_clock::local_time());
528        clearOldDats();
529        remove("Install.log");
530        ofstream logfile("Install.log");
531        logfile << "Mod Installation started " << to_simple_string(start_time) << endl;
532        logfile.close();
533        if(splitInstances == SPLIT){
534                recursive_directory_iterator end_iter;
535
536                for ( recursive_directory_iterator dir_itr( vanilla_dir );
537                        dir_itr != end_iter;
538                        ++dir_itr )
539                {
540                        try{
541                                if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
542                                {
543                                        numberOfDats++;
544                                }
545                        }
546                        catch(exception ex) {
547
548                        }
549                }
550
551                //recursive_directory_iterator end_iter;
552
553
554                out << numberOfDats;
555                datString = out.str();
556                try {
557                        for ( recursive_directory_iterator dir_itr( vanilla_dir );
558                                dir_itr != end_iter;
559                                ++dir_itr )
560                        {
561                                try
562                                {
563                                        if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
564                                        {
565                                                importCommand = strOniSplit + " " + strImportOption + " " + dir_itr->path().parent_path().string() + '/' + dir_itr->path().filename();
566                                                for (int i = 0; i < installedMods.size(); ++i) {
567                                                        if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename()  ))
568                                                                importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename();
569
570                                                        //else cout << " packages/VanillaDats/" + installedMods[i] + "/oni/";
571                                                }
572                                                importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
573
574                                                
575                                                setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
576                                                setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
577
578                                                system(importCommand.c_str());
579                                                //Sleep(1000);
580                                                //cout << importCommand << "\n";
581                                                j++;
582
583                                        }
584                                }
585                                catch ( const std::exception & ex )
586                                {
587
588                                        remove("Install.log");
589                                        ofstream logfile("Install.log");
590
591
592                                        logfile << "Warning, exception " << ex.what() << "!";
593                                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
594                                        logfile.close();        
595                                }
596                        }
597
598                }
599                catch( const std::exception & ex ) {
600
601                        remove("Install.log");
602                        ofstream logfile("Install.log");
603
604
605                        logfile << "Warning, exception " << ex.what() << "!";
606                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
607                        logfile.close();
608                }
609
610        }
611        else if(splitInstances == NOT_SPLIT){
612                directory_iterator end_iter;
613
614                for ( directory_iterator dir_itr( vanilla_dir );
615                        dir_itr != end_iter;
616                        ++dir_itr )
617                {
618
619                        if ( is_directory( dir_itr->status() ) )
620                        {
621                                numberOfDats++;
622                        }
623
624
625                }
626
627                out << numberOfDats;
628                datString = out.str();
629
630                for ( directory_iterator dir_itr( vanilla_dir );
631                        dir_itr != end_iter;
632                        ++dir_itr )
633                {
634                        try
635                        {
636                                if ( is_directory( dir_itr->status() ) )
637                                {
638                                        importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + dir_itr->path().filename() + " " + "../GameDataFolder/" + dir_itr->path().filename()
639                                                + ".dat";
640                                        for (int i = 0; i < installedMods.size(); ++i) {
641                                                if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename()  ))
642                                                        importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename();
643                                        }
644                                        importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
645
646
647                                        setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
648                                        setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
649
650                                        system(importCommand.c_str());
651
652                                        j++;
653                                }
654                        }
655                        catch ( const std::exception & ex )
656                        {
657
658                                remove("Install.log");
659                                ofstream logfile("Install.log");
660
661
662                                logfile << "Warning, exception " << ex.what() << "!";
663                                setStatusArea("Warning, exception " + (string)ex.what() + "!");
664                                logfile.close();
665                        }}
666        }
667        logfile << "Writing config file";
668        writeInstalledMods(installedMods);
669        setProgressBar(1000);
670        setStatusArea("Done! You can now play Oni.");
671
672        ptime end_time(second_clock::local_time());
673        time_period total_time (start_time, end_time);
674
675
676        ofstream logfile2("Install.log", ios::app | ios::ate);
677        string outstring = (string)"\n\nGlobalization ended " + to_simple_string(end_time) + "\nThe process took ";// + (string)total_time.length();
678
679        logfile2 << "\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
680
681        //logfile2.write(outstring.c_str(), outstring.length());
682        logfile2.close();
683
684        //total_time.length().hours();
685
686        Sleep(1000);
687        setProgressBar(0);
688        busy = 0;
689 }
690
691 void writeInstalledMods(vector<string> installedMods)
692 {
693
694        if ( exists( strInstallCfg ) )
695        {
696                remove( strInstallCfg );
697        }
698
699        ofstream file(strInstallCfg.c_str());
700
701        vector<string>list = installedMods;
702        vector<string>::iterator begin_iter = list.begin();
703        vector<string>::iterator end_iter = list.end();
704
705        sort( list.begin(), list.end() );
706
707        for( ; begin_iter != end_iter; ++begin_iter) {
708                file << *begin_iter << " ";
709        }
710
711        file.close();
712        file.clear();
713
714 }
715
716 vector<string> getInstallString(string Cfg)
717 {
718        //system(strPauseCmd);
719        vector<string> returnval;
720
721        string line;
722        fstream file;
723
724        if (exists( Cfg ))
725        {
726                file.open(Cfg.c_str());
727                getline(file, line);
728                tokenize(line, returnval);
729                file.close();
730                file.clear();
731                sort(returnval.begin(), returnval.end());
732        }
733        else cout << "fail";
734
735        return returnval;
736 }
737
738 //stolen token function...
739 void tokenize(const string& str, vector<string>& tokens, const string& delimiters)
740 {
741        // Skip delimiters at beginning.
742        string::size_type lastPos = str.find_first_not_of(delimiters, 0);
743        // Find first "non-delimiter".
744        string::size_type pos     = str.find_first_of(delimiters, lastPos);
745
746        while (string::npos != pos || string::npos != lastPos)
747        {
748                // Found a token, add it to the vector.
749                tokens.push_back(str.substr(lastPos, pos - lastPos));
750                // Skip delimiters.  Note the "not_of"
751                lastPos = str.find_first_not_of(delimiters, pos);
752                // Find next "non-delimiter"
753                pos = str.find_first_of(delimiters, lastPos);
754        }
755 }
756
757 void clearOldDats(void) {
758        directory_iterator end_iter_gdf;
759        for ( directory_iterator dir_itr_gdf( "../GameDataFolder" );
760                dir_itr_gdf != end_iter_gdf;
761                ++dir_itr_gdf )
762        {
763                //cout << dir_itr_gdf->path().extension() << "\n";
764                if ( dir_itr_gdf->path().extension() == ".dat" || dir_itr_gdf->path().extension() == ".raw" || dir_itr_gdf->path().extension() == ".sep" ) {
765                        remove( dir_itr_gdf->path() );
766                }
767
768        }
769
770 }
771
772 vector<string> globalInstalledMods;
773 vector<ModPackage> globalPackages;
774 #include "boost/thread.hpp"
20   #include <boost/thread/mutex.hpp>
776
777 /////////////////////////////////////////////////////////////////////////////
778 // Name:        main_window.cpp
779 // Purpose:    
780 // Author:      
781 // Modified by:
782 // Created:     07/05/2009 20:38:25
783 // RCS-ID:      
784 // Copyright:  
785 // Licence:    
786 /////////////////////////////////////////////////////////////////////////////
787
21   // For compilers that support precompilation, includes "wx/wx.h".
22   #include "wx/wxprec.h"
23  
# Line 797 | Line 30 | vector<ModPackage> globalPackages;
30   #endif
31  
32   ////@begin includes
33 < #include "about_window.h"
801 < ////@end includes
802 <
33 > #include "about.h"
34   #include "main_window.h"
35 + #include "installer.h"
36 + ////@end includes
37  
38   ////@begin XPM images
39 < #include "redo.xpm"
39 > #include "aelogosmall.xpm"
40 > #include "undo.xpm"
41   #include "fileopen.xpm"
42   #include "filesaveas.xpm"
43   #include "quit.xpm"
44   ////@end XPM images
45  
46 < //#define wxDebug 1;
47 < //#define wxUSE_UNICODE 1;
46 > bool busy = false;
47 > vector<string> globalInstalledMods;
48 > vector<ModPackage> globalPackages;
49 > // Variable declarations
50 > #ifdef WIN32
51 > bool splitInstances = true;
52 > string strImportOption = "-import:nosep";
53 > string strOniSplit = "Onisplit.exe";
54 > #else
55 > bool splitInstances = false;
56 > string strImportOption = "-import:sep";
57 > string strOniSplit = "mono Onisplit.exe";
58 > #endif
59  
60   /*
61   * MainWindow type definition
# Line 826 | Line 71 | IMPLEMENT_CLASS( MainWindow, wxFrame )
71   BEGIN_EVENT_TABLE( MainWindow, wxFrame )
72  
73   ////@begin MainWindow event table entries
74 < EVT_CHECKBOX( SelectAll_Checkbox, MainWindow::OnSelectAllCheckboxClick )
74 >    EVT_CHECKBOX( SelectAll_Checkbox, MainWindow::OnSelectAllCheckboxClick )
75  
76 < EVT_BUTTON( Refresh_Button, MainWindow::OnRefreshButtonClick )
76 >    EVT_BUTTON( Refresh_Button, MainWindow::OnRefreshButtonClick )
77  
78 < EVT_LISTBOX( Mods_CheckboxList1, MainWindow::OnModsCheckboxList1Selected )
79 < EVT_CHECKLISTBOX( Mods_CheckboxList1, MainWindow::OnModsCheckboxList1Toggled )
78 >    EVT_LISTBOX( Mods_CheckboxList1, MainWindow::OnModsCheckboxList1Selected )
79 >    EVT_CHECKLISTBOX( Mods_CheckboxList1, MainWindow::OnModsCheckboxList1Toggled )
80  
81 < EVT_UPDATE_UI( ID_STATUSBAR, MainWindow::OnStatusbarUpdate )
81 >    EVT_UPDATE_UI( ID_STATUSBAR, MainWindow::OnStatusbarUpdate )
82  
83 < EVT_BUTTON( Install_Button, MainWindow::OnInstallButtonClick )
83 >    EVT_BUTTON( Install_Button, MainWindow::OnInstallButtonClick )
84  
85 < EVT_RADIOBUTTON( Sep_RadioButton, MainWindow::OnSepRadioButtonSelected )
85 >    EVT_RADIOBUTTON( Sep_RadioButton, MainWindow::OnSepRadioButtonSelected )
86  
87 < EVT_RADIOBUTTON( NoSep_RadioButton, MainWindow::OnNoSepRadioButtonSelected )
87 >    EVT_RADIOBUTTON( NoSep_RadioButton, MainWindow::OnNoSepRadioButtonSelected )
88  
89 < EVT_RADIOBUTTON( Separated_RadioButton, MainWindow::OnSeparatedRadioButtonSelected )
89 >    EVT_RADIOBUTTON( Seperated_RadioButton, MainWindow::OnSeperatedRadioButtonSelected )
90  
91 < EVT_RADIOBUTTON( Complete_RadioButton, MainWindow::OnCompleteRadioButtonSelected )
91 >    EVT_RADIOBUTTON( Complete_RadioButton, MainWindow::OnCompleteRadioButtonSelected )
92  
93 < EVT_BUTTON( ReGlobalize_Button, MainWindow::OnReGlobalizeButtonClick )
93 >    EVT_BUTTON( ReGlobalize_Button, MainWindow::OnReGlobalizeButtonClick )
94  
95 < EVT_MENU( wxID_LOAD, MainWindow::OnLoadClick )
95 >    EVT_MENU( wxID_LOAD, MainWindow::OnLoadClick )
96  
97 < EVT_MENU( wxID_SAVE, MainWindow::OnSaveClick )
97 >    EVT_MENU( wxID_SAVE, MainWindow::OnSaveClick )
98  
99 < EVT_MENU( wxID_EXIT, MainWindow::OnExitClick )
99 >    EVT_MENU( wxID_EXIT, MainWindow::OnExitClick )
100  
101 < EVT_MENU( wxID_OPTIONS, MainWindow::OnOptionsClick )
101 >    EVT_MENU( wxID_OPTIONS, MainWindow::OnOptionsClick )
102  
103 < EVT_MENU( wxID_ABOUT, MainWindow::OnAboutClick )
103 >    EVT_MENU( wxID_ABOUT, MainWindow::OnAboutClick )
104  
105   ////@end MainWindow event table entries
106  
# Line 885 | Line 130 | MainWindow::MainWindow( wxWindow* parent
130   bool MainWindow::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
131   {
132          ////@begin MainWindow creation
133 <        wxFrame::Create( parent, id, caption, pos, size, style );
889 <
890 <        CreateControls();
891 <        SetIcon(GetIconResource(wxT("oni_special.ico")));
892 <        Centre();
893 <
133 >    wxFrame::Create( parent, id, caption, pos, size, style );
134  
135 +    CreateControls();
136 +    SetIcon(GetIconResource(wxT("aelogosmall.png")));
137 +    Centre();
138          ////@end MainWindow creation
139          return true;
140   }
141  
899
142   /*
143   * MainWindow destructor
144   */
# Line 907 | Line 149 | MainWindow::~MainWindow()
149          ////@end MainWindow destruction
150   }
151  
910
152   /*
153   * Member initialisation
154   */
# Line 915 | Line 156 | MainWindow::~MainWindow()
156   void MainWindow::Init()
157   {
158          ////@begin MainWindow member initialisation
159 <        MainSplitter = NULL;
160 <        SelectAll = NULL;
161 <        RefreshButton = NULL;
162 <        Mods_CheckboxList = NULL;
163 <        titleText = NULL;
164 <        creatorText = NULL;
165 <        descriptionText = NULL;
166 <        StatusArea = NULL;
167 <        ProgressBar = NULL;
168 <        InstallButton = NULL;
169 <        OptionsPanel = NULL;
170 <        SepRadio = NULL;
171 <        NoSepRadio = NULL;
172 <        SeparatedRadio = NULL;
173 <        CompleteRadio = NULL;
174 <        ReglobalizeButton = NULL;
159 >    MainSplitter = NULL;
160 >    SelectAll = NULL;
161 >    RefreshButton = NULL;
162 >    Mods_CheckboxList = NULL;
163 >    titleText = NULL;
164 >    creatorText = NULL;
165 >    descriptionText = NULL;
166 >    StatusArea = NULL;
167 >    ProgressBar = NULL;
168 >    InstallButton = NULL;
169 >    OptionsPanel = NULL;
170 >    SepRadio = NULL;
171 >    NoSepRadio = NULL;
172 >    SeperatedRadio = NULL;
173 >    CompleteRadio = NULL;
174 >    ReglobalizeButton = NULL;
175          ////@end MainWindow member initialisation
935
176   }
177  
938
178   /*
179   * Control creation for MainWindow
180   */
# Line 945 | Line 184 | wxGauge* TheProgressBar;
184   void MainWindow::CreateControls()
185   {    
186          ////@begin MainWindow content construction
187 <        // Generated by DialogBlocks, 31/05/2009 19:03:55 (unregistered)
949 <
950 <        MainWindow* itemFrame1 = this;
187 >    MainWindow* itemFrame1 = this;
188  
189 <        wxMenuBar* menuBar = new wxMenuBar;
190 <        wxMenu* itemMenu37 = new wxMenu;
191 <        {
192 <                wxMenuItem* menuItem = new wxMenuItem(itemMenu37, wxID_LOAD, _("&Load Configuration..."), wxEmptyString, wxITEM_NORMAL);
193 <                wxBitmap bitmap(itemFrame1->GetBitmapResource(wxT("fileopen.xpm")));
194 <                menuItem->SetBitmap(bitmap);
195 <                itemMenu37->Append(menuItem);
196 <        }
197 <        {
198 <                wxMenuItem* menuItem = new wxMenuItem(itemMenu37, wxID_SAVE, _("&Save Configuration..."), wxEmptyString, wxITEM_NORMAL);
199 <                wxBitmap bitmap(itemFrame1->GetBitmapResource(wxT("filesaveas.xpm")));
200 <                menuItem->SetBitmap(bitmap);
201 <                itemMenu37->Append(menuItem);
202 <        }
203 <        itemMenu37->AppendSeparator();
204 <        {
205 <                wxMenuItem* menuItem = new wxMenuItem(itemMenu37, wxID_EXIT, _("Exit"), wxEmptyString, wxITEM_NORMAL);
206 <                wxBitmap bitmap(itemFrame1->GetBitmapResource(wxT("quit.xpm")));
207 <                menuItem->SetBitmap(bitmap);
208 <                itemMenu37->Append(menuItem);
209 <        }
210 <        menuBar->Append(itemMenu37, _("&File"));
211 <        wxMenu* itemMenu42 = new wxMenu;
212 <        itemMenu42->Append(wxID_OPTIONS, _("Show Advanced Options..."), wxEmptyString, wxITEM_CHECK);
213 <        menuBar->Append(itemMenu42, _("Options"));
214 <        wxMenu* itemMenu44 = new wxMenu;
978 <        itemMenu44->Append(wxID_HELP, _("Help"), wxEmptyString, wxITEM_NORMAL);
189 >    wxMenuBar* menuBar = new wxMenuBar;
190 >    wxMenu* itemMenu37 = new wxMenu;
191 >    {
192 >        wxMenuItem* menuItem = new wxMenuItem(itemMenu37, wxID_LOAD, _("&Load Configuration..."), wxEmptyString, wxITEM_NORMAL);
193 >        wxBitmap bitmap(itemFrame1->GetBitmapResource(wxT("fileopen.xpm")));
194 >        menuItem->SetBitmap(bitmap);
195 >        itemMenu37->Append(menuItem);
196 >    }
197 >    {
198 >        wxMenuItem* menuItem = new wxMenuItem(itemMenu37, wxID_SAVE, _("&Save Configuration..."), wxEmptyString, wxITEM_NORMAL);
199 >        wxBitmap bitmap(itemFrame1->GetBitmapResource(wxT("filesaveas.xpm")));
200 >        menuItem->SetBitmap(bitmap);
201 >        itemMenu37->Append(menuItem);
202 >    }
203 >    itemMenu37->AppendSeparator();
204 >    {
205 >        wxMenuItem* menuItem = new wxMenuItem(itemMenu37, wxID_EXIT, _("Exit"), wxEmptyString, wxITEM_NORMAL);
206 >        wxBitmap bitmap(itemFrame1->GetBitmapResource(wxT("quit.xpm")));
207 >        menuItem->SetBitmap(bitmap);
208 >        itemMenu37->Append(menuItem);
209 >    }
210 >    menuBar->Append(itemMenu37, _("&File"));
211 >    wxMenu* itemMenu42 = new wxMenu;
212 >    itemMenu42->Append(wxID_OPTIONS, _("Show Advanced Options..."), wxEmptyString, wxITEM_CHECK);
213 >    menuBar->Append(itemMenu42, _("Options"));
214 > #ifdef WIN32
215          itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
216          menuBar->Append(itemMenu44, _("Help"));
217 <        itemFrame1->SetMenuBar(menuBar);
218 <        
219 <        wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
984 <        itemFrame1->SetSizer(itemBoxSizer2);
217 > #else
218 >        itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
219 > #endif  
220  
221 <        MainSplitter = new wxSplitterWindow( itemFrame1, ID_SPLITTERWINDOW, wxDefaultPosition, wxSize(100, 100), wxSP_LIVE_UPDATE|wxNO_BORDER );
987 <        MainSplitter->SetMinimumPaneSize(150);
988 <        MainSplitter->SetName(_T("MainSplitter"));
989 <
990 <        wxPanel* itemPanel4 = new wxPanel( MainSplitter, ID_PANEL, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
991 <        wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL);
992 <        itemPanel4->SetSizer(itemBoxSizer5);
993 <
994 <        wxBoxSizer* itemBoxSizer6 = new wxBoxSizer(wxHORIZONTAL);
995 <        itemBoxSizer5->Add(itemBoxSizer6, 0, wxGROW|wxALL, 0);
996 <        SelectAll = new wxCheckBox( itemPanel4, SelectAll_Checkbox, _("Select All/None"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
997 <        SelectAll->SetValue(false);
998 <        SelectAll->SetName(_T("SelectAll_Checkbox"));
999 <        itemBoxSizer6->Add(SelectAll, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
1000 <
1001 <        RefreshButton = new wxBitmapButton( itemPanel4, Refresh_Button, itemFrame1->GetBitmapResource(wxT("redo.xpm")), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
1002 <        RefreshButton->SetName(_T("RefreshButton"));
1003 <        itemBoxSizer6->Add(RefreshButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxTOP|wxBOTTOM, 5);
1004 <
1005 <        wxArrayString Mods_CheckboxListStrings;
1006 <        Mods_CheckboxList = new wxCheckListBox( itemPanel4, Mods_CheckboxList1, wxDefaultPosition, wxDefaultSize, Mods_CheckboxListStrings, wxLB_HSCROLL );
1007 <        Mods_CheckboxList->SetName(_T("Mods_CheckboxList"));
1008 <        itemBoxSizer5->Add(Mods_CheckboxList, 1, wxGROW|wxALL, 0);
1009 <
1010 <        wxPanel* itemPanel10 = new wxPanel( MainSplitter, DescriptionHolder_Panel, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
1011 <        itemPanel10->SetName(_T("DescriptionHolder_Panel"));
1012 <        wxBoxSizer* itemBoxSizer11 = new wxBoxSizer(wxVERTICAL);
1013 <        itemPanel10->SetSizer(itemBoxSizer11);
1014 <
1015 <        wxBoxSizer* itemBoxSizer12 = new wxBoxSizer(wxHORIZONTAL);
1016 <        itemBoxSizer11->Add(itemBoxSizer12, 0, wxGROW|wxALL, 0);
1017 <        wxBoxSizer* itemBoxSizer13 = new wxBoxSizer(wxVERTICAL);
1018 <        itemBoxSizer12->Add(itemBoxSizer13, 1, wxALIGN_CENTER_VERTICAL|wxALL, 0);
1019 <        titleText = new wxTextCtrl( itemPanel10, Title_Text, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
1020 <        titleText->SetName(_T("Title_Text"));
1021 <        titleText->SetBackgroundColour(wxColour(240, 240, 240));
1022 <        itemBoxSizer13->Add(titleText, 1, wxGROW|wxLEFT, 5);
1023 <
1024 <        wxBoxSizer* itemBoxSizer15 = new wxBoxSizer(wxVERTICAL);
1025 <        itemBoxSizer12->Add(itemBoxSizer15, 1, wxGROW|wxALL, 0);
1026 <        creatorText = new wxTextCtrl( itemPanel10, Author_Text, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_RIGHT );
1027 <        creatorText->SetName(_T("Author_Text"));
1028 <        creatorText->SetBackgroundColour(wxColour(240, 240, 240));
1029 <        itemBoxSizer15->Add(creatorText, 1, wxGROW|wxRIGHT, 5);
1030 <
1031 <        wxStaticLine* itemStaticLine17 = new wxStaticLine( itemPanel10, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
1032 <        itemStaticLine17->Show(false);
1033 <        itemBoxSizer11->Add(itemStaticLine17, 0, wxGROW|wxALL, 5);
1034 <
1035 <        descriptionText = new wxTextCtrl( itemPanel10, Description_Text, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxTE_RICH|wxTE_AUTO_URL );
1036 <        descriptionText->SetName(_T("DescriptionName"));
1037 <        descriptionText->SetBackgroundColour(wxColour(240, 240, 240));
1038 <        itemBoxSizer11->Add(descriptionText, 1, wxGROW|wxLEFT|wxRIGHT, 5);
1039 <
1040 <        MainSplitter->SplitVertically(itemPanel4, itemPanel10, 150);
1041 <        itemBoxSizer2->Add(MainSplitter, 1, wxGROW|wxALL, 0);
1042 <
1043 <        StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 );
1044 <        StatusArea->SetName(_T("StatusArea"));
1045 <        StatusArea->SetFieldsCount(1);
1046 <        StatusArea->SetStatusText(_("Status Area"), 0);
1047 <        itemBoxSizer2->Add(StatusArea, 0, wxGROW|wxALL, 0);
1048 <
1049 <        wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxHORIZONTAL);
1050 <        itemBoxSizer2->Add(itemBoxSizer20, 0, wxGROW|wxALL, 0);
1051 <
1052 <        ProgressBar = new wxGauge( itemFrame1, ProgressBar_Gauge, 1000, wxDefaultPosition, wxSize(-1, 30), wxGA_SMOOTH );
1053 <        ProgressBar->SetValue(0);
1054 <        itemBoxSizer20->Add(ProgressBar, 1, wxGROW|wxALL, 0);
1055 <
1056 <        InstallButton = new wxButton( itemFrame1, Install_Button, _("Install!"), wxDefaultPosition, wxSize(-1, 30), 0 );
1057 <        itemBoxSizer20->Add(InstallButton, 0, wxGROW|wxALL, 0);
1058 <
1059 <        wxBoxSizer* itemBoxSizer23 = new wxBoxSizer(wxVERTICAL);
1060 <        itemBoxSizer2->Add(itemBoxSizer23, 0, wxGROW|wxALL, 0);
1061 <
1062 <        OptionsPanel = new wxPanel( itemFrame1, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
1063 <        itemBoxSizer2->Add(OptionsPanel, 0, wxGROW, 0);
1064 <
1065 <        wxBoxSizer* itemBoxSizer25 = new wxBoxSizer(wxHORIZONTAL);
1066 <        OptionsPanel->SetSizer(itemBoxSizer25);
1067 <
1068 <        wxBoxSizer* itemBoxSizer26 = new wxBoxSizer(wxVERTICAL);
1069 <        itemBoxSizer25->Add(itemBoxSizer26, 0, wxGROW|wxALL, 5);
1070 <
1071 <        SepRadio = new wxRadioButton( OptionsPanel, Sep_RadioButton, _("Sep"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
1072 <        SepRadio->SetValue(false);
1073 <        if (MainWindow::ShowToolTips())
1074 <                SepRadio->SetToolTip(_("For PC Demo and Mac"));
1075 <        itemBoxSizer26->Add(SepRadio, 0, wxALIGN_LEFT|wxALL, 5);
1076 <
1077 <        NoSepRadio = new wxRadioButton( OptionsPanel, NoSep_RadioButton, _("NoSep"), wxDefaultPosition, wxDefaultSize, 0 );
1078 <        NoSepRadio->SetValue(false);
1079 <        if (MainWindow::ShowToolTips())
1080 <                NoSepRadio->SetToolTip(_("For PC Retail"));
1081 <        itemBoxSizer26->Add(NoSepRadio, 0, wxALIGN_LEFT|wxALL, 5);
1082 <
1083 <        wxStaticLine* itemStaticLine29 = new wxStaticLine( OptionsPanel, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
1084 <        itemBoxSizer25->Add(itemStaticLine29, 0, wxGROW|wxALL, 5);
1085 <
1086 <        wxBoxSizer* itemBoxSizer30 = new wxBoxSizer(wxVERTICAL);
1087 <        itemBoxSizer25->Add(itemBoxSizer30, 0, wxGROW|wxALL, 5);
1088 <
1089 <        SeparatedRadio = new wxRadioButton( OptionsPanel, Separated_RadioButton, _("Separated Level0"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
1090 <        SeparatedRadio->SetValue(false);
1091 <        SeparatedRadio->SetName(_T("Separated_RadioButton"));
1092 <        itemBoxSizer30->Add(SeparatedRadio, 0, wxALIGN_LEFT|wxALL, 5);
1093 <
1094 <        CompleteRadio = new wxRadioButton( OptionsPanel, Complete_RadioButton, _("Complete Level0"), wxDefaultPosition, wxDefaultSize, 0 );
1095 <        CompleteRadio->SetValue(false);
1096 <        CompleteRadio->SetName(_T("Complete_RadioButton"));
1097 <        itemBoxSizer30->Add(CompleteRadio, 0, wxALIGN_LEFT|wxALL, 5);
1098 <
1099 <        wxStaticLine* itemStaticLine33 = new wxStaticLine( OptionsPanel, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
1100 <        itemBoxSizer25->Add(itemStaticLine33, 0, wxGROW|wxALL, 5);
1101 <
1102 <        wxBoxSizer* itemBoxSizer34 = new wxBoxSizer(wxVERTICAL);
1103 <        itemBoxSizer25->Add(itemBoxSizer34, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
1104 <
1105 <        ReglobalizeButton = new wxButton( OptionsPanel, ReGlobalize_Button, _("Reglobalize"), wxDefaultPosition, wxDefaultSize, 0 );
1106 <        ReglobalizeButton->SetName(_T("Reglobalize_Button"));
1107 <        itemBoxSizer34->Add(ReglobalizeButton, 0, wxGROW|wxALL, 5);
221 >    itemFrame1->SetMenuBar(menuBar);
222  
223 <        // Connect events and objects
224 <        Mods_CheckboxList->Connect(Mods_CheckboxList1, wxEVT_CREATE, wxWindowCreateEventHandler(MainWindow::ModList_OnCreate), NULL, this);
1111 <        ////@end MainWindow content construction
223 >    wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
224 >    itemFrame1->SetSizer(itemBoxSizer2);
225  
226 <        if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) {
227 <                static_cast<string>("-import:sep");
228 <                splitInstances = NOT_SPLIT;
229 <        }
230 <        else {
231 <                static_cast<string>("-import:nosep");
232 <                splitInstances = SPLIT;
233 <        }
226 >    MainSplitter = new wxSplitterWindow( itemFrame1, ID_SPLITTERWINDOW, wxDefaultPosition, wxSize(100, 100), wxSP_LIVE_UPDATE|wxNO_BORDER );
227 >    MainSplitter->SetMinimumPaneSize(1);
228 >    MainSplitter->SetName(_T("MainSplitter"));
229 >
230 >    wxPanel* itemPanel4 = new wxPanel( MainSplitter, ID_PANEL, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
231 >    wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL);
232 >    itemPanel4->SetSizer(itemBoxSizer5);
233 >
234 >    wxBoxSizer* itemBoxSizer6 = new wxBoxSizer(wxHORIZONTAL);
235 >    itemBoxSizer5->Add(itemBoxSizer6, 0, wxGROW|wxALL, 0);
236 >    SelectAll = new wxCheckBox( itemPanel4, SelectAll_Checkbox, _("Select All/None"), wxDefaultPosition, wxDefaultSize, wxCHK_3STATE );
237 >    SelectAll->SetValue(false);
238 >    SelectAll->SetName(_T("SelectAll_Checkbox"));
239 >    itemBoxSizer6->Add(SelectAll, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
240 >
241 >    RefreshButton = new wxBitmapButton( itemPanel4, Refresh_Button, itemFrame1->GetBitmapResource(wxT("undo.xpm")), wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW );
242 >    RefreshButton->SetName(_T("RefreshButton"));
243 >    itemBoxSizer6->Add(RefreshButton, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxTOP|wxBOTTOM, 5);
244 >
245 >    wxArrayString Mods_CheckboxListStrings;
246 >    Mods_CheckboxList = new wxCheckListBox( itemPanel4, Mods_CheckboxList1, wxDefaultPosition, wxDefaultSize, Mods_CheckboxListStrings, wxLB_HSCROLL );
247 >    Mods_CheckboxList->SetName(_T("Mods_CheckboxList"));
248 >    itemBoxSizer5->Add(Mods_CheckboxList, 1, wxGROW|wxALL, 0);
249 >
250 >    wxPanel* itemPanel10 = new wxPanel( MainSplitter, DescriptionHolder_Panel, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
251 >    itemPanel10->SetName(_T("DescriptionHolder_Panel"));
252 >    wxBoxSizer* itemBoxSizer11 = new wxBoxSizer(wxVERTICAL);
253 >    itemPanel10->SetSizer(itemBoxSizer11);
254 >
255 >    wxBoxSizer* itemBoxSizer12 = new wxBoxSizer(wxHORIZONTAL);
256 >    itemBoxSizer11->Add(itemBoxSizer12, 0, wxGROW|wxALL, 0);
257 >    wxBoxSizer* itemBoxSizer13 = new wxBoxSizer(wxVERTICAL);
258 >    itemBoxSizer12->Add(itemBoxSizer13, 1, wxALIGN_CENTER_VERTICAL|wxALL, 0);
259 >    titleText = new wxTextCtrl( itemPanel10, Title_Text, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY );
260 >    titleText->SetName(_T("Title_Text"));
261 >    titleText->SetBackgroundColour(wxColour(240, 240, 240));
262 >    itemBoxSizer13->Add(titleText, 1, wxGROW|wxLEFT, 5);
263 >
264 >    wxBoxSizer* itemBoxSizer15 = new wxBoxSizer(wxVERTICAL);
265 >    itemBoxSizer12->Add(itemBoxSizer15, 1, wxGROW|wxALL, 0);
266 >    creatorText = new wxTextCtrl( itemPanel10, Author_Text, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_RIGHT );
267 >    creatorText->SetName(_T("Author_Text"));
268 >    creatorText->SetBackgroundColour(wxColour(240, 240, 240));
269 >    itemBoxSizer15->Add(creatorText, 1, wxGROW|wxRIGHT, 5);
270 >
271 >    wxStaticLine* itemStaticLine17 = new wxStaticLine( itemPanel10, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
272 >    itemStaticLine17->Show(false);
273 >    itemBoxSizer11->Add(itemStaticLine17, 0, wxGROW|wxALL, 5);
274 >
275 >    descriptionText = new wxTextCtrl( itemPanel10, Description_Text, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxTE_RICH|wxTE_RICH2 );
276 >    descriptionText->SetName(_T("DescriptionName"));
277 >    descriptionText->SetBackgroundColour(wxColour(240, 240, 240));
278 >    itemBoxSizer11->Add(descriptionText, 1, wxGROW|wxLEFT|wxRIGHT, 5);
279 >
280 >    MainSplitter->SplitVertically(itemPanel4, itemPanel10, 200);
281 >    itemBoxSizer2->Add(MainSplitter, 1, wxGROW|wxALL, 0);
282 >
283 >    StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 );
284 >    StatusArea->SetName(_T("StatusArea"));
285 >    StatusArea->SetFieldsCount(1);
286 >        string versionText = "AE Installer v" + (string)INSTALLER_VERSION;
287 >    StatusArea->SetStatusText(versionText.c_str(), 0);
288 >    itemBoxSizer2->Add(StatusArea, 0, wxGROW|wxALL, 0);
289 >
290 >    wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxHORIZONTAL);
291 >    itemBoxSizer2->Add(itemBoxSizer20, 0, wxGROW|wxALL, 0);
292 >
293 >    ProgressBar = new wxGauge( itemFrame1, ProgressBar_Gauge, 1000, wxDefaultPosition, wxDefaultSize, wxGA_SMOOTH );
294 >    ProgressBar->SetValue(0);
295 >    itemBoxSizer20->Add(ProgressBar, 1, wxGROW|wxALL, 0);
296 >
297 >    InstallButton = new wxButton( itemFrame1, Install_Button, _("Install!"), wxDefaultPosition, wxDefaultSize, 0 );
298 >    itemBoxSizer20->Add(InstallButton, 0, wxGROW|wxALL, 0);
299 >
300 >    wxBoxSizer* itemBoxSizer23 = new wxBoxSizer(wxVERTICAL);
301 >    itemBoxSizer2->Add(itemBoxSizer23, 0, wxGROW|wxALL, 0);
302 >
303 >    OptionsPanel = new wxPanel( itemFrame1, ID_PANEL1, wxDefaultPosition, wxDefaultSize, wxSUNKEN_BORDER|wxTAB_TRAVERSAL );
304 >    itemBoxSizer2->Add(OptionsPanel, 0, wxGROW, 0);
305 >
306 >    wxBoxSizer* itemBoxSizer25 = new wxBoxSizer(wxHORIZONTAL);
307 >    OptionsPanel->SetSizer(itemBoxSizer25);
308 >
309 >    wxBoxSizer* itemBoxSizer26 = new wxBoxSizer(wxVERTICAL);
310 >    itemBoxSizer25->Add(itemBoxSizer26, 0, wxGROW|wxALL, 5);
311 >
312 >    SepRadio = new wxRadioButton( OptionsPanel, Sep_RadioButton, _("Sep"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
313 >    SepRadio->SetValue(false);
314 >    if (MainWindow::ShowToolTips())
315 >        SepRadio->SetToolTip(_("For PC Demo and Mac"));
316 >    itemBoxSizer26->Add(SepRadio, 0, wxALIGN_LEFT|wxALL, 5);
317 >
318 >    NoSepRadio = new wxRadioButton( OptionsPanel, NoSep_RadioButton, _("NoSep"), wxDefaultPosition, wxDefaultSize, 0 );
319 >    NoSepRadio->SetValue(false);
320 >    if (MainWindow::ShowToolTips())
321 >        NoSepRadio->SetToolTip(_("For PC Retail"));
322 >    itemBoxSizer26->Add(NoSepRadio, 0, wxALIGN_LEFT|wxALL, 5);
323 >
324 >    wxStaticLine* itemStaticLine29 = new wxStaticLine( OptionsPanel, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
325 >    itemBoxSizer25->Add(itemStaticLine29, 0, wxGROW|wxALL, 5);
326 >
327 >    wxBoxSizer* itemBoxSizer30 = new wxBoxSizer(wxVERTICAL);
328 >    itemBoxSizer25->Add(itemBoxSizer30, 0, wxGROW|wxALL, 5);
329 >
330 >    SeperatedRadio = new wxRadioButton( OptionsPanel, Seperated_RadioButton, _("Separated Level0"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP );
331 >    SeperatedRadio->SetValue(false);
332 >    SeperatedRadio->SetName(_T("Seperated_RadioButton"));
333 >    itemBoxSizer30->Add(SeperatedRadio, 0, wxALIGN_LEFT|wxALL, 5);
334 >
335 >    CompleteRadio = new wxRadioButton( OptionsPanel, Complete_RadioButton, _("Complete Level0"), wxDefaultPosition, wxDefaultSize, 0 );
336 >    CompleteRadio->SetValue(false);
337 >    CompleteRadio->SetName(_T("Complete_RadioButton"));
338 >    itemBoxSizer30->Add(CompleteRadio, 0, wxALIGN_LEFT|wxALL, 5);
339 >
340 >    wxStaticLine* itemStaticLine33 = new wxStaticLine( OptionsPanel, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
341 >    itemBoxSizer25->Add(itemStaticLine33, 0, wxGROW|wxALL, 5);
342 >
343 >    wxBoxSizer* itemBoxSizer34 = new wxBoxSizer(wxVERTICAL);
344 >    itemBoxSizer25->Add(itemBoxSizer34, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
345 >
346 >    ReglobalizeButton = new wxButton( OptionsPanel, ReGlobalize_Button, _("Reglobalize"), wxDefaultPosition, wxDefaultSize, 0 );
347 >    ReglobalizeButton->SetName(_T("Reglobalize_Button"));
348 >    itemBoxSizer34->Add(ReglobalizeButton, 0, wxGROW|wxALL, 5);
349  
350 +    // Connect events and objects
351 +    Mods_CheckboxList->Connect(Mods_CheckboxList1, wxEVT_CREATE, wxWindowCreateEventHandler(MainWindow::ModList_OnCreate), NULL, this);
352 +        ////@end MainWindow content construction
353 + #ifdef WIN32
354 +        Handle = (HWND)GetHWND();
355 +        ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
356 + #endif
357 +        
358          globalPackages = getPackages();
359          globalInstalledMods = getInstallString();
360 <        for (int i = 0; i < globalPackages.size(); i++) {
360 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
361                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
362                  if( binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
363          }
# Line 1130 | Line 366 | void MainWindow::CreateControls()
366          TheInstallButton = InstallButton;
367          TheProgressBar = ProgressBar;
368          OptionsPanel->Hide();
369 <        if(splitInstances == SPLIT) SeparatedRadio->SetValue(true);
369 >        
370 >        if(splitInstances) SeperatedRadio->SetValue(true);
371          else CompleteRadio->SetValue(true);
1135
1136
1137
372          if(strImportOption == "-import:nosep") NoSepRadio->SetValue(true);
373          else SepRadio->SetValue(true);
374  
1141
375   #ifdef WIN32
376          RedirectIOToConsole();
377          HWND hWnd = GetConsoleWindow();
378          ShowWindow( hWnd, SW_HIDE );
379   #endif
1147
1148        //MainWindow::SetSize(MainWindow::GetRect().GetWidth(), MainWindow::GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight() );
380   }
381  
1151
382   /*
383   * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for SelectAll_Checkbox
384   */
# Line 1157 | Line 387 | void MainWindow::OnSelectAllCheckboxClic
387   {
388          switch(SelectAll->Get3StateValue()) {
389          case wxCHK_UNCHECKED:
390 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1161 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
390 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
391                  break;
392          case wxCHK_CHECKED:
393 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
1165 <                //SelectAll->Set3StateValue(wxCHK_UNCHECKED);
393 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
394                  break;
395          case wxCHK_UNDETERMINED:
396 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1169 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
396 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
397                  break;
1171
398          }
1173
399   }
400  
1176
401   /*
402   * wxEVT_CREATE event handler for Mods_CheckboxList
403   */
# Line 1181 | Line 405 | void MainWindow::OnSelectAllCheckboxClic
405   void MainWindow::ModList_OnCreate( wxWindowCreateEvent& event )
406   {
407  
1184
408   }
409  
410  
# Line 1202 | Line 425 | wxBitmap MainWindow::GetBitmapResource(
425   {
426          // Bitmap retrieval
427          ////@begin MainWindow bitmap retrieval
428 <        wxUnusedVar(name);
429 <        if (name == _T("redo.xpm"))
430 <        {
431 <                wxBitmap bitmap(redo_xpm);
432 <                return bitmap;
433 <        }
434 <        else if (name == _T("fileopen.xpm"))
435 <        {
436 <                wxBitmap bitmap( fileopen_xpm);
437 <                return bitmap;
438 <        }
439 <        else if (name == _T("filesaveas.xpm"))
440 <        {
441 <                wxBitmap bitmap( filesaveas_xpm);
442 <                return bitmap;
443 <        }
444 <        else if (name == _T("quit.xpm"))
445 <        {
446 <                wxBitmap bitmap( quit_xpm);
447 <                return bitmap;
448 <        }
449 <        return wxNullBitmap;
428 >    wxUnusedVar(name);
429 >    if (name == _T("undo.xpm"))
430 >    {
431 >        wxBitmap bitmap( undo_xpm);
432 >        return bitmap;
433 >    }
434 >    else if (name == _T("fileopen.xpm"))
435 >    {
436 >        wxBitmap bitmap( fileopen_xpm);
437 >        return bitmap;
438 >    }
439 >    else if (name == _T("filesaveas.xpm"))
440 >    {
441 >        wxBitmap bitmap( filesaveas_xpm);
442 >        return bitmap;
443 >    }
444 >    else if (name == _T("quit.xpm"))
445 >    {
446 >        wxBitmap bitmap( quit_xpm);
447 >        return bitmap;
448 >    }
449 >    return wxNullBitmap;
450          ////@end MainWindow bitmap retrieval
451   }
452  
# Line 1233 | Line 456 | wxBitmap MainWindow::GetBitmapResource(
456  
457   wxIcon MainWindow::GetIconResource( const wxString& name )
458   {
1236
459          // Icon retrieval
460          ////@begin MainWindow icon retrieval
461 <        wxUnusedVar(name);
462 <        if (name == _T("oni_special.ico"))
463 <        {
464 <                //      wxIcon icon(_T("oni_special.ico"), wxBITMAP_TYPE_ICO);
465 <                //      return icon;
466 <        }
467 <        return wxNullIcon;
461 >    wxUnusedVar(name);
462 >    if (name == _T("aelogosmall.png"))
463 >    {
464 >        wxIcon icon(aelogosmall_xpm);
465 >        return icon;
466 >    }
467 >    return wxNullIcon;
468          ////@end MainWindow icon retrieval
469   }
470  
1249
471   /*
472   * wxEVT_COMMAND_LISTBOX_SELECTED event handler for Mods_CheckboxList1
473   */
474  
475   void MainWindow::OnModsCheckboxList1Selected( wxCommandEvent& event )
476   {
1256        //event.GetSelection
477          titleText->SetValue(globalPackages[event.GetSelection()].name.c_str());
478          creatorText->SetValue(globalPackages[event.GetSelection()].creator.c_str());
479          descriptionText->SetValue(globalPackages[event.GetSelection()].readme.c_str());
1260
1261        //creatorText->Refresh();
480   }
481  
1264
482   /*
483   * wxEVT_COMMAND_CHECKLISTBOX_TOGGLED event handler for Mods_CheckboxList1
484   */
# Line 1292 | Line 509 | void MainWindow::OnOptionsClick( wxComma
509   {
510          if (!event.GetInt() ) {
511                  OptionsPanel->Hide();
512 +                
513                  this->SetSize(this->GetRect().GetWidth(), this->GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight());}
514          else {
515 < //              Uncomment this when we release, it gets annoying if you are testing globalization a lot ;)
1298 <                wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: These options are for advanced users only, use with caution.",
515 >                wxMessageDialog* YesNoDialog = new wxMessageDialog(this, "WARNING: These options are for advanced users only, use with caution.",
516                                                                                                                     "AE Installer Alert",  wxOK | wxICON_EXCLAMATION     , wxDefaultPosition);
517                  YesNoDialog->ShowModal();
518                  OptionsPanel->Show();
# Line 1304 | Line 521 | void MainWindow::OnOptionsClick( wxComma
521          }
522   }
523  
1307
524   /*
525   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
526   */
# Line 1314 | Line 530 | void MainWindow::OnExitClick( wxCommandE
530          exit(0);
531   }
532  
1317
533   /*
534   * wxEVT_COMMAND_BUTTON_CLICKED event handler for Install_Button
535   */
536  
1322
537   struct recompile
538   {
539          recompile(vector<string> localPackages) : thePackages(localPackages) { }
# Line 1328 | Line 542 | struct recompile
542                  TheInstallButton->Disable();
543                  recompileAll(thePackages);
544                  TheInstallButton->Enable();
545 +                
546          }
1332
547          vector<string> thePackages;
548   };
549  
550 + void globalize2(void) {
551 +                TheInstallButton->Disable();
552 +                globalizeData();
553 +                TheInstallButton->Enable();
554 + }
555 +
556   void MainWindow::OnInstallButtonClick( wxCommandEvent& event )
557   {
1338
558          vector<string> localPackages;
559 <        localPackages.push_back("Globalize");
560 <        for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
559 >        localPackages.push_back("00000Globalize");
560 >        for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
561          if ( !localPackages.empty() )   {
562 <        
563 <                //MainWindow::MainWindow().Hide();      
1345 <                //      boost::thread thrd2(recompileAll(localPackages) );
1346 <                //MainWindow::MainWindow().Show();
562 >                sort(localPackages.begin(), localPackages.end());
563 >                localPackages[0] = "Globalize";
564                  this->InstallButton->Disable();
565                  this->ReglobalizeButton->Disable();
566   #ifdef WIN32
# Line 1352 | Line 569 | void MainWindow::OnInstallButtonClick( w
569   #else
570                  recompileAll(localPackages);
571   #endif
1355
572                  this->InstallButton->Enable();
573                  this->ReglobalizeButton->Enable();
574          }
1359
1360
575   }
576  
577 < /*void setStatusArea( string s ) {
578 < //TheStatusBar = MainWindow::StatusArea;
579 < (**TheStatusBar).SetStatusText(_(s.c_str()), 0);
580 <
581 < //MainWindow::MainWindow().SetSize(MainWindow::MainWindow().GetRect().GetWidth(), MainWindow::MainWindow().GetRect().GetHeight()+1);
582 <
583 < //MainWindow::StatusBar->SetLabel("Importing Files...");
584 < //StatusBar->SetLabel(s);
585 < //->SetLabel(s);
586 <
587 < }*/
588 <
1375 < void setProgressBar( int i ) {
1376 <        //TheProgressBar->SetValue(
1377 <
577 > void setProgressBar( int i )
578 > {
579 > #ifdef WIN32
580 > if (SUCCEEDED(pTaskbarList->QueryInterface(IID_ITaskbarList3, (void **)&pTaskbarList3)))
581 > {
582 >        pTaskbarList3->SetProgressValue(Handle,i, 1000);
583 >        if ( i == 0 )
584 >        {
585 >                pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
586 >        }
587 > }
588 > #endif
589          TheProgressBar->SetValue(i);
1379
590   }
591  
1382
592   /*
593   * wxEVT_UPDATE_UI event handler for ID_STATUSBAR
594   */
# Line 1387 | Line 596 | void setProgressBar( int i ) {
596   void MainWindow::OnStatusbarUpdate( wxUpdateUIEvent& event )
597   {
598          ////@begin wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
599 <        // Before editing this code, remove the block markers.
600 <        event.Skip();
599 >    // Before editing this code, remove the block markers.
600 >    event.Skip();
601          ////@end wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
602   }
603  
1395
604   /*
605   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT
606   */
# Line 1400 | Line 608 | void MainWindow::OnStatusbarUpdate( wxUp
608   void MainWindow::OnAboutClick( wxCommandEvent& event )
609   {
610          ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
611 <        // Before editing this code, remove the block markers.
612 <        About* window = new About(this);
613 <        int returnValue = window->ShowModal();
614 <        window->Destroy();
611 >    // Before editing this code, remove the block markers.
612 >        // TODO: Make About window work again!
613 >    About* window = new About(this);
614 >    window->Destroy();
615          ////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
616   }
617  
1410
618   /*
619   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for NoSep_RadioButton
620   */
# Line 1417 | Line 624 | void MainWindow::OnNoSepRadioButtonSelec
624          static_cast<string>("-import:nosep");
625   }
626  
1420
627   /*
628   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Sep_RadioButton
629   */
# Line 1427 | Line 633 | void MainWindow::OnSepRadioButtonSelecte
633          static_cast<string>("-import:sep");
634   }
635  
1430
636   /*
637   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
638   */
639  
1435 void MainWindow::OnSeparatedRadioButtonSelected( wxCommandEvent& event )
1436 {
1437        splitInstances = SPLIT;
1438
1439 }
1440
1441
640   /*
641   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Complete_RadioButton
642   */
643  
644   void MainWindow::OnCompleteRadioButtonSelected( wxCommandEvent& event )
645   {
646 <        splitInstances = NOT_SPLIT;
1449 <
646 >        splitInstances = false;
647   }
648  
1452
649   /*
650   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BITMAPBUTTON
651   */
# Line 1459 | Line 655 | void MainWindow::OnRefreshButtonClick( w
655          refreshMods(globalInstalledMods);
656   }
657  
1462
658   /*
659   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_LOAD
660   */
661  
662 <
663 <
664 <
1470 < void MainWindow::refreshMods (vector<string> s) {
1471 <
662 > // TODO: Make refreshMods actually refresh the list in the window of available mods so we can see any new package info and deleted mods are removed from the list
663 > void MainWindow::refreshMods (vector<string> s)
664 > {
665          Mods_CheckboxList->Clear();
666 <        //globalInstalledMods = getPackages();
1474 <        for (int i = 0; i < globalPackages.size(); i++) {
666 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
667                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
668 <                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
669 <                //else Mods_CheckboxList->Check(i,0);
1478 <
668 >                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) )
669 >                        Mods_CheckboxList->Check(i);
670          }
671   }
672  
# Line 1495 | Line 686 | void MainWindow::OnLoadClick( wxCommandE
686          {
687                  refreshMods(getInstallString( string(openFileDialog->GetPath()) ));
688          }
1498
1499
689   }
690  
1502
691   /*
692   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_SAVE
693   */
# Line 1518 | Line 706 | void MainWindow::OnSaveClick( wxCommandE
706  
707          if ( openFileDialog->ShowModal() == wxID_OK )
708          {
1521
1522
1523                //Mods_CheckboxList->
1524
1525
1526
1527                //
1528
709                  if ( exists( openFileDialog->GetPath().c_str() ) )
710                  {
711                          remove( openFileDialog->GetPath().c_str() );
# Line 1534 | Line 714 | void MainWindow::OnSaveClick( wxCommandE
714                  ofstream file(openFileDialog->GetPath().c_str());
715  
716                  vector<string>list;
717 <                for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
717 >                for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
718                  vector<string>::iterator begin_iter = list.begin();
719                  vector<string>::iterator end_iter = list.end();
720  
# Line 1546 | Line 726 | void MainWindow::OnSaveClick( wxCommandE
726  
727                  file.close();
728                  file.clear();
1549
1550                //SetCurrentFilename(openFileDialog->GetFilename());
1551                //theText->LoadFile(openFileDialog->GetFilename());
1552                //SetStatusText(GetCurrentFilename(), 0);
1553                //SetStatusText(openFileDialog->GetDirectory(),1);
729          }
730   }
731  
1557
1558
732   /*
733   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ReGlobalize_Button
734   */
735  
736   void MainWindow::OnReGlobalizeButtonClick( wxCommandEvent& event )
737   {
738 <        wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data. \n Are you SURE you want to do this? ", "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION    , wxDefaultPosition);
739 <
740 <        if (YesNoDialog->ShowModal() == wxID_NO) { //if the user said no...
738 >        string YesNoMsg = "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data.\n";
739 >        YesNoMsg = YesNoMsg + "Are you SURE you want to do this?";
740 >        wxMessageDialog* YesNoDialog = new wxMessageDialog(this, YesNoMsg.c_str(), "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition);
741  
742 +        if (YesNoDialog->ShowModal() == wxID_NO)
743 +        {
744 +                //if the user said no...
745          }
746 <        else {
747 <        
746 >        else
747 >        {
748                  this->InstallButton->Disable();
749                  this->ReglobalizeButton->Disable();
1574
750   #ifdef WIN32
1576
751                  boost::thread thrd2(globalizeData);
752                  //globalizeData();
753                  //boost::thread::create_thread(&globalizeData);
# Line 1582 | Line 756 | void MainWindow::OnReGlobalizeButtonClic
756   #else
757                  globalizeData();
758   #endif
1585                
759                  this->InstallButton->Enable();
760                  this->ReglobalizeButton->Enable();
761          }
1589
762   }
763   /*
764   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
765   */
766  
767 < /*void MainWindow::OnSeparatedRadioButtonSelected( wxCommandEvent& event )
768 < {
769 < ////@begin wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1598 < // Before editing this code, remove the block markers.
1599 < event.Skip();
1600 < ////@end wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1601 < }*/
767 > /*
768 > * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Seperated_RadioButton
769 > */
770  
771 + void MainWindow::OnSeperatedRadioButtonSelected( wxCommandEvent& event )
772 + {
773 +        splitInstances = true;
774 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)