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

# Line 1 | Line 1
1 < /*
2 < AE/Mod Installer
3 < by Gumby and Iritscen
4 < */
5 <
6 < // To-do: - Load credits from text resource file
7 < //                - Institute lots of checks into file-handling
8 < //                - Clear mod info fields when mod is de-selected
9 <
10 < #define DEBUG
11 < #include <stdio.h>
12 < //#include <conio.h>
13 < //#include <process.h>
14 < #include <string>
15 < #include <iostream>
16 < #include <cctype>
17 < #include <vector>
18 < #include <fstream>
19 < #include <errno.h>
20 < #include <sstream>
21 <
22 < #include "boost/filesystem.hpp" // includes all needed Boost.Filesystem declarations
23 < #include "boost/lexical_cast.hpp" //int -> string
24 < #include "installer.h"
1 > /***************************************************************************\
2 > | Project: AE Installer                                                                                                         |
3 > | By: Gumby & Iritscen                                                                                                          |
4 > | File: Main_Window.cpp                                                                                                         |
5 > | Function: Handles the GUI.                                                                                            |
6 > | Created: 07/05/2009 20:38:25                                                                                          |
7 > \***************************************************************************/
8  
9 < #ifdef WIN32
10 < #include <windows.h>
28 < #else // assume we're on Mac
29 < #include <stdlib.h>
30 < #include <dirent.h>
9 > #ifndef NTDDI_VERSION          
10 > #define NTDDI_VERSION NTDDI_WIN7
11   #endif
32
33 //const string strInstallerVersion = "1.0";
34 const bool SPLIT = 1;
35 const bool NOT_SPLIT = 0;
36 bool splitInstances = SPLIT;
37 bool busy = 0;
12   #ifdef WIN32
13 < const string strOniSplit = "Onisplit.exe";
14 < string strImportOption = "-import:nosep";
15 < const char* strClsCmd = "cls";
16 < const char* strPauseCmd = "PAUSE";
17 < #else // set up Mac equivalents since we're in Mac OS
44 < const string strOniSplit = "mono Onisplit.exe";
45 < string strImportOption = "-import:sep";
46 < const char* strClsCmd = "clear";
47 < const char* strPauseCmd = "read -n 1 -p \"Press any key to continue\"";
48 < void Sleep(int ms) { sleep( ms / 1000 ); }
49 < #endif
50 <
51 < using namespace boost::filesystem;
52 < using namespace std;
53 <
54 <
55 <
56 <
57 < #include "boost/date_time/gregorian/gregorian.hpp"
58 < #include "boost/date_time/date_parsing.hpp"
59 < #include "boost/date_time/posix_time/posix_time.hpp"
60 <
61 < 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 <                path fullAEpath = system_complete("."); // get full path for Installer
358 <                char prefsCommand[300] = "defaults write com.godgames.oni RetailInstallationPath -string '";
359 <                strcat(prefsCommand, fullAEpath.parent_path().parent_path().string().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 > int updateStatus;
48 > bool installerJustUpdated = false;
49 > vector<string> globalInstalledMods;
50 > vector<ModPackage> globalPackages;
51 > // Variable declarations
52 > #ifdef WIN32
53 > bool splitInstances = true;
54 > string strImportOption = "-import:nosep";
55 > string strOniSplit = "Onisplit.exe";
56 > #else
57 > bool splitInstances = false;
58 > string strImportOption = "-import:sep";
59 > string strOniSplit = "mono Onisplit.exe";
60 > #endif
61  
62   /*
63   * MainWindow type definition
# Line 915 | Line 141 | bool MainWindow::Create( wxWindow* paren
141          return true;
142   }
143  
918
144   /*
145   * MainWindow destructor
146   */
# Line 926 | Line 151 | MainWindow::~MainWindow()
151          ////@end MainWindow destruction
152   }
153  
929
154   /*
155   * Member initialisation
156   */
# Line 951 | Line 175 | void MainWindow::Init()
175      CompleteRadio = NULL;
176      ReglobalizeButton = NULL;
177          ////@end MainWindow member initialisation
954
178   }
179  
957
180   /*
181   * Control creation for MainWindow
182   */
# Line 991 | Line 213 | void MainWindow::CreateControls()
213      wxMenu* itemMenu42 = new wxMenu;
214      itemMenu42->Append(wxID_OPTIONS, _("Show Advanced Options..."), wxEmptyString, wxITEM_CHECK);
215      menuBar->Append(itemMenu42, _("Options"));
216 <    wxMenu* itemMenu44 = new wxMenu;
217 < #ifdef WIN32
218 <        itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
219 <        menuBar->Append(itemMenu44, _("Help"));
998 < #else
216 > //#ifdef WIN32
217 > //      itemMenu44->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
218 > //      menuBar->Append(itemMenu44, _("Help"));
219 > //#else
220          itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
221 < #endif  
221 > //#endif        
222  
223      itemFrame1->SetMenuBar(menuBar);
224  
# Line 1064 | Line 285 | void MainWindow::CreateControls()
285      StatusArea = new wxStatusBar( itemFrame1, ID_STATUSBAR, 0 );
286      StatusArea->SetName(_T("StatusArea"));
287      StatusArea->SetFieldsCount(1);
288 <    StatusArea->SetStatusText(_("AE Installer v1.0"), 0);
288 >        string versionText = "AE Installer v" + (string)INSTALLER_VERSION;
289 >    StatusArea->SetStatusText(versionText.c_str(), 0);
290      itemBoxSizer2->Add(StatusArea, 0, wxGROW|wxALL, 0);
291  
292      wxBoxSizer* itemBoxSizer20 = new wxBoxSizer(wxHORIZONTAL);
# Line 1130 | Line 352 | void MainWindow::CreateControls()
352      // Connect events and objects
353      Mods_CheckboxList->Connect(Mods_CheckboxList1, wxEVT_CREATE, wxWindowCreateEventHandler(MainWindow::ModList_OnCreate), NULL, this);
354          ////@end MainWindow content construction
355 + #ifdef WIN32
356 +        Handle = (HWND)GetHWND();
357 +        ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList, (void **)&pTaskbarList);
358 + #endif
359  
360 <        if ( exists( "../../GameDataFolder/level0_Final.sep" ) ) {
1135 <                strImportOption = "-import:sep";
1136 <                splitInstances = NOT_SPLIT;
1137 <        }
1138 <        else {
1139 <                strImportOption = "-import:nosep";
1140 <                splitInstances = SPLIT;
1141 <        }
360 >        updateStatus = GetUpdateStatus(&currentAE, &updateAE, &installerJustUpdated);
361          
362          globalPackages = getPackages();
363          globalInstalledMods = getInstallString();
364 <        for (int i = 0; i < globalPackages.size(); i++) {
364 >        for (unsigned int i = 0; i < globalPackages.size(); i++)
365 >        {
366                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
367 <                if( binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
367 >                if (binary_search(globalInstalledMods.begin(), globalInstalledMods.end(), globalPackages[i].modStringName)) Mods_CheckboxList->Check(i);
368          }
369  
370          TheStatusBar = &StatusArea;
# Line 1152 | Line 372 | void MainWindow::CreateControls()
372          TheProgressBar = ProgressBar;
373          OptionsPanel->Hide();
374          
375 < //#ifndef WIN32
1156 < //      itemMenu37->Append(wxID_ABOUT, _("About"), wxEmptyString, wxITEM_NORMAL);
1157 <        
1158 < //#endif
1159 <        
1160 <        if(splitInstances == SPLIT) SeperatedRadio->SetValue(true);
375 >        if(splitInstances) SeperatedRadio->SetValue(true);
376          else CompleteRadio->SetValue(true);
377          if(strImportOption == "-import:nosep") NoSepRadio->SetValue(true);
378          else SepRadio->SetValue(true);
379  
1165
380   #ifdef WIN32
381          RedirectIOToConsole();
382          HWND hWnd = GetConsoleWindow();
383          ShowWindow( hWnd, SW_HIDE );
384   #endif
1171
1172        //MainWindow::SetSize(MainWindow::GetRect().GetWidth(), MainWindow::GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight() );
385   }
386  
1175
387   /*
388   * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for SelectAll_Checkbox
389   */
# Line 1181 | Line 392 | void MainWindow::OnSelectAllCheckboxClic
392   {
393          switch(SelectAll->Get3StateValue()) {
394          case wxCHK_UNCHECKED:
395 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1185 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
395 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
396                  break;
397          case wxCHK_CHECKED:
398 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
1189 <                //SelectAll->Set3StateValue(wxCHK_UNCHECKED);
398 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, true);
399                  break;
400          case wxCHK_UNDETERMINED:
401 <                for(int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
1193 <                //SelectAll->Set3StateValue(wxCHK_CHECKED);
401 >                for(unsigned int i = 0; i < globalPackages.size(); i++) Mods_CheckboxList->Check(i, false);
402                  break;
1195
403          }
1197
404   }
405  
1200
406   /*
407   * wxEVT_CREATE event handler for Mods_CheckboxList
408   */
# Line 1205 | Line 410 | void MainWindow::OnSelectAllCheckboxClic
410   void MainWindow::ModList_OnCreate( wxWindowCreateEvent& event )
411   {
412  
1208
413   }
414  
415  
# Line 1257 | Line 461 | wxBitmap MainWindow::GetBitmapResource(
461  
462   wxIcon MainWindow::GetIconResource( const wxString& name )
463   {
1260
464          // Icon retrieval
465          ////@begin MainWindow icon retrieval
466      wxUnusedVar(name);
# Line 1270 | Line 473 | wxIcon MainWindow::GetIconResource( cons
473          ////@end MainWindow icon retrieval
474   }
475  
1273
476   /*
477   * wxEVT_COMMAND_LISTBOX_SELECTED event handler for Mods_CheckboxList1
478   */
479  
480   void MainWindow::OnModsCheckboxList1Selected( wxCommandEvent& event )
481   {
1280        //event.GetSelection
482          titleText->SetValue(globalPackages[event.GetSelection()].name.c_str());
483          creatorText->SetValue(globalPackages[event.GetSelection()].creator.c_str());
484          descriptionText->SetValue(globalPackages[event.GetSelection()].readme.c_str());
1284
1285        //creatorText->Refresh();
485   }
486  
1288
487   /*
488   * wxEVT_COMMAND_CHECKLISTBOX_TOGGLED event handler for Mods_CheckboxList1
489   */
# Line 1319 | Line 517 | void MainWindow::OnOptionsClick( wxComma
517                  
518                  this->SetSize(this->GetRect().GetWidth(), this->GetRect().GetHeight()-OptionsPanel->GetRect().GetHeight());}
519          else {
520 < //              Uncomment this when we release, it gets annoying if you are testing globalization a lot ;)
1323 <                wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: These options are for advanced users only, use with caution.",
520 >                wxMessageDialog* YesNoDialog = new wxMessageDialog(this, "WARNING: These options are for advanced users only, use with caution.",
521                                                                                                                     "AE Installer Alert",  wxOK | wxICON_EXCLAMATION     , wxDefaultPosition);
522                  YesNoDialog->ShowModal();
523                  OptionsPanel->Show();
# Line 1329 | Line 526 | void MainWindow::OnOptionsClick( wxComma
526          }
527   }
528  
1332
529   /*
530   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_EXIT
531   */
# Line 1339 | Line 535 | void MainWindow::OnExitClick( wxCommandE
535          exit(0);
536   }
537  
1342
538   /*
539   * wxEVT_COMMAND_BUTTON_CLICKED event handler for Install_Button
540   */
541  
1347
542   struct recompile
543   {
544          recompile(vector<string> localPackages) : thePackages(localPackages) { }
# Line 1353 | Line 547 | struct recompile
547                  TheInstallButton->Disable();
548                  recompileAll(thePackages);
549                  TheInstallButton->Enable();
550 +                
551          }
1357
552          vector<string> thePackages;
553   };
554  
555 + void globalize2(void) {
556 +                TheInstallButton->Disable();
557 +                globalizeData();
558 +                TheInstallButton->Enable();
559 + }
560 +
561   void MainWindow::OnInstallButtonClick( wxCommandEvent& event )
562   {
1363
563          vector<string> localPackages;
564 <        localPackages.push_back("Globalize");
565 <        for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
564 >        localPackages.push_back("00000Globalize");
565 >        for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) localPackages.push_back( globalPackages[i].modStringName );
566          if ( !localPackages.empty() )   {
567 <        
568 <                //MainWindow::MainWindow().Hide();      
1370 <                //      boost::thread thrd2(recompileAll(localPackages) );
1371 <                //MainWindow::MainWindow().Show();
567 >                sort(localPackages.begin(), localPackages.end());
568 >                localPackages[0] = "Globalize";
569                  this->InstallButton->Disable();
570                  this->ReglobalizeButton->Disable();
571   #ifdef WIN32
# Line 1377 | Line 574 | void MainWindow::OnInstallButtonClick( w
574   #else
575                  recompileAll(localPackages);
576   #endif
1380
577                  this->InstallButton->Enable();
578                  this->ReglobalizeButton->Enable();
579          }
1384
1385
580   }
581  
582 < /*void setStatusArea( string s ) {
583 < //TheStatusBar = MainWindow::StatusArea;
584 < (**TheStatusBar).SetStatusText(_(s.c_str()), 0);
585 <
586 < //MainWindow::MainWindow().SetSize(MainWindow::MainWindow().GetRect().GetWidth(), MainWindow::MainWindow().GetRect().GetHeight()+1);
587 <
588 < //MainWindow::StatusBar->SetLabel("Importing Files...");
589 < //StatusBar->SetLabel(s);
590 < //->SetLabel(s);
591 <
592 < }*/
593 <
1400 < void setProgressBar( int i ) {
1401 <        //TheProgressBar->SetValue(
1402 <
582 > void setProgressBar( int i )
583 > {
584 > #ifdef WIN32
585 > if (SUCCEEDED(pTaskbarList->QueryInterface(IID_ITaskbarList3, (void **)&pTaskbarList3)))
586 > {
587 >        pTaskbarList3->SetProgressValue(Handle,i, 1000);
588 >        if ( i == 0 )
589 >        {
590 >                pTaskbarList3->SetProgressState(Handle,TBPF_NOPROGRESS);
591 >        }
592 > }
593 > #endif
594          TheProgressBar->SetValue(i);
1404
595   }
596  
1407
597   /*
598   * wxEVT_UPDATE_UI event handler for ID_STATUSBAR
599   */
# Line 1417 | Line 606 | void MainWindow::OnStatusbarUpdate( wxUp
606          ////@end wxEVT_UPDATE_UI event handler for ID_STATUSBAR in MainWindow.
607   }
608  
1420
609   /*
610   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT
611   */
# Line 1426 | Line 614 | void MainWindow::OnAboutClick( wxCommand
614   {
615          ////@begin wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
616      // Before editing this code, remove the block markers.
617 +        // TODO: Make About window work again!
618      About* window = new About(this);
1430    int returnValue = window->ShowModal();
619      window->Destroy();
620          ////@end wxEVT_COMMAND_MENU_SELECTED event handler for wxID_ABOUT in MainWindow.
621   }
622  
1435
623   /*
624   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for NoSep_RadioButton
625   */
# Line 1442 | Line 629 | void MainWindow::OnNoSepRadioButtonSelec
629          static_cast<string>("-import:nosep");
630   }
631  
1445
632   /*
633   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Sep_RadioButton
634   */
# Line 1452 | Line 638 | void MainWindow::OnSepRadioButtonSelecte
638          static_cast<string>("-import:sep");
639   }
640  
1455
641   /*
642   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
643   */
# Line 1463 | Line 648 | void MainWindow::OnSepRadioButtonSelecte
648  
649   void MainWindow::OnCompleteRadioButtonSelected( wxCommandEvent& event )
650   {
651 <        splitInstances = NOT_SPLIT;
1467 <
651 >        splitInstances = false;
652   }
653  
1470
654   /*
655   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BITMAPBUTTON
656   */
# Line 1477 | Line 660 | void MainWindow::OnRefreshButtonClick( w
660          refreshMods(globalInstalledMods);
661   }
662  
1480
663   /*
664   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_LOAD
665   */
666  
667 <
668 <
669 <
1488 < void MainWindow::refreshMods (vector<string> s) {
1489 <
667 > // TODO: Make refreshMods actually refresh the list in the window of available mods so we can see any new package info and deleted mods are removed from the list
668 > void MainWindow::refreshMods (vector<string> s)
669 > {
670          Mods_CheckboxList->Clear();
671 <        //globalInstalledMods = getPackages();
1492 <        for (int i = 0; i < globalPackages.size(); i++) {
671 >        for (unsigned int i = 0; i < globalPackages.size(); i++) {
672                  Mods_CheckboxList->Append(globalPackages[i].name.c_str());
673 <                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) ) Mods_CheckboxList->Check(i);
674 <                //else Mods_CheckboxList->Check(i,0);
1496 <
673 >                if( binary_search(s.begin(), s.end(), globalPackages[i].modStringName ) )
674 >                        Mods_CheckboxList->Check(i);
675          }
676   }
677  
# Line 1513 | Line 691 | void MainWindow::OnLoadClick( wxCommandE
691          {
692                  refreshMods(getInstallString( string(openFileDialog->GetPath()) ));
693          }
1516
1517
694   }
695  
1520
696   /*
697   * wxEVT_COMMAND_MENU_SELECTED event handler for wxID_SAVE
698   */
# Line 1536 | Line 711 | void MainWindow::OnSaveClick( wxCommandE
711  
712          if ( openFileDialog->ShowModal() == wxID_OK )
713          {
1539
1540
1541                //Mods_CheckboxList->
1542
1543
1544
1545                //
1546
714                  if ( exists( openFileDialog->GetPath().c_str() ) )
715                  {
716                          remove( openFileDialog->GetPath().c_str() );
# Line 1552 | Line 719 | void MainWindow::OnSaveClick( wxCommandE
719                  ofstream file(openFileDialog->GetPath().c_str());
720  
721                  vector<string>list;
722 <                for(int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
722 >                for(unsigned int i = 0; i < globalPackages.size(); i++) if(Mods_CheckboxList->IsChecked(i)) list.push_back( globalPackages[i].modStringName );
723                  vector<string>::iterator begin_iter = list.begin();
724                  vector<string>::iterator end_iter = list.end();
725  
# Line 1564 | Line 731 | void MainWindow::OnSaveClick( wxCommandE
731  
732                  file.close();
733                  file.clear();
1567
1568                //SetCurrentFilename(openFileDialog->GetFilename());
1569                //theText->LoadFile(openFileDialog->GetFilename());
1570                //SetStatusText(GetCurrentFilename(), 0);
1571                //SetStatusText(openFileDialog->GetDirectory(),1);
734          }
735   }
736  
1575
1576
737   /*
738   * wxEVT_COMMAND_BUTTON_CLICKED event handler for ReGlobalize_Button
739   */
740  
741   void MainWindow::OnReGlobalizeButtonClick( wxCommandEvent& event )
742   {
743 <        wxMessageDialog* YesNoDialog = new wxMessageDialog(this,                        "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data. \n Are you SURE you want to do this? ", "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION    , wxDefaultPosition);
744 <
745 <        if (YesNoDialog->ShowModal() == wxID_NO) { //if the user said no...
743 >        string YesNoMsg = "WARNING: This will DELETE the Edition's GameDataFolder and recreate it from the vanilla Oni game data.\n";
744 >        YesNoMsg = YesNoMsg + "Are you SURE you want to do this?";
745 >        wxMessageDialog* YesNoDialog = new wxMessageDialog(this, YesNoMsg.c_str(), "AE Installer Alert",  wxYES_NO | wxICON_EXCLAMATION , wxDefaultPosition);
746  
747 +        if (YesNoDialog->ShowModal() == wxID_NO)
748 +        {
749 +                //if the user said no...
750          }
751 <        else {
752 <        
751 >        else
752 >        {
753                  this->InstallButton->Disable();
754                  this->ReglobalizeButton->Disable();
1592
755   #ifdef WIN32
1594
756                  boost::thread thrd2(globalizeData);
757                  //globalizeData();
758                  //boost::thread::create_thread(&globalizeData);
# Line 1600 | Line 761 | void MainWindow::OnReGlobalizeButtonClic
761   #else
762                  globalizeData();
763   #endif
1603                
764                  this->InstallButton->Enable();
765                  this->ReglobalizeButton->Enable();
766          }
1607
767   }
768   /*
769   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Separated_RadioButton
770   */
771  
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
772   /*
773   * wxEVT_COMMAND_RADIOBUTTON_SELECTED event handler for Seperated_RadioButton
774   */
775  
776   void MainWindow::OnSeperatedRadioButtonSelected( wxCommandEvent& event )
777   {
778 < splitInstances = SPLIT;
778 >        splitInstances = true;
779   }
1630

Diff Legend

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