2 * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy
\r
3 * All rights reserved.
\r
5 * Redistribution and use in source and binary forms, with or without
\r
6 * modification, are permitted provided that the following conditions
\r
8 * 1. Redistributions of source code must retain the above copyright
\r
9 * notice, this list of conditions and the following disclaimer.
\r
10 * 2. Redistributions in binary form must reproduce the above copyright
\r
11 * notice, this list of conditions and the following disclaimer in the
\r
12 * documentation and/or other materials provided with the distribution.
\r
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
\r
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
\r
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
\r
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
\r
18 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
\r
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
\r
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
\r
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
\r
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
\r
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
\r
24 * POSSIBILITY OF SUCH DAMAGE.
\r
26 /////////////////////////////////////////////////////////////////////////////
\r
27 // Name: sashtest.cpp
\r
28 // Purpose: Layout/sash sample
\r
29 // Author: Julian Smart
\r
31 // Created: 04/01/98
\r
32 // RCS-ID: $Id: sashtest.cpp,v 1.18 2005/08/23 15:54:35 ABX Exp $
\r
33 // Copyright: (c) Julian Smart
\r
34 // Licence: wxWindows license
\r
35 /////////////////////////////////////////////////////////////////////////////
\r
36 /////////////////////////////////////////////////////////////////////////////
\r
37 // Name: treetest.cpp
\r
38 // Purpose: wxTreeCtrl sample
\r
39 // Author: Julian Smart
\r
41 // Created: 04/01/98
\r
42 // RCS-ID: $Id: treetest.cpp,v 1.110 2006/11/04 11:26:51 VZ Exp $
\r
43 // Copyright: (c) Julian Smart
\r
44 // Licence: wxWindows license
\r
45 /////////////////////////////////////////////////////////////////////////////
\r
46 /////////////////////////////////////////////////////////////////////////////
\r
47 // Name: dialogs.cpp
\r
48 // Purpose: Common dialogs demo
\r
49 // Author: Julian Smart
\r
50 // Modified by: ABX (2004) - adjustements for conditional building + new menu
\r
51 // Created: 04/01/98
\r
52 // RCS-ID: $Id: dialogs.cpp,v 1.163 2006/11/04 10:57:24 VZ Exp $
\r
53 // Copyright: (c) Julian Smart
\r
54 // Licence: wxWindows license
\r
55 /////////////////////////////////////////////////////////////////////////////
\r
56 /////////////////////////////////////////////////////////////////////////////
\r
58 // Purpose: wxWidgets thread sample
\r
59 // Author: Guilhem Lavaux, Vadim Zeitlin
\r
61 // Created: 06/16/98
\r
62 // RCS-ID: $Id: thread.cpp,v 1.26 2006/10/02 05:36:28 PC Exp $
\r
63 // Copyright: (c) 1998-2002 wxWidgets team
\r
64 // Licence: wxWindows license
\r
65 /////////////////////////////////////////////////////////////////////////////
\r
66 ///////////////////////////////////////////////////////////////////////////////
\r
67 // Name: samples/image/image.cpp
\r
68 // Purpose: sample showing operations with wxImage
\r
69 // Author: Robert Roebling
\r
72 // RCS-ID: $Id: image.cpp,v 1.120 2006/12/06 17:13:11 VZ Exp $
\r
73 // Copyright: (c) 1998-2005 Robert Roebling
\r
74 // License: wxWindows licence
\r
75 ///////////////////////////////////////////////////////////////////////////////
\r
76 /////////////////////////////////////////////////////////////////////////////
\r
77 // Name: samples/console/console.cpp
\r
78 // Purpose: A sample console (as opposed to GUI) program using wxWidgets
\r
79 // Author: Vadim Zeitlin
\r
81 // Created: 04.10.99
\r
82 // RCS-ID: $Id: console.cpp,v 1.206 2006/11/12 19:55:19 VZ Exp $
\r
83 // Copyright: (c) 1999 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
\r
84 // Licence: wxWindows license
\r
85 /////////////////////////////////////////////////////////////////////////////
\r
86 /////////////////////////////////////////////////////////////////////////////
\r
87 // Name: samples/notebook/notebook.cpp
\r
88 // Purpose: a sample demonstrating notebook usage
\r
89 // Author: Julian Smart
\r
90 // Modified by: Dimitri Schoolwerth
\r
91 // Created: 26/10/98
\r
92 // RCS-ID: $Id: notebook.cpp,v 1.49 2006/11/04 18:24:07 RR Exp $
\r
93 // Copyright: (c) 1998-2002 wxWidgets team
\r
94 // License: wxWindows license
\r
95 /////////////////////////////////////////////////////////////////////////////
\r
96 /////////////////////////////////////////////////////////////////////////////
\r
97 // Name: dialogs.cpp
\r
98 // Purpose: Common dialogs demo
\r
99 // Author: Julian Smart
\r
100 // Modified by: ABX (2004) - adjustements for conditional building + new menu
\r
101 // Created: 04/01/98
\r
102 // RCS-ID: $Id: dialogs.cpp,v 1.163 2006/11/04 10:57:24 VZ Exp $
\r
103 // Copyright: (c) Julian Smart
\r
104 // Licence: wxWindows license
\r
105 /////////////////////////////////////////////////////////////////////////////
\r
106 /////////////////////////////////////////////////////////////////////////////
\r
108 // Purpose: Drag and drop sample
\r
109 // Author: Vadim Zeitlin
\r
111 // Created: 04/01/98
\r
112 // RCS-ID: $Id: dnd.cpp,v 1.107 2006/10/30 20:23:41 VZ Exp $
\r
114 // Licence: wxWindows licence
\r
115 /////////////////////////////////////////////////////////////////////////////
\r
116 /////////////////////////////////////////////////////////////////////////////
\r
118 // Purpose: wxHtml testing example
\r
119 /////////////////////////////////////////////////////////////////////////////
\r
122 #include "OPJViewer.h"
\r
124 IMPLEMENT_APP(OPJViewerApp)
\r
126 // For drawing lines in a canvas
\r
132 // Initialise this in OnInit, not statically
\r
133 bool OPJViewerApp::OnInit(void)
\r
137 wxChar **wxArgv = new wxChar *[argc + 1];
\r
140 for (n = 0; n < argc; n++ ) {
\r
141 wxMB2WXbuf warg = wxConvertMB2WX((char *) argv[n]);
\r
142 wxArgv[n] = wxStrdup(warg);
\r
147 #else // !wxUSE_UNICODE
\r
149 #define wxArgv argv
\r
151 #endif // wxUSE_UNICODE/!wxUSE_UNICODE
\r
153 #if wxUSE_CMDLINE_PARSER
\r
155 static const wxCmdLineEntryDesc cmdLineDesc[] =
\r
157 { wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("show this help message"),
\r
158 wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
\r
160 { wxCMD_LINE_PARAM, NULL, NULL, _T("input file"),
\r
161 wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE },
\r
163 { wxCMD_LINE_NONE }
\r
166 wxCmdLineParser parser(cmdLineDesc, argc, wxArgv);
\r
168 /*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
172 switch (parser.Parse()) {
\r
174 wxLogMessage(wxT("Help was given, terminating."));
\r
178 ShowCmdLine(parser);
\r
182 wxLogMessage(wxT("Syntax error detected."));
\r
186 #endif // wxUSE_CMDLINE_PARSER
\r
188 //wxInitAllImageHandlers();
\r
190 wxImage::AddHandler( new wxJPEGHandler );
\r
192 #if wxUSE_LIBOPENJPEG
\r
193 wxImage::AddHandler( new wxJ2KHandler );
\r
194 wxImage::AddHandler( new wxJP2Handler );
\r
195 wxImage::AddHandler( new wxMJ2Handler );
\r
197 // we use a XPM image in our HTML page
\r
198 wxImage::AddHandler(new wxXPMHandler);
\r
200 // memory file system
\r
201 wxFileSystem::AddHandler(new wxMemoryFSHandler);
\r
203 // set decoding engine parameters
\r
204 m_resizemethod = 0;
\r
205 m_reducefactor = 0;
\r
206 m_qualitylayers = 0;
\r
210 m_enablejpwl = true;
\r
211 m_expcomps = JPWL_EXPECTED_COMPONENTS;
\r
212 m_maxtiles = JPWL_MAXIMUM_TILES;
\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
221 // Give it an icon (this is ignored in MDI mode: uses resources)
\r
223 frame->SetIcon(wxIcon(wxT("OPJViewer16")));
\r
228 SetTopWindow(frame);
\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
238 //wxLogMessage(paths[0]);
\r
239 frame->OpenFiles(paths, filenames);
\r
245 void OPJViewerApp::ShowCmdLine(const wxCmdLineParser& parser)
\r
247 wxString s = wxT("Command line parsed successfully:\nInput files: ");
\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
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
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
280 // file menu and its items
\r
281 wxMenu *file_menu = new wxMenu;
\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
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
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
292 file_menu->Append(OPJFRAME_FILECLOSE, wxT("&Close\tCtrl+C"));
\r
293 file_menu->SetHelpString(OPJFRAME_FILECLOSE, wxT("Close current image"));
\r
295 file_menu->Append(OPJFRAME_FILEEXIT, wxT("&Exit\tCtrl+Q"));
\r
296 file_menu->SetHelpString(OPJFRAME_FILEEXIT, wxT("Quit this program"));
\r
298 // view menu and its items
\r
299 wxMenu *view_menu = new wxMenu;
\r
301 view_menu->Append(OPJFRAME_VIEWZOOM, wxT("&Zoom\tCtrl+Z"));
\r
302 view_menu->SetHelpString(OPJFRAME_VIEWZOOM, wxT("Rescale the image"));
\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
307 view_menu->Append(OPJFRAME_VIEWRELOAD, wxT("&Reload image\tCtrl+R"));
\r
308 view_menu->SetHelpString(OPJFRAME_VIEWRELOAD, wxT("Reload the current image"));
\r
310 // settings menu and its items
\r
311 wxMenu *sets_menu = new wxMenu;
\r
313 sets_menu->Append(OPJFRAME_SETSDECO, wxT("&Decoder\tCtrl+D"));
\r
314 sets_menu->SetHelpString(OPJFRAME_SETSDECO, wxT("Decoder settings"));
\r
316 // help menu and its items
\r
317 wxMenu *help_menu = new wxMenu;
\r
319 help_menu->Append(OPJFRAME_HELPABOUT, wxT("&About\tF1"));
\r
320 help_menu->SetHelpString(OPJFRAME_HELPABOUT, wxT("Basic info on the program"));
\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
329 // Associate the menu bar with the frame
\r
330 SetMenuBar(menu_bar);
\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
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
346 // create the bottom notebook
\r
347 m_bookCtrlbottom = new wxNotebook(loggingWindow, BOTTOM_NOTEBOOK_ID,
\r
348 wxDefaultPosition, wxDefaultSize,
\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
356 m_textCtrl->SetValue(_T("Logging window\n"));
\r
358 // add it to the notebook
\r
359 m_bookCtrlbottom->AddPage(m_textCtrl, wxT("Log"));
\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
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
371 // add it the notebook
\r
372 m_bookCtrlbottom->AddPage(m_textCtrlbrowse, wxT("Peek"), false);
\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
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
386 // create the browser notebook
\r
387 m_bookCtrl = new wxNotebook(markerTreeWindow, LEFT_NOTEBOOK_ID,
\r
388 wxDefaultPosition, wxDefaultSize,
\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
396 // set our text control as the log target
\r
397 wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl);
\r
398 delete wxLog::SetActiveTarget(logWindow);
\r
401 // associate drop targets with the controls
\r
402 SetDropTarget(new OPJDnDFile(this));
\r
406 // this is the frame destructor
\r
407 OPJFrame::~OPJFrame(void)
\r
409 // delete all possible things
\r
413 delete markerTreeWindow;
\r
414 markerTreeWindow = NULL;
\r
419 delete m_bookCtrlbottom;
\r
420 m_bookCtrlbottom = NULL;
\r
422 delete loggingWindow;
\r
423 loggingWindow = NULL;
\r
426 void OPJFrame::OnNotebook(wxNotebookEvent& event)
\r
428 int sel = event.GetSelection();
\r
431 m_bookCtrl->GetPageText(sel).ToLong(&childnum);
\r
433 m_childhash[childnum]->Activate();
\r
435 //wxLogMessage(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber);
\r
440 void OPJFrame::Resize(int number)
\r
442 wxSize size = GetClientSize();
\r
445 void OPJFrame::OnSetsDeco(wxCommandEvent& event)
\r
447 OPJDecoderDialog dialog(this, event.GetId());
\r
449 if (dialog.ShowModal() == wxID_OK) {
\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
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
466 void OPJFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
\r
471 void OPJFrame::OnClose(wxCommandEvent& WXUNUSED(event))
\r
474 OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
\r
480 currframe->OnClose(e);
\r
483 void OPJFrame::OnFit(wxCommandEvent& WXUNUSED(event))
\r
486 OPJChildFrame *currchild = (OPJChildFrame *) GetActiveChild();
\r
491 OPJCanvas *currcanvas = currchild->m_canvas;
\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
501 Rescale(zooml, currchild);
\r
504 void OPJFrame::OnZoom(wxCommandEvent& WXUNUSED(event))
\r
507 OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
\r
512 // get the preferred zoom
\r
513 long zooml = wxGetNumberFromUser(wxT("Choose a scale between 5% and 300%"),
\r
515 wxT("Image scale"),
\r
516 currframe->m_canvas->m_zooml, 5, 300, NULL, wxDefaultPosition);
\r
518 // rescale current frame image if necessary
\r
520 Rescale(zooml, currframe);
\r
521 wxLogMessage(wxT("zoom to %d%%"), zooml);
\r
525 void OPJFrame::Rescale(int zooml, OPJChildFrame *currframe)
\r
527 wxImage new_image = currframe->m_canvas->m_image100.ConvertToImage();
\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
535 (int)(0.5 + (double) new_image.GetWidth() / 20.0),
\r
536 (int)(0.5 + (double) new_image.GetHeight() / 20.0)
\r
538 currframe->m_canvas->Refresh();
\r
541 currframe->m_canvas->m_zooml = zooml;
\r
545 void OPJFrame::OnReload(wxCommandEvent& event)
\r
547 OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();
\r
549 OPJDecoThread *dthread = currframe->m_canvas->CreateDecoThread();
\r
551 if (dthread->Run() != wxTHREAD_NO_ERROR)
\r
552 wxLogMessage(wxT("Can't start deco thread!"));
\r
554 wxLogMessage(wxT("New deco thread started."));
\r
556 currframe->m_canvas->Refresh();
\r
559 //currframe->m_canvas->m_zooml = zooml;
\r
563 // about window for the frame
\r
564 void OPJFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
\r
566 #ifdef OPJ_HTMLABOUT
\r
567 #include "about_htm.h"
\r
568 #include "opj_logo.xpm"
\r
570 wxBoxSizer *topsizer;
\r
571 wxHtmlWindow *html;
\r
572 wxDialog dlg(this, wxID_ANY, wxString(_("About")));
\r
574 wxMemoryFSHandler::AddFile(wxT("opj_logo.xpm"), wxBitmap(opj_logo), wxBITMAP_TYPE_XPM);
\r
576 topsizer = new wxBoxSizer(wxVERTICAL);
\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
586 topsizer->Add(html, 1, wxALL, 10);
\r
588 topsizer->Add(new wxStaticLine(&dlg, wxID_ANY), 0, wxEXPAND | wxLEFT | wxRIGHT, 10);
\r
590 wxButton *bu1 = new wxButton(&dlg, wxID_OK, wxT("OK"));
\r
593 topsizer->Add(bu1, 0, wxALL | wxALIGN_RIGHT, 15);
\r
595 dlg.SetSizer(topsizer);
\r
596 topsizer->Fit(&dlg);
\r
602 wxMessageBox(wxString::Format(OPJ_APPLICATION_TITLEBAR
\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
610 wxGetOsDescription().c_str()),
\r
611 wxT("About ") OPJ_APPLICATION_NAME,
\r
612 wxOK | wxICON_INFORMATION,
\r
620 void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event))
\r
622 if (markerTreeWindow->IsShown())
\r
623 markerTreeWindow->Show(false);
\r
625 markerTreeWindow->Show(true);
\r
627 wxLayoutAlgorithm layout;
\r
628 layout.LayoutMDIFrame(this);
\r
631 void OPJFrame::OnTogglePeeker(wxCommandEvent& WXUNUSED(event))
\r
633 if (loggingWindow->IsShown())
\r
634 loggingWindow->Show(false);
\r
636 loggingWindow->Show(true);
\r
638 wxLayoutAlgorithm layout;
\r
639 layout.LayoutMDIFrame(this);
\r
642 void OPJFrame::OnSashDrag(wxSashEvent& event)
\r
644 if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)
\r
647 switch (event.GetId()) {
\r
648 case OPJFRAME_BROWSEWIN:
\r
650 markerTreeWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));
\r
653 case OPJFRAME_LOGWIN:
\r
655 loggingWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));
\r
660 wxLayoutAlgorithm layout;
\r
661 layout.LayoutMDIFrame(this);
\r
663 // Leaves bits of itself behind sometimes
\r
664 GetClientWindow()->Refresh();
\r
667 // physically open the files
\r
668 void OPJFrame::OpenFiles(wxArrayString paths, wxArrayString filenames)
\r
671 size_t count = paths.GetCount();
\r
672 for (size_t n = 0; n < count; n++) {
\r
675 s.Printf(_T("File %d: %s (%s)\n"), (int)n, paths[n].c_str(), filenames[n].c_str());
\r
679 /*wxMessageDialog dialog2(this, msg, _T("Selected files"));
\r
680 dialog2.ShowModal();*/
\r
682 // Make another frame, containing a canvas
\r
683 OPJChildFrame *subframe = new OPJChildFrame(this,
\r
686 wxT("Canvas Frame"),
\r
687 wxDefaultPosition, wxSize(300, 300),
\r
688 wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE
\r
690 m_childhash[winNumber] = subframe;
\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
698 m_bookCtrl->AddPage(m_treehash[winNumber], wxString::Format(wxT("%u"), winNumber), false);
\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
711 void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event))
\r
713 wxString wildcards =
\r
715 wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.*j*2*");
\r
717 wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.jp2;*.j2k;*.j2c;*.mj2|JPEG files (*.jpg)|*.jpg|All files|*");
\r
719 wxFileDialog dialog(this, _T("Open JPEG 2000 file(s)"),
\r
720 wxEmptyString, wxEmptyString, wildcards,
\r
721 wxFD_OPEN|wxFD_MULTIPLE);
\r
723 if (dialog.ShowModal() == wxID_OK) {
\r
724 wxArrayString paths, filenames;
\r
726 dialog.GetPaths(paths);
\r
727 dialog.GetFilenames(filenames);
\r
729 OpenFiles(paths, filenames);
\r
734 BEGIN_EVENT_TABLE(OPJCanvas, wxScrolledWindow)
\r
735 EVT_MOUSE_EVENTS(OPJCanvas::OnEvent)
\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
743 SetBackgroundColour(OPJ_CANVAS_COLOUR);
\r
746 m_childframe = (OPJChildFrame *) parent;
\r
748 OPJDecoThread *dthread = CreateDecoThread();
\r
750 if (dthread->Run() != wxTHREAD_NO_ERROR)
\r
751 wxLogMessage(wxT("Can't start deco thread!"));
\r
753 wxLogMessage(wxT("New deco thread started."));
\r
759 OPJDecoThread *OPJCanvas::CreateDecoThread(void)
\r
761 OPJDecoThread *dthread = new OPJDecoThread(this);
\r
763 if (dthread->Create() != wxTHREAD_NO_ERROR)
\r
764 wxLogError(wxT("Can't create deco thread!"));
\r
766 wxCriticalSectionLocker enter(wxGetApp().m_deco_critsect);
\r
767 wxGetApp().m_deco_threads.Add(dthread);
\r
772 #define activeoverlay 0
\r
773 // Define the repainting behaviour
\r
774 void OPJCanvas::OnDraw(wxDC& dc)
\r
776 if (m_image.Ok()) {
\r
777 dc.DrawBitmap(m_image, OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER);
\r
779 if (activeoverlay) {
\r
780 dc.SetPen(*wxRED_PEN);
\r
781 dc.SetBrush(*wxTRANSPARENT_BRUSH);
\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
789 dc.SetFont(*wxSWISS_FONT);
\r
790 dc.SetPen(*wxBLACK_PEN);
\r
791 dc.DrawText(_T("Decoding image, please wait..."), 40, 50);
\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
799 wxClientDC dc(this);
\r
802 wxPoint pt(event.GetLogicalPosition(dc));
\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
812 void OPJFrame::OnSize(wxSizeEvent& WXUNUSED(event))
\r
814 wxLayoutAlgorithm layout;
\r
815 layout.LayoutMDIFrame(this);
\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
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
829 OPJChildFrame::OPJChildFrame(OPJFrame *parent, wxFileName fname, int winnumber, const wxString& title, const wxPoint& pos, const wxSize& size,
\r
831 wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style)
\r
833 m_frame = (OPJFrame *) parent;
\r
835 //my_children.Append(this);
\r
837 m_winnumber = winnumber;
\r
838 SetTitle(wxString::Format(_T("%d: "), m_winnumber) + m_fname.GetFullName());
\r
840 // Give it an icon (this is ignored in MDI mode: uses resources)
\r
842 SetIcon(wxIcon(wxT("OPJChild16")));
\r
845 // Give it a status line
\r
846 /*CreateStatusBar();*/
\r
849 GetClientSize(&width, &height);
\r
851 OPJCanvas *canvas = new OPJCanvas(fname, this, wxPoint(0, 0), wxSize(width, height));
\r
852 canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));
\r
855 // Give it scrollbars
\r
856 canvas->SetScrollbars(20, 20, 5, 5);
\r
861 /*wxLogError(wxString::Format(wxT("Created tree %d (0x%x)"), m_winnumber, m_frame->m_treehash[m_winnumber]));*/
\r
865 OPJChildFrame::~OPJChildFrame(void)
\r
867 //my_children.DeleteObject(this);
\r
871 void OPJChildFrame::OnClose(wxCloseEvent& event)
\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
881 wxLogMessage(wxT("Closed: %d"), m_winnumber);
\r
884 void OPJChildFrame::OnActivate(wxActivateEvent& event)
\r
886 /*if (event.GetActive() && m_canvas)
\r
887 m_canvas->SetFocus();*/
\r
890 void OPJChildFrame::OnGotFocus(wxFocusEvent& event)
\r
892 // we need to check if the notebook is being destroyed or not
\r
893 if (!m_frame->m_bookCtrl)
\r
896 for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {
\r
898 if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {
\r
899 m_frame->m_bookCtrl->ChangeSelection(p);
\r
905 //wxLogMessage(wxT("Got focus: %d (%x)"), m_winnumber, event.GetWindow());
\r
908 void OPJChildFrame::OnLostFocus(wxFocusEvent& event)
\r
910 //wxLogMessage(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow());
\r
913 #if USE_GENERIC_TREECTRL
\r
914 BEGIN_EVENT_TABLE(OPJMarkerTree, wxGenericTreeCtrl)
\r
916 BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl)
\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
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
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
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
946 /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown)
\r
947 EVT_RIGHT_UP(OPJMarkerTree::OnRMouseUp)
\r
948 EVT_RIGHT_DCLICK(OPJMarkerTree::OnRMouseDClick)*/
\r
951 // OPJMarkerTree implementation
\r
952 #if USE_GENERIC_TREECTRL
\r
953 IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxGenericTreeCtrl)
\r
955 IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)
\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
962 m_reverseSort = false;
\r
965 m_peektextCtrl = ((OPJFrame *) (parent->GetParent()->GetParent()))->m_textCtrlbrowse;
\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
973 new OPJMarkerData(name));
\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
979 wxLogMessage(wxT("New parse thread started."));
\r
981 m_childframe = subframe;
\r
984 void OPJMarkerTree::CreateImageList(int size)
\r
987 SetImageList(NULL);
\r
991 size = m_imageSize;
\r
993 m_imageSize = size;
\r
995 // Make an image list containing small icons
\r
996 wxImageList *images = new wxImageList(size, size, true);
\r
998 // should correspond to TreeCtrlIcon_xxx enum
\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
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
1012 images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));
\r
1016 AssignImageList(images);
\r
1019 #if USE_GENERIC_TREECTRL || !defined(__WXMSW__)
\r
1020 void OPJMarkerTree::CreateButtonsImageList(int size)
\r
1022 if ( size == -1 ) {
\r
1023 SetButtonsImageList(NULL);
\r
1027 // Make an image list containing small icons
\r
1028 wxImageList *images = new wxImageList(size, size, true);
\r
1030 // should correspond to TreeCtrlIcon_xxx enum
\r
1031 wxBusyCursor wait;
\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
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
1043 images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));
\r
1047 AssignButtonsImageList(images);
\r
1049 void OPJMarkerTree::CreateButtonsImageList(int WXUNUSED(size))
\r
1054 void OPJParseThread::LoadFile(wxFileName fname)
\r
1056 wxTreeItemId rootid;
\r
1058 // this is the root node
\r
1059 int image = wxGetApp().ShowImages() ? m_tree->TreeCtrlIcon_Folder : -1;
\r
1061 if (this->m_parentid) {
\r
1063 rootid = m_parentid;
\r
1064 m_tree->SetItemText(rootid, wxT("Parsing..."));
\r
1068 // delete the existing tree hierarchy
\r
1069 m_tree->DeleteAllItems();
\r
1072 rootid = m_tree->AddRoot(wxT("Parsing..."),
\r
1075 new OPJMarkerData(fname.GetFullPath())
\r
1077 //m_tree->SetItemFont(rootid, *wxITALIC_FONT);
\r
1078 m_tree->SetItemBold(rootid);
\r
1082 wxFile m_file(fname.GetFullPath().c_str(), wxFile::read);
\r
1084 // what is the extension?
\r
1085 if ((fname.GetExt() == wxT("j2k")) || (fname.GetExt() == wxT("j2c"))) {
\r
1088 ParseJ2KFile(&m_file, 0, m_file.Length(), rootid);
\r
1090 } else if ((fname.GetExt() == wxT("jp2")) || (fname.GetExt() == wxT("mj2"))) {
\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
1101 ParseJP2File(&m_file, 0, m_file.Length(), rootid);
\r
1105 // unknown extension
\r
1106 WriteText(wxT("Unknown file format!"));
\r
1110 // this is the root node
\r
1111 if (this->m_parentid)
\r
1112 m_tree->SetItemText(rootid, wxT("Codestream"));
\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
1120 WriteText(wxT("Parsing finished!"));
\r
1123 /*int OPJMarkerTree::OnCompareItems(const wxTreeItemId& item1,
\r
1124 const wxTreeItemId& item2)
\r
1126 if ( m_reverseSort )
\r
1128 // just exchange 1st and 2nd items
\r
1129 return wxTreeCtrl::OnCompareItems(item2, item1);
\r
1133 return wxTreeCtrl::OnCompareItems(item1, item2);
\r
1137 /*void OPJMarkerTree::AddItemsRecursively(const wxTreeItemId& idParent,
\r
1138 size_t numChildren,
\r
1144 bool hasChildren = depth > 1;
\r
1147 for ( size_t n = 0; n < numChildren; n++ )
\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
1153 str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));
\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
1160 image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;
\r
1161 imageSel = image + 1;
\r
1165 image = imageSel = -1;
\r
1167 wxTreeItemId id = AppendItem(idParent, str, image, imageSel,
\r
1168 new OPJMarkerData(str));
\r
1170 // and now we also set the expanded one (only for the folders)
\r
1171 if ( hasChildren && wxGetApp().ShowImages() )
\r
1173 SetItemImage(id, TreeCtrlIcon_FolderOpened,
\r
1174 wxTreeItemIcon_Expanded);
\r
1177 // remember the last child for OnEnsureVisible()
\r
1178 if ( !hasChildren && n == numChildren - 1 )
\r
1183 AddItemsRecursively(id, numChildren, depth - 1, n + 1);
\r
1189 /*void OPJMarkerTree::AddTestItemsToTree(size_t numChildren,
\r
1192 int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;
\r
1193 wxTreeItemId rootId = AddRoot(wxT("Root"),
\r
1195 new OPJMarkerData(wxT("Root item")));
\r
1196 if ( image != -1 )
\r
1198 SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded);
\r
1201 AddItemsRecursively(rootId, numChildren, depth, 0);
\r
1203 // set some colours/fonts for testing
\r
1204 SetItemFont(rootId, *wxITALIC_FONT);
\r
1206 wxTreeItemIdValue cookie;
\r
1207 wxTreeItemId id = GetFirstChild(rootId, cookie);
\r
1208 SetItemTextColour(id, *wxBLUE);
\r
1210 id = GetNextChild(rootId, cookie);
\r
1211 id = GetNextChild(rootId, cookie);
\r
1212 SetItemTextColour(id, *wxRED);
\r
1213 SetItemBackgroundColour(id, *wxLIGHT_GREY);
\r
1216 /*void OPJMarkerTree::GetItemsRecursively(const wxTreeItemId& idParent,
\r
1217 wxTreeItemIdValue cookie)
\r
1222 id = GetFirstChild(idParent, cookie);
\r
1224 id = GetNextChild(idParent, cookie);
\r
1229 wxString text = GetItemText(id);
\r
1230 wxLogMessage(text);
\r
1232 if (ItemHasChildren(id))
\r
1233 GetItemsRecursively(id);
\r
1235 GetItemsRecursively(idParent, cookie);
\r
1238 /*void OPJMarkerTree::DoToggleIcon(const wxTreeItemId& item)
\r
1240 int image = (GetItemImage(item) == TreeCtrlIcon_Folder)
\r
1241 ? TreeCtrlIcon_File
\r
1242 : TreeCtrlIcon_Folder;
\r
1243 SetItemImage(item, image, wxTreeItemIcon_Normal);
\r
1245 image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected)
\r
1246 ? TreeCtrlIcon_FileSelected
\r
1247 : TreeCtrlIcon_FolderSelected;
\r
1248 SetItemImage(item, image, wxTreeItemIcon_Selected);
\r
1251 void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event)
\r
1253 wxTreeItemId item = event.GetItem();
\r
1255 if ( item.IsOk() )
\r
1256 text << wxT('"') << GetItemText(item).c_str() << wxT('"');
\r
1258 text = wxT("invalid item");
\r
1259 wxLogMessage(wxT("%s(%s)"), name, text.c_str());
\r
1262 OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe)
\r
1264 OPJParseThread *pthread = new OPJParseThread(this, parentid);
\r
1266 if (pthread->Create() != wxTHREAD_NO_ERROR)
\r
1267 wxLogError(wxT("Can't create parse thread!"));
\r
1269 wxCriticalSectionLocker enter(wxGetApp().m_parse_critsect);
\r
1270 wxGetApp().m_parse_threads.Add(pthread);
\r
1276 /*// avoid repetition
\r
1277 #define TREE_EVENT_HANDLER(name) \
\r
1278 void OPJMarkerTree::name(wxTreeEvent& event) \
\r
1280 LogEvent(_T(#name), event); \
\r
1281 SetLastItem(wxTreeItemId()); \
\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
1295 /*#undef TREE_EVENT_HANDLER*/
\r
1297 void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event)
\r
1299 wxTreeItemId item = event.GetItem();
\r
1300 OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);
\r
1304 text << wxT('"') << GetItemText(item).c_str() << wxT('"');
\r
1306 text = wxT("invalid item");
\r
1308 if (wxStrcmp(data->GetDesc1(), wxT("INFO-CSTREAM")))
\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
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
1322 wxLogMessage(wxT("New parse thread started."));
\r
1326 void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)
\r
1328 #define BUNCH_LINESIZE 16
\r
1329 #define BUNCH_NUMLINES 7
\r
1331 wxTreeItemId item = event.GetItem();
\r
1332 OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);
\r
1334 int l, c, pos = 0, pre_pos;
\r
1335 unsigned char buffer[BUNCH_LINESIZE * BUNCH_NUMLINES];
\r
1337 m_peektextCtrl->Clear();
\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
1343 // open the file and browse a little
\r
1344 wxFile *fp = new wxFile(m_fname.GetFullPath().c_str(), wxFile::read);
\r
1346 // go to position claimed
\r
1347 fp->Seek(data->m_start, wxFromStart);
\r
1350 int max_read = wxMin(WXSIZEOF(buffer), data->m_length - data->m_start + 1);
\r
1351 fp->Read(buffer, max_read);
\r
1353 // write the file data between start and stop
\r
1355 for (l = 0; l < BUNCH_NUMLINES; l++) {
\r
1357 text << wxString::Format(wxT("%010d:"), data->m_start + pos);
\r
1361 // add hex browsing text
\r
1362 for (c = 0; c < BUNCH_LINESIZE; c++) {
\r
1367 if (pos < max_read) {
\r
1368 text << wxString::Format(wxT("%02X "), buffer[pos]);
\r
1376 // add char browsing text
\r
1377 for (c = 0; c < BUNCH_LINESIZE; c++) {
\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
1392 text << wxT("\n");
\r
1399 m_peektextCtrl->WriteText(text);
\r
1402 /*void LogKeyEvent(const wxChar *name, const wxKeyEvent& event)
\r
1405 long keycode = event.GetKeyCode();
\r
1407 switch ( keycode )
\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
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
1515 key.Printf(wxT("unknown (%ld)"), keycode);
\r
1520 wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"),
\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
1529 void OPJMarkerTree::OnTreeKeyDown(wxTreeEvent& event)
\r
1531 LogKeyEvent(wxT("Tree key down "), event.GetKeyEvent());
\r
1536 /*void OPJMarkerTree::OnBeginDrag(wxTreeEvent& event)
\r
1538 // need to explicitly allow drag
\r
1539 if ( event.GetItem() != GetRootItem() )
\r
1541 m_draggedItem = event.GetItem();
\r
1543 wxLogMessage(wxT("OnBeginDrag: started dragging %s"),
\r
1544 GetItemText(m_draggedItem).c_str());
\r
1550 wxLogMessage(wxT("OnBeginDrag: this item can't be dragged."));
\r
1554 void OPJMarkerTree::OnEndDrag(wxTreeEvent& event)
\r
1556 wxTreeItemId itemSrc = m_draggedItem,
\r
1557 itemDst = event.GetItem();
\r
1558 m_draggedItem = (wxTreeItemId)0l;
\r
1560 // where to copy the item?
\r
1561 if ( itemDst.IsOk() && !ItemHasChildren(itemDst) )
\r
1563 // copy to the parent then
\r
1564 itemDst = GetItemParent(itemDst);
\r
1567 if ( !itemDst.IsOk() )
\r
1569 wxLogMessage(wxT("OnEndDrag: can't drop here."));
\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
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
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
1589 /*void OPJMarkerTree::OnBeginLabelEdit(wxTreeEvent& event)
\r
1591 wxLogMessage(wxT("OnBeginLabelEdit"));
\r
1593 // for testing, prevent this item's label editing
\r
1594 wxTreeItemId itemId = event.GetItem();
\r
1595 if ( IsTestItem(itemId) )
\r
1597 wxMessageBox(wxT("You can't edit this item."));
\r
1601 else if ( itemId == GetRootItem() )
\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
1608 void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event)
\r
1610 wxLogMessage(wxT("OnEndLabelEdit"));
\r
1612 // don't allow anything except letters in the labels
\r
1613 if ( !event.GetLabel().IsWord() )
\r
1615 wxMessageBox(wxT("The new label should be a single word."));
\r
1621 /*void OPJMarkerTree::OnItemCollapsing(wxTreeEvent& event)
\r
1623 wxLogMessage(wxT("OnItemCollapsing"));
\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
1629 wxMessageBox(wxT("You can't collapse this item."));
\r
1635 /*void OPJMarkerTree::OnItemActivated(wxTreeEvent& event)
\r
1637 // show some info about this item
\r
1638 wxTreeItemId itemId = event.GetItem();
\r
1639 OPJMarkerData *item = (OPJMarkerData *)GetItemData(itemId);
\r
1641 if ( item != NULL )
\r
1643 item->ShowInfo(this);
\r
1646 wxLogMessage(wxT("OnItemActivated"));
\r
1649 void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)
\r
1651 /*wxTreeItemId itemId = event.GetItem();
\r
1652 OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)
\r
1655 wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc()
\r
1658 //wxLogMessage(wxT("EEEEEEEEEE"));
\r
1663 /*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event)
\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
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
1672 if ( !HasFlag(wxTR_MULTIPLE) )
\r
1673 item = GetSelection();
\r
1675 // attempt to guess where to show the menu
\r
1676 if ( item.IsOk() )
\r
1678 // if an item was clicked, show menu to the right of it
\r
1680 GetBoundingRect(item, rect, true );// only the label
\r
1681 pt = wxPoint(rect.GetRight(), rect.GetTop());
\r
1685 pt = wxPoint(0, 0);
\r
1688 else // event was generated by mouse, use supplied coords
\r
1690 pt = ScreenToClient(pt);
\r
1691 item = HitTest(pt);
\r
1694 ShowMenu(item, pt);
\r
1697 /*void OPJMarkerTree::ShowMenu(wxTreeItemId id, const wxPoint& pt)
\r
1702 title << wxT("Menu for ") << GetItemText(id);
\r
1706 title = wxT("Menu for no particular item");
\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
1716 PopupMenu(&menu, pt);
\r
1717 #endif // wxUSE_MENUS
\r
1720 /*void OPJMarkerTree::OnItemRClick(wxTreeEvent& event)
\r
1722 wxTreeItemId itemId = event.GetItem();
\r
1723 OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)
\r
1726 wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc()
\r
1733 void OPJMarkerTree::OnRMouseDown(wxMouseEvent& event)
\r
1735 wxLogMessage(wxT("Right mouse button down"));
\r
1740 void OPJMarkerTree::OnRMouseUp(wxMouseEvent& event)
\r
1742 wxLogMessage(wxT("Right mouse button up"));
\r
1747 void OPJMarkerTree::OnRMouseDClick(wxMouseEvent& event)
\r
1749 wxTreeItemId id = HitTest(event.GetPosition());
\r
1751 wxLogMessage(wxT("No item under mouse"));
\r
1754 OPJMarkerData *item = (OPJMarkerData *)GetItemData(id);
\r
1756 wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc());
\r
1763 static inline const wxChar *Bool2String(bool b)
\r
1765 return b ? wxT("") : wxT("not ");
\r
1768 void OPJMarkerData::ShowInfo(wxTreeCtrl *tree)
\r
1770 wxLogMessage(wxT("Item '%s': %sselected, %sexpanded, %sbold,\n")
\r
1771 wxT("%u children (%u immediately under this item)."),
\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
1780 /////////////////////////////////////////////////////////////////////
\r
1781 // Decoding thread class
\r
1782 /////////////////////////////////////////////////////////////////////
\r
1784 OPJDecoThread::OPJDecoThread(OPJCanvas *canvas)
\r
1788 m_canvas = canvas;
\r
1791 void OPJDecoThread::WriteText(const wxString& text)
\r
1795 // before doing any GUI calls we must ensure that this thread is the only
\r
1798 wxMutexGuiEnter();
\r
1801 m_canvas->WriteText(msg);
\r
1803 wxMutexGuiLeave();
\r
1806 void OPJDecoThread::OnExit()
\r
1808 wxCriticalSectionLocker locker(wxGetApp().m_deco_critsect);
\r
1810 wxArrayThread& dthreads = wxGetApp().m_deco_threads;
\r
1811 dthreads.Remove(this);
\r
1813 if (dthreads.IsEmpty() )
\r
1815 // signal the main thread that there are no more threads left if it is
\r
1817 if (wxGetApp().m_deco_waitingUntilAllDone) {
\r
1818 wxGetApp().m_deco_waitingUntilAllDone = false;
\r
1819 wxGetApp().m_deco_semAllDone.Post();
\r
1824 void *OPJDecoThread::Entry()
\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
1836 wxBitmap bitmap(100, 100);
\r
1837 wxImage image = bitmap.ConvertToImage();
\r
1840 WriteText(m_canvas->m_fname.GetFullPath());
\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
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
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
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
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
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
1875 if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY), 0) {
\r
1876 WriteText(wxT("Can't load image"));
\r
1880 // assign 100% image
\r
1881 m_canvas->m_image100 = wxBitmap(image);
\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
1891 m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);
\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
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
1904 /////////////////////////////////////////////////////////////////////
\r
1905 // Parsing thread class
\r
1906 /////////////////////////////////////////////////////////////////////
\r
1908 OPJParseThread::OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid)
\r
1913 m_parentid = parentid;
\r
1916 void OPJParseThread::WriteText(const wxString& text)
\r
1920 // before doing any GUI calls we must ensure that this thread is the only
\r
1923 wxMutexGuiEnter();
\r
1926 m_tree->WriteText(msg);
\r
1928 wxMutexGuiLeave();
\r
1931 void OPJParseThread::OnExit()
\r
1933 wxCriticalSectionLocker locker(wxGetApp().m_parse_critsect);
\r
1935 wxArrayThread& threads = wxGetApp().m_parse_threads;
\r
1936 threads.Remove(this);
\r
1938 if (threads.IsEmpty()) {
\r
1939 // signal the main thread that there are no more threads left if it is
\r
1941 if (wxGetApp().m_parse_waitingUntilAllDone) {
\r
1942 wxGetApp().m_parse_waitingUntilAllDone = false;
\r
1943 wxGetApp().m_parse_semAllDone.Post();
\r
1948 void *OPJParseThread::Entry()
\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
1958 // wxLogMessage(text); -- test wxLog thread safeness
\r
1960 //wxBusyCursor wait;
\r
1961 //wxBusyInfo wait(wxT("Decoding image ..."));
\r
1964 /*for ( m_count = 0; m_count < m_countnum; m_count++ )
\r
1966 // check if we were asked to exit
\r
1967 if ( TestDestroy() )
\r
1970 text.Printf(wxT("[%u] Parse thread 0x%lx here."), m_count, GetId());
\r
1973 // wxSleep() can't be called from non-GUI thread!
\r
1974 wxThread::Sleep(10);
\r
1978 LoadFile(m_tree->m_fname);
\r
1980 text.Printf(wxT("Parse thread 0x%lx finished."), GetId());
\r
1982 // wxLogMessage(text); -- test wxLog thread safeness
\r
1993 // ----------------------------------------------------------------------------
\r
1994 // OPJDecoderDialog
\r
1995 // ----------------------------------------------------------------------------
\r
1997 IMPLEMENT_CLASS(OPJDecoderDialog, wxPropertySheetDialog)
\r
1999 BEGIN_EVENT_TABLE(OPJDecoderDialog, wxPropertySheetDialog)
\r
2001 EVT_CHECKBOX(OPJDECO_ENABLEJPWL, OPJDecoderDialog::OnEnableJPWL)
\r
2002 #endif // USE_JPWL
\r
2005 OPJDecoderDialog::OPJDecoderDialog(wxWindow* win, int dialogType)
\r
2007 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);
\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
2014 CreateButtons(wxOK | wxCANCEL | (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP));
\r
2016 wxBookCtrlBase* notebook = GetBookCtrl();
\r
2018 wxPanel* mainSettings = CreateMainSettingsPage(notebook);
\r
2019 wxPanel* jpeg2000Settings = CreatePart1SettingsPage(notebook);
\r
2020 wxPanel* mjpeg2000Settings = CreatePart3SettingsPage(notebook);
\r
2022 wxPanel* jpwlSettings = CreatePart11SettingsPage(notebook);
\r
2023 #endif // USE_JPWL
\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
2029 notebook->AddPage(jpwlSettings, wxT("JPWL"), false);
\r
2030 #endif // USE_JPWL
\r
2035 OPJDecoderDialog::~OPJDecoderDialog()
\r
2039 /*wxPanel* OPJDecoderDialog::CreateGeneralSettingsPage(wxWindow* parent)
\r
2041 wxPanel* panel = new wxPanel(parent, wxID_ANY);
\r
2043 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
\r
2044 wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
\r
2046 //// LOAD LAST FILE
\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
2055 wxString autoSaveLabel = _("&Auto-save every");
\r
2056 wxString minsLabel = _("mins");
\r
2058 wxBoxSizer* itemSizer12 = new wxBoxSizer( wxHORIZONTAL );
\r
2059 wxCheckBox* checkBox12 = new wxCheckBox(panel, ID_AUTO_SAVE, autoSaveLabel, wxDefaultPosition, wxDefaultSize);
\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
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
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
2076 topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
\r
2078 panel->SetSizer(topSizer);
\r
2079 topSizer->Fit(panel);
\r
2084 /*wxPanel* OPJDecoderDialog::CreateAestheticSettingsPage(wxWindow* parent)
\r
2086 wxPanel* panel = new wxPanel(parent, wxID_ANY);
\r
2088 wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );
\r
2089 wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
\r
2091 //// PROJECT OR GLOBAL
\r
2092 wxString globalOrProjectChoices[2];
\r
2093 globalOrProjectChoices[0] = _("&New projects");
\r
2094 globalOrProjectChoices[1] = _("&This project");
\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
2100 projectOrGlobal->SetSelection(0);
\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
2108 wxBoxSizer* styleSizer = new wxStaticBoxSizer( staticBox3, wxVERTICAL );
\r
2109 item0->Add(styleSizer, 0, wxGROW|wxALL, 5);
\r
2111 wxBoxSizer* itemSizer2 = new wxBoxSizer( wxHORIZONTAL );
\r
2113 wxChoice* choice2 = new wxChoice(panel, ID_BACKGROUND_STYLE, wxDefaultPosition, wxDefaultSize, backgroundStyleChoices);
\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
2119 styleSizer->Add(itemSizer2, 0, wxGROW|wxALL, 5);
\r
2121 #if wxUSE_SPINCTRL
\r
2122 //// FONT SIZE SELECTION
\r
2124 wxStaticBox* staticBox1 = new wxStaticBox(panel, wxID_ANY, _("Tile font size:"));
\r
2125 wxBoxSizer* itemSizer5 = new wxStaticBoxSizer( staticBox1, wxHORIZONTAL );
\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
2131 item0->Add(itemSizer5, 0, wxGROW|wxLEFT|wxRIGHT, 5);
\r
2134 topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );
\r
2135 topSizer->AddSpacer(5);
\r
2137 panel->SetSizer(topSizer);
\r
2138 topSizer->Fit(panel);
\r
2143 wxPanel* OPJDecoderDialog::CreateMainSettingsPage(wxWindow* parent)
\r
2145 wxPanel* panel = new wxPanel(parent, wxID_ANY);
\r
2148 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
\r
2151 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);
\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
2161 wxRA_SPECIFY_ROWS);
\r
2162 m_resizeBox->SetSelection(wxGetApp().m_resizemethod);
\r
2164 subtopSizer->Add(m_resizeBox, 0, wxGROW | wxALL, 5);
\r
2166 topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);
\r
2168 // assign top and fit it
\r
2169 panel->SetSizer(topSizer);
\r
2170 topSizer->Fit(panel);
\r
2175 wxPanel* OPJDecoderDialog::CreatePart3SettingsPage(wxWindow* parent)
\r
2177 wxPanel* panel = new wxPanel(parent, wxID_ANY);
\r
2180 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
\r
2183 //topSizer->AddSpacer(5);
\r
2186 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);
\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
2192 // selected frame number, row
\r
2193 wxBoxSizer* framenumSizer = new wxBoxSizer(wxHORIZONTAL);
\r
2196 framenumSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Displayed frame:")),
\r
2197 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
\r
2199 // add some horizontal space
\r
2200 framenumSizer->Add(5, 5, 1, wxALL, 0);
\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
2208 1, 100000, wxGetApp().m_framenum),
\r
2209 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);
\r
2211 frameSizer->Add(framenumSizer, 0, wxGROW | wxALL, 5);
\r
2213 subtopSizer->Add(frameSizer, 0, wxGROW | wxALL, 5);
\r
2215 topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);
\r
2217 // assign top and fit it
\r
2218 panel->SetSizer(topSizer);
\r
2219 topSizer->Fit(panel);
\r
2224 wxPanel* OPJDecoderDialog::CreatePart1SettingsPage(wxWindow* parent)
\r
2226 wxPanel* panel = new wxPanel(parent, wxID_ANY);
\r
2229 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
\r
2232 //topSizer->AddSpacer(5);
\r
2235 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);
\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
2241 // reduce factor sizer, row
\r
2242 wxBoxSizer* reduceSizer = new wxBoxSizer(wxHORIZONTAL);
\r
2245 reduceSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Reduce factor:")),
\r
2246 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
\r
2248 // add some horizontal space
\r
2249 reduceSizer->Add(5, 5, 1, wxALL, 0);
\r
2251 // add the value control
\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
2257 0, 10000, wxGetApp().m_reducefactor),
\r
2258 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);
\r
2260 resolutionSizer->Add(reduceSizer, 0, wxGROW | wxALL, 5);
\r
2262 subtopSizer->Add(resolutionSizer, 0, wxGROW | wxALL, 5);
\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
2268 // quality layers sizer, row
\r
2269 wxBoxSizer* qualitySizer = new wxBoxSizer(wxHORIZONTAL);
\r
2272 qualitySizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Quality layers:")),
\r
2273 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
\r
2275 // add some horizontal space
\r
2276 qualitySizer->Add(5, 5, 1, wxALL, 0);
\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
2284 0, 100000, wxGetApp().m_qualitylayers),
\r
2285 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);
\r
2287 layerSizer->Add(qualitySizer, 0, wxGROW | wxALL, 5);
\r
2289 subtopSizer->Add(layerSizer, 0, wxGROW | wxALL, 5);
\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
2295 // quality layers sizer, row
\r
2296 wxBoxSizer* numcompsSizer = new wxBoxSizer(wxHORIZONTAL);
\r
2299 numcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&No. of components:")),
\r
2300 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
\r
2302 // add some horizontal space
\r
2303 numcompsSizer->Add(5, 5, 1, wxALL, 0);
\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
2311 0, 100000, wxGetApp().m_components),
\r
2312 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);
\r
2313 m_numcompsCtrl->Enable(false);
\r
2315 compoSizer->Add(numcompsSizer, 0, wxGROW | wxALL, 5);
\r
2317 subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5);
\r
2319 topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);
\r
2321 // assign top and fit it
\r
2322 panel->SetSizer(topSizer);
\r
2323 topSizer->Fit(panel);
\r
2329 wxPanel* OPJDecoderDialog::CreatePart11SettingsPage(wxWindow* parent)
\r
2331 wxPanel* panel = new wxPanel(parent, wxID_ANY);
\r
2334 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
\r
2337 //topSizer->AddSpacer(5);
\r
2340 wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);
\r
2342 // add JPWL enabling check box
\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
2348 // component settings, column
\r
2349 wxStaticBox* compoBox = new wxStaticBox(panel, wxID_ANY, wxT("Components"));
\r
2350 wxBoxSizer* compoSizer = new wxStaticBoxSizer(compoBox, wxVERTICAL);
\r
2352 // expected components sizer, row
\r
2353 wxBoxSizer* expcompsSizer = new wxBoxSizer(wxHORIZONTAL);
\r
2356 expcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Expected comps.:")),
\r
2357 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
\r
2359 // add some horizontal space
\r
2360 expcompsSizer->Add(5, 5, 1, wxALL, 0);
\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
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
2372 compoSizer->Add(expcompsSizer, 0, wxGROW | wxALL, 5);
\r
2374 subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5);
\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
2380 // maximum tiles sizer, row
\r
2381 wxBoxSizer* maxtileSizer = new wxBoxSizer(wxHORIZONTAL);
\r
2384 maxtileSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Max. no. of tiles:")),
\r
2385 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);
\r
2387 // add some horizontal space
\r
2388 maxtileSizer->Add(5, 5, 1, wxALL, 0);
\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
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
2400 tileSizer->Add(maxtileSizer, 0, wxGROW | wxALL, 5);
\r
2402 subtopSizer->Add(tileSizer, 0, wxGROW | wxALL, 5);
\r
2404 topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);
\r
2406 // assign top and fit it
\r
2407 panel->SetSizer(topSizer);
\r
2408 topSizer->Fit(panel);
\r
2413 void OPJDecoderDialog::OnEnableJPWL(wxCommandEvent& event)
\r
2415 if (event.IsChecked()) {
\r
2416 wxLogMessage(wxT("JPWL enabled"));
\r
2417 m_expcompsCtrl->Enable(true);
\r
2418 m_maxtilesCtrl->Enable(true);
\r
2420 wxLogMessage(wxT("JPWL disabled"));
\r
2421 m_expcompsCtrl->Enable(false);
\r
2422 m_maxtilesCtrl->Enable(false);
\r
2427 #endif // USE_JPWL
\r
2429 bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)
\r
2431 /*size_t nFiles = filenames.GetCount();
\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
2437 wxLogMessage(str);*/
\r
2438 m_pOwner->OpenFiles(filenames, filenames);
\r