2 * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita' degli studi di Perugia (UPG), Italy
\r
3 * All rights reserved.
\r
5 * Redistribution and use in source and binary forms, with or without
\r
6 * modification, are permitted provided that the following conditions
\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
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
26 /////////////////////////////////////////////////////////////////////////////
\r
27 // Name: sashtest.cpp
\r
28 // Purpose: Layout/sash sample
\r
29 // Author: Julian Smart
\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
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
58 // Purpose: wxWidgets thread sample
\r
59 // Author: Guilhem Lavaux, Vadim Zeitlin
\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
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
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
108 // Purpose: Drag and drop sample
\r
109 // Author: Vadim Zeitlin
\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
114 // Licence: wxWindows licence
\r
115 /////////////////////////////////////////////////////////////////////////////
\r
116 /////////////////////////////////////////////////////////////////////////////
\r
118 // Purpose: wxHtml testing example
\r
119 /////////////////////////////////////////////////////////////////////////////
\r
122 #include "OPJViewer.h"
\r
124 IMPLEMENT_APP(OPJViewerApp)
\r
126 // For drawing lines in a canvas
\r
132 // Initialise this in OnInit, not statically
\r
133 bool OPJViewerApp::OnInit(void)
\r
138 wxChar **wxArgv = new wxChar *[argc + 1];
\r
140 for (n = 0; n < argc; n++ ) {
\r
141 wxMB2WXbuf warg = wxConvertMB2WX((char *) argv[n]);
\r
142 wxArgv[n] = wxStrdup(warg);
\r
147 #else // !wxUSE_UNICODE
\r
149 #define wxArgv argv
\r
151 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
\r
153 #if wxUSE_CMDLINE_PARSER
\r
155 static const wxCmdLineEntryDesc cmdLineDesc[] =
\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
160 { wxCMD_LINE_PARAM, NULL, NULL, _T("input file"),
\r
161 wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE },
\r
163 { wxCMD_LINE_NONE }
\r
166 wxCmdLineParser parser(cmdLineDesc, argc, wxArgv);
\r
168 switch (parser.Parse()) {
\r
170 wxLogMessage(wxT("Help was given, terminating."));
\r
174 ShowCmdLine(parser);
\r
178 wxLogMessage(wxT("Syntax error detected."));
\r
182 #endif // wxUSE_CMDLINE_PARSER
\r
184 //wxInitAllImageHandlers();
\r
186 wxImage::AddHandler( new wxJPEGHandler );
\r
188 #if wxUSE_LIBOPENJPEG
\r
189 wxImage::AddHandler( new wxJPEG2000Handler );
\r
192 wxImage::AddHandler( new wxMXFHandler );
\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
201 // we use a XPM image in our HTML page
\r
202 wxImage::AddHandler(new wxXPMHandler);
\r
204 // memory file system
\r
205 wxFileSystem::AddHandler(new wxMemoryFSHandler);
\r
207 #ifdef OPJ_INICONFIG
\r
208 //load decoding engine parameters
\r
209 OPJconfig = new wxConfig(OPJ_APPLICATION, OPJ_APPLICATION_VENDOR);
\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
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
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
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
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
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
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
287 m_enablejpwl = true;
\r
288 m_expcomps = JPWL_EXPECTED_COMPONENTS;
\r
289 m_maxtiles = JPWL_MAXIMUM_TILES;
\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
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
309 m_cbsize= wxT("32,32");
\r
310 m_prsize= wxT("[128,128],[128,128]");
\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
328 m_enablejpwle = true;
\r
329 for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {
\r
339 #endif // OPJ_INICONFIG
\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
347 m_comment = wxT("Created by OPJViewer - OpenJPEG version ");
\r
351 m_comment += wxString::Format(wxT("%s with JPWL"), (char *) opj_version());
\r
353 m_comment += wxString::Format(wxT("%s"), (char *) opj_version());
\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
363 // Give it an icon (this is ignored in MDI mode: uses resources)
\r
365 frame->SetIcon(wxIcon(wxT("OPJViewer16")));
\r
370 SetTopWindow(frame);
\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
380 //wxLogMessage(paths[0]);
\r
381 frame->OpenFiles(paths, filenames);
\r
387 int OPJViewerApp::OnExit()
\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
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
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
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
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
452 #endif // OPJ_INICONFIG
\r
457 void OPJViewerApp::ShowCmdLine(const wxCmdLineParser& parser)
\r
459 wxString s = wxT("Command line parsed successfully:\nInput files: ");
\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
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
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
511 // file menu and its items
\r
512 wxMenu *file_menu = new wxMenu;
\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
517 file_menu->Append(OPJFRAME_MEMORYOPEN, wxT("&Memory\tCtrl+M"));
\r
518 file_menu->SetHelpString(OPJFRAME_MEMORYOPEN, wxT("Open a memory buffer"));
\r
520 file_menu->Append(OPJFRAME_FILECLOSE, wxT("&Close\tCtrl+C"));
\r
521 file_menu->SetHelpString(OPJFRAME_FILECLOSE, wxT("Close current image"));
\r
523 file_menu->AppendSeparator();
\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
529 file_menu->AppendSeparator();
\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
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
537 file_menu->Append(OPJFRAME_FILETOGGLET, wxT("Toggle &toolbar\tCtrl+T"));
\r
538 file_menu->SetHelpString(OPJFRAME_FILETOGGLET, wxT("Toggle the toolbar"));
\r
540 file_menu->AppendSeparator();
\r
542 file_menu->Append(OPJFRAME_FILEEXIT, wxT("&Exit\tCtrl+Q"));
\r
543 file_menu->SetHelpString(OPJFRAME_FILEEXIT, wxT("Quit this program"));
\r
545 // view menu and its items
\r
546 wxMenu *view_menu = new wxMenu;
\r
548 view_menu->Append(OPJFRAME_VIEWZOOM, wxT("&Zoom\tCtrl+Z"));
\r
549 view_menu->SetHelpString(OPJFRAME_VIEWZOOM, wxT("Rescale the image"));
\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
554 view_menu->Append(OPJFRAME_VIEWRELOAD, wxT("&Reload image\tCtrl+R"));
\r
555 view_menu->SetHelpString(OPJFRAME_VIEWRELOAD, wxT("Reload the current image"));
\r
557 view_menu->AppendSeparator();
\r
559 view_menu->Append(OPJFRAME_VIEWPREVFRAME, wxT("&Prev frame\tLeft"));
\r
560 view_menu->SetHelpString(OPJFRAME_VIEWPREVFRAME, wxT("View previous frame"));
\r
562 view_menu->Append(OPJFRAME_VIEWHOMEFRAME, wxT("&Start frame\tHome"));
\r
563 view_menu->SetHelpString(OPJFRAME_VIEWHOMEFRAME, wxT("View starting frame"));
\r
565 view_menu->Append(OPJFRAME_VIEWNEXTFRAME, wxT("&Next frame\tRight"));
\r
566 view_menu->SetHelpString(OPJFRAME_VIEWNEXTFRAME, wxT("View next frame"));
\r
568 view_menu->AppendSeparator();
\r
570 view_menu->Append(OPJFRAME_VIEWLESSLAYERS, wxT("&Less layers\t-"));
\r
571 view_menu->SetHelpString(OPJFRAME_VIEWLESSLAYERS, wxT("Remove a layer"));
\r
573 view_menu->Append(OPJFRAME_VIEWALLLAYERS, wxT("&All layers\t0"));
\r
574 view_menu->SetHelpString(OPJFRAME_VIEWALLLAYERS, wxT("Show all layers"));
\r
576 view_menu->Append(OPJFRAME_VIEWMORELAYERS, wxT("&More layers\t+"));
\r
577 view_menu->SetHelpString(OPJFRAME_VIEWMORELAYERS, wxT("Add a layer"));
\r
579 view_menu->AppendSeparator();
\r
581 view_menu->Append(OPJFRAME_VIEWLESSRES, wxT("&Less resolution\t<"));
\r
582 view_menu->SetHelpString(OPJFRAME_VIEWLESSRES, wxT("Reduce the resolution"));
\r
584 view_menu->Append(OPJFRAME_VIEWFULLRES, wxT("&Full resolution\tf"));
\r
585 view_menu->SetHelpString(OPJFRAME_VIEWFULLRES, wxT("Full resolution"));
\r
587 view_menu->Append(OPJFRAME_VIEWMORERES, wxT("&More resolution\t>"));
\r
588 view_menu->SetHelpString(OPJFRAME_VIEWMORERES, wxT("Increase the resolution"));
\r
590 view_menu->AppendSeparator();
\r
592 view_menu->Append(OPJFRAME_VIEWPREVCOMP, wxT("&Prev component\tDown"));
\r
593 view_menu->SetHelpString(OPJFRAME_VIEWPREVCOMP, wxT("View previous component"));
\r
595 view_menu->Append(OPJFRAME_VIEWALLCOMPS, wxT("&All components\ta"));
\r
596 view_menu->SetHelpString(OPJFRAME_VIEWALLCOMPS, wxT("View all components"));
\r
598 view_menu->Append(OPJFRAME_VIEWNEXTCOMP, wxT("&Next component\tUp"));
\r
599 view_menu->SetHelpString(OPJFRAME_VIEWNEXTCOMP, wxT("View next component"));
\r
602 // settings menu and its items
\r
603 wxMenu *sets_menu = new wxMenu;
\r
605 sets_menu->Append(OPJFRAME_SETSENCO, wxT("&Encoder\tCtrl+E"));
\r
606 sets_menu->SetHelpString(OPJFRAME_SETSENCO, wxT("Encoder settings"));
\r
608 sets_menu->Append(OPJFRAME_SETSDECO, wxT("&Decoder\tCtrl+D"));
\r
609 sets_menu->SetHelpString(OPJFRAME_SETSDECO, wxT("Decoder settings"));
\r
611 // help menu and its items
\r
612 wxMenu *help_menu = new wxMenu;
\r
614 help_menu->Append(OPJFRAME_HELPABOUT, wxT("&About\tF1"));
\r
615 help_menu->SetHelpString(OPJFRAME_HELPABOUT, wxT("Basic info on the program"));
\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
624 // Associate the menu bar with the frame
\r
625 SetMenuBar(menu_bar);
\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
636 wxBitmap bmpSaveAs = wxArtProvider::GetBitmap(wxART_FILE_SAVE_AS, wxART_TOOLBAR,
\r
638 wxBitmap bmpZoom = wxArtProvider::GetBitmap(wxART_FIND, wxART_TOOLBAR,
\r
640 wxBitmap bmpFit = wxArtProvider::GetBitmap(wxART_FIND_AND_REPLACE, wxART_TOOLBAR,
\r
642 wxBitmap bmpReload = wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_TOOLBAR,
\r
644 wxBitmap bmpDecosettings = wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_TOOLBAR,
\r
646 wxBitmap bmpEncosettings = wxArtProvider::GetBitmap(wxART_LIST_VIEW, wxART_TOOLBAR,
\r
648 wxBitmap bmpPrevframe = wxArtProvider::GetBitmap(wxART_GO_BACK, wxART_TOOLBAR,
\r
650 wxBitmap bmpHomeframe = wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_TOOLBAR,
\r
652 wxBitmap bmpNextframe = wxArtProvider::GetBitmap(wxART_GO_FORWARD, wxART_TOOLBAR,
\r
654 wxBitmap bmpLesslayers = bmpPrevframe;
\r
655 wxBitmap bmpAlllayers = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR,
\r
657 wxBitmap bmpMorelayers = bmpNextframe;
\r
658 wxBitmap bmpLessres = bmpPrevframe;
\r
659 wxBitmap bmpFullres = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR,
\r
661 wxBitmap bmpMoreres = bmpNextframe;
\r
662 wxBitmap bmpPrevcomp = bmpPrevframe;
\r
663 wxBitmap bmpAllcomps = wxArtProvider::GetBitmap(wxART_GO_TO_PARENT, wxART_TOOLBAR,
\r
665 wxBitmap bmpNextcomp = bmpNextframe;
\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
695 // associate the toolbar with the frame
\r
696 SetToolBar(tool_bar);
\r
698 // show the toolbar?
\r
699 if (!wxGetApp().m_showtoolbar)
\r
700 tool_bar->Show(false);
\r
702 tool_bar->Show(true);
\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
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
715 // show the logging?
\r
716 if (!wxGetApp().m_showpeeker)
\r
717 loggingWindow->Show(false);
\r
719 loggingWindow->Show(true);
\r
721 // create the bottom notebook
\r
722 m_bookCtrlbottom = new wxNotebook(loggingWindow, BOTTOM_NOTEBOOK_ID,
\r
723 wxDefaultPosition, wxDefaultSize,
\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
731 m_textCtrl->SetValue(_T("Logging window\n"));
\r
733 // add it to the notebook
\r
734 m_bookCtrlbottom->AddPage(m_textCtrl, wxT("Log"));
\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
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
746 // add it the notebook
\r
747 m_bookCtrlbottom->AddPage(m_textCtrlbrowse, wxT("Peek"), false);
\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
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
761 // create the browser notebook
\r
762 m_bookCtrl = new wxNotebook(markerTreeWindow, LEFT_NOTEBOOK_ID,
\r
763 wxDefaultPosition, wxDefaultSize,
\r
766 // show the browser?
\r
767 if (!wxGetApp().m_showbrowser)
\r
768 markerTreeWindow->Show(false);
\r
770 markerTreeWindow->Show(true);
\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
777 // set our text control as the log target
\r
778 wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl);
\r
779 delete wxLog::SetActiveTarget(logWindow);
\r
782 // associate drop targets with the controls
\r
783 SetDropTarget(new OPJDnDFile(this));
\r
787 // this is the frame destructor
\r
788 OPJFrame::~OPJFrame(void)
\r
790 // save size settings
\r
791 GetSize(&(wxGetApp().m_framewidth), &(wxGetApp().m_frameheight));
\r
793 // delete all possible things
\r
797 delete markerTreeWindow;
\r
798 markerTreeWindow = NULL;
\r
803 delete m_bookCtrlbottom;
\r
804 m_bookCtrlbottom = NULL;
\r
806 delete loggingWindow;
\r
807 loggingWindow = NULL;
\r
810 void OPJFrame::OnNotebook(wxNotebookEvent& event)
\r
812 int sel = event.GetSelection();
\r
815 m_bookCtrl->GetPageText(sel).ToLong(&childnum);
\r
817 if (m_childhash[childnum])
\r
818 m_childhash[childnum]->Activate();
\r
820 //wxLogMessage(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber);
\r
825 void OPJFrame::Resize(int number)
\r
827 wxSize size = GetClientSize();
\r
830 void OPJFrame::OnSetsEnco(wxCommandEvent& event)
\r
834 OPJEncoderDialog dialog(this, event.GetId());
\r
836 if (dialog.ShowModal() == wxID_OK) {
\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
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
881 void OPJFrame::OnSetsDeco(wxCommandEvent& event)
\r
883 OPJDecoderDialog dialog(this, event.GetId());
\r
885 if (dialog.ShowModal() == wxID_OK) {
\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
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
904 void OPJFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
\r
909 void OPJFrame::OnClose(wxCommandEvent& WXUNUSED(event))
\r
912 OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
\r
918 currframe->OnClose(e);
\r
921 void OPJFrame::OnFit(wxCommandEvent& event)
\r
923 OPJChildFrame *currchild;
\r
924 wxString eventstring = event.GetString();
\r
926 //wxLogMessage(wxT("OnFit:%d:%s"), event.GetInt(), eventstring);
\r
929 if (event.GetInt() >= 1) {
\r
930 currchild = m_childhash[event.GetInt()];
\r
932 currchild = (OPJChildFrame *) GetActiveChild();
\r
940 OPJCanvas *currcanvas = currchild->m_canvas;
\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
950 Rescale(-1, currchild);
\r
953 void OPJFrame::OnZoom(wxCommandEvent& WXUNUSED(event))
\r
956 OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
\r
961 // get the preferred zoom
\r
962 long zooml = wxGetNumberFromUser(wxT("Choose a scale between 5% and 300%"),
\r
964 wxT("Image scale"),
\r
965 currframe->m_canvas->m_zooml, 5, 300, NULL, wxDefaultPosition);
\r
967 // rescale current frame image if necessary
\r
969 Rescale(zooml, currframe);
\r
970 wxLogMessage(wxT("zoom to %d%%"), zooml);
\r
974 void OPJFrame::Rescale(int zooml, OPJChildFrame *currframe)
\r
976 wxImage new_image = currframe->m_canvas->m_image100.ConvertToImage();
\r
978 // resizing enabled?
\r
979 if (wxGetApp().m_resizemethod == -1) {
\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
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
1003 (int)(0.5 + (double) new_image.GetWidth() / 20.0),
\r
1004 (int)(0.5 + (double) new_image.GetHeight() / 20.0)
\r
1007 currframe->m_canvas->Refresh();
\r
1009 wxLogMessage(wxT("Rescale said %d%%"), zooml);
\r
1012 currframe->m_canvas->m_zooml = zooml;
\r
1016 void OPJFrame::OnReload(wxCommandEvent& event)
\r
1018 OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
\r
1021 OPJDecoThread *dthread = currframe->m_canvas->CreateDecoThread();
\r
1023 if (dthread->Run() != wxTHREAD_NO_ERROR)
\r
1024 wxLogMessage(wxT("Can't start deco thread!"));
\r
1026 wxLogMessage(wxT("New deco thread started."));
\r
1028 currframe->m_canvas->Refresh();
\r
1031 //currframe->m_canvas->m_zooml = zooml;
\r
1035 void OPJFrame::OnPrevFrame(wxCommandEvent& event)
\r
1037 if (--wxGetApp().m_framenum < 0)
\r
1038 wxGetApp().m_framenum = 0;
\r
1044 void OPJFrame::OnHomeFrame(wxCommandEvent& event)
\r
1046 wxGetApp().m_framenum = 0;
\r
1052 void OPJFrame::OnNextFrame(wxCommandEvent& event)
\r
1054 ++wxGetApp().m_framenum;
\r
1060 void OPJFrame::OnLessLayers(wxCommandEvent& event)
\r
1062 if (--wxGetApp().m_qualitylayers < 1)
\r
1063 wxGetApp().m_qualitylayers = 1;
\r
1069 void OPJFrame::OnAllLayers(wxCommandEvent& event)
\r
1071 wxGetApp().m_qualitylayers = 0;
\r
1077 void OPJFrame::OnMoreLayers(wxCommandEvent& event)
\r
1079 ++wxGetApp().m_qualitylayers;
\r
1085 void OPJFrame::OnLessRes(wxCommandEvent& event)
\r
1087 ++wxGetApp().m_reducefactor;
\r
1093 void OPJFrame::OnFullRes(wxCommandEvent& event)
\r
1095 wxGetApp().m_reducefactor = 0;
\r
1101 void OPJFrame::OnMoreRes(wxCommandEvent& event)
\r
1103 if (--wxGetApp().m_reducefactor < 0)
\r
1104 wxGetApp().m_reducefactor = 0;
\r
1110 void OPJFrame::OnPrevComp(wxCommandEvent& event)
\r
1112 if (--wxGetApp().m_components < 1)
\r
1113 wxGetApp().m_components = 1;
\r
1119 void OPJFrame::OnAllComps(wxCommandEvent& event)
\r
1121 wxGetApp().m_components = 0;
\r
1127 void OPJFrame::OnNextComp(wxCommandEvent& event)
\r
1129 ++wxGetApp().m_components;
\r
1135 void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event))
\r
1137 if (markerTreeWindow->IsShown())
\r
1138 markerTreeWindow->Show(false);
\r
1140 markerTreeWindow->Show(true);
\r
1142 wxLayoutAlgorithm layout;
\r
1143 layout.LayoutMDIFrame(this);
\r
1145 wxGetApp().m_showbrowser = markerTreeWindow->IsShown();
\r
1147 // Leaves bits of itself behind sometimes
\r
1148 GetClientWindow()->Refresh();
\r
1151 void OPJFrame::OnTogglePeeker(wxCommandEvent& WXUNUSED(event))
\r
1153 if (loggingWindow->IsShown())
\r
1154 loggingWindow->Show(false);
\r
1156 loggingWindow->Show(true);
\r
1158 wxLayoutAlgorithm layout;
\r
1159 layout.LayoutMDIFrame(this);
\r
1161 wxGetApp().m_showpeeker = loggingWindow->IsShown();
\r
1163 // Leaves bits of itself behind sometimes
\r
1164 GetClientWindow()->Refresh();
\r
1167 void OPJFrame::OnToggleToolbar(wxCommandEvent& WXUNUSED(event))
\r
1169 if (tool_bar->IsShown())
\r
1170 tool_bar->Show(false);
\r
1172 tool_bar->Show(true);
\r
1174 wxLayoutAlgorithm layout;
\r
1175 layout.LayoutMDIFrame(this);
\r
1177 wxGetApp().m_showtoolbar = tool_bar->IsShown();
\r
1179 // Leaves bits of itself behind sometimes
\r
1180 GetClientWindow()->Refresh();
\r
1183 void OPJFrame::OnSashDrag(wxSashEvent& event)
\r
1187 if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
\r
1190 switch (event.GetId()) {
\r
1191 case OPJFRAME_BROWSEWIN:
\r
1193 markerTreeWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));
\r
1196 case OPJFRAME_LOGWIN:
\r
1198 loggingWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));
\r
1203 wxLayoutAlgorithm layout;
\r
1204 layout.LayoutMDIFrame(this);
\r
1206 // Leaves bits of itself behind sometimes
\r
1207 GetClientWindow()->Refresh();
\r
1209 // update dimensions
\r
1210 markerTreeWindow->GetSize(&wid, &hei);
\r
1211 wxGetApp().m_browserwidth = wid;
\r
1213 loggingWindow->GetSize(&wid, &hei);
\r
1214 wxGetApp().m_peekerheight = hei;
\r
1218 void OPJFrame::OnThreadLogmsg(wxCommandEvent& event)
\r
1221 wxLogMessage(wxT("Frame got message from worker thread: %d"), event.GetInt());
\r
1222 wxLogMessage(event.GetString());
\r
1224 int n = event.GetInt();
\r
1227 m_dlgProgress->Destroy();
\r
1228 m_dlgProgress = (wxProgressDialog *)NULL;
\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
1237 if ( !m_dlgProgress->Update(n) )
\r
1239 wxCriticalSectionLocker lock(m_critsectWork);
\r
1241 m_cancelled = true;
\r
1248 // physically save the file
\r
1249 void OPJFrame::SaveFile(wxArrayString paths, wxArrayString filenames)
\r
1251 size_t count = paths.GetCount();
\r
1254 if (wxFile::Exists(paths[0].c_str())) {
\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
1262 /*s.Printf(_T("File %d: %s (%s)\n"), (int)0, paths[0].c_str(), filenames[0].c_str());
\r
1265 wxMessageDialog dialog2(this, msg, _T("Selected files"));
\r
1266 dialog2.ShowModal();*/
\r
1268 if (!GetActiveChild())
\r
1271 ((OPJChildFrame *) GetActiveChild())->m_canvas->m_savename = paths[0];
\r
1273 OPJEncoThread *ethread = ((OPJChildFrame *) GetActiveChild())->m_canvas->CreateEncoThread();
\r
1275 if (ethread->Run() != wxTHREAD_NO_ERROR)
\r
1276 wxLogMessage(wxT("Can't start enco thread!"));
\r
1278 wxLogMessage(wxT("New enco thread started."));
\r
1283 // physically open the files
\r
1284 void OPJFrame::OpenFiles(wxArrayString paths, wxArrayString filenames)
\r
1287 size_t count = paths.GetCount();
\r
1288 for (size_t n = 0; n < count; n++) {
\r
1291 s.Printf(_T("File %d: %s (%s)\n"), (int)n, paths[n].c_str(), filenames[n].c_str());
\r
1295 /*wxMessageDialog dialog2(this, msg, _T("Selected files"));
\r
1296 dialog2.ShowModal();*/
\r
1298 // Make another frame, containing a canvas
\r
1299 OPJChildFrame *subframe = new OPJChildFrame(this,
\r
1302 wxT("Canvas Frame"),
\r
1303 wxDefaultPosition, wxSize(300, 300),
\r
1304 wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE
\r
1306 m_childhash[winNumber] = subframe;
\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
1314 m_bookCtrl->AddPage(m_treehash[winNumber], wxString::Format(wxT("%u"), winNumber), false);
\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
1327 void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event))
\r
1329 wxString wildcards =
\r
1330 #ifdef __WXMOTIF__
\r
1331 wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.*j*2*");
\r
1333 #if wxUSE_LIBOPENJPEG
\r
1334 wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.jp2;*.j2k;*.j2c;*.mj2")
\r
1337 wxT("|MXF JPEG 2000 video (*.mxf)|*.mxf")
\r
1340 wxT("|JPEG files (*.jpg)|*.jpg")
\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
1349 wxT("|All files|*");
\r
1351 wxFileDialog dialog(this, _T("Open image file(s)"),
\r
1352 wxEmptyString, wxEmptyString, wildcards,
\r
1353 wxFD_OPEN|wxFD_MULTIPLE);
\r
1355 if (dialog.ShowModal() == wxID_OK) {
\r
1356 wxArrayString paths, filenames;
\r
1358 dialog.GetPaths(paths);
\r
1359 dialog.GetFilenames(filenames);
\r
1361 OpenFiles(paths, filenames);
\r
1366 void OPJFrame::OnFileSaveAs(wxCommandEvent& WXUNUSED(event))
\r
1368 wxString wildcards =
\r
1369 #ifdef wxUSE_LIBOPENJPEG
\r
1370 #ifdef __WXMOTIF__
\r
1371 wxT("JPEG 2000 codestream (*.j2k)|*.*j*2*");
\r
1373 wxT("JPEG 2000 codestream (*.j2k)|*.j2k")
\r
1374 wxT("|JPEG 2000 file format (*.jp2)|*.jp2");
\r
1378 wxFileDialog dialog(this, _T("Save image file"),
\r
1379 wxEmptyString, wxEmptyString, wildcards,
\r
1382 if (dialog.ShowModal() == wxID_OK) {
\r
1383 wxArrayString paths, filenames;
\r
1385 dialog.GetPaths(paths);
\r
1386 dialog.GetFilenames(filenames);
\r
1388 SaveFile(paths, filenames);
\r
1394 void OPJFrame::OnMemoryOpen(wxCommandEvent& WXUNUSED(event))
\r
1399 wxTextEntryDialog dialog(this, wxT("Memory HEX address range: start_address-stop_address"),
\r
1400 wxT("Decode a memory buffer"),
\r
1402 wxOK | wxCANCEL | wxCENTRE,
\r
1403 wxDefaultPosition);
\r
1405 if (dialog.ShowModal() == wxID_OK) {
\r
1411 BEGIN_EVENT_TABLE(OPJCanvas, wxScrolledWindow)
\r
1412 EVT_MOUSE_EVENTS(OPJCanvas::OnEvent)
\r
1413 EVT_MENU(OPJCANVAS_THREADSIGNAL, OPJCanvas::OnThreadSignal)
\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
1421 SetBackgroundColour(OPJ_CANVAS_COLOUR);
\r
1424 m_childframe = (OPJChildFrame *) parent;
\r
1429 OPJDecoThread *dthread = CreateDecoThread();
\r
1431 if (dthread->Run() != wxTHREAD_NO_ERROR)
\r
1432 wxLogMessage(wxT("Can't start deco thread!"));
\r
1434 wxLogMessage(wxT("New deco thread started."));
\r
1441 OPJDecoThread *OPJCanvas::CreateDecoThread(void)
\r
1443 OPJDecoThread *dthread = new OPJDecoThread(this);
\r
1445 if (dthread->Create() != wxTHREAD_NO_ERROR)
\r
1446 wxLogError(wxT("Can't create deco thread!"));
\r
1448 wxCriticalSectionLocker enter(wxGetApp().m_deco_critsect);
\r
1449 wxGetApp().m_deco_threads.Add(dthread);
\r
1454 OPJEncoThread *OPJCanvas::CreateEncoThread(void)
\r
1456 OPJEncoThread *ethread = new OPJEncoThread(this);
\r
1458 if (ethread->Create() != wxTHREAD_NO_ERROR)
\r
1459 wxLogError(wxT("Can't create enco thread!"));
\r
1461 wxCriticalSectionLocker enter(wxGetApp().m_enco_critsect);
\r
1462 wxGetApp().m_enco_threads.Add(ethread);
\r
1467 #define activeoverlay 0
\r
1468 // Define the repainting behaviour
\r
1469 void OPJCanvas::OnDraw(wxDC& dc)
\r
1471 if (m_image.Ok()) {
\r
1472 dc.DrawBitmap(m_image, OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER);
\r
1474 if (activeoverlay) {
\r
1475 dc.SetPen(*wxRED_PEN);
\r
1476 dc.SetBrush(*wxTRANSPARENT_BRUSH);
\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
1484 dc.SetFont(*wxSWISS_FONT);
\r
1485 dc.SetPen(*wxBLACK_PEN);
\r
1487 dc.DrawText(_T("Decoding image, please wait... (press \"Zoom to Fit\" to show the image)"), 40, 50);
\r
1489 dc.DrawText(_T("Decoding image, please wait..."), 40, 50);
\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
1498 #if USE_PENCIL_ON_CANVAS
\r
1499 wxClientDC dc(this);
\r
1502 wxPoint pt(event.GetLogicalPosition(dc));
\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
1513 void OPJFrame::OnSize(wxSizeEvent& WXUNUSED(event))
\r
1515 wxLayoutAlgorithm layout;
\r
1516 layout.LayoutMDIFrame(this);
\r
1519 void OPJCanvas::OnThreadSignal(wxCommandEvent& event)
\r
1522 wxLogMessage(wxT("Canvas got signal from deco thread: %d"), event.GetInt());
\r
1523 wxLogMessage(event.GetString());
\r
1525 int n = event.GetInt();
\r
1528 m_dlgProgress->Destroy();
\r
1529 m_dlgProgress = (wxProgressDialog *)NULL;
\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
1538 if ( !m_dlgProgress->Update(n) )
\r
1540 wxCriticalSectionLocker lock(m_critsectWork);
\r
1542 m_cancelled = true;
\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
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
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
1564 m_frame = (OPJFrame *) parent;
\r
1566 //my_children.Append(this);
\r
1568 m_winnumber = winnumber;
\r
1569 SetTitle(wxString::Format(_T("%d: "), m_winnumber) + m_fname.GetFullName());
\r
1571 // Give it an icon (this is ignored in MDI mode: uses resources)
\r
1573 SetIcon(wxIcon(wxT("OPJChild16")));
\r
1576 // Give it a status line
\r
1577 /*CreateStatusBar();*/
\r
1579 int width, height;
\r
1580 GetClientSize(&width, &height);
\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
1586 m_canvas = canvas;
\r
1588 // Give it scrollbars
\r
1589 canvas->SetScrollbars(20, 20, 5, 5);
\r
1594 /*wxLogError(wxString::Format(wxT("Created tree %d (0x%x)"), m_winnumber, m_frame->m_treehash[m_winnumber]));*/
\r
1598 OPJChildFrame::~OPJChildFrame(void)
\r
1600 //my_children.DeleteObject(this);
\r
1604 void OPJChildFrame::OnClose(wxCloseEvent& event)
\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
1614 wxLogMessage(wxT("Closed: %d"), m_winnumber);
\r
1617 void OPJChildFrame::OnActivate(wxActivateEvent& event)
\r
1619 /*if (event.GetActive() && m_canvas)
\r
1620 m_canvas->SetFocus();*/
\r
1623 void OPJChildFrame::OnGotFocus(wxFocusEvent& event)
\r
1625 // we need to check if the notebook is being destroyed or not
\r
1626 if (!m_frame->m_bookCtrl)
\r
1629 for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {
\r
1631 if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {
\r
1632 m_frame->m_bookCtrl->ChangeSelection(p);
\r
1638 //wxLogMessage(wxT("Got focus: %d (%x)"), m_winnumber, event.GetWindow());
\r
1641 void OPJChildFrame::OnLostFocus(wxFocusEvent& event)
\r
1643 //wxLogMessage(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow());
\r
1647 ////////////////////////////////
\r
1649 ////////////////////////////////
\r
1651 bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)
\r
1653 /*size_t nFiles = filenames.GetCount();
\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
1659 wxLogMessage(str);*/
\r
1660 m_pOwner->OpenFiles(filenames, filenames);
\r