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

Diff Legend

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