X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4dbd4ee6042dd8da797a790e53abcfe32b27bb7b..88594d02eb59a55ac85d3210a49d02918124617b:/contrib/samples/canvas/test/test.cpp diff --git a/contrib/samples/canvas/test/test.cpp b/contrib/samples/canvas/test/test.cpp index a812ff6eb1..410a3780bd 100644 --- a/contrib/samples/canvas/test/test.cpp +++ b/contrib/samples/canvas/test/test.cpp @@ -6,167 +6,613 @@ * Copyright: (C) 1998, Robert Roebling * */ -// For compilers that support precompilation, includes "wx/wx.h". -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif -#ifndef WX_PRECOMP -#include "wx/wx.h" +#ifdef __GNUG__ + #pragma implementation "test.cpp" #endif -#include -#include -#include -#include +// For compilers that support precompilation +#include "wx/wxprec.h" +#ifdef __BORLANDC__ + #pragma hdrstop +#endif +#include "test.h" #include "smile.xpm" -#include "wx/canvas/canvas.h" +//----------------------------------------------------- +// class MywxCanvasObjectRef +//----------------------------------------------------- -// derived classes +BEGIN_EVENT_TABLE(MywxCanvasObjectRef,wxCanvasObjectRef) + EVT_MOUSE_EVENTS( MywxCanvasObjectRef::OnMouseEvent ) +END_EVENT_TABLE() -class MyFrame; -class MyApp; +IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef, wxCanvasObjectRef) -// MyFrame +MywxCanvasObjectRef::MywxCanvasObjectRef(double x, double y,wxCanvasObjectGroup* group) + :wxCanvasObjectRef(x,y,group) +{ +} -class MyFrame: public wxFrame +MywxCanvasObjectRef::MywxCanvasObjectRef() + :wxCanvasObjectRef(0,0,NULL) { -public: - MyFrame(); - ~MyFrame(); +} - void OnAbout( wxCommandEvent &event ); - void OnNewFrame( wxCommandEvent &event ); - void OnQuit( wxCommandEvent &event ); - void OnTimer( wxTimerEvent &event ); +MywxCanvasObjectRef::~MywxCanvasObjectRef() +{ +} - wxCanvas *m_canvas; - wxCanvasObject *m_sm1; - wxCanvasObject *m_sm2; - wxCanvasObject *m_sm3; - wxCanvasObject *m_sm4; - wxTimer *m_timer; - wxTextCtrl *m_log; +void MywxCanvasObjectRef::OnMouseEvent(wxMouseEvent &event) +{ + if (!m_dragable) + { + event.Skip(); + return; + } + + static double xprev; + static double yprev; + + //new position of the mouse relative within the object + double x = m_admin->DeviceToLogicalX(event.GetX()); + double y = m_admin->DeviceToLogicalY(event.GetY()); + + if (event.LeftDown()) + { + CaptureMouse(); + if (m_dragmode != wxDRAG_REDRAW) + DragStart(); + } + else if (event.LeftUp()) + { + ReleaseMouse(); + if (m_dragmode != wxDRAG_REDRAW) + DragEnd(); + } + else if (IsCapturedMouse()) + { + if (m_dragmode != wxDRAG_REDRAW) + DragRelative(x-xprev,y-yprev); + else + MoveRelative(x-xprev,y-yprev); + m_admin->UpdateNow(); + } + xprev=x; + yprev=y; + //well do something extra + if (IsCapturedMouse()) + m_admin->GetActive()->SetCursor(*wxHOURGLASS_CURSOR); + else + m_admin->GetActive()->SetCursor(*wxSTANDARD_CURSOR); +} -private: - DECLARE_DYNAMIC_CLASS(MyFrame) - DECLARE_EVENT_TABLE() -}; +//--------------------------------------------------- +// class MyEventHandler +//--------------------------------------------------- -// MyApp +BEGIN_EVENT_TABLE(MyEventHandler,wxEvtHandler) + EVT_MOUSE_EVENTS( MyEventHandler::OnMouseEvent ) +END_EVENT_TABLE() -class MyApp: public wxApp +MyEventHandler::MyEventHandler() { -public: - virtual bool OnInit(); - - const wxString& GetFontPath() const { return m_fontpath; } - -private: - wxString m_fontpath; -}; +} -// main program +void MyEventHandler::OnMouseEvent(wxMouseEvent &event) +{ + wxCanvasObject* obj=(wxCanvasObject*)event.GetEventObject(); + + if (!obj->GetDraggable()) + return; + + static double xprev; + static double yprev; + + wxCanvasAdmin* adm=obj->GetAdmin(); + + //new position of the mouse relative within the object + double x = adm->DeviceToLogicalX(event.GetX()); + double y = adm->DeviceToLogicalY(event.GetY()); + + if (event.LeftDown()) + { + obj->CaptureMouse(); + if (obj->GetDragMode() != wxDRAG_REDRAW) + obj->DragStart(); + } + else if (event.LeftUp()) + { + obj->ReleaseMouse(); + if (obj->GetDragMode() != wxDRAG_REDRAW) + obj->DragEnd(); + } + else if (obj->IsCapturedMouse()) + { + if (obj->GetDragMode() != wxDRAG_REDRAW) + obj->DragRelative(x-xprev,y-yprev); + else + obj->MoveRelative(x-xprev,y-yprev); + adm->UpdateNow(); + } + xprev=x; + yprev=y; + //well do something extra + if (obj->IsCapturedMouse()) + obj->GetAdmin()->GetActive()->SetCursor(*wxHOURGLASS_CURSOR); + else + obj->GetAdmin()->GetActive()->SetCursor(*wxSTANDARD_CURSOR); +} -IMPLEMENT_APP(MyApp) +//------------------------------------------------ +// class MyFrame +//------------------------------------------------ -// MyFrame +class MyApp; +class MyCanvas; -const int ID_QUIT = 108; -const int ID_ABOUT = 109; +BEGIN_EVENT_TABLE(MyFrame, wxFrame) + EVT_MENU(SPLIT_VERTICAL, MyFrame::SplitVertical) + EVT_MENU(SPLIT_HORIZONTAL, MyFrame::SplitHorizontal) + EVT_MENU(SPLIT_UNSPLIT, MyFrame::Unsplit) + EVT_MENU(SPLIT_QUIT, MyFrame::Quit) + EVT_MENU(SPLIT_SETMINSIZE, MyFrame::SetMinSize) -IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ) + EVT_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical) + EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal) + EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit) -BEGIN_EVENT_TABLE(MyFrame,wxFrame) EVT_MENU (ID_ABOUT, MyFrame::OnAbout) - EVT_MENU (ID_QUIT, MyFrame::OnQuit) EVT_TIMER (-1, MyFrame::OnTimer) END_EVENT_TABLE() -MyFrame::MyFrame() - : wxFrame( (wxFrame *)NULL, -1, "wxCanvas sample", - wxPoint(20,20), wxSize(470,460) ) +// My frame constructor +MyFrame::MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size): + wxFrame(frame, SPLITTER_FRAME, title, pos, size) { - wxMenu *file_menu = new wxMenu(); - file_menu->Append( ID_ABOUT, "&About..."); - file_menu->AppendSeparator(); - file_menu->Append( ID_QUIT, "E&xit"); + m_eventhandler =new MyEventHandler(); - wxMenuBar *menu_bar = new wxMenuBar(); - menu_bar->Append(file_menu, "&File"); + wxPathList pathList; + pathList.Add("."); + pathList.Add(".."); - SetMenuBar( menu_bar ); + wxString path = pathList.FindValidPath("pat36.bmp"); + gs_bmp36_mono.LoadFile(path, wxBITMAP_TYPE_BMP); + wxMask* mask36 = new wxMask(gs_bmp36_mono, *wxBLACK); + /* associate a monochrome mask with this bitmap */ + gs_bmp36_mono.SetMask(mask36); CreateStatusBar(2); + + // Make a menubar + fileMenu = new wxMenu; + fileMenu->Append(SPLIT_VERTICAL, "Split &Vertically\tCtrl-V", "Split vertically"); + fileMenu->Append(SPLIT_HORIZONTAL, "Split &Horizontally\tCtrl-H", "Split horizontally"); + fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit", "Unsplit"); +// fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit\tCtrl-U", "Unsplit"); + fileMenu->AppendSeparator(); + fileMenu->Append(SPLIT_SETMINSIZE, "Set &min size", "Set minimum pane size"); + fileMenu->AppendSeparator(); + fileMenu->Append(SPLIT_QUIT, "E&xit\tAlt-X", "Exit"); + fileMenu->Append( ID_ABOUT, "&About..."); + + + menuBar = new wxMenuBar; + menuBar->Append(fileMenu, "&File"); + + SetMenuBar(menuBar); + + m_splitter = new MySplitterWindow(this, SPLITTER_WINDOW); + + m_canvas1 = new MyCanvas(&m_canvasadmin, m_splitter, CANVAS1, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL|wxVSCROLL); + m_canvas1->SetYaxis(FALSE); + m_canvas1->SetMappingScroll(-300,-300,500,500,false); + m_canvas1->SetScroll(-400,-400,600,600); + m_canvas1->SetColour(wxColour(255, 255, 255) ); + m_canvas1->SetCursor(wxCursor(wxCURSOR_MAGNIFIER)); + + m_canvas2 = new MyCanvas(&m_canvasadmin, m_splitter, CANVAS2, wxPoint(0, 0), wxSize(400, 400),wxHSCROLL|wxVSCROLL); + m_canvas2->SetMappingScroll(-100,-100,500,500,false); + m_canvas2->SetScroll(-400,-400,600,600); + m_canvas2->SetColour( wxColour(187, 215, 243) ); + m_canvas2->Show(FALSE); + + m_canvasadmin.Append(m_canvas1); + m_canvasadmin.Append(m_canvas2); + m_canvasadmin.SetActive(m_canvas1); + + m_splitter->Initialize(m_canvas1); + SetStatusText("Min pane size = 0", 1); + int widths[] = { -1, 100 }; SetStatusWidths( 2, widths ); - m_canvas = new wxCanvas( this, -1, wxPoint(0,0), wxSize(10,10) ); - - m_canvas->Freeze(); - - m_canvas->SetArea( 400, 600 ); - m_canvas->SetColour( 255, 255, 255 ); + //root group always at 0,0 + m_datatree = new wxCanvasObjectGroup(0,0); + m_datatree->DeleteContents( TRUE ); + m_datatree->SetAdmin(&m_canvasadmin); wxBitmap bitmap( smile_xpm ); wxImage image( bitmap ); - m_sm1 = new wxCanvasImage( image, 0,70,16,16 ); - m_canvas->Append( m_sm1 ); +// m_sm1 = new wxCanvasImage( image, 0,70,32,32 ); +// m_datatree->Append( m_sm1 ); int i; for (i = 10; i < 300; i+=10) - m_canvas->Append( new wxCanvasRect( i,50,3,140, 255,0,0 ) ); + { + wxCanvasRect *r = new wxCanvasRect( i,50,3,140 ); + r->SetBrush( *wxRED_BRUSH ); + m_datatree->Append( r ); + } - m_sm2 = new wxCanvasImage( image, 0,140,24,24 ); - m_canvas->Append( m_sm2 ); + +// m_sm2 = new wxCanvasImage( image, 0,140,24,24 ); +// m_datatree->Append( m_sm2 ); for (i = 15; i < 300; i+=10) - m_canvas->Append( new wxCanvasRect( i,50,3,140, 255,0,0 ) ); + { + wxCanvasRect* rec= new wxCanvasRect( i,50,3,140 ); + rec->SetBrush(wxBrush(wxColour(0,10+i,2+i),wxSOLID)); + rec->SetDraggable(FALSE); + m_datatree->Append( rec ); + } - wxButton *button = new wxButton( m_canvas, -1, "Hello", wxPoint(80,50) ); - m_canvas->Append( new wxCanvasControl( button ) ); +/* + wxButton *button = new wxButton( m_canvas1, -1, "Hello", wxPoint(80,50) ); + m_datatree->Append( new wxCanvasControl( button ) ); - m_canvas->Append( new wxCanvasText( "Hello", 180, 50, + m_datatree->Append( new wxCanvasText( "Hello", 180, 50, wxGetApp().GetFontPath() + "/times.ttf", 20 ) ); - m_sm3 = new wxCanvasImage( image, 0,210,32,32 ); - m_canvas->Append( m_sm3 ); + m_datatree->Append( new wxCanvasText( "How are you?", 180, 10, + wxGetApp().GetFontPath() + "/times.ttf", 8 ) ); + m_datatree->Append( new wxCanvasText( "How are you?", 180, 20, + wxGetApp().GetFontPath() + "/times.ttf", 10 ) ); + + m_datatree->Append( new wxCanvasText( "How are you?", 180, 30, + wxGetApp().GetFontPath() + "/times.ttf", 12 ) ); + m_sm3 = new wxCanvasImage( image, 0,210,32,32 ); + m_datatree->Append( m_sm3 ); +*/ for (i = 10; i < 300; i+=10) - m_canvas->Append( new wxCanvasLine( 10,150,i,300, 0,255,0 ) ); - + m_datatree->Append( new wxCanvasLine( 10,-15,i,300 ) ); +/* m_sm4 = new wxCanvasImage( image, 0,270,64,32 ); - m_canvas->Append( m_sm4 ); - - m_canvas->Thaw(); + m_sm4->SetDragMode(wxDRAG_RECTANGLE); + m_datatree->Append( m_sm4 ); +*/ + +// m_canvas->Append( new wxCanvasLine( 10,-1500e6,50,300000e6, 0,255,0 ) ); +// m_canvas->Append( new wxCanvasLine( 10,-150000,50,300000, 0,255,0 ) ); + + + //make a group of wxCanvasObjects + wxCanvasObjectGroup* group1 = new wxCanvasObjectGroup(0,0); + + wxCanvasLine* line = new wxCanvasLine( 10,-35,50,190); + line->SetPen(wxPen(wxColour(255,161,5),5,wxDOT_DASH )); + group1->Prepend( line ); + group1->Prepend( new wxCanvasImage( image, 4,38,32,32 ) ); + wxCanvasRect* rec3 = new wxCanvasRect(20,-20,50,170); + rec3->SetBrush(wxBrush(wxColour(0,120,240),wxSOLID)); + rec3->SetPen(wxPen(wxColour(252,54,252 ),3,wxSOLID)); + group1->Prepend( rec3 ); + + wxCanvasRect* rec2 = new wxCanvasRect(10,20,104,52); + rec2->SetBrush(wxBrush(wxColour(0,240,240),wxSOLID)); + rec2->SetPen(wxPen(wxColour(210,40,50 ),1,wxSOLID)); + group1->Prepend( rec2 ); + + + + wxPoint2DDouble* todraw2 = new wxPoint2DDouble[3]; + todraw2[0].m_x=230; + todraw2[0].m_y=220; + todraw2[1].m_x=300; + todraw2[1].m_y=200; + todraw2[2].m_x=300; + todraw2[2].m_y=300; + wxCanvasPolyline* poly2= new wxCanvasPolyline(3,todraw2); + poly2->SetPen(wxPen(wxColour(200,0,64 ),4,wxDOT)); + m_datatree->Prepend( poly2 ); + + + + //make another group of wxCanvasObjects + wxCanvasObjectGroup* group2 = new wxCanvasObjectGroup(0,0); + group2->Prepend( new wxCanvasImage( image, 60,38,52,32 ) ); + wxCanvasRect* rr = new wxCanvasRect(10,20,104,52,30); + rr->SetBrush(wxBrush(wxColour(10,17,255),wxHORIZONTAL_HATCH )); + rr->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + group2->Prepend( rr ); + + + //this a reference to group2 put into group1 + MywxCanvasObjectRef* m_subref = new MywxCanvasObjectRef(60,50, group2); + m_subref->SetRotation(35); + m_subref->SetRotation(0); + group1->Prepend( m_subref ); + + + wxPoint2DDouble* todraw = new wxPoint2DDouble[5]; + todraw[0].m_x=-30; + todraw[0].m_y=-20; + todraw[1].m_x=100; + todraw[1].m_y=0; + todraw[2].m_x=100; + todraw[2].m_y=100; + todraw[3].m_x=50; + todraw[3].m_y=150; + todraw[4].m_x=0; + todraw[4].m_y=100; + + wxCanvasPolygon* poly= new wxCanvasPolygon(5,todraw); + poly->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH )); + poly->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + group1->Prepend( poly ); + + wxPoint2DDouble* todraw4 = new wxPoint2DDouble[4]; + + todraw4[0].m_x=-50; + todraw4[0].m_y=-30; + todraw4[1].m_x=-50; + todraw4[1].m_y=70; + todraw4[2].m_x=150; + todraw4[2].m_y=70; + todraw4[3].m_x=150; + todraw4[3].m_y=-30; + + wxCanvasPolygon* poly5= new wxCanvasPolygon(4,todraw4); + poly5->SetBrush(wxBrush(wxColour(100,17,255),wxCROSSDIAG_HATCH )); +// poly5->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID )); +// poly5->SetPen(wxPen(wxColour(9,115,64 ),1,wxSOLID)); + poly5->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0); + group3->Prepend( poly5 ); + + wxList* pointlist = new wxList(); + wxPoint2DDouble* point = new wxPoint2DDouble(0,0); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-300,100); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-100,100); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-100,0); + pointlist->Append((wxObject*)point); + point = new wxPoint2DDouble(-200,50); + pointlist->Append((wxObject*)point); + + wxCanvasPolygonL* poly15= new wxCanvasPolygonL(pointlist,TRUE); + poly15->SetColour1(wxColour(250,78,216 )); + poly15->SetColour2(*wxRED); + poly15->SetBrush(wxBrush(gs_bmp36_mono)); + poly15->SetTransParent(TRUE); + poly15->SetPen(wxPen(*wxRED,4,wxSOLID)); + group1->Prepend( poly15 ); + + wxList* pointlist2 = new wxList(); + wxPoint2DDouble* point2 = new wxPoint2DDouble(-400,100); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(-400,200); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(0,200); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(0,100); + pointlist2->Append((wxObject*)point2); + point2 = new wxPoint2DDouble(-200,175); + pointlist2->Append((wxObject*)point2); + + wxCanvasPolylineL* poly16= new wxCanvasPolylineL(pointlist2,TRUE); + poly16->SetPen(wxPen(wxColour(9,115,64 ),4,wxSOLID)); + m_datatree->Prepend( poly16 ); + + + wxPoint2DDouble* todraw6 = new wxPoint2DDouble[5]; + todraw6[0].m_x=50; + todraw6[0].m_y=305; + todraw6[1].m_x=-200; + todraw6[1].m_y=200; + todraw6[2].m_x=0; + todraw6[2].m_y=500; + todraw6[3].m_x=300; + todraw6[3].m_y=200; + todraw6[4].m_x=-300; + todraw6[4].m_y=-300; + + wxCanvasPolygon* poly17= new wxCanvasPolygon(5,todraw6,TRUE); + poly17->SetBrush(wxBrush(wxColour(100,17,255),wxSOLID)); + poly17->SetPen(wxPen(wxColour(10,17,25),16,wxLONG_DASH )); + poly17->SetColour1(*wxGREEN); + poly17->SetColour2(*wxRED); + poly17->SetGradient(TRUE,wxPen(wxColour(0,0,0),0,wxSOLID),0); + wxCanvasObjectRef* m_refc = new wxCanvasObjectRef(0,-200, poly17); + m_refc->SetRotation(90); + m_datatree->Prepend( m_refc ); + wxCanvasObjectRef* m_refd = new wxCanvasObjectRef(200,-50, poly17); + m_refd->SetRotation(0); + m_datatree->Append( m_refd ); + + //now make two references to group1 into root group of the canvas + m_ref = new MywxCanvasObjectRef(350,-200, group1); + m_ref->SetRotation(25); + //TODO if rotation is 0 scaling is weird +// m_ref->SetScale(2,3.2); + m_datatree->Append( m_ref ); + + group3->Prepend( m_ref ); + + + //this a reference to group2 put into group1 + MywxCanvasObjectRef* subref2 = new MywxCanvasObjectRef(20,130, group2); + subref2->SetRotation(15); + group3->Prepend( subref2 ); + m_datatree->Prepend( subref2 ); + + m_ref2 = new MywxCanvasObjectRef(80,450, group1); + m_ref2->SetRotation(-35); + m_ref2->SetDragMode(wxDRAG_RECTANGLE); + m_datatree->Prepend( m_ref2 ); + + wxCanvasCircle* cir = new wxCanvasCircle( -100, -150, 100 ); + cir->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH )); + cir->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID)); + cir->SetDragMode(wxDRAG_REDRAW); + m_datatree->Prepend( cir ); + + wxCanvasEllipse* elp = new wxCanvasEllipse( -100, 250, 100,300 ); + elp->SetBrush(wxBrush(wxColour(100,17,55),wxVERTICAL_HATCH )); + elp->SetPen(wxPen(wxColour(2,255,6 ),10,wxDOT)); + m_datatree->Prepend( elp ); + + wxCanvasEllipticArc* aelp = new wxCanvasEllipticArc( -230, 250, 100,300, 30,270 ); + aelp->SetBrush(wxBrush(wxColour(100,17,155),wxSOLID )); + aelp->SetPen(wxPen(wxColour(1,215,6 ),10,wxSOLID)); + m_datatree->Prepend( aelp ); + + //HOW BAD DO THINGS GET + int kk; + for (kk=0;kk<100;kk++) + { +// MywxCanvasObjectRef* m_refx = new MywxCanvasObjectRef(180,50+kk*30, group1); +// m_refx->SetRotation(-35); +// m_datatree->Prepend( m_refx ); + } +/* m_log = new wxTextCtrl( this, -1, "", wxPoint(0,0), wxSize(100,100), wxTE_MULTILINE ); wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) ); delete old_log; - + wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); - + topsizer->Add( m_canvas, 1, wxEXPAND ); topsizer->Add( m_log, 0, wxEXPAND ); SetAutoLayout( TRUE ); SetSizer( topsizer ); +*/ + + //fancy background + wxPoint2DDouble* todraw8 = new wxPoint2DDouble[4]; + todraw8[0].m_x=-350; + todraw8[0].m_y=-350; + todraw8[1].m_x=-350; + todraw8[1].m_y=550; + todraw8[2].m_x=550; + todraw8[2].m_y=550; + todraw8[3].m_x=550; + todraw8[3].m_y=-350; + + wxCanvasPolygon* poly18= new wxCanvasPolygon(4,todraw8); + poly18->SetPen(wxPen(wxColour(10,17,25),16,wxTRANSPARENT )); + poly18->SetColour1(wxColour(0,0,0)); + poly18->SetColour2(wxColour(0,255,255)); + poly18->SetGradient(TRUE,wxPen(wxColour(0,0,0),0,wxSOLID),0); + + wxCanvasObjectRef* m_refb = new wxCanvasObjectRef(200,0, poly18); + m_refb->SetRotation(90); + + m_datatree->Prepend( m_refb ); + +/* + wxCanvasCircle* cir = new wxCanvasCircle( -100, -150, 100 ); + cir->SetBrush(wxBrush(wxColour(19,215,6),wxHORIZONTAL_HATCH )); + cir->SetPen(wxPen(wxColour(198,3,105 ),30,wxSOLID)); + m_datatree->Prepend( cir ); +*/ + m_datatree->SetAdmin(&m_canvasadmin); + m_datatree->AppendEventHandler( m_eventhandler ); + m_canvas1->SetRoot(m_datatree); + + //wxCanvasObjectGroup* group3 = new wxCanvasObjectGroup(0,0); + // group3->Prepend( cir ); + + group3->SetAdmin(&m_canvasadmin); + m_canvas2->SetRoot(group3); m_timer = new wxTimer( this ); - m_timer->Start( 100, FALSE ); + //m_timer->Start( 100, FALSE ); } MyFrame::~MyFrame() { + m_datatree->RemoveLastEventHandler( FALSE ); + delete m_eventhandler; delete m_timer; } +void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) ) +{ + Close(TRUE); +} + +void MyFrame::SplitHorizontal(wxCommandEvent& WXUNUSED(event) ) +{ + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + m_canvas1->Show(TRUE); + m_canvas2->Show(TRUE); + m_splitter->SplitHorizontally( m_canvas1, m_canvas2 ); + UpdatePosition(); +} + +void MyFrame::SplitVertical(wxCommandEvent& WXUNUSED(event) ) +{ + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + m_canvas1->Show(TRUE); + m_canvas2->Show(TRUE); + m_splitter->SplitVertically( m_canvas1, m_canvas2 ); + UpdatePosition(); +} + +void MyFrame::Unsplit(wxCommandEvent& WXUNUSED(event) ) +{ + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + SetStatusText("No splitter"); +} + +void MyFrame::SetMinSize(wxCommandEvent& WXUNUSED(event) ) +{ + wxString str; + str.Printf( _T("%d"), m_splitter->GetMinimumPaneSize()); + str = wxGetTextFromUser("Enter minimal size for panes:", "", str, this); + if ( str.IsEmpty() ) + return; + + int minsize = wxStrtol( str, (wxChar**)NULL, 10 ); + m_splitter->SetMinimumPaneSize(minsize); + str.Printf( _T("Min pane size = %d"), minsize); + SetStatusText(str, 1); +} + +void MyFrame::UpdateUIHorizontal(wxUpdateUIEvent& event) +{ + event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_HORIZONTAL) ) ); +} + +void MyFrame::UpdateUIVertical(wxUpdateUIEvent& event) +{ + event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_VERTICAL) ) ); +} + +void MyFrame::UpdateUIUnsplit(wxUpdateUIEvent& event) +{ + event.Enable( m_splitter->IsSplit() ); +} + +void MyFrame::UpdatePosition() +{ + wxString str; + str.Printf( "Sash position = %d", m_splitter->GetSashPosition()); + SetStatusText(str); +} + void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) { Close( TRUE ); @@ -174,27 +620,111 @@ void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) ) void MyFrame::OnTimer( wxTimerEvent &WXUNUSED(event) ) { - m_sm1->Move( m_sm1->GetX()+1, m_sm1->GetY() ); - m_sm2->Move( m_sm2->GetX()+1, m_sm2->GetY() ); - m_sm3->Move( m_sm3->GetX()+1, m_sm3->GetY() ); - m_sm4->Move( m_sm4->GetX()+1, m_sm4->GetY() ); + m_sm1->MoveRelative( 1, 0); + m_sm2->MoveRelative( 1, 0); + m_sm3->MoveRelative( 1, 0); + m_sm4->MoveRelative( 2, 0); + +// m_ref->MoveRelative( 1, 0 ); + m_ref2->MoveRelative( 2, 0 ); + m_canvas1->UpdateNow(); + + wxWakeUpIdle(); } void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) ) { (void)wxMessageBox( "wxCanvas demo\n" - "Robert Roebling (c) 1998,2000", + "Robert Roebling (c) 1998,2000 \n Modified by Klaas Holwerda 2000", "About wxCanvas Demo", wxICON_INFORMATION | wxOK ); } + +//------------------------------------------------ +// class MyCanvas +//------------------------------------------------ + +// the event tables connect the wxWindows events with the functions (event +// handlers) which process them. +BEGIN_EVENT_TABLE(MyCanvas,wxVectorCanvas) + EVT_MOUSE_EVENTS (MyCanvas::OnMouseEvent) +END_EVENT_TABLE() + +MyCanvas::MyCanvas(wxCanvasAdmin* admin, MySplitterWindow *parent, wxWindowID id, + const wxPoint &position, const wxSize& size, long style ) : + wxVectorCanvas( admin, parent, id, position, size, style ) +{ + m_parent=parent; +} + +void MyCanvas::OnMouseEvent(wxMouseEvent& event) +{ + wxClientDC dc(this); + PrepareDC(dc); + + wxPoint pos = event.GetPosition(); + + m_mouse_worldx = DeviceToLogicalX( pos.x ); + m_mouse_worldy = DeviceToLogicalY( pos.y ); + + wxString str; + str.Printf( "Current mouse position: %f,%f", m_mouse_worldx, m_mouse_worldy ); + m_parent->SetStatusText( str ); + + if (!event.m_controlDown && !GetCaptured()) + { + if (event.LeftDown()) + { + m_zoom_x1=m_zoom_x2=pos.x; + m_zoom_y1=m_zoom_y2=pos.y; + } + if (event.RightDown()) + { + SetMappingScroll(m_virtm_minX,m_virtm_minY,m_virtm_maxX,m_virtm_maxY,0); + Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE ); + UpdateNow(); + } + if (event.LeftUp()) + { + m_zoom_x2=pos.x; + m_zoom_y2=pos.y; + double x_virt_min=DeviceToLogicalX(m_zoom_x1); + double y_virt_min=DeviceToLogicalY(m_zoom_y2); + double x_virt_max=DeviceToLogicalX(m_zoom_x2); + double y_virt_max=DeviceToLogicalY(m_zoom_y1); + SetMappingScroll(x_virt_min,y_virt_min,x_virt_max,y_virt_max,0); + Update( 0,0, GetBufferWidth(), GetBufferHeight(), TRUE ); + UpdateNow(); + } + if (event.Dragging()&& event.m_leftDown) + { + dc.SetLogicalFunction(wxINVERT); + dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 ); + m_zoom_x2=pos.x; + m_zoom_y2=pos.y; + dc.DrawRectangle(m_zoom_x1,m_zoom_y1,m_zoom_x2-m_zoom_x1,m_zoom_y2-m_zoom_y1 ); + } + } + else + { + wxVectorCanvas::OnMouse(event); + } +} + + //----------------------------------------------------------------------------- // MyApp //----------------------------------------------------------------------------- +// main program + +IMPLEMENT_APP(MyApp) + bool MyApp::OnInit() { m_fontpath = getenv("TRUETYPE"); + m_fontpath = "c:/WINNT/Fonts/times.ttf"; if ( !m_fontpath ) { wxLogError("Please set env var TRUETYPE to the path where times.ttf lives."); @@ -207,10 +737,11 @@ bool MyApp::OnInit() wxImage::AddHandler( new wxPNGHandler ); #endif - wxFrame *frame = new MyFrame(); + wxFrame *frame = new MyFrame((wxFrame *) NULL, "wxCanvas Example", wxPoint(0,0), wxSize(400,500)); frame->Show( TRUE ); + SetTopWindow(frame); + return TRUE; } -