* Copyright: (C) 1998, Robert Roebling
*
*/
-// For compilers that support precompilation, includes "wx/wx.h".
-#include "wx/wxprec.h"
-#ifdef __BORLANDC__
-#pragma hdrstop
+#ifdef __GNUG__
+ #pragma implementation "test.cpp"
#endif
-#ifndef WX_PRECOMP
-#include "wx/wx.h"
-#endif
-
-#include <wx/image.h>
-#include <wx/file.h>
-#include <wx/timer.h>
-#include <wx/log.h>
-#include "wx/image.h"
+// 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()
+IMPLEMENT_DYNAMIC_CLASS(MywxCanvasObjectRef, wxCanvasObjectRef)
-class MywxCanvasImage: public wxCanvasImage
+MywxCanvasObjectRef::MywxCanvasObjectRef(double x, double y,wxCanvasObjectGroup* group)
+ :wxCanvasObjectRef(x,y,group)
{
-public:
- MywxCanvasImage( const wxImage &image, double x, double y, double w, double h );
-
- void MywxCanvasImage::OnMouse(wxMouseEvent &event);
-
- DECLARE_EVENT_TABLE()
-};
+}
-BEGIN_EVENT_TABLE(MywxCanvasImage,wxCanvasImage)
- EVT_MOUSE_EVENTS( MywxCanvasImage::OnMouse )
-END_EVENT_TABLE()
+MywxCanvasObjectRef::MywxCanvasObjectRef()
+ :wxCanvasObjectRef(0,0,NULL)
+{
+}
-MywxCanvasImage::MywxCanvasImage( const wxImage &image, double x, double y, double w, double h )
- :wxCanvasImage( image, x, y, w, h )
+MywxCanvasObjectRef::~MywxCanvasObjectRef()
{
}
-void MywxCanvasImage::OnMouse(wxMouseEvent &event)
+void MywxCanvasObjectRef::OnMouseEvent(wxMouseEvent &event)
{
- static bool first=false;
- static int dx=0;
- static int dy=0;
-
- int x = event.GetX();
- int y = event.GetY();
- if (event.m_leftDown)
- { if (!first)
- {
- first=true;
- dx=x;
- dy=y;
- }
- Move(m_area.x+x-dx,m_area.y+y-dy);
+ 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 (IsCapturedMouse())
+ else if (event.LeftUp())
{
ReleaseMouse();
- first=false;
- dx=0;dy=0;
+ 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);
}
-class MywxCanvasObjectGroupRef: public wxCanvasObjectGroupRef
-{
-public:
- MywxCanvasObjectGroupRef(double x, double y, wxCanvasObjectGroup* group);
-
- void OnMouse(wxMouseEvent &event);
+//---------------------------------------------------
+// class MyEventHandler
+//---------------------------------------------------
- DECLARE_EVENT_TABLE()
-};
-
-BEGIN_EVENT_TABLE(MywxCanvasObjectGroupRef,wxCanvasObjectGroupRef)
- EVT_MOUSE_EVENTS( MywxCanvasObjectGroupRef::OnMouse )
+BEGIN_EVENT_TABLE(MyEventHandler,wxEvtHandler)
+ EVT_MOUSE_EVENTS( MyEventHandler::OnMouseEvent )
END_EVENT_TABLE()
-MywxCanvasObjectGroupRef::MywxCanvasObjectGroupRef(double x, double y,wxCanvasObjectGroup* group)
- :wxCanvasObjectGroupRef(x,y,group)
+MyEventHandler::MyEventHandler()
{
}
-void MywxCanvasObjectGroupRef::OnMouse(wxMouseEvent &event)
+void MyEventHandler::OnMouseEvent(wxMouseEvent &event)
{
- static bool first=false;
- static dx=0;
- static dy=0;
+ wxCanvasObject* obj=(wxCanvasObject*)event.GetEventObject();
- //new position of object
- int x = m_owner->GetDeviceX( event.GetX());
- int y = m_owner->GetDeviceY( event.GetY());
+ if (!obj->GetDraggable())
+ return;
- if (event.m_leftDown)
- { if (!first)
- {
- first=true;
- dx=x;
- dy=y;
- }
- Move(m_x+x-dx,m_y+y-dy);
- CaptureMouse();
+ 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 (IsCapturedMouse())
+ else if (event.LeftUp())
{
- ReleaseMouse();
- first=false;
- dx=0;dy=0;
+ 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);
}
-class MyFrame;
-class MyApp;
-
-// MyFrame
-
-class MyFrame: public wxFrame
-{
-public:
- MyFrame();
- ~MyFrame();
-
- void OnAbout( wxCommandEvent &event );
- void OnNewFrame( wxCommandEvent &event );
- void OnQuit( wxCommandEvent &event );
- void OnTimer( wxTimerEvent &event );
-
- wxCanvas *m_canvas;
- wxCanvasObject *m_sm1;
- wxCanvasObject *m_sm2;
- wxCanvasObject *m_sm3;
- wxCanvasObject *m_sm4;
+//------------------------------------------------
+// class MyFrame
+//------------------------------------------------
- MywxCanvasObjectGroupRef *m_ref;
- MywxCanvasObjectGroupRef *m_ref2;
+class MyApp;
+class MyCanvas;
- wxTimer *m_timer;
- wxTextCtrl *m_log;
+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)
-private:
- DECLARE_DYNAMIC_CLASS(MyFrame)
- DECLARE_EVENT_TABLE()
-};
+ EVT_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical)
+ EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal)
+ EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit)
-// MyApp
+ EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
+ EVT_TIMER (-1, MyFrame::OnTimer)
+END_EVENT_TABLE()
-class MyApp: public wxApp
+// My frame constructor
+MyFrame::MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size):
+ wxFrame(frame, SPLITTER_FRAME, title, pos, size)
{
-public:
- virtual bool OnInit();
+ m_eventhandler =new MyEventHandler();
- const wxString& GetFontPath() const { return m_fontpath; }
+ wxPathList pathList;
+ pathList.Add(".");
+ pathList.Add("..");
-private:
- wxString m_fontpath;
-};
+ 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);
-// main program
+ CreateStatusBar(2);
-IMPLEMENT_APP(MyApp)
+ // 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...");
-// MyFrame
-const int ID_QUIT = 108;
-const int ID_ABOUT = 109;
+ menuBar = new wxMenuBar;
+ menuBar->Append(fileMenu, "&File");
-IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
+ SetMenuBar(menuBar);
-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()
+ m_splitter = new MySplitterWindow(this, SPLITTER_WINDOW);
-MyFrame::MyFrame()
- : wxFrame( (wxFrame *)NULL, -1, "wxCanvas sample",
- wxPoint(20,20), wxSize(470,860) )
-{
- wxMenu *file_menu = new wxMenu();
- file_menu->Append( ID_ABOUT, "&About...");
- file_menu->AppendSeparator();
- file_menu->Append( ID_QUIT, "E&xit");
+ 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));
- wxMenuBar *menu_bar = new wxMenuBar();
- menu_bar->Append(file_menu, "&File");
+ 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);
- SetMenuBar( menu_bar );
+ 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);
- CreateStatusBar(2);
int widths[] = { -1, 100 };
SetStatusWidths( 2, widths );
- m_canvas = new wxCanvas( this, -1, wxPoint(0,0), wxSize(10,10) );
-
- m_canvas->SetArea( 1400, 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 );
+ wxImage image( bitmap.ConvertToImage() );
- 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 );
-
- for (i = 10; i < 300; i+=10)
- m_canvas->Append( new wxCanvasLine( 10,-15,i,300, 0,255,0 ) );
+ m_datatree->Append( new wxCanvasText( "How are you?", 180, 10,
+ wxGetApp().GetFontPath() + "/times.ttf", 8 ) );
- m_sm4 = new MywxCanvasImage( image, 0,270,64,32 );
- m_canvas->Append( m_sm4 );
+ 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_datatree->Append( new wxCanvasLine( 10,-15,i,300 ) );
+/*
+ m_sm4 = new wxCanvasImage( image, 0,270,64,32 );
+ 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();
- group1->Prepend( new wxCanvasLine( 10,-35,50,190,100,255,0 ) );
+ 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 ) );
- group1->Prepend( new wxCanvasRect(20,-20,50,170,0,20,240 ) );
- group1->Prepend( new wxCanvasRect(10,20,104,52,0,240,240 ) );
+ 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();
+ wxCanvasObjectGroup* group2 = new wxCanvasObjectGroup(0,0);
group2->Prepend( new wxCanvasImage( image, 60,38,52,32 ) );
- group2->Prepend( new wxCanvasRect(10,20,104,52,10,40,10 ) );
+ 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
- wxCanvasObjectGroupRef* m_subref = new wxCanvasObjectGroupRef(60,50, group2);
+ MywxCanvasObjectRef* m_subref = new MywxCanvasObjectRef(60,50, group2);
+ m_subref->SetRotation(35);
+ m_subref->SetRotation(0);
group1->Prepend( m_subref );
- //now make two refrences to group1 into root group of the canvas
- m_ref = new MywxCanvasObjectGroupRef(40,200, group1);
- m_canvas->Prepend( m_ref );
- m_ref2 = new MywxCanvasObjectGroupRef(80,350, group1);
- m_canvas->Prepend( m_ref2 );
+ 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;
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 );
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()+2, m_sm4->GetY() );
- m_ref->Move( m_ref->GetPosX()+1, m_ref->GetPosY() );
- m_ref2->Move( m_ref2->GetPosX()+2, m_ref2->GetPosY() );
+ 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";
+ m_fontpath = "c:/WINNT/Fonts/times.ttf";
if ( !m_fontpath )
{
wxLogError("Please set env var TRUETYPE to the path where times.ttf lives.");
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;
}
-