Enable accepting file names with `-´ symbol .Modification getopt.c
[openjpeg.git] / OPJViewer / source / OPJViewer.cpp
1 /*\r
2  * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� 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 #if wxUSE_UNICODE\r
136 \r
137     wxChar **wxArgv = new wxChar *[argc + 1];\r
138 \r
139         int n;\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     /*parser.AddOption(_T("project_name"), _T(""), _T("full path to project file"),\r
169                      wxCMD_LINE_VAL_STRING,\r
170                      wxCMD_LINE_OPTION_MANDATORY | wxCMD_LINE_NEEDS_SEPARATOR);*/\r
171 \r
172     switch (parser.Parse()) {\r
173     case -1:\r
174         wxLogMessage(wxT("Help was given, terminating."));\r
175         break;\r
176 \r
177     case 0:\r
178         ShowCmdLine(parser);\r
179         break;\r
180 \r
181     default:\r
182         wxLogMessage(wxT("Syntax error detected."));\r
183         break;\r
184     }\r
185 \r
186 #endif // wxUSE_CMDLINE_PARSER\r
187 \r
188     //wxInitAllImageHandlers();\r
189 #if wxUSE_LIBJPEG\r
190   wxImage::AddHandler( new wxJPEGHandler );\r
191 #endif\r
192 #if wxUSE_LIBOPENJPEG\r
193   wxImage::AddHandler( new wxJ2KHandler );\r
194   wxImage::AddHandler( new wxJP2Handler );\r
195   wxImage::AddHandler( new wxMJ2Handler );\r
196 #endif\r
197     // we use a XPM image in our HTML page\r
198     wxImage::AddHandler(new wxXPMHandler);\r
199 \r
200         // memory file system\r
201     wxFileSystem::AddHandler(new wxMemoryFSHandler);\r
202 \r
203         // set decoding engine parameters\r
204         m_resizemethod = 0;\r
205         m_reducefactor = 0;\r
206         m_qualitylayers = 0;\r
207         m_components = 0;\r
208         m_framenum = 0;\r
209 #ifdef USE_JPWL\r
210         m_enablejpwl = true;\r
211         m_expcomps = JPWL_EXPECTED_COMPONENTS;\r
212         m_maxtiles = JPWL_MAXIMUM_TILES;\r
213 #endif // USE_JPWL\r
214 \r
215         // Create the main frame window\r
216   OPJFrame *frame = new OPJFrame(NULL, wxID_ANY, OPJ_APPLICATION_TITLEBAR,\r
217                                           wxDefaultPosition, wxSize(800, 600),\r
218                       wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE |\r
219                       wxHSCROLL | wxVSCROLL);\r
220 \r
221   // Give it an icon (this is ignored in MDI mode: uses resources)\r
222 #ifdef __WXMSW__\r
223   frame->SetIcon(wxIcon(wxT("OPJViewer16")));\r
224 #endif\r
225 \r
226   frame->Show(true);\r
227 \r
228   SetTopWindow(frame);\r
229 \r
230         // if there are files on the command line, open them\r
231         if (!(m_filelist.IsEmpty())) {\r
232                 //wxLogMessage(wxT("Habemus files!!!"));\r
233                 wxArrayString paths, filenames;\r
234                 for (unsigned int f = 0; f < wxGetApp().m_filelist.GetCount(); f++) {\r
235                         paths.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullPath());\r
236                         filenames.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullName());\r
237                 }\r
238                 //wxLogMessage(paths[0]);\r
239                 frame->OpenFiles(paths, filenames);\r
240         }\r
241 \r
242   return true;\r
243 }\r
244 \r
245 void OPJViewerApp::ShowCmdLine(const wxCmdLineParser& parser)\r
246 {\r
247     wxString s = wxT("Command line parsed successfully:\nInput files: ");\r
248 \r
249     size_t count = parser.GetParamCount();\r
250     for (size_t param = 0; param < count; param++) {\r
251         s << parser.GetParam(param) << ';';\r
252                 m_filelist.Add(parser.GetParam(param));\r
253     }\r
254 \r
255     //wxLogMessage(s);\r
256 }\r
257 \r
258 // OPJFrame events\r
259 BEGIN_EVENT_TABLE(OPJFrame, wxMDIParentFrame)\r
260     EVT_MENU(OPJFRAME_HELPABOUT, OPJFrame::OnAbout)\r
261     EVT_MENU(OPJFRAME_FILEOPEN, OPJFrame::OnFileOpen)\r
262     EVT_SIZE(OPJFrame::OnSize)\r
263     EVT_MENU(OPJFRAME_FILEEXIT, OPJFrame::OnQuit)\r
264     EVT_MENU(OPJFRAME_FILECLOSE, OPJFrame::OnClose)\r
265     EVT_MENU(OPJFRAME_VIEWZOOM, OPJFrame::OnZoom)\r
266     EVT_MENU(OPJFRAME_VIEWFIT, OPJFrame::OnFit)\r
267     EVT_MENU(OPJFRAME_VIEWRELOAD, OPJFrame::OnReload)\r
268     EVT_MENU(OPJFRAME_FILETOGGLEB, OPJFrame::OnToggleBrowser)\r
269     EVT_MENU(OPJFRAME_FILETOGGLEP, OPJFrame::OnTogglePeeker)\r
270     EVT_MENU(OPJFRAME_SETSDECO, OPJFrame::OnSetsDeco)\r
271     EVT_SASH_DRAGGED_RANGE(OPJFRAME_BROWSEWIN, OPJFRAME_LOGWIN, OPJFrame::OnSashDrag)\r
272     EVT_NOTEBOOK_PAGE_CHANGED(LEFT_NOTEBOOK_ID, OPJFrame::OnNotebook)\r
273 END_EVENT_TABLE()\r
274 \r
275 // this is the frame constructor\r
276 OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title,\r
277                                    const wxPoint& pos, const wxSize& size, const long style)\r
278                 : wxMDIParentFrame(parent, id, title, pos, size, style)\r
279 {\r
280         // file menu and its items\r
281         wxMenu *file_menu = new wxMenu;\r
282 \r
283         file_menu->Append(OPJFRAME_FILEOPEN, wxT("&Open\tCtrl+O"));\r
284         file_menu->SetHelpString(OPJFRAME_FILEOPEN, wxT("Open one or more files"));\r
285 \r
286         file_menu->Append(OPJFRAME_FILETOGGLEB, wxT("Toggle &browser\tCtrl+B"));\r
287         file_menu->SetHelpString(OPJFRAME_FILETOGGLEB, wxT("Toggle the left browsing pane"));\r
288 \r
289         file_menu->Append(OPJFRAME_FILETOGGLEP, wxT("Toggle &peeker\tCtrl+P"));\r
290         file_menu->SetHelpString(OPJFRAME_FILETOGGLEP, wxT("Toggle the bottom peeking pane"));\r
291 \r
292         file_menu->Append(OPJFRAME_FILECLOSE, wxT("&Close\tCtrl+C"));\r
293         file_menu->SetHelpString(OPJFRAME_FILECLOSE, wxT("Close current image"));\r
294 \r
295         file_menu->Append(OPJFRAME_FILEEXIT, wxT("&Exit\tCtrl+Q"));\r
296         file_menu->SetHelpString(OPJFRAME_FILEEXIT, wxT("Quit this program"));\r
297 \r
298         // view menu and its items\r
299         wxMenu *view_menu = new wxMenu;\r
300 \r
301         view_menu->Append(OPJFRAME_VIEWZOOM, wxT("&Zoom\tCtrl+Z"));\r
302         view_menu->SetHelpString(OPJFRAME_VIEWZOOM, wxT("Rescale the image"));\r
303 \r
304         view_menu->Append(OPJFRAME_VIEWFIT, wxT("Zoom to &fit\tCtrl+F"));\r
305         view_menu->SetHelpString(OPJFRAME_VIEWFIT, wxT("Fit the image in canvas"));\r
306 \r
307         view_menu->Append(OPJFRAME_VIEWRELOAD, wxT("&Reload image\tCtrl+R"));\r
308         view_menu->SetHelpString(OPJFRAME_VIEWRELOAD, wxT("Reload the current image"));\r
309 \r
310         // settings menu and its items\r
311         wxMenu *sets_menu = new wxMenu;\r
312 \r
313         sets_menu->Append(OPJFRAME_SETSDECO, wxT("&Decoder\tCtrl+D"));\r
314         sets_menu->SetHelpString(OPJFRAME_SETSDECO, wxT("Decoder settings"));\r
315 \r
316         // help menu and its items\r
317         wxMenu *help_menu = new wxMenu;\r
318 \r
319         help_menu->Append(OPJFRAME_HELPABOUT, wxT("&About\tF1"));\r
320         help_menu->SetHelpString(OPJFRAME_HELPABOUT, wxT("Basic info on the program"));\r
321 \r
322         // the whole menubar\r
323         wxMenuBar *menu_bar = new wxMenuBar;\r
324         menu_bar->Append(file_menu, wxT("&File"));\r
325         menu_bar->Append(view_menu, wxT("&View"));\r
326         menu_bar->Append(sets_menu, wxT("&Settings"));\r
327         menu_bar->Append(help_menu, wxT("&Help"));\r
328 \r
329         // Associate the menu bar with the frame\r
330         SetMenuBar(menu_bar);\r
331 \r
332         // the status bar\r
333         CreateStatusBar();\r
334 \r
335         // the logging window\r
336         loggingWindow = new wxSashLayoutWindow(this, OPJFRAME_LOGWIN,\r
337                                                                                         wxDefaultPosition, wxSize(400, 130),\r
338                                                                                         wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN\r
339                                                                                         );\r
340         loggingWindow->SetDefaultSize(wxSize(1000, 130));\r
341         loggingWindow->SetOrientation(wxLAYOUT_HORIZONTAL);\r
342         loggingWindow->SetAlignment(wxLAYOUT_BOTTOM);\r
343         //loggingWindow->SetBackgroundColour(wxColour(0, 0, 255));\r
344         loggingWindow->SetSashVisible(wxSASH_TOP, true);\r
345 \r
346         // create the bottom notebook\r
347         m_bookCtrlbottom = new wxNotebook(loggingWindow, BOTTOM_NOTEBOOK_ID,\r
348                                                                 wxDefaultPosition, wxDefaultSize,\r
349                                                                 wxBK_LEFT);\r
350 \r
351         // create the text control of the logger\r
352         m_textCtrl = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""),\r
353                                                                 wxDefaultPosition, wxDefaultSize,\r
354                                                                 wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY \r
355                                                                 );\r
356         m_textCtrl->SetValue(_T("Logging window\n"));\r
357 \r
358         // add it to the notebook\r
359         m_bookCtrlbottom->AddPage(m_textCtrl, wxT("Log"));\r
360 \r
361         // create the text control of the browser\r
362         m_textCtrlbrowse = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""),\r
363                                                                 wxDefaultPosition, wxDefaultSize,\r
364                                                                 wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY | wxTE_RICH \r
365                                                                 );\r
366         wxFont *browsefont = new wxFont(wxNORMAL_FONT->GetPointSize(),\r
367                 wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);\r
368     m_textCtrlbrowse->SetDefaultStyle(wxTextAttr(wxNullColour, wxNullColour, *browsefont));\r
369         m_textCtrlbrowse->AppendText(wxT("Browsing window\n"));\r
370 \r
371         // add it the notebook\r
372         m_bookCtrlbottom->AddPage(m_textCtrlbrowse, wxT("Peek"), false);\r
373 \r
374         // the browser window\r
375         markerTreeWindow = new wxSashLayoutWindow(this, OPJFRAME_BROWSEWIN,\r
376                                                                                           wxDefaultPosition, wxSize(300, 30),\r
377                                                                                           wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN\r
378                                                                                           );\r
379         markerTreeWindow->SetDefaultSize(wxSize(300, 1000));\r
380         markerTreeWindow->SetOrientation(wxLAYOUT_VERTICAL);\r
381         markerTreeWindow->SetAlignment(wxLAYOUT_LEFT);\r
382         //markerTreeWindow->SetBackgroundColour(wxColour(0, 255, 0));\r
383         markerTreeWindow->SetSashVisible(wxSASH_RIGHT, true);\r
384         markerTreeWindow->SetExtraBorderSize(0);\r
385 \r
386         // create the browser notebook\r
387         m_bookCtrl = new wxNotebook(markerTreeWindow, LEFT_NOTEBOOK_ID,\r
388                                                                 wxDefaultPosition, wxDefaultSize,\r
389                                                                 wxBK_TOP);\r
390 \r
391 #ifdef __WXMOTIF__\r
392         // For some reason, we get a memcpy crash in wxLogStream::DoLogStream\r
393         // on gcc/wxMotif, if we use wxLogTextCtl. Maybe it's just gcc?\r
394         delete wxLog::SetActiveTarget(new wxLogStderr);\r
395 #else\r
396         // set our text control as the log target\r
397         wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl);\r
398         delete wxLog::SetActiveTarget(logWindow);\r
399 #endif\r
400 \r
401         // associate drop targets with the controls\r
402         SetDropTarget(new OPJDnDFile(this));\r
403 \r
404 }\r
405 \r
406 // this is the frame destructor\r
407 OPJFrame::~OPJFrame(void)\r
408 {\r
409         // delete all possible things\r
410         delete m_bookCtrl;\r
411         m_bookCtrl = NULL;\r
412 \r
413         delete markerTreeWindow;\r
414         markerTreeWindow = NULL;\r
415 \r
416         delete m_textCtrl;\r
417         m_textCtrl = NULL;\r
418 \r
419         delete m_bookCtrlbottom;\r
420         m_bookCtrlbottom = NULL;\r
421 \r
422         delete loggingWindow;\r
423         loggingWindow = NULL;\r
424 }\r
425 \r
426 void OPJFrame::OnNotebook(wxNotebookEvent& event)\r
427 {\r
428         int sel = event.GetSelection();\r
429         long childnum;\r
430 \r
431         m_bookCtrl->GetPageText(sel).ToLong(&childnum);\r
432 \r
433         m_childhash[childnum]->Activate();\r
434 \r
435         //wxLogMessage(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber);\r
436 \r
437 }\r
438 \r
439 \r
440 void OPJFrame::Resize(int number)\r
441 {\r
442         wxSize size = GetClientSize();\r
443 }\r
444 \r
445 void OPJFrame::OnSetsDeco(wxCommandEvent& event)\r
446 {\r
447     OPJDecoderDialog dialog(this, event.GetId());\r
448 \r
449     if (dialog.ShowModal() == wxID_OK) {\r
450 \r
451                 // load settings\r
452                 wxGetApp().m_resizemethod = dialog.m_resizeBox->GetSelection();\r
453                 wxGetApp().m_reducefactor = dialog.m_reduceCtrl->GetValue();\r
454                 wxGetApp().m_qualitylayers = dialog.m_layerCtrl->GetValue();\r
455                 wxGetApp().m_components = dialog.m_numcompsCtrl->GetValue();\r
456                 wxGetApp().m_framenum = dialog.m_framenumCtrl->GetValue();\r
457 #ifdef USE_JPWL\r
458                 wxGetApp().m_enablejpwl = dialog.m_enablejpwlCheck->GetValue();\r
459                 wxGetApp().m_expcomps = dialog.m_expcompsCtrl->GetValue();\r
460                 wxGetApp().m_maxtiles = dialog.m_maxtilesCtrl->GetValue();\r
461 #endif // USE_JPWL      \r
462                 \r
463         };      \r
464 }\r
465 \r
466 void OPJFrame::OnQuit(wxCommandEvent& WXUNUSED(event))\r
467 {\r
468         Close(true);\r
469 }\r
470 \r
471 void OPJFrame::OnClose(wxCommandEvent& WXUNUSED(event))\r
472 {\r
473         // current frame\r
474         OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();\r
475 \r
476         if (!currframe)\r
477                 return;\r
478 \r
479         wxCloseEvent e;\r
480         currframe->OnClose(e);\r
481 }\r
482 \r
483 void OPJFrame::OnFit(wxCommandEvent& WXUNUSED(event))\r
484 {\r
485         // current child\r
486         OPJChildFrame *currchild = (OPJChildFrame *) GetActiveChild();\r
487         if (!currchild)\r
488                 return;\r
489 \r
490         // current canvas\r
491         OPJCanvas *currcanvas = currchild->m_canvas;\r
492 \r
493         // find a fit-to-width zoom\r
494         int zooml, wzooml, hzooml;\r
495         wxSize clientsize = currcanvas->GetClientSize();\r
496         wzooml = (int) ceil(100.0 * (double) (clientsize.GetWidth() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetWidth()));\r
497         hzooml = (int) ceil(100.0 * (double) (clientsize.GetHeight() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetHeight()));\r
498         zooml = wxMin(100, wxMin(wzooml, hzooml));\r
499 \r
500         // fit to width\r
501         Rescale(zooml, currchild);\r
502 }\r
503 \r
504 void OPJFrame::OnZoom(wxCommandEvent& WXUNUSED(event))\r
505 {\r
506         // current frame\r
507         OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();\r
508 \r
509         if (!currframe)\r
510                 return;\r
511 \r
512         // get the preferred zoom\r
513         long zooml = wxGetNumberFromUser(wxT("Choose a scale between 5% and 300%"),\r
514                 wxT("Zoom (%)"),\r
515                 wxT("Image scale"),\r
516                 currframe->m_canvas->m_zooml, 5, 300, NULL, wxDefaultPosition);\r
517 \r
518         // rescale current frame image if necessary\r
519         if (zooml >= 5) {\r
520                 Rescale(zooml, currframe);\r
521                 wxLogMessage(wxT("zoom to %d%%"), zooml);\r
522         }\r
523 }\r
524 \r
525 void OPJFrame::Rescale(int zooml, OPJChildFrame *currframe)\r
526 {\r
527         wxImage new_image = currframe->m_canvas->m_image100.ConvertToImage();\r
528         if (zooml != 100)\r
529                 new_image.Rescale((int) ((double) zooml * (double) new_image.GetWidth() / 100.0),\r
530                         (int) ((double) zooml * (double) new_image.GetHeight() / 100.0),\r
531                         wxGetApp().m_resizemethod ? wxIMAGE_QUALITY_HIGH : wxIMAGE_QUALITY_NORMAL);\r
532     currframe->m_canvas->m_image = wxBitmap(new_image);\r
533         currframe->m_canvas->SetScrollbars(20,\r
534                                                                                 20,\r
535                                                                                 (int)(0.5 + (double) new_image.GetWidth() / 20.0),\r
536                                                                                 (int)(0.5 + (double) new_image.GetHeight() / 20.0)\r
537                                                                                 );\r
538         currframe->m_canvas->Refresh();\r
539 \r
540         // update zoom\r
541         currframe->m_canvas->m_zooml = zooml;\r
542 }\r
543 \r
544 \r
545 void OPJFrame::OnReload(wxCommandEvent& event)\r
546 {\r
547         OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();\r
548 \r
549     OPJDecoThread *dthread = currframe->m_canvas->CreateDecoThread();\r
550 \r
551     if (dthread->Run() != wxTHREAD_NO_ERROR)\r
552         wxLogMessage(wxT("Can't start deco thread!"));\r
553     else\r
554                 wxLogMessage(wxT("New deco thread started."));\r
555 \r
556         currframe->m_canvas->Refresh();\r
557 \r
558         // update zoom\r
559         //currframe->m_canvas->m_zooml = zooml;\r
560 }\r
561 \r
562 \r
563 // about window for the frame\r
564 void OPJFrame::OnAbout(wxCommandEvent& WXUNUSED(event))\r
565 {\r
566 #ifdef OPJ_HTMLABOUT\r
567 #include "about_htm.h"\r
568 #include "opj_logo.xpm"\r
569 \r
570     wxBoxSizer *topsizer;\r
571     wxHtmlWindow *html;\r
572     wxDialog dlg(this, wxID_ANY, wxString(_("About")));\r
573 \r
574     wxMemoryFSHandler::AddFile(wxT("opj_logo.xpm"), wxBitmap(opj_logo), wxBITMAP_TYPE_XPM);\r
575 \r
576     topsizer = new wxBoxSizer(wxVERTICAL);\r
577 \r
578     html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition, wxSize(320, 250), wxHW_SCROLLBAR_NEVER);\r
579     html->SetBorders(0);\r
580     //html->LoadPage(wxT("about/about.htm"));\r
581         //html->SetPage("<html><body>Hello, world!</body></html>");\r
582         html->SetPage(htmlaboutpage);\r
583     html->SetSize(html->GetInternalRepresentation()->GetWidth(),\r
584                     html->GetInternalRepresentation()->GetHeight());\r
585 \r
586     topsizer->Add(html, 1, wxALL, 10);\r
587 \r
588     topsizer->Add(new wxStaticLine(&dlg, wxID_ANY), 0, wxEXPAND | wxLEFT | wxRIGHT, 10);\r
589 \r
590     wxButton *bu1 = new wxButton(&dlg, wxID_OK, wxT("OK"));\r
591     bu1->SetDefault();\r
592 \r
593     topsizer->Add(bu1, 0, wxALL | wxALIGN_RIGHT, 15);\r
594 \r
595     dlg.SetSizer(topsizer);\r
596     topsizer->Fit(&dlg);\r
597 \r
598     dlg.ShowModal();\r
599 \r
600 #else\r
601 \r
602         wxMessageBox(wxString::Format(OPJ_APPLICATION_TITLEBAR\r
603                                                                   wxT("\n\n")\r
604                                                                   wxT("Built with %s and OpenJPEG ")\r
605                                                                   wxT(OPENJPEG_VERSION)\r
606                                                                   wxT("\non ") wxT(__DATE__) wxT(", ") wxT(__TIME__)\r
607                                                                   wxT("\nRunning under %s\n\n")\r
608                                                                   OPJ_APPLICATION_COPYRIGHT,\r
609                                                                   wxVERSION_STRING,\r
610                                                                   wxGetOsDescription().c_str()),\r
611                                  wxT("About ") OPJ_APPLICATION_NAME,\r
612                                  wxOK | wxICON_INFORMATION,\r
613                                  this\r
614                                  );\r
615 \r
616 #endif\r
617 \r
618 }\r
619 \r
620 void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event))\r
621 {\r
622     if (markerTreeWindow->IsShown())\r
623         markerTreeWindow->Show(false);\r
624     else\r
625         markerTreeWindow->Show(true);\r
626 \r
627     wxLayoutAlgorithm layout;\r
628     layout.LayoutMDIFrame(this);\r
629 }\r
630 \r
631 void OPJFrame::OnTogglePeeker(wxCommandEvent& WXUNUSED(event))\r
632 {\r
633     if (loggingWindow->IsShown())\r
634         loggingWindow->Show(false);\r
635     else\r
636         loggingWindow->Show(true);\r
637 \r
638     wxLayoutAlgorithm layout;\r
639     layout.LayoutMDIFrame(this);\r
640 }\r
641 \r
642 void OPJFrame::OnSashDrag(wxSashEvent& event)\r
643 {\r
644     if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)\r
645         return;\r
646 \r
647     switch (event.GetId()) {\r
648                 case OPJFRAME_BROWSEWIN:\r
649                 {\r
650                         markerTreeWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));\r
651                         break;\r
652                 }\r
653                 case OPJFRAME_LOGWIN:\r
654                 {\r
655                         loggingWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));\r
656                         break;\r
657                 }\r
658     }\r
659 \r
660     wxLayoutAlgorithm layout;\r
661     layout.LayoutMDIFrame(this);\r
662 \r
663     // Leaves bits of itself behind sometimes\r
664     GetClientWindow()->Refresh();\r
665 }\r
666 \r
667 // physically open the files\r
668 void OPJFrame::OpenFiles(wxArrayString paths, wxArrayString filenames)\r
669 {\r
670 \r
671         size_t count = paths.GetCount();\r
672         for (size_t n = 0; n < count; n++) {\r
673 \r
674                 wxString msg, s;\r
675                 s.Printf(_T("File %d: %s (%s)\n"), (int)n, paths[n].c_str(), filenames[n].c_str());\r
676 \r
677                 msg += s;\r
678 \r
679                 /*wxMessageDialog dialog2(this, msg, _T("Selected files"));\r
680                 dialog2.ShowModal();*/\r
681 \r
682                 // Make another frame, containing a canvas\r
683                 OPJChildFrame *subframe = new OPJChildFrame(this,\r
684                                                                                                         paths[n],\r
685                                                                                                         winNumber,\r
686                                                                                                         wxT("Canvas Frame"),\r
687                                                                                                         wxDefaultPosition, wxSize(300, 300),\r
688                                                                                                         wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE\r
689                                                                                                         );\r
690                 m_childhash[winNumber] = subframe;\r
691 \r
692                 // create own marker tree\r
693                 m_treehash[winNumber] = new OPJMarkerTree(m_bookCtrl, subframe, paths[n], wxT("Parsing..."), TreeTest_Ctrl,\r
694                                                                                                   wxDefaultPosition, wxDefaultSize,\r
695                                                                                                   wxTR_DEFAULT_STYLE | wxSUNKEN_BORDER\r
696                                                                                                   );\r
697 \r
698                 m_bookCtrl->AddPage(m_treehash[winNumber], wxString::Format(wxT("%u"), winNumber), false);\r
699 \r
700                 for (unsigned int p = 0; p < m_bookCtrl->GetPageCount(); p++) {\r
701                         if (m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), winNumber)) {\r
702                                 m_bookCtrl->ChangeSelection(p);\r
703                                 break;\r
704                         }\r
705                 }\r
706 \r
707                 winNumber++;\r
708         }\r
709 }\r
710 \r
711 void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event))\r
712 {\r
713     wxString wildcards =\r
714 #ifdef __WXMOTIF__\r
715         wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.*j*2*");\r
716 #else\r
717         wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.jp2;*.j2k;*.j2c;*.mj2|JPEG files (*.jpg)|*.jpg|All files|*");\r
718 #endif\r
719     wxFileDialog dialog(this, _T("Open JPEG 2000 file(s)"),\r
720                         wxEmptyString, wxEmptyString, wildcards,\r
721                         wxFD_OPEN|wxFD_MULTIPLE);\r
722 \r
723     if (dialog.ShowModal() == wxID_OK) {\r
724         wxArrayString paths, filenames;\r
725 \r
726         dialog.GetPaths(paths);\r
727         dialog.GetFilenames(filenames);\r
728 \r
729                 OpenFiles(paths, filenames);\r
730     }\r
731 \r
732 }\r
733 \r
734 BEGIN_EVENT_TABLE(OPJCanvas, wxScrolledWindow)\r
735     EVT_MOUSE_EVENTS(OPJCanvas::OnEvent)\r
736 END_EVENT_TABLE()\r
737 \r
738 // Define a constructor for my canvas\r
739 OPJCanvas::OPJCanvas(wxFileName fname, wxWindow *parent, const wxPoint& pos, const wxSize& size)\r
740         : wxScrolledWindow(parent, wxID_ANY, pos, size,\r
741                            wxSUNKEN_BORDER | wxNO_FULL_REPAINT_ON_RESIZE)\r
742 {\r
743     SetBackgroundColour(OPJ_CANVAS_COLOUR);\r
744 \r
745         m_fname = fname;\r
746         m_childframe = (OPJChildFrame *) parent;\r
747 \r
748     OPJDecoThread *dthread = CreateDecoThread();\r
749 \r
750     if (dthread->Run() != wxTHREAD_NO_ERROR)\r
751         wxLogMessage(wxT("Can't start deco thread!"));\r
752     else\r
753                 wxLogMessage(wxT("New deco thread started."));\r
754 \r
755         // 100% zoom\r
756         m_zooml = 100;\r
757 }\r
758 \r
759 OPJDecoThread *OPJCanvas::CreateDecoThread(void)\r
760 {\r
761     OPJDecoThread *dthread = new OPJDecoThread(this);\r
762 \r
763     if (dthread->Create() != wxTHREAD_NO_ERROR)\r
764                 wxLogError(wxT("Can't create deco thread!"));\r
765 \r
766     wxCriticalSectionLocker enter(wxGetApp().m_deco_critsect);\r
767     wxGetApp().m_deco_threads.Add(dthread);\r
768 \r
769     return dthread;\r
770 }\r
771 \r
772 #define activeoverlay 0\r
773 // Define the repainting behaviour\r
774 void OPJCanvas::OnDraw(wxDC& dc)\r
775 {\r
776         if (m_image.Ok()) {\r
777                 dc.DrawBitmap(m_image, OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER);\r
778 \r
779                 if (activeoverlay) {\r
780                         dc.SetPen(*wxRED_PEN);\r
781                         dc.SetBrush(*wxTRANSPARENT_BRUSH);\r
782                         //int tw, th;\r
783                         dc.DrawRectangle(OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER,\r
784                                 (unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_twidth / 100.0),\r
785                                 (unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_theight / 100.0));\r
786                 }\r
787 \r
788         } else {\r
789                 dc.SetFont(*wxSWISS_FONT);\r
790                 dc.SetPen(*wxBLACK_PEN);\r
791                 dc.DrawText(_T("Decoding image, please wait..."), 40, 50);\r
792         }\r
793 }\r
794 \r
795 // This implements a tiny doodling program! Drag the mouse using\r
796 // the left button.\r
797 void OPJCanvas::OnEvent(wxMouseEvent& event)\r
798 {\r
799   wxClientDC dc(this);\r
800   PrepareDC(dc);\r
801 \r
802   wxPoint pt(event.GetLogicalPosition(dc));\r
803 \r
804   if ((xpos > -1) && (ypos > -1) && event.Dragging()) {\r
805     dc.SetPen(*wxRED_PEN);\r
806     dc.DrawLine(xpos, ypos, pt.x, pt.y);\r
807   }\r
808   xpos = pt.x;\r
809   ypos = pt.y;\r
810 }\r
811 \r
812 void OPJFrame::OnSize(wxSizeEvent& WXUNUSED(event))\r
813 {\r
814     wxLayoutAlgorithm layout;\r
815     layout.LayoutMDIFrame(this);\r
816 }\r
817 \r
818 // Note that OPJFRAME_FILEOPEN and OPJFRAME_HELPABOUT commands get passed\r
819 // to the parent window for processing, so no need to\r
820 // duplicate event handlers here.\r
821 \r
822 BEGIN_EVENT_TABLE(OPJChildFrame, wxMDIChildFrame)\r
823   /*EVT_MENU(SASHTEST_CHILD_QUIT, OPJChildFrame::OnQuit)*/\r
824   EVT_CLOSE(OPJChildFrame::OnClose)\r
825   EVT_SET_FOCUS(OPJChildFrame::OnGotFocus)\r
826   EVT_KILL_FOCUS(OPJChildFrame::OnLostFocus)\r
827 END_EVENT_TABLE()\r
828 \r
829 OPJChildFrame::OPJChildFrame(OPJFrame *parent, wxFileName fname, int winnumber, const wxString& title, const wxPoint& pos, const wxSize& size,\r
830 const long style):\r
831   wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style)\r
832 {\r
833         m_frame = (OPJFrame  *) parent;\r
834         m_canvas = NULL;\r
835         //my_children.Append(this);\r
836         m_fname = fname;\r
837         m_winnumber = winnumber;\r
838         SetTitle(wxString::Format(_T("%d: "), m_winnumber) + m_fname.GetFullName());\r
839 \r
840           // Give it an icon (this is ignored in MDI mode: uses resources)\r
841 #ifdef __WXMSW__\r
842         SetIcon(wxIcon(wxT("OPJChild16")));\r
843 #endif\r
844 \r
845         // Give it a status line\r
846         /*CreateStatusBar();*/\r
847 \r
848         int width, height;\r
849         GetClientSize(&width, &height);\r
850 \r
851         OPJCanvas *canvas = new OPJCanvas(fname, this, wxPoint(0, 0), wxSize(width, height));\r
852         canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));\r
853         m_canvas = canvas;\r
854 \r
855         // Give it scrollbars\r
856         canvas->SetScrollbars(20, 20, 5, 5);\r
857 \r
858         Show(true);\r
859         Maximize(true);\r
860 \r
861         /*wxLogError(wxString::Format(wxT("Created tree %d (0x%x)"), m_winnumber, m_frame->m_treehash[m_winnumber]));*/\r
862 \r
863 }\r
864 \r
865 OPJChildFrame::~OPJChildFrame(void)\r
866 {\r
867   //my_children.DeleteObject(this);\r
868 }\r
869 \r
870 \r
871 void OPJChildFrame::OnClose(wxCloseEvent& event)\r
872 {\r
873         for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {\r
874                 if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {\r
875                         m_frame->m_bookCtrl->DeletePage(p);\r
876                         break;\r
877                 }\r
878         }\r
879         Destroy();\r
880 \r
881         wxLogMessage(wxT("Closed: %d"), m_winnumber);\r
882 }\r
883 \r
884 void OPJChildFrame::OnActivate(wxActivateEvent& event)\r
885 {\r
886   /*if (event.GetActive() && m_canvas)\r
887     m_canvas->SetFocus();*/\r
888 }\r
889 \r
890 void OPJChildFrame::OnGotFocus(wxFocusEvent& event)\r
891 {\r
892         // we need to check if the notebook is being destroyed or not\r
893         if (!m_frame->m_bookCtrl)\r
894                 return;\r
895 \r
896         for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {\r
897 \r
898                 if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {\r
899                         m_frame->m_bookCtrl->ChangeSelection(p);\r
900                         break;\r
901                 }\r
902 \r
903         }\r
904 \r
905         //wxLogMessage(wxT("Got focus: %d (%x)"), m_winnumber, event.GetWindow());\r
906 }\r
907 \r
908 void OPJChildFrame::OnLostFocus(wxFocusEvent& event)\r
909 {\r
910         //wxLogMessage(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow());\r
911 }\r
912 \r
913 #if USE_GENERIC_TREECTRL\r
914 BEGIN_EVENT_TABLE(OPJMarkerTree, wxGenericTreeCtrl)\r
915 #else\r
916 BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl)\r
917 #endif\r
918     /*EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginDrag)\r
919     EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginRDrag)\r
920     EVT_TREE_END_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnEndDrag)*/\r
921     /*EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnBeginLabelEdit)\r
922     EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnEndLabelEdit)*/\r
923     /*EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, OPJMarkerTree::OnDeleteItem)*/\r
924 #if 0       // there are so many of those that logging them causes flicker\r
925     /*EVT_TREE_GET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnGetInfo)*/\r
926 #endif\r
927     /*EVT_TREE_SET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnSetInfo)\r
928     EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanded)*/\r
929     EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanding)\r
930     /*EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsed)\r
931     EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsing)*/\r
932 \r
933     EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, OPJMarkerTree::OnSelChanged)\r
934     /*EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, OPJMarkerTree::OnSelChanging)*/\r
935     /*EVT_TREE_KEY_DOWN(TreeTest_Ctrl, OPJMarkerTree::OnTreeKeyDown)*/\r
936     /*EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, OPJMarkerTree::OnItemActivated)*/\r
937 \r
938     // so many differents ways to handle right mouse button clicks...\r
939     /*EVT_CONTEXT_MENU(OPJMarkerTree::OnContextMenu)*/\r
940     // EVT_TREE_ITEM_MENU is the preferred event for creating context menus\r
941     // on a tree control, because it includes the point of the click or item,\r
942     // meaning that no additional placement calculations are required.\r
943     EVT_TREE_ITEM_MENU(TreeTest_Ctrl, OPJMarkerTree::OnItemMenu)\r
944     /*EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, OPJMarkerTree::OnItemRClick)*/\r
945 \r
946     /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown)\r
947     EVT_RIGHT_UP(OPJMarkerTree::OnRMouseUp)\r
948     EVT_RIGHT_DCLICK(OPJMarkerTree::OnRMouseDClick)*/\r
949 END_EVENT_TABLE()\r
950 \r
951 // OPJMarkerTree implementation\r
952 #if USE_GENERIC_TREECTRL\r
953 IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxGenericTreeCtrl)\r
954 #else\r
955 IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)\r
956 #endif\r
957 \r
958 OPJMarkerTree::OPJMarkerTree(wxWindow *parent, OPJChildFrame *subframe, wxFileName fname, wxString name, const wxWindowID id,\r
959            const wxPoint& pos, const wxSize& size, long style)\r
960           : wxTreeCtrl(parent, id, pos, size, style)\r
961 {\r
962     m_reverseSort = false;\r
963         m_fname = fname;\r
964 \r
965         m_peektextCtrl = ((OPJFrame *) (parent->GetParent()->GetParent()))->m_textCtrlbrowse;\r
966     CreateImageList();\r
967 \r
968     // Add some items to the tree\r
969     //AddTestItemsToTree(5, 5);\r
970     int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
971     wxTreeItemId rootId = AddRoot(name,\r
972                                   image, image,\r
973                                   new OPJMarkerData(name));\r
974 \r
975     OPJParseThread *pthread = CreateParseThread(0x00, subframe);\r
976     if (pthread->Run() != wxTHREAD_NO_ERROR)\r
977         wxLogMessage(wxT("Can't start parse thread!"));\r
978     else\r
979                 wxLogMessage(wxT("New parse thread started."));\r
980 \r
981         m_childframe = subframe;\r
982 }\r
983 \r
984 void OPJMarkerTree::CreateImageList(int size)\r
985 {\r
986     if (size == -1) {\r
987         SetImageList(NULL);\r
988         return;\r
989     }\r
990     if (size == 0)\r
991         size = m_imageSize;\r
992     else\r
993         m_imageSize = size;\r
994 \r
995     // Make an image list containing small icons\r
996     wxImageList *images = new wxImageList(size, size, true);\r
997 \r
998     // should correspond to TreeCtrlIcon_xxx enum\r
999     wxBusyCursor wait;\r
1000     wxIcon icons[5];\r
1001     icons[0] = wxIcon(icon1_xpm);\r
1002     icons[1] = wxIcon(icon2_xpm);\r
1003     icons[2] = wxIcon(icon3_xpm);\r
1004     icons[3] = wxIcon(icon4_xpm);\r
1005     icons[4] = wxIcon(icon5_xpm);\r
1006 \r
1007     int sizeOrig = icons[0].GetWidth();\r
1008     for (size_t i = 0; i < WXSIZEOF(icons); i++) {\r
1009         if (size == sizeOrig) {\r
1010             images->Add(icons[i]);\r
1011         } else {\r
1012             images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
1013         }\r
1014     }\r
1015 \r
1016     AssignImageList(images);\r
1017 }\r
1018 \r
1019 #if USE_GENERIC_TREECTRL || !defined(__WXMSW__)\r
1020 void OPJMarkerTree::CreateButtonsImageList(int size)\r
1021 {\r
1022     if ( size == -1 ) {\r
1023         SetButtonsImageList(NULL);\r
1024         return;\r
1025     }\r
1026 \r
1027     // Make an image list containing small icons\r
1028     wxImageList *images = new wxImageList(size, size, true);\r
1029 \r
1030     // should correspond to TreeCtrlIcon_xxx enum\r
1031     wxBusyCursor wait;\r
1032     wxIcon icons[4];\r
1033     icons[0] = wxIcon(icon3_xpm);   // closed\r
1034     icons[1] = wxIcon(icon3_xpm);   // closed, selected\r
1035     icons[2] = wxIcon(icon5_xpm);   // open\r
1036     icons[3] = wxIcon(icon5_xpm);   // open, selected\r
1037 \r
1038     for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) {\r
1039         int sizeOrig = icons[i].GetWidth();\r
1040         if ( size == sizeOrig ) {\r
1041             images->Add(icons[i]);\r
1042         } else {\r
1043             images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
1044         }\r
1045     }\r
1046 \r
1047     AssignButtonsImageList(images);\r
1048 #else\r
1049 void OPJMarkerTree::CreateButtonsImageList(int WXUNUSED(size))\r
1050 {\r
1051 #endif\r
1052 }\r
1053 \r
1054 void OPJParseThread::LoadFile(wxFileName fname)\r
1055 {\r
1056         wxTreeItemId rootid;\r
1057 \r
1058         // this is the root node\r
1059         int image = wxGetApp().ShowImages() ? m_tree->TreeCtrlIcon_Folder : -1;\r
1060 \r
1061         if (this->m_parentid) {\r
1062                 // leaf of a tree\r
1063                 rootid = m_parentid;\r
1064                 m_tree->SetItemText(rootid, wxT("Parsing..."));\r
1065 \r
1066         } else {\r
1067 \r
1068                 // delete the existing tree hierarchy\r
1069                 m_tree->DeleteAllItems();\r
1070 \r
1071                 // new tree\r
1072                 rootid = m_tree->AddRoot(wxT("Parsing..."),\r
1073                         image,\r
1074                         image,\r
1075                         new OPJMarkerData(fname.GetFullPath())\r
1076                         );\r
1077                 //m_tree->SetItemFont(rootid, *wxITALIC_FONT);\r
1078                 m_tree->SetItemBold(rootid);\r
1079         }\r
1080 \r
1081         // open the file\r
1082         wxFile m_file(fname.GetFullPath().c_str(), wxFile::read);\r
1083 \r
1084         // what is the extension?\r
1085         if ((fname.GetExt() == wxT("j2k")) || (fname.GetExt() == wxT("j2c"))) {\r
1086 \r
1087                 // parse the file\r
1088                 ParseJ2KFile(&m_file, 0, m_file.Length(), rootid);\r
1089 \r
1090         } else if ((fname.GetExt() == wxT("jp2")) || (fname.GetExt() == wxT("mj2"))) {\r
1091 \r
1092                 // parse the file\r
1093                 if (this->m_parentid) {\r
1094                         //WriteText(wxT("Only a subsection of jp2"));\r
1095                         OPJMarkerData *data = (OPJMarkerData *) m_tree->GetItemData(rootid);\r
1096                         ParseJ2KFile(&m_file, data->m_start, data->m_length, rootid);\r
1097                         m_tree->Expand(rootid);\r
1098 \r
1099                 } else\r
1100                         // as usual\r
1101                         ParseJP2File(&m_file, 0, m_file.Length(), rootid);\r
1102 \r
1103         } else {\r
1104 \r
1105                 // unknown extension\r
1106                 WriteText(wxT("Unknown file format!"));\r
1107 \r
1108         }\r
1109 \r
1110         // this is the root node\r
1111         if (this->m_parentid)\r
1112                 m_tree->SetItemText(rootid, wxT("Codestream"));\r
1113         else\r
1114                 //m_tree->SetItemText(rootid, wxString::Format(wxT("%s (%d B)"), fname.GetFullName(), m_file.Length()));\r
1115                 m_tree->SetItemText(rootid, fname.GetFullName());\r
1116         \r
1117         // close the file\r
1118         m_file.Close();\r
1119 \r
1120         WriteText(wxT("Parsing finished!"));\r
1121 }\r
1122 \r
1123 /*int OPJMarkerTree::OnCompareItems(const wxTreeItemId& item1,\r
1124                                const wxTreeItemId& item2)\r
1125 {\r
1126     if ( m_reverseSort )\r
1127     {\r
1128         // just exchange 1st and 2nd items\r
1129         return wxTreeCtrl::OnCompareItems(item2, item1);\r
1130     }\r
1131     else\r
1132     {\r
1133         return wxTreeCtrl::OnCompareItems(item1, item2);\r
1134     }\r
1135 }*/\r
1136 \r
1137 /*void OPJMarkerTree::AddItemsRecursively(const wxTreeItemId& idParent,\r
1138                                      size_t numChildren,\r
1139                                      size_t depth,\r
1140                                      size_t folder)\r
1141 {\r
1142     if ( depth > 0 )\r
1143     {\r
1144         bool hasChildren = depth > 1;\r
1145 \r
1146         wxString str;\r
1147         for ( size_t n = 0; n < numChildren; n++ )\r
1148         {\r
1149             // at depth 1 elements won't have any more children\r
1150             if ( hasChildren )\r
1151                 str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1));\r
1152             else\r
1153                 str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));\r
1154 \r
1155             // here we pass to AppendItem() normal and selected item images (we\r
1156             // suppose that selected image follows the normal one in the enum)\r
1157             int image, imageSel;\r
1158             if ( wxGetApp().ShowImages() )\r
1159             {\r
1160                 image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;\r
1161                 imageSel = image + 1;\r
1162             }\r
1163             else\r
1164             {\r
1165                 image = imageSel = -1;\r
1166             }\r
1167             wxTreeItemId id = AppendItem(idParent, str, image, imageSel,\r
1168                                          new OPJMarkerData(str));\r
1169 \r
1170             // and now we also set the expanded one (only for the folders)\r
1171             if ( hasChildren && wxGetApp().ShowImages() )\r
1172             {\r
1173                 SetItemImage(id, TreeCtrlIcon_FolderOpened,\r
1174                              wxTreeItemIcon_Expanded);\r
1175             }\r
1176 \r
1177             // remember the last child for OnEnsureVisible()\r
1178             if ( !hasChildren && n == numChildren - 1 )\r
1179             {\r
1180                 m_lastItem = id;\r
1181             }\r
1182 \r
1183             AddItemsRecursively(id, numChildren, depth - 1, n + 1);\r
1184         }\r
1185     }\r
1186     //else: done!\r
1187 }*/\r
1188 \r
1189 /*void OPJMarkerTree::AddTestItemsToTree(size_t numChildren,\r
1190                                     size_t depth)\r
1191 {\r
1192     int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
1193     wxTreeItemId rootId = AddRoot(wxT("Root"),\r
1194                                   image, image,\r
1195                                   new OPJMarkerData(wxT("Root item")));\r
1196     if ( image != -1 )\r
1197     {\r
1198         SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded);\r
1199     }\r
1200 \r
1201     AddItemsRecursively(rootId, numChildren, depth, 0);\r
1202 \r
1203     // set some colours/fonts for testing\r
1204     SetItemFont(rootId, *wxITALIC_FONT);\r
1205 \r
1206     wxTreeItemIdValue cookie;\r
1207     wxTreeItemId id = GetFirstChild(rootId, cookie);\r
1208     SetItemTextColour(id, *wxBLUE);\r
1209 \r
1210     id = GetNextChild(rootId, cookie);\r
1211     id = GetNextChild(rootId, cookie);\r
1212     SetItemTextColour(id, *wxRED);\r
1213     SetItemBackgroundColour(id, *wxLIGHT_GREY);\r
1214 }*/\r
1215 \r
1216 /*void OPJMarkerTree::GetItemsRecursively(const wxTreeItemId& idParent,\r
1217                                      wxTreeItemIdValue cookie)\r
1218 {\r
1219     wxTreeItemId id;\r
1220 \r
1221     if ( !cookie )\r
1222         id = GetFirstChild(idParent, cookie);\r
1223     else\r
1224         id = GetNextChild(idParent, cookie);\r
1225 \r
1226     if ( !id.IsOk() )\r
1227         return;\r
1228 \r
1229     wxString text = GetItemText(id);\r
1230     wxLogMessage(text);\r
1231 \r
1232     if (ItemHasChildren(id))\r
1233         GetItemsRecursively(id);\r
1234 \r
1235     GetItemsRecursively(idParent, cookie);\r
1236 }*/\r
1237 \r
1238 /*void OPJMarkerTree::DoToggleIcon(const wxTreeItemId& item)\r
1239 {\r
1240     int image = (GetItemImage(item) == TreeCtrlIcon_Folder)\r
1241                     ? TreeCtrlIcon_File\r
1242                     : TreeCtrlIcon_Folder;\r
1243     SetItemImage(item, image, wxTreeItemIcon_Normal);\r
1244 \r
1245     image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected)\r
1246                     ? TreeCtrlIcon_FileSelected\r
1247                     : TreeCtrlIcon_FolderSelected;\r
1248     SetItemImage(item, image, wxTreeItemIcon_Selected);\r
1249 }*/\r
1250 \r
1251 void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event)\r
1252 {\r
1253     wxTreeItemId item = event.GetItem();\r
1254     wxString text;\r
1255     if ( item.IsOk() )\r
1256         text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
1257     else\r
1258         text = wxT("invalid item");\r
1259     wxLogMessage(wxT("%s(%s)"), name, text.c_str());\r
1260 }\r
1261 \r
1262 OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe)\r
1263 {\r
1264     OPJParseThread *pthread = new OPJParseThread(this, parentid);\r
1265 \r
1266     if (pthread->Create() != wxTHREAD_NO_ERROR)\r
1267                 wxLogError(wxT("Can't create parse thread!"));\r
1268 \r
1269     wxCriticalSectionLocker enter(wxGetApp().m_parse_critsect);\r
1270     wxGetApp().m_parse_threads.Add(pthread);\r
1271 \r
1272     return pthread;\r
1273 }\r
1274 \r
1275 \r
1276 /*// avoid repetition\r
1277 #define TREE_EVENT_HANDLER(name)                                 \\r
1278 void OPJMarkerTree::name(wxTreeEvent& event)                        \\r
1279 {                                                                \\r
1280     LogEvent(_T(#name), event);                                  \\r
1281     SetLastItem(wxTreeItemId());                                 \\r
1282     event.Skip();                                                \\r
1283 }*/\r
1284 \r
1285 /*TREE_EVENT_HANDLER(OnBeginRDrag)*/\r
1286 /*TREE_EVENT_HANDLER(OnDeleteItem)*/\r
1287 /*TREE_EVENT_HANDLER(OnGetInfo)\r
1288 TREE_EVENT_HANDLER(OnSetInfo)*/\r
1289 /*TREE_EVENT_HANDLER(OnItemExpanded)\r
1290 TREE_EVENT_HANDLER(OnItemExpanding)*/\r
1291 /*TREE_EVENT_HANDLER(OnItemCollapsed)*/\r
1292 /*TREE_EVENT_HANDLER(OnSelChanged)\r
1293 TREE_EVENT_HANDLER(OnSelChanging)*/\r
1294 \r
1295 /*#undef TREE_EVENT_HANDLER*/\r
1296 \r
1297 void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event)\r
1298 {\r
1299         wxTreeItemId item = event.GetItem();\r
1300         OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
1301         wxString text;\r
1302 \r
1303         if (item.IsOk())\r
1304                 text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
1305         else\r
1306                 text = wxT("invalid item");\r
1307 \r
1308         if (wxStrcmp(data->GetDesc1(), wxT("INFO-CSTREAM")))\r
1309                 return;\r
1310 \r
1311         wxLogMessage(wxT("Expanding... (%s -> %s, %s, %d, %d)"),\r
1312                 text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
1313                 data->m_start, data->m_length);\r
1314 \r
1315         // the codestream box is being asked for expansion\r
1316         wxTreeItemIdValue cookie;\r
1317         if (!GetFirstChild(item, cookie).IsOk()) {\r
1318                 OPJParseThread *pthread = CreateParseThread(item);\r
1319                 if (pthread->Run() != wxTHREAD_NO_ERROR)\r
1320                         wxLogMessage(wxT("Can't start parse thread!"));\r
1321                 else\r
1322                         wxLogMessage(wxT("New parse thread started."));\r
1323         }\r
1324 }\r
1325 \r
1326 void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)\r
1327 {\r
1328 #define BUNCH_LINESIZE  16\r
1329 #define BUNCH_NUMLINES  7\r
1330 \r
1331         wxTreeItemId item = event.GetItem();\r
1332         OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
1333         wxString text;\r
1334         int l, c, pos = 0, pre_pos;\r
1335         unsigned char buffer[BUNCH_LINESIZE * BUNCH_NUMLINES];\r
1336 \r
1337         m_peektextCtrl->Clear();\r
1338 \r
1339         /*text << wxString::Format(wxT("Selected... (%s -> %s, %s, %d, %d)"),\r
1340                 text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
1341                 data->m_start, data->m_length) << wxT("\n");*/\r
1342 \r
1343         // open the file and browse a little\r
1344         wxFile *fp = new wxFile(m_fname.GetFullPath().c_str(), wxFile::read);\r
1345 \r
1346         // go to position claimed\r
1347         fp->Seek(data->m_start, wxFromStart);\r
1348 \r
1349         // read a bunch\r
1350         int max_read = wxMin(WXSIZEOF(buffer), data->m_length - data->m_start + 1);\r
1351         fp->Read(buffer, max_read);\r
1352 \r
1353         // write the file data between start and stop\r
1354         pos = 0;\r
1355         for (l = 0; l < BUNCH_NUMLINES; l++) {\r
1356 \r
1357                 text << wxString::Format(wxT("%010d:"), data->m_start + pos);\r
1358 \r
1359                 pre_pos = pos;\r
1360 \r
1361                 // add hex browsing text\r
1362                 for (c = 0; c < BUNCH_LINESIZE; c++) {\r
1363 \r
1364                         if (!(c % 8))\r
1365                                 text << wxT(" ");\r
1366 \r
1367                         if (pos < max_read) {\r
1368                                 text << wxString::Format(wxT("%02X "), buffer[pos]);\r
1369                         } else\r
1370                                 text << wxT("   ");\r
1371                         pos++;\r
1372                 }\r
1373 \r
1374                 text << wxT("    ");\r
1375 \r
1376                 // add char browsing text\r
1377                 for (c = 0; c < BUNCH_LINESIZE; c++) {\r
1378 \r
1379                         if (pre_pos < max_read) {\r
1380                                 if ((buffer[pre_pos] == '\n') ||\r
1381                                         (buffer[pre_pos] == '\t') ||\r
1382                                         (buffer[pre_pos] == '\0') ||\r
1383                                         (buffer[pre_pos] == 0x0D) ||\r
1384                                         (buffer[pre_pos] == 0x0B))\r
1385                                         buffer[pre_pos] = ' ';\r
1386                                 text << wxString::Format(wxT("%c."), wxChar(buffer[pre_pos]));\r
1387                         } else\r
1388                                 text << wxT("  ");\r
1389                         pre_pos++;\r
1390                 }\r
1391 \r
1392                 text << wxT("\n");\r
1393 \r
1394         }\r
1395 \r
1396         // close the file\r
1397         fp->Close();\r
1398 \r
1399         m_peektextCtrl->WriteText(text);\r
1400 }\r
1401 \r
1402 /*void LogKeyEvent(const wxChar *name, const wxKeyEvent& event)\r
1403 {\r
1404     wxString key;\r
1405     long keycode = event.GetKeyCode();\r
1406     {\r
1407         switch ( keycode )\r
1408         {\r
1409             case WXK_BACK: key = wxT("BACK"); break;\r
1410             case WXK_TAB: key = wxT("TAB"); break;\r
1411             case WXK_RETURN: key = wxT("RETURN"); break;\r
1412             case WXK_ESCAPE: key = wxT("ESCAPE"); break;\r
1413             case WXK_SPACE: key = wxT("SPACE"); break;\r
1414             case WXK_DELETE: key = wxT("DELETE"); break;\r
1415             case WXK_START: key = wxT("START"); break;\r
1416             case WXK_LBUTTON: key = wxT("LBUTTON"); break;\r
1417             case WXK_RBUTTON: key = wxT("RBUTTON"); break;\r
1418             case WXK_CANCEL: key = wxT("CANCEL"); break;\r
1419             case WXK_MBUTTON: key = wxT("MBUTTON"); break;\r
1420             case WXK_CLEAR: key = wxT("CLEAR"); break;\r
1421             case WXK_SHIFT: key = wxT("SHIFT"); break;\r
1422             case WXK_ALT: key = wxT("ALT"); break;\r
1423             case WXK_CONTROL: key = wxT("CONTROL"); break;\r
1424             case WXK_MENU: key = wxT("MENU"); break;\r
1425             case WXK_PAUSE: key = wxT("PAUSE"); break;\r
1426             case WXK_CAPITAL: key = wxT("CAPITAL"); break;\r
1427             case WXK_END: key = wxT("END"); break;\r
1428             case WXK_HOME: key = wxT("HOME"); break;\r
1429             case WXK_LEFT: key = wxT("LEFT"); break;\r
1430             case WXK_UP: key = wxT("UP"); break;\r
1431             case WXK_RIGHT: key = wxT("RIGHT"); break;\r
1432             case WXK_DOWN: key = wxT("DOWN"); break;\r
1433             case WXK_SELECT: key = wxT("SELECT"); break;\r
1434             case WXK_PRINT: key = wxT("PRINT"); break;\r
1435             case WXK_EXECUTE: key = wxT("EXECUTE"); break;\r
1436             case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;\r
1437             case WXK_INSERT: key = wxT("INSERT"); break;\r
1438             case WXK_HELP: key = wxT("HELP"); break;\r
1439             case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;\r
1440             case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;\r
1441             case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;\r
1442             case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;\r
1443             case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;\r
1444             case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;\r
1445             case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;\r
1446             case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;\r
1447             case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;\r
1448             case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;\r
1449             case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;\r
1450             case WXK_ADD: key = wxT("ADD"); break;\r
1451             case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;\r
1452             case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;\r
1453             case WXK_DECIMAL: key = wxT("DECIMAL"); break;\r
1454             case WXK_DIVIDE: key = wxT("DIVIDE"); break;\r
1455             case WXK_F1: key = wxT("F1"); break;\r
1456             case WXK_F2: key = wxT("F2"); break;\r
1457             case WXK_F3: key = wxT("F3"); break;\r
1458             case WXK_F4: key = wxT("F4"); break;\r
1459             case WXK_F5: key = wxT("F5"); break;\r
1460             case WXK_F6: key = wxT("F6"); break;\r
1461             case WXK_F7: key = wxT("F7"); break;\r
1462             case WXK_F8: key = wxT("F8"); break;\r
1463             case WXK_F9: key = wxT("F9"); break;\r
1464             case WXK_F10: key = wxT("F10"); break;\r
1465             case WXK_F11: key = wxT("F11"); break;\r
1466             case WXK_F12: key = wxT("F12"); break;\r
1467             case WXK_F13: key = wxT("F13"); break;\r
1468             case WXK_F14: key = wxT("F14"); break;\r
1469             case WXK_F15: key = wxT("F15"); break;\r
1470             case WXK_F16: key = wxT("F16"); break;\r
1471             case WXK_F17: key = wxT("F17"); break;\r
1472             case WXK_F18: key = wxT("F18"); break;\r
1473             case WXK_F19: key = wxT("F19"); break;\r
1474             case WXK_F20: key = wxT("F20"); break;\r
1475             case WXK_F21: key = wxT("F21"); break;\r
1476             case WXK_F22: key = wxT("F22"); break;\r
1477             case WXK_F23: key = wxT("F23"); break;\r
1478             case WXK_F24: key = wxT("F24"); break;\r
1479             case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;\r
1480             case WXK_SCROLL: key = wxT("SCROLL"); break;\r
1481             case WXK_PAGEUP: key = wxT("PAGEUP"); break;\r
1482             case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;\r
1483             case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;\r
1484             case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;\r
1485             case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;\r
1486             case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;\r
1487             case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;\r
1488             case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;\r
1489             case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;\r
1490             case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;\r
1491             case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;\r
1492             case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;\r
1493             case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;\r
1494             case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;\r
1495             case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;\r
1496             case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;\r
1497             case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;\r
1498             case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;\r
1499             case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;\r
1500             case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;\r
1501             case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;\r
1502             case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;\r
1503             case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;\r
1504             case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;\r
1505             case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;\r
1506             case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;\r
1507 \r
1508             default:\r
1509             {\r
1510                if ( keycode < 128 && wxIsprint((int)keycode) )\r
1511                    key.Printf(wxT("'%c'"), (char)keycode);\r
1512                else if ( keycode > 0 && keycode < 27 )\r
1513                    key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);\r
1514                else\r
1515                    key.Printf(wxT("unknown (%ld)"), keycode);\r
1516             }\r
1517         }\r
1518     }\r
1519 \r
1520     wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"),\r
1521                   name,\r
1522                   key.c_str(),\r
1523                   event.ControlDown() ? wxT('C') : wxT('-'),\r
1524                   event.AltDown() ? wxT('A') : wxT('-'),\r
1525                   event.ShiftDown() ? wxT('S') : wxT('-'),\r
1526                   event.MetaDown() ? wxT('M') : wxT('-'));\r
1527 }\r
1528 \r
1529 void OPJMarkerTree::OnTreeKeyDown(wxTreeEvent& event)\r
1530 {\r
1531     LogKeyEvent(wxT("Tree key down "), event.GetKeyEvent());\r
1532 \r
1533     event.Skip();\r
1534 }*/\r
1535 \r
1536 /*void OPJMarkerTree::OnBeginDrag(wxTreeEvent& event)\r
1537 {\r
1538     // need to explicitly allow drag\r
1539     if ( event.GetItem() != GetRootItem() )\r
1540     {\r
1541         m_draggedItem = event.GetItem();\r
1542 \r
1543         wxLogMessage(wxT("OnBeginDrag: started dragging %s"),\r
1544                      GetItemText(m_draggedItem).c_str());\r
1545 \r
1546         event.Allow();\r
1547     }\r
1548     else\r
1549     {\r
1550         wxLogMessage(wxT("OnBeginDrag: this item can't be dragged."));\r
1551     }\r
1552 }\r
1553 \r
1554 void OPJMarkerTree::OnEndDrag(wxTreeEvent& event)\r
1555 {\r
1556     wxTreeItemId itemSrc = m_draggedItem,\r
1557                  itemDst = event.GetItem();\r
1558     m_draggedItem = (wxTreeItemId)0l;\r
1559 \r
1560     // where to copy the item?\r
1561     if ( itemDst.IsOk() && !ItemHasChildren(itemDst) )\r
1562     {\r
1563         // copy to the parent then\r
1564         itemDst = GetItemParent(itemDst);\r
1565     }\r
1566 \r
1567     if ( !itemDst.IsOk() )\r
1568     {\r
1569         wxLogMessage(wxT("OnEndDrag: can't drop here."));\r
1570 \r
1571         return;\r
1572     }\r
1573 \r
1574     wxString text = GetItemText(itemSrc);\r
1575     wxLogMessage(wxT("OnEndDrag: '%s' copied to '%s'."),\r
1576                  text.c_str(), GetItemText(itemDst).c_str());\r
1577 \r
1578     // just do append here - we could also insert it just before/after the item\r
1579     // on which it was dropped, but this requires slightly more work... we also\r
1580     // completely ignore the client data and icon of the old item but could\r
1581     // copy them as well.\r
1582     //\r
1583     // Finally, we only copy one item here but we might copy the entire tree if\r
1584     // we were dragging a folder.\r
1585     int image = wxGetApp().ShowImages() ? TreeCtrlIcon_File : -1;\r
1586     AppendItem(itemDst, text, image);\r
1587 }*/\r
1588 \r
1589 /*void OPJMarkerTree::OnBeginLabelEdit(wxTreeEvent& event)\r
1590 {\r
1591     wxLogMessage(wxT("OnBeginLabelEdit"));\r
1592 \r
1593     // for testing, prevent this item's label editing\r
1594     wxTreeItemId itemId = event.GetItem();\r
1595     if ( IsTestItem(itemId) )\r
1596     {\r
1597         wxMessageBox(wxT("You can't edit this item."));\r
1598 \r
1599         event.Veto();\r
1600     }\r
1601     else if ( itemId == GetRootItem() )\r
1602     {\r
1603         // test that it is possible to change the text of the item being edited\r
1604         SetItemText(itemId, _T("Editing root item"));\r
1605     }\r
1606 }\r
1607 \r
1608 void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event)\r
1609 {\r
1610     wxLogMessage(wxT("OnEndLabelEdit"));\r
1611 \r
1612     // don't allow anything except letters in the labels\r
1613     if ( !event.GetLabel().IsWord() )\r
1614     {\r
1615         wxMessageBox(wxT("The new label should be a single word."));\r
1616 \r
1617         event.Veto();\r
1618     }\r
1619 }*/\r
1620 \r
1621 /*void OPJMarkerTree::OnItemCollapsing(wxTreeEvent& event)\r
1622 {\r
1623     wxLogMessage(wxT("OnItemCollapsing"));\r
1624 \r
1625     // for testing, prevent the user from collapsing the first child folder\r
1626     wxTreeItemId itemId = event.GetItem();\r
1627     if ( IsTestItem(itemId) )\r
1628     {\r
1629         wxMessageBox(wxT("You can't collapse this item."));\r
1630 \r
1631         event.Veto();\r
1632     }\r
1633 }*/\r
1634 \r
1635 /*void OPJMarkerTree::OnItemActivated(wxTreeEvent& event)\r
1636 {\r
1637     // show some info about this item\r
1638     wxTreeItemId itemId = event.GetItem();\r
1639     OPJMarkerData *item = (OPJMarkerData *)GetItemData(itemId);\r
1640 \r
1641     if ( item != NULL )\r
1642     {\r
1643         item->ShowInfo(this);\r
1644     }\r
1645 \r
1646     wxLogMessage(wxT("OnItemActivated"));\r
1647 }*/\r
1648 \r
1649 void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)\r
1650 {\r
1651     /*wxTreeItemId itemId = event.GetItem();\r
1652     OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
1653                                          : NULL;\r
1654 \r
1655     wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc()\r
1656                                                          : _T(""));*/\r
1657 \r
1658         //wxLogMessage(wxT("EEEEEEEEEE"));\r
1659 \r
1660     //event.Skip();\r
1661 }\r
1662 \r
1663 /*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event)\r
1664 {\r
1665     wxPoint pt = event.GetPosition();\r
1666     wxTreeItemId item;\r
1667     wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);\r
1668 \r
1669     // check if event was generated by keyboard (MSW-specific?)\r
1670     if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it)\r
1671     {\r
1672         if ( !HasFlag(wxTR_MULTIPLE) )\r
1673             item = GetSelection();\r
1674 \r
1675         // attempt to guess where to show the menu\r
1676         if ( item.IsOk() )\r
1677         {\r
1678             // if an item was clicked, show menu to the right of it\r
1679             wxRect rect;\r
1680             GetBoundingRect(item, rect, true );// only the label\r
1681             pt = wxPoint(rect.GetRight(), rect.GetTop());\r
1682         }\r
1683         else\r
1684         {\r
1685             pt = wxPoint(0, 0);\r
1686         }\r
1687     }\r
1688     else // event was generated by mouse, use supplied coords\r
1689     {\r
1690         pt = ScreenToClient(pt);\r
1691         item = HitTest(pt);\r
1692     }\r
1693 \r
1694     ShowMenu(item, pt);\r
1695 }*/\r
1696 \r
1697 /*void OPJMarkerTree::ShowMenu(wxTreeItemId id, const wxPoint& pt)\r
1698 {\r
1699     wxString title;\r
1700     if ( id.IsOk() )\r
1701     {\r
1702         title << wxT("Menu for ") << GetItemText(id);\r
1703     }\r
1704     else\r
1705     {\r
1706         title = wxT("Menu for no particular item");\r
1707     }\r
1708 \r
1709 #if wxUSE_MENUS\r
1710     wxMenu menu(title);\r
1711     menu.Append(TreeTest_About, wxT("&About..."));\r
1712     menu.AppendSeparator();\r
1713     menu.Append(TreeTest_Highlight, wxT("&Highlight item"));\r
1714     menu.Append(TreeTest_Dump, wxT("&Dump"));\r
1715 \r
1716     PopupMenu(&menu, pt);\r
1717 #endif // wxUSE_MENUS\r
1718 }*/\r
1719 \r
1720 /*void OPJMarkerTree::OnItemRClick(wxTreeEvent& event)\r
1721 {\r
1722     wxTreeItemId itemId = event.GetItem();\r
1723     OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
1724                                          : NULL;\r
1725 \r
1726     wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc()\r
1727                                                         : _T(""));\r
1728 \r
1729     event.Skip();\r
1730 }*/\r
1731 \r
1732 /*\r
1733 void OPJMarkerTree::OnRMouseDown(wxMouseEvent& event)\r
1734 {\r
1735     wxLogMessage(wxT("Right mouse button down"));\r
1736 \r
1737     event.Skip();\r
1738 }\r
1739 \r
1740 void OPJMarkerTree::OnRMouseUp(wxMouseEvent& event)\r
1741 {\r
1742     wxLogMessage(wxT("Right mouse button up"));\r
1743 \r
1744     event.Skip();\r
1745 }\r
1746 \r
1747 void OPJMarkerTree::OnRMouseDClick(wxMouseEvent& event)\r
1748 {\r
1749     wxTreeItemId id = HitTest(event.GetPosition());\r
1750     if ( !id )\r
1751         wxLogMessage(wxT("No item under mouse"));\r
1752     else\r
1753     {\r
1754         OPJMarkerData *item = (OPJMarkerData *)GetItemData(id);\r
1755         if ( item )\r
1756             wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc());\r
1757     }\r
1758 \r
1759     event.Skip();\r
1760 }\r
1761 */\r
1762 \r
1763 static inline const wxChar *Bool2String(bool b)\r
1764 {\r
1765     return b ? wxT("") : wxT("not ");\r
1766 }\r
1767 \r
1768 void OPJMarkerData::ShowInfo(wxTreeCtrl *tree)\r
1769 {\r
1770     wxLogMessage(wxT("Item '%s': %sselected, %sexpanded, %sbold,\n")\r
1771                  wxT("%u children (%u immediately under this item)."),\r
1772                  m_desc.c_str(),\r
1773                  Bool2String(tree->IsSelected(GetId())),\r
1774                  Bool2String(tree->IsExpanded(GetId())),\r
1775                  Bool2String(tree->IsBold(GetId())),\r
1776                  unsigned(tree->GetChildrenCount(GetId())),\r
1777                  unsigned(tree->GetChildrenCount(GetId(), false)));\r
1778 }\r
1779 \r
1780 /////////////////////////////////////////////////////////////////////\r
1781 // Decoding thread class\r
1782 /////////////////////////////////////////////////////////////////////\r
1783 \r
1784 OPJDecoThread::OPJDecoThread(OPJCanvas *canvas)\r
1785         : wxThread()\r
1786 {\r
1787     m_count = 0;\r
1788     m_canvas = canvas;\r
1789 }\r
1790 \r
1791 void OPJDecoThread::WriteText(const wxString& text)\r
1792 {\r
1793     wxString msg;\r
1794 \r
1795     // before doing any GUI calls we must ensure that this thread is the only\r
1796     // one doing it!\r
1797 \r
1798     wxMutexGuiEnter();\r
1799 \r
1800     msg << text;\r
1801     m_canvas->WriteText(msg);\r
1802 \r
1803     wxMutexGuiLeave();\r
1804 }\r
1805 \r
1806 void OPJDecoThread::OnExit()\r
1807 {\r
1808     wxCriticalSectionLocker locker(wxGetApp().m_deco_critsect);\r
1809 \r
1810     wxArrayThread& dthreads = wxGetApp().m_deco_threads;\r
1811     dthreads.Remove(this);\r
1812 \r
1813     if (dthreads.IsEmpty() )\r
1814     {\r
1815         // signal the main thread that there are no more threads left if it is\r
1816         // waiting for us\r
1817         if (wxGetApp().m_deco_waitingUntilAllDone) {\r
1818             wxGetApp().m_deco_waitingUntilAllDone = false;\r
1819             wxGetApp().m_deco_semAllDone.Post();\r
1820         }\r
1821     }\r
1822 }\r
1823 \r
1824 void *OPJDecoThread::Entry()\r
1825 {\r
1826 \r
1827     wxString text;\r
1828 \r
1829         srand(GetId());\r
1830         int m_countnum = rand() % 9;\r
1831     //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
1832     //            GetId(), GetPriority(), m_countnum);\r
1833     text.Printf(wxT("Deco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
1834     WriteText(text);\r
1835 \r
1836     wxBitmap bitmap(100, 100);\r
1837     wxImage image = bitmap.ConvertToImage();\r
1838     image.Destroy();\r
1839 \r
1840         WriteText(m_canvas->m_fname.GetFullPath());\r
1841 \r
1842         // set handler properties\r
1843         wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
1844         j2kkkhandler->m_reducefactor = wxGetApp().m_reducefactor;\r
1845         j2kkkhandler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
1846         j2kkkhandler->m_components = wxGetApp().m_components;\r
1847 #ifdef USE_JPWL\r
1848         j2kkkhandler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
1849         j2kkkhandler->m_expcomps = wxGetApp().m_expcomps;\r
1850         j2kkkhandler->m_maxtiles = wxGetApp().m_maxtiles;\r
1851 #endif // USE_JPWL\r
1852 \r
1853         wxJP2Handler *jp222handler = (wxJP2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_JP2);\r
1854         jp222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
1855         jp222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
1856         jp222handler->m_components = wxGetApp().m_components;\r
1857 #ifdef USE_JPWL\r
1858         jp222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
1859         jp222handler->m_expcomps = wxGetApp().m_expcomps;\r
1860         jp222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
1861 #endif // USE_JPWL\r
1862 \r
1863         wxMJ2Handler *mj222handler = (wxMJ2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_MJ2);\r
1864         mj222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
1865         mj222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
1866         mj222handler->m_components = wxGetApp().m_components;\r
1867         mj222handler->m_framenum = wxGetApp().m_framenum;\r
1868 #ifdef USE_JPWL\r
1869         mj222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
1870         mj222handler->m_expcomps = wxGetApp().m_expcomps;\r
1871         mj222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
1872 #endif // USE_JPWL\r
1873 \r
1874         // load the file\r
1875     if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY), 0) {\r
1876         WriteText(wxT("Can't load image"));\r
1877                 return NULL;\r
1878         }\r
1879 \r
1880         // assign 100% image\r
1881     m_canvas->m_image100 = wxBitmap(image);\r
1882 \r
1883         // find a fit-to-width zoom\r
1884         int zooml, wzooml, hzooml;\r
1885         wxSize clientsize = m_canvas->GetClientSize();\r
1886         wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + image.GetWidth()));\r
1887         hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + image.GetHeight()));\r
1888         zooml = wxMin(100, wxMin(wzooml, hzooml));\r
1889 \r
1890         // fit to width\r
1891         m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);\r
1892 \r
1893         //m_canvas->m_image = m_canvas->m_image100;\r
1894         //m_canvas->Refresh();\r
1895         //m_canvas->SetScrollbars(20, 20, (int)(0.5 + (double) image.GetWidth() / 20.0), (int)(0.5 + (double) image.GetHeight() / 20.0));\r
1896 \r
1897     //text.Printf(wxT("Deco thread 0x%lx finished."), GetId());\r
1898     text.Printf(wxT("Deco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
1899     WriteText(text);\r
1900 \r
1901     return NULL;\r
1902 }\r
1903 \r
1904 /////////////////////////////////////////////////////////////////////\r
1905 // Parsing thread class\r
1906 /////////////////////////////////////////////////////////////////////\r
1907 \r
1908 OPJParseThread::OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid)\r
1909         : wxThread()\r
1910 {\r
1911     m_count = 0;\r
1912     m_tree = tree;\r
1913         m_parentid = parentid;\r
1914 }\r
1915 \r
1916 void OPJParseThread::WriteText(const wxString& text)\r
1917 {\r
1918     wxString msg;\r
1919 \r
1920     // before doing any GUI calls we must ensure that this thread is the only\r
1921     // one doing it!\r
1922 \r
1923     wxMutexGuiEnter();\r
1924 \r
1925     msg << text;\r
1926     m_tree->WriteText(msg);\r
1927 \r
1928     wxMutexGuiLeave();\r
1929 }\r
1930 \r
1931 void OPJParseThread::OnExit()\r
1932 {\r
1933     wxCriticalSectionLocker locker(wxGetApp().m_parse_critsect);\r
1934 \r
1935     wxArrayThread& threads = wxGetApp().m_parse_threads;\r
1936     threads.Remove(this);\r
1937 \r
1938     if (threads.IsEmpty()) {\r
1939         // signal the main thread that there are no more threads left if it is\r
1940         // waiting for us\r
1941         if (wxGetApp().m_parse_waitingUntilAllDone) {\r
1942             wxGetApp().m_parse_waitingUntilAllDone = false;\r
1943             wxGetApp().m_parse_semAllDone.Post();\r
1944         }\r
1945     }\r
1946 }\r
1947 \r
1948 void *OPJParseThread::Entry()\r
1949 {\r
1950 \r
1951     wxString text;\r
1952 \r
1953         srand(GetId());\r
1954         int m_countnum = rand() % 9;\r
1955     text.Printf(wxT("Parse thread 0x%lx started (priority = %u, time = %d)."),\r
1956             GetId(), GetPriority(), m_countnum);\r
1957     WriteText(text);\r
1958     // wxLogMessage(text); -- test wxLog thread safeness\r
1959 \r
1960         //wxBusyCursor wait;\r
1961         //wxBusyInfo wait(wxT("Decoding image ..."));\r
1962 \r
1963 \r
1964     /*for ( m_count = 0; m_count < m_countnum; m_count++ )\r
1965     {\r
1966         // check if we were asked to exit\r
1967         if ( TestDestroy() )\r
1968             break;\r
1969 \r
1970         text.Printf(wxT("[%u] Parse thread 0x%lx here."), m_count, GetId());\r
1971         WriteText(text);\r
1972 \r
1973         // wxSleep() can't be called from non-GUI thread!\r
1974         wxThread::Sleep(10);\r
1975     }*/\r
1976 \r
1977 \r
1978     LoadFile(m_tree->m_fname);\r
1979 \r
1980     text.Printf(wxT("Parse thread 0x%lx finished."), GetId());\r
1981     WriteText(text);\r
1982     // wxLogMessage(text); -- test wxLog thread safeness\r
1983 \r
1984     return NULL;\r
1985 }\r
1986 \r
1987 \r
1988 \r
1989 \r
1990 \r
1991 \r
1992 \r
1993 // ----------------------------------------------------------------------------\r
1994 // OPJDecoderDialog\r
1995 // ----------------------------------------------------------------------------\r
1996 \r
1997 IMPLEMENT_CLASS(OPJDecoderDialog, wxPropertySheetDialog)\r
1998 \r
1999 BEGIN_EVENT_TABLE(OPJDecoderDialog, wxPropertySheetDialog)\r
2000 #ifdef USE_JPWL\r
2001         EVT_CHECKBOX(OPJDECO_ENABLEJPWL, OPJDecoderDialog::OnEnableJPWL)\r
2002 #endif // USE_JPWL\r
2003 END_EVENT_TABLE()\r
2004 \r
2005 OPJDecoderDialog::OPJDecoderDialog(wxWindow* win, int dialogType)\r
2006 {\r
2007         SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);\r
2008 \r
2009         Create(win, wxID_ANY, wxT("Decoder settings"),\r
2010                 wxDefaultPosition, wxDefaultSize,\r
2011                 wxDEFAULT_DIALOG_STYLE| (int) wxPlatform::IfNot(wxOS_WINDOWS_CE, wxRESIZE_BORDER)\r
2012                 );\r
2013 \r
2014         CreateButtons(wxOK | wxCANCEL | (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP));\r
2015 \r
2016         wxBookCtrlBase* notebook = GetBookCtrl();\r
2017 \r
2018         wxPanel* mainSettings = CreateMainSettingsPage(notebook);\r
2019         wxPanel* jpeg2000Settings = CreatePart1SettingsPage(notebook);\r
2020         wxPanel* mjpeg2000Settings = CreatePart3SettingsPage(notebook);\r
2021 #ifdef USE_JPWL\r
2022         wxPanel* jpwlSettings = CreatePart11SettingsPage(notebook);\r
2023 #endif // USE_JPWL\r
2024 \r
2025         notebook->AddPage(mainSettings, wxT("Display"), false);\r
2026         notebook->AddPage(jpeg2000Settings, wxT("JPEG 2000"), false);\r
2027         notebook->AddPage(mjpeg2000Settings, wxT("MJPEG 2000"), false);\r
2028 #ifdef USE_JPWL\r
2029         notebook->AddPage(jpwlSettings, wxT("JPWL"), false);\r
2030 #endif // USE_JPWL\r
2031 \r
2032         LayoutDialog();\r
2033 }\r
2034 \r
2035 OPJDecoderDialog::~OPJDecoderDialog()\r
2036 {\r
2037 }\r
2038 \r
2039 /*wxPanel* OPJDecoderDialog::CreateGeneralSettingsPage(wxWindow* parent)\r
2040 {\r
2041     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
2042 \r
2043     wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );\r
2044     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );\r
2045 \r
2046     //// LOAD LAST FILE\r
2047 \r
2048     wxBoxSizer* itemSizer3 = new wxBoxSizer( wxHORIZONTAL );\r
2049     wxCheckBox* checkBox3 = new wxCheckBox(panel, ID_LOAD_LAST_PROJECT, _("&Load last project on startup"), wxDefaultPosition, wxDefaultSize);\r
2050     itemSizer3->Add(checkBox3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
2051     item0->Add(itemSizer3, 0, wxGROW|wxALL, 0);\r
2052 \r
2053     //// AUTOSAVE\r
2054 \r
2055     wxString autoSaveLabel = _("&Auto-save every");\r
2056     wxString minsLabel = _("mins");\r
2057 \r
2058     wxBoxSizer* itemSizer12 = new wxBoxSizer( wxHORIZONTAL );\r
2059     wxCheckBox* checkBox12 = new wxCheckBox(panel, ID_AUTO_SAVE, autoSaveLabel, wxDefaultPosition, wxDefaultSize);\r
2060 \r
2061     wxSpinCtrl* spinCtrl12 = new wxSpinCtrl(panel, ID_AUTO_SAVE_MINS, wxEmptyString,\r
2062         wxDefaultPosition, wxSize(40, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 60, 1);\r
2063 \r
2064     itemSizer12->Add(checkBox12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
2065     itemSizer12->Add(spinCtrl12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
2066     itemSizer12->Add(new wxStaticText(panel, wxID_STATIC, minsLabel), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
2067     item0->Add(itemSizer12, 0, wxGROW|wxALL, 0);\r
2068 \r
2069     //// TOOLTIPS\r
2070 \r
2071     wxBoxSizer* itemSizer8 = new wxBoxSizer( wxHORIZONTAL );\r
2072     wxCheckBox* checkBox6 = new wxCheckBox(panel, ID_SHOW_TOOLTIPS, _("Show &tooltips"), wxDefaultPosition, wxDefaultSize);\r
2073     itemSizer8->Add(checkBox6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
2074     item0->Add(itemSizer8, 0, wxGROW|wxALL, 0);\r
2075 \r
2076     topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );\r
2077 \r
2078     panel->SetSizer(topSizer);\r
2079     topSizer->Fit(panel);\r
2080 \r
2081     return panel;\r
2082 }*/\r
2083 \r
2084 /*wxPanel* OPJDecoderDialog::CreateAestheticSettingsPage(wxWindow* parent)\r
2085 {\r
2086     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
2087 \r
2088     wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );\r
2089     wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );\r
2090 \r
2091     //// PROJECT OR GLOBAL\r
2092     wxString globalOrProjectChoices[2];\r
2093     globalOrProjectChoices[0] = _("&New projects");\r
2094     globalOrProjectChoices[1] = _("&This project");\r
2095 \r
2096     wxRadioBox* projectOrGlobal = new wxRadioBox(panel, ID_APPLY_SETTINGS_TO, _("&Apply settings to:"),\r
2097         wxDefaultPosition, wxDefaultSize, 2, globalOrProjectChoices);\r
2098     item0->Add(projectOrGlobal, 0, wxGROW|wxALL, 5);\r
2099 \r
2100     projectOrGlobal->SetSelection(0);\r
2101 \r
2102     //// BACKGROUND STYLE\r
2103     wxArrayString backgroundStyleChoices;\r
2104     backgroundStyleChoices.Add(wxT("Colour"));\r
2105     backgroundStyleChoices.Add(wxT("Image"));\r
2106     wxStaticBox* staticBox3 = new wxStaticBox(panel, wxID_ANY, _("Background style:"));\r
2107 \r
2108     wxBoxSizer* styleSizer = new wxStaticBoxSizer( staticBox3, wxVERTICAL );\r
2109     item0->Add(styleSizer, 0, wxGROW|wxALL, 5);\r
2110 \r
2111     wxBoxSizer* itemSizer2 = new wxBoxSizer( wxHORIZONTAL );\r
2112 \r
2113     wxChoice* choice2 = new wxChoice(panel, ID_BACKGROUND_STYLE, wxDefaultPosition, wxDefaultSize, backgroundStyleChoices);\r
2114 \r
2115     itemSizer2->Add(new wxStaticText(panel, wxID_ANY, _("&Window:")), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
2116     itemSizer2->Add(5, 5, 1, wxALL, 0);\r
2117     itemSizer2->Add(choice2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
2118 \r
2119     styleSizer->Add(itemSizer2, 0, wxGROW|wxALL, 5);\r
2120 \r
2121 #if wxUSE_SPINCTRL\r
2122     //// FONT SIZE SELECTION\r
2123 \r
2124     wxStaticBox* staticBox1 = new wxStaticBox(panel, wxID_ANY, _("Tile font size:"));\r
2125     wxBoxSizer* itemSizer5 = new wxStaticBoxSizer( staticBox1, wxHORIZONTAL );\r
2126 \r
2127     wxSpinCtrl* spinCtrl = new wxSpinCtrl(panel, ID_FONT_SIZE, wxEmptyString, wxDefaultPosition,\r
2128         wxSize(80, wxDefaultCoord));\r
2129     itemSizer5->Add(spinCtrl, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);\r
2130 \r
2131     item0->Add(itemSizer5, 0, wxGROW|wxLEFT|wxRIGHT, 5);\r
2132 #endif\r
2133 \r
2134     topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );\r
2135     topSizer->AddSpacer(5);\r
2136 \r
2137     panel->SetSizer(topSizer);\r
2138     topSizer->Fit(panel);\r
2139 \r
2140     return panel;\r
2141 }*/\r
2142 \r
2143 wxPanel* OPJDecoderDialog::CreateMainSettingsPage(wxWindow* parent)\r
2144 {\r
2145     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
2146 \r
2147         // top sizer\r
2148     wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
2149 \r
2150                 // sub top sizer\r
2151                 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
2152 \r
2153                         // resize settings, column\r
2154                         wxString choices[] = {wxT("Low quality"), wxT("High quality")};\r
2155                         m_resizeBox = new wxRadioBox(panel, OPJDECO_RESMETHOD,\r
2156                                 wxT("Resize method"),\r
2157                                 wxDefaultPosition, wxDefaultSize,\r
2158                                 WXSIZEOF(choices),\r
2159                                 choices,\r
2160                                 1,\r
2161                                 wxRA_SPECIFY_ROWS);\r
2162                         m_resizeBox->SetSelection(wxGetApp().m_resizemethod);\r
2163 \r
2164                 subtopSizer->Add(m_resizeBox, 0, wxGROW | wxALL, 5);\r
2165 \r
2166         topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
2167 \r
2168         // assign top and fit it\r
2169     panel->SetSizer(topSizer);\r
2170     topSizer->Fit(panel);\r
2171 \r
2172     return panel;\r
2173 }\r
2174 \r
2175 wxPanel* OPJDecoderDialog::CreatePart3SettingsPage(wxWindow* parent)\r
2176 {\r
2177     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
2178 \r
2179         // top sizer\r
2180     wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
2181 \r
2182         // add some space\r
2183         //topSizer->AddSpacer(5);\r
2184 \r
2185                 // sub top sizer\r
2186                 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
2187 \r
2188                         // frame settings, column\r
2189                         wxStaticBox* frameBox = new wxStaticBox(panel, wxID_ANY, wxT("Frame"));\r
2190                         wxBoxSizer* frameSizer = new wxStaticBoxSizer(frameBox, wxVERTICAL);\r
2191 \r
2192                                 // selected frame number, row\r
2193                                 wxBoxSizer* framenumSizer = new wxBoxSizer(wxHORIZONTAL);\r
2194 \r
2195                                 // add some text\r
2196                                 framenumSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Displayed frame:")),\r
2197                                                                 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
2198 \r
2199                                 // add some horizontal space\r
2200                                 framenumSizer->Add(5, 5, 1, wxALL, 0);\r
2201 \r
2202                                 // add the value control\r
2203                                 framenumSizer->Add(\r
2204                                         m_framenumCtrl = new wxSpinCtrl(panel, OPJDECO_FRAMENUM,\r
2205                                                                 wxString::Format(wxT("%d"), wxGetApp().m_framenum),\r
2206                                                                 wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
2207                                                                 wxSP_ARROW_KEYS,\r
2208                                                                 1, 100000, wxGetApp().m_framenum),\r
2209                                         0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
2210 \r
2211                         frameSizer->Add(framenumSizer, 0, wxGROW | wxALL, 5);\r
2212 \r
2213                 subtopSizer->Add(frameSizer, 0, wxGROW | wxALL, 5);\r
2214 \r
2215         topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
2216 \r
2217         // assign top and fit it\r
2218     panel->SetSizer(topSizer);\r
2219     topSizer->Fit(panel);\r
2220 \r
2221     return panel;\r
2222 }\r
2223 \r
2224 wxPanel* OPJDecoderDialog::CreatePart1SettingsPage(wxWindow* parent)\r
2225 {\r
2226     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
2227 \r
2228         // top sizer\r
2229     wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
2230 \r
2231         // add some space\r
2232         //topSizer->AddSpacer(5);\r
2233 \r
2234                 // sub top sizer\r
2235                 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
2236 \r
2237                         // resolutions settings, column\r
2238                         wxStaticBox* resolutionBox = new wxStaticBox(panel, wxID_ANY, wxT("Resolutions"));\r
2239                         wxBoxSizer* resolutionSizer = new wxStaticBoxSizer(resolutionBox, wxVERTICAL);\r
2240 \r
2241                                 // reduce factor sizer, row\r
2242                                 wxBoxSizer* reduceSizer = new wxBoxSizer(wxHORIZONTAL);\r
2243 \r
2244                                 // add some text\r
2245                                 reduceSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Reduce factor:")),\r
2246                                                                 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
2247 \r
2248                                 // add some horizontal space\r
2249                                 reduceSizer->Add(5, 5, 1, wxALL, 0);\r
2250 \r
2251                                 // add the value control\r
2252                                 reduceSizer->Add(\r
2253                                         m_reduceCtrl = new wxSpinCtrl(panel, OPJDECO_REDUCEFACTOR,\r
2254                                         wxString::Format(wxT("%d"), wxGetApp().m_reducefactor),\r
2255                                                                 wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
2256                                                                 wxSP_ARROW_KEYS,\r
2257                                                                 0, 10000, wxGetApp().m_reducefactor),\r
2258                                         0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
2259 \r
2260                         resolutionSizer->Add(reduceSizer, 0, wxGROW | wxALL, 5);\r
2261 \r
2262                 subtopSizer->Add(resolutionSizer, 0, wxGROW | wxALL, 5);\r
2263 \r
2264                         // quality layer settings, column\r
2265                         wxStaticBox* layerBox = new wxStaticBox(panel, wxID_ANY, wxT("Layers"));\r
2266                         wxBoxSizer* layerSizer = new wxStaticBoxSizer(layerBox, wxVERTICAL);\r
2267 \r
2268                                 // quality layers sizer, row\r
2269                                 wxBoxSizer* qualitySizer = new wxBoxSizer(wxHORIZONTAL);\r
2270 \r
2271                                 // add some text\r
2272                                 qualitySizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Quality layers:")),\r
2273                                                                 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
2274 \r
2275                                 // add some horizontal space\r
2276                                 qualitySizer->Add(5, 5, 1, wxALL, 0);\r
2277 \r
2278                                 // add the value control\r
2279                                 qualitySizer->Add(\r
2280                                         m_layerCtrl = new wxSpinCtrl(panel, OPJDECO_QUALITYLAYERS,\r
2281                                                                 wxString::Format(wxT("%d"), wxGetApp().m_qualitylayers),\r
2282                                                                 wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
2283                                                                 wxSP_ARROW_KEYS,\r
2284                                                                 0, 100000, wxGetApp().m_qualitylayers),\r
2285                                         0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
2286 \r
2287                         layerSizer->Add(qualitySizer, 0, wxGROW | wxALL, 5);\r
2288 \r
2289                 subtopSizer->Add(layerSizer, 0, wxGROW | wxALL, 5);\r
2290 \r
2291                         // component settings, column\r
2292                         wxStaticBox* compoBox = new wxStaticBox(panel, wxID_ANY, wxT("Components"));\r
2293                         wxBoxSizer* compoSizer = new wxStaticBoxSizer(compoBox, wxVERTICAL);\r
2294 \r
2295                                 // quality layers sizer, row\r
2296                                 wxBoxSizer* numcompsSizer = new wxBoxSizer(wxHORIZONTAL);\r
2297 \r
2298                                 // add some text\r
2299                                 numcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&No. of components:")),\r
2300                                                                 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
2301 \r
2302                                 // add some horizontal space\r
2303                                 numcompsSizer->Add(5, 5, 1, wxALL, 0);\r
2304 \r
2305                                 // add the value control\r
2306                                 numcompsSizer->Add(\r
2307                                         m_numcompsCtrl = new wxSpinCtrl(panel, OPJDECO_NUMCOMPS,\r
2308                                                                 wxString::Format(wxT("%d"), wxGetApp().m_components),\r
2309                                                                 wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
2310                                                                 wxSP_ARROW_KEYS,\r
2311                                                                 0, 100000, wxGetApp().m_components),\r
2312                                         0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
2313                                 m_numcompsCtrl->Enable(false);\r
2314 \r
2315                         compoSizer->Add(numcompsSizer, 0, wxGROW | wxALL, 5);\r
2316 \r
2317                 subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5);\r
2318 \r
2319         topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
2320 \r
2321         // assign top and fit it\r
2322     panel->SetSizer(topSizer);\r
2323     topSizer->Fit(panel);\r
2324 \r
2325     return panel;\r
2326 }\r
2327 \r
2328 #ifdef USE_JPWL\r
2329 wxPanel* OPJDecoderDialog::CreatePart11SettingsPage(wxWindow* parent)\r
2330 {\r
2331     wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
2332 \r
2333         // top sizer\r
2334     wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
2335 \r
2336         // add some space\r
2337         //topSizer->AddSpacer(5);\r
2338 \r
2339                 // sub top sizer\r
2340                 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
2341 \r
2342                 // add JPWL enabling check box\r
2343                 subtopSizer->Add(\r
2344                         m_enablejpwlCheck = new wxCheckBox(panel, OPJDECO_ENABLEJPWL, wxT("Enable JPWL"), wxDefaultPosition, wxDefaultSize),\r
2345                         0, wxGROW | wxALL, 5);\r
2346                 m_enablejpwlCheck->SetValue(wxGetApp().m_enablejpwl);\r
2347 \r
2348                         // component settings, column\r
2349                         wxStaticBox* compoBox = new wxStaticBox(panel, wxID_ANY, wxT("Components"));\r
2350                         wxBoxSizer* compoSizer = new wxStaticBoxSizer(compoBox, wxVERTICAL);\r
2351 \r
2352                                 // expected components sizer, row\r
2353                                 wxBoxSizer* expcompsSizer = new wxBoxSizer(wxHORIZONTAL);\r
2354 \r
2355                                 // add some text\r
2356                                 expcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Expected comps.:")),\r
2357                                                                 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
2358 \r
2359                                 // add some horizontal space\r
2360                                 expcompsSizer->Add(5, 5, 1, wxALL, 0);\r
2361 \r
2362                                 // add the value control\r
2363                                 expcompsSizer->Add(\r
2364                                         m_expcompsCtrl = new wxSpinCtrl(panel, OPJDECO_EXPCOMPS,\r
2365                                                                 wxString::Format(wxT("%d"), wxGetApp().m_expcomps),\r
2366                                                                 wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
2367                                                                 wxSP_ARROW_KEYS,\r
2368                                                                 1, 100000, wxGetApp().m_expcomps),\r
2369                                         0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
2370                                 m_expcompsCtrl->Enable(wxGetApp().m_enablejpwl);\r
2371 \r
2372                         compoSizer->Add(expcompsSizer, 0, wxGROW | wxALL, 5);\r
2373 \r
2374                 subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5);\r
2375 \r
2376                         // tiles settings, column\r
2377                         wxStaticBox* tileBox = new wxStaticBox(panel, wxID_ANY, wxT("Tiles"));\r
2378                         wxBoxSizer* tileSizer = new wxStaticBoxSizer(tileBox, wxVERTICAL);\r
2379 \r
2380                                 // maximum tiles sizer, row\r
2381                                 wxBoxSizer* maxtileSizer = new wxBoxSizer(wxHORIZONTAL);\r
2382 \r
2383                                 // add some text\r
2384                                 maxtileSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Max. no. of tiles:")),\r
2385                                                                 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
2386 \r
2387                                 // add some horizontal space\r
2388                                 maxtileSizer->Add(5, 5, 1, wxALL, 0);\r
2389 \r
2390                                 // add the value control\r
2391                                 maxtileSizer->Add(\r
2392                                         m_maxtilesCtrl = new wxSpinCtrl(panel, OPJDECO_MAXTILES,\r
2393                                                                 wxString::Format(wxT("%d"), wxGetApp().m_maxtiles),\r
2394                                                                 wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
2395                                                                 wxSP_ARROW_KEYS,\r
2396                                                                 1, 100000, wxGetApp().m_maxtiles),\r
2397                                         0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
2398                                 m_maxtilesCtrl->Enable(wxGetApp().m_enablejpwl);\r
2399 \r
2400                         tileSizer->Add(maxtileSizer, 0, wxGROW | wxALL, 5);\r
2401 \r
2402                 subtopSizer->Add(tileSizer, 0, wxGROW | wxALL, 5);\r
2403 \r
2404         topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
2405 \r
2406         // assign top and fit it\r
2407     panel->SetSizer(topSizer);\r
2408     topSizer->Fit(panel);\r
2409 \r
2410     return panel;\r
2411 }\r
2412 \r
2413 void OPJDecoderDialog::OnEnableJPWL(wxCommandEvent& event)\r
2414 {\r
2415         if (event.IsChecked()) {\r
2416                 wxLogMessage(wxT("JPWL enabled"));\r
2417                 m_expcompsCtrl->Enable(true);\r
2418                 m_maxtilesCtrl->Enable(true);\r
2419         } else {\r
2420                 wxLogMessage(wxT("JPWL disabled"));\r
2421                 m_expcompsCtrl->Enable(false);\r
2422                 m_maxtilesCtrl->Enable(false);\r
2423         }\r
2424 \r
2425 }\r
2426 \r
2427 #endif // USE_JPWL\r
2428 \r
2429 bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)\r
2430 {\r
2431     /*size_t nFiles = filenames.GetCount();\r
2432     wxString str;\r
2433     str.Printf( _T("%d files dropped\n"), (int)nFiles);\r
2434     for ( size_t n = 0; n < nFiles; n++ ) {\r
2435         str << filenames[n] << wxT("\n");\r
2436     }\r
2437     wxLogMessage(str);*/\r
2438         m_pOwner->OpenFiles(filenames, filenames);\r
2439 \r
2440     return true;\r
2441 }\r
2442 \r