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 385 by gumby, Mon Jul 6 00:59:40 2009 UTC vs.
Revision 489 by gumby, Sun Jan 24 23:58:16 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 <
152 <                create_directory( "packages/VanillaDats/level0_Final/" );
153 <                //blah blah finish this.
154 <                //logfile <<  "packages/VanillaDats/level0_Final/ created";
155 <                create_directory( Characters );
156 <                create_directory( Particles );
157 <                create_directory( Archive );
158 <                create_directory( Textures );
159 <                create_directory( Sounds );
160 <                create_directory( Animations );
161 <                create_directory( TRAC );
162 <                create_directory( TRAM );
163 <                int num_levels = 0;
164 <                for(int i = 1; i < 15; i++)
165 <                {
166 <                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
167 <                                num_levels++;
168 <
169 <                        }
170 <                }
171 <                logfile << "Exporting and moving...\n\n";
172 <                int total_steps =  8 + 2 * num_levels;
173 <                for(int i = 0; i < 15; i++)
174 <                {
175 <
176 <                        //printf(levels[i],"%d",levels[i]); // int to char array
177 <
178 <                        if (exists("../../GameDataFolder/level" + levels[i] + "_Final.dat")) {
179 <                                logfile << "level" << levels[i] << "_Final\n";
180 <                                logfile << "\tExporting level" << levels[i] << "_Final.dat\n";
181 <                                //printf(Step_x_x,"Step %d/%d: exporting level%d_final.dat", parts_done + 1,, levels[i]); setStatusArea((string)Step_x_x);
182 <                                setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " exporting level" + levels[i]+"_Final.dat");
183 <                                create_directory( "../GameDataFolder/level" + levels[i] + "_Final" );
184 <                                //                              setStatusArea(strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat");
185 <                                system((strOniSplit + " -export ../GameDataFolder/level" + levels[i] + "_Final ../../GameDataFolder/level" + levels[i] + "_Final.dat").c_str());
186 <                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final" );
187 <                                create_directory( "packages/VanillaDats/level" + levels[i] + "_Final/level" + levels[i] + "_Final" );
188 <
189 <                                directory_iterator end_iter;
190 <                                for ( directory_iterator dir_itr( "../GameDataFolder/level" + levels[i] + "_Final" ); dir_itr != end_iter; ++dir_itr )
191 <                                {
192 <                                        //cout << dir_itr->path().filename();
193 <                                        if ( is_regular_file( dir_itr->status() ) )
194 <                                        {
195 <                                                if ( dir_itr->path().filename().substr(0,8) == "TXMPfail" ||
196 <                                                        dir_itr->path().filename().substr(0,9) == "TXMPlevel" ||
197 <                                                        ( dir_itr->path().filename().substr(0,4) == "TXMP" && dir_itr->path().filename().find("intro")!=string::npos) ||
198 <                                                        dir_itr->path().filename().substr(0,4) == "TXMB" ||
199 <                                                        dir_itr->path().filename() == "M3GMpowerup_lsi.oni" ||
200 <                                                        dir_itr->path().filename() == "TXMPlsi_icon.oni" ||
201 <                                                        ( dir_itr->path().filename().substr(0,4) == "TXMB" && dir_itr->path().filename().find("splash_screen.oni")!=string::npos)       )
202 <                                                {
203 <                                                        cout <<dir_itr->path().filename() << "\n";
204 <                                                        create_directory( dir_itr->path().parent_path() / "NoGlobal");  
205 <                                                        if(!exists( dir_itr->path().parent_path() / "NoGlobal" / dir_itr->filename())) rename(dir_itr->path(), dir_itr->path().parent_path() / "NoGlobal" /
206 <                                                                dir_itr->filename());
207 <                                                        else remove(dir_itr->path());
208 <                                                }
209 <                                                else if (dir_itr->path().filename().substr(0,4) == "TRAC"
210 <                                                        || dir_itr->path().filename().substr(0,4) == "ONVL") {
211 <                                                                cout <<dir_itr->path().filename() << "\n";
212 <                                                                if(!exists( TRAC / dir_itr->filename())) rename(dir_itr->path(), TRAC / dir_itr->filename());
213 <                                                                else remove(dir_itr->path());
214 <                                                }
215 <                                                else if (dir_itr->path().filename().substr(0,4) == "TRAM") {
216 <                                                        cout <<dir_itr->path().filename() << "\n";
217 <                                                        if(!exists( TRAM / dir_itr->filename())) rename(dir_itr->path(), TRAM / dir_itr->filename());
218 <                                                        else remove(dir_itr->path());
219 <                                                }
220 <                                                else if (dir_itr->path().filename().substr(0,4) == "ONSK" ||
221 <                                                        dir_itr->path().filename().substr(0,4) == "TXMP") {
222 <                                                                cout <<dir_itr->path().filename() << "\n";\
223 <                                                                        create_directory( dir_itr->path().parent_path() / "TexFix");    
224 <                                                                if(!exists( Textures / dir_itr->filename())) rename(dir_itr->path(), Textures / dir_itr->filename());
225 <                                                                //rename(dir_itr->path(), dir_itr->path().parent_path() / "TexFix" / dir_itr->filename());
226 <                                                }
227 <                                                else if (dir_itr->path().filename().substr(0,4) == "ONCC"
228 <                                                        || dir_itr->path().filename().substr(0,4) == "TRBS"
229 <                                                        || dir_itr->path().filename().substr(0,4) == "ONCV"
230 <                                                        || dir_itr->path().filename().substr(0,4) == "TRMA"
231 <                                                        || dir_itr->path().filename().substr(0,4) == "TRSC"
232 <                                                        || dir_itr->path().filename().substr(0,4) == "TRAS") {
233 <                                                                cout <<dir_itr->path().filename() << "\n";
234 <                                                                if(!exists( Characters / dir_itr->filename())) rename(dir_itr->path(), Characters / dir_itr->filename());
235 <                                                                else remove(dir_itr->path());
236 <                                                }
237 <                                                else if (dir_itr->path().filename().substr(0,4) == "OSBD"
238 <                                                        || dir_itr->path().filename().substr(0,4) == "SNDD") {
239 <                                                                cout << dir_itr->path().filename() << "\n";
240 <                                                                if(!exists( Sounds / dir_itr->filename())) rename(dir_itr->path(), Sounds / dir_itr->filename());
241 <                                                                else remove(dir_itr->path());
242 <                                                }
243 <                                                else if (dir_itr->path().filename().substr(0,5) == "BINA3"
244 <                                                        || dir_itr->path().filename().substr(0,10) == "M3GMdebris"
245 <                                                        || dir_itr->path().filename() == "M3GMtoxic_bubble.oni"
246 <                                                        || dir_itr->path().filename().substr(0,8) == "M3GMelec"
247 <                                                        || dir_itr->path().filename().substr(0,7) == "M3GMrat"
248 <                                                        || dir_itr->path().filename().substr(0,7) == "M3GMjet"
249 <                                                        || dir_itr->path().filename().substr(0,9) == "M3GMbomb_"
250 <                                                        || dir_itr->path().filename() == "M3GMbarab_swave.oni"
251 <                                                        || dir_itr->path().filename() == "M3GMbloodyfoot.oni"
252 <                                                        ){
253 <                                                                cout <<dir_itr->path().filename() << "\n";
254 <                                                                if(!exists( Particles / dir_itr->filename())) rename(dir_itr->path(), Particles / dir_itr->filename());
255 <                                                                else remove(dir_itr->path());
256 <                                                }
257 <                                                else if (dir_itr->path().filename().substr(0,4) == "AGDB"
258 <                                                        || dir_itr->path().filename().substr(0,4) == "TRCM") {
259 <                                                                cout <<dir_itr->path().filename() << "\n";
260 <
261 <                                                                if(!exists( Archive / dir_itr->filename())) rename(dir_itr->path(), Archive / dir_itr->filename());
262 <                                                                else remove(dir_itr->path());
263 <                                                }
264 <                                                if (exists(dir_itr->path())) {
265 <
266 <                                                }
267 <                                                else {
268 <                                                        //logfile << "\tMoved file: " << dir_itr->path().filename() << "\n";
269 <                                                }
270 <                                        }
271 <
272 <
273 <
274 <                                }
275 <                                logfile << "\tCleaning up TXMPs...\n";
276 <                                system( (strOniSplit + " -move:delete " + Textures.string() + " ../GameDataFolder/level" + levels[i] + "_Final/TXMP*.oni").c_str());
277 <                                parts_done++;
278 <
279 <                                setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
280 <
281 <                        }
282 <                }
283 <                logfile << "Reimporting levels\n";
284 <                for (int i = 0; i < 15; i++)
285 <                {
286 <                        logfile << "\tReimporting level" << levels[i] << "_Final.oni\n";
287 <                        //printf(levels[i],"%d",levels[i]);
288 <                        //printf(Step_x_x,"Step %d/%d: reimporting level", parts_done + 1, 7 + 2 * num_levels); setStatusArea((string)Step_x_x + levels[i] + (string)"_Final.dat");
289 <                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + " reimporting level" + levels[i]+"_Final.oni");
290 <                        logfile << (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final packages/VanillaDats/level" + levels[i] + "_Final/level"
291 <                                + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize.log").c_str() << '\n';
292 <                        string sys_str = (strOniSplit + " " + strImportOption + " ../GameDataFolder/level" + levels[i] + "_Final packages/VanillaDats/level" + levels[i] + "_Final/level"
293 <                                + levels[i] + "_Final/level" + levels[i] + "_Final.oni >> Globalize2.log");
294 <                                system(sys_str.c_str() );
295 <                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
296 <                        parts_done++;
297 <                }
298 <                create_directory( VanillaCharacters.parent_path() );
299 <                create_directory( VanillaParticles.parent_path() );
300 <                create_directory( VanillaTextures.parent_path() );
301 <                create_directory( VanillaSounds.parent_path() );
302 <                create_directory( VanillaAnimations.remove_filename() );
303 <
304 <                for(int j = 0; j < GDFPaths.size(); j++) {
305 <                        logfile << "\tReimporting " << GDFPaths[j].filename() << ".oni\n";
306 <                        setStatusArea("Step " + lexical_cast<std::string>(parts_done + 1) + "/" + lexical_cast<std::string>(total_steps) + ": reimporting " + GDFPaths[j].filename() );
307 <                        system((strOniSplit + " " + strImportOption + " " + GDFPaths[j].string() + " " + VanillaPaths[j].string()).c_str());
308 <                        parts_done++;
309 <                        setProgressBar( (int)(1000 * (float)(parts_done) / (float)(total_steps) ));
310 <                }
311 <                /*
312 <                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) ));
313 <                system((strOniSplit + " " + strImportOption + " " + Characters.string() + " " + VanillaCharacters.string()).c_str());
314 <                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) ));
315 <                system((strOniSplit + " " + strImportOption + " " + Particles.string() + " " + VanillaParticles.string()).c_str());
316 <                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) ));
317 <                system((strOniSplit + " " + strImportOption + " " + Textures.string() + " " + VanillaTextures.string()).c_str());
318 <                //system((strOniSplit   + " " + strImportOption + (string)" " + Animations.string() + (string)" " + VanillaAnimations.string()).c_str());
319 <                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) ));
320 <                system((strOniSplit + " " + strImportOption + " " + TRAC.string() + " " + VanillaTRAC.string()).c_str());
321 <                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) ));
322 <                system((strOniSplit + " " + strImportOption + " " + Sounds.string() + " " + VanillaSounds.string()).c_str());
323 <                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) ));
324 <                system((strOniSplit + " " + strImportOption + " " + TRAM.string() + " " + VanillaTRAM.string()).c_str());
325 <                //parts_done++; setStatusArea((string)"Copying level scripts...");setProgressBar( (int)(1000 * (float)(parts_done) / (float)(7 + 2 * num_levels) ));
326 <                if (exists("../GameDataFolder/IGMD")) remove_all("../GameDataFolder/IGMD");
327 <                */
328 <                create_directory((path)"../GameDataFolder/IGMD");
329 <                copy((path)"packages/VanillaBSL/IGMD", (path)"../GameDataFolder");
330 <                setProgressBar( 1000 );
331 <                
332 <                // 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/
333 <                
334 <                // CIP:then copy persist.dat and keyconfig.txt into edition/ as well
335 <                
336 < #ifndef WIN32
337 <                /* 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).
338 <                   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,
339 <                   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 */
340 <                path fullAEpath = system_complete("."); // get full path for Installer
341 <                char prefsCommand[300] = "defaults write com.godgames.oni RetailInstallationPath -string '";
342 <                strcat(prefsCommand, fullAEpath.parent_path().parent_path().string().c_str()); // get path of edition/ folder (Oni wants the folder that *contains* the GDF)
343 <                strcat(prefsCommand, "'"); // path string is enclosed in single quotes to avoid the need to escape UNIX-unfriendly characters
344 <                system(prefsCommand);
345 <                
13 > #include <windows.h>
14 > #include <shobjidl.h>
15 > HWND Handle;
16 > ITaskbarList *pTaskbarList;
17 > ITaskbarList3 *pTaskbarList3;
18   #endif
347                
348                setStatusArea((string)"Done! Now select your mod packages and click install.");
349                //      while(1) Sleep(-1);
350
351        }
352        catch (exception ex) {
353                setStatusArea("Warning, handled exception: " + (string)ex.what());
354        }
355
356        ptime end_time(second_clock::local_time());
357        time_period total_time (start_time, end_time);
358        logfile << "\n\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
359        //total_time.length().hours();
360        logfile.close();
361        busy = 0;
362        return err;
363 }
364
365
366 vector<ModPackage> getPackages(void)
367 {
368        vector<ModPackage> packages;
369        packages.reserve(65536); // come on, we shouldn't need this much space...right?!
370        fstream file;
371        string filename = "\0";
372        string MODINFO_CFG = "Mod_Info.cfg";
373
374        try
375        {
376                directory_iterator end_iter;
377                for (directory_iterator dir_itr("./packages"); dir_itr != end_iter; ++dir_itr)
378                {
379                        file.open((dir_itr->path().string() + "/" + MODINFO_CFG).c_str());
380                        //cout << filename << "\n";
381
382                        if(!file.fail())
383                        {
384                                //cout << dir_itr->path().string() + MODINFO_CFG;
385                                //would prefer to push a pointer to a package, but this will do for now
386                                packages.push_back(fileToModPackage(file));
387                        }      
388                        file.close();
389                        file.clear();
390                }
391                sort(packages.begin(), packages.end());
392        }
393        catch (const std::exception & ex)
394        {
395                cout << "Warning, something odd happened!\n";
396        }
397
398        return packages;
399 }
400
401 ModPackage fileToModPackage(fstream &file)
402 {
403        /*
404        This converts a file to a ModPackage struct.
405
406        A few notes...
407        "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.
408        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
409        slower than reading a variable.
410        */
411        ModPackage package;
412        string line;
413        static string NameOfMod = "NameOfMod";  //used for comparing to the current token...
414        //I could have done it in reverse (*iter).compare("ModString") or  
415        static string ARROW = "->";                             //did something like "ModString".compare(*iter), and it would have been
416        static string ModString = "ModString";  //functionably the same.
417        static string HasOnis = "HasOnis";
418        static string HasDeltas = "HasDeltas";
419        static string HasBSL = "HasBSL";
420        static string HasDats = "HasDats";
421        static string IsEngine = "IsEngine";
422        static string Readme = "Readme";
423        static string GlobalNeeded = "GlobalNeeded";
424        static string Category = "Category";
425        static string Creator = "Creator";
426        while (! file.eof() )
427        {
428                getline (file,line);
429                vector<string> tokens;
430                vector<string>::iterator iter;
431                tokenize(line, tokens);                                 //string to vector of "words"
432                if (tokens.capacity() >= 2) {                   //make sure they are using enough stuff
433                        iter = tokens.begin();                          //what word we are on, starts at first word
434                        /*
435                        if (!AEInstallVersion.compare(*iter))
436                        If mod is too old, skip this mod.
437                        */
438                        /*else*/if (!NameOfMod.compare(*iter))  {       //if it contains the name
439                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
440                                        if (ARROW.compare(*iter) && NameOfMod.compare(*iter)) {                 //ignores "->" and "NameOfMod"
441                                                //cout << *iter;
442                                                //cout << " ";
443                                                package.name += *iter + " ";
444                                        }
445                                }
446
447                        }
448                        else if (!ModString.compare(*iter)) {
449                                iter++; iter++;
450                                package.modStringName = *iter;
451                                iter++;
452                                package.modStringVersion = atoi((*iter).c_str());
453                        }
454                        else if (!HasOnis.compare(*iter)) {
455                                iter++; iter++;  
456                                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
457                                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,
458                                        iter++; iter++;}  // using "YFR" would probably set it off. :<
459
460                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasBSL = 1;
461                        }
462                        else if (!HasDeltas.compare(*iter)) {
463                                iter++; iter++;  
464                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDeltas = 1;
465                        }
466                        else if (!HasDats.compare(*iter)) {
467                                iter++; iter++;  
468                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.hasDats = 1;
469                        }
470                        else if (!IsEngine.compare(*iter)) {
471                                iter++; iter++;  
472                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.isEngine = 1;
473                        }
474                        else if (!GlobalNeeded.compare(*iter)) {
475                                iter++; iter++;  
476                                if (toupper((*iter)[0]) + toupper((*iter)[1]) + toupper((*iter)[2]) == 'Y' + 'E' + 'S') package.globalNeeded = 1;
477                                else if (toupper((*iter)[0]) + toupper((*iter)[1]) == 'N' + 'O') package.globalNeeded = 1; //Really the only place where checking for "No" is important atm.
478                        }
479                        else if (!Category.compare(*iter))  {  
480                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
481                                        if (ARROW.compare(*iter) && Category.compare(*iter)) {                  //ignores "->" and "Category"
482                                                //cout << *iter;
483                                                //cout << " ";
484                                                package.category += *iter + " ";
485                                        }
486                                }
487                        }
488                        else if (!Creator.compare(*iter))  {    //if it contains the name
489                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
490                                        if (ARROW.compare(*iter) && Creator.compare(*iter)) {                   //ignores "->" and "Category"
491                                                //cout << *iter;
492                                                //cout << " ";
493                                                package.creator += *iter + " ";
494                                        }
495                                }
496                        }
497                        else if (!Readme.compare(*iter))  {     //if it contains the name
498                                for ( ; iter !=tokens.end() && SLASHSLASH.compare(*iter); iter++) {     //interates through the words, ends if it reaches the end of the line or a "//" comment
499                                        if (ARROW.compare(*iter) && Readme.compare(*iter)) {                    //ignores "->" and "Category"
500                                                if(!(*iter).compare("\\n")) package.readme += '\n';
501                                                else package.readme += *iter + " ";
502                                        }
503                                }
504                        }
505                }
506
507        }
508        package.doOutput();
509        return package;
510 }
511
512 void recompileAll(vector<string> installedMods)
513 {
514        busy = 1;
515        using namespace boost::gregorian;
516        using namespace boost::posix_time;
517        using boost::lexical_cast;
518        using boost::bad_lexical_cast;
519        
520        setStatusArea("Importing levels...");
521        //setStatusArea("Recompiling Data...");
522        path vanilla_dir = "./packages/VanillaDats/";
523        string importCommand = "";
524        char statusString[128];
525        int numberOfDats = 0;
526        int j = 1;
527        string datString;
528        std::stringstream out;
529
530        ptime start_time(second_clock::local_time());
531        clearOldDats();
532        remove("Install.log");
533        ofstream logfile("Install.log");
534        logfile << "Mod Installation started " << to_simple_string(start_time) << endl;
535        logfile.close();
536        if(splitInstances == SPLIT){
537                recursive_directory_iterator end_iter;
538
539                for ( recursive_directory_iterator dir_itr( vanilla_dir );
540                        dir_itr != end_iter;
541                        ++dir_itr )
542                {
543                        try{
544                                if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
545                                {
546                                        numberOfDats++;
547                                }
548                        }
549                        catch(exception ex) {
550
551                        }
552                }
553
554                //recursive_directory_iterator end_iter;
555
556
557                out << numberOfDats;
558                datString = out.str();
559                try {
560                        for ( recursive_directory_iterator dir_itr( vanilla_dir );
561                                dir_itr != end_iter;
562                                ++dir_itr )
563                        {
564                                try
565                                {
566                                        if ( is_directory( dir_itr->status() ) &&  dir_itr.level() == 1)
567                                        {
568                                                importCommand = strOniSplit + " " + strImportOption + " " + dir_itr->path().parent_path().string() + '/' + dir_itr->path().filename();
569                                                for (int i = 0; i < installedMods.size(); ++i) {
570                                                        if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename()  ))
571                                                                importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().parent_path().filename() + '/' + dir_itr->path().filename();
572
573                                                        //else cout << " packages/VanillaDats/" + installedMods[i] + "/oni/";
574                                                }
575                                                importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
576
577                                                
578                                                setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
579                                                setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
580
581                                                system(importCommand.c_str());
582                                                //Sleep(1000);
583                                                //cout << importCommand << "\n";
584                                                j++;
585
586                                        }
587                                }
588                                catch ( const std::exception & ex )
589                                {
590
591                                        remove("Install.log");
592                                        ofstream logfile("Install.log");
593
594
595                                        logfile << "Warning, exception " << ex.what() << "!";
596                                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
597                                        logfile.close();        
598                                }
599                        }
600
601                }
602                catch( const std::exception & ex ) {
603
604                        remove("Install.log");
605                        ofstream logfile("Install.log");
606
607
608                        logfile << "Warning, exception " << ex.what() << "!";
609                        setStatusArea("Warning, exception " + (string)ex.what() + "!");
610                        logfile.close();
611                }
612
613        }
614        else if(splitInstances == NOT_SPLIT){
615                directory_iterator end_iter;
616
617                for ( directory_iterator dir_itr( vanilla_dir );
618                        dir_itr != end_iter;
619                        ++dir_itr )
620                {
621
622                        if ( is_directory( dir_itr->status() ) )
623                        {
624                                numberOfDats++;
625                        }
626
627
628                }
629
630                out << numberOfDats;
631                datString = out.str();
632
633                for ( directory_iterator dir_itr( vanilla_dir );
634                        dir_itr != end_iter;
635                        ++dir_itr )
636                {
637                        try
638                        {
639                                if ( is_directory( dir_itr->status() ) )
640                                {
641                                        importCommand = strOniSplit + " " + strImportOption + " " + vanilla_dir.string() + dir_itr->path().filename() + " ";
642                                        for (int i = 0; i < installedMods.size(); ++i) {
643                                                if (exists("packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename()  ))
644                                                        importCommand += " packages/" + installedMods[i] + "/oni/" + dir_itr->path().filename();
645                                        }
646                                        importCommand += " ../GameDataFolder/" + dir_itr->path().filename() + ".dat >> Install.log";
647
648
649                                        setProgressBar( (int)(1000 * (float)(j-1) / (float)numberOfDats) ); //100% * dat we're on / total dats
650                                        setStatusArea("Step " + lexical_cast<std::string>(j) + '/' + lexical_cast<std::string>(numberOfDats)+ ": Importing " +  dir_itr->path().filename() + " ");
651
652                                        system(importCommand.c_str());
653
654                                        j++;
655                                }
656                        }
657                        catch ( const std::exception & ex )
658                        {
659
660                                remove("Install.log");
661                                ofstream logfile("Install.log");
662
663
664                                logfile << "Warning, exception " << ex.what() << "!";
665                                setStatusArea("Warning, exception " + (string)ex.what() + "!");
666                                logfile.close();
667                        }}
668        }
669        logfile << "Writing config file";
670        writeInstalledMods(installedMods);
671        setProgressBar(1000);
672        setStatusArea("Done! You can now play Oni.");
673
674        ptime end_time(second_clock::local_time());
675        time_period total_time (start_time, end_time);
676
677
678        ofstream logfile2("Install.log", ios::app | ios::ate);
679        string outstring = (string)"\n\nGlobalization ended " + to_simple_string(end_time) + "\nThe process took ";// + (string)total_time.length();
680
681        logfile2 << "\nGlobalization ended " << to_simple_string(end_time) << "\nThe process took " << total_time.length();
682
683        //logfile2.write(outstring.c_str(), outstring.length());
684        logfile2.close();
685
686        //total_time.length().hours();
687
688        Sleep(1000);
689        setProgressBar(0);
690        busy = 0;
691 }
692
693 void writeInstalledMods(vector<string> installedMods)
694 {
695
696        if ( exists( strInstallCfg ) )
697        {
698                remove( strInstallCfg );
699        }
700
701        ofstream file(strInstallCfg.c_str());
702
703        vector<string>list = installedMods;
704        vector<string>::iterator begin_iter = list.begin();
705        vector<string>::iterator end_iter = list.end();
706
707        sort( list.begin(), list.end() );
708
709        for( ; begin_iter != end_iter; ++begin_iter) {
710                file << *begin_iter << " ";
711        }
712
713        file.close();
714        file.clear();
715
716 }
717
718 vector<string> getInstallString(string Cfg)
719 {
720        //system(strPauseCmd);
721        vector<string> returnval;
722
723        string line;
724        fstream file;
725
726        if (exists( Cfg ))
727        {
728                file.open(Cfg.c_str());
729                getline(file, line);
730                tokenize(line, returnval);
731                file.close();
732                file.clear();
733                sort(returnval.begin(), returnval.end());
734        }
735        else cout << "fail";
19  
737        return returnval;
738 }
739
740 //stolen token function...
741 void tokenize(const string& str, vector<string>& tokens, const string& delimiters)
742 {
743        // Skip delimiters at beginning.
744        string::size_type lastPos = str.find_first_not_of(delimiters, 0);
745        // Find first "non-delimiter".
746        string::size_type pos     = str.find_first_of(delimiters, lastPos);
747
748        while (string::npos != pos || string::npos != lastPos)
749        {
750                // Found a token, add it to the vector.
751                tokens.push_back(str.substr(lastPos, pos - lastPos));
752                // Skip delimiters.  Note the "not_of"
753                lastPos = str.find_first_not_of(delimiters, pos);
754                // Find next "non-delimiter"
755                pos = str.find_first_of(delimiters, lastPos);
756        }
757 }
758
759 void clearOldDats(void) {
760        directory_iterator end_iter_gdf;
761        for ( directory_iterator dir_itr_gdf( "../GameDataFolder" );
762                dir_itr_gdf != end_iter_gdf;
763                ++dir_itr_gdf )
764        {
765                //cout << dir_itr_gdf->path().extension() << "\n";
766                if ( dir_itr_gdf->path().extension() == ".dat" || dir_itr_gdf->path().extension() == ".raw" || dir_itr_gdf->path().extension() == ".sep" ) {
767                        remove( dir_itr_gdf->path() );
768                }
769
770        }
771
772 }
773
774 vector<string> globalInstalledMods;
775 vector<ModPackage> globalPackages;
776 #include "boost/thread.hpp"
20   #include <boost/thread/mutex.hpp>
778
779 /////////////////////////////////////////////////////////////////////////////
780 // Name:        main_window.cpp
781 // Purpose:    
782 // Author:      
783 // Modified by:
784 // Created:     07/05/2009 20:38:25
785 // RCS-ID:      
786 // Copyright:  
787 // Licence:    
788 /////////////////////////////////////////////////////////////////////////////
789
21   // For compilers that support precompilation, includes "wx/wx.h".
22   #include "wx/wxprec.h"
23  
# Line 800 | Line 31 | vector<ModPackage> globalPackages;
31  
32   ////@begin includes
33   #include "about.h"
803 ////@end includes
804
34   #include "main_window.h"
35 + #include "installer.h"
36 + ////@end includes
37  
38   ////@begin XPM images
39   #include "aelogosmall.xpm"
# Line 812 | Line 43 | vector<ModPackage> globalPackages;
43   #include "quit.xpm"
44   ////@end XPM images
45  
46 < //#define wxDebug 1;
47 < //#define wxUSE_UNICODE 1;
46 > bool busy = false;
47 > vector<string> globalInstalledMods;
48 > vector<ModPackage> globalPackages;
49 > // Variable declarations
50 > #ifdef WIN32
51 > bool splitInstances = true;
52 > string strImportOption = "-import:nosep";
53 > string strOniSplit = "Onisplit.exe";
54 > #else
55 > bool splitInstances = false;
56 > string strImportOption = "-import:sep";
57 > string strOniSplit = "mono Onisplit.exe";
58 > #endif
59  
60   /*
61   * MainWindow type definition
# Line 897 | Line 139 | bool MainWindow::Create( wxWindow* paren
139          return true;
140   }
141  
900
142   /*
143   * MainWindow destructor
144   */
# Line 908 | Line 149 | MainWindow::~MainWindow()
149          ////@end MainWindow destruction
150   }
151  
911
152   /*
153   * Member initialisation
154   */
# Line 933 | Line 173 | void MainWindow::Init()
173      CompleteRadio = NULL;
174      ReglobalizeButton = NULL;
175          ////@end MainWindow member initialisation
936
176   }
177  
939
178   /*
179   * Control creation for MainWindow
180   */
# Line 973 | Line 211 | void MainWindow::CreateControls()
211      wxMenu* itemMenu42 = new wxMenu;
212      itemMenu42->Append(wxID_OPTIONS, _("Show Advanced Options..."), wxEmptyString, wxITEM_CHECK);
213      menuBar->Append(itemMenu42, _("Options"));
214 <    wxMenu* itemMenu44 = new wxMenu;
215 <    itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
216 <    menuBar->Append(itemMenu44, _("Help"));
214 > //#ifdef WIN32
215 > //      itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
216 > //      menuBar->Append(itemMenu44, _("Help"));
217 > //#else
218 >        itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
219 > //#endif        
220 >
221      itemFrame1->SetMenuBar(menuBar);
222  
223      wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
# Line 1041 | Line 283 | void MainWindow::CreateControls()
283      StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 );
284      StatusArea->SetName(_T("StatusArea"));
285      StatusArea->SetFieldsCount(1);
286 <    StatusArea->SetStatusText(_("AE Installer v1.0"), 0);
286 >        string versionText = "AE Installer v" + (string)INSTALLER_VERSION;
287 >    StatusArea->SetStatusText(versionText.c_str(), 0);
288      itemBoxSizer2->Add(StatusArea, 0, wxGROW|wxALL, 0);
289  
290      wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxHORIZONTAL);
# Line 1107 | Line 350 | void MainWindow::CreateControls()
350      // Connect events and objects
351      Mods_CheckboxList->Connect(Mods_CheckboxList1, wxEVT_CREATE, wxWindowCreateEventHandler(MainWindow::ModList_OnCreate), NULL, this);
352          ////@end MainWindow content construction
353 <
354 <        if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) {
355 <                strImportOption = "-import:sep";
356 <                splitInstances = NOT_SPLIT;
357 <        }
1115 <        else {
1116 <                strImportOption = "-import:nosep";
1117 <                splitInstances = SPLIT;
1118 <        }
1119 <
353 > #ifdef WIN32
354 >        Handle = (HWND)GetHWND();
355 >        ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
356 > #endif
357 >        
358          globalPackages = getPackages();
359          globalInstalledMods = getInstallString();
360 <        for (int i = 0; i < globalPackages.size(); i++) {
360 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
361                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
362                  if( binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
363          }
# Line 1128 | Line 366 | void MainWindow::CreateControls()
366          TheInstallButton = InstallButton;
367          TheProgressBar = ProgressBar;
368          OptionsPanel->Hide();
369 <        if(splitInstances == SPLIT) SeperatedRadio->SetValue(true);
369 >        
370 >        if(splitInstances) SeperatedRadio->SetValue(true);
371          else CompleteRadio->SetValue(true);
1133
1134
1135
372          if(strImportOption == "-import:nosep") NoSepRadio->SetValue(true);
373          else SepRadio->SetValue(true);
374  
1139
375   #ifdef WIN32
376          RedirectIOToConsole();
377          HWND hWnd = GetConsoleWindow();
378          ShowWindow( hWnd, SW_HIDE );
379   #endif
1145
1146        //MainWindow::SetSize(MainWindow::GetRect().GetWidth(), MainWindow::GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight() );
380   }
381  
1149
382   /*
383   * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for SelectAll_Checkbox
384   */
# Line 1155 | Line 387 | void MainWindow::OnSelectAllCheckboxClic
387   {
388          switch(SelectAll->Get3StateValue()) {
389          case wxCHK_UNCHECKED:
390 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1159 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
390 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
391                  break;
392          case wxCHK_CHECKED:
393 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
1163 <                //SelectAll->Set3StateValue(wxCHK_UNCHECKED);
393 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
394                  break;
395          case wxCHK_UNDETERMINED:
396 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1167 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
396 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
397                  break;
1169
398          }
1171
399   }
400  
1174
401   /*
402   * wxEVT_CREATE event handler for Mods_CheckboxList
403   */
# Line 1179 | Line 405 | void MainWindow::OnSelectAllCheckboxClic
405   void MainWindow::ModList_OnCreate( wxWindowCreateEvent& event )
406   {
407  
1182
408   }
409  
410  
# Line 1231 | Line 456 | wxBitmap MainWindow::GetBitmapResource(
456  
457   wxIcon MainWindow::GetIconResource( const wxString& name )
458   {
1234
459          // Icon retrieval
460          ////@begin MainWindow icon retrieval
461      wxUnusedVar(name);
# Line 1244 | Line 468 | wxIcon MainWindow::GetIconResource( cons
468          ////@end MainWindow icon retrieval
469   }
470  
1247
471   /*
472   * wxEVT_COMMAND_LISTBOX_SELECTED event handler for Mods_CheckboxList1
473   */
474  
475   void MainWindow::OnModsCheckboxList1Selected( wxCommandEvent& event )
476   {
1254        //event.GetSelection
477          titleText->SetValue(globalPackages[event.GetSelection()].name.c_str());
478          creatorText->SetValue(globalPackages[event.GetSelection()].creator.c_str());
479          descriptionText->SetValue(globalPackages[event.GetSelection()].readme.c_str());
1258
1259        //creatorText->Refresh();
480   }
481  
1262
482   /*
483   * wxEVT_COMMAND_CHECKLISTBOX_TOGGLED event handler for Mods_CheckboxList1
484   */
# Line 1293 | Line 512 | void MainWindow::OnOptionsClick( wxComma
512                  
513                  this->SetSize(this->GetRect().GetWidth(), this->GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight());}
514          else {
515 < //              Uncomment this when we release, it gets annoying if you are testing globalization a lot ;)
1297 <                wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: These options are for advanced users only, use with caution.",
515 >                wxMessageDialog* YesNoDialog = new wxMessageDialog(this, "WARNING: These options are for advanced users only, use with caution.",
516                                                                                                                     "AE Installer Alert",  wxOK | wxICON_EXCLAMATION     , wxDefaultPosition);
517                  YesNoDialog->ShowModal();
518                  OptionsPanel->Show();
# Line 1303 | Line 521 | void MainWindow::OnOptionsClick( wxComma
521          }
522   }
523  
1306
524   /*
525   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
526   */
# Line 1313 | Line 530 | void MainWindow::OnExitClick( wxCommandE
530          exit(0);
531   }
532  
1316
533   /*
534   * wxEVT_COMMAND_BUTTON_CLICKED event handler for Install_Button
535   */
536  
1321
537   struct recompile
538   {
539          recompile(vector<string> localPackages) : thePackages(localPackages) { }
# Line 1327 | Line 542 | struct recompile
542                  TheInstallButton->Disable();
543                  recompileAll(thePackages);
544                  TheInstallButton->Enable();
545 +                
546          }
1331
547          vector<string> thePackages;
548   };
549  
550 + void globalize2(void) {
551 +                TheInstallButton->Disable();
552 +                globalizeData();
553 +                TheInstallButton->Enable();
554 + }
555 +
556   void MainWindow::OnInstallButtonClick( wxCommandEvent& event )
557   {
1337
558          vector<string> localPackages;
559 <        localPackages.push_back("Globalize");
560 <        for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
559 >        localPackages.push_back("00000Globalize");
560 >        for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
561          if ( !localPackages.empty() )   {
562 <        
563 <                //MainWindow::MainWindow().Hide();      
1344 <                //      boost::thread thrd2(recompileAll(localPackages) );
1345 <                //MainWindow::MainWindow().Show();
562 >                sort(localPackages.begin(), localPackages.end());
563 >                localPackages[0] = "Globalize";
564                  this->InstallButton->Disable();
565                  this->ReglobalizeButton->Disable();
566   #ifdef WIN32
# Line 1351 | Line 569 | void MainWindow::OnInstallButtonClick( w
569   #else
570                  recompileAll(localPackages);
571   #endif
1354
572                  this->InstallButton->Enable();
573                  this->ReglobalizeButton->Enable();
574          }
1358
1359
575   }
576  
577 < /*void setStatusArea( string s ) {
578 < //TheStatusBar = MainWindow::StatusArea;
579 < (**TheStatusBar).SetStatusText(_(s.c_str()), 0);
580 <
581 < //MainWindow::MainWindow().SetSize(MainWindow::MainWindow().GetRect().GetWidth(), MainWindow::MainWindow().GetRect().GetHeight()+1);
582 <
583 < //MainWindow::StatusBar->SetLabel("Importing Files...");
584 < //StatusBar->SetLabel(s);
585 < //->SetLabel(s);
586 <
587 < }*/
588 <
1374 < void setProgressBar( int i ) {
1375 <        //TheProgressBar->SetValue(
1376 <
577 > void setProgressBar( int i )
578 > {
579 > #ifdef WIN32
580 > if (SUCCEEDED(pTaskbarList->QueryInterface(IID_ITaskbarList3, (void **)&pTaskbarList3)))
581 > {
582 >        pTaskbarList3->SetProgressValue(Handle,i, 1000);
583 >        if ( i == 0 )
584 >        {
585 >                pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
586 >        }
587 > }
588 > #endif
589          TheProgressBar->SetValue(i);
1378
590   }
591  
1381
592   /*
593   * wxEVT_UPDATE_UI event handler for ID_STATUSBAR
594   */
# Line 1391 | Line 601 | void MainWindow::OnStatusbarUpdate( wxUp
601          ////@end wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
602   }
603  
1394
604   /*
605   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT
606   */
# Line 1400 | Line 609 | void MainWindow::OnAboutClick( wxCommand
609   {
610          ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
611      // Before editing this code, remove the block markers.
612 +        // TODO: Make About window work again!
613      About* window = new About(this);
1404    int returnValue = window->ShowModal();
614      window->Destroy();
615          ////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
616   }
617  
1409
618   /*
619   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for NoSep_RadioButton
620   */
# Line 1416 | Line 624 | void MainWindow::OnNoSepRadioButtonSelec
624          static_cast<string>("-import:nosep");
625   }
626  
1419
627   /*
628   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Sep_RadioButton
629   */
# Line 1426 | Line 633 | void MainWindow::OnSepRadioButtonSelecte
633          static_cast<string>("-import:sep");
634   }
635  
1429
636   /*
637   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
638   */
# Line 1437 | Line 643 | void MainWindow::OnSepRadioButtonSelecte
643  
644   void MainWindow::OnCompleteRadioButtonSelected( wxCommandEvent& event )
645   {
646 <        splitInstances = NOT_SPLIT;
1441 <
646 >        splitInstances = false;
647   }
648  
1444
649   /*
650   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BITMAPBUTTON
651   */
# Line 1451 | Line 655 | void MainWindow::OnRefreshButtonClick( w
655          refreshMods(globalInstalledMods);
656   }
657  
1454
658   /*
659   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_LOAD
660   */
661  
662 <
663 <
664 <
1462 < void MainWindow::refreshMods (vector<string> s) {
1463 <
662 > // TODO: Make refreshMods actually refresh the list in the window of available mods so we can see any new package info and deleted mods are removed from the list
663 > void MainWindow::refreshMods (vector<string> s)
664 > {
665          Mods_CheckboxList->Clear();
666 <        //globalInstalledMods = getPackages();
1466 <        for (int i = 0; i < globalPackages.size(); i++) {
666 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
667                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
668 <                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
669 <                //else Mods_CheckboxList->Check(i,0);
1470 <
668 >                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) )
669 >                        Mods_CheckboxList->Check(i);
670          }
671   }
672  
# Line 1487 | Line 686 | void MainWindow::OnLoadClick( wxCommandE
686          {
687                  refreshMods(getInstallString( string(openFileDialog->GetPath()) ));
688          }
1490
1491
689   }
690  
1494
691   /*
692   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_SAVE
693   */
# Line 1510 | Line 706 | void MainWindow::OnSaveClick( wxCommandE
706  
707          if ( openFileDialog->ShowModal() == wxID_OK )
708          {
1513
1514
1515                //Mods_CheckboxList->
1516
1517
1518
1519                //
1520
709                  if ( exists( openFileDialog->GetPath().c_str() ) )
710                  {
711                          remove( openFileDialog->GetPath().c_str() );
# Line 1526 | Line 714 | void MainWindow::OnSaveClick( wxCommandE
714                  ofstream file(openFileDialog->GetPath().c_str());
715  
716                  vector<string>list;
717 <                for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
717 >                for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
718                  vector<string>::iterator begin_iter = list.begin();
719                  vector<string>::iterator end_iter = list.end();
720  
# Line 1538 | Line 726 | void MainWindow::OnSaveClick( wxCommandE
726  
727                  file.close();
728                  file.clear();
1541
1542                //SetCurrentFilename(openFileDialog->GetFilename());
1543                //theText->LoadFile(openFileDialog->GetFilename());
1544                //SetStatusText(GetCurrentFilename(), 0);
1545                //SetStatusText(openFileDialog->GetDirectory(),1);
729          }
730   }
731  
1549
1550
732   /*
733   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ReGlobalize_Button
734   */
735  
736   void MainWindow::OnReGlobalizeButtonClick( wxCommandEvent& event )
737   {
738 <        wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data. \n Are you SURE you want to do this? ", "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION    , wxDefaultPosition);
739 <
740 <        if (YesNoDialog->ShowModal() == wxID_NO) { //if the user said no...
738 >        string YesNoMsg = "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data.\n";
739 >        YesNoMsg = YesNoMsg + "Are you SURE you want to do this?";
740 >        wxMessageDialog* YesNoDialog = new wxMessageDialog(this, YesNoMsg.c_str(), "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition);
741  
742 +        if (YesNoDialog->ShowModal() == wxID_NO)
743 +        {
744 +                //if the user said no...
745          }
746 <        else {
747 <        
746 >        else
747 >        {
748                  this->InstallButton->Disable();
749                  this->ReglobalizeButton->Disable();
1566
750   #ifdef WIN32
1568
751                  boost::thread thrd2(globalizeData);
752                  //globalizeData();
753                  //boost::thread::create_thread(&globalizeData);
# Line 1574 | Line 756 | void MainWindow::OnReGlobalizeButtonClic
756   #else
757                  globalizeData();
758   #endif
1577                
759                  this->InstallButton->Enable();
760                  this->ReglobalizeButton->Enable();
761          }
1581
762   }
763   /*
764   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
765   */
766  
1587 /*void MainWindow::OnSeparatedRadioButtonSelected( wxCommandEvent& event )
1588 {
1589 ////@begin wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1590 // Before editing this code, remove the block markers.
1591 event.Skip();
1592 ////@end wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton in MainWindow.
1593 }*/
1594
1595
767   /*
768   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Seperated_RadioButton
769   */
770  
771   void MainWindow::OnSeperatedRadioButtonSelected( wxCommandEvent& event )
772   {
773 < splitInstances = SPLIT;
773 >        splitInstances = true;
774   }
1604

Diff Legend

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