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 394 by gumby, Mon Jul 6 17:53:15 2009 UTC vs.
Revision 487 by iritscen, Wed Dec 30 01:51:38 2009 UTC

# Line 1 | Line 1
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   #ifndef NTDDI_VERSION          
10   #define NTDDI_VERSION NTDDI_WIN7
11   #endif
12   #ifdef WIN32
13 < #include <windows.h>
13 > #include <windows.h>
14   #include <shobjidl.h>
15   HWND Handle;
8
16   ITaskbarList *pTaskbarList;
17   ITaskbarList3 *pTaskbarList3;
18   #endif
19  
13 /*
14 AE/Mod Installer
15 by Gumby and Iritscen
16 */
17
18 // To-do: - Load credits from text resource file
19 //                - Institute lots of checks into file-handling
20 //                - Clear mod info fields when mod is de-selected
21
22 #define DEBUG
23 #include <stdio.h>
24 //#include <conio.h>
25 //#include <process.h>
26 #include <string>
27 #include <iostream>
28 #include <cctype>
29 #include <vector>
30 #include <fstream>
31 #include <errno.h>
32 #include <sstream>
33
34 #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations
35 #include "boost/lexical_cast.hpp" //int -> string
36 #include "installer.h"
37
38 #ifdef WIN32
39 #include <windows.h>
40 #else // assume we're on Mac
41 #include <stdlib.h>
42 #include <dirent.h>
43 #endif
44
45 //const string strInstallerVersion = "1.0";
46 const bool SPLIT = 1;
47 const bool NOT_SPLIT = 0;
48 bool splitInstances = SPLIT;
49 bool busy = 0;
50 #ifdef WIN32
51 const string strOniSplit = "Onisplit.exe";
52 string strImportOption = "-import:nosep";
53 const char* strClsCmd = "cls";
54 const char* strPauseCmd = "PAUSE";
55 #else // set up Mac equivalents since we're in Mac OS
56 const string strOniSplit = "mono Onisplit.exe";
57 string strImportOption = "-import:sep";
58 const char* strClsCmd = "clear";
59 const char* strPauseCmd = "read -n 1 -p \"Press any key to continue\"";
60 void Sleep(int ms) { sleep( ms / 1000 ); }
61 #endif
62
63 using namespace boost::filesystem;
64 using namespace std;
65
66
67
68
69 #include "boost/date_time/gregorian/gregorian.hpp"
70 #include "boost/date_time/date_parsing.hpp"
71 #include "boost/date_time/posix_time/posix_time.hpp"
72
73 string escapePath(string input) {
74        
75        string output;
76        string escape_me = "& ;()|<>\"'\\#*?$";
77        for(int i = 0; i < input.size(); i++)  {
78                for(int j = 0; j < escape_me.size(); j++) if (input[i] == escape_me[j]) output += '\\';
79                output += input[i];
80        }
81        return output;
82 }
83
84 int globalizeData(void)
85 {
86        busy = 1;
87        using boost::lexical_cast;
88        using boost::bad_lexical_cast;
89        // using namespace boost::posix_time;
90        using namespace boost::gregorian;
91        using namespace boost::posix_time;
92        ptime start_time(second_clock::local_time());
93
94        setStatusArea("Globalizing!");
95        int err = 0;
96        int parts_done = 0;
97        char Step_x_x[300];
98        //char levels[i][5];
99        remove("Globalize.log");
100        ofstream logfile("Globalize.log");
101        logfile << "Globalization started " << to_simple_string(start_time) << endl;
102        try {
103
104                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.
105                //const vector<double> ck(cv, &cv[CvSize]);
106                vector<string> levels;
107                for (int f = 0; f < 15; f++) {
108                        levels.push_back(levels_cstr[f]);
109                }
110                char choice = 0;
111
112                //SetCurrentDirectory("C:/Program Files/Oni/edition/install");
113                ///char levels[i][3];
114                path Characters = "../GameDataFolder/level0_Characters";
115                path Particles = "../GameDataFolder/level0_Particles";
116                path Archive = "../GameDataFolder/Archive";
117                path Textures  = "../GameDataFolder/level0_Textures";
118                path Sounds = "../GameDataFolder/level0_Sounds";
119                path Animations = "../GameDataFolder/level0_Animations";
120                path TRAC = Animations / "level0_TRAC";
121                path TRAM = Animations / "level0_TRAM";
122
123                vector<path> GDFPaths;
124                GDFPaths.push_back(Characters);
125                GDFPaths.push_back(Particles);
126                GDFPaths.push_back(Textures);
127                GDFPaths.push_back(Sounds);
128                GDFPaths.push_back(TRAC);
129                GDFPaths.push_back(TRAM);
130
131
132                path VanillaCharacters = "packages/VanillaDats/level0_Final/level0_Characters/level0_Characters.oni";
133                path VanillaParticles = "packages/VanillaDats/level0_Final/level0_Particles/level0_Particles.oni";
134                path VanillaTextures  = "packages/VanillaDats/level0_Final/level0_Textures/level0_Textures.oni";
135                path VanillaSounds = "packages/VanillaDats/level0_Final/level0_Sounds/level0_Sounds.oni";
136                path VanillaAnimations = "packages/VanillaDats/level0_Final/level0_Animations/level0_Animations.oni";
137                path VanillaTRAC = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAC.oni";
138                path VanillaTRAM = "packages/VanillaDats/level0_Final/level0_Animations/level0_TRAM.oni";
139
140                vector<path> VanillaPaths;
141
142                VanillaPaths.push_back(VanillaCharacters);
143                VanillaPaths.push_back(VanillaParticles);
144                VanillaPaths.push_back(VanillaTextures);
145                VanillaPaths.push_back(VanillaSounds);
146                VanillaPaths.push_back(VanillaTRAC);
147                VanillaPaths.push_back(VanillaTRAM);
148
149                /*
150                if (exists("../GameDataFolder/"))
151                {
152                //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.)"
153                //       << "\n1. Re-globalize"
154                //       << "\n2. Return to main menu\n";
155                //choice = cin.get();
156                cin.ignore(128, '\n');
157                if (choice == '1')
158                remove_all("../GameDataFolder"); // remove AE GDF
159                if (choice == '2')
160                return 0;
161                }
162                */
163                setStatusArea("Removing old GameDataFolder...\n");
164                logfile <<  "Removing old GameDataFolder...\n";
165                remove_all( "../GameDataFolder/" );
166                setStatusArea("Creating needed directories...");
167                logfile <<  "Creating needed directories...\n";
168                create_directory( "../GameDataFolder/" );
169
170                create_directory( "packages" );
171
172                if (exists("packages/VanillaDats")) remove_all("packages/VanillaDats");
173                create_directory( "packages/VanillaDats" );
174                create_directory( "packages/VanillaDats/level0_Final/" );
175                //blah blah finish this.
176                //logfile <<  "packages/VanillaDats/level0_Final/ created";
177                create_directory( Characters );
178                create_directory( Particles );
179                create_directory( Archive );
180                create_directory( Textures );
181                create_directory( Sounds );
182                create_directory( Animations );
183                create_directory( TRAC );
184                create_directory( TRAM );
185                int num_levels = 0;
186                for(int i = 1; i < 15; i++)
187                {
188                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
189                                num_levels++;
190
191                        }
192                }
193                logfile << "Exporting and moving...\n\n";
194                int total_steps =  8 + 2 * num_levels;
195                for(int i = 0; i < 15; i++)
196                {
197
198                        //printf(levels[i],"%d",levels[i]); // int to char array
199
200                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
201                                logfile << "level" << levels[i] << "_Final\n";
202                                logfile << "\tExporting level" << levels[i] << "_Final.dat\n";
203                                //printf(Step_x_x,"Step %d/%d: exporting level%d_final.dat", parts_done + 1,, levels[i]); setStatusArea((string)Step_x_x);
204                                setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " exporting level" + levels[i]+"_Final.dat");
205                                create_directory( "../GameDataFolder/level" + levels[i] + "_Final" );
206                                //                              setStatusArea(strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat");
207                                system((strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat").c_str());
208                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final" );
209                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final" );
210
211                                directory_iterator end_iter;
212                                for ( directory_iterator dir_itr( "../GameDataFolder/level" + levels[i] + "_Final" ); dir_itr != end_iter; ++dir_itr )
213                                {
214                                        //cout << dir_itr->path().filename();
215                                        if ( is_regular_file( dir_itr->status() ) )
216                                        {
217                                                if ( dir_itr->path().filename().substr(0,8) == "TXMPfail" ||
218                                                        dir_itr->path().filename().substr(0,9) == "TXMPlevel" ||
219                                                        ( dir_itr->path().filename().substr(0,4) == "TXMP" && dir_itr->path().filename().find("intro")!=string::npos) ||
220                                                        dir_itr->path().filename().substr(0,4) == "TXMB" ||
221                                                        dir_itr->path().filename() == "M3GMpowerup_lsi.oni" ||
222                                                        dir_itr->path().filename() == "TXMPlsi_icon.oni" ||
223                                                        ( dir_itr->path().filename().substr(0,4) == "TXMB" && dir_itr->path().filename().find("splash_screen.oni")!=string::npos)       )
224                                                {
225                                                        cout <<dir_itr->path().filename() << "\n";
226                                                        create_directory( dir_itr->path().parent_path() / "NoGlobal");  
227                                                        if(!exists( dir_itr->path().parent_path() / "NoGlobal" / dir_itr->filename())) rename(dir_itr->path(), dir_itr->path().parent_path() / "NoGlobal" /
228                                                                dir_itr->filename());
229                                                        else remove(dir_itr->path());
230                                                }
231                                                else if (dir_itr->path().filename().substr(0,4) == "TRAC"
232                                                        || dir_itr->path().filename().substr(0,4) == "ONVL") {
233                                                                cout <<dir_itr->path().filename() << "\n";
234                                                                if(!exists( TRAC / dir_itr->filename())) rename(dir_itr->path(), TRAC / dir_itr->filename());
235                                                                else remove(dir_itr->path());
236                                                }
237                                                else if (dir_itr->path().filename().substr(0,4) == "TRAM") {
238                                                        cout <<dir_itr->path().filename() << "\n";
239                                                        if(!exists( TRAM / dir_itr->filename())) rename(dir_itr->path(), TRAM / dir_itr->filename());
240                                                        else remove(dir_itr->path());
241                                                }
242                                                else if (dir_itr->path().filename().substr(0,4) == "ONSK" ||
243                                                        dir_itr->path().filename().substr(0,4) == "TXMP") {
244                                                                cout <<dir_itr->path().filename() << "\n";\
245                                                                        create_directory( dir_itr->path().parent_path() / "TexFix");    
246                                                                if(!exists( Textures / dir_itr->filename())) rename(dir_itr->path(), Textures / dir_itr->filename());
247                                                                //rename(dir_itr->path(), dir_itr->path().parent_path() / "TexFix" / dir_itr->filename());
248                                                }
249                                                else if (dir_itr->path().filename().substr(0,4) == "ONCC"
250                                                        || dir_itr->path().filename().substr(0,4) == "TRBS"
251                                                        || dir_itr->path().filename().substr(0,4) == "ONCV"
252                                                        || dir_itr->path().filename().substr(0,4) == "TRMA"
253                                                        || dir_itr->path().filename().substr(0,4) == "TRSC"
254                                                        || dir_itr->path().filename().substr(0,4) == "TRAS") {
255                                                                cout <<dir_itr->path().filename() << "\n";
256                                                                if(!exists( Characters / dir_itr->filename())) rename(dir_itr->path(), Characters / dir_itr->filename());
257                                                                else remove(dir_itr->path());
258                                                }
259                                                else if (dir_itr->path().filename().substr(0,4) == "OSBD"
260                                                        || dir_itr->path().filename().substr(0,4) == "SNDD") {
261                                                                cout << dir_itr->path().filename() << "\n";
262                                                                if(!exists( Sounds / dir_itr->filename())) rename(dir_itr->path(), Sounds / dir_itr->filename());
263                                                                else remove(dir_itr->path());
264                                                }
265                                                else if (dir_itr->path().filename().substr(0,5) == "BINA3"
266                                                        || dir_itr->path().filename().substr(0,10) == "M3GMdebris"
267                                                        || dir_itr->path().filename() == "M3GMtoxic_bubble.oni"
268                                                        || dir_itr->path().filename().substr(0,8) == "M3GMelec"
269                                                        || dir_itr->path().filename().substr(0,7) == "M3GMrat"
270                                                        || dir_itr->path().filename().substr(0,7) == "M3GMjet"
271                                                        || dir_itr->path().filename().substr(0,9) == "M3GMbomb_"
272                                                        || dir_itr->path().filename() == "M3GMbarab_swave.oni"
273                                                        || dir_itr->path().filename() == "M3GMbloodyfoot.oni"
274                                                        ){
275                                                                cout <<dir_itr->path().filename() << "\n";
276                                                                if(!exists( Particles / dir_itr->filename())) rename(dir_itr->path(), Particles / dir_itr->filename());
277                                                                else remove(dir_itr->path());
278                                                }
279                                                else if (dir_itr->path().filename().substr(0,4) == "AGDB"
280                                                        || dir_itr->path().filename().substr(0,4) == "TRCM") {
281                                                                cout <<dir_itr->path().filename() << "\n";
282
283                                                                if(!exists( Archive / dir_itr->filename())) rename(dir_itr->path(), Archive / dir_itr->filename());
284                                                                else remove(dir_itr->path());
285                                                }
286                                                else if (dir_itr->path().filename().substr(0,4) == "ONWC") { //fix for buggy ONWC overriding
287                                                                cout <<dir_itr->path().filename() << "\n";
288
289                                                                if(!exists( "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final/" +  dir_itr->filename())) rename(dir_itr->path(), "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final/" +  dir_itr->filename());
290                                                                else remove(dir_itr->path());
291                                                }
292                                                if (exists(dir_itr->path())) {
293
294                                                }
295                                                else {
296                                                        //logfile << "\tMoved file: " << dir_itr->path().filename() << "\n";
297                                                }
298                                        }
299
300
301
302                                }
303                                logfile << "\tCleaning up TXMPs...\n";
304                                system( (strOniSplit + " -move:delete " + Textures.string() + " ../GameDataFolder/level" + levels[i] + "_Final/TXMP*.oni").c_str());
305                                parts_done++;
306
307                                setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
308
309                        }
310                }
311                logfile << "Reimporting levels\n";
312                for (int i = 0; i < 15; i++)
313                {
314                        logfile << "\tReimporting level" << levels[i] << "_Final.oni\n";
315                        //printf(levels[i],"%d",levels[i]);
316                        //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");
317                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " reimporting level" + levels[i]+"_Final.oni");
318                        logfile << (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final packages/VanillaDats/level" + levels[i] + "_Final/level"
319                                + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize.log").c_str() << '\n';
320                        string sys_str = (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final packages/VanillaDats/level" + levels[i] + "_Final/level"
321                                + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize2.log");
322                                system(sys_str.c_str() );
323                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
324                        parts_done++;
325                }
326                create_directory( VanillaCharacters.parent_path() );
327                create_directory( VanillaParticles.parent_path() );
328                create_directory( VanillaTextures.parent_path() );
329                create_directory( VanillaSounds.parent_path() );
330                create_directory( VanillaAnimations.remove_filename() );
331
332                for(int j = 0; j < GDFPaths.size(); j++) {
333                        logfile << "\tReimporting " << GDFPaths[j].filename() << ".oni\n";
334                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + ": reimporting " + GDFPaths[j].filename() );
335                        system((strOniSplit + " " + strImportOption + " " + GDFPaths[j].string() + " " + VanillaPaths[j].string()).c_str());
336                        parts_done++;
337                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
338                }
339                /*
340                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) ));
341                system((strOniSplit + " " + strImportOption + " " + Characters.string() + " " + VanillaCharacters.string()).c_str());
342                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) ));
343                system((strOniSplit + " " + strImportOption + " " + Particles.string() + " " + VanillaParticles.string()).c_str());
344                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) ));
345                system((strOniSplit + " " + strImportOption + " " + Textures.string() + " " + VanillaTextures.string()).c_str());
346                //system((strOniSplit   + " " + strImportOption + (string)" " + Animations.string() + (string)" " + VanillaAnimations.string()).c_str());
347                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) ));
348                system((strOniSplit + " " + strImportOption + " " + TRAC.string() + " " + VanillaTRAC.string()).c_str());
349                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) ));
350                system((strOniSplit + " " + strImportOption + " " + Sounds.string() + " " + VanillaSounds.string()).c_str());
351                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) ));
352                system((strOniSplit + " " + strImportOption + " " + TRAM.string() + " " + VanillaTRAM.string()).c_str());
353                //parts_done++; setStatusArea((string)"Copying level scripts...");setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
354                if (exists("../GameDataFolder/IGMD")) remove_all("../GameDataFolder/IGMD");
355                */
356                create_directory((path)"../GameDataFolder/IGMD");
357                copy((path)"packages/VanillaBSL/IGMD", (path)"../GameDataFolder");
358                setProgressBar( 1000 );
359                
360                // 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/
361                // or we could just include it in the zip in the proper place already.
362
363                copy("../../persist.dat","../persist.dat");
364                copy("../../keyconfig.txt","../keyconfig.txt");
365 #ifndef WIN32
366                /* 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).
367                   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,
368                   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 */
369                string fullAEpath = escapePath(system_complete(".").parent_path().parent_path().string()); // get full path for Installer
370                char prefsCommand[300] = "defaults write com.godgames.oni RetailInstallationPath -string '";
371                strcat(prefsCommand, fullAEpath.c_str()); // get path of edition/ folder (Oni wants the folder that *contains* the GDF)
372                strcat(prefsCommand, "'"); // path string is enclosed in single quotes to avoid the need to escape UNIX-unfriendly characters
373                system(prefsCommand);
374                
375 #endif
376                
377                
378                setStatusArea((string)"Done! Now select your mod packages and click install.");
379                //      while(1) Sleep(-1);
380
381        }
382        catch (exception ex) {
383                setStatusArea("Warning, handled exception: " + (string)ex.what());
384        }
385
386        ptime end_time(second_clock::local_time());
387        time_period total_time (start_time, end_time);
388        logfile << "\n\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
389        //total_time.length().hours();
390        logfile.close();
391        busy = 0;
392        return err;
393 }
394
395
396 vector<ModPackage> getPackages(void)
397 {
398        vector<ModPackage> packages;
399        packages.reserve(65536); // come on, we shouldn't need this much space...right?!
400        fstream file;
401        string filename = "\0";
402        string MODINFO_CFG = "Mod_Info.cfg";
403
404        try
405        {
406                directory_iterator end_iter;
407                for (directory_iterator dir_itr("./packages"); dir_itr != end_iter; ++dir_itr)
408                {
409                        file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str());
410                        //cout << filename << "\n";
411
412                        if(!file.fail())
413                        {
414                                //cout << dir_itr->path().string() + MODINFO_CFG;
415                                //would prefer to push a pointer to a package, but this will do for now
416                                packages.push_back(fileToModPackage(file));
417                        }      
418                        file.close();
419                        file.clear();
420                }
421                sort(packages.begin(), packages.end());
422        }
423        catch (const std::exception & ex)
424        {
425                cout << "Warning, something odd happened!\n";
426        }
427
428        return packages;
429 }
430
431 ModPackage fileToModPackage(fstream &file)
432 {
433        /*
434        This converts a file to a ModPackage struct.
435
436        A few notes...
437        "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.
438        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
439        slower than reading a variable.
440        */
441        ModPackage package;
442        string line;
443        static string NameOfMod = "NameOfMod";  //used for comparing to the current token...
444        //I could have done it in reverse (*iter).compare("ModString") or  
445        static string ARROW = "->";                             //did something like "ModString".compare(*iter), and it would have been
446        static string ModString = "ModString";  //functionably the same.
447        static string HasOnis = "HasOnis";
448        static string HasDeltas = "HasDeltas";
449        static string HasBSL = "HasBSL";
450        static string HasDats = "HasDats";
451        static string IsEngine = "IsEngine";
452        static string Readme = "Readme";
453        static string GlobalNeeded = "GlobalNeeded";
454        static string Category = "Category";
455        static string Creator = "Creator";
456        while (! file.eof() )
457        {
458                getline (file,line);
459                vector<string> tokens;
460                vector<string>::iterator iter;
461                tokenize(line, tokens);                                 //string to vector of "words"
462                if (tokens.capacity() >= 2) {                   //make sure they are using enough stuff
463                        iter = tokens.begin();                          //what word we are on, starts at first word
464                        /*
465                        if (!AEInstallVersion.compare(*iter))
466                        If mod is too old, skip this mod.
467                        */
468                        /*else*/if (!NameOfMod.compare(*iter))  {       //if it contains the name
469                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
470                                        if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) {                 //ignores "->" and "NameOfMod"
471                                                //cout << *iter;
472                                                //cout << " ";
473                                                package.name += *iter + " ";
474                                        }
475                                }
476
477                        }
478                        else if (!ModString.compare(*iter)) {
479                                iter++; iter++;
480                                package.modStringName = *iter;
481                                iter++;
482                                package.modStringVersion = atoi((*iter).c_str());
483                        }
484                        else if (!HasOnis.compare(*iter)) {
485                                iter++; iter++;  
486                                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
487                                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,
488                                        iter++; iter++;}  // using "YFR" would probably set it off. :<
489
490                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasBSL = 1;
491                        }
492                        else if (!HasDeltas.compare(*iter)) {
493                                iter++; iter++;  
494                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDeltas = 1;
495                        }
496                        else if (!HasDats.compare(*iter)) {
497                                iter++; iter++;  
498                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDats = 1;
499                        }
500                        else if (!IsEngine.compare(*iter)) {
501                                iter++; iter++;  
502                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.isEngine = 1;
503                        }
504                        else if (!GlobalNeeded.compare(*iter)) {
505                                iter++; iter++;  
506                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.globalNeeded = 1;
507                                else if (toupper((*iter)[0]) + toupper((*iter)[1]) == 'N' + 'O') package.globalNeeded = 1; //Really the only place where checking for "No" is important atm.
508                        }
509                        else if (!Category.compare(*iter))  {  
510                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
511                                        if (ARROW.compare(*iter) && Category.compare(*iter)) {                  //ignores "->" and "Category"
512                                                //cout << *iter;
513                                                //cout << " ";
514                                                package.category += *iter + " ";
515                                        }
516                                }
517                        }
518                        else if (!Creator.compare(*iter))  {    //if it contains the name
519                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
520                                        if (ARROW.compare(*iter) && Creator.compare(*iter)) {                   //ignores "->" and "Category"
521                                                //cout << *iter;
522                                                //cout << " ";
523                                                package.creator += *iter + " ";
524                                        }
525                                }
526                        }
527                        else if (!Readme.compare(*iter))  {     //if it contains the name
528                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
529                                        if (ARROW.compare(*iter) && Readme.compare(*iter)) {                    //ignores "->" and "Category"
530                                                if(!(*iter).compare("\\n")) package.readme += '\n';
531                                                else package.readme += *iter + " ";
532                                        }
533                                }
534                        }
535                }
536
537        }
538        package.doOutput();
539        return package;
540 }
541
542 void recompileAll(vector<string> installedMods)
543 {
544        busy = 1;
545        using namespace boost::gregorian;
546        using namespace boost::posix_time;
547        using boost::lexical_cast;
548        using boost::bad_lexical_cast;
549        
550        setStatusArea("Importing levels...");
551        //setStatusArea("Recompiling Data...");
552        path vanilla_dir = "./packages/VanillaDats/";
553        string importCommand = "";
554        char statusString[128];
555        int numberOfDats = 0;
556        int j = 1;
557        string datString;
558        std::stringstream out;
559
560        ptime start_time(second_clock::local_time());
561        clearOldDats();
562        remove("Install.log");
563        ofstream logfile("Install.log");
564        logfile << "Mod Installation started " << to_simple_string(start_time) << endl;
565        logfile.close();
566        if(splitInstances == SPLIT){
567                recursive_directory_iterator end_iter;
568
569                for ( recursive_directory_iterator dir_itr( vanilla_dir );
570                        dir_itr != end_iter;
571                        ++dir_itr )
572                {
573                        try{
574                                if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
575                                {
576                                        numberOfDats++;
577                                }
578                        }
579                        catch(exception ex) {
580
581                        }
582                }
583
584                //recursive_directory_iterator end_iter;
585
586
587                out << numberOfDats;
588                datString = out.str();
589                try {
590                        for ( recursive_directory_iterator dir_itr( vanilla_dir );
591                                dir_itr != end_iter;
592                                ++dir_itr )
593                        {
594                                try
595                                {
596                                        if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
597                                        {
598                                                importCommand = strOniSplit + " " + strImportOption + " " + dir_itr->path().parent_path().string() + '/' + dir_itr->path().filename();
599                                                for (int i = 0; i < installedMods.size(); ++i) {
600                                                        if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename()  ))
601                                                                importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename();
602
603                                                        //else cout << " packages/VanillaDats/" + installedMods[i] + "/oni/";
604                                                }
605                                                importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
606
607                                                
608                                                setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
609                                                setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
610
611                                                system(importCommand.c_str());
612                                                //Sleep(1000);
613                                                //cout << importCommand << "\n";
614                                                j++;
615
616                                        }
617                                }
618                                catch ( const std::exception & ex )
619                                {
620
621                                        remove("Install.log");
622                                        ofstream logfile("Install.log");
623
624
625                                        logfile << "Warning, exception " << ex.what() << "!";
626                                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
627                                        logfile.close();        
628                                }
629                        }
630
631                }
632                catch( const std::exception & ex ) {
633
634                        remove("Install.log");
635                        ofstream logfile("Install.log");
636
637
638                        logfile << "Warning, exception " << ex.what() << "!";
639                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
640                        logfile.close();
641                }
642
643        }
644        else if(splitInstances == NOT_SPLIT){
645                directory_iterator end_iter;
646
647                for ( directory_iterator dir_itr( vanilla_dir );
648                        dir_itr != end_iter;
649                        ++dir_itr )
650                {
651
652                        if ( is_directory( dir_itr->status() ) )
653                        {
654                                numberOfDats++;
655                        }
656
657
658                }
659
660                out << numberOfDats;
661                datString = out.str();
662
663                for ( directory_iterator dir_itr( vanilla_dir );
664                        dir_itr != end_iter;
665                        ++dir_itr )
666                {
667                        try
668                        {
669                                if ( is_directory( dir_itr->status() ) )
670                                {
671                                        importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + dir_itr->path().filename() + " ";
672                                        for (int i = 0; i < installedMods.size(); ++i) {
673                                                if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename()  ))
674                                                        importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename();
675                                        }
676                                        importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
677
678
679                                        setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
680                                        setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
681
682                                        system(importCommand.c_str());
683
684                                        j++;
685                                }
686                        }
687                        catch ( const std::exception & ex )
688                        {
689
690                                remove("Install.log");
691                                ofstream logfile("Install.log");
692
693
694                                logfile << "Warning, exception " << ex.what() << "!";
695                                setStatusArea("Warning, exception " + (string)ex.what() + "!");
696                                logfile.close();
697                        }}
698        }
699        logfile << "Writing config file";
700        writeInstalledMods(installedMods);
701        setProgressBar(1000);
702        setStatusArea("Done! You can now play Oni.");
703
704        ptime end_time(second_clock::local_time());
705        time_period total_time (start_time, end_time);
706
707
708        ofstream logfile2("Install.log", ios::app | ios::ate);
709        string outstring = (string)"\n\nGlobalization ended " + to_simple_string(end_time) + "\nThe process took ";// + (string)total_time.length();
710
711        logfile2 << "\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
712
713        //logfile2.write(outstring.c_str(), outstring.length());
714        logfile2.close();
715
716        //total_time.length().hours();
717
718        Sleep(1000);
719        setProgressBar(0);
720        busy = 0;
721 }
722
723 void writeInstalledMods(vector<string> installedMods)
724 {
725
726        if ( exists( strInstallCfg ) )
727        {
728                remove( strInstallCfg );
729        }
730
731        ofstream file(strInstallCfg.c_str());
732
733        vector<string>list = installedMods;
734        vector<string>::iterator begin_iter = list.begin();
735        vector<string>::iterator end_iter = list.end();
736
737        sort( list.begin(), list.end() );
738
739        for( ; begin_iter != end_iter; ++begin_iter) {
740                file << *begin_iter << " ";
741        }
742
743        file.close();
744        file.clear();
745
746 }
747
748 vector<string> getInstallString(string Cfg)
749 {
750        //system(strPauseCmd);
751        vector<string> returnval;
752
753        string line;
754        fstream file;
755
756        if (exists( Cfg ))
757        {
758                file.open(Cfg.c_str());
759                getline(file, line);
760                tokenize(line, returnval);
761                file.close();
762                file.clear();
763                sort(returnval.begin(), returnval.end());
764        }
765        else cout << "fail";
766
767        return returnval;
768 }
769
770 //stolen token function...
771 void tokenize(const string& str, vector<string>& tokens, const string& delimiters)
772 {
773        // Skip delimiters at beginning.
774        string::size_type lastPos = str.find_first_not_of(delimiters, 0);
775        // Find first "non-delimiter".
776        string::size_type pos     = str.find_first_of(delimiters, lastPos);
777
778        while (string::npos != pos || string::npos != lastPos)
779        {
780                // Found a token, add it to the vector.
781                tokens.push_back(str.substr(lastPos, pos - lastPos));
782                // Skip delimiters.  Note the "not_of"
783                lastPos = str.find_first_not_of(delimiters, pos);
784                // Find next "non-delimiter"
785                pos = str.find_first_of(delimiters, lastPos);
786        }
787 }
788
789 void clearOldDats(void) {
790        directory_iterator end_iter_gdf;
791        for ( directory_iterator dir_itr_gdf( "../GameDataFolder" );
792                dir_itr_gdf != end_iter_gdf;
793                ++dir_itr_gdf )
794        {
795                //cout << dir_itr_gdf->path().extension() << "\n";
796                if ( dir_itr_gdf->path().extension() == ".dat" || dir_itr_gdf->path().extension() == ".raw" || dir_itr_gdf->path().extension() == ".sep" ) {
797                        remove( dir_itr_gdf->path() );
798                }
799
800        }
801
802 }
803
804 vector<string> globalInstalledMods;
805 vector<ModPackage> globalPackages;
806 #include "boost/thread.hpp"
20   #include <boost/thread/mutex.hpp>
808
809 /////////////////////////////////////////////////////////////////////////////
810 // Name:        main_window.cpp
811 // Purpose:    
812 // Author:      
813 // Modified by:
814 // Created:     07/05/2009 20:38:25
815 // RCS-ID:      
816 // Copyright:  
817 // Licence:    
818 /////////////////////////////////////////////////////////////////////////////
819
21   // For compilers that support precompilation, includes "wx/wx.h".
22   #include "wx/wxprec.h"
23  
# Line 830 | Line 31 | vector<ModPackage> globalPackages;
31  
32   ////@begin includes
33   #include "about.h"
833 ////@end includes
834
34   #include "main_window.h"
35 + #include "installer.h"
36 + ////@end includes
37  
38   ////@begin XPM images
39   #include "aelogosmall.xpm"
# Line 842 | Line 43 | vector<ModPackage> globalPackages;
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 927 | Line 139 | bool MainWindow::Create( wxWindow* paren
139          return true;
140   }
141  
930
142   /*
143   * MainWindow destructor
144   */
# Line 938 | Line 149 | MainWindow::~MainWindow()
149          ////@end MainWindow destruction
150   }
151  
941
152   /*
153   * Member initialisation
154   */
# Line 963 | Line 173 | void MainWindow::Init()
173      CompleteRadio = NULL;
174      ReglobalizeButton = NULL;
175          ////@end MainWindow member initialisation
966
176   }
177  
969
178   /*
179   * Control creation for MainWindow
180   */
# Line 1003 | Line 211 | void MainWindow::CreateControls()
211      wxMenu* itemMenu42 = new wxMenu;
212      itemMenu42->Append(wxID_OPTIONS, _("Show Advanced Options..."), wxEmptyString, wxITEM_CHECK);
213      menuBar->Append(itemMenu42, _("Options"));
1006    wxMenu* itemMenu44 = new wxMenu;
214   #ifdef WIN32
215          itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
216          menuBar->Append(itemMenu44, _("Help"));
# Line 1076 | Line 283 | void MainWindow::CreateControls()
283      StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 );
284      StatusArea->SetName(_T("StatusArea"));
285      StatusArea->SetFieldsCount(1);
286 <    StatusArea->SetStatusText(_("AE Installer v1.0"), 0);
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);
# Line 1142 | Line 350 | void MainWindow::CreateControls()
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 <
353 > #ifdef WIN32
354          Handle = (HWND)GetHWND();
355          ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
356 <
1149 <
1150 <        if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) {
1151 <                strImportOption = "-import:sep";
1152 <                splitInstances = NOT_SPLIT;
1153 <        }
1154 <        else {
1155 <                strImportOption = "-import:nosep";
1156 <                splitInstances = SPLIT;
1157 <        }
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 1168 | Line 367 | void MainWindow::CreateControls()
367          TheProgressBar = ProgressBar;
368          OptionsPanel->Hide();
369          
370 < //#ifndef WIN32
1172 < //      itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
1173 <        
1174 < //#endif
1175 <        
1176 <        if(splitInstances == SPLIT) SeperatedRadio->SetValue(true);
370 >        if(splitInstances) SeperatedRadio->SetValue(true);
371          else CompleteRadio->SetValue(true);
372          if(strImportOption == "-import:nosep") NoSepRadio->SetValue(true);
373          else SepRadio->SetValue(true);
374  
1181
375   #ifdef WIN32
376          RedirectIOToConsole();
377          HWND hWnd = GetConsoleWindow();
378          ShowWindow( hWnd, SW_HIDE );
379   #endif
1187
1188        //MainWindow::SetSize(MainWindow::GetRect().GetWidth(), MainWindow::GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight() );
380   }
381  
1191
382   /*
383   * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for SelectAll_Checkbox
384   */
# Line 1197 | 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);
1201 <                //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);
1205 <                //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);
1209 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
396 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
397                  break;
1211
398          }
1213
399   }
400  
1216
401   /*
402   * wxEVT_CREATE event handler for Mods_CheckboxList
403   */
# Line 1221 | Line 405 | void MainWindow::OnSelectAllCheckboxClic
405   void MainWindow::ModList_OnCreate( wxWindowCreateEvent& event )
406   {
407  
1224
408   }
409  
410  
# Line 1273 | Line 456 | wxBitmap MainWindow::GetBitmapResource(
456  
457   wxIcon MainWindow::GetIconResource( const wxString& name )
458   {
1276
459          // Icon retrieval
460          ////@begin MainWindow icon retrieval
461      wxUnusedVar(name);
# Line 1286 | Line 468 | wxIcon MainWindow::GetIconResource( cons
468          ////@end MainWindow icon retrieval
469   }
470  
1289
471   /*
472   * wxEVT_COMMAND_LISTBOX_SELECTED event handler for Mods_CheckboxList1
473   */
474  
475   void MainWindow::OnModsCheckboxList1Selected( wxCommandEvent& event )
476   {
1296        //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());
1300
1301        //creatorText->Refresh();
480   }
481  
1304
482   /*
483   * wxEVT_COMMAND_CHECKLISTBOX_TOGGLED event handler for Mods_CheckboxList1
484   */
# Line 1335 | Line 512 | void MainWindow::OnOptionsClick( wxComma
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 ;)
1339 <                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 1345 | Line 521 | void MainWindow::OnOptionsClick( wxComma
521          }
522   }
523  
1348
524   /*
525   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
526   */
# Line 1355 | Line 530 | void MainWindow::OnExitClick( wxCommandE
530          exit(0);
531   }
532  
1358
533   /*
534   * wxEVT_COMMAND_BUTTON_CLICKED event handler for Install_Button
535   */
536  
1363
537   struct recompile
538   {
539          recompile(vector<string> localPackages) : thePackages(localPackages) { }
# Line 1369 | Line 542 | struct recompile
542                  TheInstallButton->Disable();
543                  recompileAll(thePackages);
544                  TheInstallButton->Enable();
545 +                
546          }
1373
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   {
1379
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();      
1386 <                //      boost::thread thrd2(recompileAll(localPackages) );
1387 <                //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 1393 | Line 569 | void MainWindow::OnInstallButtonClick( w
569   #else
570                  recompileAll(localPackages);
571   #endif
1396
572                  this->InstallButton->Enable();
573                  this->ReglobalizeButton->Enable();
574          }
1400
1401
575   }
576  
577 < /*void setStatusArea( string s ) {
578 < //TheStatusBar = MainWindow::StatusArea;
1406 < (**TheStatusBar).SetStatusText(_(s.c_str()), 0);
1407 <
1408 < //MainWindow::MainWindow().SetSize(MainWindow::MainWindow().GetRect().GetWidth(), MainWindow::MainWindow().GetRect().GetHeight()+1);
1409 <
1410 < //MainWindow::StatusBar->SetLabel("Importing Files...");
1411 < //StatusBar->SetLabel(s);
1412 < //->SetLabel(s);
1413 <
1414 < }*/
1415 <
1416 < void setProgressBar( int i ) {
1417 <        //TheProgressBar->SetValue(
577 > void setProgressBar( int i )
578 > {
579   #ifdef WIN32
1419        
1420
1421
580   if (SUCCEEDED(pTaskbarList->QueryInterface(IID_ITaskbarList3, (void **)&pTaskbarList3)))
581   {
1424        
582          pTaskbarList3->SetProgressValue(Handle,i, 1000);
583 <        if ( i == 0 ) {
584 <
585 <        pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
583 >        if ( i == 0 )
584 >        {
585 >                pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
586          }
587   }
1431
1432
588   #endif
589          TheProgressBar->SetValue(i);
1435
590   }
591  
1438
592   /*
593   * wxEVT_UPDATE_UI event handler for ID_STATUSBAR
594   */
# Line 1448 | Line 601 | void MainWindow::OnStatusbarUpdate( wxUp
601          ////@end wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
602   }
603  
1451
604   /*
605   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT
606   */
# Line 1457 | Line 609 | void MainWindow::OnAboutClick( wxCommand
609   {
610          ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
611      // Before editing this code, remove the block markers.
612 +        // TODO: Make About window work again!
613      About* window = new About(this);
1461    int returnValue = window->ShowModal();
614      window->Destroy();
615          ////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
616   }
617  
1466
618   /*
619   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for NoSep_RadioButton
620   */
# Line 1473 | Line 624 | void MainWindow::OnNoSepRadioButtonSelec
624          static_cast<string>("-import:nosep");
625   }
626  
1476
627   /*
628   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Sep_RadioButton
629   */
# Line 1483 | Line 633 | void MainWindow::OnSepRadioButtonSelecte
633          static_cast<string>("-import:sep");
634   }
635  
1486
636   /*
637   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
638   */
# Line 1494 | Line 643 | void MainWindow::OnSepRadioButtonSelecte
643  
644   void MainWindow::OnCompleteRadioButtonSelected( wxCommandEvent& event )
645   {
646 <        splitInstances = NOT_SPLIT;
1498 <
646 >        splitInstances = false;
647   }
648  
1501
649   /*
650   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BITMAPBUTTON
651   */
# Line 1508 | Line 655 | void MainWindow::OnRefreshButtonClick( w
655          refreshMods(globalInstalledMods);
656   }
657  
1511
658   /*
659   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_LOAD
660   */
661  
662 <
663 <
664 <
1519 < void MainWindow::refreshMods (vector<string> s) {
1520 <
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();
1523 <        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);
1527 <
668 >                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) )
669 >                        Mods_CheckboxList->Check(i);
670          }
671   }
672  
# Line 1544 | Line 686 | void MainWindow::OnLoadClick( wxCommandE
686          {
687                  refreshMods(getInstallString( string(openFileDialog->GetPath()) ));
688          }
1547
1548
689   }
690  
1551
691   /*
692   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_SAVE
693   */
# Line 1567 | Line 706 | void MainWindow::OnSaveClick( wxCommandE
706  
707          if ( openFileDialog->ShowModal() == wxID_OK )
708          {
1570
1571
1572                //Mods_CheckboxList->
1573
1574
1575
1576                //
1577
709                  if ( exists( openFileDialog->GetPath().c_str() ) )
710                  {
711                          remove( openFileDialog->GetPath().c_str() );
# Line 1583 | 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 1595 | Line 726 | void MainWindow::OnSaveClick( wxCommandE
726  
727                  file.close();
728                  file.clear();
1598
1599                //SetCurrentFilename(openFileDialog->GetFilename());
1600                //theText->LoadFile(openFileDialog->GetFilename());
1601                //SetStatusText(GetCurrentFilename(), 0);
1602                //SetStatusText(openFileDialog->GetDirectory(),1);
729          }
730   }
731  
1606
1607
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();
1623
750   #ifdef WIN32
1625
751                  boost::thread thrd2(globalizeData);
752                  //globalizeData();
753                  //boost::thread::create_thread(&globalizeData);
# Line 1631 | Line 756 | void MainWindow::OnReGlobalizeButtonClic
756   #else
757                  globalizeData();
758   #endif
1634                
759                  this->InstallButton->Enable();
760                  this->ReglobalizeButton->Enable();
761          }
1638
762   }
763   /*
764   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
765   */
766  
1644 /*void MainWindow::OnSeparatedRadioButtonSelected( wxCommandEvent& event )
1645 {
1646 ////@begin wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1647 // Before editing this code, remove the block markers.
1648 event.Skip();
1649 ////@end wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1650 }*/
1651
1652
767   /*
768   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Seperated_RadioButton
769   */
770  
771   void MainWindow::OnSeperatedRadioButtonSelected( wxCommandEvent& event )
772   {
773 < splitInstances = SPLIT;
773 >        splitInstances = true;
774   }
1661

Diff Legend

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