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