+// PhantomCanvas
+
+PhantomCanvas::PhantomCanvas (PhantomView* v, wxFrame *frame, const wxPoint& pos, const wxSize& size, const long style)
+ : wxScrolledWindow(frame, -1, pos, size, style)
+{
+ m_pView = v;
+}
+
+void
+PhantomCanvas::OnDraw(wxDC& dc)
+{
+ if (m_pView)
+ m_pView->OnDraw(& dc);
+}
+
+// PhantomView
+
+IMPLEMENT_DYNAMIC_CLASS(PhantomView, wxView)
+
+BEGIN_EVENT_TABLE(PhantomView, wxView)
+ EVT_MENU(PHMMENU_FILE_PROPERTIES, PhantomView::OnProperties)
+ EVT_MENU(PHMMENU_PROCESS_RASTERIZE, PhantomView::OnRasterize)
+ EVT_MENU(PHMMENU_PROCESS_PROJECTIONS, PhantomView::OnProjections)
+END_EVENT_TABLE()
+
+PhantomView::PhantomView(void)
+ : wxView(), m_canvas(NULL), m_frame(NULL)
+{
+}
+
+PhantomView::~PhantomView(void)
+{
+}
+
+void
+PhantomView::OnProperties (wxCommandEvent& event)
+{
+ const Phantom::PhantomID idPhantom = GetDocument()->getPhantomID();
+ const string& namePhantom = GetDocument()->getPhantomName();
+ ostringstream os;
+ os << "Phantom " << namePhantom << " (" << static_cast<int>(idPhantom) << ")\n";
+ *theApp->getLog() << os.str().c_str();
+ const Phantom& rPhantom = GetDocument()->getPhantom();
+#if DEBUG
+ rPhantom.print();
+#endif
+}
+
+
+void
+PhantomView::OnProjections (wxCommandEvent& event)
+{
+}
+
+
+void
+PhantomView::OnRasterize (wxCommandEvent& event)
+{
+ const Phantom& rPhantom = GetDocument()->getPhantom();
+ ImageFileDocument* pRasterDoc = dynamic_cast<ImageFileDocument*>(theApp->getDocManager()->CreateDocument("untitled.if", wxDOC_SILENT));
+ ImageFile& imageFile = pRasterDoc->getImageFile();
+ imageFile.setArraySize (256, 256);
+ imageFile.arrayDataClear();
+ rPhantom.convertToImagefile (imageFile, 1, TRACE_NONE);
+ pRasterDoc->Modify(true);
+ pRasterDoc->UpdateAllViews(this);
+}
+
+
+PhantomCanvas*
+PhantomView::CreateCanvas (wxView *view, wxFrame *parent)
+{
+ PhantomCanvas* pCanvas;
+ int width, height;
+ parent->GetClientSize(&width, &height);
+
+ pCanvas = new PhantomCanvas (dynamic_cast<PhantomView*>(view), parent, wxPoint(0, 0), wxSize(width, height), 0);
+
+ pCanvas->SetScrollbars(20, 20, 50, 50);
+ pCanvas->SetBackgroundColour(*wxWHITE);
+ pCanvas->Clear();
+
+ return pCanvas;
+}
+
+wxFrame*
+PhantomView::CreateChildFrame(wxDocument *doc, wxView *view)
+{
+ wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(300, 300), wxDEFAULT_FRAME_STYLE);
+
+ wxMenu *file_menu = new wxMenu;
+
+ file_menu->Append(wxID_OPEN, "&Open...");
+ file_menu->Append(wxID_CLOSE, "&Close");
+
+ file_menu->AppendSeparator();
+ file_menu->Append(PHMMENU_FILE_PROPERTIES, "P&roperties");
+
+ file_menu->AppendSeparator();
+ file_menu->Append(wxID_PRINT, "&Print...");
+ file_menu->Append(wxID_PRINT_SETUP, "Print &Setup...");
+ file_menu->Append(wxID_PREVIEW, "Print Pre&view");
+
+ wxMenu *process_menu = new wxMenu;
+ process_menu->Append(PHMMENU_PROCESS_RASTERIZE, "&Rasterize...");
+ process_menu->Append(PHMMENU_PROCESS_PROJECTIONS, "&Projections...");
+
+ wxMenu *help_menu = new wxMenu;
+ help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents");
+ help_menu->Append(MAINMENU_HELP_ABOUT, "&About");
+
+ wxMenuBar *menu_bar = new wxMenuBar;
+
+ menu_bar->Append(file_menu, "&File");
+ menu_bar->Append(process_menu, "&Process");
+ menu_bar->Append(help_menu, "&Help");
+
+ subframe->SetMenuBar(menu_bar);
+
+ subframe->Centre(wxBOTH);
+
+ return subframe;
+}
+
+
+bool
+PhantomView::OnCreate(wxDocument *doc, long WXUNUSED(flags) )
+{
+ m_frame = CreateChildFrame(doc, this);
+
+ int width, height;
+ m_frame->GetClientSize(&width, &height);
+ m_frame->SetTitle("PhantomView");
+ m_canvas = CreateCanvas(this, m_frame);
+
+#ifdef __X__
+ int x, y; // X requires a forced resize
+ m_frame->GetSize(&x, &y);
+ m_frame->SetSize(-1, -1, x, y);
+#endif
+
+ m_frame->Show(true);
+ Activate(true);
+
+ return true;
+}
+
+void
+PhantomView::OnDraw (wxDC* dc)
+{
+ // if (m_bitmap.Ok())
+ // dc->DrawBitmap (m_bitmap, 0, 0, false);
+}
+
+
+void
+PhantomView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) )
+{
+ if (m_canvas) {
+ m_canvas->Refresh();
+ }
+
+#ifdef __WXMSW__
+ if (m_canvas)
+ m_canvas->Refresh();
+#else
+ if (m_canvas) {
+ wxClientDC dc(m_canvas);
+ dc.Clear();
+ OnDraw (&dc);
+ }
+#endif
+}
+
+bool
+PhantomView::OnClose (bool deleteWindow)
+{
+ if (!GetDocument()->Close())
+ return false;
+
+ m_canvas->Clear();
+ m_canvas->m_pView = NULL;
+ m_canvas = NULL;
+ wxString s(wxTheApp->GetAppName());
+ if (m_frame)
+ m_frame->SetTitle(s);
+ SetFrame(NULL);
+
+ Activate(false);
+
+ if (deleteWindow) {
+ delete m_frame;
+ return true;
+ }
+ return true;
+}
+
+
+// ProjectionCanvas