r591: Added Center-Detector length to scanning and reconstruction
[ctsim.git] / src / views.h
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **   Name:          view.h
5 **   Purpose:       Header file for View & Canvas routines of CTSim program
6 **   Programmer:    Kevin Rosenberg
7 **   Date Started:  July 2000
8 **
9 **  This is part of the CTSim program
10 **  Copyright (c) 1983-2001 Kevin Rosenberg
11 **
12 **  $Id: views.h,v 1.47 2001/03/01 07:30:49 kevin Exp $
13 **
14 **  This program is free software; you can redistribute it and/or modify
15 **  it under the terms of the GNU General Public License (version 2) as
16 **  published by the Free Software Foundation.
17 **
18 **  This program is distributed in the hope that it will be useful,
19 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 **  GNU General Public License for more details.
22 **
23 **  You should have received a copy of the GNU General Public License
24 **  along with this program; if not, write to the Free Software
25 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 ******************************************************************************/
27
28 #ifdef __GNUG__
29 // #pragma interface
30 #endif
31
32 #ifndef __VIEWSH__
33 #define __VIEWSH__
34
35 #include "wx/wx.h"
36 #include "docs.h"
37 #include "imagefile.h"
38 #include "threadrecon.h"
39
40 #if wxUSE_GLCANVAS
41 #include "graph3dview.h"
42 #endif
43
44 class ImageFileCanvas;
45 class ImageFileView : public wxView
46 {
47 private:
48   DECLARE_DYNAMIC_CLASS(ImageFileView)
49     
50   wxMemoryDC m_memoryDC;
51   wxBitmap m_bitmap;
52   wxMenu* m_pMenuAnalyze;
53   
54   ImageFileCanvas *CreateCanvas (wxFrame* parent);
55 #if CTSIM_MDI
56   wxDocMDIChildFrame* m_pFrame;
57   wxDocMDIChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
58 #else
59   wxDocChildFrame* m_pFrame;
60   wxDocChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
61 #endif
62   
63   ImageFileCanvas *m_pCanvas;
64   wxMenu* m_pFileMenu;
65   bool m_bMinSpecified;
66   bool m_bMaxSpecified;
67   double m_dMinPixel;
68   double m_dMaxPixel;
69   double m_dAutoScaleFactor;
70   
71   int m_iDefaultExportFormatID;
72
73   wxWindow* getFrameForChild() 
74 #if CTSIM_MDI
75   { return theApp->getMainFrame(); }
76 #else
77   { return m_pFrame; }
78 #endif
79
80 public:
81   ImageFileView();
82   virtual ~ImageFileView();
83   void canvasClosed()
84   { m_pCanvas = NULL; m_pFrame = NULL; }
85
86   wxMenu* getFileMenu()
87   { return m_pFileMenu; }
88
89   bool OnCreate(wxDocument *doc, long flags);
90   void OnDraw(wxDC* dc);
91   void OnUpdate(wxView *sender, wxObject *hint = NULL);
92   bool OnClose (bool deleteWindow = true);
93   
94   void OnRevert (wxCommandEvent& event);
95   void OnExport (wxCommandEvent& event);  
96   void OnProperties (wxCommandEvent& event);
97
98   void OnCompare (wxCommandEvent& event);  
99   void OnScaleSize (wxCommandEvent& event);
100   void OnInvertValues (wxCommandEvent& event);
101   void OnSquare (wxCommandEvent& event);
102   void OnSquareRoot (wxCommandEvent& event);
103   void OnLog (wxCommandEvent& event);
104   void OnExp (wxCommandEvent& event);
105   void OnAdd (wxCommandEvent& event);
106   void OnSubtract (wxCommandEvent& event);
107   void OnMultiply (wxCommandEvent& event);
108   void OnDivide (wxCommandEvent& event);
109   void OnFourier (wxCommandEvent& event);
110   void OnInverseFourier (wxCommandEvent& event);
111   void OnShuffleNaturalToFourierOrder (wxCommandEvent& event);
112   void OnShuffleFourierToNaturalOrder (wxCommandEvent& event);
113 #if wxUSE_GLCANVAS
114   void OnConvert3d (wxCommandEvent& event);
115 #endif
116
117 #ifdef HAVE_FFT
118   void OnFFT (wxCommandEvent& event);
119   void OnIFFT (wxCommandEvent& event);
120   void OnFFTRows (wxCommandEvent& event);
121   void OnIFFTRows (wxCommandEvent& event);
122   void OnFFTCols (wxCommandEvent& event);
123   void OnIFFTCols (wxCommandEvent& event);
124 #endif
125   
126   void OnMagnitude (wxCommandEvent& event);
127   void OnPhase (wxCommandEvent& event);
128   
129   void OnScaleAuto (wxCommandEvent& event);
130   void OnScaleMinMax (wxCommandEvent& event);
131   void OnScaleFull (wxCommandEvent& event);
132   void OnPlotRow (wxCommandEvent& event);
133   void OnPlotCol (wxCommandEvent& event);
134 #if HAVE_FFT
135   void OnPlotFFTRow (wxCommandEvent& event);
136   void OnPlotFFTCol (wxCommandEvent& event);
137 #endif
138   void OnPlotHistogram (wxCommandEvent& event);
139   void OnCompareRow (wxCommandEvent& event);
140   void OnCompareCol (wxCommandEvent& event);
141   
142 #if CTSIM_MDI
143   wxDocMDIChildFrame* getFrame() { return m_pFrame; }
144 #else
145   wxDocChildFrame* getFrame() { return m_pFrame; }
146 #endif
147
148   wxMenu* getMenuAnalyze() { return m_pMenuAnalyze; }
149
150   ImageFileDocument* GetDocument() 
151   { return dynamic_cast<ImageFileDocument*>(wxView::GetDocument()); }
152   
153   DECLARE_EVENT_TABLE()
154 };
155
156 class ImageFileCanvas: public wxScrolledWindow
157 {
158 private:
159   ImageFileView* m_pView;
160
161   int m_xCursor;
162   int m_yCursor;
163   
164 public:
165   ImageFileCanvas (ImageFileView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style);
166   virtual ~ImageFileCanvas();
167
168   virtual void OnDraw(wxDC& dc);
169   void OnChar(wxKeyEvent& event);
170   void OnMouseEvent(wxMouseEvent& event);
171   void DrawRubberBandCursor (wxDC& dc, int x, int y);
172   bool GetCurrentCursor (int& x, int& y);
173
174   virtual wxSize GetBestSize() const;
175   void setView(ImageFileView* pView)
176   { m_pView = pView; }
177
178
179   DECLARE_EVENT_TABLE()
180 };
181
182
183 class ProjectionFileCanvas;
184 class ProjectionFileView : public wxView
185 {
186 private:
187   DECLARE_DYNAMIC_CLASS(ProjectionFileView)
188     
189   wxMemoryDC m_memoryDC;
190   wxBitmap m_bitmap;
191   
192   ProjectionFileCanvas *CreateCanvas (wxFrame* parent);
193 #if CTSIM_MDI
194   wxDocMDIChildFrame* m_pFrame;
195   wxDocMDIChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
196 #else
197   wxDocChildFrame* m_pFrame;
198   wxDocChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
199 #endif
200   
201   ProjectionFileCanvas *m_pCanvas;
202   wxMenu* m_pFileMenu;
203
204   int m_iDefaultNX;
205   int m_iDefaultNY;
206   int m_iDefaultFilter;
207   int m_iDefaultFilterMethod;
208   double m_dDefaultFilterParam;
209   int m_iDefaultFilterGeneration;
210   int m_iDefaultZeropad;
211   int m_iDefaultInterpolation;
212   int m_iDefaultInterpParam;
213   int m_iDefaultBackprojector;
214   int m_iDefaultTrace;
215   
216   int m_iDefaultPolarNX;
217   int m_iDefaultPolarNY;
218   int m_iDefaultPolarInterpolation;
219   int m_iDefaultPolarZeropad;
220
221   wxWindow* getFrameForChild() 
222 #if CTSIM_MDI
223   { return theApp->getMainFrame(); }
224 #else
225   { return m_pFrame; }
226 #endif
227
228 public:
229   ProjectionFileView();
230   virtual ~ProjectionFileView();
231   void canvasClosed()
232   { m_pCanvas = NULL; m_pFrame = NULL; }
233   
234   bool OnCreate(wxDocument *doc, long flags);
235   void OnDraw(wxDC* dc);
236   void OnUpdate(wxView *sender, wxObject *hint = NULL);
237   bool OnClose (bool deleteWindow = true);
238   void OnProperties (wxCommandEvent& event);
239   void OnReconstructFBP (wxCommandEvent& event);
240   void OnReconstructFourier (wxCommandEvent& event);
241   void OnConvertPolar (wxCommandEvent& event);
242   void OnConvertFFTPolar (wxCommandEvent& event);
243   
244 #if CTSIM_MDI
245   wxDocMDIChildFrame* getFrame() { return m_pFrame; }
246 #else
247   wxDocChildFrame* getFrame() { return m_pFrame; }
248 #endif
249   ProjectionFileCanvas* getCanvas() { return m_pCanvas; }
250
251   wxMenu* getFileMenu()  { return m_pFileMenu; }
252
253   ProjectionFileDocument* GetDocument() 
254   { return dynamic_cast<ProjectionFileDocument*>(wxView::GetDocument()); }
255   DECLARE_EVENT_TABLE()
256 };
257
258 class ProjectionFileCanvas: public wxScrolledWindow
259 {
260 private:
261   ProjectionFileView* m_pView;
262
263 public:  
264   ProjectionFileCanvas (ProjectionFileView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style);
265   virtual ~ProjectionFileCanvas() ;
266
267   virtual wxSize GetBestSize() const;
268   virtual void OnDraw(wxDC& dc);
269   void setView(ProjectionFileView* pView)
270   { m_pView = pView; }
271 };
272
273
274 class PhantomCanvas;
275 class PhantomFileView : public wxView
276 {
277 private:
278   DECLARE_DYNAMIC_CLASS(PhantomFileView)
279   DECLARE_EVENT_TABLE()
280     
281   PhantomCanvas *CreateCanvas (wxFrame* parent);
282 #if CTSIM_MDI
283   wxDocMDIChildFrame* m_pFrame;
284   wxDocMDIChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
285 #else
286   wxDocChildFrame* m_pFrame;
287   wxDocChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
288 #endif
289   
290   PhantomCanvas *m_pCanvas;
291   wxMenu* m_pFileMenu;
292   
293   int m_iDefaultNDet;
294   int m_iDefaultNView;
295   int m_iDefaultNSample;
296   int m_iDefaultGeometry;
297   int m_iDefaultTrace;
298   double m_dDefaultRotation;
299   double m_dDefaultFocalLength;
300   double m_dDefaultCenterDetectorLength;
301   double m_dDefaultViewRatio;
302   double m_dDefaultScanRatio;
303   
304   int m_iDefaultRasterNX;
305   int m_iDefaultRasterNY;
306   int m_iDefaultRasterNSamples;
307   double m_dDefaultRasterViewRatio;
308
309   wxWindow* getFrameForChild() 
310 #if CTSIM_MDI
311   { return theApp->getMainFrame(); }
312 #else
313   { return m_pFrame; }
314 #endif
315
316 public:
317   PhantomFileView();
318   virtual ~PhantomFileView();
319   void canvasClosed()
320   { m_pCanvas = NULL; m_pFrame = NULL; }
321   
322   bool OnCreate(wxDocument *doc, long flags);
323   void OnUpdate(wxView *sender, wxObject *hint = NULL);
324   bool OnClose (bool deleteWindow = true);
325   void OnDraw(wxDC* dc);
326   void OnProperties (wxCommandEvent& event);
327   void OnRasterize (wxCommandEvent& event);
328   void OnProjections (wxCommandEvent& event);
329   
330   PhantomFileDocument* GetDocument() 
331   { return dynamic_cast<PhantomFileDocument*>(wxView::GetDocument()); }
332   
333   wxMenu* getFileMenu() { return m_pFileMenu; }
334 #if CTSIM_MDI
335   wxDocMDIChildFrame* getFrame() { return m_pFrame; }
336 #else
337   wxDocChildFrame* getFrame() { return m_pFrame; }
338 #endif
339 };
340
341 class PhantomCanvas: public wxScrolledWindow
342 {
343 private:
344   PhantomFileView* m_pView;
345
346 public:  
347   PhantomCanvas (PhantomFileView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style);
348   virtual ~PhantomCanvas();
349
350   virtual wxSize GetBestSize() const;
351   void setView(PhantomFileView* pView)
352   { m_pView = pView; }
353   virtual void OnDraw(wxDC& dc);
354 };
355
356 class PlotFileCanvas;
357 class PlotFileView : public wxView
358 {
359   DECLARE_DYNAMIC_CLASS(PlotFileView)
360     
361 private:
362 #if CTSIM_MDI
363   wxDocMDIChildFrame* m_pFrame;
364   wxDocMDIChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
365 #else
366   wxDocChildFrame* m_pFrame;
367   wxDocChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
368 #endif
369   
370   PlotFileCanvas *m_pCanvas;
371   EZPlot* m_pEZPlot;
372   wxMenu* m_pFileMenu;
373   
374   bool m_bMinSpecified;
375   bool m_bMaxSpecified;
376   double m_dMinPixel;
377   double m_dMaxPixel;
378   double m_dAutoScaleFactor;
379   
380   PlotFileCanvas *CreateCanvas (wxFrame* parent);
381   wxWindow* getFrameForChild() 
382 #if CTSIM_MDI
383   { return theApp->getMainFrame(); }
384 #else
385   { return m_pFrame; }
386 #endif
387
388 public:
389   PlotFileView();
390   virtual ~PlotFileView();
391   void canvasClosed()
392   { m_pCanvas = NULL; m_pFrame = NULL; }
393   
394   bool OnCreate(wxDocument *doc, long flags);
395   void OnDraw(wxDC* dc);
396   void OnUpdate(wxView *sender, wxObject *hint = NULL);
397   bool OnClose (bool deleteWindow = true);
398
399   void OnProperties (wxCommandEvent& event);
400   void OnScaleMinMax (wxCommandEvent& event);
401   void OnScaleAuto (wxCommandEvent& event);
402   void OnScaleFull (wxCommandEvent& event);
403   
404 #if CTSIM_MDI
405   wxDocMDIChildFrame* getFrame() { return m_pFrame; }
406 #else
407   wxDocChildFrame* getFrame() { return m_pFrame; }
408 #endif
409   
410   wxMenu* getFileMenu() { return m_pFileMenu; }
411   PlotFileDocument* GetDocument() 
412   { return dynamic_cast<PlotFileDocument*>(wxView::GetDocument()); }
413   
414   DECLARE_EVENT_TABLE()
415 };
416
417 class PlotFileCanvas: public wxScrolledWindow
418 {
419 private:
420   PlotFileView* m_pView;
421   
422 public:
423   PlotFileCanvas (PlotFileView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style);
424   virtual ~PlotFileCanvas();
425  
426   virtual void OnDraw(wxDC& dc);
427
428   void setView (PlotFileView* pView)
429   { m_pView = pView; }
430 };
431
432
433 class TextFileCanvas;
434 class TextFileView: public wxView
435 {
436 private:
437   DECLARE_DYNAMIC_CLASS(TextFileView)
438
439 #if CTSIM_MDI
440   wxDocMDIChildFrame* m_pFrame;
441   wxDocMDIChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
442 #else
443   wxDocChildFrame* m_pFrame;
444   wxDocChildFrame* CreateChildFrame(wxDocument *doc, wxView *view);
445 #endif
446     wxMenu* m_pFileMenu;
447     TextFileCanvas *m_pCanvas;
448   
449 public:
450     TextFileView() 
451       : wxView() , m_pFrame(0), m_pCanvas(0)
452     {}
453     ~TextFileView();
454     void canvasClosed()
455     { m_pFrame = NULL; }
456
457     bool OnCreate (wxDocument *doc, long flags);
458     void OnDraw (wxDC *dc);
459     void OnUpdate (wxView *sender, wxObject *hint = (wxObject *) NULL);
460     bool OnClose (bool deleteWindow = TRUE);
461
462     TextFileDocument* GetDocument() 
463     { return dynamic_cast<TextFileDocument*>(wxView::GetDocument()); }
464   
465     TextFileCanvas* getTextCtrl() { return m_pCanvas; }
466     wxMenu* getFileMenu() { return m_pFileMenu; }
467 #if CTSIM_MDI
468   wxDocMDIChildFrame* getFrame() { return m_pFrame; }
469 #else
470   wxDocChildFrame* getFrame() { return m_pFrame; }
471 #endif
472 };
473
474 class TextFileCanvas: public wxTextCtrl
475 {
476     TextFileView *m_pView;
477
478 public:    
479     TextFileCanvas (TextFileView *v, wxFrame *frame, const wxPoint& pos, const wxSize& size, long style);
480     ~TextFileCanvas ();
481 };
482
483
484 #endif
485