1 /*
2  * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24  * POSSIBILITY OF SUCH DAMAGE.
25  */
26 /////////////////////////////////////////////////////////////////////////////
27 // Name:        sashtest.cpp
28 // Purpose:     Layout/sash sample
29 // Author:      Julian Smart
30 // Modified by:
31 // Created:     04/01/98
32 // RCS-ID:      $Id: sashtest.cpp,v 1.18 2005/08/23 15:54:35 ABX Exp $
33 // Copyright:   (c) Julian Smart
34 // Licence:     wxWindows license
35 /////////////////////////////////////////////////////////////////////////////
36 /////////////////////////////////////////////////////////////////////////////
37 // Name:        treetest.cpp
38 // Purpose:     wxTreeCtrl sample
39 // Author:      Julian Smart
40 // Modified by:
41 // Created:     04/01/98
42 // RCS-ID:      $Id: treetest.cpp,v 1.110 2006/11/04 11:26:51 VZ Exp $
43 // Copyright:   (c) Julian Smart
44 // Licence:     wxWindows license
45 /////////////////////////////////////////////////////////////////////////////
46 /////////////////////////////////////////////////////////////////////////////
47 // Name:        dialogs.cpp
48 // Purpose:     Common dialogs demo
49 // Author:      Julian Smart
50 // Modified by: ABX (2004) - adjustements for conditional building + new menu
51 // Created:     04/01/98
52 // RCS-ID:      $Id: dialogs.cpp,v 1.163 2006/11/04 10:57:24 VZ Exp $
53 // Copyright:   (c) Julian Smart
54 // Licence:     wxWindows license
55 /////////////////////////////////////////////////////////////////////////////
56 /////////////////////////////////////////////////////////////////////////////
57 // Name:        thread.cpp
58 // Purpose:     wxWidgets thread sample
59 // Author:      Guilhem Lavaux, Vadim Zeitlin
60 // Modified by:
61 // Created:     06/16/98
62 // RCS-ID:      $Id: thread.cpp,v 1.26 2006/10/02 05:36:28 PC Exp $
63 // Copyright:   (c) 1998-2002 wxWidgets team
64 // Licence:     wxWindows license
65 /////////////////////////////////////////////////////////////////////////////
66 ///////////////////////////////////////////////////////////////////////////////
67 // Name:        samples/image/image.cpp
68 // Purpose:     sample showing operations with wxImage
69 // Author:      Robert Roebling
70 // Modified by:
71 // Created:     1998
72 // RCS-ID:      $Id: image.cpp,v 1.120 2006/12/06 17:13:11 VZ Exp $
73 // Copyright:   (c) 1998-2005 Robert Roebling
74 // License:     wxWindows licence
75 ///////////////////////////////////////////////////////////////////////////////
76 /////////////////////////////////////////////////////////////////////////////
77 // Name:        samples/console/console.cpp
78 // Purpose:     A sample console (as opposed to GUI) program using wxWidgets
79 // Author:      Vadim Zeitlin
80 // Modified by:
81 // Created:     04.10.99
82 // RCS-ID:      $Id: console.cpp,v 1.206 2006/11/12 19:55:19 VZ Exp $
83 // Copyright:   (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
84 // Licence:     wxWindows license
85 /////////////////////////////////////////////////////////////////////////////
86 /////////////////////////////////////////////////////////////////////////////
87 // Name:        samples/notebook/notebook.cpp
88 // Purpose:     a sample demonstrating notebook usage
89 // Author:      Julian Smart
90 // Modified by: Dimitri Schoolwerth
91 // Created:     26/10/98
92 // RCS-ID:      $Id: notebook.cpp,v 1.49 2006/11/04 18:24:07 RR Exp $
93 // Copyright:   (c) 1998-2002 wxWidgets team
94 // License:     wxWindows license
95 /////////////////////////////////////////////////////////////////////////////
96 /////////////////////////////////////////////////////////////////////////////
97 // Name:        dialogs.cpp
98 // Purpose:     Common dialogs demo
99 // Author:      Julian Smart
100 // Modified by: ABX (2004) - adjustements for conditional building + new menu
101 // Created:     04/01/98
102 // RCS-ID:      $Id: dialogs.cpp,v 1.163 2006/11/04 10:57:24 VZ Exp $
103 // Copyright:   (c) Julian Smart
104 // Licence:     wxWindows license
105 /////////////////////////////////////////////////////////////////////////////
106 /////////////////////////////////////////////////////////////////////////////
107 // Name:        dnd.cpp
108 // Purpose:     Drag and drop sample
109 // Author:      Vadim Zeitlin
110 // Modified by:
111 // Created:     04/01/98
112 // RCS-ID:      $Id: dnd.cpp,v 1.107 2006/10/30 20:23:41 VZ Exp $
113 // Copyright:
114 // Licence:     wxWindows licence
115 /////////////////////////////////////////////////////////////////////////////
116 /////////////////////////////////////////////////////////////////////////////
117 // Name:        test.cpp
118 // Purpose:     wxHtml testing example
119 /////////////////////////////////////////////////////////////////////////////
120 
121 
122 #include "OPJViewer.h"
123 
124 IMPLEMENT_APP(OPJViewerApp)
125 
126 // For drawing lines in a canvas
127 long xpos = -1;
128 long ypos = -1;
129 
130 int winNumber = 1;
131 
132 // Initialise this in OnInit, not statically
OnInit(void)133 bool OPJViewerApp::OnInit(void)
134 {
135 	int n;
136 #if wxUSE_UNICODE
137 
138     wxChar **wxArgv = new wxChar *[argc + 1];
139 
140     for (n = 0; n < argc; n++ ) {
141         wxMB2WXbuf warg = wxConvertMB2WX((char *) argv[n]);
142         wxArgv[n] = wxStrdup(warg);
143     }
144 
145     wxArgv[n] = NULL;
146 
147 #else // !wxUSE_UNICODE
148 
149     #define wxArgv argv
150 
151 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
152 
153 #if wxUSE_CMDLINE_PARSER
154 
155     static const wxCmdLineEntryDesc cmdLineDesc[] =
156     {
157         { wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("show this help message"),
158             wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
159 
160         { wxCMD_LINE_PARAM,  NULL, NULL, _T("input file"),
161             wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE },
162 
163         { wxCMD_LINE_NONE }
164     };
165 
166     wxCmdLineParser parser(cmdLineDesc, argc, wxArgv);
167 
168     switch (parser.Parse()) {
169     case -1:
170         wxLogMessage(wxT("Help was given, terminating."));
171         break;
172 
173     case 0:
174         ShowCmdLine(parser);
175         break;
176 
177     default:
178         wxLogMessage(wxT("Syntax error detected."));
179         break;
180     }
181 
182 #endif // wxUSE_CMDLINE_PARSER
183 
184     //wxInitAllImageHandlers();
185 #if wxUSE_LIBJPEG
186   wxImage::AddHandler( new wxJPEGHandler );
187 #endif
188 #if wxUSE_LIBOPENJPEG
189   wxImage::AddHandler( new wxJPEG2000Handler );
190 #endif
191 #if USE_MXF
192   wxImage::AddHandler( new wxMXFHandler );
193 #endif // USE_MXF
194 #if OPJ_MANYFORMATS
195   wxImage::AddHandler( new wxBMPHandler );
196   wxImage::AddHandler( new wxPNGHandler );
197   wxImage::AddHandler( new wxGIFHandler );
198   wxImage::AddHandler( new wxPNMHandler );
199   wxImage::AddHandler( new wxTIFFHandler );
200 #endif
201     // we use a XPM image in our HTML page
202     wxImage::AddHandler(new wxXPMHandler);
203 
204 	// memory file system
205     wxFileSystem::AddHandler(new wxMemoryFSHandler);
206 
207 #ifdef OPJ_INICONFIG
208 	//load decoding engine parameters
209 	OPJconfig = new wxConfig(OPJ_APPLICATION, OPJ_APPLICATION_VENDOR);
210 
211 	OPJconfig->Read(wxT("decode/enabledeco"), &m_enabledeco, (bool) true);
212 	OPJconfig->Read(wxT("decode/enableparse"), &m_enableparse, (bool) true);
213 	OPJconfig->Read(wxT("decode/resizemethod"), &m_resizemethod, (long) 0);
214 	OPJconfig->Read(wxT("decode/xxxreducefactor"), &m_reducefactor, (long) 0);
215 	OPJconfig->Read(wxT("decode/xxxqualitylayers"), &m_qualitylayers, (long) 0);
216 	OPJconfig->Read(wxT("decode/xxxcomponents"), &m_components, (long) 0);
217 	OPJconfig->Read(wxT("decode/xxxframenum"), &m_framenum, (long) 0);
218 #ifdef USE_JPWL
219 	OPJconfig->Read(wxT("decode/enablejpwl"), &m_enablejpwl, (bool) true);
220 	OPJconfig->Read(wxT("decode/expcomps"), &m_expcomps, (long) JPWL_EXPECTED_COMPONENTS);
221 	OPJconfig->Read(wxT("decode/maxtiles"), &m_maxtiles, (long) JPWL_MAXIMUM_TILES);
222 #endif // USE_JPWL
223 
224 	OPJconfig->Write(wxT("teststring"), wxT("This is a test value"));
225 	OPJconfig->Write(wxT("testbool"), (bool) true);
226 	OPJconfig->Write(wxT("testlong"), (long) 245);
227 
228 	OPJconfig->Read(wxT("showtoolbar"), &m_showtoolbar, (bool) true);
229 	OPJconfig->Read(wxT("showbrowser"), &m_showbrowser, (bool) true);
230 	OPJconfig->Read(wxT("showpeeker"), &m_showpeeker, (bool) true);
231 	OPJconfig->Read(wxT("browserwidth"), &m_browserwidth, (long) OPJ_BROWSER_WIDTH);
232 	OPJconfig->Read(wxT("peekerheight"), &m_peekerheight, (long) OPJ_PEEKER_HEIGHT);
233 	OPJconfig->Read(wxT("framewidth"), &m_framewidth, (long) OPJ_FRAME_WIDTH);
234 	OPJconfig->Read(wxT("frameheight"), &m_frameheight, (long) OPJ_FRAME_HEIGHT);
235 
236 	// load encoding engine parameters
237 	OPJconfig->Read(wxT("encode/subsampling"), &m_subsampling, (wxString) wxT("1,1"));
238 	OPJconfig->Read(wxT("encode/origin"), &m_origin, (wxString) wxT("0,0"));
239 	OPJconfig->Read(wxT("encode/rates"), &m_rates, (wxString) wxT("20,10,5"));
240 	OPJconfig->Read(wxT("encode/quality"), &m_quality, (wxString) wxT("30,35,40"));
241 	OPJconfig->Read(wxT("encode/enablequality"), &m_enablequality, (bool) false);
242 	OPJconfig->Read(wxT("encode/multicomp"), &m_multicomp, (bool) false);
243 	OPJconfig->Read(wxT("encode/irreversible"), &m_irreversible, (bool) false);
244 	OPJconfig->Read(wxT("encode/resolutions"), &m_resolutions, (int) 6);
245 	OPJconfig->Read(wxT("encode/progression"), &m_progression, (int) 0);
246 	OPJconfig->Read(wxT("encode/cbsize"), &m_cbsize, (wxString) wxT("32,32"));
247 	OPJconfig->Read(wxT("encode/prsize"), &m_prsize, (wxString) wxT("[128,128],[128,128]"));
248 	OPJconfig->Read(wxT("encode/tsize"), &m_tsize, (wxString) wxT(""));
249 	OPJconfig->Read(wxT("encode/torigin"), &m_torigin, (wxString) wxT("0,0"));
250 	OPJconfig->Read(wxT("encode/enablesop"), &m_enablesop, (bool) false);
251 	OPJconfig->Read(wxT("encode/enableeph"), &m_enableeph, (bool) false);
252 	OPJconfig->Read(wxT("encode/enablebypass"), &m_enablebypass, (bool) false);
253 	OPJconfig->Read(wxT("encode/enablereset"), &m_enablereset, (bool) false);
254 	OPJconfig->Read(wxT("encode/enablerestart"), &m_enablerestart, (bool) false);
255 	OPJconfig->Read(wxT("encode/enablevsc"), &m_enablevsc, (bool) false);
256 	OPJconfig->Read(wxT("encode/enableerterm"), &m_enableerterm, (bool) false);
257 	OPJconfig->Read(wxT("encode/enablesegmark"), &m_enablesegmark, (bool) false);
258 	OPJconfig->Read(wxT("encode/enablecomm"), &m_enablecomm, (bool) true);
259 	OPJconfig->Read(wxT("encode/enablepoc"), &m_enablepoc, (bool) false);
260 	OPJconfig->Read(wxT("encode/comment"), &m_comment, (wxString) wxT(""));
261 	OPJconfig->Read(wxT("encode/poc"), &m_poc, (wxString) wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL"));
262 	OPJconfig->Read(wxT("encode/enableidx"), &m_enableidx, (bool) false);
263 	OPJconfig->Read(wxT("encode/index"), &m_index, (wxString) wxT("index.txt"));
264 #ifdef USE_JPWL
265 	OPJconfig->Read(wxT("encode/enablejpwl"), &m_enablejpwle, (bool) true);
266 	for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {
267 		OPJconfig->Read(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), &m_hprotsel[n], 0);
268 		OPJconfig->Read(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), &m_htileval[n], 0);
269 		OPJconfig->Read(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), &m_pprotsel[n], 0);
270 		OPJconfig->Read(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), &m_ptileval[n], 0);
271 		OPJconfig->Read(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), &m_ppackval[n], 0);
272 		OPJconfig->Read(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), &m_sensisel[n], 0);
273 		OPJconfig->Read(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), &m_stileval[n], 0);
274 	}
275 #endif // USE_JPWL
276 
277 #else
278 	// set decoding engine parameters
279 	m_enabledeco = true;
280 	m_enableparse = true;
281 	m_resizemethod = 0;
282 	m_reducefactor = 0;
283 	m_qualitylayers = 0;
284 	m_components = 0;
285 	m_framenum = 0;
286 #ifdef USE_JPWL
287 	m_enablejpwl = true;
288 	m_expcomps = JPWL_EXPECTED_COMPONENTS;
289 	m_maxtiles = JPWL_MAXIMUM_TILES;
290 #endif // USE_JPWL
291 	m_showtoolbar = true;
292 	m_showbrowser = true;
293 	m_showpeeker = true;
294 	m_browserwidth = OPJ_BROWSER_WIDTH;
295 	m_peekerheight = OPJ_PEEKER_HEIGHT;
296 	m_framewidth = OPJ_FRAME_WIDTH;
297 	m_frameheight = OPJ_FRAME_HEIGHT;
298 
299 	// set encoding engine parameters
300 	m_subsampling = wxT("1,1");
301 	m_origin = wxT("0,0");
302 	m_rates = wxT("20,10,5");
303 	m_quality = wxT("30,35,40");
304 	m_enablequality = false;
305 	m_multicomp = false;
306 	m_irreversible = false;
307 	m_resolutions = 6;
308 	m_progression = 0;
309 	m_cbsize= wxT("32,32");
310 	m_prsize= wxT("[128,128],[128,128]");
311 	m_tsize = wxT("");
312 	m_torigin = wxT("0,0");
313 	m_enablesop = false;
314 	m_enableeph = false;
315 	m_enablebypass = false;
316 	m_enablereset = false;
317 	m_enablerestart = false;
318 	m_enablevsc = false;
319 	m_enableerterm = false;
320 	m_enablesegmark = false;
321 	m_enableidx = false;
322 	m_index = wxT("index.txt");
323 	m_enablecomm = true;
324 	m_comment = wxT("");
325 	m_enablepoc = false;
326 	m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL");
327 #ifdef USE_JPWL
328 	m_enablejpwle = true;
329 	for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {
330 		m_hprotsel[n] = 0;
331 		m_htileval[n] = 0;
332 		m_pprotsel[n] = 0;
333 		m_ptileval[n] = 0;
334 		m_sensisel[n] = 0;
335 		m_stileval[n] = 0;
336 	}
337 #endif // USE_JPWL
338 
339 #endif // OPJ_INICONFIG
340 
341 	if (m_comment == wxT("")) {
342 #if defined __WXMSW__
343 		m_comment = wxT("Created by OPJViewer Win32 - OpenJPEG  version ");
344 #elif defined __WXGTK__
345 		m_comment = wxT("Created by OPJViewer Lin32 - OpenJPEG version ");
346 #else
347 		m_comment = wxT("Created by OPJViewer - OpenJPEG version ");
348 #endif
349 
350 #ifdef USE_JPWL
351 		m_comment += wxString::Format(wxT("%s with JPWL"), (char *) opj_version());
352 #else
353 		m_comment += wxString::Format(wxT("%s"), (char *) opj_version());
354 #endif
355 	}
356 
357 	// Create the main frame window
358   OPJFrame *frame = new OPJFrame(NULL, wxID_ANY, OPJ_APPLICATION_TITLEBAR,
359 					  wxDefaultPosition, wxSize(wxGetApp().m_framewidth, wxGetApp().m_frameheight),
360                       wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE |
361                       wxHSCROLL | wxVSCROLL);
362 
363   // Give it an icon (this is ignored in MDI mode: uses resources)
364 #ifdef __WXMSW__
365   frame->SetIcon(wxIcon(wxT("OPJViewer16")));
366 #endif
367 
368   frame->Show(true);
369 
370   SetTopWindow(frame);
371 
372 	// if there are files on the command line, open them
373 	if (!(m_filelist.IsEmpty())) {
374 		//wxLogMessage(wxT("Habemus files!!!"));
375 		wxArrayString paths, filenames;
376 		for (unsigned int f = 0; f < wxGetApp().m_filelist.GetCount(); f++) {
377 			paths.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullPath());
378 			filenames.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullName());
379 		}
380 		//wxLogMessage(paths[0]);
381 		frame->OpenFiles(paths, filenames);
382 	}
383 
384   return true;
385 }
386 
OnExit()387 int OPJViewerApp::OnExit()
388 {
389 	int n;
390 
391 #ifdef OPJ_INICONFIG
392 	OPJconfig->Write(wxT("decode/enabledeco"), m_enabledeco);
393 	OPJconfig->Write(wxT("decode/enableparse"), m_enableparse);
394 	OPJconfig->Write(wxT("decode/resizemethod"), m_resizemethod);
395 	OPJconfig->Write(wxT("decode/reducefactor"), m_reducefactor);
396 	OPJconfig->Write(wxT("decode/qualitylayers"), m_qualitylayers);
397 	OPJconfig->Write(wxT("decode/components"), m_components);
398 	OPJconfig->Write(wxT("decode/framenum"), m_framenum);
399 #ifdef USE_JPWL
400 	OPJconfig->Write(wxT("decode/enablejpwl"), m_enablejpwl);
401 	OPJconfig->Write(wxT("decode/expcomps"), m_expcomps);
402 	OPJconfig->Write(wxT("decode/maxtiles"), m_maxtiles);
403 #endif // USE_JPWL
404 	OPJconfig->Write(wxT("showtoolbar"), m_showtoolbar);
405 	OPJconfig->Write(wxT("showbrowser"), m_showbrowser);
406 	OPJconfig->Write(wxT("showpeeker"), m_showpeeker);
407 	OPJconfig->Write(wxT("browserwidth"), m_browserwidth);
408 	OPJconfig->Write(wxT("peekerheight"), m_peekerheight);
409 	OPJconfig->Write(wxT("framewidth"), m_framewidth);
410 	OPJconfig->Write(wxT("frameheight"), m_frameheight);
411 
412 	OPJconfig->Write(wxT("encode/subsampling"), m_subsampling);
413 	OPJconfig->Write(wxT("encode/origin"), m_origin);
414 	OPJconfig->Write(wxT("encode/rates"), m_rates);
415 	OPJconfig->Write(wxT("encode/quality"), m_quality);
416 	OPJconfig->Write(wxT("encode/enablequality"), m_enablequality);
417 	OPJconfig->Write(wxT("encode/multicomp"), m_multicomp);
418 	OPJconfig->Write(wxT("encode/irreversible"), m_irreversible);
419 	OPJconfig->Write(wxT("encode/resolutions"), m_resolutions);
420 	OPJconfig->Write(wxT("encode/progression"), m_progression);
421 	OPJconfig->Write(wxT("encode/cbsize"), m_cbsize);
422 	OPJconfig->Write(wxT("encode/prsize"), m_prsize);
423 	OPJconfig->Write(wxT("encode/tiles"), m_tsize);
424 	OPJconfig->Write(wxT("encode/torigin"), m_torigin);
425 	OPJconfig->Write(wxT("encode/enablesop"), m_enablesop);
426 	OPJconfig->Write(wxT("encode/enableeph"), m_enableeph);
427 	OPJconfig->Write(wxT("encode/enablebypass"), m_enablebypass);
428 	OPJconfig->Write(wxT("encode/enablereset"), m_enablereset);
429 	OPJconfig->Write(wxT("encode/enablerestart"), m_enablerestart);
430 	OPJconfig->Write(wxT("encode/enablevsc"), m_enablevsc);
431 	OPJconfig->Write(wxT("encode/enableerterm"), m_enableerterm);
432 	OPJconfig->Write(wxT("encode/enablesegmark"), m_enablesegmark);
433 	OPJconfig->Write(wxT("encode/enableidx"), m_enableidx);
434 	OPJconfig->Write(wxT("encode/index"), m_index);
435 	OPJconfig->Write(wxT("encode/enablecomm"), m_enablecomm);
436 	OPJconfig->Write(wxT("encode/comment"), m_comment);
437 	OPJconfig->Write(wxT("encode/enablepoc"), m_enablepoc);
438 	OPJconfig->Write(wxT("encode/poc"), m_poc);
439 #ifdef USE_JPWL
440 	OPJconfig->Write(wxT("encode/enablejpwl"), m_enablejpwle);
441 	for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {
442 		OPJconfig->Write(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), m_hprotsel[n]);
443 		OPJconfig->Write(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), m_htileval[n]);
444 		OPJconfig->Write(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), m_pprotsel[n]);
445 		OPJconfig->Write(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), m_ptileval[n]);
446 		OPJconfig->Write(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), m_ppackval[n]);
447 		OPJconfig->Write(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), m_sensisel[n]);
448 		OPJconfig->Write(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), m_stileval[n]);
449 	}
450 #endif // USE_JPWL
451 
452 #endif // OPJ_INICONFIG
453 
454 	return 1;
455 }
456 
ShowCmdLine(const wxCmdLineParser & parser)457 void OPJViewerApp::ShowCmdLine(const wxCmdLineParser& parser)
458 {
459     wxString s = wxT("Command line parsed successfully:\nInput files: ");
460 
461     size_t count = parser.GetParamCount();
462     for (size_t param = 0; param < count; param++) {
463         s << parser.GetParam(param) << ';';
464 		m_filelist.Add(parser.GetParam(param));
465     }
466 
467     //wxLogMessage(s);
468 }
469 
470 // OPJFrame events
471 
472 // Event class for sending text messages between worker and GUI threads
BEGIN_EVENT_TABLE(OPJFrame,wxMDIParentFrame)473 BEGIN_EVENT_TABLE(OPJFrame, wxMDIParentFrame)
474     EVT_MENU(OPJFRAME_HELPABOUT, OPJFrame::OnAbout)
475     EVT_MENU(OPJFRAME_FILEOPEN, OPJFrame::OnFileOpen)
476     EVT_MENU(OPJFRAME_FILESAVEAS, OPJFrame::OnFileSaveAs)
477     EVT_MENU(OPJFRAME_MEMORYOPEN, OPJFrame::OnMemoryOpen)
478     EVT_SIZE(OPJFrame::OnSize)
479     EVT_MENU(OPJFRAME_FILEEXIT, OPJFrame::OnQuit)
480     EVT_MENU(OPJFRAME_FILECLOSE, OPJFrame::OnClose)
481     EVT_MENU(OPJFRAME_VIEWZOOM, OPJFrame::OnZoom)
482     EVT_MENU(OPJFRAME_VIEWFIT, OPJFrame::OnFit)
483     EVT_MENU(OPJFRAME_VIEWRELOAD, OPJFrame::OnReload)
484     EVT_MENU(OPJFRAME_VIEWPREVFRAME, OPJFrame::OnPrevFrame)
485     EVT_MENU(OPJFRAME_VIEWHOMEFRAME, OPJFrame::OnHomeFrame)
486     EVT_MENU(OPJFRAME_VIEWNEXTFRAME, OPJFrame::OnNextFrame)
487     EVT_MENU(OPJFRAME_VIEWLESSLAYERS, OPJFrame::OnLessLayers)
488     EVT_MENU(OPJFRAME_VIEWALLLAYERS, OPJFrame::OnAllLayers)
489     EVT_MENU(OPJFRAME_VIEWMORELAYERS, OPJFrame::OnMoreLayers)
490     EVT_MENU(OPJFRAME_VIEWLESSRES, OPJFrame::OnLessRes)
491     EVT_MENU(OPJFRAME_VIEWFULLRES, OPJFrame::OnFullRes)
492     EVT_MENU(OPJFRAME_VIEWMORERES, OPJFrame::OnMoreRes)
493     EVT_MENU(OPJFRAME_VIEWPREVCOMP, OPJFrame::OnPrevComp)
494     EVT_MENU(OPJFRAME_VIEWALLCOMPS, OPJFrame::OnAllComps)
495     EVT_MENU(OPJFRAME_VIEWNEXTCOMP, OPJFrame::OnNextComp)
496     EVT_MENU(OPJFRAME_FILETOGGLEB, OPJFrame::OnToggleBrowser)
497     EVT_MENU(OPJFRAME_FILETOGGLEP, OPJFrame::OnTogglePeeker)
498     EVT_MENU(OPJFRAME_FILETOGGLET, OPJFrame::OnToggleToolbar)
499     EVT_MENU(OPJFRAME_SETSENCO, OPJFrame::OnSetsEnco)
500     EVT_MENU(OPJFRAME_SETSDECO, OPJFrame::OnSetsDeco)
501     EVT_SASH_DRAGGED_RANGE(OPJFRAME_BROWSEWIN, OPJFRAME_LOGWIN, OPJFrame::OnSashDrag)
502     EVT_NOTEBOOK_PAGE_CHANGED(LEFT_NOTEBOOK_ID, OPJFrame::OnNotebook)
503     EVT_MENU(OPJFRAME_THREADLOGMSG, OPJFrame::OnThreadLogmsg)
504 END_EVENT_TABLE()
505 
506 // this is the frame constructor
507 OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
508 				   const wxPoint& pos, const wxSize& size, const long style)
509 		: wxMDIParentFrame(parent, id, title, pos, size, style)
510 {
511 	// file menu and its items
512 	wxMenu *file_menu = new wxMenu;
513 
514 	file_menu->Append(OPJFRAME_FILEOPEN, wxT("&Open\tCtrl+O"));
515 	file_menu->SetHelpString(OPJFRAME_FILEOPEN, wxT("Open one or more files"));
516 
517 	file_menu->Append(OPJFRAME_MEMORYOPEN, wxT("&Memory\tCtrl+M"));
518 	file_menu->SetHelpString(OPJFRAME_MEMORYOPEN, wxT("Open a memory buffer"));
519 
520 	file_menu->Append(OPJFRAME_FILECLOSE, wxT("&Close\tCtrl+C"));
521 	file_menu->SetHelpString(OPJFRAME_FILECLOSE, wxT("Close current image"));
522 
523 	file_menu->AppendSeparator();
524 
525 	file_menu->Append(OPJFRAME_FILESAVEAS, wxT("&Save as\tCtrl+S"));
526 	file_menu->SetHelpString(OPJFRAME_FILESAVEAS, wxT("Save the current image"));
527 	//file_menu->Enable(OPJFRAME_FILESAVEAS, false);
528 
529 	file_menu->AppendSeparator();
530 
531 	file_menu->Append(OPJFRAME_FILETOGGLEB, wxT("Toggle &browser\tCtrl+B"));
532 	file_menu->SetHelpString(OPJFRAME_FILETOGGLEB, wxT("Toggle the left browsing pane"));
533 
534 	file_menu->Append(OPJFRAME_FILETOGGLEP, wxT("Toggle &peeker\tCtrl+P"));
535 	file_menu->SetHelpString(OPJFRAME_FILETOGGLEP, wxT("Toggle the bottom peeking pane"));
536 
537 	file_menu->Append(OPJFRAME_FILETOGGLET, wxT("Toggle &toolbar\tCtrl+T"));
538 	file_menu->SetHelpString(OPJFRAME_FILETOGGLET, wxT("Toggle the toolbar"));
539 
540 	file_menu->AppendSeparator();
541 
542 	file_menu->Append(OPJFRAME_FILEEXIT, wxT("&Exit\tCtrl+Q"));
543 	file_menu->SetHelpString(OPJFRAME_FILEEXIT, wxT("Quit this program"));
544 
545 	// view menu and its items
546 	wxMenu *view_menu = new wxMenu;
547 
548 	view_menu->Append(OPJFRAME_VIEWZOOM, wxT("&Zoom\tCtrl+Z"));
549 	view_menu->SetHelpString(OPJFRAME_VIEWZOOM, wxT("Rescale the image"));
550 
551 	view_menu->Append(OPJFRAME_VIEWFIT, wxT("Zoom to &fit\tCtrl+F"));
552 	view_menu->SetHelpString(OPJFRAME_VIEWFIT, wxT("Fit the image in canvas"));
553 
554 	view_menu->Append(OPJFRAME_VIEWRELOAD, wxT("&Reload image\tCtrl+R"));
555 	view_menu->SetHelpString(OPJFRAME_VIEWRELOAD, wxT("Reload the current image"));
556 
557 	view_menu->AppendSeparator();
558 
559 	view_menu->Append(OPJFRAME_VIEWPREVFRAME, wxT("&Prev frame\tLeft"));
560 	view_menu->SetHelpString(OPJFRAME_VIEWPREVFRAME, wxT("View previous frame"));
561 
562 	view_menu->Append(OPJFRAME_VIEWHOMEFRAME, wxT("&Start frame\tHome"));
563 	view_menu->SetHelpString(OPJFRAME_VIEWHOMEFRAME, wxT("View starting frame"));
564 
565 	view_menu->Append(OPJFRAME_VIEWNEXTFRAME, wxT("&Next frame\tRight"));
566 	view_menu->SetHelpString(OPJFRAME_VIEWNEXTFRAME, wxT("View next frame"));
567 
568 	view_menu->AppendSeparator();
569 
570 	view_menu->Append(OPJFRAME_VIEWLESSLAYERS, wxT("&Less layers\t-"));
571 	view_menu->SetHelpString(OPJFRAME_VIEWLESSLAYERS, wxT("Remove a layer"));
572 
573 	view_menu->Append(OPJFRAME_VIEWALLLAYERS, wxT("&All layers\t0"));
574 	view_menu->SetHelpString(OPJFRAME_VIEWALLLAYERS, wxT("Show all layers"));
575 
576 	view_menu->Append(OPJFRAME_VIEWMORELAYERS, wxT("&More layers\t+"));
577 	view_menu->SetHelpString(OPJFRAME_VIEWMORELAYERS, wxT("Add a layer"));
578 
579 	view_menu->AppendSeparator();
580 
581 	view_menu->Append(OPJFRAME_VIEWLESSRES, wxT("&Less resolution\t<"));
582 	view_menu->SetHelpString(OPJFRAME_VIEWLESSRES, wxT("Reduce the resolution"));
583 
584 	view_menu->Append(OPJFRAME_VIEWFULLRES, wxT("&Full resolution\tf"));
585 	view_menu->SetHelpString(OPJFRAME_VIEWFULLRES, wxT("Full resolution"));
586 
587 	view_menu->Append(OPJFRAME_VIEWMORERES, wxT("&More resolution\t>"));
588 	view_menu->SetHelpString(OPJFRAME_VIEWMORERES, wxT("Increase the resolution"));
589 
590 	view_menu->AppendSeparator();
591 
592 	view_menu->Append(OPJFRAME_VIEWPREVCOMP, wxT("&Prev component\tDown"));
593 	view_menu->SetHelpString(OPJFRAME_VIEWPREVCOMP, wxT("View previous component"));
594 
595 	view_menu->Append(OPJFRAME_VIEWALLCOMPS, wxT("&All components\ta"));
596 	view_menu->SetHelpString(OPJFRAME_VIEWALLCOMPS, wxT("View all components"));
597 
598 	view_menu->Append(OPJFRAME_VIEWNEXTCOMP, wxT("&Next component\tUp"));
599 	view_menu->SetHelpString(OPJFRAME_VIEWNEXTCOMP, wxT("View next component"));
600 
601 
602 	// settings menu and its items
603 	wxMenu *sets_menu = new wxMenu;
604 
605 	sets_menu->Append(OPJFRAME_SETSENCO, wxT("&Encoder\tCtrl+E"));
606 	sets_menu->SetHelpString(OPJFRAME_SETSENCO, wxT("Encoder settings"));
607 
608 	sets_menu->Append(OPJFRAME_SETSDECO, wxT("&Decoder\tCtrl+D"));
609 	sets_menu->SetHelpString(OPJFRAME_SETSDECO, wxT("Decoder settings"));
610 
611 	// help menu and its items
612 	wxMenu *help_menu = new wxMenu;
613 
614 	help_menu->Append(OPJFRAME_HELPABOUT, wxT("&About\tF1"));
615 	help_menu->SetHelpString(OPJFRAME_HELPABOUT, wxT("Basic info on the program"));
616 
617 	// the whole menubar
618 	wxMenuBar *menu_bar = new wxMenuBar;
619 	menu_bar->Append(file_menu, wxT("&File"));
620 	menu_bar->Append(view_menu, wxT("&View"));
621 	menu_bar->Append(sets_menu, wxT("&Settings"));
622 	menu_bar->Append(help_menu, wxT("&Help"));
623 
624 	// Associate the menu bar with the frame
625 	SetMenuBar(menu_bar);
626 
627 	// the status bar
628 	CreateStatusBar();
629 
630 	// the toolbar
631 	tool_bar = new wxToolBar(this, OPJFRAME_TOOLBAR,
632 								wxDefaultPosition, wxDefaultSize,
633 								wxTB_HORIZONTAL | wxNO_BORDER);
634 	wxBitmap bmpOpen = wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_TOOLBAR,
635 												wxDefaultSize);
636 	wxBitmap bmpSaveAs = wxArtProvider::GetBitmap(wxART_FILE_SAVE_AS, wxART_TOOLBAR,
637 												wxDefaultSize);
638 	wxBitmap bmpZoom = wxArtProvider::GetBitmap(wxART_FIND, wxART_TOOLBAR,
639 												wxDefaultSize);
640 	wxBitmap bmpFit = wxArtProvider::GetBitmap(wxART_FIND_AND_REPLACE, wxART_TOOLBAR,
641 												wxDefaultSize);
642 	wxBitmap bmpReload = wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_TOOLBAR,
643 												wxDefaultSize);
644 	wxBitmap bmpDecosettings = wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_TOOLBAR,
645 												wxDefaultSize);
646 	wxBitmap bmpEncosettings = wxArtProvider::GetBitmap(wxART_LIST_VIEW, wxART_TOOLBAR,
647 												wxDefaultSize);
648 	wxBitmap bmpPrevframe = wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR,
649 												wxDefaultSize);
650 	wxBitmap bmpHomeframe = wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_TOOLBAR,
651 												wxDefaultSize);
652 	wxBitmap bmpNextframe = wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR,
653 												wxDefaultSize);
654 	wxBitmap bmpLesslayers = bmpPrevframe;
655 	wxBitmap bmpAlllayers = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR,
656 												wxDefaultSize);
657 	wxBitmap bmpMorelayers = bmpNextframe;
658 	wxBitmap bmpLessres = bmpPrevframe;
659 	wxBitmap bmpFullres = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR,
660 												wxDefaultSize);
661 	wxBitmap bmpMoreres = bmpNextframe;
662 	wxBitmap bmpPrevcomp = bmpPrevframe;
663 	wxBitmap bmpAllcomps = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR,
664 												wxDefaultSize);
665 	wxBitmap bmpNextcomp = bmpNextframe;
666 
667 	tool_bar->AddTool(OPJFRAME_FILEOPEN, bmpOpen, wxT("Open"));
668 	tool_bar->AddTool(OPJFRAME_FILESAVEAS, bmpSaveAs, wxT("Save as "));
669 	//tool_bar->EnableTool(OPJFRAME_FILESAVEAS, false);
670 	tool_bar->AddSeparator();
671 	tool_bar->AddTool(OPJFRAME_VIEWZOOM, bmpZoom, wxT("Zoom"));
672 	tool_bar->AddTool(OPJFRAME_VIEWFIT, bmpFit, wxT("Zoom to fit"));
673 	tool_bar->AddTool(OPJFRAME_VIEWRELOAD, bmpReload, wxT("Reload"));
674 	tool_bar->AddSeparator();
675 	tool_bar->AddTool(OPJFRAME_SETSDECO, bmpDecosettings, wxT("Decoder settings"));
676 	tool_bar->AddTool(OPJFRAME_SETSENCO, bmpEncosettings, wxT("Encoder settings"));
677 	tool_bar->AddSeparator();
678 	tool_bar->AddTool(OPJFRAME_VIEWPREVFRAME, bmpPrevframe, wxT("Previous frame"));
679 	tool_bar->AddTool(OPJFRAME_VIEWHOMEFRAME, bmpHomeframe, wxT("Starting frame"));
680 	tool_bar->AddTool(OPJFRAME_VIEWNEXTFRAME, bmpNextframe, wxT("Next frame"));
681 	tool_bar->AddSeparator();
682 	tool_bar->AddTool(OPJFRAME_VIEWLESSLAYERS, bmpLesslayers, wxT("Remove a layer"));
683 	tool_bar->AddTool(OPJFRAME_VIEWALLLAYERS, bmpAlllayers, wxT("Show all layers"));
684 	tool_bar->AddTool(OPJFRAME_VIEWMORELAYERS, bmpMorelayers, wxT("Add a layer"));
685 	tool_bar->AddSeparator();
686 	tool_bar->AddTool(OPJFRAME_VIEWLESSRES, bmpLessres, wxT("Reduce the resolution"));
687 	tool_bar->AddTool(OPJFRAME_VIEWFULLRES, bmpFullres, wxT("Full resolution"));
688 	tool_bar->AddTool(OPJFRAME_VIEWMORERES, bmpMoreres, wxT("Increase the resolution"));
689 	tool_bar->AddSeparator();
690 	tool_bar->AddTool(OPJFRAME_VIEWPREVCOMP, bmpPrevcomp, wxT("Previous component"));
691 	tool_bar->AddTool(OPJFRAME_VIEWALLCOMPS, bmpAllcomps, wxT("All components"));
692 	tool_bar->AddTool(OPJFRAME_VIEWNEXTCOMP, bmpNextcomp, wxT("Next component"));
693 	tool_bar->Realize();
694 
695 	// associate the toolbar with the frame
696 	SetToolBar(tool_bar);
697 
698 	// show the toolbar?
699 	if (!wxGetApp().m_showtoolbar)
700 		tool_bar->Show(false);
701 	else
702 		tool_bar->Show(true);
703 
704 	// the logging window
705 	loggingWindow = new wxSashLayoutWindow(this, OPJFRAME_LOGWIN,
706 											wxDefaultPosition, wxSize(400, wxGetApp().m_peekerheight),
707 											wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN
708 											);
709 	loggingWindow->SetDefaultSize(wxSize(1000, wxGetApp().m_peekerheight));
710 	loggingWindow->SetOrientation(wxLAYOUT_HORIZONTAL);
711 	loggingWindow->SetAlignment(wxLAYOUT_BOTTOM);
712 	//loggingWindow->SetBackgroundColour(wxColour(0, 0, 255));
713 	loggingWindow->SetSashVisible(wxSASH_TOP, true);
714 
715 	// show the logging?
716 	if (!wxGetApp().m_showpeeker)
717 		loggingWindow->Show(false);
718 	else
719 		loggingWindow->Show(true);
720 
721 	// create the bottom notebook
722 	m_bookCtrlbottom = new wxNotebook(loggingWindow, BOTTOM_NOTEBOOK_ID,
723 								wxDefaultPosition, wxDefaultSize,
724 								wxBK_LEFT);
725 
726 	// create the text control of the logger
727 	m_textCtrl = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""),
728 								wxDefaultPosition, wxDefaultSize,
729 								wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY
730 								);
731 	m_textCtrl->SetValue(_T("Logging window\n"));
732 
733 	// add it to the notebook
734 	m_bookCtrlbottom->AddPage(m_textCtrl, wxT("Log"));
735 
736 	// create the text control of the browser
737 	m_textCtrlbrowse = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""),
738 								wxDefaultPosition, wxDefaultSize,
739 								wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY | wxTE_RICH
740 								);
741 	wxFont *browsefont = new wxFont(wxNORMAL_FONT->GetPointSize(),
742 		wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
743     m_textCtrlbrowse->SetDefaultStyle(wxTextAttr(wxNullColour, wxNullColour, *browsefont));
744 	m_textCtrlbrowse->AppendText(wxT("Browsing window\n"));
745 
746 	// add it the notebook
747 	m_bookCtrlbottom->AddPage(m_textCtrlbrowse, wxT("Peek"), false);
748 
749 	// the browser window
750 	markerTreeWindow = new wxSashLayoutWindow(this, OPJFRAME_BROWSEWIN,
751 											  wxDefaultPosition, wxSize(wxGetApp().m_browserwidth, 30),
752 											  wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN
753 											  );
754 	markerTreeWindow->SetDefaultSize(wxSize(wxGetApp().m_browserwidth, 1000));
755 	markerTreeWindow->SetOrientation(wxLAYOUT_VERTICAL);
756 	markerTreeWindow->SetAlignment(wxLAYOUT_LEFT);
757 	//markerTreeWindow->SetBackgroundColour(wxColour(0, 255, 0));
758 	markerTreeWindow->SetSashVisible(wxSASH_RIGHT, true);
759 	markerTreeWindow->SetExtraBorderSize(0);
760 
761 	// create the browser notebook
762 	m_bookCtrl = new wxNotebook(markerTreeWindow, LEFT_NOTEBOOK_ID,
763 								wxDefaultPosition, wxDefaultSize,
764 								wxBK_TOP);
765 
766 	// show the browser?
767 	if (!wxGetApp().m_showbrowser)
768 		markerTreeWindow->Show(false);
769 	else
770 		markerTreeWindow->Show(true);
771 
772 #ifdef __WXMOTIF__
773 	// For some reason, we get a memcpy crash in wxLogStream::DoLogStream
774 	// on gcc/wxMotif, if we use wxLogTextCtl. Maybe it's just gcc?
775 	delete wxLog::SetActiveTarget(new wxLogStderr);
776 #else
777 	// set our text control as the log target
778 	wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl);
779 	delete wxLog::SetActiveTarget(logWindow);
780 #endif
781 
782 	// associate drop targets with the controls
783 	SetDropTarget(new OPJDnDFile(this));
784 
785 }
786 
787 // this is the frame destructor
~OPJFrame(void)788 OPJFrame::~OPJFrame(void)
789 {
790 	// save size settings
791 	GetSize(&(wxGetApp().m_framewidth), &(wxGetApp().m_frameheight));
792 
793 	// delete all possible things
794 	delete m_bookCtrl;
795 	m_bookCtrl = NULL;
796 
797 	delete markerTreeWindow;
798 	markerTreeWindow = NULL;
799 
800 	delete m_textCtrl;
801 	m_textCtrl = NULL;
802 
803 	delete m_bookCtrlbottom;
804 	m_bookCtrlbottom = NULL;
805 
806 	delete loggingWindow;
807 	loggingWindow = NULL;
808 }
809 
OnNotebook(wxNotebookEvent & event)810 void OPJFrame::OnNotebook(wxNotebookEvent& event)
811 {
812 	int sel = event.GetSelection();
813 	long childnum;
814 
815 	m_bookCtrl->GetPageText(sel).ToLong(&childnum);
816 
817 	if (m_childhash[childnum])
818 		m_childhash[childnum]->Activate();
819 
820 	//wxLogMessage(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber);
821 
822 }
823 
824 
Resize(int number)825 void OPJFrame::Resize(int number)
826 {
827 	wxSize size = GetClientSize();
828 }
829 
OnSetsEnco(wxCommandEvent & event)830 void OPJFrame::OnSetsEnco(wxCommandEvent& event)
831 {
832 	int n;
833 
834     OPJEncoderDialog dialog(this, event.GetId());
835 
836     if (dialog.ShowModal() == wxID_OK) {
837 
838 		// load settings
839 		wxGetApp().m_subsampling = dialog.m_subsamplingCtrl->GetValue();
840 		wxGetApp().m_origin = dialog.m_originCtrl->GetValue();
841 		wxGetApp().m_rates = dialog.m_rateCtrl->GetValue();
842 		wxGetApp().m_quality = dialog.m_qualityCtrl->GetValue();
843 		wxGetApp().m_enablequality = dialog.m_qualityRadio->GetValue();
844 		wxGetApp().m_multicomp = dialog.m_mctCheck->GetValue();
845 		wxGetApp().m_irreversible = dialog.m_irrevCheck->GetValue();
846 		wxGetApp().m_resolutions = dialog.m_resolutionsCtrl->GetValue();
847 		wxGetApp().m_cbsize = dialog.m_cbsizeCtrl->GetValue();
848 		wxGetApp().m_prsize = dialog.m_prsizeCtrl->GetValue();
849 		wxGetApp().m_tsize = dialog.m_tsizeCtrl->GetValue();
850 		wxGetApp().m_torigin = dialog.m_toriginCtrl->GetValue();
851 		wxGetApp().m_progression = dialog.progressionBox->GetSelection();
852 		wxGetApp().m_enablesop = dialog.m_sopCheck->GetValue();
853 		wxGetApp().m_enableeph = dialog.m_ephCheck->GetValue();
854 		wxGetApp().m_enablebypass = dialog.m_enablebypassCheck->GetValue();
855 		wxGetApp().m_enablereset = dialog.m_enableresetCheck->GetValue();
856 		wxGetApp().m_enablerestart = dialog.m_enablerestartCheck->GetValue();
857 		wxGetApp().m_enablevsc = dialog.m_enablevscCheck->GetValue();
858 		wxGetApp().m_enableerterm = dialog.m_enableertermCheck->GetValue();
859 		wxGetApp().m_enablesegmark = dialog.m_enablesegmarkCheck->GetValue();
860 		wxGetApp().m_enableidx = dialog.m_enableidxCheck->GetValue();
861 		wxGetApp().m_index = dialog.m_indexCtrl->GetValue();
862 		wxGetApp().m_enablecomm = dialog.m_enablecommCheck->GetValue();
863 		wxGetApp().m_comment = dialog.m_commentCtrl->GetValue();
864 		wxGetApp().m_enablepoc = dialog.m_enablepocCheck->GetValue();
865 		wxGetApp().m_poc = dialog.m_pocCtrl->GetValue();
866 #ifdef USE_JPWL
867 		wxGetApp().m_enablejpwle = dialog.m_enablejpwlCheck->GetValue();
868 		for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {
869 			wxGetApp().m_hprotsel[n] = dialog.m_hprotChoice[n]->GetSelection();
870 			wxGetApp().m_htileval[n] = dialog.m_htileCtrl[n]->GetValue();
871 			wxGetApp().m_pprotsel[n] = dialog.m_pprotChoice[n]->GetSelection();
872 			wxGetApp().m_ptileval[n] = dialog.m_ptileCtrl[n]->GetValue();
873 			wxGetApp().m_ppackval[n] = dialog.m_ppackCtrl[n]->GetValue();
874 			wxGetApp().m_sensisel[n] = dialog.m_sensiChoice[n]->GetSelection();
875 			wxGetApp().m_stileval[n] = dialog.m_stileCtrl[n]->GetValue();
876 		}
877 #endif // USE_JPWL
878 	};
879 }
880 
OnSetsDeco(wxCommandEvent & event)881 void OPJFrame::OnSetsDeco(wxCommandEvent& event)
882 {
883     OPJDecoderDialog dialog(this, event.GetId());
884 
885     if (dialog.ShowModal() == wxID_OK) {
886 
887 		// load settings
888 		wxGetApp().m_enabledeco = dialog.m_enabledecoCheck->GetValue();
889 		wxGetApp().m_enableparse = dialog.m_enableparseCheck->GetValue();
890 		wxGetApp().m_resizemethod = dialog.m_resizeBox->GetSelection() - 1;
891 		wxGetApp().m_reducefactor = dialog.m_reduceCtrl->GetValue();
892 		wxGetApp().m_qualitylayers = dialog.m_layerCtrl->GetValue();
893 		wxGetApp().m_components = dialog.m_numcompsCtrl->GetValue();
894 		wxGetApp().m_framenum = dialog.m_framenumCtrl->GetValue();
895 #ifdef USE_JPWL
896 		wxGetApp().m_enablejpwl = dialog.m_enablejpwlCheck->GetValue();
897 		wxGetApp().m_expcomps = dialog.m_expcompsCtrl->GetValue();
898 		wxGetApp().m_maxtiles = dialog.m_maxtilesCtrl->GetValue();
899 #endif // USE_JPWL
900 
901 	};
902 }
903 
OnQuit(wxCommandEvent & WXUNUSED (event))904 void OPJFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
905 {
906 	Close(true);
907 }
908 
OnClose(wxCommandEvent & WXUNUSED (event))909 void OPJFrame::OnClose(wxCommandEvent& WXUNUSED(event))
910 {
911 	// current frame
912 	OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
913 
914 	if (!currframe)
915 		return;
916 
917 	wxCloseEvent e;
918 	currframe->OnClose(e);
919 }
920 
OnFit(wxCommandEvent & event)921 void OPJFrame::OnFit(wxCommandEvent& event)
922 {
923 	OPJChildFrame *currchild;
924 	wxString eventstring = event.GetString();
925 
926 	//wxLogMessage(wxT("OnFit:%d:%s"), event.GetInt(), eventstring);
927 
928 	// current child
929 	if (event.GetInt() >= 1) {
930 		currchild = m_childhash[event.GetInt()];
931 	} else {
932 		currchild = (OPJChildFrame *) GetActiveChild();
933 	}
934 
935 	// problems
936 	if (!currchild)
937 		return;
938 
939 	// current canvas
940 	OPJCanvas *currcanvas = currchild->m_canvas;
941 
942 	// find a fit-to-width zoom
943 	/*int zooml, wzooml, hzooml;
944 	wxSize clientsize = currcanvas->GetClientSize();
945 	wzooml = (int) ceil(100.0 * (double) (clientsize.GetWidth() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetWidth()));
946 	hzooml = (int) ceil(100.0 * (double) (clientsize.GetHeight() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetHeight()));
947 	zooml = wxMin(100, wxMin(wzooml, hzooml));*/
948 
949 	// fit to width
950 	Rescale(-1, currchild);
951 }
952 
OnZoom(wxCommandEvent & WXUNUSED (event))953 void OPJFrame::OnZoom(wxCommandEvent& WXUNUSED(event))
954 {
955 	// current frame
956 	OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
957 
958 	if (!currframe)
959 		return;
960 
961 	// get the preferred zoom
962 	long zooml = wxGetNumberFromUser(wxT("Choose a scale between 5% and 300%"),
963 		wxT("Zoom (%)"),
964 		wxT("Image scale"),
965 		currframe->m_canvas->m_zooml, 5, 300, NULL, wxDefaultPosition);
966 
967 	// rescale current frame image if necessary
968 	if (zooml >= 5) {
969 		Rescale(zooml, currframe);
970 		wxLogMessage(wxT("zoom to %d%%"), zooml);
971 	}
972 }
973 
Rescale(int zooml,OPJChildFrame * currframe)974 void OPJFrame::Rescale(int zooml, OPJChildFrame *currframe)
975 {
976 	wxImage new_image = currframe->m_canvas->m_image100.ConvertToImage();
977 
978 	// resizing enabled?
979 	if (wxGetApp().m_resizemethod == -1) {
980 
981 		zooml = 100;
982 
983 	} else {
984 
985 		if (zooml < 0) {
986 			// find a fit-to-width zoom
987 			int wzooml, hzooml;
988 			//wxSize clientsize = currframe->m_canvas->GetClientSize();
989 			wxSize clientsize = currframe->m_frame->GetActiveChild()->GetClientSize();
990 			wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + currframe->m_canvas->m_image100.GetWidth()));
991 			hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + currframe->m_canvas->m_image100.GetHeight()));
992 			zooml = wxMin(100, wxMin(wzooml, hzooml));
993 		}
994 	}
995 
996 	if (zooml != 100)
997 		new_image.Rescale((int) ((double) zooml * (double) new_image.GetWidth() / 100.0),
998 			(int) ((double) zooml * (double) new_image.GetHeight() / 100.0),
999 			wxGetApp().m_resizemethod ? wxIMAGE_QUALITY_HIGH : wxIMAGE_QUALITY_NORMAL);
1000 	currframe->m_canvas->m_image = wxBitmap(new_image);
1001 	currframe->m_canvas->SetScrollbars(20,
1002 										20,
1003 										(int)(0.5 + (double) new_image.GetWidth() / 20.0),
1004 										(int)(0.5 + (double) new_image.GetHeight() / 20.0)
1005 										);
1006 
1007 	currframe->m_canvas->Refresh();
1008 
1009 	wxLogMessage(wxT("Rescale said %d%%"), zooml);
1010 
1011 	// update zoom
1012 	currframe->m_canvas->m_zooml = zooml;
1013 }
1014 
1015 
OnReload(wxCommandEvent & event)1016 void OPJFrame::OnReload(wxCommandEvent& event)
1017 {
1018 	OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
1019 
1020 	if (currframe) {
1021 		OPJDecoThread *dthread = currframe->m_canvas->CreateDecoThread();
1022 
1023 		if (dthread->Run() != wxTHREAD_NO_ERROR)
1024 			wxLogMessage(wxT("Can't start deco thread!"));
1025 		else
1026 			wxLogMessage(wxT("New deco thread started."));
1027 
1028 		currframe->m_canvas->Refresh();
1029 
1030 		// update zoom
1031 		//currframe->m_canvas->m_zooml = zooml;
1032 	}
1033 }
1034 
OnPrevFrame(wxCommandEvent & event)1035 void OPJFrame::OnPrevFrame(wxCommandEvent& event)
1036 {
1037 	if (--wxGetApp().m_framenum < 0)
1038 		wxGetApp().m_framenum = 0;
1039 
1040 	wxCommandEvent e;
1041 	OnReload(e);
1042 }
1043 
OnHomeFrame(wxCommandEvent & event)1044 void OPJFrame::OnHomeFrame(wxCommandEvent& event)
1045 {
1046 	wxGetApp().m_framenum = 0;
1047 
1048 	wxCommandEvent e;
1049 	OnReload(e);
1050 }
1051 
OnNextFrame(wxCommandEvent & event)1052 void OPJFrame::OnNextFrame(wxCommandEvent& event)
1053 {
1054 	++wxGetApp().m_framenum;
1055 
1056 	wxCommandEvent e;
1057 	OnReload(e);
1058 }
1059 
OnLessLayers(wxCommandEvent & event)1060 void OPJFrame::OnLessLayers(wxCommandEvent& event)
1061 {
1062 	if (--wxGetApp().m_qualitylayers < 1)
1063 		wxGetApp().m_qualitylayers = 1;
1064 
1065 	wxCommandEvent e;
1066 	OnReload(e);
1067 }
1068 
OnAllLayers(wxCommandEvent & event)1069 void OPJFrame::OnAllLayers(wxCommandEvent& event)
1070 {
1071 	wxGetApp().m_qualitylayers = 0;
1072 
1073 	wxCommandEvent e;
1074 	OnReload(e);
1075 }
1076 
OnMoreLayers(wxCommandEvent & event)1077 void OPJFrame::OnMoreLayers(wxCommandEvent& event)
1078 {
1079 	++wxGetApp().m_qualitylayers;
1080 
1081 	wxCommandEvent e;
1082 	OnReload(e);
1083 }
1084 
OnLessRes(wxCommandEvent & event)1085 void OPJFrame::OnLessRes(wxCommandEvent& event)
1086 {
1087 	++wxGetApp().m_reducefactor;
1088 
1089 	wxCommandEvent e;
1090 	OnReload(e);
1091 }
1092 
OnFullRes(wxCommandEvent & event)1093 void OPJFrame::OnFullRes(wxCommandEvent& event)
1094 {
1095 	wxGetApp().m_reducefactor = 0;
1096 
1097 	wxCommandEvent e;
1098 	OnReload(e);
1099 }
1100 
OnMoreRes(wxCommandEvent & event)1101 void OPJFrame::OnMoreRes(wxCommandEvent& event)
1102 {
1103 	if (--wxGetApp().m_reducefactor < 0)
1104 		wxGetApp().m_reducefactor = 0;
1105 
1106 	wxCommandEvent e;
1107 	OnReload(e);
1108 }
1109 
OnPrevComp(wxCommandEvent & event)1110 void OPJFrame::OnPrevComp(wxCommandEvent& event)
1111 {
1112 	if (--wxGetApp().m_components < 1)
1113 		wxGetApp().m_components = 1;
1114 
1115 	wxCommandEvent e;
1116 	OnReload(e);
1117 }
1118 
OnAllComps(wxCommandEvent & event)1119 void OPJFrame::OnAllComps(wxCommandEvent& event)
1120 {
1121 	wxGetApp().m_components = 0;
1122 
1123 	wxCommandEvent e;
1124 	OnReload(e);
1125 }
1126 
OnNextComp(wxCommandEvent & event)1127 void OPJFrame::OnNextComp(wxCommandEvent& event)
1128 {
1129 	++wxGetApp().m_components;
1130 
1131 	wxCommandEvent e;
1132 	OnReload(e);
1133 }
1134 
OnToggleBrowser(wxCommandEvent & WXUNUSED (event))1135 void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event))
1136 {
1137     if (markerTreeWindow->IsShown())
1138         markerTreeWindow->Show(false);
1139     else
1140         markerTreeWindow->Show(true);
1141 
1142     wxLayoutAlgorithm layout;
1143     layout.LayoutMDIFrame(this);
1144 
1145 	wxGetApp().m_showbrowser = markerTreeWindow->IsShown();
1146 
1147     // Leaves bits of itself behind sometimes
1148     GetClientWindow()->Refresh();
1149 }
1150 
OnTogglePeeker(wxCommandEvent & WXUNUSED (event))1151 void OPJFrame::OnTogglePeeker(wxCommandEvent& WXUNUSED(event))
1152 {
1153     if (loggingWindow->IsShown())
1154         loggingWindow->Show(false);
1155     else
1156         loggingWindow->Show(true);
1157 
1158     wxLayoutAlgorithm layout;
1159     layout.LayoutMDIFrame(this);
1160 
1161 	wxGetApp().m_showpeeker = loggingWindow->IsShown();
1162 
1163     // Leaves bits of itself behind sometimes
1164     GetClientWindow()->Refresh();
1165 }
1166 
OnToggleToolbar(wxCommandEvent & WXUNUSED (event))1167 void OPJFrame::OnToggleToolbar(wxCommandEvent& WXUNUSED(event))
1168 {
1169     if (tool_bar->IsShown())
1170         tool_bar->Show(false);
1171     else
1172         tool_bar->Show(true);
1173 
1174     wxLayoutAlgorithm layout;
1175     layout.LayoutMDIFrame(this);
1176 
1177 	wxGetApp().m_showtoolbar = tool_bar->IsShown();
1178 
1179     // Leaves bits of itself behind sometimes
1180     GetClientWindow()->Refresh();
1181 }
1182 
OnSashDrag(wxSashEvent & event)1183 void OPJFrame::OnSashDrag(wxSashEvent& event)
1184 {
1185 	int wid, hei;
1186 
1187     if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
1188         return;
1189 
1190     switch (event.GetId()) {
1191 		case OPJFRAME_BROWSEWIN:
1192 		{
1193 			markerTreeWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));
1194 			break;
1195 		}
1196 		case OPJFRAME_LOGWIN:
1197 		{
1198 			loggingWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));
1199 			break;
1200 		}
1201     }
1202 
1203     wxLayoutAlgorithm layout;
1204     layout.LayoutMDIFrame(this);
1205 
1206     // Leaves bits of itself behind sometimes
1207     GetClientWindow()->Refresh();
1208 
1209 	// update dimensions
1210 	markerTreeWindow->GetSize(&wid, &hei);
1211 	wxGetApp().m_browserwidth = wid;
1212 
1213 	loggingWindow->GetSize(&wid, &hei);
1214 	wxGetApp().m_peekerheight = hei;
1215 
1216 }
1217 
OnThreadLogmsg(wxCommandEvent & event)1218 void OPJFrame::OnThreadLogmsg(wxCommandEvent& event)
1219 {
1220 #if 1
1221     wxLogMessage(wxT("Frame got message from worker thread: %d"), event.GetInt());
1222     wxLogMessage(event.GetString());
1223 #else
1224     int n = event.GetInt();
1225     if ( n == -1 )
1226     {
1227         m_dlgProgress->Destroy();
1228         m_dlgProgress = (wxProgressDialog *)NULL;
1229 
1230         // the dialog is aborted because the event came from another thread, so
1231         // we may need to wake up the main event loop for the dialog to be
1232         // really closed
1233         wxWakeUpIdle();
1234     }
1235     else
1236     {
1237         if ( !m_dlgProgress->Update(n) )
1238         {
1239             wxCriticalSectionLocker lock(m_critsectWork);
1240 
1241             m_cancelled = true;
1242         }
1243     }
1244 #endif
1245 }
1246 
1247 
1248 // physically save the file
SaveFile(wxArrayString paths,wxArrayString filenames)1249 void OPJFrame::SaveFile(wxArrayString paths, wxArrayString filenames)
1250 {
1251 	size_t count = paths.GetCount();
1252 	wxString msg, s;
1253 
1254 	if (wxFile::Exists(paths[0].c_str())) {
1255 
1256 		s.Printf(wxT("File %s already exists. Do you want to overwrite it?\n"), filenames[0].c_str());
1257 		wxMessageDialog dialog3(this, s, _T("File exists"), wxYES_NO);
1258 		if (dialog3.ShowModal() == wxID_NO)
1259 			return;
1260 	}
1261 
1262 	/*s.Printf(_T("File %d: %s (%s)\n"), (int)0, paths[0].c_str(), filenames[0].c_str());
1263 	msg += s;
1264 
1265 	wxMessageDialog dialog2(this, msg, _T("Selected files"));
1266 	dialog2.ShowModal();*/
1267 
1268 	if (!GetActiveChild())
1269 		return;
1270 
1271 	((OPJChildFrame *) GetActiveChild())->m_canvas->m_savename = paths[0];
1272 
1273 	OPJEncoThread *ethread = ((OPJChildFrame *) GetActiveChild())->m_canvas->CreateEncoThread();
1274 
1275     if (ethread->Run() != wxTHREAD_NO_ERROR)
1276         wxLogMessage(wxT("Can't start enco thread!"));
1277     else
1278 		wxLogMessage(wxT("New enco thread started."));
1279 
1280 
1281 }
1282 
1283 // physically open the files
OpenFiles(wxArrayString paths,wxArrayString filenames)1284 void OPJFrame::OpenFiles(wxArrayString paths, wxArrayString filenames)
1285 {
1286 
1287 	size_t count = paths.GetCount();
1288 	for (size_t n = 0; n < count; n++) {
1289 
1290 		wxString msg, s;
1291 		s.Printf(_T("File %d: %s (%s)\n"), (int)n, paths[n].c_str(), filenames[n].c_str());
1292 
1293 		msg += s;
1294 
1295 		/*wxMessageDialog dialog2(this, msg, _T("Selected files"));
1296 		dialog2.ShowModal();*/
1297 
1298 		// Make another frame, containing a canvas
1299 		OPJChildFrame *subframe = new OPJChildFrame(this,
1300 													paths[n],
1301 													winNumber,
1302 													wxT("Canvas Frame"),
1303 													wxDefaultPosition, wxSize(300, 300),
1304 													wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE
1305 													);
1306 		m_childhash[winNumber] = subframe;
1307 
1308 		// create own marker tree
1309 		m_treehash[winNumber] = new OPJMarkerTree(m_bookCtrl, subframe, paths[n], wxT("Parsing..."), TreeTest_Ctrl,
1310 												  wxDefaultPosition, wxDefaultSize,
1311 												  wxTR_DEFAULT_STYLE | wxSUNKEN_BORDER
1312 												  );
1313 
1314 		m_bookCtrl->AddPage(m_treehash[winNumber], wxString::Format(wxT("%u"), winNumber), false);
1315 
1316 		for (unsigned int p = 0; p < m_bookCtrl->GetPageCount(); p++) {
1317 			if (m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), winNumber)) {
1318 				m_bookCtrl->ChangeSelection(p);
1319 				break;
1320 			}
1321 		}
1322 
1323 		winNumber++;
1324 	}
1325 }
1326 
OnFileOpen(wxCommandEvent & WXUNUSED (event))1327 void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event))
1328 {
1329     wxString wildcards =
1330 #ifdef __WXMOTIF__
1331 	wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.*j*2*");
1332 #else
1333 #if wxUSE_LIBOPENJPEG
1334 	wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.jp2;*.j2k;*.j2c;*.mj2")
1335 #endif
1336 #if USE_MXF
1337 	wxT("|MXF JPEG 2000 video (*.mxf)|*.mxf")
1338 #endif // USE_MXF
1339 #if wxUSE_LIBJPEG
1340 		wxT("|JPEG files (*.jpg)|*.jpg")
1341 #endif
1342 #if OPJ_MANYFORMATS
1343 		wxT("|BMP files (*.bmp)|*.bmp")
1344 		wxT("|PNG files (*.png)|*.png")
1345 		wxT("|GIF files (*.gif)|*.gif")
1346 		wxT("|PNM files (*.pnm)|*.pnm")
1347 		wxT("|TIFF files (*.tif,*.tiff)|*.tif*")
1348 #endif
1349 		wxT("|All files|*");
1350 #endif
1351     wxFileDialog dialog(this, _T("Open image file(s)"),
1352                         wxEmptyString, wxEmptyString, wildcards,
1353                         wxFD_OPEN|wxFD_MULTIPLE);
1354 
1355     if (dialog.ShowModal() == wxID_OK) {
1356         wxArrayString paths, filenames;
1357 
1358         dialog.GetPaths(paths);
1359         dialog.GetFilenames(filenames);
1360 
1361 		OpenFiles(paths, filenames);
1362     }
1363 
1364 }
1365 
OnFileSaveAs(wxCommandEvent & WXUNUSED (event))1366 void OPJFrame::OnFileSaveAs(wxCommandEvent& WXUNUSED(event))
1367 {
1368     wxString wildcards =
1369 #ifdef wxUSE_LIBOPENJPEG
1370 #ifdef __WXMOTIF__
1371 	wxT("JPEG 2000 codestream (*.j2k)|*.*j*2*");
1372 #else
1373 	wxT("JPEG 2000 codestream (*.j2k)|*.j2k")
1374 	wxT("|JPEG 2000 file format (*.jp2)|*.jp2");
1375 #endif
1376 #else
1377 	wxT("Houston we have a problem");
1378 #endif
1379 
1380     wxFileDialog dialog(this, _T("Save image file"),
1381                         wxEmptyString, wxEmptyString, wildcards,
1382                         wxFD_SAVE);
1383 
1384     if (dialog.ShowModal() == wxID_OK) {
1385         wxArrayString paths, filenames;
1386 
1387         dialog.GetPaths(paths);
1388         dialog.GetFilenames(filenames);
1389 
1390 		SaveFile(paths, filenames);
1391     }
1392 
1393 
1394 }
1395 
OnMemoryOpen(wxCommandEvent & WXUNUSED (event))1396 void OPJFrame::OnMemoryOpen(wxCommandEvent& WXUNUSED(event))
1397 {
1398 	// do nothing
1399 	return;
1400 
1401 	wxTextEntryDialog dialog(this, wxT("Memory HEX address range: start_address-stop_address"),
1402 							wxT("Decode a memory buffer"),
1403 							wxT("0x-0x"),
1404 							wxOK | wxCANCEL | wxCENTRE,
1405 							wxDefaultPosition);
1406 
1407 	if (dialog.ShowModal() == wxID_OK) {
1408 
1409 	}
1410 
1411 }
1412 
BEGIN_EVENT_TABLE(OPJCanvas,wxScrolledWindow)1413 BEGIN_EVENT_TABLE(OPJCanvas, wxScrolledWindow)
1414     EVT_MOUSE_EVENTS(OPJCanvas::OnEvent)
1415     EVT_MENU(OPJCANVAS_THREADSIGNAL, OPJCanvas::OnThreadSignal)
1416 END_EVENT_TABLE()
1417 
1418 // Define a constructor for my canvas
1419 OPJCanvas::OPJCanvas(wxFileName fname, wxWindow *parent, const wxPoint& pos, const wxSize& size)
1420         : wxScrolledWindow(parent, wxID_ANY, pos, size,
1421                            wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE)
1422 {
1423     SetBackgroundColour(OPJ_CANVAS_COLOUR);
1424 
1425 	m_fname = fname;
1426 	m_childframe = (OPJChildFrame *) parent;
1427 	// 100% zoom
1428 	m_zooml = 100;
1429 
1430 
1431     OPJDecoThread *dthread = CreateDecoThread();
1432 
1433     if (dthread->Run() != wxTHREAD_NO_ERROR)
1434         wxLogMessage(wxT("Can't start deco thread!"));
1435     else
1436 		wxLogMessage(wxT("New deco thread started."));
1437 
1438 	// 100% zoom
1439 	//m_zooml = 100;
1440 
1441 }
1442 
CreateDecoThread(void)1443 OPJDecoThread *OPJCanvas::CreateDecoThread(void)
1444 {
1445     OPJDecoThread *dthread = new OPJDecoThread(this);
1446 
1447     if (dthread->Create() != wxTHREAD_NO_ERROR)
1448 		wxLogError(wxT("Can't create deco thread!"));
1449 
1450     wxCriticalSectionLocker enter(wxGetApp().m_deco_critsect);
1451     wxGetApp().m_deco_threads.Add(dthread);
1452 
1453     return dthread;
1454 }
1455 
CreateEncoThread(void)1456 OPJEncoThread *OPJCanvas::CreateEncoThread(void)
1457 {
1458     OPJEncoThread *ethread = new OPJEncoThread(this);
1459 
1460     if (ethread->Create() != wxTHREAD_NO_ERROR)
1461 		wxLogError(wxT("Can't create enco thread!"));
1462 
1463     wxCriticalSectionLocker enter(wxGetApp().m_enco_critsect);
1464     wxGetApp().m_enco_threads.Add(ethread);
1465 
1466     return ethread;
1467 }
1468 
1469 #define activeoverlay 0
1470 // Define the repainting behaviour
OnDraw(wxDC & dc)1471 void OPJCanvas::OnDraw(wxDC& dc)
1472 {
1473 	if (m_image.Ok()) {
1474 		dc.DrawBitmap(m_image, OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER);
1475 
1476 		if (activeoverlay) {
1477 			dc.SetPen(*wxRED_PEN);
1478 			dc.SetBrush(*wxTRANSPARENT_BRUSH);
1479 			//int tw, th;
1480 			dc.DrawRectangle(OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER,
1481 				(unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_twidth / 100.0),
1482 				(unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_theight / 100.0));
1483 		}
1484 
1485 	} else {
1486 		dc.SetFont(*wxSWISS_FONT);
1487 		dc.SetPen(*wxBLACK_PEN);
1488 #ifdef __WXGTK__
1489 		dc.DrawText(_T("Decoding image, please wait... (press \"Zoom to Fit\" to show the image)"), 40, 50);
1490 #else
1491 		dc.DrawText(_T("Decoding image, please wait..."), 40, 50);
1492 #endif
1493 	}
1494 }
1495 
1496 // This implements a tiny doodling program! Drag the mouse using
1497 // the left button.
OnEvent(wxMouseEvent & event)1498 void OPJCanvas::OnEvent(wxMouseEvent& event)
1499 {
1500 #if USE_PENCIL_ON_CANVAS
1501   wxClientDC dc(this);
1502   PrepareDC(dc);
1503 
1504   wxPoint pt(event.GetLogicalPosition(dc));
1505 
1506   if ((xpos > -1) && (ypos > -1) && event.Dragging()) {
1507     dc.SetPen(*wxRED_PEN);
1508     dc.DrawLine(xpos, ypos, pt.x, pt.y);
1509   }
1510   xpos = pt.x;
1511   ypos = pt.y;
1512 #endif
1513 }
1514 
OnSize(wxSizeEvent & WXUNUSED (event))1515 void OPJFrame::OnSize(wxSizeEvent& WXUNUSED(event))
1516 {
1517     wxLayoutAlgorithm layout;
1518     layout.LayoutMDIFrame(this);
1519 }
1520 
OnThreadSignal(wxCommandEvent & event)1521 void OPJCanvas::OnThreadSignal(wxCommandEvent& event)
1522 {
1523 #if 1
1524     wxLogMessage(wxT("Canvas got signal from deco thread: %d"), event.GetInt());
1525     wxLogMessage(event.GetString());
1526 #else
1527     int n = event.GetInt();
1528     if ( n == -1 )
1529     {
1530         m_dlgProgress->Destroy();
1531         m_dlgProgress = (wxProgressDialog *)NULL;
1532 
1533         // the dialog is aborted because the event came from another thread, so
1534         // we may need to wake up the main event loop for the dialog to be
1535         // really closed
1536         wxWakeUpIdle();
1537     }
1538     else
1539     {
1540         if ( !m_dlgProgress->Update(n) )
1541         {
1542             wxCriticalSectionLocker lock(m_critsectWork);
1543 
1544             m_cancelled = true;
1545         }
1546     }
1547 #endif
1548 }
1549 
1550 
1551 // Note that OPJFRAME_FILEOPEN and OPJFRAME_HELPABOUT commands get passed
1552 // to the parent window for processing, so no need to
1553 // duplicate event handlers here.
1554 
BEGIN_EVENT_TABLE(OPJChildFrame,wxMDIChildFrame)1555 BEGIN_EVENT_TABLE(OPJChildFrame, wxMDIChildFrame)
1556   /*EVT_MENU(SASHTEST_CHILD_QUIT, OPJChildFrame::OnQuit)*/
1557   EVT_CLOSE(OPJChildFrame::OnClose)
1558   EVT_SET_FOCUS(OPJChildFrame::OnGotFocus)
1559   EVT_KILL_FOCUS(OPJChildFrame::OnLostFocus)
1560 END_EVENT_TABLE()
1561 
1562 OPJChildFrame::OPJChildFrame(OPJFrame *parent, wxFileName fname, int winnumber, const wxString& title, const wxPoint& pos, const wxSize& size,
1563 const long style):
1564   wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style)
1565 {
1566 	m_frame = (OPJFrame  *) parent;
1567 	m_canvas = NULL;
1568 	//my_children.Append(this);
1569 	m_fname = fname;
1570 	m_winnumber = winnumber;
1571 	SetTitle(wxString::Format(_T("%d: "), m_winnumber) + m_fname.GetFullName());
1572 
1573 	  // Give it an icon (this is ignored in MDI mode: uses resources)
1574 #ifdef __WXMSW__
1575 	SetIcon(wxIcon(wxT("OPJChild16")));
1576 #endif
1577 
1578 	// Give it a status line
1579 	/*CreateStatusBar();*/
1580 
1581 	int width, height;
1582 	GetClientSize(&width, &height);
1583 
1584 	OPJCanvas *canvas = new OPJCanvas(fname, this, wxPoint(0, 0), wxSize(width, height));
1585 #if USE_PENCIL_ON_CANVAS
1586 	canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));
1587 #endif
1588 	m_canvas = canvas;
1589 
1590 	// Give it scrollbars
1591 	canvas->SetScrollbars(20, 20, 5, 5);
1592 
1593 	Show(true);
1594 	Maximize(true);
1595 
1596 	/*wxLogError(wxString::Format(wxT("Created tree %d (0x%x)"), m_winnumber, m_frame->m_treehash[m_winnumber]));*/
1597 
1598 }
1599 
~OPJChildFrame(void)1600 OPJChildFrame::~OPJChildFrame(void)
1601 {
1602   //my_children.DeleteObject(this);
1603 }
1604 
1605 
OnClose(wxCloseEvent & event)1606 void OPJChildFrame::OnClose(wxCloseEvent& event)
1607 {
1608 	for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {
1609 		if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {
1610 			m_frame->m_bookCtrl->DeletePage(p);
1611 			break;
1612 		}
1613 	}
1614 	Destroy();
1615 
1616 	wxLogMessage(wxT("Closed: %d"), m_winnumber);
1617 }
1618 
OnActivate(wxActivateEvent & event)1619 void OPJChildFrame::OnActivate(wxActivateEvent& event)
1620 {
1621   /*if (event.GetActive() && m_canvas)
1622     m_canvas->SetFocus();*/
1623 }
1624 
OnGotFocus(wxFocusEvent & event)1625 void OPJChildFrame::OnGotFocus(wxFocusEvent& event)
1626 {
1627 	// we need to check if the notebook is being destroyed or not
1628 	if (!m_frame->m_bookCtrl)
1629 		return;
1630 
1631 	for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {
1632 
1633 		if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {
1634 			m_frame->m_bookCtrl->ChangeSelection(p);
1635 			break;
1636 		}
1637 
1638 	}
1639 
1640 	//wxLogMessage(wxT("Got focus: %d (%x)"), m_winnumber, event.GetWindow());
1641 }
1642 
OnLostFocus(wxFocusEvent & event)1643 void OPJChildFrame::OnLostFocus(wxFocusEvent& event)
1644 {
1645 	//wxLogMessage(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow());
1646 }
1647 
1648 
1649 ////////////////////////////////
1650 // drag and drop
1651 ////////////////////////////////
1652 
OnDropFiles(wxCoord,wxCoord,const wxArrayString & filenames)1653 bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)
1654 {
1655     /*size_t nFiles = filenames.GetCount();
1656     wxString str;
1657     str.Printf( _T("%d files dropped\n"), (int)nFiles);
1658     for ( size_t n = 0; n < nFiles; n++ ) {
1659         str << filenames[n] << wxT("\n");
1660     }
1661     wxLogMessage(str);*/
1662 	m_pOwner->OpenFiles(filenames, filenames);
1663 
1664     return true;
1665 }
1666 
1667