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 391 by gumby, Mon Jul 6 14:04:11 2009 UTC vs.
Revision 516 by iritscen, Wed Apr 28 10:40:52 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();
639
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 }
19  
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 867 | 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 877 | Line 115 | END_EVENT_TABLE()
115   */
116  
117   MainWindow::MainWindow()
118 < {
118 > {  
119          Init();
120   }
121  
# Line 904 | Line 142 | bool MainWindow::Create( wxWindow* paren
142          return true;
143   }
144  
907
145   /*
146   * MainWindow destructor
147   */
# Line 915 | Line 152 | MainWindow::~MainWindow()
152          ////@end MainWindow destruction
153   }
154  
918
155   /*
156   * Member initialisation
157   */
# Line 939 | Line 175 | void MainWindow::Init()
175      SeperatedRadio = NULL;
176      CompleteRadio = NULL;
177      ReglobalizeButton = NULL;
942        ////@end MainWindow member initialisation
178  
179 +        ChangeDirectoryButton = NULL;
180 +        ////@end MainWindow member initialisation
181   }
182  
946
183   /*
184   * Control creation for MainWindow
185   */
# Line 980 | 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"));
987 < #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 1053 | 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 1116 | 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 + #ifdef WIN32
366 +        Handle = (HWND)GetHWND();
367 +        ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
368 + #endif
369  
370 <        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 <        }
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 1141 | Line 382 | void MainWindow::CreateControls()
382          TheProgressBar = ProgressBar;
383          OptionsPanel->Hide();
384          
385 < //#ifndef WIN32
1145 < //      itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
1146 <        
1147 < //#endif
1148 <        
1149 <        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  
1154
390   #ifdef WIN32
391          RedirectIOToConsole();
392          HWND hWnd = GetConsoleWindow();
393          ShowWindow( hWnd, SW_HIDE );
394   #endif
1160
1161        //MainWindow::SetSize(MainWindow::GetRect().GetWidth(), MainWindow::GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight() );
395   }
396  
1164
397   /*
398   * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for SelectAll_Checkbox
399   */
# Line 1170 | 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);
1174 <                //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);
1178 <                //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);
1182 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
411 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
412                  break;
1184
413          }
1186
414   }
415  
1189
416   /*
417   * wxEVT_CREATE event handler for Mods_CheckboxList
418   */
# Line 1194 | Line 420 | void MainWindow::OnSelectAllCheckboxClic
420   void MainWindow::ModList_OnCreate( wxWindowCreateEvent& event )
421   {
422  
1197
423   }
424  
425  
# Line 1246 | Line 471 | wxBitmap MainWindow::GetBitmapResource(
471  
472   wxIcon MainWindow::GetIconResource( const wxString& name )
473   {
1249
474          // Icon retrieval
475          ////@begin MainWindow icon retrieval
476      wxUnusedVar(name);
# Line 1259 | Line 483 | wxIcon MainWindow::GetIconResource( cons
483          ////@end MainWindow icon retrieval
484   }
485  
1262
486   /*
487   * wxEVT_COMMAND_LISTBOX_SELECTED event handler for Mods_CheckboxList1
488   */
489  
490   void MainWindow::OnModsCheckboxList1Selected( wxCommandEvent& event )
491   {
1269        //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());
1273
1274        //creatorText->Refresh();
495   }
496  
1277
497   /*
498   * wxEVT_COMMAND_CHECKLISTBOX_TOGGLED event handler for Mods_CheckboxList1
499   */
# Line 1308 | 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 ;)
1312 <                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 1318 | Line 536 | void MainWindow::OnOptionsClick( wxComma
536          }
537   }
538  
1321
539   /*
540   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
541   */
# Line 1328 | Line 545 | void MainWindow::OnExitClick( wxCommandE
545          exit(0);
546   }
547  
1331
548   /*
549   * wxEVT_COMMAND_BUTTON_CLICKED event handler for Install_Button
550   */
551  
1336
552   struct recompile
553   {
554          recompile(vector<string> localPackages) : thePackages(localPackages) { }
# Line 1342 | Line 557 | struct recompile
557                  TheInstallButton->Disable();
558                  recompileAll(thePackages);
559                  TheInstallButton->Enable();
560 +                
561          }
1346
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   {
1352
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();      
1359 <                //      boost::thread thrd2(recompileAll(localPackages) );
1360 <                //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 1366 | Line 584 | void MainWindow::OnInstallButtonClick( w
584   #else
585                  recompileAll(localPackages);
586   #endif
1369
587                  this->InstallButton->Enable();
588                  this->ReglobalizeButton->Enable();
589          }
1373
1374
590   }
591  
592 < /*void setStatusArea( string s ) {
593 < //TheStatusBar = MainWindow::StatusArea;
594 < (**TheStatusBar).SetStatusText(_(s.c_str()), 0);
595 <
596 < //MainWindow::MainWindow().SetSize(MainWindow::MainWindow().GetRect().GetWidth(), MainWindow::MainWindow().GetRect().GetHeight()+1);
597 <
598 < //MainWindow::StatusBar->SetLabel("Importing Files...");
599 < //StatusBar->SetLabel(s);
600 < //->SetLabel(s);
601 <
602 < }*/
603 <
1389 < void setProgressBar( int i ) {
1390 <        //TheProgressBar->SetValue(
1391 <
592 > void setProgressBar( int i )
593 > {
594 > #ifdef WIN32
595 > if (SUCCEEDED(pTaskbarList->QueryInterface(IID_ITaskbarList3, (void **)&pTaskbarList3)))
596 > {
597 >        pTaskbarList3->SetProgressValue(Handle,i, 1000);
598 >        if ( i == 0 )
599 >        {
600 >                pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
601 >        }
602 > }
603 > #endif
604          TheProgressBar->SetValue(i);
1393
605   }
606  
1396
607   /*
608   * wxEVT_UPDATE_UI event handler for ID_STATUSBAR
609   */
# Line 1406 | Line 616 | void MainWindow::OnStatusbarUpdate( wxUp
616          ////@end wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
617   }
618  
1409
619   /*
620   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT
621   */
# Line 1416 | Line 625 | void MainWindow::OnAboutClick( wxCommand
625          ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
626      // Before editing this code, remove the block markers.
627      About* window = new About(this);
628 <    int returnValue = window->ShowModal();
628 >        window->ShowModal();
629      window->Destroy();
630          ////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
631   }
632  
1424
633   /*
634   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for NoSep_RadioButton
635   */
636 <
636 >
637   void MainWindow::OnNoSepRadioButtonSelected( wxCommandEvent& event )
638   {
639          static_cast<string>("-import:nosep");
640   }
641  
1434
642   /*
643   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Sep_RadioButton
644   */
# Line 1441 | Line 648 | void MainWindow::OnSepRadioButtonSelecte
648          static_cast<string>("-import:sep");
649   }
650  
1444
651   /*
652   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
653   */
# Line 1452 | Line 658 | void MainWindow::OnSepRadioButtonSelecte
658  
659   void MainWindow::OnCompleteRadioButtonSelected( wxCommandEvent& event )
660   {
661 <        splitInstances = NOT_SPLIT;
1456 <
661 >        splitInstances = false;
662   }
663  
1459
664   /*
665   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BITMAPBUTTON
666   */
667  
668   void MainWindow::OnRefreshButtonClick( wxCommandEvent& event )
669   {
670 +        globalPackages = getPackages();
671          refreshMods(globalInstalledMods);
672   }
673  
1469
674   /*
675   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_LOAD
676   */
677  
678 <
679 <
1476 <
1477 < void MainWindow::refreshMods (vector<string> s) {
1478 <
678 > void MainWindow::refreshMods (vector<string> s)
679 > {
680          Mods_CheckboxList->Clear();
681 <        //globalInstalledMods = getPackages();
1481 <        for (int i = 0; i < globalPackages.size(); i++) {
681 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
682                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
683 <                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
684 <                //else Mods_CheckboxList->Check(i,0);
1485 <
683 >                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) )
684 >                        Mods_CheckboxList->Check(i);
685          }
686   }
687  
# Line 1502 | Line 701 | void MainWindow::OnLoadClick( wxCommandE
701          {
702                  refreshMods(getInstallString( string(openFileDialog->GetPath()) ));
703          }
1505
1506
704   }
705  
1509
706   /*
707   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_SAVE
708   */
# Line 1525 | Line 721 | void MainWindow::OnSaveClick( wxCommandE
721  
722          if ( openFileDialog->ShowModal() == wxID_OK )
723          {
1528
1529
1530                //Mods_CheckboxList->
1531
1532
1533
1534                //
1535
724                  if ( exists( openFileDialog->GetPath().c_str() ) )
725                  {
726                          remove( openFileDialog->GetPath().c_str() );
# Line 1541 | Line 729 | void MainWindow::OnSaveClick( wxCommandE
729                  ofstream file(openFileDialog->GetPath().c_str());
730  
731                  vector<string>list;
732 <                for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
732 >                for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
733                  vector<string>::iterator begin_iter = list.begin();
734                  vector<string>::iterator end_iter = list.end();
735  
# Line 1553 | Line 741 | void MainWindow::OnSaveClick( wxCommandE
741  
742                  file.close();
743                  file.clear();
1556
1557                //SetCurrentFilename(openFileDialog->GetFilename());
1558                //theText->LoadFile(openFileDialog->GetFilename());
1559                //SetStatusText(GetCurrentFilename(), 0);
1560                //SetStatusText(openFileDialog->GetDirectory(),1);
744          }
745   }
746  
1564
1565
747   /*
748   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ReGlobalize_Button
749   */
750  
751   void MainWindow::OnReGlobalizeButtonClick( wxCommandEvent& event )
752   {
753 <        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);
754 <
755 <        if (YesNoDialog->ShowModal() == wxID_NO) { //if the user said no...
753 >        string YesNoMsg = "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data.\n";
754 >        YesNoMsg = YesNoMsg + "Are you SURE you want to do this?";
755 >        wxMessageDialog* YesNoDialog = new wxMessageDialog(this, YesNoMsg.c_str(), "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition);
756  
757 +        if (YesNoDialog->ShowModal() == wxID_NO)
758 +        {
759 +                //if the user said no...
760          }
761 <        else {
762 <        
761 >        else
762 >        {
763                  this->InstallButton->Disable();
764                  this->ReglobalizeButton->Disable();
1581
765   #ifdef WIN32
1583
766                  boost::thread thrd2(globalizeData);
767                  //globalizeData();
768                  //boost::thread::create_thread(&globalizeData);
# Line 1589 | Line 771 | void MainWindow::OnReGlobalizeButtonClic
771   #else
772                  globalizeData();
773   #endif
1592                
774                  this->InstallButton->Enable();
775                  this->ReglobalizeButton->Enable();
776          }
1596
777   }
778   /*
779   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
780   */
781  
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
782   /*
783   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Seperated_RadioButton
784   */
785  
786   void MainWindow::OnSeperatedRadioButtonSelected( wxCommandEvent& event )
787   {
788 < splitInstances = SPLIT;
788 >        splitInstances = true;
789   }
790  
791 + void MainWindow::OnDirButtonClick( wxCommandEvent& event )
792 + {
793 +        wxDirDialog* newDir = new wxDirDialog(this, "Set current directory", "", wxDD_DEFAULT_STYLE,
794 +                wxDefaultPosition, wxDefaultSize, "wxDirCtrl");
795 +        newDir->ShowModal();
796 +        if(newDir->GetPath()[0]) current_path( (path)newDir->GetPath() );
797 +        OnRefreshButtonClick(event);
798 + }

Diff Legend

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