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 396 by gumby, Mon Jul 6 19:18:00 2009 UTC vs.
Revision 503 by gumby, Wed Mar 24 07:12:25 2010 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 >> Globalize.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                path fullAEpath = system_complete("."); // get full path for Installer
370                char prefsCommand[300] = "defaults write com.godgames.oni RetailInstallationPath -string '";
371                strcat(prefsCommand, fullAEpath.parent_path().parent_path().string().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 > int updateStatus;
48 > bool installerJustUpdated = false;
49 > vector<string> globalInstalledMods;
50 > vector<ModPackage> globalPackages;
51 > // Variable declarations
52 > #ifdef WIN32
53 > bool splitInstances = true;
54 > string strImportOption = "-import:nosep";
55 > string strOniSplit = "Onisplit.exe";
56 > #else
57 > bool splitInstances = false;
58 > string strImportOption = "-import:sep";
59 > string strOniSplit = "mono Onisplit.exe";
60 > #endif
61  
62   /*
63   * MainWindow type definition
# Line 890 | Line 104 | BEGIN_EVENT_TABLE( MainWindow, wxFrame )
104  
105      EVT_MENU( wxID_ABOUT, MainWindow::OnAboutClick )
106  
107 +        EVT_BUTTON( Dir_Button, MainWindow::OnDirButtonClick )
108   ////@end MainWindow event table entries
109  
110   END_EVENT_TABLE()
# Line 900 | Line 115 | END_EVENT_TABLE()
115   */
116  
117   MainWindow::MainWindow()
118 < {
118 > {  
119          Init();
120   }
121  
# Line 927 | Line 142 | bool MainWindow::Create( wxWindow* paren
142          return true;
143   }
144  
930
145   /*
146   * MainWindow destructor
147   */
# Line 938 | Line 152 | MainWindow::~MainWindow()
152          ////@end MainWindow destruction
153   }
154  
941
155   /*
156   * Member initialisation
157   */
# Line 962 | Line 175 | void MainWindow::Init()
175      SeperatedRadio = NULL;
176      CompleteRadio = NULL;
177      ReglobalizeButton = NULL;
965        ////@end MainWindow member initialisation
178  
179 +        ChangeDirectoryButton = NULL;
180 +        ////@end MainWindow member initialisation
181   }
182  
969
183   /*
184   * Control creation for MainWindow
185   */
# Line 1003 | Line 216 | void MainWindow::CreateControls()
216      wxMenu* itemMenu42 = new wxMenu;
217      itemMenu42->Append(wxID_OPTIONS, _("Show Advanced Options..."), wxEmptyString, wxITEM_CHECK);
218      menuBar->Append(itemMenu42, _("Options"));
219 <    wxMenu* itemMenu44 = new wxMenu;
220 < #ifdef WIN32
221 <        itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
222 <        menuBar->Append(itemMenu44, _("Help"));
1010 < #else
219 > //#ifdef WIN32
220 > //      itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
221 > //      menuBar->Append(itemMenu44, _("Help"));
222 > //#else
223          itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
224 < #endif  
224 > //#endif        
225  
226      itemFrame1->SetMenuBar(menuBar);
227  
# Line 1076 | Line 288 | void MainWindow::CreateControls()
288      StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 );
289      StatusArea->SetName(_T("StatusArea"));
290      StatusArea->SetFieldsCount(1);
291 <    StatusArea->SetStatusText(_("AE Installer v1.0"), 0);
291 >        string versionText = "AE Installer v" + (string)INSTALLER_VERSION;
292 >    StatusArea->SetStatusText(versionText.c_str(), 0);
293      itemBoxSizer2->Add(StatusArea, 0, wxGROW|wxALL, 0);
294  
295      wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxHORIZONTAL);
# Line 1139 | Line 352 | void MainWindow::CreateControls()
352      ReglobalizeButton->SetName(_T("Reglobalize_Button"));
353      itemBoxSizer34->Add(ReglobalizeButton, 0, wxGROW|wxALL, 5);
354  
355 <    // Connect events and objects
355 >    wxStaticLine* itemStaticLine100 = new wxStaticLine( OptionsPanel, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
356 >    itemBoxSizer25->Add(itemStaticLine100, 0, wxGROW|wxALL, 5);
357 >
358 >        ChangeDirectoryButton =  new wxButton( OptionsPanel, Dir_Button, _("Change Dir"), wxDefaultPosition, wxDefaultSize, 0 );
359 >        ChangeDirectoryButton->SetName(_T("Dir_Button"));
360 >        itemBoxSizer34->Add(ChangeDirectoryButton, 0, wxGROW|wxALL, 5);
361 >
362 >        // Connect events and objects
363      Mods_CheckboxList->Connect(Mods_CheckboxList1, wxEVT_CREATE, wxWindowCreateEventHandler(MainWindow::ModList_OnCreate), NULL, this);
364          ////@end MainWindow content construction
365 <
365 > #ifdef WIN32
366          Handle = (HWND)GetHWND();
367          ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
368 + #endif
369  
370 <
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 <        }
370 >        updateStatus = GetUpdateStatus(&currentAE, &updateAE, &installerJustUpdated);
371          
372          globalPackages = getPackages();
373          globalInstalledMods = getInstallString();
374 <        for (int i = 0; i < globalPackages.size(); i++) {
374 >        for (unsigned int i = 0; i < globalPackages.size(); i++)
375 >        {
376                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
377 <                if( binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
377 >                if (binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName)) Mods_CheckboxList->Check(i);
378          }
379  
380          TheStatusBar = &StatusArea;
# Line 1168 | Line 382 | void MainWindow::CreateControls()
382          TheProgressBar = ProgressBar;
383          OptionsPanel->Hide();
384          
385 < //#ifndef WIN32
1172 < //      itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
1173 <        
1174 < //#endif
1175 <        
1176 <        if(splitInstances == SPLIT) SeperatedRadio->SetValue(true);
385 >        if(splitInstances) SeperatedRadio->SetValue(true);
386          else CompleteRadio->SetValue(true);
387          if(strImportOption == "-import:nosep") NoSepRadio->SetValue(true);
388          else SepRadio->SetValue(true);
389  
1181
390   #ifdef WIN32
391          RedirectIOToConsole();
392          HWND hWnd = GetConsoleWindow();
393          ShowWindow( hWnd, SW_HIDE );
394   #endif
1187
1188        //MainWindow::SetSize(MainWindow::GetRect().GetWidth(), MainWindow::GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight() );
395   }
396  
1191
397   /*
398   * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for SelectAll_Checkbox
399   */
# Line 1197 | Line 402 | void MainWindow::OnSelectAllCheckboxClic
402   {
403          switch(SelectAll->Get3StateValue()) {
404          case wxCHK_UNCHECKED:
405 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1201 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
405 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
406                  break;
407          case wxCHK_CHECKED:
408 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
1205 <                //SelectAll->Set3StateValue(wxCHK_UNCHECKED);
408 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
409                  break;
410          case wxCHK_UNDETERMINED:
411 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1209 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
411 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
412                  break;
1211
413          }
1213
414   }
415  
1216
416   /*
417   * wxEVT_CREATE event handler for Mods_CheckboxList
418   */
# Line 1221 | Line 420 | void MainWindow::OnSelectAllCheckboxClic
420   void MainWindow::ModList_OnCreate( wxWindowCreateEvent& event )
421   {
422  
1224
423   }
424  
425  
# Line 1273 | Line 471 | wxBitmap MainWindow::GetBitmapResource(
471  
472   wxIcon MainWindow::GetIconResource( const wxString& name )
473   {
1276
474          // Icon retrieval
475          ////@begin MainWindow icon retrieval
476      wxUnusedVar(name);
# Line 1286 | Line 483 | wxIcon MainWindow::GetIconResource( cons
483          ////@end MainWindow icon retrieval
484   }
485  
1289
486   /*
487   * wxEVT_COMMAND_LISTBOX_SELECTED event handler for Mods_CheckboxList1
488   */
489  
490   void MainWindow::OnModsCheckboxList1Selected( wxCommandEvent& event )
491   {
1296        //event.GetSelection
492          titleText->SetValue(globalPackages[event.GetSelection()].name.c_str());
493          creatorText->SetValue(globalPackages[event.GetSelection()].creator.c_str());
494          descriptionText->SetValue(globalPackages[event.GetSelection()].readme.c_str());
1300
1301        //creatorText->Refresh();
495   }
496  
1304
497   /*
498   * wxEVT_COMMAND_CHECKLISTBOX_TOGGLED event handler for Mods_CheckboxList1
499   */
# Line 1335 | Line 527 | void MainWindow::OnOptionsClick( wxComma
527                  
528                  this->SetSize(this->GetRect().GetWidth(), this->GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight());}
529          else {
530 < //              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.",
530 >                wxMessageDialog* YesNoDialog = new wxMessageDialog(this, "WARNING: These options are for advanced users only, use with caution.",
531                                                                                                                     "AE Installer Alert",  wxOK | wxICON_EXCLAMATION     , wxDefaultPosition);
532                  YesNoDialog->ShowModal();
533                  OptionsPanel->Show();
# Line 1345 | Line 536 | void MainWindow::OnOptionsClick( wxComma
536          }
537   }
538  
1348
539   /*
540   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
541   */
# Line 1355 | Line 545 | void MainWindow::OnExitClick( wxCommandE
545          exit(0);
546   }
547  
1358
548   /*
549   * wxEVT_COMMAND_BUTTON_CLICKED event handler for Install_Button
550   */
551  
1363
552   struct recompile
553   {
554          recompile(vector<string> localPackages) : thePackages(localPackages) { }
# Line 1369 | Line 557 | struct recompile
557                  TheInstallButton->Disable();
558                  recompileAll(thePackages);
559                  TheInstallButton->Enable();
560 +                
561          }
1373
562          vector<string> thePackages;
563   };
564  
565 + void globalize2(void) {
566 +                TheInstallButton->Disable();
567 +                globalizeData();
568 +                TheInstallButton->Enable();
569 + }
570 +
571   void MainWindow::OnInstallButtonClick( wxCommandEvent& event )
572   {
1379
573          vector<string> localPackages;
574 <        localPackages.push_back("Globalize");
575 <        for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
574 >        localPackages.push_back("00000Globalize");
575 >        for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
576          if ( !localPackages.empty() )   {
577 <        
578 <                //MainWindow::MainWindow().Hide();      
1386 <                //      boost::thread thrd2(recompileAll(localPackages) );
1387 <                //MainWindow::MainWindow().Show();
577 >                sort(localPackages.begin(), localPackages.end());
578 >                localPackages[0] = "Globalize";
579                  this->InstallButton->Disable();
580                  this->ReglobalizeButton->Disable();
581   #ifdef WIN32
# Line 1393 | Line 584 | void MainWindow::OnInstallButtonClick( w
584   #else
585                  recompileAll(localPackages);
586   #endif
1396
587                  this->InstallButton->Enable();
588                  this->ReglobalizeButton->Enable();
589          }
1400
1401
590   }
591  
592 < /*void setStatusArea( string s ) {
593 < //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(
592 > void setProgressBar( int i )
593 > {
594   #ifdef WIN32
1419        
1420
1421
595   if (SUCCEEDED(pTaskbarList->QueryInterface(IID_ITaskbarList3, (void **)&pTaskbarList3)))
596   {
1424        
597          pTaskbarList3->SetProgressValue(Handle,i, 1000);
598 <        if ( i == 0 ) {
599 <
600 <        pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
598 >        if ( i == 0 )
599 >        {
600 >                pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
601          }
602   }
1431
1432
603   #endif
604          TheProgressBar->SetValue(i);
1435
605   }
606  
1438
607   /*
608   * wxEVT_UPDATE_UI event handler for ID_STATUSBAR
609   */
# Line 1448 | Line 616 | void MainWindow::OnStatusbarUpdate( wxUp
616          ////@end wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
617   }
618  
1451
619   /*
620   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT
621   */
# Line 1457 | Line 624 | void MainWindow::OnAboutClick( wxCommand
624   {
625          ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
626      // Before editing this code, remove the block markers.
627 +        // TODO: Make About window work again!
628      About* window = new About(this);
629 <    int returnValue = window->ShowModal();
629 >        window->ShowModal();
630      window->Destroy();
631          ////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
632   }
633  
1466
634   /*
635   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for NoSep_RadioButton
636   */
637 <
637 >
638   void MainWindow::OnNoSepRadioButtonSelected( wxCommandEvent& event )
639   {
640          static_cast<string>("-import:nosep");
641   }
642  
1476
643   /*
644   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Sep_RadioButton
645   */
# Line 1483 | Line 649 | void MainWindow::OnSepRadioButtonSelecte
649          static_cast<string>("-import:sep");
650   }
651  
1486
652   /*
653   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
654   */
# Line 1494 | Line 659 | void MainWindow::OnSepRadioButtonSelecte
659  
660   void MainWindow::OnCompleteRadioButtonSelected( wxCommandEvent& event )
661   {
662 <        splitInstances = NOT_SPLIT;
1498 <
662 >        splitInstances = false;
663   }
664  
1501
665   /*
666   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BITMAPBUTTON
667   */
668  
669   void MainWindow::OnRefreshButtonClick( wxCommandEvent& event )
670   {
671 +        globalPackages = getPackages();
672          refreshMods(globalInstalledMods);
673   }
674  
1511
675   /*
676   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_LOAD
677   */
678  
679 <
680 <
681 <
1519 < void MainWindow::refreshMods (vector<string> s) {
1520 <
679 > // 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
680 > void MainWindow::refreshMods (vector<string> s)
681 > {
682          Mods_CheckboxList->Clear();
683 <        //globalInstalledMods = getPackages();
1523 <        for (int i = 0; i < globalPackages.size(); i++) {
683 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
684                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
685 <                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
686 <                //else Mods_CheckboxList->Check(i,0);
1527 <
685 >                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) )
686 >                        Mods_CheckboxList->Check(i);
687          }
688   }
689  
# Line 1544 | Line 703 | void MainWindow::OnLoadClick( wxCommandE
703          {
704                  refreshMods(getInstallString( string(openFileDialog->GetPath()) ));
705          }
1547
1548
706   }
707  
1551
708   /*
709   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_SAVE
710   */
# Line 1567 | Line 723 | void MainWindow::OnSaveClick( wxCommandE
723  
724          if ( openFileDialog->ShowModal() == wxID_OK )
725          {
1570
1571
1572                //Mods_CheckboxList->
1573
1574
1575
1576                //
1577
726                  if ( exists( openFileDialog->GetPath().c_str() ) )
727                  {
728                          remove( openFileDialog->GetPath().c_str() );
# Line 1583 | Line 731 | void MainWindow::OnSaveClick( wxCommandE
731                  ofstream file(openFileDialog->GetPath().c_str());
732  
733                  vector<string>list;
734 <                for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
734 >                for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
735                  vector<string>::iterator begin_iter = list.begin();
736                  vector<string>::iterator end_iter = list.end();
737  
# Line 1595 | Line 743 | void MainWindow::OnSaveClick( wxCommandE
743  
744                  file.close();
745                  file.clear();
1598
1599                //SetCurrentFilename(openFileDialog->GetFilename());
1600                //theText->LoadFile(openFileDialog->GetFilename());
1601                //SetStatusText(GetCurrentFilename(), 0);
1602                //SetStatusText(openFileDialog->GetDirectory(),1);
746          }
747   }
748  
1606
1607
749   /*
750   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ReGlobalize_Button
751   */
752  
753   void MainWindow::OnReGlobalizeButtonClick( wxCommandEvent& event )
754   {
755 <        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);
756 <
757 <        if (YesNoDialog->ShowModal() == wxID_NO) { //if the user said no...
755 >        string YesNoMsg = "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data.\n";
756 >        YesNoMsg = YesNoMsg + "Are you SURE you want to do this?";
757 >        wxMessageDialog* YesNoDialog = new wxMessageDialog(this, YesNoMsg.c_str(), "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition);
758  
759 +        if (YesNoDialog->ShowModal() == wxID_NO)
760 +        {
761 +                //if the user said no...
762          }
763 <        else {
764 <        
763 >        else
764 >        {
765                  this->InstallButton->Disable();
766                  this->ReglobalizeButton->Disable();
1623
767   #ifdef WIN32
1625
768                  boost::thread thrd2(globalizeData);
769                  //globalizeData();
770                  //boost::thread::create_thread(&globalizeData);
# Line 1631 | Line 773 | void MainWindow::OnReGlobalizeButtonClic
773   #else
774                  globalizeData();
775   #endif
1634                
776                  this->InstallButton->Enable();
777                  this->ReglobalizeButton->Enable();
778          }
1638
779   }
780   /*
781   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
782   */
783  
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
784   /*
785   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Seperated_RadioButton
786   */
787  
788   void MainWindow::OnSeperatedRadioButtonSelected( wxCommandEvent& event )
789   {
790 < splitInstances = SPLIT;
790 >        splitInstances = true;
791   }
792  
793 + void MainWindow::OnDirButtonClick( wxCommandEvent& event )
794 + {
795 +        wxDirDialog* newDir = new wxDirDialog(this, "Set current directory", "", wxDD_DEFAULT_STYLE,
796 +                wxDefaultPosition, wxDefaultSize, "wxDirCtrl");
797 +        newDir->ShowModal();
798 +        if(newDir->GetPath()[0]) current_path( (path)newDir->GetPath() );
799 +        OnRefreshButtonClick(event);
800 + }

Diff Legend

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