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 390 by gumby, Mon Jul 6 14:02:56 2009 UTC vs.
Revision 500 by iritscen, Sun Mar 14 23:31:14 2010 UTC

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

Diff Legend

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